translate.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 | #!/usr/bin/python # -*- coding: UTF-8 -*- import xlrd import xlwt from xlutils.copy import copy import os import re from datetime import datetime #from __future__ import division import sys,time import glob ''' 每次修改翻译之前,需要把对应UI下的翻译记录表替换进来 脚本使用: 4. 修改 翻译记录表.xls 中的ID,要和需要翻译的表格的ID一样,翻译记录表记录了翻译过的字符串 (0为未翻译或翻译未确定,1为翻译已确认。每个对应的UI下有对应的翻译记录表)。 5. "日志"文本中记录了每次修改后的字符串ID。 6. 准备工作做完后执行脚本:python str.py等待完成。 8. 然后找到IDS_String_XX手动翻译这个字串下面的所有未翻译的字串。完成后复制到Languages中导入。 脚本功能: 通过英文对比,进行翻译的引入,每次引入之前会判断翻译记录表,该语言是否全部被确认 如果标准翻译和需要翻译的英文相同而且标准翻译已经做了翻译,就使用该翻译 并且将每次翻译过的字符串对应语言进行记录。 注意: 1. 所有表格格式使用 XXX.xls(XXX.xlsx格式会出问题)。 2. 复制字串:数字、时间、比例可能会有问题,需要检查。 ''' g_SimpleLag = 0 g_MultiLag = 0 def Translation(language): binPath1 = glob.glob(r "./待翻译表/*.xls" ) binPath2 = glob.glob(r "./翻译对照表/*.xls" ) if len (binPath1) = = 0 : print "\nerror:请将待翻译的表放进待翻译表的目录下!\n" sys.exit() if len (binPath2) = = 0 : print "\nerror:请将翻译对照表放进翻译对照表的目录下!\n" sys.exit() data_e = xlrd.open_workbook(binPath1[ 0 ],formatting_info = True ) #打开待翻译表的第一个sheet data_1 = xlrd.open_workbook(binPath2[ 0 ]) #打开翻译对照表的第一个sheet data_jl = xlrd.open_workbook( "./翻译记录表.xls" ) #记录表 table_e = data_e.sheet_by_index( 0 ) table_1 = data_1.sheet_by_index( 0 ) table_jl = data_jl.sheet_by_index( 0 ) nrows = table_e.nrows #表 待翻译表.xls 行数 ncols = table_e.ncols #表 待翻译表.xls 列数 nnrows = table_1.nrows #表 翻译对照表.xls 行数 nncols = table_1.ncols #表 翻译对照表.xls 列数 nrows_jl = table_jl.nrows #表 翻译记录表.xls 行数 ncols_jl = table_jl.ncols #表 翻译记录表.xls 列数 print '待翻译的表有%d 行,%d 列' % (nrows,ncols) print '翻译对照表有%d 行,%d 列' % (nnrows,nncols) print '记录表有%d 行,%d 列' % (nrows_jl,ncols_jl) #查找要翻译的语言和English在对照表和待翻译表中的列的位置 A1 = 0 A2 = 0 B1 = 0 B2 = 0 for i1 in range ( 0 ,ncols): if table_e.cell( 0 ,i1).value = = language: A1 = i1 if table_e.cell( 0 ,i1).value = = "English" : B1 = i1 for i2 in range ( 0 ,nncols): if table_1.cell( 0 ,i2).value = = language: A2 = i2 if table_1.cell( 0 ,i2).value = = "English" : B2 = i2 #以下判断是为了保证需要翻译的语言和English在两个excel表中存在 if table_e.cell( 0 ,A1).value ! = language: print "\n待翻译的表中没有%s语言,请检查待翻译表!\n" % language sys.exit() if table_e.cell( 0 ,B1).value ! = "English" : print "\n待翻译的表中没有English语言,无法对照翻译,请检查待翻译表!\n" sys.exit() if table_1.cell( 0 ,A2).value ! = language: print "\n翻译对照表中没有%s语言,请检查翻译对照表!\n" % language sys.exit() if table_1.cell( 0 ,B2).value ! = "English" : print "\n翻译对照表中没有English语言,无法对照翻译,请检查翻译对照表!\n" sys.exit() print "\n%s即将被翻译......\n" % language print "\n%s在待翻译表中的第%d列,English在第%d列" % (language,A1 + 1 ,B1 + 1 ) print "%s在对照表中的第%d列,English在第%d列\n" % (language,A2 + 1 ,B2 + 1 ) wb = copy(data_e) ws = wb.get_sheet( 0 ) #翻译库 wb_jl = copy(data_jl) ws_jl = wb_jl.get_sheet( 0 ) #记录表 f = open ( '日志.txt' , 'a' ) #str_L = table.cell(0,1).value datetime.now().strftime( '%Y-%m-%d %H:%M:%S' ) datetime.now().isoformat() print >>f, str ( "\r\n" ) print >>f, str (table_e.cell( 0 ,A1).value) print >>f, str ( "\r\n" ) print >>f, str ( "已经翻译的字符串" ) + ( "(" ) + str (datetime.now()) + ( ") : " ) + ( "\r\n" ) ps = 0 ps1 = 0 ps2 = 0 number = 0 num1_t = 0 #add_sum = 0 flg = 0 count = 0 count1 = 0 n = 10 m = 2 #每次开始查找翻译前先检查一遍翻译是否有空白 for j in range ( 1 ,nnrows, 1 ): for i in range ( 1 ,nrows, 1 ): string_E = table_e.cell(i,A1).value string_E_t = table_e.cell(i,B1).value if string_E_t = = '': ws.write(i,A1,string_E) stylei = xlwt.XFStyle() #初始化样式 patterni = xlwt.Pattern() #为样式创建图案 patterni.pattern = 2 #设置底纹的图案索引,1为实心,2为50%灰色,对应为excel文件单元格格式中填充中的图案样式 patterni.pattern_fore_colour = 17 #设置底纹的前景色,对应为excel文件单元格格式中填充中的背景色 patterni.pattern_back_colour = 17 #设置底纹的背景色,对应为excel文件单元格格式中填充中的图案颜色 stylei.pattern = patterni #为样式设置图案 ws.write(i,A1,string_E,stylei) #使用样式 #每次开始查找翻译前先确认该语言是否全部确认 for num_t in range ( 1 ,ncols_jl, 1 ): if table_e.cell( 0 ,A1).value = = table_jl.cell( 0 ,num_t).value: #对应记录表找到相对应的字符串 for num1_t in range ( 1 ,nrows_jl, 1 ): if int (table_jl.cell(num1_t,num_t).value) = = 0 : flg = 9 break if flg = = 9 : print '开始翻译:' elif flg = = 0 : print '该语言翻译已经全部确认' exit( 0 ) print '---1---2---3---4---5---6---7---8---9---完成(%)' for j in range ( 1 ,nnrows, 1 ): for i in range ( 1 ,nrows, 1 ): string_E = table_e.cell(i,B1).value string_ID = table_e.cell(i, 0 ).value string_E_t = table_e.cell(i,A1).value string_1 = table_1.cell(j,B2).value string_1_t = table_1.cell(j,A2).value #翻译过程显示进度 count1 = count1 + 1 if count1 = = (nnrows * nrows) / 43 : sys.stdout.write( '█' + '->' + "\b\b" ) sys.stdout.flush() count1 = 0 if 1 : #string_E.strip() !="" and string_1.strip() !="": if string_E = = string_1: #英文相同 #if string_E_t == string_E: #需要翻译的没翻译 if string_1 ! = string_1_t: #翻译库已翻译 #str_E = table_e.cell(i,1).value str_1 = table_1.cell(j,A2).value #拿到的标准翻译 print >>f, str (table_e.cell(i, 0 ).value) + str ( " " ) number = number + 1 if number = = 5 : print >>f, str ( '\r\n' ) number = 0 ps = ps + 1 ws.write(i,A1,str_1) #翻译替换 #设置表格颜色 stylei = xlwt.XFStyle() #初始化样式 patterni = xlwt.Pattern() #为样式创建图案 patterni.pattern = 2 #设置底纹的图案索引,1为实心,2为50%灰色,对应为excel文件单元格格式中填充中的图案样式 patterni.pattern_fore_colour = 15 #设置底纹的前景色,对应为excel文件单元格格式中填充中的背景色 patterni.pattern_back_colour = 15 #设置底纹的背景色,对应为excel文件单元格格式中填充中的图案颜色 stylei.pattern = patterni #为样式设置图案 ws.write(i,A1,str_1,stylei) #使用样式 #ws.write(i,3,"success") #记录翻译成功的字符串 #if string_E_t != string_E: #ws.write(i,3,"Modify the success") for num in range ( 1 ,ncols_jl, 1 ): str1 = table_e.cell( 0 ,A1).value str2 = table_jl.cell( 0 ,num).value if str1 = = str2: #对应记录表找到相对应的字符串 for num1 in range (nrows_jl): if table_jl.cell(num1, 0 ).value = = string_ID: #将翻译的字符串用 "1" 标注, "0"表示未翻译 ws_jl.write(num1,num, '1' ) wb.save(binPath1[ 0 ]) elif string_1 = = string_1_t: #ws.write(i,3,"Untranslated") ps2 = ps2 + 1 print >>f, str ( '\r\n' ) print >>f, str ( '\r\n' ) print >>f, str ( '\r\n' ) print >>f, str ( '\r\n' ) wb_jl.save( '翻译记录表.xls' ) wb.save(binPath1[ 0 ]) print '\n' print '======================================================================' print str (table_e.cell( 0 ,A1).value) + '总计翻译字符串个数:%d ' % ps print ' ' + '翻译库未翻译字符串个数:%d ' % ps2 def fun_parse_InputParam(): global g_SimpleLag global g_MultiLag global LanguageSet if len (sys.argv) = = 2 : LanguageSet = [ "Tchinese" , "Schinese" , "Arabic" , "Spanish" , "French" , "German" , "Italian" , "Portuguese" , "Polish" , "Russian" , "Danish" , "Finnish" , "Swedish" , "Turkish" , "Greek" , "Norwegian" , "Hungarian" , "Slovakian" , "Croatian" , "Serbian" , "Czech" , "Dutch" , "Persian" , "English" , "Bulgarian" , "Macedonian" , "Romanian" , "Lithuanian" , "Catalan" , "Ukrainian" , "Thai" , "Vietnamese" , "HINDI" , "MARATHI" , "TAMIL" , "TELGU" , "PUNJABI" , "GUJRATI" , "Hebrew" , "Korean" , "Malayan" , "Indonesian" , "Bangla" ] if sys.argv[ 1 ] = = "all" : g_MultiLag = 1 elif sys.argv[ 1 ] in LanguageSet: g_SimpleLag = 1 else : print ( "parameter: Please check the parameter!" ) sys.exit() else : print "The number of parameters is wrong!" sys.exit() if __name__ = = "__main__" : #处理脚本带入的参数 fun_parse_InputParam() if g_SimpleLag = = 1 : Translation(sys.argv[ 1 ]) elif g_MultiLag = = 1 : for Lag in LanguageSet: Translation(Lag) print "\n%s语言已经翻译完毕\n" else : print "参数处理错误!" sys.exit() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)