-
Notifications
You must be signed in to change notification settings - Fork 4
/
translations.py
115 lines (89 loc) · 3.61 KB
/
translations.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
import csv
import os
import re
def translate(file, path):
csv_file = open(file, 'r')
csv_reader = csv.reader(csv_file, delimiter=',')
locales = [
{'identifier' : 'fr', 'column' : 3},
{'identifier' : 'en', 'column' : 5}
]
for aLocale in locales:
if not os.path.exists(path+aLocale['identifier']+'.lproj'):
os.makedirs(path+aLocale['identifier']+'.lproj')
file = open(path+aLocale['identifier']+'.lproj/Localizable.strings','w')
for row in csv_reader:
#Sample Code - You should override it
key = row[1]
value = row[aLocale['column']]
file.write("\""+key+"\"=\""+escape(value)+"\";\n")
file.close()
def escape(str):
return str.replace("\"","\\\"").replace("\\\\n","\\n")
def is_valid_android_key(str):
"""
In android xml file, the key must follow some requirements :
- the key should not contain uppercased letter
- The key should not beggin with a number
- The only special accepted character is _
You can edit the regexp as you required
"""
prog = re.compile("([a-z]+)(([a-z]*)(_)*([0-9])*)*")
result = prog.match(str)
return result
def escape_android(str):
"""
This function escape common symbol from iOS to Android ( %@ -> %s )
You can add your own rules
"""
tmp = str.replace("\"", "\\\"")\
.replace("\\\\n", "\\n")\
.replace("'", "\\'")\
.replace("%@", "%s")\
.replace("&", "&")
if "<" in str or ">" in str:
return "<![CDATA["+tmp+"]]>"
else:
return tmp
def translate_android(file, path):
"""
This function parse the file located at {file} and export it in files located into {path}
"""
#Provide here mapping between your CSV columns and the desired output file
#The key is never write into the output file, use it for clarity
#The file value is the name of the folder which will be generated by the program
#The column value should be an integer which represent the column of the desired local in the CSV file
#
locales = {
'en': {'file': 'values/', 'column': 2},
'fr': {'file': 'values-fr/', 'column': 3},
'ja': {'file': 'values-ja/', 'column': 5},
'zh': {'file': 'values-zh/', 'column': 4}
}
#iterate over all locales to generate the translation file
for aLocal in locales.keys():
csv_file = open(file, 'r')
csv_reader = csv.reader(csv_file, delimiter=',')
_path = path+'/'+locales[aLocal]['file']
if not os.path.exists(path):
os.makedirs(path)
if not os.path.exists(_path):
os.makedirs(_path)
file_pointer = open(_path+'strings.xml', 'w')
#Add default text to xml file
file_pointer.write('<?xml version="1.0" encoding="utf-8"?>\n')
file_pointer.write('<resources>\n')
i = 0
for row in csv_reader:
#You have to implement your own parser rules here.
key = row[1]
value = row[locales[aLocal]['column']]
value = escape_android(value)
#Check if the key is valid for android usage. See is_valid_android_key documentation for more infos
if not is_valid_android_key(key):
print("Invalid android key provided :"+key)
else:
file_pointer.write(" <string name=\"" + key + "\">" + value +
"</string>\n")
file_pointer.write('</resources>\n')
file_pointer.close()