2019年7月4日15:53:17
(¦3[▓▓] 晚安
谷歌翻譯環境
Python 3.6
第三方庫 Execjs (pip install PyExecJS
)
檔案列表
同目錄下的四個檔案:
- tool.py
- google_translate.py
- input.txt
- __init__.py
主要有四個檔案
1、tool.py (用來生成谷歌翻譯url中的tk欄位)
2、google_translate.py (用來讀取中文txt檔案,並翻譯生成新的德語txt檔案)
3、input.txt(需要翻譯的txt中文檔案)
4、__init__.py(該檔案為空檔案,用來impot HandleJS.py)
詳細可以百度"python3 引用同目錄py檔案"
使用步驟
注:這裡是中文文字轉換為德語文字
1、同目錄下建立四個檔案,分別將下邊程式碼貼上上去
2、執行 python3 google_translate.py或 python google_translate.py生成output.txt
修改說明
本檔案是中文翻譯為德語的,如果要轉換為其他語言
請修改 google_translate.py 檔案裡的 translate()函式的以下欄位。
關於語言程式碼和國家的對應,請檢視"國家語言程式碼對照表"文章。
如:中文 zh-CN
德語 de
英語 en
old_language_code = "zh-CN" # 中文
new_language_code = "de" # 德語
# new_language_code = "en" # 英語
tool.py
注:用來生成谷歌翻譯url中的tk欄位
import execjs
class Py4Js():
def __init__(self):
self.ctx = execjs.compile("""
function TL(a) {
var k = "";
var b = 406644;
var b1 = 3293161072;
var jd = ".";
var $b = "+-a^+6";
var Zb = "+-3^+b+-f";
for (var e = [], f = 0, g = 0; g < a.length; g++) {
var m = a.charCodeAt(g);
128 > m ? e[f++] = m : (2048 > m ? e[f++] = m >> 6 | 192 : (55296 == (m & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023),
e[f++] = m >> 18 | 240,
e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224,
e[f++] = m >> 6 & 63 | 128),
e[f++] = m & 63 | 128)
}
a = b;
for (f = 0; f < e.length; f++) a += e[f],
a = RL(a, $b);
a = RL(a, Zb);
a ^= b1 || 0;
0 > a && (a = (a & 2147483647) + 2147483648);
a %= 1E6;
return a.toString() + jd + (a ^ b)
};
function RL(a, b) {
var t = "a";
var Yb = "+";
for (var c = 0; c < b.length - 2; c += 3) {
var d = b.charAt(c + 2),
d = d >= t ? d.charCodeAt(0) - 87 : Number(d),
d = b.charAt(c + 1) == Yb ? a >>> d: a << d;
a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d
}
return a
}
""")
def getTk(self, text):
return self.ctx.call("TL", text)
google_translate.py
注:用來讀取中文txt檔案,並翻譯生成新的德語txt檔案
# -*- coding: utf-8 -*-
import urllib.request
from tool import Py4Js
def open_url(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(req)
data = response.read().decode('utf-8')
return data
def translate(content, tk):
if len(content) > 4891:
print("翻譯的長度超過限制!!!")
return
content = urllib.parse.quote(content)
old_language_code = "zh-CN"
# new_language_code = "en" # 英語
new_language_code = "de" # 德語
url = "https://translate.google.cn/translate_a/single?client=webapp&" \
"sl=%s&tl=%s&hl=en&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&clearbtn=1&otf=1&" \
"pc=1&ssel=3&tsel=3&kc=2&tk=%s&q=%s" % (old_language_code, new_language_code, tk, content)
result = open_url(url)
end = result.find("\",")
if end > 4:
print(result[4:end])
return result[4:end]
def get_old_text_list():
key_str_list = list()
with open("input.txt", "r") as fo:
lines = fo.readlines()
for line in lines:
if "'" in line and ":" in line and "," in line:
line_list = line.split("'")
line_str = line_list[-2]
if line_str != "React Admin":
key_str_list.append(line_str)
print(line_str)
return key_str_list
def get_new_text_list(key_str_list):
js = Py4Js()
value_str_list = list()
key_value_dict = dict()
for key in key_str_list:
content = key
if content == 'q!':
break
tk = js.getTk(content)
value = translate(content, tk)
value_str_list.append(value)
key_value_dict[key] = value
print(key_str_list)
print(value_str_list)
print(key_value_dict)
return value_str_list, key_value_dict
def output_new_text(key_str_list, value_str_list, key_value_dict):
with open("input.txt", "r") as fo:
lines = fo.readlines()
with open("output.txt", "w") as fw:
for line in lines:
for key in key_str_list:
if key in line:
line = line.replace(key, key_value_dict[key])
fw.write(line)
def main():
key_str_list = get_old_text_list()
value_str_list,key_value_dict = get_old_text_list(key_str_list)
output_new_text(key_str_list, value_str_list, key_value_dict)
if __name__ == "__main__":
main()
inpupt.txt
注:需要翻譯的txt中文檔案
export default {
application: {
name: 'React Admin',
},
ajaxTip: {
success: '成功',
error: '失敗',
noAccess: '無權訪問此資源',
notFound: '訪問資源不存在',
serverBusy: '伺服器繁忙',
timeOut: '超時',
},
menu: {
menus: '選單&許可權',
codeGenerator: '程式碼生成',
home: '首頁',
document: '文件',
page404: '404頁面不存在',
login: '登入',
example: '示例',
userCenter: '使用者中心',
users: '使用者列表',
userEdit: '使用者編輯',
roles: '角色列表',
modifyPassword: '修改密碼',
setting: '設定',
logout: '退出登入',
ajax: 'ajax請求',
antDesign: 'Ant Design 官網',
google: '谷歌官網',
component: '元件',
tableRowDraggable: '表格行可拖拽',
asyncSelect: '非同步下拉',
formElement: '表單元素',
formItemLayout: '表單佈局',
formUtil: '表單相關工具',
inputClear: '可清空Input',
listPage: '列表頁',
modal: '彈框',
noData: '暫無資料',
operator: '操作',
pagination: '分頁元件',
permission: '許可權',
popPrompt: '彈框輸入',
queryBar: '查詢條',
queryItem: '查詢條件',
tableAnimate: '表格動畫高階元件',
tableDragColumn: '表頭拖拽高階元件',
tableDragRow: '表格行可拖拽高階元件',
tableEditable: '可編輯表格',
tableRightClick: '表格行右鍵高階元件',
toolBar: '工具條',
userAvatar: '使用者頭像',
},
login: {
title: '歡迎登入',
submit: '登入',
userName: '使用者名稱',
password: '密碼',
userNameEmptyTip: '請輸入使用者名稱!',
passwordEmptyTip: '請輸入密碼!',
},
setting: {
navigationLayout: '導航佈局',
topSideMenu: '頂部+左側導航',
topMenu: '頂部導航',
sideMenu: '左側導航',
tabsSetting: 'Tab頁導航設定',
tabsShow: '顯示Tab頁導航',
pageSetting: '頁面設定',
showHead: '顯示頭部',
fixedHead: '頭部固定',
menuSetting: '選單設定',
keepMenuOpen: '保持選單展開',
keepPage: '保持頁面狀態',
fullScreen: '全屏顯示',
exitFullScreen: '退出全屏',
selectPrimaryColor: '選擇主題顏色',
},
tabs: {
refresh: '重新整理',
refreshAll: '重新整理全部',
close: '關閉',
closeOthers: '關閉其他',
closeAll: '關閉所有',
closeLeft: '關閉左側',
closeRight: '關閉右側',
},
errorPage: {
needLogin: '您還未登入!',
pageNotFound: '您訪問的頁面不存在!',
redirectTo: '跳轉到',
orReturn: '或者返回',
previousStep: '上一步',
},
};
--
output.txt
注:最終生成檔案
{
application: {
name: 'React Admin',
},
ajaxTip: {
success: 'Erfolg',
error: 'Misserfolg',
noAccess: 'Nicht berechtigt, auf diese Ressource zuzugreifen',
notFound: 'Zugriffsressourcen sind nicht vorhanden',
serverBusy: 'Server ausgelastet',
timeOut: 'Timeout',
},
menu: {
menus: 'Menü \u0026 Berechtigungen',
codeGenerator: 'Codegenerierung',
home: 'Zuhause',
document: 'Dokument',
page404: '404 Seite existiert nicht',
login: 'Einloggen',
example: 'Beispiel',
userCenter: 'Benutzerzentrum',
users: 'Benutzerliste',
userEdit: 'Benutzerbearbeitung',
roles: 'Rollenliste',
modifyPassword: 'Passwort ändern',
setting: 'Einstellung',
logout: 'Abmelden',
ajax: 'Ajax-Anfrage',
antDesign: 'Offizielle Website von Ant Design',
google: 'Googles offizielle Website',
component: 'Komponente',
tableRowDraggable: 'Tabellenzeilen können gezogen werden',
asyncSelect: 'Asynchroner Pulldown',
formElement: 'Formularelement',
formItemLayout: 'Formularlayout',
formUtil: 'Formularbezogene Werkzeuge',
inputClear: 'Kann Eingabe löschen',
listPage: 'Listenseite',
modal: 'Einschussfeld',
noData: 'Noch keine Daten',
operator: 'Bedienung',
pagination: 'Paging-Komponente',
permission: 'Erlaubnis',
popPrompt: 'Bullet-Box-Eingabe',
queryBar: 'Abfrageleiste',
queryItem: 'Abfragebedingung',
tableAnimate: 'Übergeordnete Komponenten für die Tabellenanimation',
tableDragColumn: 'Header, der High-End-Komponenten zieht',
tableDragRow: 'Tabellenzeilen können übergeordnete Komponenten ziehen',
tableEditable: 'Bearbeitbares Formular',
tableRightClick: 'Klicken Sie mit der rechten Maustaste auf die übergeordnete Komponente in der Tabellenzeile',
toolBar: 'Symbolleiste',
userAvatar: 'Benutzeravatar',
},
login: {
title: 'Willkommen anmelden',
submit: 'Einloggen',
userName: 'Benutzername',
password: 'Passwort',
userNameEmptyTip: 'Bitte geben Sie Ihren Benutzernamen ein!',
passwordEmptyTip: 'Bitte geben Sie Ihr Passwort ein!',
},
setting: {
navigationLayout: 'Navigationslayout',
topSideMenu: 'Navigation oben + links',
topMenu: 'Top Navigation',
sideMenu: 'Linke Navigation',
tabsSetting: 'Einstellungen für die Registerkartennavigation',
tabsShow: 'Registerkartennavigation anzeigen',
pageSetting: 'Seite einrichten',
showHead: 'Anzeigekopf',
fixedHead: 'Kopffixierung',
menuSetting: 'Menüeinstellung',
keepMenuOpen: 'Lassen Sie das Menü geöffnet',
keepPage: 'Seitenstatus beibehalten',
fullScreen: 'Vollbildanzeige',
exitFullScreen: 'Beenden Sie den Vollbildmodus',
selectPrimaryColor: 'Wählen Sie die Themenfarbe',
},
tabs: {
refresh: 'Aktualisieren',
refreshAll: 'Aktualisieren Sie alle',
close: 'Schliessen',
closeOthers: 'Andere schließen',
closeAll: 'Alles schließen',
closeLeft: 'Links schließen',
closeRight: 'Nach rechts schließen',
},
errorPage: {
needLogin: 'Du bist nicht eingeloggt!',
pageNotFound: 'Die von Ihnen besuchte Seite existiert nicht!',
redirectTo: 'Springe zu',
orReturn: 'Oder zurück',
previousStep: 'Vorheriger Schritt',
},
}
參考文獻:
https://blog.csdn.net/yingshukun/article/details/53470424