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 0b651d22..51a7ab33 100644 Binary files a/ESP32_AP-Flasher/data/www/upload-demo.html.gz and b/ESP32_AP-Flasher/data/www/upload-demo.html.gz differ 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;