7

我已经开始使用 gettext 来翻译我发送给用户的文本和消息。我正在使用 poedit 作为编辑器,但我正在努力处理动态消息。

例如,我有像登录这样的东西,我有一个告诉错误类型的变量。

$this->translate('page-error-' . $error);

当我从 poedit 自动更新时,它会被读取为“page-error-”。我所做的是有一个文件,我在其中对 translate 方法进行虚拟调用,其中包含所有可能的键,以便在自动更新时将它们添加到我的 poedit 中。

我不是特别喜欢这种情况。你们是怎么做到的。

谢谢你的想法

4

4 回答 4

5

不——这是不可能的,因为编辑器(和gettext工具)正在读取您的源代码,而不是执行您的程序。您必须自己保留虚拟调用或将密钥添加到翻译文件中。

于 2009-05-17T12:17:36.530 回答
2

你在尝试类似的东西

$this->translate(sprintf('page-error-%s', $error));
于 2009-05-17T11:44:10.947 回答
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');

更新!

我一直在研究这个问题。我目前放弃了从源头导入。这就是我如何继续,直到我找到更好的解决方案

  1. 构建应用程序并使用尽可能多的静态标识符。
  2. 启用未翻译(动态)标识符的日志记录

    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;
    }
    
  3. 使用 Poedit 与源同步并翻译找到的字符串。

  4. 在测试/调试阶段检查未翻译字符串的日志。
  5. 将未翻译的字符串添加到 .po 文件中。

    msgid "IDENTIFIER"
    msgstr "TRANSLATION STRING"
    
  6. 打开 po 文件并保存以创建 mo 文件(不要与 SOURCE 同步或全部丢失)。

更新 2。

我现在使用文本编辑器(gedit/notepad)为我的手动标识符使用单独的文件。现在我有两个文件:

  1. 由 poedit 自动生成,名为 <language>.po
  2. 手动编辑的文件名为 <language>_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 do file -> new catalog from POT 文件中翻译成另一种语言,然后开始翻译您手动添加的字符串。

于 2012-06-13T08:55:51.557 回答
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);

致谢:http ://eng.marksw.com/2012/12/05/how-to-expose-dynamic-translatable-text-to-translation-tools-like-poedit/

于 2017-12-08T14:47:32.567 回答