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

8

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

4个回答

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];
}

6
+1是一个简单网站的好解决方案 - Tchoupi
6
虽然这个解决方案不错,但我仍然建议采取gettext方法。你永远不知道你的网站会走向何方。它可能会快速增长,并且你可能需要添加其他语言。实施Gettext不会比此提议的解决方案多花费太多时间。 - eakkas
2
我选择了这个答案,因为我只需要在这里和那里本地化一些单词。对于更大的工作,我会探索gettext路线。 - Ric
我建议它们也应该来自不同的文件,但出于可读性考虑,我在示例中没有这样做。我说数组应该来自JSON文件。老实说,JSON可能比PHP数组更易读... - Nate Higgins
+1 是因为这是被要求的。我添加了一点内容,以便在键不存在的情况下返回原始键。 - Francisco Presencia
显示剩余2条评论

10

gettext是最好的选择。 对于少量字符串且不太可能增长的小型网站,实现类似于已发布解决方案的内容可能比学习如何使用gettext并配置它更快。

简而言之:

多年来,人们一直在努力创建一个可行的翻译系统,您可以花费很长时间重新发明轮子,或者您可以花费一些时间学习如何使用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;

对于大型翻译项目,我认为这是最佳选择,但在我的情况下,这太过浪费了。 - Ric
1
你是否仍然坚持自己在今天(2015年2月)的推荐?自2012年以来是否出现了其他事情? - alexw
Symfony翻译组件看起来非常周全,虽然我从未使用过它。 - dsas

4

1
值得注意的是,由于WordPress安装中缺少MySQL扩展,截至2019年,下面两个链接都已失效。 - War10ck
@War10ck 谢谢您让我知道,我已经更新了链接并使用了 wayback machine。 - chridam

1

对于永远不会/极少更改的静态内容,可以使用。

对于动态内容,则完全不适用。编译.po文件等操作过于繁琐,建议采用JSON或XML解决方案和模板,同时缓存已编译的模板。


2
你能详细说明一下“编译.po文件太过头了”是什么意思吗? - dsas
对我来说,这非常是一个静态内容的情况。 - Ric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接