4

我正在尝试使用基于网络的谷歌翻译将我的英文文件翻译成另一种语言。它们包含 %s 和 %d 等字符。有没有办法保护它们不被错误翻译。

例如,文本:

编号为 %s 的运动员已存在

被翻译成:

Athlète existe déjà avec nombre%s

虽然我希望它被翻译成:

Athlète existe déjà avec nombre %s

(我正在处理输入和输出,所以我可以在它周围添加字符以“转义” %s 和 %d 字符串。我想已经用某个词替换 %s 我确信谷歌不会尝试翻译自我,但我希望有更好的解决方案)

4

4 回答 4

3

奇怪的想法,但是..

用下划线中的唯一数字替换每个格式说明符(或任何在翻译中保持不变并且不会干扰您使用数字的内容),例如:

运动员已存在,编号为 %s => 运动员已存在,编号为 _001 _

翻译成中文:天才已经存在的号码_001_

之后,如果您在格式字符串翻译中有多个格式说明符,请检查翻译后数字的顺序是否相同,如果是,请将说明符替换回来。

于 2010-08-01T21:16:30.640 回答
2

对 sprintf 的 PHP 文章的评论也为这个问题提供了一个巧妙的解决方案。

http://www.php.net/manual/en/function.sprintf.php#93552

/**
 * Converts any sprintf to a Google Translate suitable string.
 */
function _toTranslateSafeString($original)
{
    $pattern = '/(?:%%|%(?:[0-9]+\$)?[+-]?(?:[ 0]|\'.)?-?[0-9]*(?:\.[0-9]+)?[bcdeufFosxX])/';       
    $escapeString = '<span class="notranslate">$0</span>';
    return preg_replace($pattern, $escapeString, $original);
}

/**
 * Converts any Google Translate suitable string to a sprintf string.
 */
function _fromTranslateSafeString($translated)
{
    $escapePattern = '/<span class="notranslate">([^<]*)<\/span>/';
    return preg_replace($escapePattern, '$1', $translated);
}
于 2011-07-13T19:30:42.957 回答
1

您是否已重组程序以使用msgcat包来处理字符串?它的文档涵盖了大部分要点,包括如何处理不同的替换顺序。唯一有点棘手的是你需要处理%符号移动的方式;如果正在处理的文本量足够小,您甚至可以手动或借助一些机械辅助来完成(vi、emacs 和 eclipse 都可以进行所需的匹配/替换;其他编辑器可能也可以,但我没有不要使用那些)。

于 2010-08-01T21:29:23.910 回答
0

我建议单独翻译字符串的每个部分,然后添加 c 标记。您可能会得到不太准确的翻译,但这就是使用自动翻译器的风险。

而且总是有 Beta 测试人员 :)

或者更好的主意:将 %d 更改为任意整数,将 %s 更改为不会被 Google 翻译的任意拉丁字符串(使用罕见的姓氏通常可以解决问题),将 %d 更改为任意数字等。

于 2010-08-01T21:19:02.040 回答