Use language util to match intent language (#138560)
parent
4a4c2ff552
commit
30a6a6ad4b
|
@ -53,6 +53,7 @@ from homeassistant.helpers import (
|
|||
)
|
||||
from homeassistant.helpers.entity_component import EntityComponent
|
||||
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 .chat_log import AssistantContent, async_get_chat_log
|
||||
|
@ -914,26 +915,20 @@ class DefaultAgent(ConversationEntity):
|
|||
def _load_intents(self, language: str) -> LanguageIntents | None:
|
||||
"""Load all intents for language (run inside executor)."""
|
||||
intents_dict: dict[str, Any] = {}
|
||||
language_variant: str | None = None
|
||||
supported_langs = set(get_languages())
|
||||
|
||||
# Choose a language variant upfront and commit to it for custom
|
||||
# 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, ...
|
||||
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:
|
||||
if not lang_matches:
|
||||
_LOGGER.warning(
|
||||
"Unable to find supported language variant for %s", language
|
||||
)
|
||||
return None
|
||||
|
||||
language_variant = lang_matches[0]
|
||||
|
||||
# Load intents for this language variant
|
||||
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
|
||||
== 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…
Reference in New Issue