C 使用google translate翻译基于printf的字符串

C 使用google translate翻译基于printf的字符串,c,internationalization,tcl,google-translate,C,Internationalization,Tcl,Google Translate,我正在尝试使用基于网络的谷歌翻译将我的英文文件翻译成另一种语言。它们包含像%s和%d这样的字符。有没有办法防止它们被错误翻译 例如,文本: 运动员已存在,编号为%s 翻译为: Athlète existe déjáavec nombre%s 虽然我希望它被翻译成: Athlète existe déjáavec nombre%s (我正在处理输入和输出,以便在其周围添加字符以“转义”%s和%d字符串。我想已经用某个单词替换了%s,我肯定google不会尝试自行翻译,但我希望有更好的解决方案)奇怪

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

例如,文本:

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

翻译为:

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

虽然我希望它被翻译成:

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

(我正在处理输入和输出,以便在其周围添加字符以“转义”%s和%d字符串。我想已经用某个单词替换了%s,我肯定google不会尝试自行翻译,但我希望有更好的解决方案)

奇怪的想法,但是

将每个格式说明符替换为下划线中唯一的数字(或任何在翻译过程中保持不变且不会影响数字使用的数字),如:

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

翻译成中文: 運動員已經存在的號碼 _001_


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

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

而且总是有测试人员:)


或者更好的主意:将%d更改为任意整数,%s更改为谷歌无法翻译的任意拉丁字符串(使用罕见的姓氏通常可以做到这一点),%d更改为任意数字,等等。

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

有关sprintf的PHP文章的评论也为这个问题提供了一个简洁的解决方案

/**
*将任何sprintf转换为Google Translate合适的字符串。
*/
函数_toTranslateSafeString($original)
{
$pattern='/(?:%\%%\$)?[+-](?:[0]\')?-?[0-9]*(?:\.[0-9]+)?[BCDEUFOSXX])/;
$escapeString='$0';
返回preg_replace($pattern,$escapeString,$original);
}
/**
*将任何Google Translate合适的字符串转换为sprintf字符串。
*/
函数_fromtranslates festring($translated)
{

$escapePattern='/([^翻译C样式的格式字符串不是一个好主意(我知道这一点,因为我以前也这么做过)。无法保证所有格式说明符在另一种语言中的顺序是相同的。例如,“错误读取文件%s的行%ld”可以翻译为“Probleem tijdens lezen-van bestand%s,lijn%ld”(荷兰语)考虑使用另一个约定,例如.NET,其中{1 },{ 2 }。,是使用的。当然,您应该自己解析这些字符串,这比使用printf要困难一些,但从长远来看,它会提供更好的结果。@Patrick:Tcl支持格式字符串中的XPG3位置说明符,例如,
%1$ld
。这对这类事情非常有用,
msgcat
包使这更简单。多纳尔,我想我们同意这个原则。只是技术实现不同(me:.Net,you:Tcl/XPG3)。但是关于这个原则,我们同意。@Patrick:有趣的是,使用问题的标签来确定需要什么样的答案是很有用的。@Patrick:我试着放一些类似{\1}的东西通过google translate,但它不能保持它的完整性,因此{1}可能也不太走运。这类似于我建议使用.Net说明符的评论:{1},{2}。优点是,翻译可以更改格式说明符的顺序,而且翻译仍然有效。聪明,事实上,您可以将其翻译回XPG3位置说明符以便于应用。但它是否适用于更改时态的语言(不是很正确的词,但我不是语言学家)根据数字的基数?IIRC,1/many不是唯一的区别。Donal在翻译时,尽量避免使用阳性/阴性(尤其是翻译成法语、德语等)和单数/复数。请注意,甚至有些语言的2的“后缀”与许多(斯洛文尼亚语)的后缀不同@Patrick:这正是我的观点。我知道它们存在,但不知道它们是什么。下划线(41;的使用它是智能的,因为它不是任何词汇表的一部分,而是一台被视为字母表一部分的机器。考虑到翻译成中文作品,它可能适用于大多数其他语言。我会尝试一下!让我想起20年前我们在公司所做的事情。想象一个字符串,如“错误读取文件%s的第%d行,字符%c无效”.您不能认真翻译所有部分“错误读取行”、“文件的错误”、“字符”和“无效”到另一种语言。这只会产生垃圾。您甚至不想将其交给测试人员。是的,我使用msgcat包进行翻译。目前,一个句子中实际有多个%s实例的字符串数量是有限的,对于我最初从英语到荷兰语的单个翻译,我没有遇到p问题(还没有)。也许用法语我会碰到他们!
/**
 * 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);
}