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
+12 -12
View File
@@ -57,7 +57,7 @@ QNetworkReply *ApiClient::send(const QByteArray &verb, const QString &path,
{
const QString base = AiraJson::normalizeBaseUrl(m_settings ? m_settings->baseUrl() : QString());
if (base.isEmpty()) {
emit errorOccurred(QStringLiteral("Indirizzo del bridge non configurato"));
emit errorOccurred(tr("Bridge address not configured"));
return 0;
}
@@ -79,7 +79,7 @@ QNetworkReply *ApiClient::send(const QByteArray &verb, const QString &path,
void ApiClient::refresh()
{
if (!configured()) {
emit errorOccurred(QStringLiteral("Configura indirizzo e token del bridge"));
emit errorOccurred(tr("Set the bridge address and token"));
return;
}
@@ -99,7 +99,7 @@ void ApiClient::refresh()
if (reply->error() != QNetworkReply::NoError || status != 200) {
const QString msg = (reply->error() == QNetworkReply::OperationCanceledError)
? QStringLiteral("Server non raggiungibile (timeout)")
? tr("Server unreachable (timeout)")
: AiraJson::errorMessage(body, status);
qWarning() << "[api] summary non riuscito:" << status << msg;
emit errorOccurred(msg);
@@ -110,7 +110,7 @@ void ApiClient::refresh()
const QVariantMap summary = AiraJson::parseSummary(body, &ok);
if (!ok) {
qWarning() << "[api] riassunto non interpretabile";
emit errorOccurred(QStringLiteral("Risposta del bridge non interpretabile"));
emit errorOccurred(tr("Unreadable response from the bridge"));
return;
}
m_summary = summary;
@@ -122,7 +122,7 @@ void ApiClient::testConnection()
{
const QString base = AiraJson::normalizeBaseUrl(m_settings ? m_settings->baseUrl() : QString());
if (base.isEmpty()) {
emit connectionTested(false, QStringLiteral("Inserisci l'indirizzo del bridge"));
emit connectionTested(false, tr("Enter the bridge address"));
return;
}
@@ -138,12 +138,12 @@ void ApiClient::testConnection()
const int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (reply->error() != QNetworkReply::NoError || status != 200) {
const QString msg = (reply->error() == QNetworkReply::OperationCanceledError)
? QStringLiteral("Timeout: nessuna risposta")
: QStringLiteral("Irraggiungibile (HTTP %1)").arg(status);
? tr("Timeout: no response")
: tr("Unreachable (HTTP %1)").arg(status);
emit connectionTested(false, msg);
return;
}
emit connectionTested(true, QStringLiteral("Bridge raggiungibile"));
emit connectionTested(true, tr("Bridge reachable"));
});
}
@@ -160,7 +160,7 @@ QString ApiClient::formatValue(const QVariant &value) const
void ApiClient::sendCommand(const QString &id, const QVariant &value)
{
if (!configured()) {
emit commandFinished(false, QStringLiteral("Configura indirizzo e token del bridge"));
emit commandFinished(false, tr("Set the bridge address and token"));
return;
}
@@ -169,7 +169,7 @@ void ApiClient::sendCommand(const QString &id, const QVariant &value)
QNetworkReply *reply = send("POST", QStringLiteral("/command"), payload, 30);
if (!reply) {
emit commandFinished(false, QStringLiteral("Bridge non configurato"));
emit commandFinished(false, tr("Bridge not configured"));
return;
}
@@ -183,14 +183,14 @@ void ApiClient::sendCommand(const QString &id, const QVariant &value)
if (reply->error() != QNetworkReply::NoError || status != 200) {
const QString msg = (reply->error() == QNetworkReply::OperationCanceledError)
? QStringLiteral("Timeout: comando non inviato")
? tr("Timeout: command not sent")
: AiraJson::errorMessage(body, status);
qWarning() << "[api] comando" << id << "fallito:" << status << msg;
emit commandFinished(false, msg);
return;
}
emit commandFinished(true, QStringLiteral("Comando inviato"));
emit commandFinished(true, tr("Command sent"));
refresh(); // i valori letti cambiano: rileggo
});
}