mirror of
https://github.com/house-of-abbey/GarminHomeAssistant.git
synced 2025-07-30 16:38:31 +00:00
Reuse translations
This commit is contained in:
89
removeTranslations.py
Normal file
89
removeTranslations.py
Normal file
@ -0,0 +1,89 @@
|
||||
####################################################################################
|
||||
#
|
||||
# Distributed under MIT Licence
|
||||
# See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE.
|
||||
#
|
||||
####################################################################################
|
||||
#
|
||||
# GarminHomeAssistant 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/GarminHomeAssistant.
|
||||
#
|
||||
# J D Abbey & P A Abbey, 24 July 2025
|
||||
#
|
||||
#
|
||||
# Description:
|
||||
#
|
||||
# Python script to remove all the translations of a specific id from the XML files.
|
||||
#
|
||||
# Usage:
|
||||
# python removeTranslations.py <id>
|
||||
#
|
||||
# Python installation:
|
||||
# pip install beautifulsoup4
|
||||
# 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 sys
|
||||
# from bs4 import BeautifulSoup
|
||||
import os
|
||||
|
||||
def remove_translations(file_path: str, translation_id: str) -> None:
|
||||
"""
|
||||
Remove all translations of a specific id from the XML file.
|
||||
|
||||
:param file_path: Path to the XML file.
|
||||
:param translation_id: The id of the translation to remove.
|
||||
"""
|
||||
# Breaks the formatting
|
||||
# with open(file_path, "r", encoding="utf-8") as file:
|
||||
# soup = BeautifulSoup(file, features="xml")
|
||||
|
||||
# # Find all string elements with the specified id
|
||||
# strings_to_remove = soup.find_all("string", {"id": translation_id})
|
||||
|
||||
# for string in strings_to_remove:
|
||||
# string.decompose() # Remove the string element
|
||||
|
||||
# # Write the modified XML back to the file
|
||||
# with open(file_path, "wb") as file:
|
||||
# file.write(soup.encode("utf-8") + b"\n")
|
||||
|
||||
# Use standard string replace instead
|
||||
with open(file_path, "r", encoding="utf-8") as file:
|
||||
content = file.read()
|
||||
|
||||
new = ""
|
||||
for line in content.splitlines():
|
||||
if not f'id="{translation_id}"' in line:
|
||||
new += line + "\n"
|
||||
|
||||
with open(file_path, "w", encoding="utf-8") as file:
|
||||
file.write(new)
|
||||
|
||||
def main(translation_id: str) -> None:
|
||||
"""
|
||||
Main function to process all XML files.
|
||||
|
||||
:param translation_id: The id of the translation to remove.
|
||||
"""
|
||||
xml_files = [d + "/strings/strings.xml" for d in os.listdir(".") if os.path.isdir(d) and "resources-" in d and os.path.exists(d + "/strings/strings.xml")]
|
||||
|
||||
for xml_file in xml_files:
|
||||
print(f"Processing file: {xml_file}")
|
||||
remove_translations(xml_file, translation_id)
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) != 2:
|
||||
print("Usage: python removeTranslations.py <id>")
|
||||
sys.exit(1)
|
||||
|
||||
translation_id = sys.argv[1]
|
||||
main(translation_id)
|
56
translate.py
56
translate.py
@ -1,13 +1,13 @@
|
||||
####################################################################################
|
||||
#
|
||||
# Distributed under MIT Licence
|
||||
# See https://github.com/house-of-abbey/GarminThermoNest/blob/main/LICENSE.
|
||||
# See https://github.com/house-of-abbey/GarminHomeAssistant/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.
|
||||
# GarminHomeAssistant 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/GarminHomeAssistant.
|
||||
#
|
||||
# J D Abbey & P A Abbey, 28 December 2022
|
||||
#
|
||||
@ -84,25 +84,44 @@ langLength = len(languages)
|
||||
exceptionIds: list[str] = ["AppName", "AppVersionTitle"]
|
||||
titleIds: list[str] = []
|
||||
|
||||
# def merge(curr: BeautifulSoup, prev: BeautifulSoup) -> BeautifulSoup:
|
||||
# """
|
||||
# Merge the current strings.xml with the previous one, overwriting
|
||||
# the previous strings with the current ones if they exist.
|
||||
# """
|
||||
# out = prev.__copy__()
|
||||
# for s in curr.find(name="strings").findAll(name="string"):
|
||||
# s_prev = out.find(name="string", attrs={"id": s["id"]})
|
||||
# if s_prev:
|
||||
# s_prev.string = s.string
|
||||
# else:
|
||||
# out.find(name="strings").append(s)
|
||||
# return out
|
||||
|
||||
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)
|
||||
# Old translations will not be automatically updated/removed, use removeTranslations.py
|
||||
try:
|
||||
with open(f"./resources-{l[0]}/strings/corrections.xml", "r") as r:
|
||||
curr = BeautifulSoup(r.read().replace("\r", ""),
|
||||
features="xml")
|
||||
with open(f"./resources-{l[0]}/strings/strings.xml", "r", encoding="utf-8") as r:
|
||||
prev = BeautifulSoup(r.read().replace("\r", ""), features="xml")
|
||||
except FileNotFoundError:
|
||||
prev = BeautifulSoup("", features=["xml"])
|
||||
try:
|
||||
with open(f"./resources-{l[0]}/strings/corrections.xml", "r", encoding="utf-8") 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")
|
||||
translator = GoogleTranslator(source="en", target=l[1])
|
||||
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"))
|
||||
translator.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"):
|
||||
@ -114,20 +133,19 @@ with open("./resources/strings/strings.xml", "r") as f:
|
||||
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()
|
||||
s_prev = prev.find(name="string", attrs={"id": s["id"]})
|
||||
if s_prev:
|
||||
s.string = s_prev.string
|
||||
else:
|
||||
s.string = a
|
||||
a = translator.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) +
|
||||
" "))
|
||||
s.replace_with(Comment(" " + translator.translate(s) + " "))
|
||||
|
||||
# print(str(soup))
|
||||
with open(f"./resources-{l[0]}/strings/strings.xml", "wb") as w:
|
||||
|
Reference in New Issue
Block a user