poedit解决方法的动态gettext
-
22-08-2019 - |
题
我已经开始使用gettext翻译文本和信息,我发送给用户。我使用poedit作为一个编辑的,但我苦苦挣扎的动态的信息。
例如,我有东西喜欢的登录在那里我有一个可变的,告诉类型的错误。
$this->translate('page-error-' . $error);
当我自动更新从poedit这就像"页-错误-".我要做的就是有一个文件在哪里我把假的电话的翻译方法的所有可能的钥匙,让他们加入我poedit时自动更新。
我特别不喜欢这种情况。你们怎么做。
谢谢你的想法
解决方案
没有 - 这是不可能的,因为编辑器(和gettext
工具)正在阅读你的源代码,而不是执行程序。你必须保持虚拟来电或添加的钥匙翻译文件自己。
其他提示
您试图像
$this->translate(sprintf('page-error-%s', $error));
我遇到了同样的问题。
例如我有
在 PHP 中
//Gives FORM_HEADER_ADD or FORM_HEADER_EDIT
echo $this->translate('FORM_HEADER_' . strtoupper($this->data));
当我与 poedit 同步时,它会拾取“FORM_HEADER_”,这不是我在代码中(生成)的标识符。
所以我必须解决给 Poedit 提供完整标识符的问题,我通过在 php 中执行以下操作解决了这个问题
echo ($this->data === 'add') ? $this->translate('FORM_HEADER_ADD') : $this->translate('FORM_HEADER_EDIT');
更新!
我一直在研究这个问题。我目前放弃了从源头导入。这就是我继续的方式,直到找到更好的解决方案
- 构建应用程序并使用尽可能多的静态标识符。
启用未翻译(动态)标识符的记录
protected function _initMyTranslate(){ $date = new Zend_Date(); $fileName = sprintf('/../logs/translation_%1$s.log', $date->toString('dd-MM')); $writer = new Zend_Log_Writer_Stream(APPLICATION_PATH . $fileName); $log = new Zend_Log($writer); // get the translate resource from the ini file and fire it up $resource = $this->getPluginResource('translate'); $translate = $resource->getTranslate(); // add the log to the translate $translate->setOptions( array( 'log' => $log, 'logUntranslated' => true ) ); // return the translate to get it in the registry and so on return $translate; }
使用 Poedit 与源同步并翻译找到的字符串。
- 在测试/调试阶段检查日志中是否有未翻译的字符串。
将未翻译的字符串添加到 .po 文件中。
msgid "IDENTIFIER" msgstr "TRANSLATION STRING"
打开 po 文件并将其保存以创建 mo 文件(请勿与源同步,否则全部丢失)。
更新2。
我现在通过使用文本编辑器(gedit/记事本)为我的手动标识符使用单独的文件。现在我有两个文件:
- 由 poedit 自动生成,名为 <语言>.po
- 手动编辑的文件名为<语言>_manual.po
我在 application.ini 中配置了翻译以扫描语言目录中的所有文件
resources.translate.adapter = gettext
resources.translate.content = APPLICATION_PATH "/../library/languages/"
resources.translate.locale = auto ;use en to force english or nl for dutch..etc
resources.translate.scan = directory
resources.translate.options.disableNotices = false
如果你想在 poedit 中翻译成另一种语言,请执行 file -> POT 文件中的新目录,然后开始翻译手动添加的字符串。
如果你有一个有限数量的错误,你可以添加一些哑的代码里 if (false)
条件,其唯一目的是有PoEdit拿起翻译。
例如:
if (false) {
_('role_visitor');
_('role_hiker_reader');
_('role_hiker');
_('role_translator');
_('role_proofreader');
_('role_moderator');
_('role_moderator_2');
_('role_moderator_3');
_('role_admin');
}
然后,您可以翻译:
$translated_role = _('role_' . $role);