iOS多语言处理
当项目中语言种类很多时,策略不对,多语言的的配置就会成为一个麻烦活。
手动处理风险太大,而且有不少语言都是倒序的,甚至在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)