设为首页 收藏本站
查看: 1421|回复: 0

[经验分享] 转:自动翻译po文件的python程序

[复制链接]

尚未签到

发表于 2017-5-6 13:41:38 | 显示全部楼层 |阅读模式
  From: http://www.minilinux.net/node/27
  这个程序使用google translate来辅助翻译po文件。需要注意的是,现在机器的翻译水平并不高,人工智能还有很长很长的路要走。这个程序的主要作用是节省一部分英语不是那么好的网友查字典的时间,而指望它翻译出来的句子能直接被读懂是不现实的。 

这个程序的使用方法很简单,它只有一个参数,就是需要翻译的po文件名称,翻译后的结果直接输出到stdout。如果文件名是-,那么程序将从stdin读入po文件。

这个程序的一大特色是可以支持多个代理服务器轮流向google translate发出请求,以免被google封锁,哈哈。配置代理服务器只要修改一下程序开头的proxies数组就可以了。其中None代表不使用代理服务器。

程序中间还有一段是设置输出po文件头的部分,主要是版权申明和reportbug字段可能要根据需要修改。

另外这个程序对bash脚本中字符串翻译做了一些优化,比如$ABC这样在字符串中的变量名是不会被翻译的。具体可以看translate_fixed函数。
  


#!/usr/bin/python  
# -*- coding: utf-8 -*-  
import sys  
import httplib  
import urllib  
import urllib2  
import traceback  
import re  
import random  
import time  

proxies = [  
"proxy1:port",  
"proxy2:port",  
None,  
]  

def translate(text):  
addr = "http://www.google.com/translate_t?sl=en&tl=zh-CN"  
proxies.insert(0, proxies.pop())  
for proxy in proxies[:]:  
try:  
req = urllib2.Request(addr)  
req.add_header("User-Agent", "Mozilla/5.0")  
req.add_data(urllib.urlencode({"text": text}))  
if proxy:  
req.set_proxy(proxy, "http")  
trans = urllib2.urlopen(req).read()  
trans = re.search("<div id=result_box dir=\"ltr\">(.*?)</div>",   
trans).group(1)  
trans = re.sub("&#(\d+);",   
lambda s: chr(int(s.group(1))),   
trans)  
trans = re.sub("&([a-z]+);",   
lambda s: {"lt":"<", "gt":">", "amp":"&"}[s.group(1)],  
trans)  
return trans  
except:  
proxies.remove(proxy)  
print >>sys.stderr, "Proxy: %s" % proxy  
traceback.print_exc()  
return None  

def translate_fixed(text):  
#    signature = random.randrange(1E20, 1E21)  
notrans = []  
def replace(match):  
notrans.append(match.group(0))  
return " 0.%d68065175210" % (len(notrans) - 1)  
text = re.sub("\${[\w_]+}|\$[\w_]+", replace, text)  
text = re.sub("\\\\\"|\\\\$|\\\\\\\\n|\\\\t", replace, text)  
text = re.sub("\\\\", replace, text)  
text = re.sub("[A-Z]{2,100}", replace, text)  
text = re.sub("<\w+>|</\w+>", replace, text)  
text = re.sub("puppy(?i)", replace, text)  
trans = translate(text)  
for i in range(len(notrans)):  
#        print "re.sub",  
#        print "%dx" % (signature + i), notrans, trans  
trans = re.sub("0 ?.%d68065175210" % i, lambda x: notrans, trans)  
return trans  

random.seed()  
if len(sys.argv) != 2:  
print "Usage: " + sys.argv[0] + " filename.pot"  
sys.exit(1)  
if sys.argv[1] == "-":  
f = sys.stdin  
else:  
f = open(sys.argv[1])  

print """# 中文Puppy Linux开发者之家.
# This file is distributed under GPL.
#"""  
print """#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: %(program)s\\n"
"Report-Msgid-Bugs-To: %(reportbug)s\\n"
"POT-Creation-Date: %(date)s\\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n"
"Last-Translator: Google Translate\\n"
"Language-Team: Chinese\\n"
"MIME-Version: 1.0\\n"
"Content-Type: text/plain; charset=utf-8\\n"
"Content-Transfer-Encoding: 8bit\\n"
""" % {"program": sys.argv[1],  
"reportbug": "laborer@126.com",  
"date": time.strftime("%Y-%m-%d %H:%M%z")}  

for line in f:  
if not line.rstrip():  
break;  
trans = []  
buf = ""  
skip = False  
for line in f:  
line = line.rstrip()  
if skip:  
skip = line;  
continue  
if line.startswith("#,"):  
print line + ", fuzzy"  
elif line.startswith("#"):  
print line  
elif line.startswith("msgid "):  
print "msgid",  
line = line[6:]  
elif line.startswith("msgstr "):  
print "msgstr",  
if buf:  
trans.append(translate_fixed(buf))  
buf = ""  
for s in trans:  
print "\"%s\"" % s  
print  
trans = []  
skip = True  
if line.startswith("\""):  
print line  
buf += line[1:-1]  
if buf.endswith("\\n"):  
trans.append(translate_fixed(buf[:-2])+"\\n")  
buf = ""  
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-373882-1-1.html 上篇帖子: Python:pygame游戏编程之旅六(游戏中的声音处理) 下篇帖子: 查找列表中某个值的位置(python)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表