Перевод PO-файлов: переход к обратным словам, из msgstr в msgid? - PullRequest
0 голосов
/ 05 июля 2018

Мне нужно начать с msgstr, чтобы получить сообщение. Причина в том, что у меня есть несколько переводов, все с EN на НЕКОТОРЫЙ ДРУГОЙ ЯЗЫК, но теперь в текущей установке мне нужно вернуться с НЕКОТОРЫХ ДРУГИХ ЯЗЫКОВ на EN. Обратите внимание, что я также работаю в WordPress, может быть, это не важно. Здесь есть пара похожих вопросов, но не совсем то, что мне нужно.

Так есть ли способ сделать это?

1 Ответ

0 голосов
/ 07 июля 2018

WordPress поставляется с ПО для чтения и записи PO как часть пакета pomo. Ниже приведен довольно простой скрипт, который меняет поля msgid и msgstr и записывает новый файл.

Как уже указывалось в комментариях, есть несколько вещей, которые делают это потенциально проблематичным:

  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() );
...