Google Translate API中避免特殊占位符被翻译

最近使用Google Translate服务做系统的翻译工作,不过框架支持的数据绑定被翻译后就出大问题了,比如原文:

Page {currentPage} of {totalPage}, total {totalItems} messages.

被翻译后就成了

页 {当前页} {总页},总{全部项}消息。

最后解决办法是在翻译前将内容中的占位符做一个预处理,将其变为不可翻译的格式(这里使用的是 _数字_ ),谷歌遇到这种文字的时候会忽略掉,然后再将翻译结果中的占位符再还原。实现代码:

        my $idx = 0;
        $ret = $text;
        my $pre_rep = sub
        {
            push @tags, shift;
            return '_' . $idx++ . '_';
        };
        my $post_rep = sub
        {
            my $idx = shift;
            return "{$tags[$idx]}";
        };
        $ret =~ s/{([\w\?\_\-\.]+)}/&$pre_rep($1)/ge;
        my $resp = $service->translate({q => $ret, source => $source, target => $target, format => 'text'});
        $ret = $resp->{data}->{translations}->[0]->{translatedText};
        $ret =~ s/_(\d+)_/&$post_rep($1)/ge;

Last modified on 2013-03-04