#################################################################################### # # 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