mirror of
https://github.com/home-assistant/core.git
synced 2025-07-09 14:27:07 +00:00
Use language util to match intent language (#138560)
This commit is contained in:
parent
4a4c2ff552
commit
30a6a6ad4b
@ -53,6 +53,7 @@ from homeassistant.helpers import (
|
|||||||
)
|
)
|
||||||
from homeassistant.helpers.entity_component import EntityComponent
|
from homeassistant.helpers.entity_component import EntityComponent
|
||||||
from homeassistant.helpers.event import async_track_state_added_domain
|
from homeassistant.helpers.event import async_track_state_added_domain
|
||||||
|
from homeassistant.util import language as language_util
|
||||||
from homeassistant.util.json import JsonObjectType, json_loads_object
|
from homeassistant.util.json import JsonObjectType, json_loads_object
|
||||||
|
|
||||||
from .chat_log import AssistantContent, async_get_chat_log
|
from .chat_log import AssistantContent, async_get_chat_log
|
||||||
@ -914,26 +915,20 @@ class DefaultAgent(ConversationEntity):
|
|||||||
def _load_intents(self, language: str) -> LanguageIntents | None:
|
def _load_intents(self, language: str) -> LanguageIntents | None:
|
||||||
"""Load all intents for language (run inside executor)."""
|
"""Load all intents for language (run inside executor)."""
|
||||||
intents_dict: dict[str, Any] = {}
|
intents_dict: dict[str, Any] = {}
|
||||||
language_variant: str | None = None
|
|
||||||
supported_langs = set(get_languages())
|
supported_langs = set(get_languages())
|
||||||
|
|
||||||
# Choose a language variant upfront and commit to it for custom
|
# Choose a language variant upfront and commit to it for custom
|
||||||
# sentences, etc.
|
# sentences, etc.
|
||||||
all_language_variants = {lang.lower(): lang for lang in supported_langs}
|
lang_matches = language_util.matches(language, supported_langs)
|
||||||
|
|
||||||
# en-US, en_US, en, ...
|
if not lang_matches:
|
||||||
for maybe_variant in _get_language_variations(language):
|
|
||||||
matching_variant = all_language_variants.get(maybe_variant.lower())
|
|
||||||
if matching_variant:
|
|
||||||
language_variant = matching_variant
|
|
||||||
break
|
|
||||||
|
|
||||||
if not language_variant:
|
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"Unable to find supported language variant for %s", language
|
"Unable to find supported language variant for %s", language
|
||||||
)
|
)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
language_variant = lang_matches[0]
|
||||||
|
|
||||||
# Load intents for this language variant
|
# Load intents for this language variant
|
||||||
lang_variant_intents = get_intents(language_variant, json_load=json_load)
|
lang_variant_intents = get_intents(language_variant, json_load=json_load)
|
||||||
|
|
||||||
|
@ -3178,3 +3178,39 @@ async def test_state_names_are_not_translated(
|
|||||||
mock_async_render.call_args.args[0]["state"].state
|
mock_async_render.call_args.args[0]["state"].state
|
||||||
== weather.ATTR_CONDITION_PARTLYCLOUDY
|
== weather.ATTR_CONDITION_PARTLYCLOUDY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def test_language_with_alternative_code(
|
||||||
|
hass: HomeAssistant, init_components
|
||||||
|
) -> None:
|
||||||
|
"""Test different codes for the same language."""
|
||||||
|
entity_ids: dict[str, str] = {}
|
||||||
|
for i, (lang_code, sentence, name) in enumerate(
|
||||||
|
(
|
||||||
|
("no", "slå på lampen", "lampen"), # nb
|
||||||
|
("no-NO", "slå på lampen", "lampen"), # nb
|
||||||
|
("iw", "הדליקי את המנורה", "מנורה"), # he
|
||||||
|
)
|
||||||
|
):
|
||||||
|
if not (entity_id := entity_ids.get(name)):
|
||||||
|
# Reuse entity id for the same name
|
||||||
|
entity_id = f"light.test{i}"
|
||||||
|
entity_ids[name] = entity_id
|
||||||
|
|
||||||
|
hass.states.async_set(entity_id, "off", attributes={ATTR_FRIENDLY_NAME: name})
|
||||||
|
calls = async_mock_service(hass, LIGHT_DOMAIN, "turn_on")
|
||||||
|
await hass.services.async_call(
|
||||||
|
"conversation",
|
||||||
|
"process",
|
||||||
|
{
|
||||||
|
conversation.ATTR_TEXT: sentence,
|
||||||
|
conversation.ATTR_LANGUAGE: lang_code,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
assert len(calls) == 1, f"Failed for {lang_code}, {sentence}"
|
||||||
|
call = calls[0]
|
||||||
|
assert call.domain == LIGHT_DOMAIN
|
||||||
|
assert call.service == "turn_on"
|
||||||
|
assert call.data == {"entity_id": [entity_id]}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user