# -*- coding:utf-8 -*- import os from optparse import OptionParser from xml.dom import minidom import xlrd import sys import re APP_MOUDULE = 'app' FIND_DIDS = [APP_MOUDULE, 'frame', 'module'] def option_parser(): parser = OptionParser() parser.add_option("-l", "--langCode", help="语言码", metavar="langCode") parser.add_option("-i", "--inputDir", help="翻译文件路径", metavar="inputDir") (options, _) = parser.parse_args() return options def read_xml_2_dom(path): f = open(path, 'r') try: dom = minidom.parse(f) f.close() return dom except: print('xml_2_dom error, path:{}'.format(path)) f.close() return def read_strings_2_dict(strings_path): string_dict = {} if not os.path.exists(strings_path): return string_dict dom = read_xml_2_dom(strings_path) if dom == None: return root = dom.documentElement strings = root.getElementsByTagName('string') for string in strings: translatable = string.getAttribute('translatable') if translatable == 'false': continue key = string.getAttribute('name') # print("read_strings_2_dict, key:{0}".format(key)) value = string.firstChild.data string_dict[key] = value return string_dict def module_update_translate(module_name, module_dir, lang_code, input_dir): print("module_update_translate, module_name:{0}, module_dir:{1}".format( module_name, module_dir)) # 从xls中读取更新字符串 update_strings_xls_file_path = os.path.join( input_dir, '{}.xls'.format(module_name)) table = xlrd.open_workbook( update_strings_xls_file_path).sheet_by_name(module_name) firstRow = table.row_values(0) target_lang_col = 0 for index in range(len(firstRow)): if index <= 0: continue if firstRow[index] == lang_code: target_lang_col = index keys = table.col_values(0) del keys[0] values = table.col_values(target_lang_col) del values[0] update_strings_dic = {} for x in range(len(keys)): key = keys[x].strip() value = re.sub(r'(%\d\$)(@)', r'\1s', values[x]) update_strings_dic[key] = value module_strings = os.path.join( module_dir, 'src/main/res/values-{}/strings.xml'.format(lang_code)) if not os.path.exists(module_strings): module_strings_dir = os.path.join( module_dir, 'src/main/res/values-{}/'.format(lang_code)) if not os.path.exists(module_strings_dir): os.makedirs(module_strings_dir) fo = open(module_strings, "w") strings = "\n\n" for k, v in update_strings_dic.items(): strings = strings + " " + v + "\n" strings = strings + "" fo.write(strings) fo.close() else: module_strings_dict = read_strings_2_dict(module_strings) module_strings_fr = open(module_strings, "r") # 更新已有字符串 module_strings_text = module_strings_fr.read() module_strings_fr.close() insert_strings_dict = {} for k, v in update_strings_dic.items(): if k in module_strings_dict: module_strings_text.replace(module_strings_dict[k], v) else: insert_strings_dict[k] = v module_strings_fw = open(module_strings, "w") module_strings_fw.write(module_strings_text) module_strings_fw.close() # 插入新字符串 module_strings_fr = open(module_strings, "r") module_strings_lines = module_strings_fr.readlines() module_strings_fr.close() start_line_num = -1 for line_num in range(len(module_strings_lines)): if module_strings_lines[line_num].find('') > -1: start_line_num = line_num break for k, v in insert_strings_dict.items(): module_strings_lines.insert( start_line_num, " " + v + "\n") start_line_num = start_line_num + 1 module_strings_fw = open(module_strings, "w") module_strings_fw.write(''.join(module_strings_lines)) module_strings_fw.close() def update_translate(options): lang_code = options.langCode input_dir = options.inputDir cwd = os.getcwd() print("update_translate, cwd:{0}, lang_code:{1}, input_dir:${2}".format( cwd, lang_code, input_dir)) module_include_dir_dict = {} for dir in FIND_DIDS: if dir != APP_MOUDULE: full_dir = os.path.join(cwd, dir) for module in os.listdir(full_dir): module_include_dir_dict[module] = dir for file_name in os.listdir(input_dir): if not file_name.endswith(".xls"): continue module = file_name.split('.')[0] if module == "": continue if module == APP_MOUDULE: module_update_translate(APP_MOUDULE, os.path.join( cwd, APP_MOUDULE), lang_code, input_dir) else: dir = module_include_dir_dict[module] module_include_dir = os.path.join(cwd, dir) module_update_translate(module, os.path.join( module_include_dir, module), lang_code, input_dir) options = option_parser() update_translate(options)