`
viking2439
  • 浏览: 49347 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

转:自动翻译po文件的python程序

 
阅读更多

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[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 = ""  
 
分享到:
评论

相关推荐

    potranslate:使用 GoogleTranslate 翻译 PO 文件

    `potranslate` 是一个基于 Python 的工具,它利用了 Google Translate API 来帮助开发者自动翻译 PO(Gettext Portable Object)文件。PO 文件是软件国际化(i18n)和本地化(l10n)过程中常用的一种文本资源格式,...

    poedit编辑器,po文件编辑器

    `poedit编辑器` 是一款专为翻译工作设计的强大工具,它主要用于编辑`.po`文件。`.po` 文件是一种源代码级别的文本翻译格式,广泛用于软件本地化(L10N)中,特别是在开源项目中。通过`poedit`,用户可以方便地对这些...

    python国际化编译工具

    最后,在你的Python程序中,设置当前的locale,就可以根据用户的语言环境显示相应的翻译了。 `babel`库则提供了更高级的功能,如日期和数字格式化、货币和度量单位转换等,这些都是本地化过程中的重要部分。`Babel`...

    Python-AndroidIOS使用Python来帮助你的App国际化文言

    - **合并与编译**:使用Python将翻译后的`.po`文件合并到原有的资源文件中,并生成目标语言的`.mo`文件,供Android和iOS使用。 - **版本控制**:通过Git等版本控制系统,管理不同语言版本的更新。 3. **持续集成...

    python polib==1.1.1

    5. **自动检测编码**:`polib`能够自动识别PO文件的编码,支持Unicode,确保跨语言数据的正确处理。 6. **错误处理**:在处理文件时,`polib`会捕获并处理可能出现的错误,如无效的文件格式或编码问题。 7. **辅助...

    django-autotranslate:一个简单的Django应用程序,可使用Google翻译自动翻译django的makemessages命令生成的pot(.po)文件。

    Django自动翻译一个简单的Django应用程序,可使用Google翻译自动翻译django的makemessages命令生成的pot( .po )文件。安装: pip install django-autotranslate 将'autotranslate'添加到您的INSTALLED_APPS设置中...

    potranslator:一个软件包,可以轻松翻译Google Translate支持的任何语言的po和pot文件

    3. 检查和整合:翻译完成后,开发者需要检查翻译的质量,并可能需要根据上下文进行微调,然后将翻译的po文件合并回项目中。 此外,potranslator还支持批量翻译和自动化工作流,对于有大量翻译需求的项目来说,这是...

    python国际化的例子

    一旦`.po`文件被翻译,我们需要使用`msgfmt`工具将其编译成二进制的`.mo`文件,Python程序在运行时会加载这个文件。 6. **设置语言环境** 在Python程序中,我们需要设置当前的语言环境,这通常是通过调用`gettext...

    python-ui-auto-test:WebUI自动化:python +Selenium+单元测试+ PageObject + BeautifulReport + redis + mysql + ParamUnittest +明天+ ThreadLocal +屏幕截图+日志+多个浏览器驱动程序+ RemoteWebDriver + .ini文件阅读器+可配置的项目

    python + selenium + unittest + PO + BeautifulReport + redis + mysql + ParamUnittest + 多线程 + 截图/日志 + 多浏览器支持 + RemoteWebDriver +文件读取 + 全参数化构建 搭建过程中非常感谢李鹏飞大侠的技术...

    poedit-2.0.4安装包

    2. 支持自动检测:Poedit可以自动检测项目中的可翻译字符串,自动生成或更新.po文件,大大提高了工作效率。 3. 语法高亮:对于编程语言中的关键词,Poedit会进行高亮显示,帮助译者更好地理解上下文。 4. 拼写检查...

    gettext-0.19.6.tar.gz

    3. **翻译Po文件**:将Po文件分发给翻译人员进行翻译。 4. **合并更新**:当源代码发生变化时,使用`msgmerge`更新Po文件,保留已有的翻译。 5. **编译Mo文件**:使用`msgfmt`将Po文件转换为Mo文件,供程序运行时...

    python+unittest框架最新版UI自动化设计思路(csdn)————程序.pdf

    Python+unittest框架是一种广泛使用的UI自动化测试解决方案,尤其适合大型项目的测试需求。在这个最新的设计思路中,作者在原有的Excel纯数据驱动的基础上进行了改良和优化,旨在提高自动化测试的灵活性和实用性。 ...

    核心基础-如何实现多国语言文字输出-Python实例源码.zip

    3. **设置环境变量**:在运行Python程序时,可以通过设置`LC_ALL`或`LANG`环境变量来选择语言。例如,`export LANG=fr_FR.UTF-8`将选择法语。 4. **导入并使用`gettext`**:在Python代码中,导入`gettext`模块,...

    Python库 | langacore.kit.i18n-0.1.3a2.tar.gz

    5. **编译**:将翻译后的`.po`文件编译成`.mo`文件,这一步是必要的,因为`.mo`文件是Python的gettext模块所使用的二进制格式。 6. **集成**:最后,通过调用库提供的函数在代码中插入国际化功能,确保程序能够根据...

    python-po-test

    Python PO(Page Object)测试框架是一种常见的自动化测试方法,尤其在Web应用测试中广泛使用。它将网页的界面元素抽象为对象,通过封装相关的操作和验证逻辑,使得测试代码更加清晰、易于维护。在"python-po-test...

    Python库 | PO-Projects-client-0.1.2.1.tar.gz

    这是一种常见的压缩格式,由两种压缩算法组合而成:`.tar`用于打包多个文件和目录成一个单一的归档文件,而`.gz`则使用gzip程序对这个归档文件进行压缩,以节省存储空间。要解压此文件,你需要先使用gunzip或tar命令...

    Python库 | transifex_client-0.2.1-py2.6.egg

    而Transifex Client库则是一个Python接口,允许开发者通过命令行或程序代码与Transifex服务进行交互,实现自动化翻译流程。 首先,安装“transifex_client-0.2.1-py2.6.egg”库非常简单,只需要将这个文件解压缩后...

    PO_app.zip

    标题“PO_app.zip”指的是一个包含了自动化测试框架的压缩包,特别设计用于移动应用的自动化测试。这个框架基于“Page Object”模式,这是一种在软件测试领域广泛应用的设计模式,旨在提高测试代码的可维护性和...

    gettext-0.14.tar.gz

    - MO(Machine Object)文件:编译后的PO文件,用于程序运行时快速查找和加载翻译。 - 支持多种编程语言:包括C、C++、Python、Perl等。 - 命令行工具:如`xgettext`、`msgfmt`、`msgmerge`等,用于字符串提取、PO...

    Poedit-2.2-mac版

    而MO文件则是编译后的PO文件,用于程序运行时快速查找和加载翻译内容。Poedit提供了一个直观的界面,允许用户直接在软件中打开和编辑PO文件,同时也能生成对应的MO文件,无需手动进行编译步骤。 在WordPress环境中...

Global site tag (gtag.js) - Google Analytics