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:
Carlo
2026-10-10 08:19:20 +02:00
parent e0dcf1f830
commit fddd21e16a
29 changed files with 1230 additions and 190 deletions
+22 -17
View File
@@ -1,8 +1,10 @@
#include "airajson.h"
#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QLocale>
#include <QUrl>
namespace AiraJson {
@@ -49,35 +51,35 @@ QString modeLabel(const QString &operatingStatus)
{
const QString s = operatingStatus;
if (s == QLatin1String("OPERATING_STATUS_AUTO"))
return QStringLiteral("Automatico");
return QCoreApplication::translate("AiraJson", "Automatic");
if (s == QLatin1String("OPERATING_STATUS_HEATING"))
return QStringLiteral("Riscaldamento");
return QCoreApplication::translate("AiraJson", "Heating");
if (s == QLatin1String("OPERATING_STATUS_COOLING"))
return QStringLiteral("Raffrescamento");
return QCoreApplication::translate("AiraJson", "Cooling");
if (s == QLatin1String("OPERATING_STATUS_HOT_WATER"))
return QStringLiteral("Acqua calda");
return QCoreApplication::translate("AiraJson", "Hot water");
if (s == QLatin1String("OPERATING_STATUS_STANDBY"))
return QStringLiteral("Stand-by");
return QCoreApplication::translate("AiraJson", "Standby");
if (s == QLatin1String("OPERATING_STATUS_OFF"))
return QStringLiteral("Spento");
return QCoreApplication::translate("AiraJson", "Off");
// Stato della pompa per zona (state.zoneN_mode).
if (s == QLatin1String("PUMP_MODE_STATE_HEATING"))
return QStringLiteral("Riscaldamento");
return QCoreApplication::translate("AiraJson", "Heating");
if (s == QLatin1String("PUMP_MODE_STATE_COOLING"))
return QStringLiteral("Raffrescamento");
return QCoreApplication::translate("AiraJson", "Cooling");
if (s == QLatin1String("PUMP_MODE_STATE_HOT_WATER"))
return QStringLiteral("Acqua calda");
return QCoreApplication::translate("AiraJson", "Hot water");
if (s == QLatin1String("PUMP_MODE_STATE_IDLE"))
return QStringLiteral("In attesa");
return QCoreApplication::translate("AiraJson", "Idle");
if (s == QLatin1String("PUMP_MODE_STATE_STANDBY"))
return QStringLiteral("Stand-by");
return QCoreApplication::translate("AiraJson", "Standby");
if (s == QLatin1String("PUMP_MODE_STATE_OFF"))
return QStringLiteral("Spento");
return QCoreApplication::translate("AiraJson", "Off");
// Stato operativo della pompa (state.pump_active_state).
if (s == QLatin1String("PUMP_ACTIVE_STATE_IDLE"))
return QStringLiteral("Ferma");
return QCoreApplication::translate("AiraJson", "Stopped");
if (s == QLatin1String("PUMP_ACTIVE_STATE_RUNNING"))
return QStringLiteral("In funzione");
return QCoreApplication::translate("AiraJson", "Running");
if (s.isEmpty())
return QStringLiteral("—");
// Sconosciuto: togliamo il prefisso e mostriamo il resto, minuscolo.
@@ -97,7 +99,10 @@ QString formatValue(const QVariant &value)
bool isNumber = false;
const double d = value.toDouble(&isNumber);
if (isNumber)
return QString::number(d, 'f', 1);
// QLocale() = locale predefinito, che translator.cpp allinea alla lingua
// dell'app: separatore decimale col punto in inglese, con la virgola in
// italiano (QString::number darebbe sempre il punto).
return QLocale().toString(d, 'f', 1);
const QString s = value.toString();
return s.isEmpty() ? QStringLiteral("—") : s;
@@ -122,8 +127,8 @@ QString errorMessage(const QByteArray &body, int httpStatus)
return msg;
}
if (httpStatus == 0)
return QStringLiteral("server non raggiungibile");
return QStringLiteral("errore HTTP %1").arg(httpStatus);
return QCoreApplication::translate("AiraJson", "server unreachable");
return QCoreApplication::translate("AiraJson", "HTTP error %1").arg(httpStatus);
}
} // namespace AiraJson