2011-07-28 217 views
11

我正在寻找一个适用于小枝(模板引擎)的i18n示例。小枝:工作国际化(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; 
} 


?> 

而且里面包含/区域设置,我有以下文件:

-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 %} 
+0

嫩枝是一个模板引擎。您对国际化有何期待?它可以处理法国模板?和古巴的?我敢打赌它可以;) - 所以请分享你在找什么。 – hakre

+0

查看我的修改答案。 Twig有一个与gettext兼容的i18n扩展。 –

+0

你可以使用[this extension](https://github.com/smmoosavi/twig-php-gettext)。这个扩展是纯php和独立的system-gettext。 – seyed

回答

2

枝i18n扩展名基于gettext。因此,首先与gettext相关的所有内容都适用。你会发现这里记录:Gettext Docs

所以现在的你更具体的部分问题,但请确保你至少了解与gettext的基本原则:

应该在哪里,他们使用的语言[文件]去

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

,他们应该怎么看,他们应该命名?

语言文件应该被命名为以下几点:

文本域-区域.po/mo

名为myAppPhp文本域实例和fr_FR区域:

myAppPhp-fr_FR.po 
myAppPhp-fr_FR.mo 

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

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

+0

哈克雷,谢谢你的输入。我编辑了我的问题,以反映我已经完成的工作(应该从一开始就这样做)。我不明白我在做什么错误。我使用一个额外的autocache.php文件来缓存Twig输出,这使我可以在生成的php文件上使用xgettext来创建po/mo文件。 –

+0

@Joseph:如果它是你期望的目录的完整路径,检查'bindtextdomain'的返回值。 – hakre

+0

原来我用en_EN作为语言环境。这没有用。我将其更改为en_GB并重命名了该文件夹。现在它可以工作,但我不确定它实际上是一个缓存问题,还是您确实需要提供有效的语言环境,并且en_EN无效。 –

-1

我已经尝试了一切可能在苗条3但没有工作,只有苗条2,所以我创造了我自己的方式。基本上,系统检测到来自浏览器的语言和加载正确的翻译文件,更多细节图片:

my way to solve