From 1bf031ba1964d8a1b608a67d869923c793f3bd63 Mon Sep 17 00:00:00 2001 From: Julian Pawlowski <75446+jpawlowski@users.noreply.github.com> Date: Wed, 21 Jan 2026 18:35:19 +0000 Subject: [PATCH] fix(options_flow): enhance translation handling for config fields and update language fallback --- .../config_flow_handlers/options_flow.py | 38 ++++++++++++++++--- .../config_flow_handlers/schemas.py | 11 +++--- .../tibber_prices/translations/de.json | 30 +++++++-------- .../tibber_prices/translations/en.json | 30 +++++++-------- .../tibber_prices/translations/nb.json | 30 +++++++-------- .../tibber_prices/translations/nl.json | 30 +++++++-------- .../tibber_prices/translations/sv.json | 30 +++++++-------- 7 files changed, 107 insertions(+), 92 deletions(-) diff --git a/custom_components/tibber_prices/config_flow_handlers/options_flow.py b/custom_components/tibber_prices/config_flow_handlers/options_flow.py index 1b46f74..9aeb38d 100644 --- a/custom_components/tibber_prices/config_flow_handlers/options_flow.py +++ b/custom_components/tibber_prices/config_flow_handlers/options_flow.py @@ -357,16 +357,23 @@ class TibberPricesOptionsFlowHandler(OptionsFlow): """ Load override translations from common section. + Uses the system language setting from Home Assistant. + Note: HA Options Flow does not provide user_id in context, + so we cannot determine the individual user's language preference. + Returns: Dictionary with override_warning_template, override_warning_and, - and override_field_labels keys + and override_field_label_* keys for each config field. """ - language = self.hass.config.language + # Use system language - HA Options Flow context doesn't include user_id + language = self.hass.config.language or "en" + _LOGGER.debug("Loading override translations for language: %s", language) translations: dict[str, Any] = {} - # Load template, and connector, and field labels from common section + # Load template and connector from common section template = await async_get_translation(self.hass, ["common", "override_warning_template"], language) + _LOGGER.debug("Loaded template: %s", template) if template: translations["override_warning_template"] = template @@ -374,9 +381,28 @@ class TibberPricesOptionsFlowHandler(OptionsFlow): if and_connector: translations["override_warning_and"] = and_connector - field_labels = await async_get_translation(self.hass, ["common", "override_field_labels"], language) - if field_labels: - translations["override_field_labels"] = field_labels + # Load flat field label translations + field_keys = [ + "best_price_min_period_length", + "best_price_max_level_gap_count", + "best_price_flex", + "best_price_min_distance_from_avg", + "enable_min_periods_best", + "min_periods_best", + "relaxation_attempts_best", + "peak_price_min_period_length", + "peak_price_max_level_gap_count", + "peak_price_flex", + "peak_price_min_distance_from_avg", + "enable_min_periods_peak", + "min_periods_peak", + "relaxation_attempts_peak", + ] + for field_key in field_keys: + translation_key = f"override_field_label_{field_key}" + label = await async_get_translation(self.hass, ["common", translation_key], language) + if label: + translations[translation_key] = label return translations diff --git a/custom_components/tibber_prices/config_flow_handlers/schemas.py b/custom_components/tibber_prices/config_flow_handlers/schemas.py index 83b474f..c3a03e7 100644 --- a/custom_components/tibber_prices/config_flow_handlers/schemas.py +++ b/custom_components/tibber_prices/config_flow_handlers/schemas.py @@ -245,14 +245,13 @@ def get_section_override_warning( section_keys = SECTION_CONFIG_KEYS.get(step_id, {}).get(section_id, []) overridden_fields = [] - # Get field labels from translations or use fallback - field_labels = DEFAULT_FIELD_LABELS - if translations and "override_field_labels" in translations: - field_labels = translations["override_field_labels"] - for config_key in section_keys: if is_field_overridden(config_key, section_id, overrides): - label = field_labels.get(config_key, config_key) + # Try to get translated label from flat keys, fallback to DEFAULT_FIELD_LABELS + translation_key = f"override_field_label_{config_key}" + label = (translations.get(translation_key) if translations else None) or DEFAULT_FIELD_LABELS.get( + config_key, config_key + ) overridden_fields.append(label) if not overridden_fields: diff --git a/custom_components/tibber_prices/translations/de.json b/custom_components/tibber_prices/translations/de.json index 36dd240..bcb15df 100644 --- a/custom_components/tibber_prices/translations/de.json +++ b/custom_components/tibber_prices/translations/de.json @@ -80,22 +80,20 @@ "step_progress": "{step_num} / {total_steps}", "override_warning_template": "⚠️ {fields} wird durch Konfigurations-Entität gesteuert", "override_warning_and": "und", - "override_field_labels": { - "best_price_min_period_length": "Mindestperiodenlänge", - "best_price_max_level_gap_count": "Lückentoleranz", - "best_price_flex": "Flexibilität", - "best_price_min_distance_from_avg": "Mindestabstand", - "enable_min_periods_best": "Mindestzahl erreichen", - "min_periods_best": "Mindestperioden", - "relaxation_attempts_best": "Lockerungsversuche", - "peak_price_min_period_length": "Mindestperiodenlänge", - "peak_price_max_level_gap_count": "Lückentoleranz", - "peak_price_flex": "Flexibilität", - "peak_price_min_distance_from_avg": "Mindestabstand", - "enable_min_periods_peak": "Mindestzahl erreichen", - "min_periods_peak": "Mindestperioden", - "relaxation_attempts_peak": "Lockerungsversuche" - } + "override_field_label_best_price_min_period_length": "Mindestperiodenlänge", + "override_field_label_best_price_max_level_gap_count": "Lückentoleranz", + "override_field_label_best_price_flex": "Flexibilität", + "override_field_label_best_price_min_distance_from_avg": "Mindestabstand", + "override_field_label_enable_min_periods_best": "Mindestzahl erreichen", + "override_field_label_min_periods_best": "Mindestperioden", + "override_field_label_relaxation_attempts_best": "Lockerungsversuche", + "override_field_label_peak_price_min_period_length": "Mindestperiodenlänge", + "override_field_label_peak_price_max_level_gap_count": "Lückentoleranz", + "override_field_label_peak_price_flex": "Flexibilität", + "override_field_label_peak_price_min_distance_from_avg": "Mindestabstand", + "override_field_label_enable_min_periods_peak": "Mindestzahl erreichen", + "override_field_label_min_periods_peak": "Mindestperioden", + "override_field_label_relaxation_attempts_peak": "Lockerungsversuche" }, "config_subentries": { "home": { diff --git a/custom_components/tibber_prices/translations/en.json b/custom_components/tibber_prices/translations/en.json index 989c205..5a8ba57 100644 --- a/custom_components/tibber_prices/translations/en.json +++ b/custom_components/tibber_prices/translations/en.json @@ -80,22 +80,20 @@ "step_progress": "{step_num} / {total_steps}", "override_warning_template": "⚠️ {fields} controlled by config entity", "override_warning_and": "and", - "override_field_labels": { - "best_price_min_period_length": "Minimum Period Length", - "best_price_max_level_gap_count": "Gap Tolerance", - "best_price_flex": "Flexibility", - "best_price_min_distance_from_avg": "Minimum Distance", - "enable_min_periods_best": "Achieve Minimum Count", - "min_periods_best": "Minimum Periods", - "relaxation_attempts_best": "Relaxation Attempts", - "peak_price_min_period_length": "Minimum Period Length", - "peak_price_max_level_gap_count": "Gap Tolerance", - "peak_price_flex": "Flexibility", - "peak_price_min_distance_from_avg": "Minimum Distance", - "enable_min_periods_peak": "Achieve Minimum Count", - "min_periods_peak": "Minimum Periods", - "relaxation_attempts_peak": "Relaxation Attempts" - } + "override_field_label_best_price_min_period_length": "Minimum Period Length", + "override_field_label_best_price_max_level_gap_count": "Gap Tolerance", + "override_field_label_best_price_flex": "Flexibility", + "override_field_label_best_price_min_distance_from_avg": "Minimum Distance", + "override_field_label_enable_min_periods_best": "Achieve Minimum Count", + "override_field_label_min_periods_best": "Minimum Periods", + "override_field_label_relaxation_attempts_best": "Relaxation Attempts", + "override_field_label_peak_price_min_period_length": "Minimum Period Length", + "override_field_label_peak_price_max_level_gap_count": "Gap Tolerance", + "override_field_label_peak_price_flex": "Flexibility", + "override_field_label_peak_price_min_distance_from_avg": "Minimum Distance", + "override_field_label_enable_min_periods_peak": "Achieve Minimum Count", + "override_field_label_min_periods_peak": "Minimum Periods", + "override_field_label_relaxation_attempts_peak": "Relaxation Attempts" }, "config_subentries": { "home": { diff --git a/custom_components/tibber_prices/translations/nb.json b/custom_components/tibber_prices/translations/nb.json index 5421756..c8da754 100644 --- a/custom_components/tibber_prices/translations/nb.json +++ b/custom_components/tibber_prices/translations/nb.json @@ -80,22 +80,20 @@ "step_progress": "{step_num} / {total_steps}", "override_warning_template": "⚠️ {fields} styres av konfigurasjons-entitet", "override_warning_and": "og", - "override_field_labels": { - "best_price_min_period_length": "Minste periodelengde", - "best_price_max_level_gap_count": "Gaptoleranse", - "best_price_flex": "Fleksibilitet", - "best_price_min_distance_from_avg": "Minimumsavstand", - "enable_min_periods_best": "Oppnå minimum antall", - "min_periods_best": "Minimumperioder", - "relaxation_attempts_best": "Avslapningsforsøk", - "peak_price_min_period_length": "Minste periodelengde", - "peak_price_max_level_gap_count": "Gaptoleranse", - "peak_price_flex": "Fleksibilitet", - "peak_price_min_distance_from_avg": "Minimumsavstand", - "enable_min_periods_peak": "Oppnå minimum antall", - "min_periods_peak": "Minimumperioder", - "relaxation_attempts_peak": "Avslapningsforsøk" - } + "override_field_label_best_price_min_period_length": "Minste periodelengde", + "override_field_label_best_price_max_level_gap_count": "Gaptoleranse", + "override_field_label_best_price_flex": "Fleksibilitet", + "override_field_label_best_price_min_distance_from_avg": "Minimumsavstand", + "override_field_label_enable_min_periods_best": "Oppnå minimum antall", + "override_field_label_min_periods_best": "Minimumperioder", + "override_field_label_relaxation_attempts_best": "Avslapningsforsøk", + "override_field_label_peak_price_min_period_length": "Minste periodelengde", + "override_field_label_peak_price_max_level_gap_count": "Gaptoleranse", + "override_field_label_peak_price_flex": "Fleksibilitet", + "override_field_label_peak_price_min_distance_from_avg": "Minimumsavstand", + "override_field_label_enable_min_periods_peak": "Oppnå minimum antall", + "override_field_label_min_periods_peak": "Minimumperioder", + "override_field_label_relaxation_attempts_peak": "Avslapningsforsøk" }, "config_subentries": { "home": { diff --git a/custom_components/tibber_prices/translations/nl.json b/custom_components/tibber_prices/translations/nl.json index f6a1f84..137848e 100644 --- a/custom_components/tibber_prices/translations/nl.json +++ b/custom_components/tibber_prices/translations/nl.json @@ -80,22 +80,20 @@ "step_progress": "{step_num} / {total_steps}", "override_warning_template": "⚠️ {fields} wordt beheerd door configuratie-entiteit", "override_warning_and": "en", - "override_field_labels": { - "best_price_min_period_length": "Minimale periodelengte", - "best_price_max_level_gap_count": "Gaptolerantie", - "best_price_flex": "Flexibiliteit", - "best_price_min_distance_from_avg": "Minimale afstand", - "enable_min_periods_best": "Minimum aantal bereiken", - "min_periods_best": "Minimale periodes", - "relaxation_attempts_best": "Ontspanningspogingen", - "peak_price_min_period_length": "Minimale periodelengte", - "peak_price_max_level_gap_count": "Gaptolerantie", - "peak_price_flex": "Flexibiliteit", - "peak_price_min_distance_from_avg": "Minimale afstand", - "enable_min_periods_peak": "Minimum aantal bereiken", - "min_periods_peak": "Minimale periodes", - "relaxation_attempts_peak": "Ontspanningspogingen" - } + "override_field_label_best_price_min_period_length": "Minimale periodelengte", + "override_field_label_best_price_max_level_gap_count": "Gaptolerantie", + "override_field_label_best_price_flex": "Flexibiliteit", + "override_field_label_best_price_min_distance_from_avg": "Minimale afstand", + "override_field_label_enable_min_periods_best": "Minimum aantal bereiken", + "override_field_label_min_periods_best": "Minimale periodes", + "override_field_label_relaxation_attempts_best": "Ontspanningspogingen", + "override_field_label_peak_price_min_period_length": "Minimale periodelengte", + "override_field_label_peak_price_max_level_gap_count": "Gaptolerantie", + "override_field_label_peak_price_flex": "Flexibiliteit", + "override_field_label_peak_price_min_distance_from_avg": "Minimale afstand", + "override_field_label_enable_min_periods_peak": "Minimum aantal bereiken", + "override_field_label_min_periods_peak": "Minimale periodes", + "override_field_label_relaxation_attempts_peak": "Ontspanningspogingen" }, "config_subentries": { "home": { diff --git a/custom_components/tibber_prices/translations/sv.json b/custom_components/tibber_prices/translations/sv.json index 6a67612..ce3115c 100644 --- a/custom_components/tibber_prices/translations/sv.json +++ b/custom_components/tibber_prices/translations/sv.json @@ -80,22 +80,20 @@ "step_progress": "{step_num} / {total_steps}", "override_warning_template": "⚠️ {fields} styrs av konfigurationsentitet", "override_warning_and": "och", - "override_field_labels": { - "best_price_min_period_length": "Minsta periodlängd", - "best_price_max_level_gap_count": "Glappstolerans", - "best_price_flex": "Flexibilitet", - "best_price_min_distance_from_avg": "Minsta avstånd", - "enable_min_periods_best": "Uppnå minsta antal", - "min_periods_best": "Minimiperioder", - "relaxation_attempts_best": "Avslappningsförsök", - "peak_price_min_period_length": "Minsta periodlängd", - "peak_price_max_level_gap_count": "Glappstolerans", - "peak_price_flex": "Flexibilitet", - "peak_price_min_distance_from_avg": "Minsta avstånd", - "enable_min_periods_peak": "Uppnå minsta antal", - "min_periods_peak": "Minimiperioder", - "relaxation_attempts_peak": "Avslappningsförsök" - } + "override_field_label_best_price_min_period_length": "Minsta periodlängd", + "override_field_label_best_price_max_level_gap_count": "Glappstolerans", + "override_field_label_best_price_flex": "Flexibilitet", + "override_field_label_best_price_min_distance_from_avg": "Minsta avstånd", + "override_field_label_enable_min_periods_best": "Uppnå minsta antal", + "override_field_label_min_periods_best": "Minimiperioder", + "override_field_label_relaxation_attempts_best": "Avslappningsförsök", + "override_field_label_peak_price_min_period_length": "Minsta periodlängd", + "override_field_label_peak_price_max_level_gap_count": "Glappstolerans", + "override_field_label_peak_price_flex": "Flexibilitet", + "override_field_label_peak_price_min_distance_from_avg": "Minsta avstånd", + "override_field_label_enable_min_periods_peak": "Uppnå minsta antal", + "override_field_label_min_periods_peak": "Minimiperioder", + "override_field_label_relaxation_attempts_peak": "Avslappningsförsök" }, "config_subentries": { "home": {