0.4.0: interfaccia in italiano e inglese, scelta nelle impostazioni
L'inglese è la lingua sorgente delle stringhe; l'italiano sta nel catalogo translations/harbour-aira-it.ts (99 stringhe), che lupdate aggiorna e lrelease compila in build. Di serie la lingua del sistema, con ripiego sull'inglese. - nuova classe Translator: risolve la lingua prima di createView e allinea QLocale::setDefault, così anche i numeri seguono la lingua (23,0 °C in italiano, 23.0 °C in inglese) — le temperature passano da formatValue, non più dal toFixed() di JavaScript che metteva sempre il punto - Qt 5.6 non ha QQmlEngine::retranslate(): al cambio di lingua la radice QML viene ricaricata (setSource ricrea il componente anche a url invariata) - le etichette di stato in airajson.cpp usano QCoreApplication::translate per esteso: lupdate non riconosce una funzione wrapper e le avrebbe perse - selettore della lingua in Impostazioni (Sistema / English / Italiano) - test: 41/41, carica il .qm vero come fa main.cpp e verifica entrambe le lingue, il ripiego e i formati numerici - anteprime bilingui (docs/anteprima/ inglese, it/ italiano), README e PIANO aggiornati, spec RPM con i cataloghi in %files
This commit is contained in:
+66
-15
@@ -8,7 +8,9 @@
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
#include <QDebug>
|
||||
#include <QLocale>
|
||||
#include <QStringList>
|
||||
#include <QTranslator>
|
||||
|
||||
#include "../src/airajson.h"
|
||||
|
||||
@@ -59,25 +61,46 @@ int main(int argc, char *argv[])
|
||||
"ok=true senza summary -> vuoto");
|
||||
|
||||
// ---- modeLabel -------------------------------------------------------- //
|
||||
check(AiraJson::modeLabel("OPERATING_STATUS_AUTO") == "Automatico", "AUTO -> Automatico");
|
||||
check(AiraJson::modeLabel("OPERATING_STATUS_HOT_WATER") == "Acqua calda", "acqua calda");
|
||||
// Attese in inglese: e' la lingua SORGENTE delle stringhe (l'italiano arriva
|
||||
// dal catalogo caricato piu' avanti).
|
||||
check(AiraJson::modeLabel("OPERATING_STATUS_AUTO") == "Automatic", "AUTO -> Automatic");
|
||||
check(AiraJson::modeLabel("OPERATING_STATUS_HOT_WATER") == "Hot water", "hot water");
|
||||
check(AiraJson::modeLabel("") == "—", "stato vuoto -> trattino");
|
||||
check(AiraJson::modeLabel("PUMP_MODE_STATE_HEATING") == "Riscaldamento",
|
||||
"stato zona: riscaldamento");
|
||||
check(AiraJson::modeLabel("PUMP_MODE_STATE_IDLE") == "In attesa",
|
||||
"stato zona: in attesa");
|
||||
check(AiraJson::modeLabel("PUMP_MODE_STATE_HEATING") == "Heating",
|
||||
"zone state: heating");
|
||||
check(AiraJson::modeLabel("PUMP_MODE_STATE_IDLE") == "Idle",
|
||||
"zone state: idle");
|
||||
check(AiraJson::modeLabel("PUMP_MODE_STATE_IGNOTO") == "ignoto",
|
||||
"stato zona sconosciuto -> senza prefisso");
|
||||
check(AiraJson::modeLabel("PUMP_ACTIVE_STATE_IDLE") == "Ferma",
|
||||
"pompa ferma");
|
||||
check(AiraJson::modeLabel("PUMP_ACTIVE_STATE_RUNNING") == "In funzione",
|
||||
"pompa in funzione");
|
||||
"unknown zone state -> prefix stripped");
|
||||
check(AiraJson::modeLabel("PUMP_ACTIVE_STATE_IDLE") == "Stopped",
|
||||
"pump stopped");
|
||||
check(AiraJson::modeLabel("PUMP_ACTIVE_STATE_RUNNING") == "Running",
|
||||
"pump running");
|
||||
check(AiraJson::modeLabel("OPERATING_STATUS_DEFROST") == "defrost",
|
||||
"stato sconosciuto: prefisso tolto, minuscolo");
|
||||
"unknown state: prefix stripped, lowercase");
|
||||
|
||||
// ---- formatValue ------------------------------------------------------ //
|
||||
check(AiraJson::formatValue(QVariant(51.0)) == "51.0", "numero a un decimale");
|
||||
// Il separatore decimale segue il locale predefinito (che translator.cpp
|
||||
// allinea alla lingua scelta): qui si fissa per rendere l'esito deterministico
|
||||
// e si verifica che cambi davvero con la lingua.
|
||||
QLocale::setDefault(QLocale::c());
|
||||
check(AiraJson::formatValue(QVariant(51.0)) == "51.0", "numero a un decimale (locale C)");
|
||||
check(AiraJson::formatValue(QVariant(18.14)) == "18.1", "arrotondamento a un decimale");
|
||||
QLocale::setDefault(QLocale(QLocale::Italian, QLocale::Italy));
|
||||
check(AiraJson::formatValue(QVariant(23.0)) == "23,0", "in italiano separatore virgola");
|
||||
check(AiraJson::formatValue(QVariant(18.14)) == "18,1", "in italiano arrotonda con la virgola");
|
||||
QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedKingdom));
|
||||
check(AiraJson::formatValue(QVariant(23.0)) == "23.0", "in inglese separatore punto");
|
||||
QLocale::setDefault(QLocale::c());
|
||||
|
||||
// Invariante su cui poggia Translator::apply(""): QLocale::system() non risente
|
||||
// di setDefault(), quindi "lingua vuota" torna sempre alla lingua del telefono
|
||||
// anche dopo che l'utente ha scelto l'italiano. (QLocale() invece cambierebbe.)
|
||||
const QLocale systemBefore = QLocale::system();
|
||||
QLocale::setDefault(QLocale(QLocale::Italian, QLocale::Italy));
|
||||
check(QLocale::system() == systemBefore, "setDefault non tocca QLocale::system()");
|
||||
check(QLocale() == QLocale(QLocale::Italian, QLocale::Italy), "QLocale() segue setDefault");
|
||||
QLocale::setDefault(QLocale::c());
|
||||
check(AiraJson::formatValue(QVariant()) == "—", "valore assente -> trattino");
|
||||
check(AiraJson::formatValue(QVariant(QString())) == "—", "stringa vuota -> trattino");
|
||||
|
||||
@@ -94,8 +117,36 @@ int main(int argc, char *argv[])
|
||||
// ---- errorMessage ----------------------------------------------------- //
|
||||
check(AiraJson::errorMessage(R"({"ok":false,"error":"token mancante o errato"})", 401)
|
||||
== "token mancante o errato", "messaggio d'errore dal corpo");
|
||||
check(AiraJson::errorMessage("", 502) == "errore HTTP 502", "fallback sullo stato HTTP");
|
||||
check(AiraJson::errorMessage("", 0) == "server non raggiungibile", "stato 0 = irraggiungibile");
|
||||
check(AiraJson::errorMessage("", 502) == "HTTP error 502", "http status fallback");
|
||||
check(AiraJson::errorMessage("", 0) == "server unreachable", "status 0 = unreachable");
|
||||
|
||||
// ---- catalogo italiano: il .qm caricato davvero ------------------------ //
|
||||
// Non basta che il .ts esista: qui si installa il .qm come fa main.cpp e si
|
||||
// controlla che le stringhe sorgente inglesi diventino italiane. Il percorso
|
||||
// si puo' passare come argv[1]; il default e' quello relativo alla cartella
|
||||
// di build del test (tests/build).
|
||||
{
|
||||
const QString qm = (argc > 1) ? QString::fromLocal8Bit(argv[1])
|
||||
: QStringLiteral("../../translations/harbour-aira-it.qm");
|
||||
QTranslator translator;
|
||||
if (translator.load(qm)) {
|
||||
QCoreApplication::installTranslator(&translator);
|
||||
check(AiraJson::modeLabel("PUMP_MODE_STATE_HEATING") == "Riscaldamento",
|
||||
"catalogo it: Heating -> Riscaldamento");
|
||||
check(AiraJson::modeLabel("PUMP_ACTIVE_STATE_IDLE") == "Ferma",
|
||||
"catalogo it: Stopped -> Ferma");
|
||||
check(AiraJson::modeLabel("PUMP_MODE_STATE_IDLE") == "In attesa",
|
||||
"catalogo it: Idle -> In attesa");
|
||||
check(AiraJson::errorMessage("", 0) == "server non raggiungibile",
|
||||
"catalogo it: messaggio d'errore tradotto");
|
||||
QCoreApplication::removeTranslator(&translator);
|
||||
check(AiraJson::modeLabel("PUMP_MODE_STATE_HEATING") == "Heating",
|
||||
"catalogo rimosso: si torna all'inglese (ripiego)");
|
||||
} else {
|
||||
qWarning() << "SALTO il controllo del catalogo: .qm non trovato in" << qm
|
||||
<< "-> lancialo con lrelease, oppure passa il percorso come argomento";
|
||||
}
|
||||
}
|
||||
|
||||
qInfo() << "----";
|
||||
qInfo() << checks - failures << "/" << checks << "verifiche superate";
|
||||
|
||||
Reference in New Issue
Block a user