8

在使用 PHP 制作多语言应用程序时,到处都是 SO,每个人都说gettext是最好的方法。我只是想知道为什么?

就像是什么使下面的这种方法比使用 gettext 效率低?

<?PHP
//Have seperate language files for each language I add, this would be english file
function lang($phrase){
    static $lang = array(
        'NO_PHOTO' => 'No photo\'s available',
        'NEW_MEMBER' => 'This user is new'
    );
    return $lang[$phrase];
}
//Then in application where there is text from the site and not from users I would do something like this
echo lang('NO_PHOTO');  // No photo's available would show here
?>
4

4 回答 4

13

gettext 的一个好处是它是一种事实上的标准:它被许多应用程序以多种语言使用——这意味着很多人都在使用它。

另一件好事(实际上可能是结果,或原因,或两者兼而有之)是存在几个工具,例如Poedit来编辑 gettext 文件:您不必通过一些 PHP (或其他)源代码. 这非常重要:

  • 这意味着非技术人员可以编辑 gettext 本地化文件
    • 也许现在这对你来说似乎并不重要,
    • 但是,如果您正在开发一个大型的开源应用程序,那么它是否成功并且许多人需要用他们自己的语言编写它就变得很重要。
  • 这意味着他们不会冒险破坏应用程序(例如,由于引号不匹配而导致“解析错误”;-))
于 2009-09-12T17:32:12.527 回答
6

您的“实施”有一些缺点。

  • 不像gettext它在php. ;-)
  • 无论您是否使用它,它都会将整个翻译保存在记忆中
  • 更糟糕的是,它会在您需要一行时实例化整个数据数组(在 PHP 中确实需要一段时间和相当多的内存)
  • 它无法处理多种语言的复数形式
  • 使用这种翻译的代码很难读
  • 使用此翻译的代码没有嵌入的后备,可在缺少翻译的情况下使用。

基本上,您的实现被广泛用于许多渴望获得国际化支持和高度创新的轮子发明的项目中,但对结果并不关心,也不知道好坏。

于 2009-09-12T17:39:02.887 回答
4

对于所有看起来像这样的问题,答案都是一样的:

[高度证明和广泛使用的解决方案] 比 [my hacky cocky noob implementation] 有什么更好的?

  • 它已经存在了很长时间,不管你信不信,如果有经验的开发人员在它上面工作过,使用过它并称赞它,这可能是有原因的。
  • 这是一个标准,因此即使您的解决方案会更好,为打破它而付出的代价可能也不值得。
  • 它可以比您的实现多做 1000 件事,因为它的开发考虑了全局范围,而您的想法仅旨在解决您的问题。

我不是在批评,我们都这样做了,试图让自己相信我们是聪明人,而其他人是过度杀伤的程序员。这是学习方式的一部分。实际上,我一直在这样做,重新发明轮子或与我的朋友/同事炫耀我破解的一些 KISS 代码。随着时间的推移,你最终会做的越来越少,我想你会在你真正应该做的那一天停止做它:-)

于 2009-09-12T17:51:12.760 回答
1

与您的其他解决方案(如 Java 字符串表或 Windows 资源)相比,gettext的优势在于它使源代码更具可读性。

比较一下:

printf(_("No photo available (error %d)."), err);

有了这个:

printf(i18n(NO_PHOTO), err);
// or some variant of the same thing

在第一种情况下,您可以在代码中看到该消息,并且您确切地知道它的作用。在后一种情况下,您只能看到一个符号常量,并且必须查找确切的文本和格式说明符。

于 2009-12-29T16:58:00.833 回答