使用或不使用 PHP 原生 gettext 与自构建的原因是什么?

发布于 2024-10-26 19:29:22 字数 155 浏览 4 评论 0原文

为了使我的应用程序成为多语言的,我想知道 GNU 的 gettext 是否有很大的优点,或者构建自己的“库”是否有很大的缺点。

此外,如果更建议“构建自己的”,那么最佳实践是什么?显然它们必须存储在数据库中,我怀疑我想使用平面文件,所以在某些时候我最好缓存它们,我应该如何处理呢?

To make my application multilingual I'm wondering if there are big advantages to GNU's gettext or if there are big disadvantages of building your own 'library'.

Also if 'build your own' is more advised, what are the best practices? Obviously they have to be stored in the database, I doubt I wanna work with flat files, so at some point I'm better off caching them, how should I go about this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

∞梦里开花 2024-11-02 19:29:22

gettext 扩展有一些怪癖。

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

使用手工解决方案几乎总是会减少麻烦。但话虽如此,gettext API 的简洁性是无与伦比的。 _("orig text") 或多或少是翻译文本的最佳界面。

如果您想自己编写一些代码,我建议您集中精力。

  • 使用简单的函数名称。一些 php 应用程序使用双下划线 __() 来代替 _()。不要采用任何使实际使用翻译字符串变得麻烦的库。 (例如,如果使用 Zend Framework,请始终编写包装函数。)
  • 接受原始英文文本作为输入。避免使用助记符翻译键(例如BTN_SUBMT
  • 在任何情况下都不要使用翻译目录数据库。这些文本是运行时数据,而不是应用程序数据。 (有关不好的示例,请参阅 osCommerce。)

您通常可以使用仅包含 $text["orig english"] = "dutch here"; 的 PHP 数组脚本 lang/nl.php,无论您使用什么访问方法,都可以轻松使用它们。

还要避免将所有内容压入该系统。有时,对于较长的文本,不可避免地采用第二种机制。例如,我使用 template/mail.EN.txt 来处理更大的 blob。

The gettext extension has some quirks.

  • It keeps translation strings in memory, and thus can necessitate a restart (under the mod_php runtime that is) when catalogs are updated.
  • The gettext API wasn't really designed for web apps. (It looks for environment variables and system settings. You have to spoon feed the Accept-Language header.)
  • Many people run into problems setting it up.
  • On the other hand there is more tool support for gettext.

You will almost always have less trouble with a handicrafted solution. But that being said, the gettext API is unbeatable in conciseness. _("orig text") is more or less the optimal interface for translating text.

If you want to code something up yourself, I recommend you concentrate on that.

  • Use a simple function name. In lieu of _() a few php apps use the double underscore __(). Don't adopt any library that makes it cumbersome to actually use translated strings. (E.g. if using Zend Framework, always write a wrapper function.)
  • Accept raw English text as input. Avoid mnemonic translation keys (e.g. BTN_SUBMT)
  • Do not under no circumstances use the database for translation catalogues. Those texts are runtime data, not application data. (For a bad example see osCommerce.)

You can often get away with PHP array scripts lang/nl.php containing nothing but $text["orig english"] = "dutch here";, which are easy to utilize from whatever access method you use.

Also avoid pressing everything into that system. Sometimes it's unavoidable to adopt a second mechanism for longer texts. I for example used template/mail.EN.txt for bigger blobs.

氛圍 2024-11-02 19:29:22

Gettext 不是线程安全的

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

Gettext is not thread-safe.

Before deciding to implement your own I suggest you take a look at Zend_Translate. It has native support for a gettext adapter, as well as TMX, CSV, INI, Array and more formats. It should also be easy enough to write your own adapter if your preferred format isn't supported, such as database storage.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文