我正在创建一个开源的cms,只是想知道哪个是添加本地化的最佳方法?我已经决定将它们放在类似于lang.en.php的文件中。我会假设数组,但以哪种形式?
$lang['xyz'] = "Text goes here!";
$lang['Text goes here!'] = "Translated text!";
或者我应该创建自定义解析器并将本地化添加到文件中,如下所示:
"Text goes here!" = "Translated text!";
然后解析它。
你会建议什么?我试图搜索但没有结果。
Martti Laine
答案 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 comments
或I 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,因为一切都已经完成了。