Notation like Home Assistant, each screen in its own language, and the language in every build
From the end-to-end test on the bench boards and an independent review: - Units spaced as Home Assistant does (54% / 54 % in German and French, 18°, 21.5 °C), in the firmware and the app. - Grouping from five digits where the language does (1234 but 12.345 in Spanish, Polish, Portuguese): the layout message carries group_min and percent_space; an unknown number style no longer refuses a layout. - Automatic follows Home Assistant's own language for the clock and numbers, also without a translation (Swedish: 24 hours, 1 234,5; pt-BR: 1.234,5): regions.json from the CLDR for all 63 languages Home Assistant offers. - 12-hour clock: the top bar says 3:48 PM, the clock card 3:48 (not 03:48), Last runs follow the clock. - The climate setpoint font has the decimal comma; the value fonts have ², ³ and µ (m³ was a box). - Weather days: at most three letters without the dot (mié, sáb, czw); the screen took three bytes. - Texts fall back per key through the base language (pt-BR -> pt -> en) in the firmware and the app. - Each screen gets the app's words in the language its firmware speaks; firmware from before the languages gets English and its own letters, not boxes. - set_language re-reads what it writes (indentation, comments, quoted keys, CRLF, !include) and every build writes the language first; the 24-hour pin no longer hits a fresh install and waits for the old clock switches. - Tests: region and notation, plural parity with the C++ rules, set_language edge cases, the pin, PUT /api/language. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -103,9 +103,19 @@ class Updater:
|
||||
|
||||
def language_due(self, screen):
|
||||
"""True when a screen speaks another language than Settings -> Language & region says (app 0.2.90): its
|
||||
"Screen language" sensor, or English for firmware from before that sensor."""
|
||||
"Screen language" sensor, or English for firmware from before that sensor. A sensor without a state yet (the
|
||||
screen restarts) says nothing."""
|
||||
region = getattr(self.manager, 'region', None)
|
||||
return bool(region) and (screen.get('language') or 'en') != region.language()
|
||||
if not region or (screen.get('language_sensor') and not screen.get('language')):
|
||||
return False
|
||||
return (screen.get('language') or 'en') != region.language()
|
||||
|
||||
def speaks_region(self, screen):
|
||||
"""Whether the screen says it speaks the language of Settings -> Language & region: what an update waits for."""
|
||||
region = getattr(self.manager, 'region', None)
|
||||
if not region:
|
||||
return True
|
||||
return (screen.get('language') if screen.get('language_sensor') else 'en') == region.language()
|
||||
|
||||
def state_for(self, screen, profiles=None):
|
||||
version = parse_version(screen.get('firmware'))
|
||||
@@ -251,7 +261,7 @@ class Updater:
|
||||
while time.monotonic() < deadline:
|
||||
screen = self.screen(inbox)
|
||||
version = parse_version(screen.get('firmware')) if screen else None
|
||||
if screen and screen['online'] and version and version >= TARGET and not self.language_due(screen):
|
||||
if screen and screen['online'] and version and version >= TARGET and self.speaks_region(screen):
|
||||
return True
|
||||
await asyncio.sleep(self.poll_seconds)
|
||||
return False
|
||||
|
||||
Reference in New Issue
Block a user