Poedit的解决方法,用于动态gettext。

7

我开始使用gettext来翻译我发送给用户的文本和消息。我使用poedit作为编辑器,但是我遇到了动态消息的问题。

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

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

当我从Poedit自动更新时,这个会被读取为“page-error-”。我的做法是创建一个文件,在其中使用所有可能的键来调用翻译方法以便在自动更新时将它们添加到我的Poedit中。
我并不是特别喜欢这种情况。你们是怎么做的呢?
感谢你们的建议。

我无法理解问题。你能更清楚地描述一下吗? - farzad
4个回答

5

不可能实现这个功能,因为编辑器(以及gettext工具)读取的是你的源代码,而不是执行你的程序。你必须保留虚拟调用或者自己将键添加到翻译文件中。


我该如何手动添加密钥?我找不到方法。此外,当与源进行同步时,这些手动添加的密钥会被删除吗? - Gabriel Solomon

2

你是否正在尝试类似以下的操作

$this->translate(sprintf('page-error-%s', $error));

3
制作动态密钥并不是问题,问题在于你如何在Poedit中添加它们。 - Gabriel Solomon

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/


0

我遇到了同样的问题。

例如,我有:

在 PHP 中

//Gives FORM_HEADER_ADD or FORM_HEADER_EDIT
echo $this->translate('FORM_HEADER_' . strtoupper($this->data)); 

当我使用Poedit同步时,它会捕获到代码中我没有(生成的)标识符'FORM_HEADER_'。

因此,我不得不通过在PHP中执行以下操作来解决问题,给Poedit提供完整的标识符。

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);
    
        // 从ini文件中获取翻译资源并启动它
        $resource = $this->getPluginResource('translate');
        $translate = $resource->getTranslate();
    
        // 将日志添加到翻译中
        $translate->setOptions(
                array(
                    'log'             => $log,
                    'logUntranslated' => true
                )
            );
    
        // 返回翻译以在注册表等中获取它
        return $translate;
    }
    
  3. 使用Poedit与源代码同步,并翻译找到的字符串。

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

    msgid "标识符"
    msgstr "翻译字符串"
    
  6. 打开po文件并保存以创建mo文件(不要与源代码同步,否则所有内容都会丢失)。

更新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中将其翻译成另一种语言,请选择文件->从POT文件创建新目录,并开始翻译您手动添加的字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接