From 43fd751d1ef191e8eff3f286be0735be5264ef69 Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Sun, 31 Dec 2023 17:26:17 +0100 Subject: [PATCH] moved language strings to json file (don't forget to place languages.json in the file partition) --- ESP32_AP-Flasher/data/languages.json | 56 ++++++++++ ESP32_AP-Flasher/data/tagtypes/21.json | 2 +- ESP32_AP-Flasher/data/tagtypes/36.json | 2 +- ESP32_AP-Flasher/data/www/upload-demo.html.gz | Bin 481 -> 824 bytes ESP32_AP-Flasher/include/language.h | 28 +---- ESP32_AP-Flasher/src/contentmanager.cpp | 14 +-- ESP32_AP-Flasher/src/language.cpp | 99 ++++++------------ ESP32_AP-Flasher/src/tag_db.cpp | 8 +- 8 files changed, 106 insertions(+), 103 deletions(-) create mode 100644 ESP32_AP-Flasher/data/languages.json diff --git a/ESP32_AP-Flasher/data/languages.json b/ESP32_AP-Flasher/data/languages.json new file mode 100644 index 00000000..2234a892 --- /dev/null +++ b/ESP32_AP-Flasher/data/languages.json @@ -0,0 +1,56 @@ +{ + "0": { + "language": "en", + "daysShort": ["SU", "MO", "TU", "WE", "TH", "FR", "SA"], + "days": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + "months": ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] + }, + "1": { + "language": "nl", + "daysShort": ["ZO", "MA", "DI", "WO", "DO", "VR", "ZA"], + "days": ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], + "months": ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"] + }, + "2": { + "language": "de", + "daysShort": ["SO", "MO", "DI", "MI", "DO", "FR", "SA"], + "days": ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], + "months": ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"] + }, + "3": { + "language": "no", + "daysShort": ["SØ", "MA", "TI", "ON", "TO", "FR", "LØ"], + "days": ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag"], + "months": ["Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"] + }, + "5": { + "language": "cz", + "daysShort": ["NE", "PO", "ÚT", "ST", "ČT", "PÁ", "SO"], + "days": ["Neděle", "Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota"], + "months": ["Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec"] + }, + "6": { + "language": "sk", + "daysShort": ["NE", "PO", "UT", "ST", "ŠT", "PI", "SO"], + "days": ["Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok", "Sobota"], + "months": ["Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Oktober", "November", "December"] + }, + "7": { + "language": "pl", + "daysShort": ["Ni", "Po", "Wt", "Śr", "Cz", "Pt", "So"], + "days": ["Niedziela", "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota"], + "months": ["Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"] + }, + "8": { + "language": "es", + "daysShort": ["D", "L", "MA", "MI", "J", "V", "S"], + "days": ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"], + "months": ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"] + }, + "4": { + "language": "fr", + "daysShort": ["DI", "LU", "MA", "ME", "JE", "VE", "SA"], + "days": ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"], + "months": ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"] + } +} diff --git a/ESP32_AP-Flasher/data/tagtypes/21.json b/ESP32_AP-Flasher/data/tagtypes/21.json index 36a45807..95202a64 100644 --- a/ESP32_AP-Flasher/data/tagtypes/21.json +++ b/ESP32_AP-Flasher/data/tagtypes/21.json @@ -12,5 +12,5 @@ "shortlut": 0, "options": ["button", "customlut"], "contentids": [ 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 15, 16, 17, 18, 19, 20, 21 ], - "usetemplate": 1, + "usetemplate": 1 } diff --git a/ESP32_AP-Flasher/data/tagtypes/36.json b/ESP32_AP-Flasher/data/tagtypes/36.json index 6396331b..b0aa0ed4 100644 --- a/ESP32_AP-Flasher/data/tagtypes/36.json +++ b/ESP32_AP-Flasher/data/tagtypes/36.json @@ -14,5 +14,5 @@ "shortlut": 0, "options": ["button", "led"], "contentids": [ 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 17, 18, 19, 20], - "usetemplate": 31 + "usetemplate": 1 } diff --git a/ESP32_AP-Flasher/data/www/upload-demo.html.gz b/ESP32_AP-Flasher/data/www/upload-demo.html.gz index 0b651d2296aa60d493b6087b21e9bf9f4e5db6f7..51a7ab33fa84db3a5fe42ed2ad457eb8543efb77 100644 GIT binary patch delta 810 zcmV+_1J(TD1Gol|8-JBmT~FIE6nzG1|KXA+kXp*e##oeAVn8P(pw-%H;?a$78wBTOo(8Hc_$W!7l`%F&5Q=yj_3Du1jhE_)nH4Ry0(7FJNu zV^!}(*N`&>wMB4+u)yf20DrTxk_d%fg40mdwgBM^TR&vr*c_&-W~M`_~ zBPw?ak6OP1bCeW=Sg^V_If9-wbt@G|gjU_8Bg%QBHVIxF#EkTmY>LvCr4%erdiRP7lb$Oe zCf6j%Aw1pO0^{7EwQ1G~D|*?~#0)}JHK__L9Endr@Fp23(h>89qCw5S$_F=--Uub; z&Kns5-ra`!DLmEILBSRnJj}H*ekReFLT-Vlsuk)GH1nheA!!%%Pd#nH`^X^=#IH^R8AWr*MZe zMr}+%tB=|ot3{6M+IuXI+U;Go10`2+d(-X~?#f_ijd8PfI~L z7EIPOoNUhaR`I&)JC>y21IbyE!ZTeGOt!-KoPWlXhZIJni*B`1ZV*)iT}0?n)5*)V zQW$QO2E2^m&5&;0TJa|OIYyuL9`I$8i+27P=_(sZ#42*|=tv5V*59zf@Q7Ry@{7F^ z`|q`Lbjr^o@O2-!h@`)5fFHw$K_q*&2|o948*8`TryFD98QeNUI(}k>%-O9aeMWW! ofFs+j7e4ywaNW2pT*Tqt4jsul@dFgTO8z7F2bvVu{QL$00G!8=KmY&$ delta 464 zcmV;>0Wbcz2H^vc8-I;cOKaRP5I%3A|6!_A0!`dfD51!Pl4hZYkihO9avWQ;wm=Uf zjW^wYUp<`C9zp}gmgn)!_sxvthaV5O`=`e{nAn=`{X4mS^NCQU(?(iigki!EiCb~l zZ?A4daj<4X-A{`n!C^KY6>NR5vZ;=Q(X1fp*n4#@S<{zJk$?5D)Qn@vNXG1&yC=WE zfDV>Oz>|)E>2W~6(9VWn^3T8?<|R&`bK#hO5g144&oz=MI5ZF`oG3JL2zusg+01K& z^xnu^6_T*Yt5!Td?Dhi44Sb%d6?QSKXAIors4Inx0&rmMT`L-G$I4t3U7O7d=0+Oq z$z(wZ0|(LFxqn0@k^2fhz)j-E1oz)>0hJ0A<2Tuqj867pMbK_u7%B};N(5+C!N8%V z6}QF~L9Y@}nkNdP+ZumXuw&A$r!YdbYd6Bhr`8{jAK`QB-Q`=UtgtJamm+T=RHh}m z9T^%p52_gQ^lCe=;eLq>6Q1(m2?ifRj!d2MX35RZI7!8ohkX$|BWE3XM~v~$q%Qx{ z(W5q0WmGb&iei3U!`}#T>8(z!IH6h6@8QoP{F5uo;*@nOHrcGpUv5ObV7~!Ta<4^t G0{{S)rQ@yu diff --git a/ESP32_AP-Flasher/include/language.h b/ESP32_AP-Flasher/include/language.h index 68d3b0f0..edb2991d 100644 --- a/ESP32_AP-Flasher/include/language.h +++ b/ESP32_AP-Flasher/include/language.h @@ -2,30 +2,8 @@ #include -extern int defaultLanguage; - -/*EN English language section*/ -extern String languageEnDaysShort[]; -extern String languageEnDays[]; -extern String languageEnMonth[]; -/*END English language section END*/ - -/*NL Dutch language section*/ -extern String languageNlDaysShort[]; -extern String languageNlDays[]; -extern String languageNlMonth[]; -/*END Dutch language section END*/ - -/*DE German language section*/ -extern String languageDeDaysShort[]; -extern String languageDeDays[]; -extern String languageDeMonth[]; -/*END German language section END*/ - -extern String* languageDaysShort[]; -extern String* languageDays[]; -extern String* languageMonth[]; +extern String languageDaysShort[7]; +extern String languageDays[7]; +extern String languageMonth[12]; extern void updateLanguageFromConfig(); -extern int getDefaultLanguage(); -extern int getCurrentLanguage(); diff --git a/ESP32_AP-Flasher/src/contentmanager.cpp b/ESP32_AP-Flasher/src/contentmanager.cpp index 1df6a673..0123764c 100644 --- a/ESP32_AP-Flasher/src/contentmanager.cpp +++ b/ESP32_AP-Flasher/src/contentmanager.cpp @@ -624,7 +624,7 @@ void drawDate(String &filename, tagRecord *&taginfo, imgParam &imageParams) { const int year_number = timeinfo.tm_year + 1900; if (taginfo->hwType == SOLUM_SEG_UK) { - sprintf(imageParams.segments, "%2d%2d%-2.2s%04d", timeinfo.tm_mday, month_number + 1, languageDays[getCurrentLanguage()][timeinfo.tm_wday], year_number); + sprintf(imageParams.segments, "%2d%2d%-2.2s%04d", timeinfo.tm_mday, month_number + 1, languageDays[timeinfo.tm_wday], year_number); imageParams.symbols = 0x04; return; } @@ -638,14 +638,14 @@ void drawDate(String &filename, tagRecord *&taginfo, imgParam &imageParams) { const auto &date = loc["date"]; const auto &weekday = loc["weekday"]; if (date) { - drawString(spr, languageDays[getCurrentLanguage()][timeinfo.tm_wday], weekday[0], weekday[1], weekday[2], TC_DATUM, TFT_RED); - drawString(spr, String(timeinfo.tm_mday) + " " + languageMonth[getCurrentLanguage()][timeinfo.tm_mon], date[0], date[1], date[2], TC_DATUM); + drawString(spr, languageDays[timeinfo.tm_wday], weekday[0], weekday[1], weekday[2], TC_DATUM, TFT_RED, weekday[3]); + drawString(spr, String(timeinfo.tm_mday) + " " + languageMonth[timeinfo.tm_mon], date[0], date[1], date[2], TC_DATUM, TFT_BLACK, date[3]); } else { const auto &month = loc["month"]; const auto &day = loc["day"]; - drawString(spr, languageDays[getCurrentLanguage()][timeinfo.tm_wday], weekday[0], weekday[1], weekday[2], TC_DATUM, TFT_BLACK); - drawString(spr, String(languageMonth[getCurrentLanguage()][timeinfo.tm_mon]), month[0], month[1], month[2], TC_DATUM); - drawString(spr, String(timeinfo.tm_mday), day[0], day[1], day[2], TC_DATUM, TFT_RED); + drawString(spr, languageDays[timeinfo.tm_wday], weekday[0], weekday[1], weekday[2], TC_DATUM, TFT_BLACK, weekday[3]); + drawString(spr, String(languageMonth[timeinfo.tm_mon]), month[0], month[1], month[2], TC_DATUM, TFT_BLACK, month[3]); + drawString(spr, String(timeinfo.tm_mday), day[0], day[1], day[2], TC_DATUM, TFT_RED, day[3]); } spr2buffer(spr, filename, imageParams); @@ -838,7 +838,7 @@ void drawForecast(String &filename, JsonObject &cfgobj, const tagRecord *taginfo const time_t weatherday = (daily["time"][dag].as() + utc_offset); const struct tm *datum = localtime(&weatherday); - drawString(spr, String(languageDaysShort[getCurrentLanguage()][datum->tm_wday]), dag * column1 + day[0].as(), day[1], day[2], TC_DATUM, TFT_BLACK); + drawString(spr, String(languageDaysShort[datum->tm_wday]), dag * column1 + day[0].as(), day[1], day[2], TC_DATUM, TFT_BLACK); uint8_t weathercode = daily["weathercode"][dag].as(); if (weathercode > 40) weathercode -= 40; diff --git a/ESP32_AP-Flasher/src/language.cpp b/ESP32_AP-Flasher/src/language.cpp index 2e40fc95..4f710916 100644 --- a/ESP32_AP-Flasher/src/language.cpp +++ b/ESP32_AP-Flasher/src/language.cpp @@ -1,71 +1,18 @@ #include "language.h" #include +#include +#include #include "settings.h" +#include "storage.h" #include "tag_db.h" -int defaultLanguage = 0; +String languageDaysShort[7]; +String languageDays[7]; +String languageMonth[12]; -/*EN English language section*/ -String languageEnDaysShort[] = {"SU", "MO", "TU", "WE", "TH", "FR", "SA"}; -String languageEnDays[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; -String languageEnMonth[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; -/*END English language section END*/ - -/*NL Dutch language section*/ -String languageNlDaysShort[] = {"ZO", "MA", "DI", "WO", "DO", "VR", "ZA"}; -String languageNlDays[] = {"zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"}; -String languageNlMonth[] = {"januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"}; -/*END Dutch language section END*/ - -/*DE German language section*/ -String languageDeDaysShort[] = {"SO", "MO", "DI", "MI", "DO", "FR", "SA"}; -String languageDeDays[] = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"}; -String languageDeMonth[] = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"}; -/*END German language section END*/ - -/*NO Norwegian language section*/ -String languageNoDaysShort[] = {"SØ", "MA", "TI", "ON", "TO", "FR", "LØ"}; -String languageNoDays[] = {"Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag"}; -String languageNoMonth[] = {"Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"}; -/*END Norwegian language section END*/ - -/*CZ Czech language section*/ -String languageCzDaysShort[] = {"NE", "PO", "ÚT", "ST", "ČT", "PÁ", "SO"}; -String languageCzDays[] = {"Neděle", "Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota"}; -String languageCzMonth[] = {"Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec"}; -/*END Czech language section END*/ - -/*SK Slovak language section*/ -String languageSkDaysShort[] = {"NE", "PO", "UT", "ST", "ŠT", "PI", "SO"}; -String languageSkDays[] = {"Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok", "Sobota"}; -String languageSkMonth[] = {"Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Oktober", "November", "December"}; -/*END Slovak language section END*/ - -/*PL Polish language section*/ -String languagePlDaysShort[] = {"Ni", "Po", "Wt", "Śr", "Cz", "Pt", "So"}; -String languagePlDays[] = {"Niedziela", "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota"}; -String languagePlMonth[] = {"Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"}; -/*END Polish language section END*/ - -/*ES Spanish language section*/ -String languageEsDaysShort[] = {"D", "L", "MA", "MI", "J", "V", "S"}; -String languageEsDays[] = {"Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"}; -String languageEsMonth[] = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"}; -/*END Spanish language section END*/ - -/*FR French language section*/ -String languageFrDaysShort[] = {"DI", "LU", "MA", "ME", "JE", "VE", "SA"}; -String languageFrDays[] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"}; -String languageFrMonth[] = {"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"}; -/*END French language section END*/ - -String* languageDaysShort[] = {languageEnDaysShort, languageNlDaysShort, languageDeDaysShort, languageNoDaysShort, languageFrDaysShort, languageCzDaysShort, languageSkDaysShort, languagePlDaysShort, languageEsDaysShort}; -String* languageDays[] = {languageEnDays, languageNlDays, languageDeDays, languageNoDays, languageFrDays, languageCzDays, languageSkDays, languagePlDays, languageEsDays}; -String* languageMonth[] = {languageEnMonth, languageNlMonth, languageDeMonth, languageNoMonth, languageFrMonth, languageCzMonth, languageSkMonth, languagePlMonth, languageEsMonth}; - -int currentLanguage = defaultLanguage; +int currentLanguage = 0; void updateLanguageFromConfig() { int tempLang = config.language; @@ -74,12 +21,30 @@ void updateLanguageFromConfig() { return; } currentLanguage = tempLang; + + File file = contentFS->open("/languages.json", "r"); + if (!file) { + Serial.println("Failed to open languages.json file"); + return; + } + + DynamicJsonDocument doc(1024); + StaticJsonDocument<80> filter; + filter[String(currentLanguage)] = true; + const DeserializationError error = deserializeJson(doc, file, DeserializationOption::Filter(filter)); + file.close(); + if (error) { + Serial.print("Failed to parse JSON: "); + Serial.println(error.c_str()); + return; + } + JsonObject languageObject = doc[String(currentLanguage)]; + for (int i = 0; i < 7; ++i) { + languageDaysShort[i] = languageObject["daysShort"][i].as(); + languageDays[i] = languageObject["days"][i].as(); + } + for (int i = 0; i < 12; ++i) { + languageMonth[i] = languageObject["months"][i].as(); + } } -int getDefaultLanguage() { - return defaultLanguage; -} - -int getCurrentLanguage() { - return currentLanguage; -} diff --git a/ESP32_AP-Flasher/src/tag_db.cpp b/ESP32_AP-Flasher/src/tag_db.cpp index e54d87a8..98f72700 100644 --- a/ESP32_AP-Flasher/src/tag_db.cpp +++ b/ESP32_AP-Flasher/src/tag_db.cpp @@ -134,8 +134,12 @@ void saveDB(const String& filename) { fs::File existingFile = contentFS->open(filename, "r"); if (existingFile) { existingFile.close(); + vTaskDelay(pdMS_TO_TICKS(100)); String backupFilename = filename + ".bak"; - contentFS->rename(filename.c_str(), backupFilename.c_str()); + if (!contentFS->rename(filename.c_str(), backupFilename.c_str())) { + logLine("error renaming tagDB to .bak"); + wsErr("error renaming tagDB to .bak"); + } } fs::File file = contentFS->open(filename, "w"); @@ -317,7 +321,7 @@ void initAPconfig() { if (APconfig["alias"]) strlcpy(config.alias, APconfig["alias"], sizeof(config.alias)); config.led = APconfig["led"] | 255; config.tft = APconfig["tft"] | 255; - config.language = APconfig["language"] | getDefaultLanguage(); + config.language = APconfig["language"] | 0; config.maxsleep = APconfig["maxsleep"] | 10; config.stopsleep = APconfig["stopsleep"] | 1; config.preview = APconfig["preview"] | 1;