mirror of
https://github.com/house-of-abbey/GarminHomeAssistant.git
synced 2025-04-29 20:22:52 +00:00
136 lines
4.7 KiB
Python
136 lines
4.7 KiB
Python
####################################################################################
|
|
#
|
|
# 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 beautifulsoup4
|
|
# 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
|
|
#
|
|
####################################################################################
|
|
import os
|
|
|
|
from bs4 import BeautifulSoup
|
|
from bs4 import Comment
|
|
from deep_translator import GoogleTranslator
|
|
|
|
# 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] = []
|
|
|
|
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(
|
|
string=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") + b"\n")
|
|
i += 1
|