8

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

4

4 回答 4

12

您可以只使用 alang_XX.php并将其包含在您的应用程序中。

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

对于其他语言,比如说lang_fr.php,只有这样的东西:

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

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

function _($l)
{
    return $lang[$l];
}
于 2012-10-04T16:01:48.900 回答
10

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

tl;博士:

多年来,人们一直在努力思考创建一个有效的翻译系统,你可以花很长时间重新发明那个轮子,或者你可以花一点时间学习如何使用 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"。对于其他语言,规则不像 (n!=1) 那样简单,俄语有 3 个不同的变体,规则是n%100/10==1 ? 2 : n%10==1 ? 0 : (n+9)%10>3 ? 2 : 1;
于 2012-10-04T22:48:22.217 回答
3

在性能方面,gettext Extension比使用将字符串 id 映射到本地化文本的 String-Array 更快(例如"WelcomeText" => "Welcome to our homepage.",将使用 something 包含在内 <?= $strings["WelcomeText"] >。gettext 的纯 PHP 实现较慢,如果您可以使用 PHP Extension,则不推荐使用。更多此处详细信息使用 gettext 本地化 PHP 网站基准测试 PHP 本地化 – gettext 是否足够快?

于 2012-10-04T16:00:17.237 回答
1

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

对于动态内容,一点也不。编译 .po 文件等是最重要的,我建议使用某种 JSON 或 XML 解决方案,并使用缓存的编译模板代替模板。

于 2012-10-04T15:58:13.273 回答