gettext是在php中本地化网站的最佳方式吗? (只需要轻微的本地化)

时间:2012-10-04 15:55:02

标签: php localization gettext

gettext是在php中本地化网站的最佳方式吗?我没有使用任何框架,翻译的单词不多,只有两个略有不同的英文版本。

4 个答案:

答案 0 :(得分:12)

您可以使用lang_XX.php并将其包含在您的应用中。

$lang = array(
    "welcome" => "Welcome",
    "bye" => "Bye"
);

对于其他语言,比如lang_fr.php,只需要:

$lang = array(
    "welcome" => "Accueil",
    "bye" => "Au revoir"
);

对于小用例,这应该没问题,不需要使用.po个文件。此外,您可以这样定义:

function _($l)
{
    return $lang[$l];
}

答案 1 :(得分:10)

gettext是最好的方法。对于一个预计不会增长很多字符串的小型站点,实现与已发布的解决方案类似的东西实际上可能比学习如何使用gettext和配置它更快。

TL; DR:

人们多年来一直在努力创造一个有效的翻译系统,你可以花很多年时间重新发明那个轮子,或者你可以花一点时间学习如何使用gettext。

在开源世界中,gettext几乎是事实上的标准。

以下是为什么gettext比维护大型翻译数组列表的常用方法更好的原因

  1. 更快
  2. 每个线程不需要将每个字符串加载到内存中
  3. 它为翻译人员提供了大量工具支持,例如poedit,因此您不必依赖翻译人员了解如何编辑PHP代码。
  4. 它为您提供工具支持,msgmerge等等,意味着您可以在仍然工作时发送要翻译的文件并添加新的可翻译文本并轻松将它们合并在一起
  5. 需要向翻译者发表关于字符串上下文的评论吗? gettext将从使用它的代码中获取注释并将其复制到翻译文件
  6. 翻译密钥是英文文本,如果尚未翻译,则文本仍然以简单的英文显示,到目前为止,此答案中没有一个解决方案是正确的。
  7. 它支持复数,如果字符串依赖于整数,则在英语中只有两种形式if n != 1 "There was a person" else "There were n people"。对于其他语言,规则并不像if(n!= 1)那样简单,俄语有3种不同的变体,规则是n%100/10==1 ? 2 : n%10==1 ? 0 : (n+9)%10>3 ? 2 : 1;

答案 2 :(得分:3)

在性能方面,gettext Extension比使用像字符串ID映射到本地化文本的字符串数组更快(例如"WelcomeText" => "Welcome to our homepage."将使用<?= $strings["WelcomeText"] >包含如果你可以使用PHP扩展,那么gettext的纯PHP实现会更慢,不推荐使用。更多细节Localizing PHP web sites using gettextBenchmarking PHP Localization – Is gettext fast enough?

答案 3 :(得分:1)

对于永远/极少变化的静态内容,当然。

对于动态内容,没有丝毫。编译.po文件等是最重要的,我建议使用缓存的编译模板进行某种JSON或XML解决方案和模板化。