美文网首页
iOS多语言处理

iOS多语言处理

作者: livesxu | 来源:发表于2020-05-17 10:18 被阅读0次

    当项目中语言种类很多时,策略不对,多语言的的配置就会成为一个麻烦活。

    手动处理风险太大,而且有不少语言都是倒序的,甚至在excel、android、iOS里面你看到的结果都是不一样的,这时候其实就是你看到的不是真的。就是你肉眼去辨认都辨认不出来的。

    本文提供python脚本思路和处理示例:

    1.利用python的csv模块读取和整理子串;

    a.在收到子串excel后将其另存为csv格式,子串在csv中有指定格式(第一行是语种(android,因为android的语种较多一点,所以目录中使用的android语种名在iOS中做映射不同语种名和操作路径),第一列是key)

    b.录入路径过程中对路径的空格做去除:filepath.rstrip()

    2.

    a.将key与值拼接成iOS多语言key-value格式

    b.将同属于同一个语种的多个子串组合

    "hello_key" = "hello";

    "friend_key" = "friend";

    3.根据语种找到对应的语种文件path,对语言文件进行写入操作

    4.涉及单复数请看下面介绍,需要改步骤2.a中的拼接格式

    多语言单复数字段说明

    多语言单复数使用

    5.代码示例:

    import csv

    import os

    import re

    # 获得csv文件路径

    file_path = raw_input("Place input csv file path:")

    file_path = file_path.rstrip()

    print(file_path)

    # 判断是否为csv文件

    if not file_path.endswith('.csv'):

    print('not csv file,check --> ' + file_path)

    raise Exception("not csv file!")

    # 定义处理结果文件用以核对

    file_list = file_path.split('/')

    file_list.pop()

    file_list.append('outputHandle.csv')

    file_path2 ='/'.join(file_list)

    print(file_path2)

    # 指定到多语言的总目录下

    project_locs_path = raw_input("Place input language bundle file path:")

    project_locs_path = project_locs_path.rstrip()

    if not project_locs_path.endswith('/'):

    project_locs_path +='/'

    print(project_locs_path)

    # 代码中添加注释

    mark_str = raw_input("Place input mark for action:")

    print(mark_str)

    if os.path.exists(file_path):

    print("123 - go")

    with open(file_path, "rb")as fr:

    csv_reader = csv.reader(fr)

    data = []# 获得csv中的数据

            for rowin csv_reader:

    data.append(row)

    savedatas = []# 将key与值拼接成iOS多语言key-value格式

            for index, itemin enumerate(data):

    if index ==0 or len(item[0]) >0:

    for indexj, jin enumerate(item):

    if index !=0 and indexj !=0:

    item[indexj] ='"' + item[0] +'" = "' + item[indexj] +'";'

                    savedatas.append(item)

    comdatas = []# 将同属于同一个语种的多个子串组合

            first_item = savedatas[0]

    next_item = []

    for t, strin enumerate(first_item):

    column_t = []

    for index, itemin enumerate(savedatas):

    if index !=0:

    column_t.append(item[t])

    column_str ='\n'.join(column_t)# 使用换行符将多个子串组合,同时对子串中不合理的字符替换

                column_str = re.sub(r'<subnode.*?>', '', column_str)

    column_str = column_str.replace(r'</subnode>', '')

    column_str = column_str.replace(r'$s', '$@')

    column_str = column_str.replace(r'%s', '%@')

    next_item.append(column_str)

    comdatas.append(first_item)

    comdatas.append(next_item)

    print(savedatas)

    with open(file_path2, "wb")as f:

    writer = csv.writer(f)

    writer.writerows(comdatas)

    print("csv -- " + file_path2)

    print('prepare in project...')

    # 每个语种对应的在iOS中的名称,因为跟android用的同一套,android语种较多,所以根据他们进行的处理

            loc_map = {'values':'en',

                      'values-zh-rCN':'zh-Hans',

                      'values-az-rAZ':'az',

                      'values-b+sr+Latn':'sr',

                      'values-bo-rCN':'bo',

                      'values-en-rGB':'en-GB',

                      'values-es-rUS':'es-419',

                      'values-eu-rES':'eu',

                      'values-gl-rES':'gl',

                      'values-iw':'he',

                      'values-in':'id',

                      'values-ka-rGE':'ka',

                      'values-km-rKH':'km',

                      'values-my-rMM':'my-MM',

                      'values-my-rZG':'my-ZG',

                      'values-pt-rPT':'pt-PT',

                      'values-si-rLK':'si',

                      'values-uz-rUZ':'uz',

                      'values-zh-rHK':'zh-Hant-HK',

                      'values-zh-rTW':'zh-Hant-TW',

                      }

    total_num = []

    for t, strin enumerate(first_item):

    new_str =''

                if loc_map.has_key(str):

    new_str = loc_map.get(str)

    else:

    new_str = str.replace('values-', '')

    loc_path = project_locs_path + new_str +'.lproj/Localizable.strings'  # 得到每个语种对应的操作文件的路径

                if os.path.exists(loc_path):

    print('prepare handle path --> ' + loc_path)

    total_num.append(new_str)

    ap_str = comdatas[1][t]

    with open(loc_path, "ab")as f:

    f.writelines('\n//' + mark_str +'\n')# 写入注释

                        f.writelines(ap_str)# 写入子串

                        f.close()

    print(new_str +'handle end. please check.')

    print(len(total_num))

    else:

    print('csv file not exist,check --> ' + file_path)

    相关文章

      网友评论

          本文标题:iOS多语言处理

          本文链接:https://www.haomeiwen.com/subject/dtmowhtx.html