【问题标题】:PO files translations: going backwords, from msgstr to msgid?PO 文件翻译:从 msgstr 到 msgid?
【发布时间】:2018-12-13 13:45:03
【问题描述】:

我需要从 msgstr 开始检索 msgid。原因是我有几个翻译,都是 EN 到 SOME OTHER LANG,但现在在当前安装中,我需要从 SOME OTHER LANG 回到 EN。请注意,我也在使用 WordPress,也许这并不重要。这里有几个类似的问题,但不完全是我需要的。

那么有没有办法做到这一点?

【问题讨论】:

  • 1.由于不要求msgstrs 是唯一的,因此可能有多个msgidmsgstr 匹配。 2. 您可以使用任何可以解析 PO 文件(或自己编写)的库来获取条目数组并搜索它们。

标签: php wordpress internationalization po


【解决方案1】:

作为pomo 软件包的一部分,WordPress 附带了一个 PO 阅读器和编写器。下面是一个非常简单的脚本,它交换 msgidmsgstr 字段并写出一个新文件。

正如 cmets 中已经指出的那样,有几件事可能会造成问题:

  1. 您的目标字符串必须是唯一的(并且不能为空)
  2. 如果您有消息上下文,它将保留原始语言。
  3. 您的原始语言必须只有两种复数形式。

向前 -

<?php
require_once 'path/to/wp-includes/pomo/po.php';
$source_file = 'path/to/languages/old-file.po';
$target_file = 'path/to/languages/new-file.po';

// parse original message catalogue from source file
$source = new PO;
$source->import_from_file($source_file);

// prep target messages with a different language
$target = new PO;
$target->set_headers( $source->headers );
$target->set_header('Language', 'en_US');
$target->set_header('Language-Team', 'English from SOME OTHER LANG');
$target->set_header('Plural-Forms', 'nplurals=2; plural=n!=1;');

/* @var Translation_Entry $entry */
foreach( $source->entries as $entry ){
    $reversed = clone $entry;
    // swap msgid and msgstr (singular)
    $reversed->singular = $entry->translations[0];
    $reversed->translations[0] = $entry->singular;
    // swap msgid_plural and msgstr[2] (plural)
    if( $entry->is_plural ){
        $reversed->plural = $entry->translations[1];
        $reversed->translations[1] = $entry->plural;
    }
    // append target file with modified entry
    $target->add_entry( $reversed );
}

// write final file back to disk
file_put_contents( $target_file, $target->export() );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-28
    • 2011-05-06
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多