-
Notifications
You must be signed in to change notification settings - Fork 0
/
translate.py
126 lines (118 loc) · 4.25 KB
/
translate.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
####################################################################################
#
# Distributed under MIT Licence
# See https://github.com/house-of-abbey/GarminThermoNest/blob/main/LICENSE.
#
####################################################################################
#
# ThermoNest is a Garmin IQ application written in Monkey C and routinely tested on
# a Venu 2 device. The source code is provided at:
# https://github.com/house-of-abbey/GarminThermoNest.
#
# J D Abbey & P A Abbey, 28 December 2022
#
#
# Description:
#
# Python script to automatically translate the strings.xml file to each supported
# language using Google Translate.
#
# Python installation:
# pip install BeautifulSoup
# pip install deep-translator
# NB. For XML formatting:
# pip install lxml
#
# References:
# * https://www.crummy.com/software/BeautifulSoup/bs4/doc/
# * https://realpython.com/beautiful-soup-web-scraper-python/
# * https://www.crummy.com/software/BeautifulSoup/bs4/doc/#parsing-xml
# * https://www.crummy.com/software/BeautifulSoup/bs4/doc/#xml
#
####################################################################################
from deep_translator import GoogleTranslator
from bs4 import BeautifulSoup, Comment
import os
# List of tuples in the form os:
# * Garmin IQ language three letter mnemonic,
# * Google Translate language mnemonic,
# * Language familiar name (mainly for reference)
languages: list[tuple[str, str, str]] = [
("ara", "ar", "Arabic"),
("bul", "bg", "Bulgarian"),
("zhs", "zh-CN", "Chinese (Simplified)"),
("zht", "zh-TW", "Chinese (Traditional)"),
("hrv", "hr", "Croatian"),
("ces", "cs", "Czech"),
("dan", "da", "Danish"),
("dut", "nl", "Dutch"),
("deu", "de", "German"),
("gre", "el", "Greek"),
# ("eng", "en", "English"),
("est", "et", "Estonian"),
("fin", "fi", "Finnish"),
("fre", "fr", "French"),
("heb", "iw", "Hebrew"),
("hun", "hu", "Hungarian"),
("ind", "id", "Indonesian"),
("ita", "it", "Italian"),
("jpn", "ja", "Japanese"),
("kor", "ko", "Korean"),
("lav", "lv", "Latvian"),
("lit", "lt", "Lithuanian"),
("zsm", "ms", "Standard (Bahasa) Malay"),
("nob", "no", "Norwegian"),
("pol", "pl", "Polish"),
("por", "pt", "Portuguese"),
("ron", "ro", "Romanian"),
# ("rus", "ru", "Russian"),
("slo", "sk", "Slovak"),
("slv", "sl", "Slovenian"),
("spa", "es", "Spanish"),
("swe", "sv", "Swedish"),
("tha", "th", "Thai"),
("tur", "tr", "Turkish"),
("ukr", "uk", "Ukrainian"),
("vie", "vi", "Vietnamese")
]
langLength = len(languages)
exceptionIds: list[str] = ["AppName", "AppVersionTitle"]
titleIds: list[str] = ["setMode", "tapIcon"]
i = 1
with open("./resources/strings/strings.xml", "r") as f:
c = f.read().replace('\r', '')
for l in languages:
os.makedirs(f"./resources-{l[0]}/strings/", exist_ok=True)
try:
with open(f"./resources-{l[0]}/strings/corrections.xml", "r") as r:
curr = BeautifulSoup(r.read().replace('\r', ''), features="xml")
except FileNotFoundError:
curr = BeautifulSoup("", features=["xml"])
print(f"{i} of {langLength}: Translating English to {l[2]}")
soup = BeautifulSoup(c, features="xml")
soup.find(name="strings").insert_before("\n\n")
soup.find(name="strings").insert_before(
Comment(f"\n Generated by Google Translate: English to {l[2]}\n " +
GoogleTranslator(source='en', target=l[1]).translate("Generated by Google Translate from English") +
"\n")
)
soup.find(name="strings").insert_before("\n\n")
for s in soup.find(name="strings").findAll(name="string"):
s.insert_before(" ")
if s["id"] in exceptionIds: continue
s_curr = curr.find(name="string", attrs={ "id": s["id"] })
if s_curr:
s.string = s_curr.string
else:
a = GoogleTranslator(source='en', target=l[1]).translate(s.string)
if s["id"] in titleIds:
s.string = a.title()
else:
s.string = a
for s in soup.find(name="strings").findAll(text=lambda text:isinstance(text, Comment)):
s.insert_before(" ")
s.replace_with(Comment(" " + GoogleTranslator(source='en', target=l[1]).translate(s) + " "))
#print(str(soup))
with open(f"./resources-{l[0]}/strings/strings.xml", "wb") as w:
w.write(soup.encode("utf-8"))
i += 1