创建脚本支持翻译的好方法?

时间:2010-01-19 15:17:50

标签: php localization translation structure

我正在创建一个开源的cms,只是想知道哪个是添加本地化的最佳方法?我已经决定将它们放在类似于lang.en.php的文件中。我会假设数组,但以哪种形式?

$lang['xyz'] = "Text goes here!";
$lang['Text goes here!'] = "Translated text!";

或者我应该创建自定义解析器并将本地化添加到文件中,如下所示:

"Text goes here!" = "Translated text!";

然后解析它。

你会建议什么?我试图搜索但没有结果。

Martti Laine

4 个答案:

答案 0 :(得分:0)

我知道桌面应用程序的Gettext库与您的自定义解析器类似。 Gettext有一个PHP模块,但我不确定它是否默认安装在大多数PHP安装中。

基本上,您可以使用函数名tr("How are you?")编写每个字符串。然后创建一个翻译它的函数:

include('lang.es.php');
function tr($txt) {
   global $tr;
   if(array_key_exists($txt,$tr)) {
     return $tr($txt);
   }
   return $txt;
}

在lang.es.php中,有:

$tr = array();
$tr["How are you?"] = "¿Como Estas?";

您可能希望对变量或不应翻译的专有名词进行printf(tr("How are you, %s?"), $name);

答案 1 :(得分:0)

我认为你应该使用Joomla方式。语言文件必须是ini扩展名:

FOO=translation
BAR=translation2

然后用parse_ini_file函数解析文件并获取转换数组:

$dictionary=parse_ini_file("english.ini");

    function translate($text)
    {
       global $dictionary;
       if(isset($dictionary[strtoupper($text)])) return $dictionary[strtoupper($text)];
       else return $text;
    }

答案 2 :(得分:0)

它并不像您想象的那么简单,您是否真的需要数组中的数百行才能翻译I deleted 45 commentsI deleted 192 comments?等

如果您可以使用translate('I deleted %d comments', $number);

调用翻译函数,那将非常有用
<?php
    $dict = parse_ini_file('lang.ini');

    function translate($text){
        global $dict;
        $args = func_get_args();
        if(isset($dict[$text])){
            // I am not sure how to convert %d in $args[.], maybe someone else could provide a regular expression for this.
        } else {
            return $text;
        }
    }
?>

答案 3 :(得分:0)

您将如何管理复数形式?

有些语言有非常棘手的复数规则:example here

  

在波兰语中我们使用例如plik(文件)这个   方式:

      1 plik
      2,3,4 pliki
      5-21 pliko'w
      22-24 pliki
      25-31 pliko'w

出于这个原因,我建议你使用gettext,因为一切都已经完成了。