Skip to content

Commit

Permalink
Use language util to match intent language (#138560)
Browse files Browse the repository at this point in the history
  • Loading branch information
synesthesiam authored Feb 15, 2025
1 parent 4a4c2ff commit 30a6a6a
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 10 deletions.
15 changes: 5 additions & 10 deletions homeassistant/components/conversation/default_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
)
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
Expand Down Expand Up @@ -914,26 +915,20 @@ async def async_get_or_load_intents(self, language: str) -> LanguageIntents | No
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)

Expand Down
36 changes: 36 additions & 0 deletions tests/components/conversation/test_default_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]}

0 comments on commit 30a6a6a

Please sign in to comment.