Мне пришлось сделать то же самое для проекта (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