解决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

智能推荐

谈谈iOS多工程依赖-程序员宅基地

工程形式*.xcodeproj*.xcworkspacexcworkspace更好的管理着Build Products Path,统一编译结果路径,使用workspace的好处之一是能找到编译后的库文件,否则需要手动执行Search Paths。.a库在Header Search Paths和Library Search Paths设置里添加$(BUILT_

grep命令_grep -s-程序员宅基地

1.只搜索当前目录 -sgrep -s ./*2.搜索当前所有目录包括子目录-Rgrep -R ./*3.特定内容-w默认grep 匹配到的都是包含某字符型的情况比如:grep com ./*会搜索出the compose is,用-w是更精确的匹配,搜索到的就是 the com is4.只显示文件名-l5.忽略大小写搜索-i6.显示行号-n7.反向匹配..._grep -s

小白读论文之. Show, Attend and Tell: Neural Image Caption Generation with Visual Attention-程序员宅基地

这篇论文还是还是有许多人通读的,给几个我用来参考的链接:https://www.jianshu.com/p/7582df96b081 和https://www.pianshen.com/article/819194787/https://zhuanlan.zhihu.com/p/158985765首先先看一下网上的解析,对这篇文章有一个直接的认识。他的方法就是:使用cnn提取图像特征,并将softmax层之前的那一层vector作为encoder端的输出并送入decoder中,并使用LSTM对其解码

导出pdf之--下载到本地-程序员宅基地

需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片两种实现方法: 一:通过超链接实现下载在HTML网页中,通过超链接链接到要下载的文件的地址[html] view plain copy> html> head> meta charset="UTF-8"> title>Insert titl

决策树基本原理与sklearn应用_决策树sklearn 离散属性怎么处理-程序员宅基地

# 决策树算法1 决策树算法的引入1.1树的概念1.2算法思路1.3构建决策树的三个步骤2 特征分类的评价指标2.1熵的概念2.2信息熵的概念2.3Gini系数3 ID3算法4 C4.54.1决策树对连续属性的处理4.2决策树对离散属性的处理5 CART分类回归树5.1CART分类回归树简介5.2CART分类树---待预测结果为离散型数据5.3CART回归树--待预测结果为连续型数据5.4CART..._决策树sklearn 离散属性怎么处理

MySQL数据库之——日志和数据库内容的备份与恢复(妈妈再也不用担心数据丢失了)_数据库系统未提供日志文件、配置文件的数据备份与恢复。-程序员宅基地

日志、数据备份恢复一、日志管理1.1 日志路径1.2 修改配置文件二、数据库备份的分类2.1 概述2.1 分类从物理和逻辑的角度分为两类从数据库的备份策略2.2 常见的方法三、完全备份和恢复3.1 概述3.2 结构物理冷备份与恢复3.3 mysqldump 备份3.4 完全恢复四、MySQL增量备份与恢复4.1 增量备份4.2 增量恢复一般恢复一、日志管理1.1 日志路径MySQL的日志默认保存 /usr/local/mysql/data1.2 修改配置文件vim /etc/my.cnf[my_数据库系统未提供日志文件、配置文件的数据备份与恢复。

随便推点

HashMap里的Node_hashmap node-程序员宅基地

一。HashMap类中的Node<K,V>类里有一个Node<K,V> next。那以Node<K,V>.next.next.next这种结构形式存储元素就是所说的链表,而Node<K,V>[ ] tab就是数组,tab所存储元素为每个链表的第一个元素。每个数组的位置就是一个哈希值,如果两个值哈希值一样,就会占用一个位置,他们就成了一个链表..._hashmap node

使用flutter控制蓝牙通讯,在Flutter中设置蓝牙设备名称-程序员宅基地

It is possible to change the Bluetooth device name using BluetoothAdapter.getDefaultAdapter().setName() in Android, but I am unable to find how we can do it in Flutter. I've tried using the flutter_bl..._flutter_blue 蓝牙设备id

20190304 工作记录_excel 20190304设置时间格式-程序员宅基地

1.map value可重复2. 运行时错误The value of ESP was not properly saved across a function call.This is usually a result of calling a function declaredwith one calling convention with a function pointer d..._excel 20190304设置时间格式

动态规划法求解0-1背包问题(python实现)_python实现01背包动态规划-程序员宅基地

实验内容给定几组数据,利用动态规划算法的思想,把 0-1 背包装满并使得其价值最 大。实验原理动态规划通过拆分问题,将问题拆分成许多的子问题,定义问题状态和状态之间的关系(即状态转移方程或递推公式),使得问题能够以递推(或者说分治) 的方式去解决。按顺序求解子问题,前一子问题的解,为后一子问题的求解提供了有用的信息,在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,那么最后一个子问题就是初始问题的解。实验步骤① 把问题分解成若干个子_python实现01背包动态规划

JavaScript进阶:数组迭代常用方法_js arr 阶梯运算‘’-程序员宅基地

前言为了加深个人对JavaScript数组迭代的理解,写下这一博客以作总结。定义every():对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则结果返回true(这里有点像逻辑运算符‘与’即‘&&’)。some():对数组中的每一项运行给定函数,如果该函数任意一项返回true,则结果返回true(这里有点像逻辑运算符‘或’即‘||’)。filter():对数组_js arr 阶梯运算‘’

一文搞懂虚拟内存-程序员宅基地

虚拟内存的那点事儿我们都知道一个进程是与其他进程共享CPU和内存资源的。正因如此,操作系统需要有一套完善的内存管理机制才能防止进程之间内存泄漏的问题。为了更加有效地管理内存并减少出错,现代操作系统提供了一种对主存的抽象概念,即是虚拟内存(Virtual Memory)。虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉(每个进程拥有一片连续完整的内存空间)。理解不深刻的人会认为虚拟内存只是“使用硬盘空间来扩展内存“的技术,这是不对的。虚拟内存的重要意义是它

推荐文章

热门文章

相关标签