今天更新Google Play 商店裡的App 顯示下面的訊息,叫我要把其他語言裡更新了什麼訊息都補齊,這個請「千萬」不要使用人工手動去翻,純手工去翻是生產力低、無聊又花時間的行為,建議的解法是要shell script +translate-shell。
shell script 很多,除了python 好用之外,常見的還有 unix 內建的bash shell script. 這次我選擇的是內建的,要用內建需要先學一下 bash shell 的 array 還有 loop 怎麼使用。
鳥哥loop 用法教學:
http://linux.vbird.org/linux_basic/0340bashshell-scripts.php#for
鳥哥array 用法教學:
http://linux.vbird.org/linux_basic/0340bashshell-scripts.php#array
接下來安裝 translate-shell
https://github.com/soimort/translate-shell
我是使用 Mac OS X, 需要另外再按裝 gawk, 只要使用指令:
brew install gawk
最後我的script 長醬子:
#!/bin/bash filename="play_app_output.txt" english="play_app_english.txt" echo "" > $filename cat $english >> $filename echo "" >> $filename function printit(){ lang= echo "<$lang>" >> $filename trans -b :$lang file://$english >> $filename echo "</$lang>" >> $filename } eat[1]="ar" eat[2]="be" max_nu=2 for (( i=1; i<=${max_nu}; i=i+1 )) do printit ${eat[$i]} done
要被翻的英文:
allow login facebook account by browser.
script 執行完的結果:
<en-US>
allow login facebook account by browser.
</en-US>
<ar>
.حفصتملا قيرط نع كوبسيفلا باسح لوخدلا ليجست حامسلا
</ar>
<be>
дазволіць уліковы запіс Увайсці facebook браўзэра.
</be>
後記:
bash shell script 寫起來是很快,也可以完成「大部份」的需求,但後來想用來解決 android strings 裡裡翻譯,bash shell script用起來綁手綁腳,限制太多,最後還是改寫成python…, 所以一開始就應該用python 寫,才省時間。
改用python,對字串和對檔案的處理就變的很簡單。執行外部指令可以使用:
from subprocess import call tmp_input_file = "android_trans_input.tmp" tmp_output_file = "android_trans_output.tmp" trans_para_pattern = "trans -b -s en :%s -i %s -o %s" % (lang, tmp_input_file, tmp_output_file) call(trans_para_pattern, shell=True)
我使用的副程式:
def google_trans(string_value, lang): tmp_input_file = "android_trans_input.tmp" outfile = open(tmp_input_file, 'w') outfile.write(string_value) outfile.close() from subprocess import call tmp_output_file = "android_trans_output.tmp" trans_para_pattern = "trans -b -s en :%s -i %s -o %s" % (lang, tmp_input_file, tmp_output_file) #call(["trans", trans_para_pattern]) call(trans_para_pattern, shell=True) #call(["ls", "-al"]) #call("ls android_t*", shell=True) #call(["pwd"]) infile = open(tmp_output_file,"r") total_line = "" for in_line in infile: in_line = in_line.strip() total_line += in_line infile.close() call("rm android*.tmp", shell=True) return total_line
def convert_trans(filename, lang): #filename = "Localizable.strings" filename_ext = splitext(filename)[1] #filename_output = "%s%s" % (splitext(filename)[0], filename_ext) filename_output = filename directory_name = "./values-%s/" % (lang) directory_name = directory_name.replace("zh-", "zh-r") _createFolder(directory_name ) outfile = open(directory_name + filename_output, 'w') infile = open(filename) total_line = "" process_mode = "ios" if filename_ext == ".xml": process_mode = "android" delimiter = "=" if process_mode == "android": delimiter = ">" string_pattern = '%s = "%s";\n' for in_line in infile: out_line = in_line if is_translata_target(in_line, process_mode): # for translate item. if process_mode == "android": string_android_tag_name="string" if '</item>' in in_line and '<item' in in_line: string_android_tag_name="item" string_pattern = '%s>%s</'+ string_android_tag_name +'>\n' string_key = in_line.split(delimiter)[0] string_value = find_between(in_line,">","</") string_value = encrypt_escape_word(string_value, process_mode) string_trans = google_trans(string_value, lang) string_trans = decrypt_escape_word(string_trans, process_mode, lang) out_line = string_pattern % (string_key.rstrip(),string_trans) #print out_line if not is_skip_translata_key(in_line, process_mode): outfile.write(out_line) #total_line = u'%s%s' % (total_line,out_line) total_line += out_line infile.close() outfile.close()
心得是效果滿好的,還可以調整那些規則下的文字不要去翻譯。
如果你會處理到 lang=”ar” 或 lang=”fa”,記得要安裝一下 FirBiDi:
指令:
brew install fribidi
資料來源:
http://macappstore.org/fribidi/