繁体   English   中英

PHP本地化-gettext还是数组?

[英]PHP Localization - gettext or array?

设置多语言站点现在,我需要确定该站点上的静态文本需要使用哪个选项。 让我解释一下我的网站设置,然后再解释是否可以决定使用哪种解决方案。

该站点是CMS系统,它允许多个域指向同一目录并根据域名提供内容。 因此,所有域共享相同的代码。 在该站点上,我创建了称为模块的代码块,它们可以完成特定的工作。 因此,我可能拥有一个模块,它所要做的就是显示数据库中的最新新闻。 然后,我可以决定该模块可以显示在哪个页面上以及该模块可以显示在哪个站点上。 所以我的问题是,gettext是否可以在可能在不同页面上显示不同模块的多个域中工作? 还是我应该为每个模块创建一个语言文件,其中每个模块包含一个包含该特定模块的语言对话的数组? 因此,如果我有10个模块,则每个模块将具有自己的语言文件,每个模块显示的页面仅指向该模块的语言文件中的数组来决定要显示什么文本? 希望这是有道理的,我阅读了很多有关gettext和使用数组版本的文章,但无法确定哪种类型更适合这种站点设置。

在我看来,PHP gettext是必经之路。 在我所有的项目中,我都使用wordpress风格进行翻译。 http://codex.wordpress.org/Translate_WordPress,并使用相同的函数命名约定:

__('message') // Return the translation
_e('message') // echo's the translation
_n('singular_message', 'plural_message', count ) // return singular or plural

我使用poedit http://www.poedit.net/从PHP源代码中提取可翻译字符串,并将其翻译为其他语言。 在所需的PHP gettext目录结构中存储和编译文件,如下所示:

en_US/LC_MESSAGES/default.mo
nl_NL/LC_MESSAGES/default.mo
de_DE/LC_MESSAGES/default.mo

请注意,.mo文件由PHP缓存,并且在重新启动Web服务器之前,.mo文件中的更改不存在。 在开发过程中拔出头发,我遇到了这个非常有用的解决方案: http : //blog.ghost3k.net/articles/php/11/gettext-caching-in-php

整个gettext事情花了我一段时间,但还是值得的。 到位后,它为我节省了大量时间,并允许我的客户自己为其项目进行翻译。

如果您想激活一个社区来翻译您的项目,请查看基于Web的翻译工具Pootle

实际上,我发现gettext更容易:

  1. 您可以echo / print _("your text"); 以后再翻译
  2. 使用getext编辑器很容易获得帮助
  3. 要生成boostrap po文件(iirc,/ source /文件),可以使用etags ,这些etags将在文件上生成某种grep。 因此,您只需要稍后翻译令牌即可。

因此,基本上,从项目开始就一切正常,然后更容易启动,并且更便于上规模使用。

许多CMS使用阵列版本。 对于可伸缩应用程序,我也见过GetText。 阵列版本更简单,尤其是当您要从Web界面管理转换时。

当然,这是一个优先事项。

以我的经验,原始的gettext并非非常适合网站上下文,在该上下文中内容会随着时间的流逝而变化,通常在正式发布周期之外。

我建议您看一下Zend_Translate (和Zend_Locale ,如果您想本地化日期,数字等)。 Zend_Translate是一个高级库,具有适用于各种基础方法(包括gettext和数组)的适配器。

它有充分的文档记录,可以用作独立组件。

我建议使用gettext。 这是一套完善的工具。 有一个工具可以从源代码(xgettext)中自动提取文本字符串,还有其他工具可以帮助您翻译本地化文件,例如poedit( http://www.poedit.net/ )。

如果您正在运行PHP 5.3和/或安装了intl扩展,那么还有另一个选择:messageformatter:

http://php.net/manual/zh/class.messageformatter.php

这是非常强大的功能,但是-在我看来-缺少一些文档,对于您的目的而言可能有些过分。 您可以在ICU项目的页面上找到有关此信息的更多信息:

http://userguide.icu-project.org/formatparse/messages

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM