我已经开始使用gettext来翻译我发送给用户的文本和消息。 我使用poedit作为编辑,但我正在努力处理动态消息。
例如我有登录的地方,我有一个告诉错误类型的变量。
$this->translate('page-error-' . $error);
当我从poedit自动更新时,这会被读取为“page-error-”。 我所做的是有一个文件,我可以使用所有可能的键对translate方法进行虚拟调用,以便在自动更新时将它们添加到我的poedit中。
我不是特别喜欢这种情况。 你们是怎么做到的。
感谢您的想法
答案 0 :(得分:5)
不 - 这是不可能的,因为编辑器(和gettext
工具)正在阅读您的资源,而不是执行您的程序。您必须自己保留虚拟呼叫或将密钥添加到翻译文件中。
答案 1 :(得分:2)
你在尝试像
这样的东西$this->translate(sprintf('page-error-%s', $error));
答案 2 :(得分:0)
我遇到了同样的问题。
例如我有
在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');
UPDATE!
我一直在研究这个问题。我目前放弃了从源头进口。这是我继续下去,直到找到更好的解决方案
启用未翻译(动态)标识符的记录
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 / 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 file中翻译成另一种语言 - >来自POT文件的新目录,并开始翻译手动添加的字符串。
答案 3 :(得分:0)
如果您的错误数量有限,则可以在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);