当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 7 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 自动翻译po文件的python程序
帖子发表于 : 2008-06-21 3:43 
头像

注册: 2005-10-25 11:15
帖子: 1016
送出感谢: 0 次
接收感谢: 1
使用方法很简单,这个程序只有一个参数,就是需要翻译的po文件名称,翻译后的结果直接输出到stdout。如果文件名是-,那么程序将从stdin读入po文件。

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

程序中间还有一段是设置输出po文件头的部分,主要是版权申明和reportbug字段可能要根据需要修改。
代码:
#!/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[i], trans
        trans = re.sub("0 ?.%d68065175210" % i, lambda x: notrans[i], 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 = ""

原文在http://puppy.cnbits.com/node/27


_________________
hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser


最后由 laborer 编辑于 2008-12-02 12:16,总共编辑了 1 次

页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-06-21 8:39 
头像

注册: 2007-09-29 3:09
帖子: 5773
送出感谢: 0 次
接收感谢: 3
引用:
google translate
:shock:

翻出来的东西是天书...还不如自己翻...


_________________
HUNT Unfortunately No Talent...


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-06-22 4:58 
头像

注册: 2005-10-25 11:15
帖子: 1016
送出感谢: 0 次
接收感谢: 1
google translate在这里的作用是节省一部分英语不是那么好的网友查字典的时间。指望它翻译出来的句子能直接被读懂是不现实的。

就我参与的一个志愿翻译项目的经验来看,大部分的参与者英语水平都很一般,这并不太难理解,英语很好的朋友可能对翻译的版本兴趣并不大,也就没有很大的热情参与。所以,google translate虽然翻译质量很差,但从实际使用效果上来说,对提高志愿者翻译速度有一定的帮助。

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


_________________
hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-08-31 21:21 

注册: 2008-05-02 13:35
帖子: 9
送出感谢: 0 次
接收感谢: 0 次
怎么用???
大概说一下撒!
不太懂~~


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2008-08-31 21:26 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
超级赞..

如果用一个专门翻译计算机专业名词的网站就好


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2008-08-31 21:46 
头像

注册: 2007-11-19 21:51
帖子: 6956
地址: 成都
送出感谢: 0 次
接收感谢: 4
强阿,它翻译的东西只要稍微改下就能用了诶 :lol:


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2008-09-03 11:18 
头像

注册: 2007-07-30 18:28
帖子: 22033
地址: 空气中
系统: Linux
送出感谢: 17
接收感谢: 68
希望让翻译程序 不变动一些专有名词


_________________
『这个世界都是我的 ,我爱你们』

ENTP ⥂ INTP ⥄ INFP ⇦ INTJ

在此发布的文章使用 Creative Commons Attribution-ShareAlike 4.0 协议


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 7 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译