최신버전에 맞는 타겟플렛폼 설정.
[Tadpole.git] / tadpole.maintenance / TransifexL10N / transifex.py
blobf80037371cda6d3bb7479491082b3a254f58474e
1 # coding=utf-8
2 __author__ = 'jangbi882@gmail.com'
4 ########################################################
5 # Script for TadpoleUI trans by http://www.Transifex.com
7 import sys
8 import os
9 import re
10 import shutil
13 PROJECT_NAME = "tadpoleui"
14 SRC_DIR = "../../"
15 DST_DIR = "" #"c:/OpenGIS/TadpoleDbHub/TransifexL10N"
17 PATH_PATTERN1 = "/?.*/src/"
18 RES_PATTERN1 = "/src/(.*)/(messages).*\\.properties"
19 PATH_PATTERN2 = "/OSGI-INF/l10n"
20 RES_PATTERN2 = "/(\\w+\\.[\\w\\.]+)/.*/(bundle).*\\.properties"
22 LANG_PATTERN = "_(.*)\\.properties"
23 DEFAULT_LANG = "en"
24 LANG_LIST = ["ko", "ep", "id"] # 새로운 언어기 추가되면 이 리스트에 추가
26 # 도움말
27 def show_help(cmd):
28 print("""
29 Usage
30 =====
31 python {0} -update: push source and pull translated resources
32 python {0} -init: Initialize configuration for Transifex Client(tx)
33 python {0} -push_source: Push source resource ({1}) to transifex.com
34 python {0} -push_trans: Push translated resource to transifex.com
35 python {0} -pull_trans: Pull translated resource from transifex.com
36 python {0} -help: Show this message
37 """.format(cmd, DEFAULT_LANG))
40 # tx 설치확인
41 def checkTx():
42 rc = os.system("tx --version")
43 if rc == 1:
44 print (
45 """
46 [ERROR] Transifex Client, tx command is not installed.
47 Please setup Transifex Client first.
48 Refer to the following link.
49 http://docs.transifex.com/developer/client/setup
50 """
52 return False
53 return True
56 # tx init 확인
57 def checkTxInit():
58 pwd = os.getcwd()
59 configFolder = os.path.join(pwd, ".tx")
60 #print configFolder
61 if os.path.isdir(configFolder):
62 return True
63 print (
64 """
65 [ERROR] Cannot find any .tx directory!
66 Run 'tx init' to initialize your project first!
67 ProjectNotInit: Cannot find any .tx directory!
68 """
70 return False
73 # convert package name to resource name
74 def getResName(path):
75 path = path.replace("\\", "/")
76 if re.search(PATH_PATTERN1, path):
77 matched = re.findall(RES_PATTERN1, path)
78 if matched:
79 return matched[0][0].replace("/", "_").replace("com_hangum_tadpole_", "").replace("com_hamgum_tadpole_", "")+"__"+matched[0][1]
80 elif re.search(PATH_PATTERN2, path):
81 matched = re.findall(RES_PATTERN2, path)
82 if matched:
83 return matched[0][0].replace(".", "_").replace("com_hangum_tadpole_", "").replace("com_hamgum_tadpole_", "")+"__"+matched[0][1]
85 return None
87 def checkFolderPattern(path):
88 path = path.replace("\\", "/")
89 if re.search(PATH_PATTERN1, path) or re.search(PATH_PATTERN2, path):
90 return True
91 return False
93 # 파일명에서 언어 추출
94 def getLang(filename):
95 langs = re.findall(LANG_PATTERN, filename)
96 if langs:
97 lang = langs[0]
98 else:
99 lang = DEFAULT_LANG
100 return lang
103 ### Transifex 설정파일 초기화
104 # [주의] 원본 리소스는 Transifex.com에 미리 등록되어 있어야 한다.
105 def init_resource():
106 ## 하위 모든 폴더 탐색 시작
107 for (path, dir, files) in os.walk(SRC_DIR):
108 # 패턴과 일치 하지 않는 폴더 스킵
109 if not checkFolderPattern(path):
110 continue
112 # 폴더 내 파일들에 대해서
113 for filename in files:
114 src_path = os.path.join(path, filename)
116 # make resource name from path
117 resource_name = getResName(src_path)
118 if not resource_name:
119 continue
121 # 언어 확인
122 lang = getLang(filename)
124 # 설정파일 만들기
125 if lang == DEFAULT_LANG:
126 dst_path = os.path.join(DST_DIR, "{0}.properties".format(resource_name))
127 # 원본 파일 설정 생성
128 cmd = "tx set -t PROPERTIES --source -r {0}.{1} -l en {1}.properties".format(PROJECT_NAME, resource_name)
129 else:
130 dst_path = os.path.join(DST_DIR, "{0}_{1}.properties".format(resource_name, lang))
131 # 번역 파일 설정 생성
132 cmd = "tx set -r {2}.{0} -l {1} {0}_{1}.properties".format(resource_name, lang, PROJECT_NAME)
134 # 파일이 이미 있는지 확인
135 flag_need_temp = True
136 if os.path.isfile(dst_path):
137 flag_need_temp = False
139 # 없다면 임시파일 만들기
140 if flag_need_temp:
141 temp_file = open(dst_path, 'w')
142 temp_file.close()
144 # 등록 명령 실행
145 print cmd
146 rc = os.system(cmd)
148 # 임시파일 만들었다면 지우기
149 if flag_need_temp:
150 os.remove(dst_path)
151 ## 하위폴더 탐색 끝
154 ## 레파지토리에서 복사해 와 Transifex.com에 원본 올리기
155 def push_source():
156 ## 하위 모든 폴더 탐색 시작
157 for (path, dir, files) in os.walk(SRC_DIR):
158 # 패턴과 일치 하지 않는 폴더 스킵
159 if not checkFolderPattern(path):
160 continue
162 # 폴더 내 파일들에 대해서
163 for filename in files:
164 src_path = os.path.join(path, filename)
166 # make resource name from path
167 resource_name = getResName(src_path)
168 if not resource_name:
169 continue
171 # 언어 추출
172 lang = getLang(filename)
173 if lang != DEFAULT_LANG:
174 continue
176 dst_path = os.path.join(DST_DIR, "{0}.properties".format(resource_name))
178 # 파일 복사
179 shutil.copy2(src_path, dst_path)
181 cmd = "tx push -r {0}.{1} -s -f --no-interactive".format(PROJECT_NAME, resource_name)
182 print cmd
183 rc = os.system(cmd)
184 if rc != 0:
185 print "[WARNING] Fail to register {0}".format(dst_path)
186 ## 하위폴더 탐색 끝
189 ## Transifex.com에 로컬의 번역 올리기
190 def push_trans():
191 ## 하위 모든 폴더 탐색 시작
192 for (path, dir, files) in os.walk(SRC_DIR):
193 # 패턴과 일치 하지 않는 폴더 스킵
194 if not checkFolderPattern(path):
195 continue
197 # 폴더 내 파일들에 대해서
198 for filename in files:
199 src_path = os.path.join(path, filename)
201 # make resource name from path
202 resource_name = getResName(src_path)
203 if not resource_name:
204 continue
206 # 언어 추출
207 lang = getLang(filename)
208 if lang == DEFAULT_LANG:
209 continue
211 dst_path = os.path.join(DST_DIR, "{0}_{1}.properties".format(resource_name, lang))
213 # 파일 복사
214 shutil.copy2(src_path, dst_path)
216 cmd = "tx push -l {1} -r {2}.{0} -t -f --no-interactive".format(resource_name, lang, PROJECT_NAME)
217 print cmd
218 rc = os.system(cmd)
219 if rc != 0:
220 print "[WARNING] Fail to register {0}".format(dst_path)
221 ## 하위폴더 탐색 끝
224 ### transifex.com에서 새 번역 가져오기
225 def pull_trans():
226 ## 하위 모든 폴더 탐색 시작
227 for (path, dir, files) in os.walk(SRC_DIR):
228 # 패턴과 일치 하지 않는 폴더 스킵
229 if not checkFolderPattern(path):
230 continue
232 if files.count("messages.properties") > 0:
233 resource_name = getResName(os.path.join(path, "messages.properties"))
234 if not resource_name:
235 continue
237 for lang in LANG_LIST:
238 src_path = os.path.join(path, "messages_{0}.properties".format(lang))
239 dst_path = os.path.join(DST_DIR, "{0}_{1}.properties".format(resource_name, lang))
241 # 없는 언어 스킵
242 if not os.path.isfile(src_path):
243 continue
245 # 번역 파일 가져오기
246 cmd = "tx pull -l {1} -r {2}.{0} -f".format(resource_name, lang, PROJECT_NAME)
247 print cmd
248 rc = os.system(cmd)
249 if rc != 0:
250 print "[WARNING] Fail to pull {0}".format(dst_path)
252 # 파일 복사
253 print ("copy {0} {1}".format(os.path.abspath(dst_path), os.path.abspath(src_path)))
254 shutil.copy2(dst_path, src_path)
256 elif files.count("bundle.properties") > 0:
257 resource_name = getResName(os.path.join(path, "bundle.properties"))
258 if not resource_name:
259 continue
261 for lang in LANG_LIST:
262 src_path = os.path.join(path, "bundle_{0}.properties".format(lang))
263 dst_path = os.path.join(DST_DIR, "{0}_{1}.properties".format(resource_name, lang))
265 # 없는 언어 스킵
266 if not os.path.isfile(src_path):
267 continue
269 # 번역 파일 가져오기
270 cmd = "tx pull -l {1} -r {2}.{0} -f".format(resource_name, lang, PROJECT_NAME)
271 print cmd
272 rc = os.system(cmd)
273 if rc != 0:
274 print "[WARNING] Fail to pull {0}".format(dst_path)
276 # 파일 복사
277 print ("copy {0} {1}".format(os.path.abspath(dst_path), os.path.abspath(src_path)))
278 shutil.copy2(dst_path, src_path)
280 ## 하위폴더 탐색 끝
283 ### 옵션에 따른 기능 실행
284 def main():
285 args = sys.argv
286 cmd = os.path.split(args[0])[1]
288 if len(args) <= 1:
289 option = None
290 else:
291 option = args[1].lower()
293 ## 실행 조건 확인
294 if not checkTx():
295 return
296 if not checkTxInit():
297 return
299 DST_DIR = os.getcwd()
301 if option == None:
302 show_help(cmd)
303 elif option == "-update":
304 push_source()
305 pull_trans()
306 elif option == "-help":
307 show_help(cmd)
308 elif option == "-init":
309 init_resource()
310 elif option == "-push_source":
311 push_source()
312 elif option == "-push_trans":
313 push_trans()
314 elif option == "-pull_trans":
315 pull_trans()
316 elif option == "-init_all":
317 init_resource()
318 push_source()
319 push_trans()
320 else:
321 show_help(cmd)
324 ### 커맨드로 실행된 경우 main() 실행
325 if __name__ == "__main__":
326 main()