我正在尝试使用基于网络的谷歌翻译将我的英文文件翻译成另一种语言。它们包含%s和%d等字符。有没有办法保护他们不被错误翻译。
例如,文字:
运动员已经存在,编号为%s
被翻译为:
Athlèteexistedéjàavecnombre%s
虽然我希望它被翻译成:
Athlèteexistedéjàavecnombre%s
(我正在处理输入和输出,所以我可以添加它周围的字符来'逃避'%s和%d字符串。我认为已经用某个词替换%s我确定google不会尝试翻译自我,但我希望有一个更好的解决方案)
答案 0 :(得分:3)
奇怪的想法,但是..
将每个格式说明符替换为下划线中的唯一编号(或者不变的翻译,并且不会干扰您对数字的使用),例如:
运动员已存在,编号为%s => 运动员已经存在,编号为_001 _
翻译成中文: 运动员已经存在的号码_001 _
之后,如果在格式字符串转换中有多个格式说明符,请检查数字是否在转换后的相同顺序中,如果是,则替换说明符。
答案 1 :(得分: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);
}
答案 2 :(得分:1)
您是否重组了程序以使用msgcat
包来处理字符串?它的文档涵盖了大多数重点,包括如何处理不同的替换顺序。唯一含糊不清的一点是你需要处理%
符号被移动的方式;如果正在处理的文本数量足够小,你甚至可以手动或通过一些机械帮助来做到这一点(vi,emacs和eclipse都可以做所需的匹配/替换;其他编辑也可以,但我不喜欢不要用那些。)
答案 3 :(得分:0)
我建议单独翻译字符串的每个部分,然后添加c标记。您可能会得到不太准确的翻译,但这是使用自动翻译的风险。
总有beta测试者:)
或者更好的想法:将%d更改为任意整数,将%s更改为不会被Google翻译的任意拉丁字符串(使用罕见的姓氏通常可以执行此操作),将%d更改为任意数字等。