Rij*_*ijk 5 php gettext internationalization zend-translate
对于我们的应用程序中的翻译,我们使用Zend Translate和gettext适配器.在每个模块中都有一个文件夹translations,其中包含所有语言的.mo文件;
通过以下addTranslation()方法扫描并添加:
if ( is_dir( $translations_dir ) ) {
foreach ( new DirectoryIterator( $translations_dir ) as $file ) {
if ( substr( $file, -3 ) == '.mo' ) {
$ZendTranslate->addTranslation( $file->getPathname(), $file->getBasename('.mo') );
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序中的字符串使用该_()方法进行翻译,将当前语言作为参数传递(它存储在我的框架的Language类中):
$ZendTranslate->_( $string, $this->language );
Run Code Online (Sandbox Code Playgroud)
现在我需要为特定客户定制Dutch(nl)语言字符串.我不想修改nl.mo文件,因为这会影响其他客户.所以我创建了一个名为nl_kpn.mo(kpn是客户名称)的文件,并切换$this->language到'nl_kpn'.我希望Zend Transate将其nl.mo作为基本文件,覆盖在其中找到的自定义字符串nl_kpn.mo.但不幸的是,我经历过,因为手册指出:
fr_CH将被降级为fr
因此所有字符串仍然来自nl.mo文件,即使$this->language设置为'nl_kpn'.那么如何创建一个更具体的语言版本,覆盖一般语言的字符串呢?一定是可能的,对吗?因为还有en_UK和en_US,它们是同一种语言的不同"方言".
正如 Rijk 所说,Zend_Translate 将尝试调用 Zend_Locale,但它根本不存在。不幸的是,列表已设置为私有,因此我们可能无法使用继承来简单地派生我们自己的实现。
但是,您有两个选择。根据您的设置,您可以nl.mo通过在配置中提供不同的目录来为此特定客户设置您自己的文件。这样,您就可以链接所有其他语言文件,并为 kpn 客户端创建一个单独的语言文件。
第二个选择是摆脱 Zend_Translate 并使用默认的 php gettext。由于您已经在使用 gettext-files 并且似乎使用translate()- 函数,因此除了将 $ZendTranslate 重构为 gettext-类之外,您不需要做更多的工作。如果您确实在其他类中自动使用 Zend_Translate(例如在 Zend_Navigation 中),则可以保持它们不变。
虽然第二个选项确实有效,但它有点混乱 - 然而,第三个干净的替代方案是继承 Zend_Locale 并重写所有访问私有语言列表的方法。这样,您就可以添加自己的。或者您甚至可以重写 Zend_Locale 的部分内容以支持动态添加语言并发送补丁文件 - 这样,我们也可以从您的工作中受益。;)
| 归档时间: |
|
| 查看次数: |
1083 次 |
| 最近记录: |