解决QT中文5.6 QTextEdit QPlainTextEdit的右键菜单翻译不全_qt plaintextedit右键未汉化_剑有偏锋的博客-程序员宅基地

技术标签: python  QT  

原因:

QT项目中,发现QTextEdit QPlainTextEdit的右键菜单翻译不全,跟踪代码发现是未翻译qtbase.ts的QWidgetTextControl节点,且未见有qtbase_CN.ts版本。

然后就以日文版的qtbase_ja.ts为模板,把QWidgetTextControl节点翻译到qt_zh_CN.ts中,在编译为二进制用于项目中。


注意:u"###5 Translate  escape character." 这个模块的功能是还原xml节点的text含' "时,在编程xml时会被转义为"&;"的问题。


用法:

call merge_translate.py "\src\qtbase_ja.ts" "\src\qt_zh_CN_.ts" "\src\qt_zh_CN.ts"


代码:

#coding=utf-8  

from bs4 import BeautifulSoup
import lxml
import re
import os,sys


'''
<context>
<name>CloseButton</name>
<message>
<source>Close Tab</source>
<translation>xxxxxxxxxxxxxxxxxxx</translation>
</message>
</context>
'''

def doTranslate(pathJa, pathCNTemp, pathCN):    
    print pathJa, pathCNTemp, pathCN
    #os.system("pause")    
    
    print u"###1 read Translation file."
    contentsJA= ""
    with open(pathJa) as f:
        for line in f.readlines():
            contentsJA += line
    soupJA = BeautifulSoup(contentsJA, "xml")
    

    print u"###2 get Translation node."
    listContents = [ item for item in soupJA.find_all('context') if item('name')[0].contents[0] == u'QWidgetTextControl']

    if 0 == len(listContents):
        print u" QWidgetTextControl not exist,return"
        return

    #清空原来的翻译内容
    QWidgetTextControlContents = listContents[0]
    for item in listContents[0].findChildren('message'):
        item('translation')[0].contents[0]=u''
        

    print u"###3 insert Translation node."
    contentsCN= ""
    with open(pathCNTemp) as f:
        for line in f.readlines():
            contentsCN += line
    soupCN = BeautifulSoup(contentsCN, "xml")

    listContentsCN = [ item for item in soupCN.find_all('context') if item('name')[0].contents[0] == u'QWidgetTextControl']
    
    if 0 == len(listContentsCN):
        lastContents = soupCN.find_all('context')[-1]
        lastContents.insert_after(QWidgetTextControlContents)        


    print u"###4 Translate null  word entry."
    for item in soupCN.find_all('context')[-1].findChildren('message'):
        if 0 == len(item.translation.contents[0]):
            listTemp = [train for train in soupCN.find_all('message') if item.source.contents[0] == train.source.contents[0] and  0 != len(train.translation.contents[0])]
            #print listTemp
            if len(listTemp) > 0:
                temp = listTemp[0]
                item.translation.contents[0] = temp.translation.contents[0]



    print u"###5 Translate  escape character."
    t =  str(soupCN)
    while re.findall( r"(>.*?)'", t ):
        t = re.sub(r"(>.*?)'", r"\1'", t)    

    while re.findall( '''(>.*?)\"''', t ):
        t = re.sub('''(>.*?)\"''', r"\1"", t)
    
    print u"###6 save file."
    fo = open(pathCN, "w+")
    fo.write( t)
    fo.close()


    
if __name__ == "__main__":    
    #print sys.argv
    print sys.getdefaultencoding()
    if 4 > len(sys.argv):
        print u"please input qtbase_ja.ts  qt_zh_CN_.ts  qt_zh_CN.ts full path."
    else:
        doTranslate(sys.argv[1], sys.argv[2], sys.argv[3])
    



    


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidang201/article/details/53351776

智能推荐

PHP, Python, Node.js 哪个比较适合写爬虫?-程序员宅基地

PHP, Python, Node.js 哪个比较适合写爬虫? 1.对页面的解析能力2.对数据库的操作能力(mysql)3.爬取效率4.代码量推荐语言时说明所需类库或者框架,谢谢。比如:python+MySQLdb+urllib2+reps:其实我不太喜欢用python(可能是在windows平台的原因,需要各种转字符编码,而且多线程貌似很鸡肋。)...

Revit 二次开发创建墙的实例_revit levelid-程序员宅基地

1创建墙实例的方法一共5个重载 (1)Wall.Create(Document document, IList&lt;Curve&gt; profile, bool structural) document :文档 profile : 生成墙的定位线集合 structural :是否是结构 (2)Wall.Create(Documen..._revit levelid

IOS学习笔记七之KVC和Key路径-程序员宅基地

1、KVC介绍1)、KVC是由NSKeyValueCoding协议提供支持最基本的属性和两个方法如下setValue:属性值 forkey:属性名:为指定属性设置值valueForKey:属性名 (得到或者指定属性的值)2)、当设置value为nil的时候,我们需要在类的实现里面重写setNilValueForKey方法,不然会抛出NSInvalidArgumentException2、测试...

从输入一个URL到页面渲染的流程简介-程序员宅基地

从输入URL到页面加载,简单来说分为以下几个过程:输入URL DNS解析 TCP连接 发送HTTP请求 服务器处理请求并返回HTTP报文 解析渲染页面 连接结束具体过程如下:首先,在浏览器地址栏中输入URL。 域名解析。实现网址到IP地址的转换。当发送一个url请求时,不管这个url是web页面的url还是web页面上的每个资源的url,浏览器都会开启一个线程处理该请求,..._从输入一个url到页面渲染的流程

Android FrameLayout的android:foreground属性可以设置单击时的前景色-程序员宅基地

触摸之后,设置前景色,可以告诉用户确实单击了,增加用户体验。这样,touch事件触发的时候,就会有前景色了参考资料:Android FrameLayout的android:foreground属性可以设置单击时的前景色——http://blog.csdn.net/jdsjlzx/article/details/13827993

基于FPGA的CAN总线控制器的设计(下)_vivado can控制器-程序员宅基地

今天给大侠带来基于FPGA的CAN总线控制器的设计,由于篇幅较长,分三篇。今天带来第三篇,下篇,程序的仿真与测试以及总结。话不多说,上货。导读CAN 总线(Controller Area Network)是控制器局域网的简称,是 20 世纪 80 年代初德国 BOSCH 公司为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发的一种串行数据通信协议。目前,CAN 总线已经被列入 ISO 国际标准,称为 ISO11898。CAN 总线已经成为工业数据通信..._vivado can控制器

随便推点

web.xml文件的作用及基本配置_web.xml的作用以及编写方法-程序员宅基地

web.xml文件的作用及基本配置 web工程中的web.xml文件有什么作用呢?它是每个web.xml工程都必须的吗?一个web中完全可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的。那什么时候需要,什么时候可以不需要呢?要想回答上面的问题,得先了解web.xml文件使用来干什么的。web.xml文件是用来配置:欢迎页、servlet、filte_web.xml的作用以及编写方法

Raphael绘制流程图(一),添加可拖动的图形_draw-mini.js var wf_r = null-程序员宅基地

原项目使用的Raphael绘制流程图,要求能自定义箭头的样式和颜色,结合从网上找到的一些资料进行修改。1.jquery或javascript代码//添加步骤function addStep(x, y, text, id, addToJSON, type1, bordercolor, bgcolor) { var guid = getGuid(); var xy = getNewXY(); x = x || xy.x; y = y || xy.y; ..._draw-mini.js var wf_r = null

使用POI实现导出图片功能及设置导出Url为超链接_apachepoi 导出 设置url-程序员宅基地

1、Excel导出图片需求背景 最近在做一个项目,是针对考试人员需要拍照,然后把拍照的照片导出到Excel之中,经过试验确实可以导出到Excel之中,但是实用性不强,如果一场考试50个人计算,一个人拍摄照片3张,平均一张照片2M,2*3*50就至少有300M的大小了,并且图片长宽过大在Excel也不太适合展示,并且就算导出后这个Excel文件过大;导致打开文件过慢。所以导出图片到Excel适..._apachepoi 导出 设置url

Swift: iOS底层基础知识-文件目录结构-程序员宅基地

一:iOS沙盒知识出于安全考虑,iOS系统把每个应用以及数据都放到一个沙盒(sandbox)里面,应用只能访问自己沙盒目录里面的文件、网络资源等(也有例外,比如系统通讯录、照相机、照片等能在用户授权的情况下被第三方应用访问)1:MyApp.app 该目录包含了应用程序本身的数据,程序打包的时候的资源文件和一些本地文件就是存放在这个目录下的

攻防世界XCTF:NaNNaNNaNNaN-Batman_攻防世界 nanna-程序员宅基地

下载附件乱码,但是根据内容大概可判别为网页文件,javascript脚本。修改后缀名为.html用浏览器打开还是看不懂,然后把内容部分执行函数eval修改为alert,弹窗显示正常。两种方法得到flag第一种方法:匹配正则,根据内容可知以 ^ 开头 $ 结尾的,拼接就可以了,注意长度==16,删除一些重复的刚刚好。提交内容:be0f233ac7be98aa\第二种方法:因为..._攻防世界 nanna

『每日一题 2012-02-10』猴子选大王问题 C语言实现-程序员宅基地

问题描述:办法如下:猴子按1,2,。。。,n编号围坐一圈,从第一只开始,按1,2,。。。,m报数,报m的退出,从下一只开始,继续循环报数,剩下的最后一只猴子就是大王,编程输出大王的序号。程序实现:#include #define NUMBER_OF_MONKEY 9 //猴子数目#define M 3 //报数时的最大数字int main(){ int