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

Php 创建支持翻译的脚本的好方法?,php,localization,translation,structure,Php,Localization,Translation,Structure,我正在创建一个开源cms,我只是想知道哪种方法是添加本地化的最佳方法?我已经决定将它们放在类似lang.en.php的文件中。我会假设数组,但以哪种形式 $lang['xyz'] = "Text goes here!"; $lang['Text goes here!'] = "Translated text!"; 或者我应该创建自定义解析器并向文件中添加本地化,如下所示: "Text goes here!" = "Translated text!"; 然后解析它 你有什么建议?我试图搜索,但

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

$lang['xyz'] = "Text goes here!";
$lang['Text goes here!'] = "Translated text!";
或者我应该创建自定义解析器并向文件中添加本地化,如下所示:

"Text goes here!" = "Translated text!";
然后解析它

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

Martti Laine

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

基本上,您可以用函数名
tr(“你好吗?”)
来编写每个字符串。然后创建一个函数来转换它:

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(“你好,%s?”),$name)用于不应翻译的变量或专有名词。

我认为您应该使用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;
    }

这并不像你想象的那么简单,你真的需要一个数组中的数百行来翻译
我删除了45条评论
,还是
我删除了192条评论
?等等

如果您可以使用以下命令调用translate函数将非常有用:
translate('I deleted%d comments',$number)


您将如何管理复数形式

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

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


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

谢谢您,Peter,但我已经尝试过了,没有找到一个好方法。不要误解我:-)每个服务器都支持gettext吗?这将是一个开源软件,所以它应该可以在大多数服务器上运行。如果不是,你可以扩展我的答案:)。它的工作原理与gettext类似。您只需要添加另一个函数。gettext的好处在于,有一种方法(至少在Python中)可以提取需要翻译的每个字符串,但我认为您可以编写一个脚本来实现这一点。
<?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;
        }
    }
?>
      1 plik
      2,3,4 pliki
      5-21 pliko'w
      22-24 pliki
      25-31 pliko'w