fix(options_flow): enhance translation handling for config fields and update language fallback

This commit is contained in:
Julian Pawlowski 2026-01-21 18:35:19 +00:00
parent 89880c7755
commit 1bf031ba19
7 changed files with 107 additions and 92 deletions

View file

@ -357,16 +357,23 @@ class TibberPricesOptionsFlowHandler(OptionsFlow):
""" """
Load override translations from common section. 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: Returns:
Dictionary with override_warning_template, override_warning_and, 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] = {} 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) template = await async_get_translation(self.hass, ["common", "override_warning_template"], language)
_LOGGER.debug("Loaded template: %s", template)
if template: if template:
translations["override_warning_template"] = template translations["override_warning_template"] = template
@ -374,9 +381,28 @@ class TibberPricesOptionsFlowHandler(OptionsFlow):
if and_connector: if and_connector:
translations["override_warning_and"] = and_connector translations["override_warning_and"] = and_connector
field_labels = await async_get_translation(self.hass, ["common", "override_field_labels"], language) # Load flat field label translations
if field_labels: field_keys = [
translations["override_field_labels"] = field_labels "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 return translations

View file

@ -245,14 +245,13 @@ def get_section_override_warning(
section_keys = SECTION_CONFIG_KEYS.get(step_id, {}).get(section_id, []) section_keys = SECTION_CONFIG_KEYS.get(step_id, {}).get(section_id, [])
overridden_fields = [] 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: for config_key in section_keys:
if is_field_overridden(config_key, section_id, overrides): 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) overridden_fields.append(label)
if not overridden_fields: if not overridden_fields:

View file

@ -80,22 +80,20 @@
"step_progress": "{step_num} / {total_steps}", "step_progress": "{step_num} / {total_steps}",
"override_warning_template": "⚠️ {fields} wird durch Konfigurations-Entität gesteuert", "override_warning_template": "⚠️ {fields} wird durch Konfigurations-Entität gesteuert",
"override_warning_and": "und", "override_warning_and": "und",
"override_field_labels": { "override_field_label_best_price_min_period_length": "Mindestperiodenlänge",
"best_price_min_period_length": "Mindestperiodenlänge", "override_field_label_best_price_max_level_gap_count": "Lückentoleranz",
"best_price_max_level_gap_count": "Lückentoleranz", "override_field_label_best_price_flex": "Flexibilität",
"best_price_flex": "Flexibilität", "override_field_label_best_price_min_distance_from_avg": "Mindestabstand",
"best_price_min_distance_from_avg": "Mindestabstand", "override_field_label_enable_min_periods_best": "Mindestzahl erreichen",
"enable_min_periods_best": "Mindestzahl erreichen", "override_field_label_min_periods_best": "Mindestperioden",
"min_periods_best": "Mindestperioden", "override_field_label_relaxation_attempts_best": "Lockerungsversuche",
"relaxation_attempts_best": "Lockerungsversuche", "override_field_label_peak_price_min_period_length": "Mindestperiodenlänge",
"peak_price_min_period_length": "Mindestperiodenlänge", "override_field_label_peak_price_max_level_gap_count": "Lückentoleranz",
"peak_price_max_level_gap_count": "Lückentoleranz", "override_field_label_peak_price_flex": "Flexibilität",
"peak_price_flex": "Flexibilität", "override_field_label_peak_price_min_distance_from_avg": "Mindestabstand",
"peak_price_min_distance_from_avg": "Mindestabstand", "override_field_label_enable_min_periods_peak": "Mindestzahl erreichen",
"enable_min_periods_peak": "Mindestzahl erreichen", "override_field_label_min_periods_peak": "Mindestperioden",
"min_periods_peak": "Mindestperioden", "override_field_label_relaxation_attempts_peak": "Lockerungsversuche"
"relaxation_attempts_peak": "Lockerungsversuche"
}
}, },
"config_subentries": { "config_subentries": {
"home": { "home": {

View file

@ -80,22 +80,20 @@
"step_progress": "{step_num} / {total_steps}", "step_progress": "{step_num} / {total_steps}",
"override_warning_template": "⚠️ {fields} controlled by config entity", "override_warning_template": "⚠️ {fields} controlled by config entity",
"override_warning_and": "and", "override_warning_and": "and",
"override_field_labels": { "override_field_label_best_price_min_period_length": "Minimum Period Length",
"best_price_min_period_length": "Minimum Period Length", "override_field_label_best_price_max_level_gap_count": "Gap Tolerance",
"best_price_max_level_gap_count": "Gap Tolerance", "override_field_label_best_price_flex": "Flexibility",
"best_price_flex": "Flexibility", "override_field_label_best_price_min_distance_from_avg": "Minimum Distance",
"best_price_min_distance_from_avg": "Minimum Distance", "override_field_label_enable_min_periods_best": "Achieve Minimum Count",
"enable_min_periods_best": "Achieve Minimum Count", "override_field_label_min_periods_best": "Minimum Periods",
"min_periods_best": "Minimum Periods", "override_field_label_relaxation_attempts_best": "Relaxation Attempts",
"relaxation_attempts_best": "Relaxation Attempts", "override_field_label_peak_price_min_period_length": "Minimum Period Length",
"peak_price_min_period_length": "Minimum Period Length", "override_field_label_peak_price_max_level_gap_count": "Gap Tolerance",
"peak_price_max_level_gap_count": "Gap Tolerance", "override_field_label_peak_price_flex": "Flexibility",
"peak_price_flex": "Flexibility", "override_field_label_peak_price_min_distance_from_avg": "Minimum Distance",
"peak_price_min_distance_from_avg": "Minimum Distance", "override_field_label_enable_min_periods_peak": "Achieve Minimum Count",
"enable_min_periods_peak": "Achieve Minimum Count", "override_field_label_min_periods_peak": "Minimum Periods",
"min_periods_peak": "Minimum Periods", "override_field_label_relaxation_attempts_peak": "Relaxation Attempts"
"relaxation_attempts_peak": "Relaxation Attempts"
}
}, },
"config_subentries": { "config_subentries": {
"home": { "home": {

View file

@ -80,22 +80,20 @@
"step_progress": "{step_num} / {total_steps}", "step_progress": "{step_num} / {total_steps}",
"override_warning_template": "⚠️ {fields} styres av konfigurasjons-entitet", "override_warning_template": "⚠️ {fields} styres av konfigurasjons-entitet",
"override_warning_and": "og", "override_warning_and": "og",
"override_field_labels": { "override_field_label_best_price_min_period_length": "Minste periodelengde",
"best_price_min_period_length": "Minste periodelengde", "override_field_label_best_price_max_level_gap_count": "Gaptoleranse",
"best_price_max_level_gap_count": "Gaptoleranse", "override_field_label_best_price_flex": "Fleksibilitet",
"best_price_flex": "Fleksibilitet", "override_field_label_best_price_min_distance_from_avg": "Minimumsavstand",
"best_price_min_distance_from_avg": "Minimumsavstand", "override_field_label_enable_min_periods_best": "Oppnå minimum antall",
"enable_min_periods_best": "Oppnå minimum antall", "override_field_label_min_periods_best": "Minimumperioder",
"min_periods_best": "Minimumperioder", "override_field_label_relaxation_attempts_best": "Avslapningsforsøk",
"relaxation_attempts_best": "Avslapningsforsøk", "override_field_label_peak_price_min_period_length": "Minste periodelengde",
"peak_price_min_period_length": "Minste periodelengde", "override_field_label_peak_price_max_level_gap_count": "Gaptoleranse",
"peak_price_max_level_gap_count": "Gaptoleranse", "override_field_label_peak_price_flex": "Fleksibilitet",
"peak_price_flex": "Fleksibilitet", "override_field_label_peak_price_min_distance_from_avg": "Minimumsavstand",
"peak_price_min_distance_from_avg": "Minimumsavstand", "override_field_label_enable_min_periods_peak": "Oppnå minimum antall",
"enable_min_periods_peak": "Oppnå minimum antall", "override_field_label_min_periods_peak": "Minimumperioder",
"min_periods_peak": "Minimumperioder", "override_field_label_relaxation_attempts_peak": "Avslapningsforsøk"
"relaxation_attempts_peak": "Avslapningsforsøk"
}
}, },
"config_subentries": { "config_subentries": {
"home": { "home": {

View file

@ -80,22 +80,20 @@
"step_progress": "{step_num} / {total_steps}", "step_progress": "{step_num} / {total_steps}",
"override_warning_template": "⚠️ {fields} wordt beheerd door configuratie-entiteit", "override_warning_template": "⚠️ {fields} wordt beheerd door configuratie-entiteit",
"override_warning_and": "en", "override_warning_and": "en",
"override_field_labels": { "override_field_label_best_price_min_period_length": "Minimale periodelengte",
"best_price_min_period_length": "Minimale periodelengte", "override_field_label_best_price_max_level_gap_count": "Gaptolerantie",
"best_price_max_level_gap_count": "Gaptolerantie", "override_field_label_best_price_flex": "Flexibiliteit",
"best_price_flex": "Flexibiliteit", "override_field_label_best_price_min_distance_from_avg": "Minimale afstand",
"best_price_min_distance_from_avg": "Minimale afstand", "override_field_label_enable_min_periods_best": "Minimum aantal bereiken",
"enable_min_periods_best": "Minimum aantal bereiken", "override_field_label_min_periods_best": "Minimale periodes",
"min_periods_best": "Minimale periodes", "override_field_label_relaxation_attempts_best": "Ontspanningspogingen",
"relaxation_attempts_best": "Ontspanningspogingen", "override_field_label_peak_price_min_period_length": "Minimale periodelengte",
"peak_price_min_period_length": "Minimale periodelengte", "override_field_label_peak_price_max_level_gap_count": "Gaptolerantie",
"peak_price_max_level_gap_count": "Gaptolerantie", "override_field_label_peak_price_flex": "Flexibiliteit",
"peak_price_flex": "Flexibiliteit", "override_field_label_peak_price_min_distance_from_avg": "Minimale afstand",
"peak_price_min_distance_from_avg": "Minimale afstand", "override_field_label_enable_min_periods_peak": "Minimum aantal bereiken",
"enable_min_periods_peak": "Minimum aantal bereiken", "override_field_label_min_periods_peak": "Minimale periodes",
"min_periods_peak": "Minimale periodes", "override_field_label_relaxation_attempts_peak": "Ontspanningspogingen"
"relaxation_attempts_peak": "Ontspanningspogingen"
}
}, },
"config_subentries": { "config_subentries": {
"home": { "home": {

View file

@ -80,22 +80,20 @@
"step_progress": "{step_num} / {total_steps}", "step_progress": "{step_num} / {total_steps}",
"override_warning_template": "⚠️ {fields} styrs av konfigurationsentitet", "override_warning_template": "⚠️ {fields} styrs av konfigurationsentitet",
"override_warning_and": "och", "override_warning_and": "och",
"override_field_labels": { "override_field_label_best_price_min_period_length": "Minsta periodlängd",
"best_price_min_period_length": "Minsta periodlängd", "override_field_label_best_price_max_level_gap_count": "Glappstolerans",
"best_price_max_level_gap_count": "Glappstolerans", "override_field_label_best_price_flex": "Flexibilitet",
"best_price_flex": "Flexibilitet", "override_field_label_best_price_min_distance_from_avg": "Minsta avstånd",
"best_price_min_distance_from_avg": "Minsta avstånd", "override_field_label_enable_min_periods_best": "Uppnå minsta antal",
"enable_min_periods_best": "Uppnå minsta antal", "override_field_label_min_periods_best": "Minimiperioder",
"min_periods_best": "Minimiperioder", "override_field_label_relaxation_attempts_best": "Avslappningsförsök",
"relaxation_attempts_best": "Avslappningsförsök", "override_field_label_peak_price_min_period_length": "Minsta periodlängd",
"peak_price_min_period_length": "Minsta periodlängd", "override_field_label_peak_price_max_level_gap_count": "Glappstolerans",
"peak_price_max_level_gap_count": "Glappstolerans", "override_field_label_peak_price_flex": "Flexibilitet",
"peak_price_flex": "Flexibilitet", "override_field_label_peak_price_min_distance_from_avg": "Minsta avstånd",
"peak_price_min_distance_from_avg": "Minsta avstånd", "override_field_label_enable_min_periods_peak": "Uppnå minsta antal",
"enable_min_periods_peak": "Uppnå minsta antal", "override_field_label_min_periods_peak": "Minimiperioder",
"min_periods_peak": "Minimiperioder", "override_field_label_relaxation_attempts_peak": "Avslappningsförsök"
"relaxation_attempts_peak": "Avslappningsförsök"
}
}, },
"config_subentries": { "config_subentries": {
"home": { "home": {