From 816b0dc89090bb2a8baf50868461dc5df22a846b Mon Sep 17 00:00:00 2001 From: Philip Abbey Date: Thu, 2 Nov 2023 21:32:42 +0000 Subject: [PATCH] Internationalisation & Multi-watch support Copied two methods from GarminThermoNest to translate languages and manage different sized icons for the various sizes of watch. Also copied ErrorView for smaller wrapped text for error messages. --- .vscode/launch.json | 8 ++ iconResize.py | 91 ++++++++++++++ manifest.xml | 74 +++++++++++ monkey.jungle | 71 +++++++++++ resources-ara/strings/strings.xml | 29 +++++ resources-bul/strings/strings.xml | 29 +++++ resources-ces/strings/strings.xml | 29 +++++ resources-dan/strings/strings.xml | 29 +++++ resources-deu/strings/strings.xml | 29 +++++ resources-dut/strings/strings.xml | 29 +++++ resources-est/strings/strings.xml | 29 +++++ resources-fin/strings/strings.xml | 29 +++++ resources-fre/strings/strings.xml | 29 +++++ resources-gre/strings/strings.xml | 29 +++++ resources-heb/strings/strings.xml | 29 +++++ resources-hrv/strings/strings.xml | 29 +++++ resources-hun/strings/strings.xml | 29 +++++ resources-icons-26/drawables.xml | 20 +++ resources-icons-26/error.svg | 1 + resources-icons-28/drawables.xml | 20 +++ resources-icons-28/error.svg | 1 + resources-icons-30/drawables.xml | 20 +++ resources-icons-30/error.svg | 1 + resources-icons-32/drawables.xml | 20 +++ resources-icons-32/error.svg | 1 + resources-icons-38/drawables.xml | 20 +++ resources-icons-38/error.svg | 1 + resources-icons-42/drawables.xml | 20 +++ resources-icons-42/error.svg | 1 + resources-icons-46/drawables.xml | 20 +++ resources-icons-46/error.svg | 1 + resources-icons-48/drawables.xml | 20 +++ resources-icons-48/error.svg | 1 + resources-ind/strings/strings.xml | 29 +++++ resources-ita/strings/strings.xml | 29 +++++ resources-jpn/strings/strings.xml | 29 +++++ resources-kor/strings/strings.xml | 29 +++++ .../drawables.xml | 2 +- resources-launcher-30-30/launcher.png | Bin 0 -> 4047 bytes resources-launcher-35-35/drawables.xml | 17 +++ resources-launcher-35-35/launcher.png | Bin 0 -> 4287 bytes resources-launcher-36-36/drawables.xml | 17 +++ resources-launcher-36-36/launcher.png | Bin 0 -> 4326 bytes resources-launcher-40-40/drawables.xml | 17 +++ resources-launcher-40-40/launcher.png | Bin 0 -> 4451 bytes resources-launcher-60-60/drawables.xml | 17 +++ resources-launcher-60-60/launcher.png | Bin 0 -> 5189 bytes resources-launcher-61-61/drawables.xml | 17 +++ resources-launcher-61-61/launcher.png | Bin 0 -> 5246 bytes resources-launcher-70-70/drawables.xml | 17 +++ resources-launcher-70-70/launcher.png | Bin 0 -> 5378 bytes resources-lav/strings/strings.xml | 29 +++++ resources-lit/strings/strings.xml | 29 +++++ resources-nob/strings/strings.xml | 29 +++++ resources-pol/strings/strings.xml | 29 +++++ resources-por/strings/strings.xml | 29 +++++ resources-ron/strings/strings.xml | 29 +++++ resources-slo/strings/strings.xml | 29 +++++ resources-slv/strings/strings.xml | 29 +++++ resources-spa/strings/strings.xml | 29 +++++ resources-swe/strings/strings.xml | 29 +++++ resources-tha/strings/strings.xml | 29 +++++ resources-tur/strings/strings.xml | 29 +++++ resources-ukr/strings/strings.xml | 29 +++++ resources-vie/strings/strings.xml | 29 +++++ resources-zhs/strings/strings.xml | 29 +++++ resources-zht/strings/strings.xml | 29 +++++ resources-zsm/strings/strings.xml | 29 +++++ resources/drawables/launcher.png | Bin 0 -> 6412 bytes resources/drawables/launcher_icon.png | Bin 6931 -> 0 bytes resources/strings/strings.xml | 6 + source/ErrorView.mc | 88 ++++++++++++++ source/Globals.mc | 3 +- source/HomeAssistantApp.mc | 16 ++- source/HomeAssistantMenuItem.mc | 6 +- source/HomeAssistantToggleMenuItem.mc | 6 +- source/HomeAssistantView.mc | 11 +- source/HomeAssistantViewMenuItem.mc | 2 +- source/ScalableView.mc | 48 ++++++++ translate.py | 115 ++++++++++++++++++ 80 files changed, 1784 insertions(+), 19 deletions(-) create mode 100644 iconResize.py create mode 100644 resources-ara/strings/strings.xml create mode 100644 resources-bul/strings/strings.xml create mode 100644 resources-ces/strings/strings.xml create mode 100644 resources-dan/strings/strings.xml create mode 100644 resources-deu/strings/strings.xml create mode 100644 resources-dut/strings/strings.xml create mode 100644 resources-est/strings/strings.xml create mode 100644 resources-fin/strings/strings.xml create mode 100644 resources-fre/strings/strings.xml create mode 100644 resources-gre/strings/strings.xml create mode 100644 resources-heb/strings/strings.xml create mode 100644 resources-hrv/strings/strings.xml create mode 100644 resources-hun/strings/strings.xml create mode 100644 resources-icons-26/drawables.xml create mode 100644 resources-icons-26/error.svg create mode 100644 resources-icons-28/drawables.xml create mode 100644 resources-icons-28/error.svg create mode 100644 resources-icons-30/drawables.xml create mode 100644 resources-icons-30/error.svg create mode 100644 resources-icons-32/drawables.xml create mode 100644 resources-icons-32/error.svg create mode 100644 resources-icons-38/drawables.xml create mode 100644 resources-icons-38/error.svg create mode 100644 resources-icons-42/drawables.xml create mode 100644 resources-icons-42/error.svg create mode 100644 resources-icons-46/drawables.xml create mode 100644 resources-icons-46/error.svg create mode 100644 resources-icons-48/drawables.xml create mode 100644 resources-icons-48/error.svg create mode 100644 resources-ind/strings/strings.xml create mode 100644 resources-ita/strings/strings.xml create mode 100644 resources-jpn/strings/strings.xml create mode 100644 resources-kor/strings/strings.xml rename {resources/drawables => resources-launcher-30-30}/drawables.xml (86%) create mode 100644 resources-launcher-30-30/launcher.png create mode 100644 resources-launcher-35-35/drawables.xml create mode 100644 resources-launcher-35-35/launcher.png create mode 100644 resources-launcher-36-36/drawables.xml create mode 100644 resources-launcher-36-36/launcher.png create mode 100644 resources-launcher-40-40/drawables.xml create mode 100644 resources-launcher-40-40/launcher.png create mode 100644 resources-launcher-60-60/drawables.xml create mode 100644 resources-launcher-60-60/launcher.png create mode 100644 resources-launcher-61-61/drawables.xml create mode 100644 resources-launcher-61-61/launcher.png create mode 100644 resources-launcher-70-70/drawables.xml create mode 100644 resources-launcher-70-70/launcher.png create mode 100644 resources-lav/strings/strings.xml create mode 100644 resources-lit/strings/strings.xml create mode 100644 resources-nob/strings/strings.xml create mode 100644 resources-pol/strings/strings.xml create mode 100644 resources-por/strings/strings.xml create mode 100644 resources-ron/strings/strings.xml create mode 100644 resources-slo/strings/strings.xml create mode 100644 resources-slv/strings/strings.xml create mode 100644 resources-spa/strings/strings.xml create mode 100644 resources-swe/strings/strings.xml create mode 100644 resources-tha/strings/strings.xml create mode 100644 resources-tur/strings/strings.xml create mode 100644 resources-ukr/strings/strings.xml create mode 100644 resources-vie/strings/strings.xml create mode 100644 resources-zhs/strings/strings.xml create mode 100644 resources-zht/strings/strings.xml create mode 100644 resources-zsm/strings/strings.xml create mode 100644 resources/drawables/launcher.png delete mode 100644 resources/drawables/launcher_icon.png create mode 100644 source/ErrorView.mc create mode 100644 source/ScalableView.mc create mode 100644 translate.py diff --git a/.vscode/launch.json b/.vscode/launch.json index 070367e..a93993a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,14 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "name": "Python: Current File", + "type": "python", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "justMyCode": true + }, { "type": "monkeyc", "request": "launch", diff --git a/iconResize.py b/iconResize.py new file mode 100644 index 0000000..ca4d82f --- /dev/null +++ b/iconResize.py @@ -0,0 +1,91 @@ +#################################################################################### +# +# 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, 28 December 2022 +# +# +# Description: +# +# Python script to automatically resize the application icons from the original +# 48x48 pixel width to something more appropriate for different screen sizes. +# +# Python installation: +# pip install BeautifulSoup +# 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 bs4 import BeautifulSoup, Comment +import os +import shutil + +output_dir_prefix = 'resources-icons-' +input_dir = output_dir_prefix + '48' + +Doub = 0 +Sing = 1 +Half = 2 + +# Original icons for 416x416 screen size with 48x48 icons +original = (96, 48, 24) + +# Convert icons to different screen sizes by these parameters +lookup = { + # Doub Sing Half + # 0 1 2 +# 416: (96, 48, 24), + 390: (90, 46, 23), + 360: (84, 42, 21), + 320: (74, 38, 19), + 280: (64, 32, 16), + 260: (60, 30, 15), + 240: (56, 28, 14), + 218: (50, 26, 13), +} + +# Delete all but the original 48x48 icon directories +for entry in os.listdir("."): + if entry.startswith(output_dir_prefix) and entry != input_dir: + shutil.rmtree(entry) + +# (Re-)Create the resized icon directories +for screen_size, icon_sizes in lookup.items(): + output_dir = output_dir_prefix + str(icon_sizes[Sing]) + print("\nCreate directory:", output_dir) + os.makedirs(output_dir) + for entry in os.listdir(input_dir): + if entry.endswith(".svg"): + print("Create file: ", entry.ljust(40) + " SVG - Change file") + with open(input_dir + "/" + entry, "r") as f: + soup = BeautifulSoup(f.read(), features="xml") + svg: BeautifulSoup = list(soup.children)[0] + h = int(svg.attrs["height"]) + if (h == original[Doub]): + svg.attrs["width"] = lookup[screen_size][Doub] + svg.attrs["height"] = lookup[screen_size][Doub] + elif (h == original[Sing]): + svg.attrs["width"] = lookup[screen_size][Sing] + svg.attrs["height"] = lookup[screen_size][Sing] + elif (h == original[Half]): + svg.attrs["width"] = lookup[screen_size][Half] + svg.attrs["height"] = lookup[screen_size][Half] + with open(output_dir + "/" + entry, "wb") as o: + o.write(svg.encode("utf-8")) + elif entry.endswith(".xml"): + print("Create file: ", entry.ljust(40) + " XML - Copy file") + shutil.copyfile(input_dir + "/" + entry, output_dir + "/" + entry) diff --git a/manifest.xml b/manifest.xml index eb86c81..4bfbed6 100644 --- a/manifest.xml +++ b/manifest.xml @@ -27,7 +27,46 @@ "Monkey C: Edit Products" - Lets you add or remove any product --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ara + bul + zhs + zht + hrv + ces + dan + dut + deu + gre eng + est + fin + fre + heb + hun + ind + ita + jpn + kor + lav + lit + zsm + nob + pol + por + slo + ron + + slv + spa + swe + tha + tur + ukr + vie + + + + + HomeAssistant + على + عن + مقبض + قائمة طعام + لا يوجد اتصال بالإنترنت + خطأ في إحضار القائمة + \ No newline at end of file diff --git a/resources-bul/strings/strings.xml b/resources-bul/strings/strings.xml new file mode 100644 index 0000000..e019e5f --- /dev/null +++ b/resources-bul/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + На + Изкл + Докоснете + Меню + Няма интернет връзка + Грешка при извличане на менюто + \ No newline at end of file diff --git a/resources-ces/strings/strings.xml b/resources-ces/strings/strings.xml new file mode 100644 index 0000000..e98a5d1 --- /dev/null +++ b/resources-ces/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + Na + Vypnuto + Klepněte + Jídelní lístek + Žádné internetové připojení + Chyba načítání nabídky + \ No newline at end of file diff --git a/resources-dan/strings/strings.xml b/resources-dan/strings/strings.xml new file mode 100644 index 0000000..5e8f9c0 --- /dev/null +++ b/resources-dan/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + + Af + Tryk på + Menu + Ingen internetforbindelse + Fejl ved menuhentning + \ No newline at end of file diff --git a/resources-deu/strings/strings.xml b/resources-deu/strings/strings.xml new file mode 100644 index 0000000..2d4df9c --- /dev/null +++ b/resources-deu/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + An + Aus + Klopfen + Speisekarte + Keine Internetverbindung + Fehler beim Abrufen des Menüs + \ No newline at end of file diff --git a/resources-dut/strings/strings.xml b/resources-dut/strings/strings.xml new file mode 100644 index 0000000..1474a83 --- /dev/null +++ b/resources-dut/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + Op + Uit + Kraan + Menu + Geen internet verbinding + Fout bij ophalen van menu + \ No newline at end of file diff --git a/resources-est/strings/strings.xml b/resources-est/strings/strings.xml new file mode 100644 index 0000000..2d11174 --- /dev/null +++ b/resources-est/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + Peal + Väljas + Puudutage + Menüü + Interneti-ühendus puudub + Menüü toomise viga + \ No newline at end of file diff --git a/resources-fin/strings/strings.xml b/resources-fin/strings/strings.xml new file mode 100644 index 0000000..720acbe --- /dev/null +++ b/resources-fin/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + Päällä + Vinossa + Napauta + Valikko + Ei Internet-yhteyttä + Valikkohakuvirhe + \ No newline at end of file diff --git a/resources-fre/strings/strings.xml b/resources-fre/strings/strings.xml new file mode 100644 index 0000000..e6e906a --- /dev/null +++ b/resources-fre/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + Sur + Désactivé + Robinet + Menu + Pas de connexion Internet + Erreur de récupération du menu + \ No newline at end of file diff --git a/resources-gre/strings/strings.xml b/resources-gre/strings/strings.xml new file mode 100644 index 0000000..4463bc1 --- /dev/null +++ b/resources-gre/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + Επί + Μακριά από + Παρακέντηση + Μενού + Δεν υπάρχει σύνδεση στο διαδίκτυο + Σφάλμα ανάκτησης μενού + \ No newline at end of file diff --git a/resources-heb/strings/strings.xml b/resources-heb/strings/strings.xml new file mode 100644 index 0000000..a2ac598 --- /dev/null +++ b/resources-heb/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + עַל + כבוי + בֶּרֶז + תַפרִיט + אין חיבור אינטרנט + שגיאת אחזור תפריט + \ No newline at end of file diff --git a/resources-hrv/strings/strings.xml b/resources-hrv/strings/strings.xml new file mode 100644 index 0000000..d922ee2 --- /dev/null +++ b/resources-hrv/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + Na + Isključeno + Dodirnite + Jelovnik + Nema internetske veze + Pogreška dohvaćanja izbornika + \ No newline at end of file diff --git a/resources-hun/strings/strings.xml b/resources-hun/strings/strings.xml new file mode 100644 index 0000000..6f6419f --- /dev/null +++ b/resources-hun/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + Tovább + Ki + Koppintson a + Menü + Nincs internetkapcsolat + Menü Lekérési hiba + \ No newline at end of file diff --git a/resources-icons-26/drawables.xml b/resources-icons-26/drawables.xml new file mode 100644 index 0000000..320d05b --- /dev/null +++ b/resources-icons-26/drawables.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/resources-icons-26/error.svg b/resources-icons-26/error.svg new file mode 100644 index 0000000..26e38d6 --- /dev/null +++ b/resources-icons-26/error.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources-icons-28/drawables.xml b/resources-icons-28/drawables.xml new file mode 100644 index 0000000..320d05b --- /dev/null +++ b/resources-icons-28/drawables.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/resources-icons-28/error.svg b/resources-icons-28/error.svg new file mode 100644 index 0000000..a66bb50 --- /dev/null +++ b/resources-icons-28/error.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources-icons-30/drawables.xml b/resources-icons-30/drawables.xml new file mode 100644 index 0000000..320d05b --- /dev/null +++ b/resources-icons-30/drawables.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/resources-icons-30/error.svg b/resources-icons-30/error.svg new file mode 100644 index 0000000..80de13d --- /dev/null +++ b/resources-icons-30/error.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources-icons-32/drawables.xml b/resources-icons-32/drawables.xml new file mode 100644 index 0000000..320d05b --- /dev/null +++ b/resources-icons-32/drawables.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/resources-icons-32/error.svg b/resources-icons-32/error.svg new file mode 100644 index 0000000..3e1eff5 --- /dev/null +++ b/resources-icons-32/error.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources-icons-38/drawables.xml b/resources-icons-38/drawables.xml new file mode 100644 index 0000000..320d05b --- /dev/null +++ b/resources-icons-38/drawables.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/resources-icons-38/error.svg b/resources-icons-38/error.svg new file mode 100644 index 0000000..b7e88e9 --- /dev/null +++ b/resources-icons-38/error.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources-icons-42/drawables.xml b/resources-icons-42/drawables.xml new file mode 100644 index 0000000..320d05b --- /dev/null +++ b/resources-icons-42/drawables.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/resources-icons-42/error.svg b/resources-icons-42/error.svg new file mode 100644 index 0000000..4fe488b --- /dev/null +++ b/resources-icons-42/error.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources-icons-46/drawables.xml b/resources-icons-46/drawables.xml new file mode 100644 index 0000000..320d05b --- /dev/null +++ b/resources-icons-46/drawables.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/resources-icons-46/error.svg b/resources-icons-46/error.svg new file mode 100644 index 0000000..7e52e6d --- /dev/null +++ b/resources-icons-46/error.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources-icons-48/drawables.xml b/resources-icons-48/drawables.xml new file mode 100644 index 0000000..320d05b --- /dev/null +++ b/resources-icons-48/drawables.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/resources-icons-48/error.svg b/resources-icons-48/error.svg new file mode 100644 index 0000000..c864600 --- /dev/null +++ b/resources-icons-48/error.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources-ind/strings/strings.xml b/resources-ind/strings/strings.xml new file mode 100644 index 0000000..03b8937 --- /dev/null +++ b/resources-ind/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + Pada + Mati + Mengetuk + Menu + Tidak ada koneksi internet + Kesalahan Pengambilan Menu + \ No newline at end of file diff --git a/resources-ita/strings/strings.xml b/resources-ita/strings/strings.xml new file mode 100644 index 0000000..43bbc2a --- /dev/null +++ b/resources-ita/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + SU + Spento + Rubinetto + Menù + Nessuna connessione internet + Errore di recupero del menu + \ No newline at end of file diff --git a/resources-jpn/strings/strings.xml b/resources-jpn/strings/strings.xml new file mode 100644 index 0000000..0b1318d --- /dev/null +++ b/resources-jpn/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + の上 + オフ + タップ + メニュー + インターネット接続なし + メニューフェッチエラー + \ No newline at end of file diff --git a/resources-kor/strings/strings.xml b/resources-kor/strings/strings.xml new file mode 100644 index 0000000..cfcfbe3 --- /dev/null +++ b/resources-kor/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + ~에 + 끄다 + 수도꼭지 + 메뉴 + 인터넷에 연결되지 않음 + 메뉴 가져오기 오류 + \ No newline at end of file diff --git a/resources/drawables/drawables.xml b/resources-launcher-30-30/drawables.xml similarity index 86% rename from resources/drawables/drawables.xml rename to resources-launcher-30-30/drawables.xml index 7cd1cca..d8b5369 100644 --- a/resources/drawables/drawables.xml +++ b/resources-launcher-30-30/drawables.xml @@ -13,5 +13,5 @@ --> - + diff --git a/resources-launcher-30-30/launcher.png b/resources-launcher-30-30/launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..6ee0210f9ecc4b87c33c018d20c3454066d83df6 GIT binary patch literal 4047 zcmV;=4>0hFP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000E~Nkl7oZr2BpU!mdZqv=_=5#NnZoXzkh515;MnPmR=q&9I z10zT*0x1Ra4=I%*$OyvBQWHx3r$3?;><%xm*;by=l4C&bJXTV*$ib0OP~r!no{zE%V_b_tAeOlqZYeGl=)o<_8TE&7*kkW zGYQvBMiKR|JB->?wU+QCP@%*EOa``(){7niDDy|7f}eqkjJIzB2S*DYD&k@wr*|qT zMffiWK(oLJU=o0hLX_4hr4iVoAPd+y;)ums28_?d+BR!xGq&gR{ICrz;r)X87AOS> zeV>9!Q_xN}*4o}J!Uo^~V8)v2c*Z=u+#9NW8VlJ?gMM(s)X4~j znC)JX6Sf}%$pwX%^r>!I#!K&hL0S2fk<~PyvTi;(MWwW!J%x=zv^E&=XKL|h^}gxSn@Q#K}mofzXv6_=0=0?Gi(%U%HyLZydZJmX9NA zwt7zSZr#(>^=Hk3Wv{K>w(o#gOB4kIbgIB=u$n+LC^cBhLyi9T3b*GvwF{SDTD5uS zX3q;hOm^Ssc3#}Rm%8Sq#B=fq0{4zBS&cz#B0}KysD*1Nq^B-A7;JJi> zH@sV$4nx%7s;@M}<=pDr8i#8WtFcZNi2SdsPlhfO z1sO+YD0B0Qx%lKkupZdp?tn+891Cu8)Sfi=$nF`~8A|q<&)aJteE=2c^hvZD)Chby zw`xhz(a}L?XXl9f?~aMEwdiK*EHJ@=_A9+}fY4gBQp#jreKP#~g~ + + + + diff --git a/resources-launcher-35-35/launcher.png b/resources-launcher-35-35/launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..1d51ea41e84f771d057e365fee205c522c781891 GIT binary patch literal 4287 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 literal 0 HcmV?d00001 diff --git a/resources-launcher-36-36/drawables.xml b/resources-launcher-36-36/drawables.xml new file mode 100644 index 0000000..d8b5369 --- /dev/null +++ b/resources-launcher-36-36/drawables.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/resources-launcher-36-36/launcher.png b/resources-launcher-36-36/launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..f1fbe43ca162be09e89a4a8584609f2da3b6437b GIT binary patch literal 4326 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 + + + + diff --git a/resources-launcher-40-40/launcher.png b/resources-launcher-40-40/launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2bfe588cefcb68e34430d2e7b6148b2c5392e49f GIT binary patch literal 4451 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 + + + + diff --git a/resources-launcher-60-60/launcher.png b/resources-launcher-60-60/launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..3a2d836aa25fe517c96970d1b5a5d7fe9801661c GIT binary patch literal 5189 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 + + + + diff --git a/resources-launcher-61-61/launcher.png b/resources-launcher-61-61/launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4b0ac644369ccaa78011cfd47a24f318bdc91bc5 GIT binary patch literal 5246 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 + + + + diff --git a/resources-launcher-70-70/launcher.png b/resources-launcher-70-70/launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ec89b581e9316e88869fbe9856d48a79c2680293 GIT binary patch literal 5378 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 g)#y5AK=J + + + + + + HomeAssistant + Ieslēgts + Izslēgts + Krāns + Izvēlne + Nav interneta savienojuma + Izvēlnes ielādes kļūda + \ No newline at end of file diff --git a/resources-lit/strings/strings.xml b/resources-lit/strings/strings.xml new file mode 100644 index 0000000..88d1bb1 --- /dev/null +++ b/resources-lit/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + Įjungta + Išjungta + Bakstelėkite + Meniu + Nėra interneto ryšio + Meniu gavimo klaida + \ No newline at end of file diff --git a/resources-nob/strings/strings.xml b/resources-nob/strings/strings.xml new file mode 100644 index 0000000..cb80be2 --- /dev/null +++ b/resources-nob/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + + Av + Trykk på + Meny + Ingen Internett-tilkobling + Menyhentingsfeil + \ No newline at end of file diff --git a/resources-pol/strings/strings.xml b/resources-pol/strings/strings.xml new file mode 100644 index 0000000..236d5d5 --- /dev/null +++ b/resources-pol/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + NA + Wyłączony + Uzyskiwać + Menu + Brak połączenia z internetem + Błąd pobierania menu + \ No newline at end of file diff --git a/resources-por/strings/strings.xml b/resources-por/strings/strings.xml new file mode 100644 index 0000000..3f93633 --- /dev/null +++ b/resources-por/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + Sobre + Desligado + Tocar + Cardápio + Sem conexão com a Internet + Erro ao buscar menu + \ No newline at end of file diff --git a/resources-ron/strings/strings.xml b/resources-ron/strings/strings.xml new file mode 100644 index 0000000..2920cf6 --- /dev/null +++ b/resources-ron/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + Pe + Oprit + Atingeți + Meniul + Fără conexiune internet + Eroare de preluare a meniului + \ No newline at end of file diff --git a/resources-slo/strings/strings.xml b/resources-slo/strings/strings.xml new file mode 100644 index 0000000..ebe1983 --- /dev/null +++ b/resources-slo/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + Zapnuté + Vypnuté + Klepnite + Ponuka + Žiadne internetové pripojenie + Chyba načítania ponuky + \ No newline at end of file diff --git a/resources-slv/strings/strings.xml b/resources-slv/strings/strings.xml new file mode 100644 index 0000000..258cfd2 --- /dev/null +++ b/resources-slv/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + Vklopljeno + Izključeno + Tapnite + meni + Ni internetne povezave + Napaka pri pridobivanju menija + \ No newline at end of file diff --git a/resources-spa/strings/strings.xml b/resources-spa/strings/strings.xml new file mode 100644 index 0000000..fb8ef21 --- /dev/null +++ b/resources-spa/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + En + Apagado + Grifo + Menú + Sin conexión a Internet + Error de recuperación del menú + \ No newline at end of file diff --git a/resources-swe/strings/strings.xml b/resources-swe/strings/strings.xml new file mode 100644 index 0000000..bf32799 --- /dev/null +++ b/resources-swe/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + + Av + Knacka + Meny + Ingen internetanslutning + Menyhämtningsfel + \ No newline at end of file diff --git a/resources-tha/strings/strings.xml b/resources-tha/strings/strings.xml new file mode 100644 index 0000000..aa06e0f --- /dev/null +++ b/resources-tha/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + บน + ปิด + แตะ + เมนู + ไม่มีการเชื่อมต่ออินเทอร์เน็ต + เมนูดึงข้อมูลผิดพลาด + \ No newline at end of file diff --git a/resources-tur/strings/strings.xml b/resources-tur/strings/strings.xml new file mode 100644 index 0000000..d8574bf --- /dev/null +++ b/resources-tur/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + Açık + Kapalı + Musluk + Menü + İnternet bağlantısı yok + Menü Alma Hatası + \ No newline at end of file diff --git a/resources-ukr/strings/strings.xml b/resources-ukr/strings/strings.xml new file mode 100644 index 0000000..aa0ecd7 --- /dev/null +++ b/resources-ukr/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + Увімкнено + Вимкнено + Торкніться + Меню + Немає підключення до Інтернету + Помилка вибірки меню + \ No newline at end of file diff --git a/resources-vie/strings/strings.xml b/resources-vie/strings/strings.xml new file mode 100644 index 0000000..0386be7 --- /dev/null +++ b/resources-vie/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + TRÊN + Tắt + Vỗ nhẹ + Thực đơn + Không có kết nối Internet + Lỗi tìm nạp menu + \ No newline at end of file diff --git a/resources-zhs/strings/strings.xml b/resources-zhs/strings/strings.xml new file mode 100644 index 0000000..42f14d9 --- /dev/null +++ b/resources-zhs/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + + 离开 + 轻敲 + 菜单 + 没有网络连接 + 菜单获取错误 + \ No newline at end of file diff --git a/resources-zht/strings/strings.xml b/resources-zht/strings/strings.xml new file mode 100644 index 0000000..308aaf4 --- /dev/null +++ b/resources-zht/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + + 離開 + 輕敲 + 選單 + 沒有網路連線 + 選單取得錯誤 + \ No newline at end of file diff --git a/resources-zsm/strings/strings.xml b/resources-zsm/strings/strings.xml new file mode 100644 index 0000000..96a62b4 --- /dev/null +++ b/resources-zsm/strings/strings.xml @@ -0,0 +1,29 @@ + + + + + + + HomeAssistant + hidup + Mati + Ketik + Menu + Tiada sambungan internet + Ralat Pengambilan Menu + \ No newline at end of file diff --git a/resources/drawables/launcher.png b/resources/drawables/launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2d74c0fc0ff89d2ed1b746ee02d77f708ba7226e GIT binary patch literal 6412 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 HomeAssistant + On + Off + Tap + Menu + No Internet connection + Menu Fetch Error diff --git a/source/ErrorView.mc b/source/ErrorView.mc new file mode 100644 index 0000000..7432076 --- /dev/null +++ b/source/ErrorView.mc @@ -0,0 +1,88 @@ +//----------------------------------------------------------------------------------- +// +// 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, 28 December 2022 +// +// +// Description: +// +// ErrorView provides a means to present application errors to the user. These +// should not happen of course... but they do, so best make sure errors can be +// reported. +// +//----------------------------------------------------------------------------------- + +using Toybox.Graphics; +using Toybox.Lang; +using Toybox.WatchUi; +using Toybox.Communications; + +class ErrorView extends ScalableView { + hidden const settings as Lang.Dictionary = { + :errorIconMargin => 7f + }; + // Vertical spacing between the top of the face and the error icon + hidden var errorIconMargin; + hidden var text as Lang.String; + hidden var errorIcon; + hidden var textArea; + + function initialize(text as Lang.String) { + ScalableView.initialize(); + self.text = text; + // Convert the settings from % of screen size to pixels + errorIconMargin = pixelsForScreen(settings.get(:errorIconMargin) as Lang.Float); + } + + // Load your resources here + function onLayout(dc as Graphics.Dc) as Void { + errorIcon = Application.loadResource(Rez.Drawables.ErrorIcon) as Graphics.BitmapResource; + + var w = dc.getWidth(); + var h = dc.getHeight(); + + textArea = new WatchUi.TextArea({ + :text => text, + :color => Graphics.COLOR_WHITE, + :font => Graphics.FONT_XTINY, + :justification => Graphics.TEXT_JUSTIFY_CENTER | Graphics.TEXT_JUSTIFY_VCENTER, + :locX => 0, + :locY => 83, + :width => w, + :height => h - 166 + }); + } + + // Update the view + function onUpdate(dc as Graphics.Dc) as Void { + var w = dc.getWidth(); + var hw = w/2; + var bg = 0x3B444C; + if(dc has :setAntiAlias) { + dc.setAntiAlias(true); + } + dc.setColor(Graphics.COLOR_WHITE, bg); + dc.clear(); + dc.drawBitmap(hw - errorIcon.getWidth()/2, errorIconMargin, errorIcon); + textArea.draw(dc); + } + +} + +class ErrorDelegate extends WatchUi.BehaviorDelegate { + function initialize() { + WatchUi.BehaviorDelegate.initialize(); + } + function onBack() { + WatchUi.popView(WatchUi.SLIDE_DOWN); + return true; + } +} \ No newline at end of file diff --git a/source/Globals.mc b/source/Globals.mc index 5e8e393..10c699a 100644 --- a/source/Globals.mc +++ b/source/Globals.mc @@ -25,5 +25,6 @@ class Globals { // as the messages can't be read from a watch!) static const debug = false; static const updateInterval = 5; // seconds - static const alertTimeout = 1000; // ms + static const alertTimeout = 2000; // ms + static const tapTimeout = 1000; // ms } diff --git a/source/HomeAssistantApp.mc b/source/HomeAssistantApp.mc index 8a23631..d93ce2a 100644 --- a/source/HomeAssistantApp.mc +++ b/source/HomeAssistantApp.mc @@ -26,11 +26,15 @@ using Toybox.Timer; class HomeAssistantApp extends Application.AppBase { hidden var haMenu; + hidden var strNoInternet as Lang.String; + hidden var strNoMenu as Lang.String; hidden var timer as Timer.Timer; function initialize() { AppBase.initialize(); - timer = new Timer.Timer(); + strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet); + strNoMenu = WatchUi.loadResource($.Rez.Strings.NoMenu); + timer = new Timer.Timer(); } // onStart() is called on application start up @@ -69,13 +73,7 @@ class HomeAssistantApp extends Application.AppBase { if (Globals.debug) { System.println("HomeAssistantApp Note - onReturnFetchMenuConfig(): Configuration not found or potential validation issue."); } - new Alert({ - :timeout => Globals.alertTimeout, - :font => Graphics.FONT_SYSTEM_MEDIUM, - :text => "onReturnFetchMenuConfig Error " + responseCode, - :fgcolor => Graphics.COLOR_RED, - :bgcolor => Graphics.COLOR_BLACK - }).pushView(WatchUi.SLIDE_IMMEDIATE); + WatchUi.pushView(new ErrorView(strNoMenu + " code=" + responseCode ), new ErrorDelegate(), WatchUi.SLIDE_UP); } } @@ -98,7 +96,7 @@ class HomeAssistantApp extends Application.AppBase { new Alert({ :timeout => Globals.alertTimeout, :font => Graphics.FONT_SYSTEM_MEDIUM, - :text => "No Internet connection", + :text => strNoInternet, :fgcolor => Graphics.COLOR_RED, :bgcolor => Graphics.COLOR_BLACK }).pushView(WatchUi.SLIDE_IMMEDIATE); diff --git a/source/HomeAssistantMenuItem.mc b/source/HomeAssistantMenuItem.mc index 91b64c4..a60986b 100644 --- a/source/HomeAssistantMenuItem.mc +++ b/source/HomeAssistantMenuItem.mc @@ -25,6 +25,7 @@ using Toybox.Application.Properties; class HomeAssistantMenuItem extends WatchUi.MenuItem { hidden var api_key = Properties.getValue("api_key"); + hidden var strNoInternet as Lang.String; function initialize( label as Lang.String or Lang.Symbol, @@ -35,6 +36,7 @@ class HomeAssistantMenuItem extends WatchUi.MenuItem { :icon as Graphics.BitmapType or WatchUi.Drawable or Lang.Symbol } or Null ) { + strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet); WatchUi.MenuItem.initialize( label, subLabel, @@ -58,7 +60,7 @@ class HomeAssistantMenuItem extends WatchUi.MenuItem { System.println("HomeAssistantMenuItem Note - onReturnExecScript(): Correct script executed."); } new Alert({ - :timeout => Globals.alertTimeout, + :timeout => Globals.tapTimeout, :font => Graphics.FONT_SYSTEM_MEDIUM, :text => (d[i].get("attributes") as Lang.Dictionary).get("friendly_name"), :fgcolor => Graphics.COLOR_WHITE, @@ -96,7 +98,7 @@ class HomeAssistantMenuItem extends WatchUi.MenuItem { new Alert({ :timeout => Globals.alertTimeout, :font => Graphics.FONT_SYSTEM_MEDIUM, - :text => "No Internet connection", + :text => strNoInternet, :fgcolor => Graphics.COLOR_RED, :bgcolor => Graphics.COLOR_BLACK }).pushView(WatchUi.SLIDE_IMMEDIATE); diff --git a/source/HomeAssistantToggleMenuItem.mc b/source/HomeAssistantToggleMenuItem.mc index 1c85d53..82c3393 100644 --- a/source/HomeAssistantToggleMenuItem.mc +++ b/source/HomeAssistantToggleMenuItem.mc @@ -25,6 +25,7 @@ using Toybox.Application.Properties; class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem { hidden var api_key = Properties.getValue("api_key"); + hidden var strNoInternet as Lang.String; function initialize( label as Lang.String or Lang.Symbol, @@ -39,6 +40,7 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem { :icon as Graphics.BitmapType or WatchUi.Drawable or Lang.Symbol } or Null ) { + strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet); WatchUi.ToggleMenuItem.initialize(label, subLabel, identifier, enabled, options); api_key = Properties.getValue("api_key"); } @@ -100,7 +102,7 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem { new Alert({ :timeout => Globals.alertTimeout, :font => Graphics.FONT_SYSTEM_MEDIUM, - :text => "No Internet connection", + :text => strNoInternet, :fgcolor => Graphics.COLOR_RED, :bgcolor => Graphics.COLOR_BLACK }).pushView(WatchUi.SLIDE_IMMEDIATE); @@ -164,7 +166,7 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem { new Alert({ :timeout => Globals.alertTimeout, :font => Graphics.FONT_SYSTEM_MEDIUM, - :text => "No Internet connection", + :text => strNoInternet, :fgcolor => Graphics.COLOR_RED, :bgcolor => Graphics.COLOR_BLACK }).pushView(WatchUi.SLIDE_IMMEDIATE); diff --git a/source/HomeAssistantView.mc b/source/HomeAssistantView.mc index d63d49e..5d2fdc6 100644 --- a/source/HomeAssistantView.mc +++ b/source/HomeAssistantView.mc @@ -23,6 +23,7 @@ using Toybox.Graphics; using Toybox.WatchUi; class HomeAssistantView extends WatchUi.Menu2 { + hidden var strMenuItemTap as Lang.String; function initialize( definition as Lang.Dictionary, @@ -32,9 +33,10 @@ class HomeAssistantView extends WatchUi.Menu2 { :theme as WatchUi.MenuTheme or Null } or Null ) { + strMenuItemTap = WatchUi.loadResource($.Rez.Strings.MenuItemTap); var toggle_obj = { - :enabled => "On", - :disabled => "Off" + :enabled => WatchUi.loadResource($.Rez.Strings.MenuItemOn) as Lang.String, + :disabled => WatchUi.loadResource($.Rez.Strings.MenuItemOff) as Lang.String }; if (options == null) { @@ -66,7 +68,7 @@ class HomeAssistantView extends WatchUi.Menu2 { addItem( new HomeAssistantMenuItem( name, - "Tap", + strMenuItemTap, entity, null ) @@ -115,6 +117,9 @@ class HomeAssistantView extends WatchUi.Menu2 { } +// +// Reference: https://developer.garmin.com/connect-iq/core-topics/input-handling/ +// class HomeAssistantViewDelegate extends WatchUi.Menu2InputDelegate { function initialize() { diff --git a/source/HomeAssistantViewMenuItem.mc b/source/HomeAssistantViewMenuItem.mc index 39b72c3..7a5ec4a 100644 --- a/source/HomeAssistantViewMenuItem.mc +++ b/source/HomeAssistantViewMenuItem.mc @@ -28,7 +28,7 @@ class HomeAssistantViewMenuItem extends WatchUi.MenuItem { // definitions.get(...) are Strings here as they have been checked by HomeAssistantView first WatchUi.MenuItem.initialize( definition.get("name") as Lang.String, - "Menu", + WatchUi.loadResource($.Rez.Strings.MenuItemMenu) as Lang.String, definition.get("entity") as Lang.String, null ); diff --git a/source/ScalableView.mc b/source/ScalableView.mc new file mode 100644 index 0000000..9b93c1b --- /dev/null +++ b/source/ScalableView.mc @@ -0,0 +1,48 @@ +//----------------------------------------------------------------------------------- +// +// 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, 28 December 2022 +// +// +// Description: +// +// A view with added methods to scale from percentages of scrren size to pixels. +// +//----------------------------------------------------------------------------------- + +using Toybox.Lang; +using Toybox.WatchUi; +using Toybox.Math; + +class ScalableView extends WatchUi.View { + hidden var screenWidth; + + function initialize() { + View.initialize(); + } + + // Convert a fraction expressed as a percentage (%) to a number of pixels for the + // screen's dimensions. + // + // Parameters: + // * dc - Device context + // * pc - Percentage (%) expressed as a number in the range 0.0..100.0 + // + // Uses screen width rather than screen height as rectangular screens tend to have + // height > width. + // + function pixelsForScreen(pc as Lang.Float) as Lang.Number { + if (screenWidth == null) { + screenWidth = System.getDeviceSettings().screenWidth; + } + return Math.round(pc * screenWidth) / 100; + } +} diff --git a/translate.py b/translate.py new file mode 100644 index 0000000..d4592a5 --- /dev/null +++ b/translate.py @@ -0,0 +1,115 @@ +#################################################################################### +# +# 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") as f: + c = f.read().replace('\r', '') + for l in languages: + 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"] not in exceptionIds: + 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)) + os.makedirs(f"./resources-{l[0]}/strings/", exist_ok=True) + with open(f"./resources-{l[0]}/strings/strings.xml", "wb") as w: + w.write(soup.encode("utf-8")) + i += 1