allow individual per source translations

each source should specify its own translations which will only apply for this source
and not other sources with the same argument name
This commit is contained in:
5ila5
2024-07-25 13:54:08 +02:00
committed by 5ila5
parent 9ec09566f8
commit b3521c7881
4 changed files with 3194 additions and 474 deletions

View File

@@ -484,32 +484,34 @@ class WasteCollectionConfigFlow(ConfigFlow, domain=DOMAIN): # type: ignore[call
for arg in args: for arg in args:
default = args[arg].default default = args[arg].default
arg_name = args[arg].name
arg_key = f"{source}_{arg_name}"
field_type = None field_type = None
annotation = args[arg].annotation annotation = args[arg].annotation
description = None description = None
if args_input is not None and args[arg].name in args_input: if args_input is not None and arg_key in args_input:
description = {"suggested_value": args_input[args[arg].name]} description = {"suggested_value": args_input[arg_key]}
_LOGGER.debug( _LOGGER.debug(
f"Setting suggested value for {args[arg].name} to {args_input[args[arg].name]} (previously filled in)" f"Setting suggested value for {arg_key} to {args_input[arg_key]} (previously filled in)"
) )
elif args[arg].name in pre_filled: elif arg_key in pre_filled:
_LOGGER.debug( _LOGGER.debug(
f"Setting default value for {args[arg].name} to {pre_filled[args[arg].name]}" f"Setting default value for {arg_key} to {pre_filled[arg_key]}"
) )
description = { description = {
"suggested_value": pre_filled[args[arg].name], "suggested_value": pre_filled[arg_key],
} }
if annotation != inspect._empty: if annotation != inspect._empty:
field_type = ( field_type = (
await self.__get_type_by_annotation(annotation) or field_type await self.__get_type_by_annotation(annotation) or field_type
) )
_LOGGER.debug( _LOGGER.debug(
f"Default for {args[arg].name}: {type(default) if default is not inspect.Signature.empty else inspect.Signature.empty}" f"Default for {arg_key}: {type(default) if default is not inspect.Signature.empty else inspect.Signature.empty}"
) )
if args[arg].name in MODULE_FLOW_TYPES: if arg_name in MODULE_FLOW_TYPES:
flow_type = MODULE_FLOW_TYPES[args[arg].name] flow_type = MODULE_FLOW_TYPES[arg_name]
if flow_type.get("type") == "SELECT": if flow_type.get("type") == "SELECT":
field_type = SelectSelector( field_type = SelectSelector(
SelectSelectorConfig( SelectSelectorConfig(
@@ -530,14 +532,14 @@ class WasteCollectionConfigFlow(ConfigFlow, domain=DOMAIN): # type: ignore[call
arg arg
].name in suggestions: ].name in suggestions:
_LOGGER.debug( _LOGGER.debug(
f"Adding suggestions to {args[arg].name}: {suggestions[args[arg].name]}" f"Adding suggestions to {arg_key}: {suggestions[arg_key]}"
) )
# Add suggestions to the field if fetch/init raised an Exception with suggestions # Add suggestions to the field if fetch/init raised an Exception with suggestions
field_type = SelectSelector( field_type = SelectSelector(
SelectSelectorConfig( SelectSelectorConfig(
options=[ options=[
SelectOptionDict(label=x, value=x) SelectOptionDict(label=x, value=x)
for x in suggestions[args[arg].name] for x in suggestions[arg_key]
], ],
mode=SelectSelectorMode.DROPDOWN, mode=SelectSelectorMode.DROPDOWN,
custom_value=True, custom_value=True,
@@ -546,7 +548,7 @@ class WasteCollectionConfigFlow(ConfigFlow, domain=DOMAIN): # type: ignore[call
) )
if default == inspect.Signature.empty: if default == inspect.Signature.empty:
vol_args[vol.Required(args[arg].name, description=description)] = ( vol_args[vol.Required(arg_key, description=description)] = (
field_type or str field_type or str
) )
@@ -554,7 +556,7 @@ class WasteCollectionConfigFlow(ConfigFlow, domain=DOMAIN): # type: ignore[call
# Handle boolean, int, string, date, datetime, list defaults # Handle boolean, int, string, date, datetime, list defaults
vol_args[ vol_args[
vol.Optional( vol.Optional(
args[arg].name, arg_key,
default=UNDEFINED if default is None else default, default=UNDEFINED if default is None else default,
description=description, description=description,
) )
@@ -563,7 +565,7 @@ class WasteCollectionConfigFlow(ConfigFlow, domain=DOMAIN): # type: ignore[call
) )
else: else:
_LOGGER.debug( _LOGGER.debug(
f"Unsupported type: {type(default)}: {args[arg].name}: {default}: {field_type}" f"Unsupported type: {type(default)}: {arg_key}: {default}: {field_type}"
) )
schema = vol.Schema(vol_args) schema = vol.Schema(vol_args)
@@ -584,6 +586,7 @@ class WasteCollectionConfigFlow(ConfigFlow, domain=DOMAIN): # type: ignore[call
""" """
errors = {} errors = {}
description_placeholders: dict[str, str] = {} description_placeholders: dict[str, str] = {}
args_input = {k.removeprefix(f"{source}_"): v for k, v in args_input.items()}
if hasattr(module, "validate_params"): if hasattr(module, "validate_params"):
errors.update(module.validate_params(args_input)) errors.update(module.validate_params(args_input))
@@ -610,16 +613,17 @@ class WasteCollectionConfigFlow(ConfigFlow, domain=DOMAIN): # type: ignore[call
except SourceArgumentSuggestionsExceptionBase as e: except SourceArgumentSuggestionsExceptionBase as e:
if not hasattr(self, "_error_suggestions"): if not hasattr(self, "_error_suggestions"):
self._error_suggestions = {} self._error_suggestions = {}
self._error_suggestions.update({e.argument: e.suggestions}) arg_key = f"{source}_{e.argument}"
errors[e.argument] = "invalid_arg" self._error_suggestions.update({arg_key: e.suggestions})
errors[arg_key] = "invalid_arg"
description_placeholders["invalid_arg_message"] = e.simple_message description_placeholders["invalid_arg_message"] = e.simple_message
if e.suggestion_type != str and e.suggestion_type != int: if e.suggestion_type != str and e.suggestion_type != int:
description_placeholders["invalid_arg_message"] = e.message description_placeholders["invalid_arg_message"] = e.message
except SourceArgumentRequired as e: except SourceArgumentRequired as e:
errors[e.argument] = "invalid_arg" errors[f"{source}_{e.argument}"] = "invalid_arg"
description_placeholders["invalid_arg_message"] = e.message description_placeholders["invalid_arg_message"] = e.message
except SourceArgumentException as e: except SourceArgumentException as e:
errors[e.argument] = "invalid_arg" errors[f"{source}_{e.argument}"] = "invalid_arg"
description_placeholders["invalid_arg_message"] = e.message description_placeholders["invalid_arg_message"] = e.message
except SourceArgumentExceptionMultiple as e: except SourceArgumentExceptionMultiple as e:
description_placeholders["invalid_arg_message"] = e.message description_placeholders["invalid_arg_message"] = e.message
@@ -627,7 +631,7 @@ class WasteCollectionConfigFlow(ConfigFlow, domain=DOMAIN): # type: ignore[call
errors["base"] = "invalid_arg" errors["base"] = "invalid_arg"
else: else:
for arg in e.arguments: for arg in e.arguments:
errors[arg] = "invalid_arg" errors[f"{source}_{arg}"] = "invalid_arg"
except Exception as e: except Exception as e:
errors["base"] = "fetch_error" errors["base"] = "fetch_error"
description_placeholders["fetch_error_message"] = str(e) description_placeholders["fetch_error_message"] = str(e)

View File

@@ -67,11 +67,180 @@
"title": "Quelle konfigurieren", "title": "Quelle konfigurieren",
"description": "Konfiguriere deinen Service Provider. Für Details siehe die Quellen Dokumentation.", "description": "Konfiguriere deinen Service Provider. Für Details siehe die Quellen Dokumentation.",
"data": { "data": {
"ahk_heidekreis_de_city": "Ort",
"ahk_heidekreis_de_house_number": "Hausnummer",
"ahk_heidekreis_de_postcode": "PLZ",
"ahk_heidekreis_de_street": "Straße",
"art_trier_de_district": "Ort",
"art_trier_de_zip_code": "PLZ",
"asr_chemnitz_de_house_number": "Hausnummer",
"asr_chemnitz_de_object_number": "Objektnummer",
"asr_chemnitz_de_street": "Straße",
"awb_emsland_de_address_suffix": "Hausnummerzusatz",
"awb_emsland_de_city": "Ort",
"awb_emsland_de_house_number": "Hausnummer",
"awb_emsland_de_street": "Straße",
"awb_oldenburg_de_house_number": "Hausnummer",
"awb_oldenburg_de_street": "Straße",
"awbkoeln_de_building_number": "Hausnummer",
"awbkoeln_de_street_code": "Straßencode",
"awido_de_city": "Ort",
"awido_de_customer": "Kunde",
"awido_de_housenumber": "Hausnummer",
"awido_de_street": "Straße",
"awlneuss_de_building_number": "Hausnummer",
"awlneuss_de_street_code": "Straßencode",
"awlneuss_de_street_name": "Straßenname",
"awn_de_address_suffix": "Hausnummerzusatz",
"awn_de_city": "Ort",
"awn_de_house_number": "Hausnummer",
"awn_de_street": "Straße",
"awr_de_city": "Ort",
"awr_de_street": "Straße",
"awsh_de_city": "Ort",
"awsh_de_street": "Straße",
"berlin_recycling_de_password": "Passwort",
"berlin_recycling_de_username": "Benutzername",
"bielefeld_de_address_suffix": "Hausnummerzusatz",
"bielefeld_de_house_number": "Hausnummer",
"bielefeld_de_street": "Straße",
"bsr_de_abf_hausnr": "Hausnummer",
"bsr_de_abf_strasse": "Straße",
"buergerportal_de_district": "Ort",
"buergerportal_de_number": "Hausnummer",
"buergerportal_de_operator": "Betreiber",
"buergerportal_de_show_volume": "Große Container anzeigen",
"buergerportal_de_street": "Straße",
"buergerportal_de_subdistrict": "Ortsteil",
"calendar_title": "Kalender Titel", "calendar_title": "Kalender Titel",
"customer": "Kunde", "cederbaum_de_street": "Straße",
"street": "Straße", "dillingen_saar_de_street": "Straße",
"city": "Ort", "ead_darmstadt_de_street": "Straße",
"housenumber": "Hausnummer" "egn_abfallkalender_de_city": "Ort",
"egn_abfallkalender_de_district": "Ortsteil",
"egn_abfallkalender_de_housenumber": "Hausnummer",
"egn_abfallkalender_de_street": "Straße",
"eigenbetrieb_abfallwirtschaft_de_city": "Ort",
"eigenbetrieb_abfallwirtschaft_de_street": "Straße",
"erlangen_hoechstadt_de_city": "Ort",
"erlangen_hoechstadt_de_street": "Straße",
"geoport_nwm_de_district": "Ortsteil",
"hausmuell_info_hausnummer": "Hausnummer",
"hausmuell_info_ort": "Ort",
"hausmuell_info_ortsteil": "Ortsteil",
"hausmuell_info_strasse": "Straße",
"hausmuell_info_subdomain": "Subdomain",
"heilbronn_de_hausnr": "Hausnummer",
"heilbronn_de_plz": "PLZ",
"heilbronn_de_strasse": "Straße",
"ics_file": "Datei",
"ics_headers": "Headers",
"ics_method": "Methode",
"ics_offset": "Offset",
"ics_params": "Parameter",
"ics_regex": "Regulärer Ausdruck",
"ics_split_at": "Trennen bei",
"ics_title_template": "Titelvorlage",
"ics_url": "URL",
"ics_verify_ssl": "SSL-Verifizierung aktivieren",
"ics_version": "Version",
"ics_year_field": "Jahresfeld",
"infeo_at_city": "Ort",
"infeo_at_customer": "Kunde",
"infeo_at_housenumber": "Hausnummer",
"infeo_at_street": "Straße",
"infeo_at_zone": "Zone",
"insert_it_de_hnr": "Hausnummer",
"insert_it_de_location_id": "Standort ID",
"insert_it_de_municipality": "Ort",
"insert_it_de_street": "Straße",
"jumomind_de_area_id": "Bereich ID",
"jumomind_de_city": "Ort",
"jumomind_de_city_id": "Ort ID",
"jumomind_de_house_number": "Hausnummer",
"jumomind_de_service_id": "Service ID",
"jumomind_de_street": "Straße",
"karlsruhe_de_hnr": "Hausnummer",
"karlsruhe_de_ladeort": "Ladeort",
"karlsruhe_de_street": "Straße",
"korneuburg_stadtservice_at_street_name": "Straßenname",
"korneuburg_stadtservice_at_street_number": "Hausnummer",
"korneuburg_stadtservice_at_teilgebiet": "Teilgebiet",
"ks_boerde_de_house_number": "Hausnummer",
"ks_boerde_de_street": "Straße",
"ks_boerde_de_village": "Ort",
"kwb_goslar_de_pois": "POIS",
"kwu_de_city": "Ort",
"kwu_de_number": "Hausnummer",
"kwu_de_street": "Straße",
"landkreis_rhoen_grabfeld_city": "Ort",
"landkreis_rhoen_grabfeld_district": "Ortsteil",
"landkreis_wittmund_de_city": "Ort",
"landkreis_wittmund_de_street": "Straße",
"lindau_ch_city": "Ort",
"lrasha_de_location": "Gebiet",
"mags_de_number": "Hausnummer",
"mags_de_street": "Straße",
"mags_de_turnus": "Turnus",
"meinawb_de_address_suffix": "Hausnummerzusatz",
"meinawb_de_city": "Ort",
"meinawb_de_house_number": "Hausnummer",
"meinawb_de_street": "Strasse",
"monaloga_de_plz": "PLZ",
"monaloga_de_street": "Straße",
"muellabfuhr_de_city": "Ort",
"muellabfuhr_de_client": "Client",
"muellabfuhr_de_district": "Ortsteil",
"muellabfuhr_de_street": "Straße",
"muellmax_de_mm_frm_hnr_sel": "Hausnummer",
"muellmax_de_mm_frm_ort_sel": "Ort",
"muellmax_de_mm_frm_str_sel": "Straße",
"muellmax_de_service": "Service",
"muenchenstein_ch_waste_district": "Abfuhrkreis",
"offenbach_de_f_id_location": "Standort ID",
"potsdam_de_bio_rhythm": "Bio Rhythmus",
"potsdam_de_gelb_rhythm": "Gelb Rhythmus",
"potsdam_de_ortsteil": "Ortsteil",
"potsdam_de_papier_rhythm": "Papier Rhythmus",
"potsdam_de_rest_rhythm": "Restabfall Rhythmus",
"potsdam_de_strasse": "Straße",
"real_luzern_ch_municipality_id": "Orts ID",
"real_luzern_ch_street_id": "Strassen ID",
"regioentsorgung_de_city": "Ort",
"regioentsorgung_de_house_number": "Hausnummer",
"regioentsorgung_de_street": "Straße",
"rh_entsorgung_de_address_suffix": "Hausnummerzusatz",
"rh_entsorgung_de_city": "Ort",
"rh_entsorgung_de_house_number": "Hausnummer",
"rh_entsorgung_de_street": "Straße",
"sbazv_de_city": "Ort",
"sbazv_de_district": "Ortsteil",
"sbazv_de_street": "Straße",
"sector27_de_city": "Ort",
"sector27_de_street": "Straße",
"stuttgart_de_street": "Straße",
"stuttgart_de_streetnr": "Hausnummer",
"tbv_velbert_de_street": "Straße",
"tonnenleerung_de_url": "URL",
"was_wolfsburg_de_city": "Ort",
"was_wolfsburg_de_street": "Straße",
"wermelskirchen_de_house_number": "Hausnummer",
"wermelskirchen_de_street": "Straße",
"wsz_moosburg_at_address": "Adresse",
"wsz_moosburg_at_address_id": "Adressen ID",
"wsz_moosburg_at_municipal": "Gemeinde",
"wsz_moosburg_at_street": "Straße",
"wuerzburg_de_district": "Stadtteil",
"wuerzburg_de_street": "Straße",
"zakb_de_hnr": "Hausnummer",
"zakb_de_hnr_zusatz": "Hausnummerzusatz",
"zakb_de_ort": "Ort",
"zakb_de_strasse": "Straße",
"zva_sek_de_bezirk": "Abfuhrbezirk",
"zva_sek_de_ortsteil": "Ortsteil",
"zva_sek_de_strasse": "Straße",
"zva_wmk_de_city": "Ort",
"zva_wmk_de_street": "Straße"
}, },
"data_description": { "data_description": {
"calendar_title": "Ein lesbarerer oder benutzerfreundlicherer Name für den Müllkalender. Wenn nichts angegeben wird, wird der Name der Quelle verwendet." "calendar_title": "Ein lesbarerer oder benutzerfreundlicherer Name für den Müllkalender. Wenn nichts angegeben wird, wird der Name der Quelle verwendet."
@@ -110,11 +279,180 @@
"title": "Quelle Neu Konfigurieren", "title": "Quelle Neu Konfigurieren",
"description": "Konfiguriere deinen Service Provider. Für Details siehe die Quellen Dokumentation.", "description": "Konfiguriere deinen Service Provider. Für Details siehe die Quellen Dokumentation.",
"data": { "data": {
"ahk_heidekreis_de_city": "Ort",
"ahk_heidekreis_de_house_number": "Hausnummer",
"ahk_heidekreis_de_postcode": "PLZ",
"ahk_heidekreis_de_street": "Straße",
"art_trier_de_district": "Ort",
"art_trier_de_zip_code": "PLZ",
"asr_chemnitz_de_house_number": "Hausnummer",
"asr_chemnitz_de_object_number": "Objektnummer",
"asr_chemnitz_de_street": "Straße",
"awb_emsland_de_address_suffix": "Hausnummerzusatz",
"awb_emsland_de_city": "Ort",
"awb_emsland_de_house_number": "Hausnummer",
"awb_emsland_de_street": "Straße",
"awb_oldenburg_de_house_number": "Hausnummer",
"awb_oldenburg_de_street": "Straße",
"awbkoeln_de_building_number": "Hausnummer",
"awbkoeln_de_street_code": "Straßencode",
"awido_de_city": "Ort",
"awido_de_customer": "Kunde",
"awido_de_housenumber": "Hausnummer",
"awido_de_street": "Straße",
"awlneuss_de_building_number": "Hausnummer",
"awlneuss_de_street_code": "Straßencode",
"awlneuss_de_street_name": "Straßenname",
"awn_de_address_suffix": "Hausnummerzusatz",
"awn_de_city": "Ort",
"awn_de_house_number": "Hausnummer",
"awn_de_street": "Straße",
"awr_de_city": "Ort",
"awr_de_street": "Straße",
"awsh_de_city": "Ort",
"awsh_de_street": "Straße",
"berlin_recycling_de_password": "Passwort",
"berlin_recycling_de_username": "Benutzername",
"bielefeld_de_address_suffix": "Hausnummerzusatz",
"bielefeld_de_house_number": "Hausnummer",
"bielefeld_de_street": "Straße",
"bsr_de_abf_hausnr": "Hausnummer",
"bsr_de_abf_strasse": "Straße",
"buergerportal_de_district": "Ort",
"buergerportal_de_number": "Hausnummer",
"buergerportal_de_operator": "Betreiber",
"buergerportal_de_show_volume": "Große Container anzeigen",
"buergerportal_de_street": "Straße",
"buergerportal_de_subdistrict": "Ortsteil",
"calendar_title": "Kalender Titel", "calendar_title": "Kalender Titel",
"customer": "Kunde", "cederbaum_de_street": "Straße",
"street": "Straße", "dillingen_saar_de_street": "Straße",
"city": "Ort", "ead_darmstadt_de_street": "Straße",
"housenumber": "Hausnummer" "egn_abfallkalender_de_city": "Ort",
"egn_abfallkalender_de_district": "Ortsteil",
"egn_abfallkalender_de_housenumber": "Hausnummer",
"egn_abfallkalender_de_street": "Straße",
"eigenbetrieb_abfallwirtschaft_de_city": "Ort",
"eigenbetrieb_abfallwirtschaft_de_street": "Straße",
"erlangen_hoechstadt_de_city": "Ort",
"erlangen_hoechstadt_de_street": "Straße",
"geoport_nwm_de_district": "Ortsteil",
"hausmuell_info_hausnummer": "Hausnummer",
"hausmuell_info_ort": "Ort",
"hausmuell_info_ortsteil": "Ortsteil",
"hausmuell_info_strasse": "Straße",
"hausmuell_info_subdomain": "Subdomain",
"heilbronn_de_hausnr": "Hausnummer",
"heilbronn_de_plz": "PLZ",
"heilbronn_de_strasse": "Straße",
"ics_file": "Datei",
"ics_headers": "Headers",
"ics_method": "Methode",
"ics_offset": "Offset",
"ics_params": "Parameter",
"ics_regex": "Regulärer Ausdruck",
"ics_split_at": "Trennen bei",
"ics_title_template": "Titelvorlage",
"ics_url": "URL",
"ics_verify_ssl": "SSL-Verifizierung aktivieren",
"ics_version": "Version",
"ics_year_field": "Jahresfeld",
"infeo_at_city": "Ort",
"infeo_at_customer": "Kunde",
"infeo_at_housenumber": "Hausnummer",
"infeo_at_street": "Straße",
"infeo_at_zone": "Zone",
"insert_it_de_hnr": "Hausnummer",
"insert_it_de_location_id": "Standort ID",
"insert_it_de_municipality": "Ort",
"insert_it_de_street": "Straße",
"jumomind_de_area_id": "Bereich ID",
"jumomind_de_city": "Ort",
"jumomind_de_city_id": "Ort ID",
"jumomind_de_house_number": "Hausnummer",
"jumomind_de_service_id": "Service ID",
"jumomind_de_street": "Straße",
"karlsruhe_de_hnr": "Hausnummer",
"karlsruhe_de_ladeort": "Ladeort",
"karlsruhe_de_street": "Straße",
"korneuburg_stadtservice_at_street_name": "Straßenname",
"korneuburg_stadtservice_at_street_number": "Hausnummer",
"korneuburg_stadtservice_at_teilgebiet": "Teilgebiet",
"ks_boerde_de_house_number": "Hausnummer",
"ks_boerde_de_street": "Straße",
"ks_boerde_de_village": "Ort",
"kwb_goslar_de_pois": "POIS",
"kwu_de_city": "Ort",
"kwu_de_number": "Hausnummer",
"kwu_de_street": "Straße",
"landkreis_rhoen_grabfeld_city": "Ort",
"landkreis_rhoen_grabfeld_district": "Ortsteil",
"landkreis_wittmund_de_city": "Ort",
"landkreis_wittmund_de_street": "Straße",
"lindau_ch_city": "Ort",
"lrasha_de_location": "Gebiet",
"mags_de_number": "Hausnummer",
"mags_de_street": "Straße",
"mags_de_turnus": "Turnus",
"meinawb_de_address_suffix": "Hausnummerzusatz",
"meinawb_de_city": "Ort",
"meinawb_de_house_number": "Hausnummer",
"meinawb_de_street": "Strasse",
"monaloga_de_plz": "PLZ",
"monaloga_de_street": "Straße",
"muellabfuhr_de_city": "Ort",
"muellabfuhr_de_client": "Client",
"muellabfuhr_de_district": "Ortsteil",
"muellabfuhr_de_street": "Straße",
"muellmax_de_mm_frm_hnr_sel": "Hausnummer",
"muellmax_de_mm_frm_ort_sel": "Ort",
"muellmax_de_mm_frm_str_sel": "Straße",
"muellmax_de_service": "Service",
"muenchenstein_ch_waste_district": "Abfuhrkreis",
"offenbach_de_f_id_location": "Standort ID",
"potsdam_de_bio_rhythm": "Bio Rhythmus",
"potsdam_de_gelb_rhythm": "Gelb Rhythmus",
"potsdam_de_ortsteil": "Ortsteil",
"potsdam_de_papier_rhythm": "Papier Rhythmus",
"potsdam_de_rest_rhythm": "Restabfall Rhythmus",
"potsdam_de_strasse": "Straße",
"real_luzern_ch_municipality_id": "Orts ID",
"real_luzern_ch_street_id": "Strassen ID",
"regioentsorgung_de_city": "Ort",
"regioentsorgung_de_house_number": "Hausnummer",
"regioentsorgung_de_street": "Straße",
"rh_entsorgung_de_address_suffix": "Hausnummerzusatz",
"rh_entsorgung_de_city": "Ort",
"rh_entsorgung_de_house_number": "Hausnummer",
"rh_entsorgung_de_street": "Straße",
"sbazv_de_city": "Ort",
"sbazv_de_district": "Ortsteil",
"sbazv_de_street": "Straße",
"sector27_de_city": "Ort",
"sector27_de_street": "Straße",
"stuttgart_de_street": "Straße",
"stuttgart_de_streetnr": "Hausnummer",
"tbv_velbert_de_street": "Straße",
"tonnenleerung_de_url": "URL",
"was_wolfsburg_de_city": "Ort",
"was_wolfsburg_de_street": "Straße",
"wermelskirchen_de_house_number": "Hausnummer",
"wermelskirchen_de_street": "Straße",
"wsz_moosburg_at_address": "Adresse",
"wsz_moosburg_at_address_id": "Adressen ID",
"wsz_moosburg_at_municipal": "Gemeinde",
"wsz_moosburg_at_street": "Straße",
"wuerzburg_de_district": "Stadtteil",
"wuerzburg_de_street": "Straße",
"zakb_de_hnr": "Hausnummer",
"zakb_de_hnr_zusatz": "Hausnummerzusatz",
"zakb_de_ort": "Ort",
"zakb_de_strasse": "Straße",
"zva_sek_de_bezirk": "Abfuhrbezirk",
"zva_sek_de_ortsteil": "Ortsteil",
"zva_sek_de_strasse": "Straße",
"zva_wmk_de_city": "Ort",
"zva_wmk_de_street": "Straße"
} }
} }
}, },

View File

@@ -34,6 +34,7 @@ START_SERVICE_SECTION = "<!--Begin of service section-->"
END_SERVICE_SECTION = "<!--End of service section-->" END_SERVICE_SECTION = "<!--End of service section-->"
LANGUAGES = ["en", "de"] LANGUAGES = ["en", "de"]
ARG_TRANSLATIONS_TO_KEEP = ["calendar_title"]
class SourceInfo: class SourceInfo:
@@ -401,20 +402,12 @@ def update_json(
"default_params": e.extra_info_default_params, "default_params": e.extra_info_default_params,
} }
) )
params.update(e.params) params.update([f"{e.module}_{p}" for p in e.params])
for lang, translations in e.custom_param_translation.items(): for lang, translations in e.custom_param_translation.items():
if lang in param_translations: if lang in param_translations:
for key, value in translations.items(): param_translations[lang].update(
if ( {f"{e.module}_{k}": v for k, v in translations.items()}
key in param_translations[lang]
and value != param_translations[lang][key]
):
print(
f'Conflicting translations for language {lang} "{key}" => "{value}" ({e.module}) AND "{param_translations[lang][key]}"'
) )
param_translations[lang].update(translations)
else: else:
param_translations[lang] = translations.copy() param_translations[lang] = translations.copy()
@@ -434,9 +427,13 @@ def update_json(
) as f: ) as f:
translations = json.load(f) translations = json.load(f)
arg_translations = translations["config"]["step"]["args"]["data"] arg_translations = {}
for key, value in translations["config"]["step"]["args"]["data"].items():
if key in ARG_TRANSLATIONS_TO_KEEP:
arg_translations[key] = value
for param in params: for param in params:
param = f"{param}"
if param in param_translations.get(lang, {}): if param in param_translations.get(lang, {}):
arg_translations[param] = param_translations[lang][param] arg_translations[param] = param_translations[lang][param]
elif lang == "en" and param not in arg_translations: elif lang == "en" and param not in arg_translations:
@@ -444,6 +441,9 @@ def update_json(
[s.capitalize() for s in split_camel_and_snake_case(param)] [s.capitalize() for s in split_camel_and_snake_case(param)]
) )
arg_translations = {k: arg_translations[k] for k in sorted(arg_translations)}
translations["config"]["step"]["args"]["data"] = arg_translations
translations["config"]["step"]["reconfigure"]["data"] = arg_translations translations["config"]["step"]["reconfigure"]["data"] = arg_translations
with open( with open(