mirror of
https://github.com/home-assistant/core.git
synced 2025-08-31 02:11:32 +02:00
Add using dict keys
This commit is contained in:
@@ -38,35 +38,11 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"step": {
|
"step": {
|
||||||
"init": {
|
"init": {
|
||||||
"data": {
|
"data": "[%dict:component::sql::config::step::user::data%]",
|
||||||
"db_url": "[%key:component::sql::config::step::user::data::db_url%]",
|
"data_description": "[%dict:component::sql::config::step::user::data_description%]"
|
||||||
"name": "[%key:common::config_flow::data::name%]",
|
|
||||||
"query": "[%key:component::sql::config::step::user::data::query%]",
|
|
||||||
"column": "[%key:component::sql::config::step::user::data::column%]",
|
|
||||||
"unit_of_measurement": "[%key:component::sql::config::step::user::data::unit_of_measurement%]",
|
|
||||||
"value_template": "[%key:component::sql::config::step::user::data::value_template%]",
|
|
||||||
"device_class": "[%key:component::sql::config::step::user::data::device_class%]",
|
|
||||||
"state_class": "[%key:component::sql::config::step::user::data::state_class%]"
|
|
||||||
},
|
|
||||||
"data_description": {
|
|
||||||
"db_url": "[%key:component::sql::config::step::user::data_description::db_url%]",
|
|
||||||
"name": "[%key:component::sql::config::step::user::data_description::name%]",
|
|
||||||
"query": "[%key:component::sql::config::step::user::data_description::query%]",
|
|
||||||
"column": "[%key:component::sql::config::step::user::data_description::column%]",
|
|
||||||
"unit_of_measurement": "[%key:component::sql::config::step::user::data_description::unit_of_measurement%]",
|
|
||||||
"value_template": "[%key:component::sql::config::step::user::data_description::value_template%]",
|
|
||||||
"device_class": "[%key:component::sql::config::step::user::data_description::device_class%]",
|
|
||||||
"state_class": "[%key:component::sql::config::step::user::data_description::state_class%]"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": "[%dict:component::sql::config::error%]"
|
||||||
"db_url_invalid": "[%key:component::sql::config::error::db_url_invalid%]",
|
|
||||||
"query_invalid": "[%key:component::sql::config::error::query_invalid%]",
|
|
||||||
"query_no_read_only": "[%key:component::sql::config::error::query_no_read_only%]",
|
|
||||||
"multiple_queries": "[%key:component::sql::config::error::multiple_queries%]",
|
|
||||||
"column_invalid": "[%key:component::sql::config::error::column_invalid%]"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"selector": {
|
"selector": {
|
||||||
"device_class": {
|
"device_class": {
|
||||||
@@ -130,14 +106,7 @@
|
|||||||
"wind_speed": "[%key:component::sensor::entity_component::wind_speed::name%]"
|
"wind_speed": "[%key:component::sensor::entity_component::wind_speed::name%]"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state_class": {
|
"state_class": "[%dict:component::sensor::entity_component::_::state_attributes::state_class%]"
|
||||||
"options": {
|
|
||||||
"measurement": "[%key:component::sensor::entity_component::_::state_attributes::state_class::state::measurement%]",
|
|
||||||
"measurement_angle": "[%key:component::sensor::entity_component::_::state_attributes::state_class::state::measurement_angle%]",
|
|
||||||
"total": "[%key:component::sensor::entity_component::_::state_attributes::state_class::state::total%]",
|
|
||||||
"total_increasing": "[%key:component::sensor::entity_component::_::state_attributes::state_class::state::total_increasing%]"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"issues": {
|
"issues": {
|
||||||
"entity_id_query_does_full_table_scan": {
|
"entity_id_query_does_full_table_scan": {
|
||||||
|
@@ -31,16 +31,34 @@ def get_arguments() -> argparse.Namespace:
|
|||||||
return parser.parse_args()
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
def substitute_translation_references(integration_strings, flattened_translations):
|
def substitute_translation_references(
|
||||||
|
integration_strings, flattened_translations, translations
|
||||||
|
):
|
||||||
"""Recursively processes all translation strings for the integration."""
|
"""Recursively processes all translation strings for the integration."""
|
||||||
result = {}
|
result = {}
|
||||||
for key, value in integration_strings.items():
|
for key, value in integration_strings.items():
|
||||||
if isinstance(value, dict):
|
if isinstance(value, dict):
|
||||||
sub_dict = substitute_translation_references(value, flattened_translations)
|
sub_dict = substitute_translation_references(
|
||||||
|
value, flattened_translations, translations
|
||||||
|
)
|
||||||
result[key] = sub_dict
|
result[key] = sub_dict
|
||||||
elif isinstance(value, str):
|
elif isinstance(value, str):
|
||||||
|
if value.startswith(r"[%dict:"):
|
||||||
|
paths = value.removeprefix(r"[%dict:").removesuffix("%]").split("::")
|
||||||
|
values = translations
|
||||||
|
for path in paths:
|
||||||
|
if path not in values:
|
||||||
|
print(
|
||||||
|
f"Invalid dict key '{'::'.join(paths)}' found in string '{value}'"
|
||||||
|
)
|
||||||
|
sys.exit(1)
|
||||||
|
values = values[path]
|
||||||
|
sub_dict = substitute_translation_references(
|
||||||
|
values, flattened_translations, translations
|
||||||
|
)
|
||||||
|
result[key] = sub_dict
|
||||||
|
else:
|
||||||
result[key] = substitute_reference(value, flattened_translations)
|
result[key] = substitute_reference(value, flattened_translations)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
@@ -78,7 +96,7 @@ def run_single(translations, flattened_translations, integration):
|
|||||||
integration_strings = translations["component"][integration]
|
integration_strings = translations["component"][integration]
|
||||||
|
|
||||||
translations["component"][integration] = substitute_translation_references(
|
translations["component"][integration] = substitute_translation_references(
|
||||||
integration_strings, flattened_translations
|
integration_strings, flattened_translations, translations
|
||||||
)
|
)
|
||||||
|
|
||||||
if download.DOWNLOAD_DIR.is_dir():
|
if download.DOWNLOAD_DIR.is_dir():
|
||||||
|
@@ -151,7 +151,16 @@ def pick_keys(component: str, translations: dict[str, Any]) -> dict[str, Any]:
|
|||||||
flat_translations = flatten_translations(translations)
|
flat_translations = flatten_translations(translations)
|
||||||
flat_current_keys = flatten_translations(get_current_keys(component))
|
flat_current_keys = flatten_translations(get_current_keys(component))
|
||||||
flatten_result = {}
|
flatten_result = {}
|
||||||
for key in flat_current_keys:
|
for key, value in flat_current_keys.items():
|
||||||
|
if value.startswith(r"[%dict"):
|
||||||
|
flatten_result.update(
|
||||||
|
{
|
||||||
|
translated_key: translated_value
|
||||||
|
for translated_key, translated_value in flat_translations.items()
|
||||||
|
if translated_key.startswith(key)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
if key in flat_translations:
|
if key in flat_translations:
|
||||||
flatten_result[key] = flat_translations[key]
|
flatten_result[key] = flat_translations[key]
|
||||||
result = {}
|
result = {}
|
||||||
|
@@ -68,7 +68,7 @@ def load_json_from_path(path: pathlib.Path) -> Any:
|
|||||||
raise JSONDecodeErrorWithPath(err.msg, err.doc, err.pos, path) from err
|
raise JSONDecodeErrorWithPath(err.msg, err.doc, err.pos, path) from err
|
||||||
|
|
||||||
|
|
||||||
def flatten_translations(translations):
|
def flatten_translations(translations: dict[str, Any]) -> dict[str, Any]:
|
||||||
"""Flatten all translations."""
|
"""Flatten all translations."""
|
||||||
stack = [iter(translations.items())]
|
stack = [iter(translations.items())]
|
||||||
key_stack = []
|
key_stack = []
|
||||||
|
Reference in New Issue
Block a user