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;