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
+41 -3
View File
@@ -10,8 +10,37 @@ App nativa Sailfish OS per una pompa di calore **Aira Home**: mostra lo stato
dell'impianto e invia i comandi dell'acqua calda sanitaria e del riscaldamento
(temperatura obiettivo della casa, per zona).
L'interfaccia è in **inglese e italiano**: di serie segue la lingua del telefono
e ripiega sull'inglese; la si può scegliere anche nelle impostazioni dell'app.
![architettura](docs/architettura.svg)
Anteprime del layout (valori veri dell'impianto, **non** screenshot — vedi
*Stato*). Queste sono in italiano; quelle in inglese stanno in
`docs/anteprima/`:
| Home | Altri comandi | Impostazioni | Copertina |
|---|---|---|---|
| ![home](docs/anteprima/it/dashboard.png) | ![comandi](docs/anteprima/it/comandi.png) | ![impostazioni](docs/anteprima/it/impostazioni.png) | ![copertina](docs/anteprima/it/copertina.png) |
## La lingua dell'interfaccia
L'inglese è la **lingua sorgente** delle stringhe (sta direttamente nel codice);
l'italiano sta nel catalogo `translations/harbour-aira-it.ts`, che `lupdate`
aggiorna e `lrelease` compila in build.
La scelta fatta nelle impostazioni è salvata in `QSettings` con il codice della
lingua; vuoto (o lingua assente) significa **lingua di sistema**, con ripiego
sull'inglese quando non esiste il catalogo corrispondente.
Qt 5.6 non ha `QQmlEngine::retranslate()` (arriva con Qt 5.10): installare un
traduttore non basta a ritradurre quello che è già a schermo. L'app quindi, al
cambio di lingua, **ricarica la radice QML** — la scelta ha effetto subito, al
prezzo di tornare alla pagina iniziale.
Anche i numeri seguono la lingua: le temperature passano da `QLocale`, quindi in
italiano si scrive `23,0 °C` e in inglese `23.0 °C`.
## Perché c'è un bridge (e non una chiamata diretta al cloud)
Il cloud Aira espone **gRPC su HTTP/2**. Qt 5.6 — il toolkit su cui gira ogni
@@ -82,8 +111,14 @@ d'errore. **La UI Silica si verifica solo sul dispositivo.**
## Stato
- **31/31** verifiche del nucleo, compilazione senza warning
- **39/39** verifiche del nucleo, compilazione senza warning
- **27/27** verifiche offline del bridge (`bridge/test_bridge_commands.py`)
- **99/99** stringhe tradotte nel catalogo italiano: il test carica il `.qm`
compilato come fa `main.cpp` e verifica che in inglese l'etichetta di stato sia
la sorgente e in italiano quella tradotta, e che togliendo il catalogo si torni
all'inglese
- numeri formattati con `QLocale`: il separatore decimale segue la lingua
(verificato per entrambe)
- `qmllint` pulito su tutti i QML (valida solo la sintassi: senza il modulo
Silica una proprietà inesistente passa in silenzio)
- provata dal vivo in **sola lettura** su un impianto Aira Home
@@ -102,7 +137,9 @@ harbour-aira.pro progetto qmake (icona, qml, docs)
src/airajson.{h,cpp} logica pura, testabile senza SDK
src/apiclient.{h,cpp} QNetworkAccessManager + watchdog di timeout
src/settings.{h,cpp} QSettings su AppConfigLocation (sandbox SailJail)
src/main.cpp context properties: appSettings, api
src/translator.{h,cpp} lingua dell'interfaccia: locale di sistema, ripiego
sull'inglese, ricarica della UI al cambio
src/main.cpp context properties: appSettings, api, translator
qml/harbour-aira.qml ApplicationWindow + copertina
qml/pages/MainPage.qml dashboard e comandi acqua/riscaldamento
qml/pages/CommandsPage.qml gli altri comandi, con lo stato attuale in cima
@@ -118,7 +155,8 @@ bridge/harbour-aira-bridge.service unit systemd utente
bridge/README.md istruzioni di installazione del bridge (inglese)
docs/PIANO.md piano di progetto e scelte
docs/PROTOCOL.md API del bridge
docs/anteprima/ anteprime di layout
translations/ harbour-aira-it.ts (l'inglese è la lingua sorgente)
docs/anteprima/ anteprime di layout in inglese (in italiano: it/)
```
## Licenza