我想对包含不同应用的多个文件的项目进行一些翻译。然而,为了在所有文件中容易地使事物保持一致,对于可以加载一堆.po文件的翻译工具而言,这将是有用的。交叉检查文件的相同或类似的参考msgid字符串,以确保翻译。如果引用相同,也许还允许一次转换多个文件/字符串。
这样的事情是否存在..?
答案 0 :(得分:0)
我必须为一个项目(CiviCRM)做同样的事情。我收到的一个建议是检查OpenRefine,它可能有一些工具可以找到类似的字符串,但我想用简单的东西自动化这个过程,所以我写了一个简短的脚本。
公平警告,这不是最有效的,并且可能需要一段时间才能在大型项目上运行(我们在CiviCRM中有大约16000个字符串)。
供参考: 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文件上运行它),并逐个遍历所有字符串。
我对按字母顺序对字符串进行排序犹豫不决,但我发现不止一些情况下字符串前面有不正确的空格,拼写错误等等。
另一个可能的改进是首先检查字符串的长度,并跳过长度非常不同的字符串。