poedit 动态 gettext 的解决方法

发布于 2024-07-20 17:25:36 字数 347 浏览 9 评论 0原文

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

例如,我有类似登录的内容,其中有一个变量可以告诉错误类型。

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

当我从 poedit 自动更新时,这会被读作“页面错误-”。 我所做的是有一个文件,我在其中对翻译方法进行虚拟调用,其中包含所有可能的键,以便在自动更新时将它们添加到我的 poedit 中。

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

感谢您的想法

I have started using gettext for translating text and messages i send to user.
I am using poedit as an editor, but i am struggling with dynamic messages.

For example i have things like the login where i have a variable that tells the type of error.

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

When i auto update from poedit this gets read like "page-error-".
What i do is have a file where i place dummy calls to the translate method with all the possible keys to have them added in my poedit when auto updating.

I don't particularly like this situation.
How do you guys do it.

Thanks for your ideas

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

柏林苍穹下 2024-07-27 17:25:36

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

No -- this is not possible, because the editor (and the gettext tools) are reading your sources, not executing your program. You'll have to keep the dummy calls or add the keys to the translation files yourself.

多孤肩上扛 2024-07-27 17:25:36

你是否正在尝试类似的东西

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

Are you trying something like

$this->translate(sprintf('page-error-%s', $error));
清风挽心 2024-07-27 17:25:36

我遇到了同样的问题。

例如我

在 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 中执行以下操作解决了这个问题!

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

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

    受保护函数 _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(); 
    
          // 将日志添加到翻译中 
          $翻译->setOptions( 
                  大批( 
                      '日志' =>   $日志, 
                      'logUntranslated' =>   真的 
                  ) 
              ); 
    
          // 返回翻译以将其放入注册表等 
          返回$翻译; 
      } 
      
  3. 使用 Poedit 与源同步并翻译找到的字符串。

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

    msgstr "标识符" 
      msgstr "翻译字符串" 
      
  6. 打开 po 文件并保存以创建 mo 文件(请勿与源同步,否则全部丢失)。

更新2。

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

  1. 由 poedit 自动生成,名为.po
  2. 手动编辑的文件,名为_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 中转换成另一种语言 -> 从 POT 文件创建新目录,然后开始翻译手动添加的字符串。

I came across the same problem.

for example i have

in php

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

When i sync with poedit it will pick up 'FORM_HEADER_' which is not a identifier i have (generated) in the code.

So i had to fix the problem my giving Poedit full identifiers i solved that by doing the following in php

echo ($this->data === 'add') ? $this->translate('FORM_HEADER_ADD') : $this->translate('FORM_HEADER_EDIT');

UPDATE!

I kept looking into this problem. And i currently gave up importing from source. This is how i continue until i find a better solution

  1. Build application and use as many static identifiers as possible.
  2. Enable logging of untranslated (dynamic) identifiers

    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. Use Poedit to sync with source and translate the strings that are found.

  4. During testing/debugging phase check the log for untranslated strings.
  5. Add the untranslated strings to the .po file.

    msgid "IDENTIFIER"
    msgstr "TRANSLATION STRING"
    
  6. Open po file and save it to create the mo file (DO NOT SYNC WITH SOURCE OR ALL IS LOST).

UPDATE 2.

I now use a seperate file for my manual identifiers , by using a text editor (gedit/notepad). Now i have two files:

  1. Auto generated by poedit called <language>.po
  2. manually editted file called <language>_manual.po

i configured my translate in application.ini to scan for all files in the language directory

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

if you want to translate into another language in poedit do file -> new catalog from POT file, and start translating your manually added strings.

雪落纷纷 2024-07-27 17:25:36

如果错误数量有限,您可以在 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 /

If you have a finite number of errors, you can add some dummy code inside a if (false) condition, whose sole purpose is to have PoEdit pick up the translations.

For example:

if (false) {
  _('role_visitor');
  _('role_hiker_reader');
  _('role_hiker');
  _('role_translator');
  _('role_proofreader');
  _('role_moderator');
  _('role_moderator_2');
  _('role_moderator_3');
  _('role_admin');
}

You can then translate with:

$translated_role = _('role_' . $role);

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文