poedit动态gettext的解决方法
Posted
技术标签:
【中文标题】poedit动态gettext的解决方法【英文标题】:poedit workaround for dynamic gettext 【发布时间】:2010-10-26 18:13:15 【问题描述】:我已经开始使用 gettext 来翻译我发送给用户的文本和消息。 我正在使用 poedit 作为编辑器,但我正在努力处理动态消息。
例如,我有类似登录之类的东西,其中有一个变量告诉错误类型。
$this->translate('page-error-' . $error);
当我从 poedit 自动更新时,它会读取为“page-error-”。 我所做的是有一个文件,我在其中对 translate 方法进行虚拟调用,其中包含所有可能的键,以便在自动更新时将它们添加到我的 poedit 中。
我不是特别喜欢这种情况。 你们是怎么做到的。
感谢您的想法
【问题讨论】:
我无法理解这个问题。你能描述得更清楚吗? 【参考方案1】:不——这是不可能的,因为编辑器(和gettext
工具)正在读取您的源代码,而不是执行您的程序。您必须自己保留虚拟调用或将密钥添加到翻译文件中。
【讨论】:
如何手动添加密钥?我没能找到办法。与源同步时,那些手动键是否也会被删除?【参考方案2】:你在尝试类似的东西
$this->translate(sprintf('page-error-%s', $error));
【讨论】:
如何制作动态键不是问题,问题是如何在 poedit 中添加它们。【参考方案3】:我遇到了同样的问题。
例如我有
在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 文件(不要与 SOURCE 同步,否则全部丢失)。
更新 2。
我现在使用文本编辑器 (gedit/notepad) 为我的手动标识符使用单独的文件。现在我有两个文件:
-
由名为
我在 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 do 文件中翻译成另一种语言 -> 从 POT 文件中新建目录,然后开始翻译您手动添加的字符串。
【讨论】:
【参考方案4】:如果您有有限数量的错误,您可以在 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);
致谢:http://eng.marksw.com/2012/12/05/how-to-expose-dynamic-translatable-text-to-translation-tools-like-poedit/
【讨论】:
以上是关于poedit动态gettext的解决方法的主要内容,如果未能解决你的问题,请参考以下文章
关于JPasswordField的getText()方法过时问题解决
解决selenium WebElement 里 getText()方法返回值为空的问题