File tree Expand file tree Collapse file tree 10 files changed +619
-27
lines changed
Expand file tree Collapse file tree 10 files changed +619
-27
lines changed Original file line number Diff line number Diff line change 1+ # Scripts
2+
3+ Useful scripts for the translation.
4+
5+ ## From Google Translation
6+
7+ Translate all untranslated entries of the given .po file with Google Translate.
8+
9+
10+ ``` sh
11+ .scripts/google_translate.sh library/csv.po
12+ ```
13+
14+ ## From zh_CN Translation
15+
16+ If a specific doc has been translated into Simplified Chinese (zh_CN) and you'd like to adopt it as a base, you can insert the command:
17+
18+ ``` sh
19+ .scripts/from_cn.sh library/csv.po
20+ ```
Original file line number Diff line number Diff line change 1+ #! /bin/sh
2+ cd .scripts
3+ source utils/install_poetry.sh
4+
5+ # check if OpenCC is installed
6+ if [[ ! -x " ` which opencc 2> /dev/null` " ]]
7+ then
8+ echo " You do not have OpenCC installed. Please install it first."
9+ echo " Instruction: https://github.com/BYVoid/OpenCC/wiki/Download"
10+ exit 1
11+ fi
12+
13+ # clone pydoc zh_CN repo and pull from remote
14+ CN_REPO=.python-docs-zh-cn
15+ if [[ ! -d $CN_REPO ]]
16+ then
17+ read -p " You do not have a clone of zh_CN repo. Clone now? (y/N)" choice
18+ case " $choice " in
19+ y|Y ) git clone --depth 1 --no-single-branch https://github.com/python/python-docs-zh-cn $CN_REPO ;;
20+ n|N|* ) echo " Aborted" ; exit 1 ;;
21+ esac
22+ fi
23+ git -C $CN_REPO checkout 3.10 # the current latest version of CN repo
24+ git -C $CN_REPO pull
25+
26+
27+ # convert zh_CN po content and merge into zh_TW po
28+ TARGET=$1
29+ CN_PATH=$CN_REPO /$TARGET
30+ TW_PATH=../$TARGET
31+
32+ poetry lock
33+ poetry install
34+ poetry run bash -c "
35+ opencc -i $CN_PATH -c s2twp.json -o /tmp/tmp.po
36+ pofilter --nonotes --excludefilter unchanged --excludefilter untranslated /tmp/tmp.po | msgattrib --set-fuzzy -o /tmp/tmp.po
37+ pomerge -t $CN_PATH -i /tmp/tmp.po -o /tmp/tmp.po
38+
39+ pofilter --nonotes --excludefilter untranslated $TW_PATH /tmp/tmp2.po
40+ pomerge -t /tmp/tmp.po -i /tmp/tmp2.po -o /tmp/tmp3.po
41+ msgcat --lang zh_TW /tmp/tmp3.po -o $TW_PATH
42+ "
43+
44+ rm /tmp/tmp.po /tmp/tmp2.po /tmp/tmp3.po
Original file line number Diff line number Diff line change 1+ #! /bin/sh
2+
3+ WORK_DIR=.scripts
4+ cd $WORK_DIR
5+
6+ source utils/install_poetry.sh
7+
8+ TEMP=tmp.po
9+ TARGET=../$1
10+
11+ poetry lock
12+ poetry install
13+ poetry run bash -c "
14+ python google_translate/main.py $TARGET > $TEMP
15+ pomerge -t $TARGET -i $TEMP -o $TARGET
16+ "
17+ rm $TEMP
Original file line number Diff line number Diff line change 1+ import argparse
2+ import logging
3+ from pathlib import Path
4+ from typing import List
5+
6+ import polib
7+ from googletrans import Translator
8+
9+ from utils import refine_translations
10+
11+
12+ def _get_po_paths (path : Path ) -> List [Path ]:
13+ """Find all .po files in given path"""
14+ if not path .exists ():
15+ logging .error (f"The path '{ path .absolute ()} ' does not exist!" )
16+
17+ # return 1-element list if it's a file
18+ if path .is_file ():
19+ return [path .resolve ()]
20+
21+ # find all .po files
22+ po_paths = [p .resolve () for p in path .glob ("**/*.po" )]
23+ return po_paths
24+
25+
26+ if __name__ == '__main__' :
27+ parser = argparse .ArgumentParser ()
28+ parser .add_argument (
29+ "path" ,
30+ help = "the path of a PO file or a directory containing PO files"
31+ )
32+ args = parser .parse_args ()
33+
34+ translator = Translator ()
35+ po_files = _get_po_paths (Path (args .path ).resolve ())
36+ errors = []
37+ for path in po_files :
38+ try :
39+ pofile = polib .pofile (path )
40+ except OSError :
41+ errors .append (f"{ path } doesn't seem to be a .po file" )
42+ continue
43+
44+ for entry in pofile .untranslated_entries ()[::- 1 ]:
45+ translation = translator .translate (entry .msgid , src = 'en' , dest = 'zh-TW' )
46+
47+ print (
48+ '#, fuzzy\n '
49+ f'msgid "{ repr (entry .msgid )[1 :- 1 ]} "\n '
50+ f'msgstr "{ repr (refine_translations (translation .text ))[1 :- 1 ]} "\n '
51+ )
Original file line number Diff line number Diff line change 1+ MAPPING_ZH_TW_COMMON_TRANSLATION_ERROR = {
2+ '創建' : '建立' , # create
3+ '代碼' : '程式碼' , # code
4+ '信息' : '資訊' , # information
5+ '模塊' : '模組' , # module
6+ '標誌' : '旗標' , # flag
7+ '異常' : '例外' , # exception
8+ '解釋器' : '直譯器' , # interpreter
9+ '頭文件' : '標頭檔' , # header
10+ '對象' : '物件' , # objetc
11+ '支持' : '支援' , # support
12+ '默認' : '預設' , # default
13+ '兼容' : '相容' , # compatible
14+ '字符串' : '字串' , # string
15+ '宏' : '巨集' , # macro
16+ '描述符' : '描述器' , # descriptor
17+ '字節' : '位元組' , # bytes
18+ '緩存' : '快取' , # cache
19+ '調用' : '呼叫' , # call
20+ '哈希' : '雜湊' , # hash
21+ '類型' : '型別' , # type
22+ '子類' : '子類別' , # subclass
23+ '實現' : '實作' , # implement
24+ '數據' : '資料' , # data
25+ '返回' : '回傳' , # return
26+ '指針' : '指標' , # pointer
27+ '字段' : '欄位' , # field
28+ '擴展' : '擴充' , # extension
29+ '遞歸' : '遞迴' , # recursive
30+ '用戶' : '使用者' , # user
31+ '算法' : '演算法' , # algorithm
32+ '優化' : '最佳化' , # optimize
33+ '字符' : '字元' , # character
34+ '設置' : '設定' , # setting/configure
35+ '線程' : '執行緒' , # thread
36+ '進程' : '行程' , # process
37+ '迭代' : '疊代' , # iterate
38+ '內存' : '記憶體' , # memory
39+ '打印' : '印出' , # print
40+ '異步' : '非同步' , # async
41+ '調試' : '除錯' , # debug
42+ '堆棧' : '堆疊' , # stack
43+ '回調' : '回呼' , # callback
44+ '公共' : '公開' , # public
45+ '函數' : '函式' , # function
46+ '變量' : '變數' , # variable
47+ '常量' : '常數' , # constant
48+ '添加' : '新增' , # add
49+ '基類' : '基底類別' , # base class
50+ }
51+
52+
53+ def refine_translations (s : str ) -> str :
54+ for original , target in MAPPING_ZH_TW_COMMON_TRANSLATION_ERROR .items ():
55+ s = s .replace (original , target )
56+ return s
You can’t perform that action at this time.
0 commit comments