代码之家  ›  专栏  ›  技术社区  ›  Roalt

使用googletranslate翻译基于printf的字符串

  •  4
  • Roalt  · 技术社区  · 16 年前

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

    例如,文本:

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

    翻译为:

    Athl公司¨退出dj avec nombre%s

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

    4 回复  |  直到 16 年前
        1
  •  3
  •   Nordic Mainframe    16 年前

    奇怪的想法,但是。。

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

    =>

    翻译成中文: é·¨è _001_

    之后相同顺序 转换如果在格式字符串转换中有多个格式说明符,如果是,则将说明符替换回来。

        2
  •  2
  •   Daniel A.A. Pelsmaeker    15 年前

    对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);
    }
    
        3
  •  1
  •   Donal Fellows    16 年前

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

        4
  •  0
  •   liorda    16 年前

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

    总有测试人员:)

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