Twig:工作国际化(i18n)的例子

时间:2011-07-28 15:28:45

标签: php internationalization twig

我正在为Twig(模板引擎)寻找一个有效的i18n示例。

文档在语言文件方面有点稀疏。他们应该去哪里,他们应该怎么看?他们应该被命名?我一直在尝试.po / .mo文件,没有运气。

如果有人能指出我正确的方向......

请参阅:the i18n extension example,它并没有真正告诉我很多关于语言文件本身的信息。

注意:我想单独使用Twig,而不是Symfony的一部分。

这是我的php文件:

 <?php
header('Content-Type: text/html; charset=utf-8');

$vars = array();
foreach($_POST as $key => $value) {
    $vars[$key] = json_decode(utf8_encode(urldecode($value)));
}

/* Prepare Twig template enginge */
require_once './lib/Twig/Autoloader.php';
Twig_Autoloader::register();

$loader = new Twig_Loader_Filesystem('./templates');
$twig = new Twig_Environment($loader, array(
    //'cache' => './cache',
    'cache' => false
));

/* i18n */
$twig->addExtension(new Twig_Extensions_Extension_I18n());

$availableLanguages = array(
    'en' => 'en_EN',
    'de' => 'de_DE',
    'default' => 'de_DE'
);

// Set language
$locale = array_key_exists($_GET['lang'], $availableLanguages) ? $availableLanguages[$_GET['lang']] : $availableLanguages['default'];
putenv('LC_ALL='.$locale);
setlocale(LC_ALL, $locale);

// Specify the location of the translation tables
bindtextdomain('kalkulator', 'includes/locale');
bind_textdomain_codeset('kalkulator', 'UTF-8');

// Choose domain
textdomain('kalkulator');

$template = $twig->loadTemplate('print.tpl');

$html = $template->render($vars);

switch($_GET['action']) {
    case 'mail':

    break;
    default:
        echo $html;
    break;
}


?>

内部包含/ locale我有以下文件:

-rw-r--r--  1 user group  670 Jul 28 10:17 kalkulator-de_DE.mo
-rw-r--r--  1 user group  982 Jul 28 10:22 kalkulator-de_DE.po
-rw-r--r--  1 user group  688 Jul 28 10:38 kalkulator-en_EN.mo
-rw-r--r--  1 user group 1004 Jul 28 10:38 kalkulator-en_EN.po

在print.tpl文件中,我使用标签来指定要翻译的部分:

{% trans %}
Text to be translated
{% endtrans %}

2 个答案:

答案 0 :(得分:2)

twig i18n扩展名基于gettext。首先,与gettext相关的所有内容都适用。您可以在此处找到:Gettext Docs

所以现在对你提出更具体的问题,但请确保你至少用gettext理解基本原则:

  

他们[语言文件]应该去哪里

进入已为文本域注册的目录。

  

,它们应该如何看待以及它们应该被命名为什么?

语言文件应命名如下:

文本域 - 区域设置 .po/mo

名为myAppPhp的文本域和fr_FR区域设置的示例:

myAppPhp-fr_FR.po
myAppPhp-fr_FR.mo
  

我一直在尝试.po/.mo个文件,没有运气。

.po/.mo对我来说听起来不错,也许您错过了移动它们的路径,或者您忘记在前面添加文本域。

答案 1 :(得分:-1)

我在苗条3中尝试了一切,但没有任何工作,只有苗条2,所以我创造了自己的方式。基本上系统会从浏览器中检测语言并加载正确的翻译文件,更多详情请参见图片:

my way to solve