gettext .po файл, сравнивающий/работающий со строками между файлами

Я хочу сделать несколько переводов в проекте, состоящем из нескольких файлов для разных приложений. Однако, чтобы легко сделать вещи согласованными во всех файлах, было бы полезно использовать инструмент перевода, который может загружать кучу файлов .po и, например. перекрестно проверьте файлы на наличие идентичных или похожих справочных строк msgid, чтобы убедиться в правильности перевода. И, возможно, также разрешить перевод нескольких файлов/строк за один раз, если ссылка та же.

Что-то подобное существует..?


person ProsjektX    schedule 29.09.2014    source источник


Ответы (1)


Мне пришлось сделать то же самое для проекта (CiviCRM). Одно из предложений, которое я получил, состояло в том, чтобы проверить с помощью OpenRefine, у которого, предположительно, есть несколько инструментов для поиска похожих строк, но я хотел автоматизировать процесс с помощью чего-то простого, поэтому я написал короткий скрипт.

Справедливо предупреждаю, что это не самый эффективный способ, и запуск больших проектов может занять некоторое время (у нас около 16 000 строк в CiviCRM).

Для справки: https://github.com/civicrm/l10n/blob/master/bin/find-similar-strings.php

И поскольку SO не любит ссылки в качестве ответов, подробнее здесь:

#!/usr/bin/php
<?php

/**
* Reads from STDIN and finds similar-looking strings.
*
* Usage:
* cat *.pot | ../bin/find-similar-strings.php
*
* Context:
* http://forum.civicrm.org/index.php/topic,34805.0.html
*/

// Default match threshold is 90% match.
$threshold = (! empty($argv[1]) ? $argv[1] : 90);

// Read all input from stdin.
$src = file_get_contents("php://stdin");

// http://stackoverflow.com/a/1070937/2387700
// Extract all "msgid" strings (they can be multi-line).
preg_match_all('/msgid\s+\"([^\"]*)\"/', $src, $matches);
$msgids = $matches[1];

// Sort the strings alphabetically, to make them easier to compare.
// sort($msgids);
foreach ($msgids as $key1 => $msgid1) {
  foreach ($msgids as $key2 => $msgid2) {
    $percent = 0;
    if ($msgid1 && $msgid2 && $msgid1 != $msgid2) {
      if (similar_text($msgid1, $msgid2, $percent)) {
        if ($percent > $threshold) {
          $percent = (int) $percent;
          echo "$msgid1 [$percent %]\n";
          echo "$msgid2 \n\n";
        }
      }
    }
  }

  // To avoid going through the strings twice, we unset the string
  // si that the inner-loop goes faster.
  unset($msgids[$key1]);
}

Это загрузит файл .pot (исходные строки, но я думаю, вы могли бы запустить его и в файле .po) и перебрать все строки одну за другой.

Я не решался сортировать строки в алфавитном порядке, но я обнаружил несколько случаев, когда к строкам добавлялся неправильный пробел, опечатки и т. д.

Еще одно возможное улучшение — сначала проверить длину строки и пропустить строки, которые имеют очень разную длину.

person bgm    schedule 14.11.2014