【问题标题】:What is so good about gettext for language files?语言文件的 gettext 有什么好处?
【发布时间】:2009-09-12 17:29:28
【问题描述】:

在使用 PHP 制作多语言应用程序时,每个人都说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
?>

【问题讨论】:

    标签: php gettext


    【解决方案1】:

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

    另一件好事(实际上可能是一个结果,或一个原因,或两者兼而有之) 有几个工具,例如 Poedit,可以编辑 gettext 文件:你没有浏览一些 PHP (或其他) 源代码。这非常重要:

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

    【讨论】:

    • 就性能而言,您认为使用带有数组或常量的语言文件的函数会与使用 gettext 一样快还是性能好?我的应用程序有点大,但它始终是一个私人项目,我是唯一需要编辑它的人,对我来说,不必设置 gfettext 并确保服务器已安装并运行它会更容易。但是,如果使用 gettext 有任何性能提升,那么我可能会更加努力地走这条路。
    • 我不太了解表演(这:mel.melaxis.com/devblog/2006/04/10/… 可能有用吗?)——但您的实现还有我在回答中所说的其他几个问题;例如:没有复数,一个要解析并保存在内存中的大数组
    • 谢谢你这个链接正是我一直在寻找的,它有点旧但仍然是我想要的,一个不需要我做的基准测试(只是因为我不知道如何设置gettext)
    • 关于性能:.po 文件被转换成二进制格式的 .mo 文件,读取速度非常快。
    • 你提供的链接,这个家伙实际上包含了他的 3 种不同方法的基准代码,我在我的机器上运行它,结果我的开发服务器已经安装了 gettext 并且可以工作,看起来我有一个解决方案现在!如果可以的话,再次+5
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      [高度证明 和广泛使用的解决方案] 比 [my hacky cocky noob] 实施]?

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

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

      【讨论】:

      • 在这种情况下,我的 hacky cocky noob 实现在几个大型开源应用程序中使用,实际上我看到这两种方法经常使用,我试图找出哪个是不安装 gettext 和如果其他人已经做过基准测试。
      • PunBB 是开源的,并且从已知的最糟糕的代码库之一开始。我在编程的第一年就开始了一个开源项目。犯错和自负与开源无关,这只是我们所有人都会做的事情。不要把它当作个人,很高兴知道你正在进步;-)
      • 顺便说一句,您是在他的个人资料中引用“过早优化不是万恶之源”的人。是不是该应用它?
      • 我确实最终使用了 gettext 扩展,我从来没有反对过它,我只是想找出两者的优缺点,而不是顺其自然并使用人们所说的没有任何支持推理的方法
      【解决方案4】:

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

      比较一下:

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

      用这个:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-11
        • 2012-07-11
        • 1970-01-01
        相关资源
        最近更新 更多