Android多语言翻译的辅助脚本

439 阅读5分钟

0. 问题描述

项目中涉及到多种语言的翻译,string.xml源文件需要交给专业人士进行翻译和核对。如果直接将string.xml给到翻译人员显然他们也不好处理,为了方便翻译人员核对,于是将string.xml文件转成xls,当翻译人员核对完成后在转成项目需要的string.xml和json文件(json格式是为了在flutter中使用)。

1. 环境安装

##### 1. 安装 xlwt
pip3 install xlwt
##### 2. 安装 xlrd
pip3 install xlrd
##### 3. 安装 requests
pip3 install requests

2. 代码实现


# -*- coding: UTF-8 -*-
# !/usr/bin/python3
import os
import time
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element
from xml.etree.ElementTree import SubElement
from xml.etree.ElementTree import ElementTree
import xlwt
import xlrd
import json
import random
import requests
import os


# 创建excel
def create_excel():
    workbook = xlwt.Workbook(encoding='utf-8')  # 新建工作簿
    sheet1 = workbook.add_sheet("测试表格")  # 新建sheet
    return workbook, sheet1


def read_string_xml(source_file_name, sheet):
    print("start read " + source_file_name + ".xml")
    root = ET.parse(source_file_name + ".xml")

    # sheet
    sheet.write(0, 0, "key")  # 第1行第1列数据
    sheet.write(0, 1, "中文")  # 第1行第2列数据
    sheet.write(0, 2, "英文")  # 第1行第3列数据
    sheet.write(0, 3, "高棉语")  # 第1行第4列数据
    i = 1
    total = 0
    for elem in root.iter("string"):
        sheet.write(i, 0, elem.get("name"))  # 第1行第1列数据
        sheet.write(i, 1, elem.text)  # 第1行第2列数据
        i += 1
        total += len(elem.text)
    # for item in root.iterfind("string"):
    #     print(item)
    print("数据总条数:" + total.__str__())
    pass


def read_string_json(source_file_name):
    print("start read " + source_file_name + ".xml file")
    root = ET.parse(source_file_name + ".xml")
    totalStr = {}
    total = 0
    for elem in root.iter("string"):
        totalStr[elem.get("name")] = elem.text
    # for item in root.iterfind("string"):
    #     print(item)
    res = json.dumps(totalStr, ensure_ascii=False)
    print(res)

    print("数据总条数:" + total.__str__())
    return res
    pass


# 读取翻译后的目标文件转换成项目中使用的xml文件
def read_res_2_target_xml_file():
    file_name = input("请输入xls完整的路径及文件名字:\n")

    # 打开xls文件
    workbook = xlrd.open_workbook(file_name)

    sheet = workbook.sheet_names()
    work_sheet = workbook.sheet_by_name(sheet[0])
    targetLineIndex = input("请输入要转化为xml的列:")
    root = generate_root_element()
    for i in range(0, work_sheet.nrows):
        row = work_sheet.row(i)
        # print(workSheet.cell_value(i, j), "\t", end="\n")
        generate_sub_element(root, row[0].value, row[int(targetLineIndex)].value)

    print("pase excel complete")
    tree = ElementTree(root)
    res_file_name = input("请输入处理完后的文件名字:\n")
    tree.write(res_file_name + ".xml", encoding='utf-8')
    pass


def test_generate_xml():
    root = generate_root_element()
    tree = ElementTree(root)
    tree.write('result.xml', encoding='utf-8')
    pass


# 生成翻译后的根节点
def generate_root_element():
    root = Element("resources")
    return root


# 生成子节点
def generate_sub_element(root, nameId, value):
    sub = SubElement(root, "string")
    sub.set("name", nameId)
    sub.text = value
    return sub


def read_xml_to_map(file_name_list):
    res = {}
    if len(file_name_list):
        print("请输入正确格式的数据")
        index = 0
        for file_name in file_name_list:
            if os.path.isfile(file_name):
                print("文件存在,名为:" + file_name)
                root = ET.parse(file_name)
                for elem in root.iter("string"):
                    key = elem.get("name")
                    if key in res:
                        res[key].insert(index, elem.text)
                    else:
                        res[key] = ["", "", "", ""]  # 默认值是为了防止数组越界;有些语言没有相应的值,导致取数组是越界问题
                        res[key].insert(index, elem.text)
            else:
                print("文件不存在")

            index += 1
    return res
    pass


# end 读取原始文件xml转换成指定名字的xls文件
def xml_2_xls():
    # start 读取原始文件后生产指定名字的xlsx文件
    workbook, sheet = create_excel()
    file_name = input("请输入需要翻译的文件名字:\n")
    read_string_xml(file_name, sheet)
    print("parse xml complete")
    workbook.save(r'./' + file_name)  # 保存
    pass


# 将多个xml文件翻译为一个json文件中
def multi_xml_2_json():
    appCode = input("请输入用户端code,mer或app\n")
    lang = input("请输入语言,en,zh,km\n")

    if "app" != appCode and "mer" != appCode:
        print("输入的应用名不对, == " + appCode)
        return
    if "zh" != lang and "km" != lang and "en" != lang:
        print("输入的语言不对")
        return

    dir = "./json/" + appCode + "/source/" + lang

    map = {}
    g = os.walk(dir)
    for path, dir_list, file_list in g:
        for file_name in file_list:
            print(os.path.join(path, file_name))
            root = ET.parse(os.path.join(path, file_name))
            for elem in root.iter("string"):
                map[elem.get("name")] = elem.text
                # for item in root.iterfind("string"):
                #     print(item)

    res = json.dumps(map, ensure_ascii=False, allow_nan=False, indent=6)
    write_2_json_file(res, "./json/" + appCode + "/jsonres/" + lang + "/app_" + lang)
    pass


def read_string_json(source_file_name):
    root = ET.parse(source_file_name + ".xml")
    totalStr = {}
    total = 0
    for elem in root.iter("string"):
        totalStr[elem.get("name")] = elem.text
    # for item in root.iterfind("string"):
    #     print(item)
    res = json.dumps(totalStr, ensure_ascii=False)
    print(res)

    print("数据总条数:" + total.__str__())
    return res
    pass


# 将json文件转成多个xml文件中
def json_2_multi_xml():
    pass


# end 读取原始文件xml转换成指定名字的xls文件
def xml_2_json():
    # start 读取原始文件后生产指定名字的xlsx文件
    file_name = input("请输入要转换的文件名字:\n")
    res = read_string_json(file_name)
    write_2_json_file(res, file_name)
    print("parse xml complete")
    pass


def write_2_json_file(res, fileName):
    targetFile = open(fileName + ".arb", "w")
    targetFile.write(res)
    targetFile.close()
    pass


def verify_translate():
    names = input("请输入要整合的文件\n")
    res_file_name = input("请输入保存文件的名字:\n")
    res = read_xml_to_map(names.split(","))
    print("len === " + len(res).__str__())
    map_2_xls(res_file_name, res)
    pass


def map_2_xls(res_file_name, res):
    workbook, sheet = create_excel()
    sheet.write(0, 0, "key")  # 第1行第1列数据
    sheet.write(0, 1, "中文")  # 第1行第2列数据
    sheet.write(0, 2, "英文")  # 第1行第3列数据
    sheet.write(0, 3, "高棉语")  # 第1行第4列数据
    i = 1
    for k in res:
        print(res[k].__str__())
        sheet.write(i, 0, k)  # 第i行第1列数据
        sheet.write(i, 1, res[k][0])  # 第i行第2列数据
        sheet.write(i, 2, res[k][1])  # 第i行第1列数据
        sheet.write(i, 3, res[k][2])  # 第i行第2列数据
        i += 1
        pass

    workbook.save(r'./' + res_file_name)  # 保存
    pass


# 合并错误行,并生成对应的xml文件
def xls_merge_err():
    file_name = input("请输入处理的文件名字:\n")
    # 打开xls文件
    workbook = xlrd.open_workbook(file_name)
    sheet = workbook.sheet_names()
    work_sheet = workbook.sheet_by_name(sheet[0])
    sourceIndex = input("请输入要原始翻译的列:\n")
    newValueIndex = input("请输入纠正后的列:\n")
    for i in range(0, work_sheet.nrows):
        row = work_sheet.row(i)
        if len(row[int(newValueIndex)].value) != 0:
            work_sheet.put_cell(i, int(sourceIndex), xlrd.XL_CELL_TEXT, row[int(newValueIndex)].value,
                                None)
    root = generate_root_element()
    for i in range(0, work_sheet.nrows):
        row = work_sheet.row(i)
        # print(workSheet.cell_value(i, j), "\t", end="\n")
        generate_sub_element(root, row[0].value, row[int(sourceIndex)].value)

    print("generate xml complete")
    tree = ElementTree(root)
    res_file_name = input("请输入文件保存的名字:\n")
    tree.write(res_file_name + ".xml", encoding='utf-8')
    print("sourceIndex =", sourceIndex, row[int(sourceIndex)].value)
    pass


# 读取翻译后的目标文件转换成项目中使用的xml文件
def xin_guan():
    file_name = input("请输入检测点文件路径:\n")

    # 打开xls文件
    workbook = xlrd.open_workbook(file_name)

    sheet = workbook.sheet_names()
    work_sheet = workbook.sheet_by_name(sheet[0])

    for i in range(1, work_sheet.nrows):
        row = work_sheet.row(i)
        print(row[0].value, row[1].value, row[2].value, row[3].value, row[4].value, row[5].value, row[6].value,
              row[7].value, row[8].value, row[9].value)
        # area,,,,,,,,updateTime
        data = {
            "area": row[0].value,
            "name": row[1].value,
            "address": row[2].value,
            "isFree": row[3].value,
            "way": row[4].value,
            "lineUpState": row[5].value,
            "remark": row[6].value,
            "result": row[7].value
        }

        uploadData(json.dumps(data))
        time.sleep(1)

    pass



def create_excel():
    data = {
        "area": "79",
        "checked": 0
    }
    create_excel_data(data)
    pass


def create_excel_data(data):
    # 测试请求地址
    req_url = "http://192.168.1.7:8088/api/v1/vegetable/createExcel"

    # 添加请求头
    req_header = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
        "Content-Type": "application/json"
    }
    # 发起请求
    response = requests.post(
        req_url,
        data=data,
        headers=req_header
    )

    print(response.text)

    pass


def uploadData(data):
    # 测试请求地址
    req_url = "https://www.rungh.cn/api/shanghai/update"

    # 添加请求头
    req_header = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
        "Content-Type": "application/json"
    }
    # 发起请求
    response = requests.post(
        req_url,
        data=data,
        headers=req_header
    )

    print(response.text)

    pass


# 核对所有的翻译文件
# 1. 将多个语言的xml文件内容装入有序map结构中
# 2. 迭代其中的一个,后翻译成目标xml

def main():
    print("----------------------------------------------------")
    print("|                 android翻译辅助工具                |")
    print("----------------------------------------------------")
    print("|code:0,xml文件转换成xls文件                         |")
    print("|---------------------------------------------------")
    print("|code:1,将翻译后的文件还原成xml文件                    |")
    print("|---------------------------------------------------")
    print("|code:2,核对翻译内容是否正确:./app/zh.xml,./app/en.xml |")
    print("|---------------------------------------------------")
    print("|code:3,生成json文件,用于flutter项目                  |")
    print("|---------------------------------------------------")
    print("|code:4,处理翻译语言中错误的内容进行替换                  |")
    print("|---------------------------------------------------")
    print("|code:5,处理新冠更新文件                               |")
    print("|---------------------------------------------------")
    print("|code:6,测试上传数据是否有误                           |")
    print("|---------------------------------------------------")
    print("|code:7,生成小区数据表信息                           |")
    print("=====================================================")

    index = input("请输入执行代码:")
    if int(index) == 0:
        xml_2_xls()
    elif int(index) == 1:
        read_res_2_target_xml_file()
    elif int(index) == 2:
        verify_translate()
    elif int(index) == 3:
        xml_2_json()
    elif int(index) == 4:
        xls_merge_err()
    elif int(index) == 5:
        xin_guan()
    elif int(index) == 6:
        Test_upload()
    elif int(index) == 7:  # 将xml翻译为json文件
        multi_xml_2_json()
    elif int(index) == 8:  # 将json翻译为xml文件
        json_2_multi_xml()
    else:
        print("请检查输入的执行代码\n")


if __name__ == '__main__':
    main()