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.
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

View file

@ -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:

View file

@ -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": {

View file

@ -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": {

View file

@ -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": {

View file

@ -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": {

View file

@ -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": {