2011-03-25 54 views
6

为了让我的应用程序使用多种语言,我想知道GNU的gettext是否有很大的优势,或者是否有构建自己的“库”的大缺点。使用或不使用PHP的本地gettext与自建的原因是什么?

此外,如果“建立自己的”更建议,什么是最好的做法是什么?显然他们必须存储在数据库中,我怀疑我想用平面文件工作,所以在某些时候我最好缓存它们,我应该如何处理这个问题?

+0

你说缓存他们,其中..平面文件也许。 – RobertPitt 2011-03-25 16:06:20

+0

哈哈,触摸。但我的意思是让我的目录在平面文件中。 – 2011-03-25 16:17:42

回答

5

gettext扩展有一些怪癖。

  • 它将翻译字符串保留在内存中,因此在更新目录时可能需要重新启动(在mod_php运行时下)。
  • gettext API并非真正为web应用程序设计。 (它会查找环境变量和系统设置,您必须输入Accept-Language标题。)
  • 许多人遇到问题时都会遇到问题。
  • 另一方面,gettext有更多的工具支持。

你几乎总是有一个handicrafted解决方案少一些麻烦。但是,据说gettext API在简洁性上是无与伦比的。 _("orig text")或多或少是翻译文本的最佳接口。

如果你想自己的东西代码了,我建议你专注于这一点。

  • 使用简单的函数名称。代替_()几个php应用程序使用双下划线__()。不要采用任何使实际使用翻译后的字符串变得麻烦的库。 (例如,如果使用Zend Framework,请始终编写包装函数。)
  • 接受原始英文文本作为输入。避免记忆翻译键(例如BTN_SUBMT
  • 不要在任何情况下使用转换目录数据库。这些文本是运行时数据,而不是应用程序数据。 (对于一个坏榜样看到自从。)

你可以经常逃脱PHP脚本数组包含lang/nl.php不过$text["orig english"] = "dutch here";,这很容易从你使用任何接入方式利用。

也避免将所有内容都按到系统中。有时采用第二种更长的文本机制是不可避免的。例如,我使用template/mail.EN.txt更大的斑点。

+0

我同意。另一方面,gettext几乎是关于从中受益的工具的'事实上'的标准:当管理翻译时,PO编辑器,xgettext和msgmerge确实是非常方便的工具。 – Artefact2 2011-03-25 16:19:36

+0

感谢您的精心解答,但有一个问题。为什么像“BTN_SUBMIT”这样的索引是错的? – 2011-03-25 16:20:26

+0

@Gerben Jacobs:他们本身没有错。但回过头来看,我希望我避开了这个计划。这是一种非常典型的PHP方法,用于定义(“TEXT_BTN_NAME”,“按钮名称”)。但是这使得后来转换到其他系统变得更加困难,并且最终导致源代码的可读性降低。使用缩写通常基于您想要随时更改文本内容的错误假设。实际情况并非如此。编写你的应用,并在最后翻译它。一次完成而不是逐步完成这一切更简单。但除此之外,ABBRV并没有真正的技术问题。 – mario 2011-03-25 16:44:04

1

的Gettext是not thread-safe

在决定实施自己的,我建议你看一看Zend_Translate。它支持gettext适配器,以及TMX,CSV,INI,Array和更多格式。如果您的首选格式不受支持,例如数据库存储,那么编写自己的适配器也应该很容易。

+0

仅供参考:因为环境变量不是线程安全的,所以'setlocale'因此'gettext'不是线程安全的。听起来像是添加新代理环境API的好主意。 – 2011-05-06 16:16:02

+2

gettext不是线程安全的,但在很多情况下并不重要:http://stackoverflow.com/questions/1646249/php-gettext-problems-like-non-thread-safe/6726570#6726570。 Zend-translate很不错,但比PHP的内置模块要胖得多。 – Stann 2011-07-17 20:45:35

相关问题