为了让我的应用程序使用多种语言,我想知道GNU的gettext是否有很大的优势,或者是否有构建自己的“库”的大缺点。使用或不使用PHP的本地gettext与自建的原因是什么?
此外,如果“建立自己的”更建议,什么是最好的做法是什么?显然他们必须存储在数据库中,我怀疑我想用平面文件工作,所以在某些时候我最好缓存它们,我应该如何处理这个问题?
为了让我的应用程序使用多种语言,我想知道GNU的gettext是否有很大的优势,或者是否有构建自己的“库”的大缺点。使用或不使用PHP的本地gettext与自建的原因是什么?
此外,如果“建立自己的”更建议,什么是最好的做法是什么?显然他们必须存储在数据库中,我怀疑我想用平面文件工作,所以在某些时候我最好缓存它们,我应该如何处理这个问题?
gettext扩展有一些怪癖。
你几乎总是有一个handicrafted解决方案少一些麻烦。但是,据说gettext API在简洁性上是无与伦比的。 _("orig text")
或多或少是翻译文本的最佳接口。
如果你想自己的东西代码了,我建议你专注于这一点。
_()
几个php应用程序使用双下划线__()
。不要采用任何使实际使用翻译后的字符串变得麻烦的库。 (例如,如果使用Zend Framework,请始终编写包装函数。)BTN_SUBMT
)你可以经常逃脱PHP脚本数组包含lang/nl.php
不过$text["orig english"] = "dutch here";
,这很容易从你使用任何接入方式利用。
也避免将所有内容都按到系统中。有时采用第二种更长的文本机制是不可避免的。例如,我使用template/mail.EN.txt
更大的斑点。
我同意。另一方面,gettext几乎是关于从中受益的工具的'事实上'的标准:当管理翻译时,PO编辑器,xgettext和msgmerge确实是非常方便的工具。 – Artefact2 2011-03-25 16:19:36
感谢您的精心解答,但有一个问题。为什么像“BTN_SUBMIT”这样的索引是错的? – 2011-03-25 16:20:26
@Gerben Jacobs:他们本身没有错。但回过头来看,我希望我避开了这个计划。这是一种非常典型的PHP方法,用于定义(“TEXT_BTN_NAME”,“按钮名称”)。但是这使得后来转换到其他系统变得更加困难,并且最终导致源代码的可读性降低。使用缩写通常基于您想要随时更改文本内容的错误假设。实际情况并非如此。编写你的应用,并在最后翻译它。一次完成而不是逐步完成这一切更简单。但除此之外,ABBRV并没有真正的技术问题。 – mario 2011-03-25 16:44:04
的Gettext是not thread-safe。
在决定实施自己的,我建议你看一看Zend_Translate。它支持gettext适配器,以及TMX,CSV,INI,Array和更多格式。如果您的首选格式不受支持,例如数据库存储,那么编写自己的适配器也应该很容易。
仅供参考:因为环境变量不是线程安全的,所以'setlocale'因此'gettext'不是线程安全的。听起来像是添加新代理环境API的好主意。 – 2011-05-06 16:16:02
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
你说缓存他们,其中..平面文件也许。 – RobertPitt 2011-03-25 16:06:20
哈哈,触摸。但我的意思是让我的目录在平面文件中。 – 2011-03-25 16:17:42