From ea49b0eeb8e3db9fae4b32ab4ea8961c70c83206 Mon Sep 17 00:00:00 2001 From: emeric Date: Wed, 30 Oct 2024 18:17:58 +0100 Subject: [PATCH] Better localized strings for date/numbers, fixes #539 --- approot/messages.xml | 11 ++++-- approot/messages_en-US.xml | 12 +++++++ approot/messages_fr.xml | 41 +++++++++++++++++++-- approot/messages_it.xml | 41 +++++++++++++++++++-- approot/messages_pl.xml | 49 ++++++++++++++++++++++++-- approot/messages_zh.xml | 11 ++++-- src/lms/ui/LmsApplication.cpp | 15 +++++++- src/lms/ui/admin/ScannerController.cpp | 19 ++++------ 8 files changed, 175 insertions(+), 24 deletions(-) create mode 100644 approot/messages_en-US.xml diff --git a/approot/messages.xml b/approot/messages.xml index 4e69a9a8..e34e36cf 100644 --- a/approot/messages.xml +++ b/approot/messages.xml @@ -34,6 +34,13 @@ User + +. +, +MM/dd/yyyy +HH:mm:ss +MM/dd/yyyy HH:mm:ss + Artist not found Error occured! @@ -99,7 +106,7 @@ Get report Last scan Not available -Scanned {1} files in {2} on {3} ({4} errors, {5} duplicates) +{1} files were scanned in {2} at {4} on {3} (UTC) - {5} errors, {6} duplicates No audio track Duplicated file hash Duplicated track MBID @@ -108,7 +115,7 @@ Scanner Status Not scheduled -Scheduled on {1} +Scheduled at {2} on {1} (UTC) Scanning: step {1}/{2} Associating artist images: {1}%... Associating external lyrics: {1}%... diff --git a/approot/messages_en-US.xml b/approot/messages_en-US.xml new file mode 100644 index 00000000..77611a53 --- /dev/null +++ b/approot/messages_en-US.xml @@ -0,0 +1,12 @@ + + + + +. +, +MM/dd/yyyy +hh:mm:ss a +MM/dd/yyyy hh:mm:ss a + + \ No newline at end of file diff --git a/approot/messages_fr.xml b/approot/messages_fr.xml index d9b6f1e1..99291866 100644 --- a/approot/messages_fr.xml +++ b/approot/messages_fr.xml @@ -34,6 +34,13 @@ Utilisateur + +, + +dd/MM/yyyy +HH:mm:ss +dd/MM/yyyy HH:mm:ss + Cet artiste n'existe pas Une erreur est survenue! @@ -99,7 +106,7 @@ Rapport Dernier scan Non disponible -{1} fichiers scannés en {2} le {3} ({4} erreurs, {5} duplicatas) +{1} fichiers analysés en {2} à {4} le {3} (UTC) - {5} erreurs, {6} duplicatas Pas de piste audio Hash dupliqué Track MBID dupliqué @@ -108,7 +115,7 @@ Scanner Statut Non planifié -Planifié le {1} +Planifié à {2} le {1} (UTC) En cours de scan : étape {1}/{2} Association des images des artistes: {1}%... Association des paroles externes: {1}%... @@ -331,6 +338,36 @@ Paramètres sauvegardés ! +moins d'une seconde + + une second + {1} secondes + + + une minute + {1} minutes + + + une houre + {1} houres + + + un jour + {1} jours + + + une semaine + {1} semaines + + + un mois + {1} mois + + + une année + {1} années + + Oui Non Ce champ ne peut pas être vide diff --git a/approot/messages_it.xml b/approot/messages_it.xml index 9c342433..749ca015 100644 --- a/approot/messages_it.xml +++ b/approot/messages_it.xml @@ -34,6 +34,13 @@ Utente + +, +. +dd/MM/yyyy +HH:mm:ss +dd/MM/yyyy HH:mm:ss + Artista non trovato C'è stato un errore! @@ -99,7 +106,7 @@ Scarica un resoconto Ultima scansione Non disponibile -Scansionati {1} files in {2} su {3} ({4} errori, {5} duplicati) +{1} file scansionati in {2} alle {3} il {4} (UTC) - {5} errori, {6} duplicati Nessuna traccia audio Hash doppio Track MBID doppio @@ -108,7 +115,7 @@ Scanner Stato Non pianificato -Pianificato il {1} +Programmato alle {2} del {1} (UTC) Scansione: passo {1}/{2} Associando immagini degli artisti: {1}%... Associazione dei testi esterni: {1}%... @@ -331,6 +338,36 @@ Nuove impostazioni salvate! +meno di un secondo + + un secondo + {1} secondi + + + un minuto + {1} minuti + + + un'ora + {1} ore + + + un giorno + {1} giorni + + + una settimana + {1} settimane + + + un mese + {1} mesi + + + un anno + {1} anni + + Si No Questo campo non può essere vuoto diff --git a/approot/messages_pl.xml b/approot/messages_pl.xml index 242a3c87..ae9bf9c4 100644 --- a/approot/messages_pl.xml +++ b/approot/messages_pl.xml @@ -35,6 +35,13 @@ Użytkownik + +, + +dd.MM.yyyy +HH:mm:ss +dd.MM.yyyy HH:mm:ss + Artysta nie odnaleziony Wystąpił błąd! @@ -108,7 +115,7 @@ Pokaż raport Ostatnie skanowanie Niedostępne -Przeskanowano {1} plików w {2} o {3} ({4} błędów, {5} duplikatów) +Przeskanowano {1} plików w {2} o {4} dnia {3} (UTC) - {5} błędów, {6} duplikatów Brak ścieżki dźwiękowej Zduplikowny hash pliku Zduplikowany MBID pliku @@ -117,7 +124,7 @@ Skaner Status Nie zaplanowano -Zaplanowano na {1} +Zaplanowano o {2} dnia {1} (UTC) Skanowanie: krok {1}/{2} Kojarzenie obrazów artystów: {1}%... Kojarzenie zewnętrznych tekstów: {1}%... @@ -356,4 +363,42 @@ Nigdy Ustawienia zapisane! + +mniej niż sekunda + + jedna sekunda + {1} sekundy + {1} sekund + + + jedna minuta + {1} minuty + {1} minut + + + jedna godzina + {1} godziny + {1} godzin + + + jeden dzień + {1} dni + {1} dni + + + jeden tydzień + {1} tygodnie + {1} tygodni + + + jeden miesiąc + {1} miesiące + {1} miesięcy + + + jeden rok + {1} lata + {1} lat + + diff --git a/approot/messages_zh.xml b/approot/messages_zh.xml index 7b43987e..7b44aa1e 100644 --- a/approot/messages_zh.xml +++ b/approot/messages_zh.xml @@ -34,6 +34,13 @@ 用户 + +. +, +yyyy/MM/dd +HH:mm:ss +yyyy/MM/dd HH:mm:ss + 歌手未找到 发生错误! @@ -99,7 +106,7 @@ 生成报告 最后扫描 不可用 -在 {2} 内扫描了 {3} 中的 {1} 个文件({4} 个错误, {5} 个副本) +已扫描 {1} 个文件,用时 {2},在 {3} 的 {4} (UTC) - {5} 个错误,{6} 个重复项 没有音轨 相同文件哈希值 相同 MBID @@ -108,7 +115,7 @@ 扫描器 状态 无计划 -计划于 {1} +计划于 {2} 在 {1} (UTC) 扫描中: 阶段 {1}/{2} diff --git a/src/lms/ui/LmsApplication.cpp b/src/lms/ui/LmsApplication.cpp index 1e5ca064..71d9249b 100644 --- a/src/lms/ui/LmsApplication.cpp +++ b/src/lms/ui/LmsApplication.cpp @@ -111,6 +111,18 @@ namespace lms::ui return res; } + Wt::WLocale createLocale(const std::string& name) + { + Wt::WLocale locale{ name }; + locale.setDecimalPoint(Wt::WString::tr("Lms.locale.decimal-point").toUTF8()); + locale.setGroupSeparator(Wt::WString::tr("Lms.locale.group-separator").toUTF8()); + locale.setDateFormat(Wt::WString::tr("Lms.locale.date-format").toUTF8()); + locale.setTimeFormat(Wt::WString::tr("Lms.locale.time-format").toUTF8()); + locale.setDateTimeFormat(Wt::WString::tr("Lms.locale.date-time-format").toUTF8()); + + return locale; + } + enum IdxRoot { IdxExplore = 0, @@ -274,6 +286,7 @@ namespace lms::ui setTitle(); setLocalizedStrings(getOrCreateMessageBundle()); + setLocale(createLocale(Wt::WLocale::currentLocale().name())); // Handle Media Scanner events and other session events enableUpdates(true); @@ -362,7 +375,7 @@ namespace lms::ui setUserInfo(userId, strongAuth); - LMS_LOG(UI, INFO, "User '" << getUserLoginName() << "' logged in from '" << environment().clientAddress() << "', user agent = " << environment().userAgent()); + LMS_LOG(UI, INFO, "User '" << getUserLoginName() << "' logged in from '" << environment().clientAddress() << "', user agent = " << environment().userAgent() << ", locale = '" << locale().name() << "'"); _appManager.registerApplication(*this); _appManager.applicationRegistered.connect(this, [this](LmsApplication& otherApplication) { diff --git a/src/lms/ui/admin/ScannerController.cpp b/src/lms/ui/admin/ScannerController.cpp index a2cfbf29..8070d7dd 100644 --- a/src/lms/ui/admin/ScannerController.cpp +++ b/src/lms/ui/admin/ScannerController.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -40,17 +41,7 @@ namespace lms::ui { std::string durationToString(const Wt::WDateTime& begin, const Wt::WDateTime& end) { - const auto secs{ std::chrono::duration_cast(end.toTimePoint() - begin.toTimePoint()).count() }; - - std::ostringstream oss; - - if (secs >= 3600) - oss << secs / 3600 << "h"; - if (secs >= 60) - oss << std::setw(2) << std::setfill('0') << (secs % 3600) / 60 << "m"; - oss << std::setw(2) << std::setfill('0') << (secs % 60) << "s"; - - return oss.str(); + return begin.timeTo(end).toUTF8(); } } // namespace @@ -222,7 +213,8 @@ namespace lms::ui _lastScanStatus->setText(Wt::WString::tr("Lms.Admin.ScannerController.last-scan-status") .arg(status.lastCompleteScanStats->nbFiles()) .arg(durationToString(status.lastCompleteScanStats->startTime, status.lastCompleteScanStats->stopTime)) - .arg(status.lastCompleteScanStats->stopTime.toString()) + .arg(status.lastCompleteScanStats->stopTime.date().toString(Wt::WLocale::currentLocale().dateFormat())) + .arg(status.lastCompleteScanStats->stopTime.time().toString(Wt::WLocale::currentLocale().timeFormat())) .arg(status.lastCompleteScanStats->errors.size()) .arg(status.lastCompleteScanStats->duplicates.size())); @@ -249,7 +241,8 @@ namespace lms::ui case IScannerService::State::Scheduled: _status->setText(Wt::WString::tr("Lms.Admin.ScannerController.status-scheduled") - .arg(status.nextScheduledScan.toString())); + .arg(status.nextScheduledScan.date().toString(Wt::WLocale::currentLocale().dateFormat())) + .arg(status.nextScheduledScan.time().toString(Wt::WLocale::currentLocale().timeFormat()))); _stepStatus->setText(""); break;