diff --git a/goodwe_controller/app/homeview.py b/goodwe_controller/app/homeview.py index 9501c7a..00bd30f 100644 --- a/goodwe_controller/app/homeview.py +++ b/goodwe_controller/app/homeview.py @@ -1075,9 +1075,9 @@ def _kwh(v) -> str: return _dec(f"{float(v):.1f}") + " kWh" -# Row id -> the title on Home. The row's own sentence is the body, and it stays -# in English (app/messages.py). Five titles are the notification's own title, -# which test_ui_text.py checks. +# Row id -> the title on Home. The row's own sentence is the body, in the +# page's language (UX-46, `messages.pick`). Five titles are the notification's +# own title, which test_ui_text.py checks. _EN = uitext.words("en")["home_words"] ATTN_TITLES = {(None if k == "none" else k): v for k, v in _EN["attn"].items()} ATTN_FROM_MESSAGES = { diff --git a/goodwe_controller/app/main.py b/goodwe_controller/app/main.py index 290068d..c98b91d 100644 --- a/goodwe_controller/app/main.py +++ b/goodwe_controller/app/main.py @@ -7598,8 +7598,8 @@ class Controller: held = level == "bad" and not running_alarm # UX-46. The rows were built in English with their Dutch beside them # (`messages.Bi`); the page's language is chosen once, here, for the - # Home sentences, the checks list and the rows that carry one. The - # banner above stays English: it is the plain fallback. + # Home sentences, the checks list, the rows that carry one and the + # banner. A plain str (no Dutch twin) stays as it is. checks = [dict(c, text=messages.pick(c["text"], lang)) for c in checks] rows = [(k, messages.pick(v, lang)) for k, v in rows] banner = messages.pick(banner, lang) diff --git a/goodwe_controller/app/messages.py b/goodwe_controller/app/messages.py index f8c350a..298c9e0 100644 --- a/goodwe_controller/app/messages.py +++ b/goodwe_controller/app/messages.py @@ -466,7 +466,7 @@ def row_maint_waits(until_text: str) -> str: NOT_READY = "Not ready" BANNER_RUNNING = ("Running — holding grid at zero", - "Actief — het net blijft op nul") + "Actief — houdt het net op nul") DOCS_STATUS = "Status page" @@ -566,7 +566,9 @@ def banner_not_delivering(units) -> str: def banner_maintenance(phase: str, unit: str = "") -> str: where = f" ({unit})" if unit else "" - return Bi(f"Maintenance: {phase}{where}", f"Onderhoud: {phase}{where}") + fase = {"drain": "leegmaken", "charge": "opladen", "hold": "vol houden"} + return Bi(f"Maintenance: {phase}{where}", + f"Onderhoud: {fase.get(phase, phase)}{where}") def banner_running() -> str: @@ -588,7 +590,7 @@ def banner_setup_only() -> str: def row_setup_only() -> str: return Bi("No inverter is named yet, so finish Setup and restart the " "add-on.", - "Er is nog geen omvormer benoemd, dus rond de installatie af " + "Er is nog geen omvormer opgegeven, dus rond de installatie af " "en herstart de add-on.") @@ -700,9 +702,9 @@ def row_freeze_on(hold_s, rail_w, own_limit: bool) -> str: return Bi(f"Stuck-meter check: alerts after {duration(hold_s)} unchanged " f"above {watts(rail_w)}" + (", the inverter's own limit" if own_limit else ""), - f"Vastgelopen meter: alarm na {duur(hold_s)} gelijk boven " - f"{watts(rail_w)}" - + (", limiet van de omvormer" if own_limit else "")) + f"Controle op vastgelopen meter: alarm na {duur(hold_s)} " + f"ongewijzigd boven {watts(rail_w)}" + + (", omvormerlimiet" if own_limit else "")) # Rows: the peak guard. @@ -734,14 +736,15 @@ def row_peak_reserve(ceiling_w, *, soc_unread: bool, floor_unknown: bool, f"limit alone. Home use still draws it lower, to the " f"cut-out level.", f"{why_nl}. De andere kunnen de piekgrens van " - f"{watts(ceiling_w)} niet alleen houden. Het huis trekt de " - f"batterij nog leger, tot het uitschakelniveau.") + f"{watts(ceiling_w)} niet alleen houden. Het verbruik in " + f"huis trekt de batterij verder leeg, tot het " + f"uitschakelniveau.") return Bi(f"{why}, so the {watts(ceiling_w)} peak limit will be passed. " f"Home use still draws the battery below it, down to the " f"cut-out level.", f"{why_nl}, dus de piekgrens van {watts(ceiling_w)} wordt " - f"overschreden. Het huis trekt de batterij nog leger, tot het " - f"uitschakelniveau.") + f"overschreden. Het verbruik in huis trekt de batterij verder " + f"leeg, tot het uitschakelniveau.") def row_peak_guard_off() -> str: @@ -788,7 +791,7 @@ def row_sensor_unusable(label, unit=None) -> str: f"Developer Tools before replacing it.", f"{LABEL_NL.get(label, label)}{voor(unit)}: geen bruikbare " f"meting. De entiteit ontbreekt misschien, of de meting is te " - f"oud. Controleer ze in Ontwikkelaarstools voor u ze vervangt.") + f"oud. Controleer ze in Ontwikkelhulpmiddelen voor u ze vervangt.") def setpoint_label(unit=None, lang="en") -> str: @@ -829,7 +832,7 @@ def row_not_controllable(name, held_s, limit_s) -> str: f"{seconds(held_s)}, so control leaves it out.", f"{name} kan niet worden geregeld. Hij weigerde elke opdracht " f"gedurende {seconden(held_s)}, dus de regeling laat hem " - f"buiten beschouwing.") + f"weg.") def row_commands_refused(name, held_s, limit_s) -> str: @@ -837,7 +840,7 @@ def row_commands_refused(name, held_s, limit_s) -> str: return Bi(f"{name}: commands refused for {seconds(held_s)}, left out of " f"control after {seconds(limit_s)}", f"{name}: opdrachten geweigerd gedurende {seconden(held_s)}, " - f"na {seconden(limit_s)} buiten de regeling gelaten") + f"de regeling laat hem weg na {seconden(limit_s)}") def row_control(lo_w, hi_w, unit=None) -> str: @@ -1029,7 +1032,7 @@ def row_peak_forecast_unit(unit) -> str: def row_peak_guard_waiting() -> str: return Bi("Peak guard: no decision yet, control has not run", - "Piekbewaking: nog geen besluit, de regeling is niet uitgevoerd") + "Piekbewaking: nog geen besluit, de regeling liep nog niet") def row_no_estop() -> str: @@ -1175,12 +1178,12 @@ def row_peak_guard_idle(projected_w, limit_w, month_peak: bool) -> str: else f"de piekgrens van {watts(limit_w)}") return Bi(f"Peak guard: idle, heading for {watts(projected_w)}, under " f"{limit}", - f"Piekbewaking: rust, op weg naar {watts(projected_w)}, onder " + f"Piekbewaking: in rust, richting {watts(projected_w)}, onder " f"{grens}") def row_peak_guard_quiet() -> str: - return Bi("Peak guard: idle", "Piekbewaking: rust") + return Bi("Peak guard: idle", "Piekbewaking: in rust") BLIND_WORDS = { @@ -1219,7 +1222,7 @@ def row_peak_guard_on(floor_w, limit_w, *, shadow: bool = False) -> str: f"{watts(limit_w)} te blijven") return Bi(f"Peak guard: asks the battery for {watts(floor_w)} to stay " f"under {watts(limit_w)}", - f"Piekbewaking: vraagt {watts(floor_w)} van de batterij om " + f"Piekbewaking: vraagt de batterij {watts(floor_w)} om " f"onder {watts(limit_w)} te blijven") @@ -1236,12 +1239,13 @@ def row_battery_refuses(unit, sign, probing) -> str: """SAFETY-73. One inverter's battery refuses, the others take its share.""" way = "give" if sign > 0 else "take" weg = "leveren" if sign > 0 else "opnemen" + weigert = "te leveren" if sign > 0 else "op te nemen" if probing: return Bi(f"{unit}: testing if the battery will {way} power again", f"{unit}: test of de batterij weer stroom wil {weg}") return Bi(f"{unit}: the battery refuses to {way} power, the others take " f"over", - f"{unit}: de batterij weigert stroom te {weg}, de andere " + f"{unit}: de batterij weigert stroom {weigert}, de andere " f"nemen over") diff --git a/goodwe_controller/app/validate.py b/goodwe_controller/app/validate.py index c9dfb19..659bc05 100644 --- a/goodwe_controller/app/validate.py +++ b/goodwe_controller/app/validate.py @@ -1865,8 +1865,8 @@ def _entity_notes(notes, opts: dict, entities: dict, bad=()) -> None: _advise(notes, "bad" if key in bad else "warn", (key,), f"Home Assistant has no entity {entity}, which " f"{S(key, where)} names.", - nl=f"Home Assistant heeft geen entiteit {entity}, terwijl " - f"{SN(key, where)} die noemt.") + nl=f"Home Assistant kent {entity} niet, maar " + f"{SN(key, where)} verwijst ernaar.") continue unit = str(row.get("unit") or "") if key in WATT_ENTITY_KEYS and unit in pv.WATTS_PER and unit != "W": @@ -1885,7 +1885,7 @@ def _entity_notes(notes, opts: dict, entities: dict, bad=()) -> None: _advise(notes, "warn", (key,), f"{entity} does not read in kWh, so pick a solar " "forecast sensor in kWh.", - nl=f"{entity} meldt niet in kWh, dus kies een sensor voor " + nl=f"{entity} meet niet in kWh, dus kies een sensor voor " "de zonneprognose in kWh.") today = solarfc.entities(opts) tomorrow = solarfc.entities(opts, tomorrow=True) diff --git a/goodwe_controller/app/web.py b/goodwe_controller/app/web.py index 4d578d6..e520ea6 100644 --- a/goodwe_controller/app/web.py +++ b/goodwe_controller/app/web.py @@ -107,7 +107,7 @@ DEVICE_NOTE = ( "at start. If they fail later, the add-on will not start then.") DEVICE_NOTE_NL = ( "%s meldde geen vermogensbereik, dus twee controles zijn overgeslagen, " - "hier en bij het starten. Falen ze later, dan start de add-on dan niet.") + "hier en bij het starten. Falen ze later, dan start de add-on niet.") def build_app(controller, selfcfg=None) -> web.Application: