Slim Framework + Twig + Symfony + i18n 的整合


上篇整合了 Asset Manager 現在來結合 i18n 做 locale.
直接上代碼筆記.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

# 增加以下內容到 composer.json
{
"require": {
"symfony/translation": "2.3.x-dev",
"symfony/config": "2.3.x-dev",
"symfony/twig-bridge": "2.3.x-dev"
}
}

# 更新新增了的 vendor
php composer.phar update

# 加入新的 vendor 到專案中
use Symfony\Component\Translation\Translator;
use Symfony\Component\Translation\MessageSelector;
use Symfony\Component\Translation\Loader\ArrayLoader;
use Symfony\Component\Translation\Loader\YamlFileLoader;
use Symfony\Bridge\Twig\Extension\TranslationExtension;

# 設置語系檔案的存放位置
define('LOCALE_ROOT', './locale');

# 設定翻譯物件 (支持 php array 和 yaml 文件)
$translator = new Translator('en_US', new MessageSelector());
$translator->setFallbackLocale(array('en_US'));
$translator->addLoader('array', new ArrayLoader());
$translator->addLoader('yaml', new YamlFileLoader());

foreach(glob(LOCALE_ROOT."/*") as $locale_resource) {
if (preg_match('/.(php|yaml)$/', $locale_resource) == true) {
$path_info = pathinfo($locale_resource);

$extension = $path_info['extension'];
$resource = $locale_resource;
if (strtolower($path_info['extension']) == 'php') {
$extension = "array";
$resource = require($resource);
}

$translator->addResource($extension, $resource, $path_info['filename']);
}
}

# 增加 views 裡面 trans filter 的支持
Views\Twig::$twigExtensions = array(
'Twig_Extensions_Slim',
new TranslationExtension($translator)
);

# locale/en_US.php 文件
<?php
return array(
'Hello %name%' => 'Bonjour %name%',
);

# locale/en_US.yaml 文件
'Hello %name%': Bonjour %name%

# 測試在程式中的翻譯效果
echo $translator->trans('Hello %name%', array("%name%" => "abc"));

# 測試在 Twig 模板中的翻譯效果
{{ "Hello %name%" | trans({ '%name%': "abc" }) }}

{% trans with {'%name%': 'abc'} %}
Hello %name%
{% endtrans %}

參考: