├── .github └── workflows │ ├── hacs.yaml │ ├── hassfest.yaml │ └── release.yml ├── README.md ├── custom_components └── google_assistant_sdk_custom │ ├── __init__.py │ ├── application_credentials.py │ ├── config_flow.py │ ├── const.py │ ├── diagnostics.py │ ├── helpers.py │ ├── icons.json │ ├── manifest.json │ ├── notify.py │ ├── services.yaml │ ├── strings.json │ └── translations │ ├── bg.json │ ├── ca.json │ ├── cs.json │ ├── da.json │ ├── de.json │ ├── el.json │ ├── en.json │ ├── es.json │ ├── et.json │ ├── fi.json │ ├── fr.json │ ├── gl.json │ ├── he.json │ ├── hu.json │ ├── id.json │ ├── it.json │ ├── ja.json │ ├── ko.json │ ├── lt.json │ ├── lv.json │ ├── nb.json │ ├── nl.json │ ├── pl.json │ ├── pt-BR.json │ ├── pt.json │ ├── ro.json │ ├── ru.json │ ├── sk.json │ ├── sv.json │ ├── tr.json │ ├── uk.json │ ├── vi.json │ ├── zh-Hans.json │ └── zh-Hant.json └── hacs.json /.github/workflows/hacs.yaml: -------------------------------------------------------------------------------- 1 | name: HACS Action 2 | 3 | on: 4 | push: 5 | pull_request: 6 | schedule: 7 | - cron: "0 0 * * *" 8 | 9 | jobs: 10 | hacs: 11 | name: HACS Action 12 | runs-on: "ubuntu-latest" 13 | steps: 14 | - name: HACS Action 15 | uses: "hacs/action@main" 16 | with: 17 | category: "integration" 18 | -------------------------------------------------------------------------------- /.github/workflows/hassfest.yaml: -------------------------------------------------------------------------------- 1 | name: Validate with hassfest 2 | 3 | on: 4 | push: 5 | pull_request: 6 | schedule: 7 | - cron: '0 0 * * *' 8 | 9 | jobs: 10 | validate: 11 | runs-on: "ubuntu-latest" 12 | steps: 13 | - uses: "actions/checkout@v3" 14 | - uses: "home-assistant/actions/hassfest@master" 15 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "Release" 3 | 4 | on: 5 | release: 6 | types: 7 | - published 8 | 9 | jobs: 10 | release: 11 | name: "Release google_assistant_sdk_custom" 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: "⬇️ Checkout the repository" 15 | uses: actions/checkout@v3 16 | 17 | - name: "🔢 Adjust version number" 18 | shell: bash 19 | run: | 20 | version="${{ github.event.release.tag_name }}" 21 | version="${version,,}" 22 | version="${version#v}" 23 | yq e -P -o=json \ 24 | -i ".version = \"${version}\"" \ 25 | "${{ github.workspace }}/custom_components/google_assistant_sdk_custom/manifest.json" 26 | - name: "📦 Created zipped release package" 27 | shell: bash 28 | run: | 29 | cd "${{ github.workspace }}/custom_components/google_assistant_sdk_custom" 30 | zip google_assistant_sdk_custom.zip -r ./ 31 | - name: "⬆️ Upload zip to release" 32 | uses: softprops/action-gh-release@v0.1.15 33 | with: 34 | files: ${{ github.workspace }}/custom_components/google_assistant_sdk_custom/google_assistant_sdk_custom.zip 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Google Assistant SDK Custom integration for Home Assistant 2 | 3 | [![hacs_badge](https://img.shields.io/badge/HACS-Default-41BDF5.svg)](https://github.com/hacs/integration) 4 | 5 | # About 6 | 7 | This integration is a copy of [Google Assistant SDK integration](https://www.home-assistant.io/integrations/google_assistant_sdk/) with the following additional features: 8 | 9 | - HTML responses as text from commands to Google Assistant 10 | 11 | ## Why aren't these changes in the core Google Assistant SDK integration? 12 | 13 | Due to a [bug](https://github.com/googlesamples/assistant-sdk-python/issues/391) in the Google Assistant API, 14 | not all responses contain text, especially for home control commands, like turn on the lights. 15 | The workaround, per the linked bug, is to enable HTML output and then parse the HTML for the text. 16 | Because the core integrations are [not allowed](https://github.com/home-assistant/architecture/blob/master/adr/0004-webscraping.md) to parse HTML, 17 | this custom integration is needed. 18 | 19 | # Installation 20 | 21 | ## HACS 22 | 23 | 1. [Add](http://homeassistant.local:8123/hacs/integrations) custom integrations repository: 24 | 2. Select "Google Assistant SDK Custom" in the Integration tab and click download 25 | 3. Restart Home Assistant 26 | 4. Enable the integration 27 | 28 | ## Manual 29 | 30 | 1. Copy directory `custom_components/google_assistant_sdk_custom` to your `/custom_components` directory 31 | 2. Restart Home-Assistant 32 | 3. Enable the integration 33 | 34 | ## Enable the integration 35 | 36 | 1. Go to [Settings / Devices & Services / Integrations](http://homeassistant.local:8123/config/integrations). Click **+ ADD INTEGRATION** 37 | 2. Search for "Google Assistant SDK Custom" and click on it 38 | 39 | # Examples 40 | 41 | ## Nest Guard 42 | 43 | Following example allows controlling Nest Guard and getting its status in a text helper. 44 | A similar approach, especially the automation that polls the status, can be used for other devices, 45 | for which a template, e.g. [template light](https://www.home-assistant.io/integrations/light.template/), might make more sense. 46 | Here a [Template Alarm Control Panel](https://www.home-assistant.io/integrations/alarm_control_panel.template/) wouldn't work 47 | because Google Assistant doesn't allow disarming Nest Guard. 48 | 49 | Create a text [helper](http://homeassistant.local:8123/config/helpers) with: 50 | 51 | ```yaml 52 | Name: Nest Guard Status 53 | Icon: mdi:shield-home 54 | Entity ID: input_text.nest_guard_status 55 | ``` 56 | 57 | Create following [scripts](http://homeassistant.local:8123/config/script/dashboard): 58 | 59 | ```yaml 60 | nest_guard_refresh: 61 | alias: "Nest Guard: Refresh" 62 | sequence: 63 | - service: google_assistant_sdk_custom.send_text_command 64 | data: 65 | command: what is the status of nest guard 66 | response_variable: response 67 | - service: input_text.set_value 68 | data: 69 | value: "{{ response.responses[0].text }}" 70 | target: 71 | entity_id: input_text.nest_guard_status 72 | mode: single 73 | icon: mdi:shield-refresh 74 | nest_guard_away: 75 | alias: 'Nest Guard: Away' 76 | sequence: 77 | - service: google_assistant_sdk_custom.send_text_command 78 | data: 79 | command: Set Nest Guard to away and guarding 80 | - service: script.nest_guard_refresh 81 | data: {} 82 | mode: single 83 | icon: mdi:shield-lock 84 | nest_guard_home: 85 | alias: 'Nest Guard: Home' 86 | sequence: 87 | - service: google_assistant_sdk_custom.send_text_command 88 | data: 89 | command: Set Nest Guard to home and guarding 90 | - service: script.nest_guard_refresh 91 | data: {} 92 | mode: single 93 | icon: mdi:shield-home 94 | ``` 95 | 96 | Create [automation](http://homeassistant.local:8123/config/automation/dashboard): 97 | 98 | ```yaml 99 | alias: "Nest Guard: status" 100 | description: "" 101 | trigger: 102 | - platform: time_pattern 103 | minutes: "10" 104 | condition: [] 105 | action: 106 | - service: script.nest_guard_refresh 107 | data: {} 108 | mode: queued 109 | max: 10 110 | ``` 111 | 112 | Add the following Entities card in the lovelace dashboard: 113 | 114 | ```yaml 115 | type: entities 116 | entities: 117 | - input_text.nest_guard_status 118 | footer: 119 | type: buttons 120 | entities: 121 | - entity: script.nest_guard_home 122 | show_icon: true 123 | show_name: true 124 | - entity: script.nest_guard_away 125 | show_icon: true 126 | show_name: true 127 | - entity: script.nest_guard_refresh 128 | show_icon: true 129 | show_name: true 130 | ``` 131 | 132 | ## Other examples 133 | 134 | (You will have to replace `google_assistant_sdk.send_text_command` with `google_assistant_sdk_custom.send_text_command`). 135 | 136 | - [360 vacuum](https://community.home-assistant.io/t/360-s6-vacuum-robot/124990/29) 137 | - [robot mowers](https://github.com/tronikos/google_assistant_sdk_custom/issues/2#issuecomment-1473697969) 138 | - [Hisense air conditioning](https://github.com/tronikos/google_assistant_sdk_custom/issues/3#issuecomment-1520227069) 139 | -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/__init__.py: -------------------------------------------------------------------------------- 1 | """Support for Google Assistant SDK.""" 2 | 3 | from __future__ import annotations 4 | 5 | import dataclasses 6 | 7 | import aiohttp 8 | from gassist_text import TextAssistant 9 | from google.oauth2.credentials import Credentials 10 | import voluptuous as vol 11 | 12 | from homeassistant.components import conversation 13 | from homeassistant.config_entries import ConfigEntry, ConfigEntryState 14 | from homeassistant.const import CONF_ACCESS_TOKEN, CONF_NAME, Platform 15 | from homeassistant.core import ( 16 | HomeAssistant, 17 | ServiceCall, 18 | ServiceResponse, 19 | SupportsResponse, 20 | ) 21 | from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady 22 | from homeassistant.helpers import config_validation as cv, discovery, intent 23 | from homeassistant.helpers.config_entry_oauth2_flow import ( 24 | OAuth2Session, 25 | async_get_config_entry_implementation, 26 | ) 27 | from homeassistant.helpers.typing import ConfigType 28 | 29 | from .const import ( 30 | CONF_LANGUAGE_CODE, 31 | DATA_MEM_STORAGE, 32 | DATA_SESSION, 33 | DOMAIN, 34 | SUPPORTED_LANGUAGE_CODES, 35 | ) 36 | from .helpers import ( 37 | GoogleAssistantSDKAudioView, 38 | InMemoryStorage, 39 | async_send_text_commands, 40 | best_matching_language_code, 41 | parse_response, 42 | ) 43 | 44 | SERVICE_SEND_TEXT_COMMAND = "send_text_command" 45 | SERVICE_SEND_TEXT_COMMAND_FIELD_COMMAND = "command" 46 | SERVICE_SEND_TEXT_COMMAND_FIELD_MEDIA_PLAYER = "media_player" 47 | SERVICE_SEND_TEXT_COMMAND_SCHEMA = vol.All( 48 | { 49 | vol.Required(SERVICE_SEND_TEXT_COMMAND_FIELD_COMMAND): vol.All( 50 | cv.ensure_list, [vol.All(str, vol.Length(min=1))] 51 | ), 52 | vol.Optional(SERVICE_SEND_TEXT_COMMAND_FIELD_MEDIA_PLAYER): cv.comp_entity_ids, 53 | }, 54 | ) 55 | 56 | CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) 57 | 58 | 59 | async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: 60 | """Set up Google Assistant SDK component.""" 61 | hass.async_create_task( 62 | discovery.async_load_platform( 63 | hass, Platform.NOTIFY, DOMAIN, {CONF_NAME: DOMAIN}, config 64 | ) 65 | ) 66 | 67 | return True 68 | 69 | 70 | async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: 71 | """Set up Google Assistant SDK from a config entry.""" 72 | hass.data.setdefault(DOMAIN, {})[entry.entry_id] = {} 73 | 74 | implementation = await async_get_config_entry_implementation(hass, entry) 75 | session = OAuth2Session(hass, entry, implementation) 76 | try: 77 | await session.async_ensure_token_valid() 78 | except aiohttp.ClientResponseError as err: 79 | if 400 <= err.status < 500: 80 | raise ConfigEntryAuthFailed( 81 | "OAuth session is not valid, reauth required" 82 | ) from err 83 | raise ConfigEntryNotReady from err 84 | except aiohttp.ClientError as err: 85 | raise ConfigEntryNotReady from err 86 | hass.data[DOMAIN][entry.entry_id][DATA_SESSION] = session 87 | 88 | mem_storage = InMemoryStorage(hass) 89 | hass.data[DOMAIN][entry.entry_id][DATA_MEM_STORAGE] = mem_storage 90 | hass.http.register_view(GoogleAssistantSDKAudioView(mem_storage)) 91 | 92 | await async_setup_service(hass) 93 | 94 | agent = GoogleAssistantConversationAgent(hass, entry) 95 | conversation.async_set_agent(hass, entry, agent) 96 | 97 | return True 98 | 99 | 100 | async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: 101 | """Unload a config entry.""" 102 | hass.data[DOMAIN].pop(entry.entry_id) 103 | other_loaded_entries = [ 104 | _entry 105 | for _entry in hass.config_entries.async_loaded_entries(DOMAIN) 106 | if _entry.entry_id != entry.entry_id 107 | ] 108 | if not other_loaded_entries: 109 | for service_name in hass.services.async_services_for_domain(DOMAIN): 110 | hass.services.async_remove(DOMAIN, service_name) 111 | 112 | conversation.async_unset_agent(hass, entry) 113 | 114 | return True 115 | 116 | 117 | async def async_setup_service(hass: HomeAssistant) -> None: 118 | """Add the services for Google Assistant SDK.""" 119 | 120 | async def send_text_command(call: ServiceCall) -> ServiceResponse: 121 | """Send a text command to Google Assistant SDK.""" 122 | commands: list[str] = call.data[SERVICE_SEND_TEXT_COMMAND_FIELD_COMMAND] 123 | media_players: list[str] | None = call.data.get( 124 | SERVICE_SEND_TEXT_COMMAND_FIELD_MEDIA_PLAYER 125 | ) 126 | command_response_list = await async_send_text_commands( 127 | hass, commands, media_players 128 | ) 129 | if call.return_response: 130 | return { 131 | "responses": [ 132 | dataclasses.asdict(command_response) 133 | for command_response in command_response_list 134 | ] 135 | } 136 | return None 137 | 138 | hass.services.async_register( 139 | DOMAIN, 140 | SERVICE_SEND_TEXT_COMMAND, 141 | send_text_command, 142 | schema=SERVICE_SEND_TEXT_COMMAND_SCHEMA, 143 | supports_response=SupportsResponse.OPTIONAL, 144 | ) 145 | 146 | 147 | class GoogleAssistantConversationAgent(conversation.AbstractConversationAgent): 148 | """Google Assistant SDK conversation agent.""" 149 | 150 | def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None: 151 | """Initialize the agent.""" 152 | self.hass = hass 153 | self.entry = entry 154 | self.assistant: TextAssistant | None = None 155 | self.session: OAuth2Session | None = None 156 | self.language: str | None = None 157 | 158 | @property 159 | def supported_languages(self) -> list[str]: 160 | """Return a list of supported languages.""" 161 | return SUPPORTED_LANGUAGE_CODES 162 | 163 | async def async_process( 164 | self, user_input: conversation.ConversationInput 165 | ) -> conversation.ConversationResult: 166 | """Process a sentence.""" 167 | if self.session: 168 | session = self.session 169 | else: 170 | session = self.hass.data[DOMAIN][self.entry.entry_id][DATA_SESSION] 171 | self.session = session 172 | if not session.valid_token: 173 | await session.async_ensure_token_valid() 174 | self.assistant = None 175 | 176 | language = best_matching_language_code( 177 | self.hass, 178 | user_input.language, 179 | self.entry.options.get(CONF_LANGUAGE_CODE), 180 | ) 181 | 182 | if not self.assistant or language != self.language: 183 | credentials = Credentials(session.token[CONF_ACCESS_TOKEN]) # type: ignore[no-untyped-call] 184 | self.language = language 185 | self.assistant = TextAssistant(credentials, self.language, display=True) 186 | 187 | resp = await self.hass.async_add_executor_job( 188 | self.assistant.assist, user_input.text 189 | ) 190 | text_response = parse_response(self.hass, user_input.text, resp) 191 | 192 | intent_response = intent.IntentResponse(language=language) 193 | intent_response.async_set_speech(text_response) 194 | return conversation.ConversationResult( 195 | response=intent_response, conversation_id=user_input.conversation_id 196 | ) 197 | -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/application_credentials.py: -------------------------------------------------------------------------------- 1 | """application_credentials platform for Google Assistant SDK.""" 2 | 3 | from homeassistant.components.application_credentials import AuthorizationServer 4 | from homeassistant.core import HomeAssistant 5 | 6 | 7 | async def async_get_authorization_server(hass: HomeAssistant) -> AuthorizationServer: 8 | """Return authorization server.""" 9 | return AuthorizationServer( 10 | "https://accounts.google.com/o/oauth2/v2/auth", 11 | "https://oauth2.googleapis.com/token", 12 | ) 13 | 14 | 15 | async def async_get_description_placeholders(hass: HomeAssistant) -> dict[str, str]: 16 | """Return description placeholders for the credentials dialog.""" 17 | return { 18 | "oauth_consent_url": ( 19 | "https://console.cloud.google.com/apis/credentials/consent" 20 | ), 21 | "more_info_url": ( 22 | "https://www.home-assistant.io/integrations/google_assistant_sdk/" 23 | ), 24 | "oauth_creds_url": "https://console.cloud.google.com/apis/credentials", 25 | } 26 | -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/config_flow.py: -------------------------------------------------------------------------------- 1 | """Config flow for Google Assistant SDK integration.""" 2 | 3 | from __future__ import annotations 4 | 5 | from collections.abc import Mapping 6 | import logging 7 | from typing import Any 8 | 9 | import voluptuous as vol 10 | 11 | from homeassistant.config_entries import ConfigEntry, ConfigFlowResult, OptionsFlow 12 | from homeassistant.core import callback 13 | from homeassistant.helpers import config_entry_oauth2_flow 14 | 15 | from .const import CONF_LANGUAGE_CODE, DEFAULT_NAME, DOMAIN, SUPPORTED_LANGUAGE_CODES 16 | from .helpers import default_language_code 17 | 18 | _LOGGER = logging.getLogger(__name__) 19 | 20 | 21 | class OAuth2FlowHandler( 22 | config_entry_oauth2_flow.AbstractOAuth2FlowHandler, domain=DOMAIN 23 | ): 24 | """Config flow to handle Google Assistant SDK OAuth2 authentication.""" 25 | 26 | DOMAIN = DOMAIN 27 | 28 | reauth_entry: ConfigEntry | None = None 29 | 30 | @property 31 | def logger(self) -> logging.Logger: 32 | """Return logger.""" 33 | return logging.getLogger(__name__) 34 | 35 | @property 36 | def extra_authorize_data(self) -> dict[str, Any]: 37 | """Extra data that needs to be appended to the authorize url.""" 38 | return { 39 | "scope": "https://www.googleapis.com/auth/assistant-sdk-prototype", 40 | # Add params to ensure we get back a refresh token 41 | "access_type": "offline", 42 | "prompt": "consent", 43 | } 44 | 45 | async def async_step_reauth( 46 | self, entry_data: Mapping[str, Any] 47 | ) -> ConfigFlowResult: 48 | """Perform reauth upon an API authentication error.""" 49 | self.reauth_entry = self.hass.config_entries.async_get_entry( 50 | self.context["entry_id"] 51 | ) 52 | return await self.async_step_reauth_confirm() 53 | 54 | async def async_step_reauth_confirm( 55 | self, user_input: dict[str, Any] | None = None 56 | ) -> ConfigFlowResult: 57 | """Confirm reauth dialog.""" 58 | if user_input is None: 59 | return self.async_show_form(step_id="reauth_confirm") 60 | return await self.async_step_user() 61 | 62 | async def async_oauth_create_entry(self, data: dict[str, Any]) -> ConfigFlowResult: 63 | """Create an entry for the flow, or update existing entry.""" 64 | if self.reauth_entry: 65 | self.hass.config_entries.async_update_entry(self.reauth_entry, data=data) 66 | await self.hass.config_entries.async_reload(self.reauth_entry.entry_id) 67 | return self.async_abort(reason="reauth_successful") 68 | 69 | if self._async_current_entries(): 70 | # Config entry already exists, only one allowed. 71 | return self.async_abort(reason="single_instance_allowed") 72 | 73 | return self.async_create_entry( 74 | title=DEFAULT_NAME, 75 | data=data, 76 | options={ 77 | CONF_LANGUAGE_CODE: default_language_code(self.hass), 78 | }, 79 | ) 80 | 81 | @staticmethod 82 | @callback 83 | def async_get_options_flow( 84 | config_entry: ConfigEntry, 85 | ) -> OptionsFlow: 86 | """Create the options flow.""" 87 | return OptionsFlowHandler(config_entry) 88 | 89 | 90 | class OptionsFlowHandler(OptionsFlow): 91 | """Google Assistant SDK options flow.""" 92 | 93 | def __init__(self, config_entry: ConfigEntry) -> None: 94 | """Initialize options flow.""" 95 | self.config_entry = config_entry 96 | 97 | async def async_step_init( 98 | self, user_input: dict[str, Any] | None = None 99 | ) -> ConfigFlowResult: 100 | """Manage the options.""" 101 | if user_input is not None: 102 | return self.async_create_entry(title="", data=user_input) 103 | 104 | return self.async_show_form( 105 | step_id="init", 106 | data_schema=vol.Schema( 107 | { 108 | vol.Required( 109 | CONF_LANGUAGE_CODE, 110 | default=self.config_entry.options.get(CONF_LANGUAGE_CODE), 111 | ): vol.In(SUPPORTED_LANGUAGE_CODES), 112 | } 113 | ), 114 | ) 115 | -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/const.py: -------------------------------------------------------------------------------- 1 | """Constants for Google Assistant SDK integration.""" 2 | 3 | from typing import Final 4 | 5 | DOMAIN: Final = "google_assistant_sdk_custom" 6 | 7 | DEFAULT_NAME: Final = "Google Assistant SDK Custom" 8 | 9 | CONF_LANGUAGE_CODE: Final = "language_code" 10 | 11 | DATA_MEM_STORAGE: Final = "mem_storage" 12 | DATA_SESSION: Final = "session" 13 | 14 | # https://developers.google.com/assistant/sdk/reference/rpc/languages 15 | SUPPORTED_LANGUAGE_CODES: Final = [ 16 | "de-DE", 17 | "en-AU", 18 | "en-CA", 19 | "en-GB", 20 | "en-IN", 21 | "en-US", 22 | "es-ES", 23 | "es-MX", 24 | "fr-CA", 25 | "fr-FR", 26 | "it-IT", 27 | "ja-JP", 28 | "ko-KR", 29 | "pt-BR", 30 | ] 31 | -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/diagnostics.py: -------------------------------------------------------------------------------- 1 | """Diagnostics support for Google Assistant SDK.""" 2 | 3 | from __future__ import annotations 4 | 5 | from typing import Any 6 | 7 | from homeassistant.components.diagnostics import async_redact_data 8 | from homeassistant.config_entries import ConfigEntry 9 | from homeassistant.core import HomeAssistant 10 | 11 | TO_REDACT = {"access_token", "refresh_token"} 12 | 13 | 14 | async def async_get_config_entry_diagnostics( 15 | hass: HomeAssistant, entry: ConfigEntry 16 | ) -> dict[str, Any]: 17 | """Return diagnostics for a config entry.""" 18 | return async_redact_data( 19 | { 20 | "data": entry.data, 21 | "options": entry.options, 22 | }, 23 | TO_REDACT, 24 | ) 25 | -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/helpers.py: -------------------------------------------------------------------------------- 1 | """Helper classes for Google Assistant SDK integration.""" 2 | 3 | from __future__ import annotations 4 | 5 | from dataclasses import dataclass 6 | from http import HTTPStatus 7 | import logging 8 | from typing import Any 9 | import uuid 10 | 11 | import aiohttp 12 | from aiohttp import web 13 | from bs4 import BeautifulSoup 14 | from gassist_text import TextAssistant 15 | from google.oauth2.credentials import Credentials 16 | 17 | from homeassistant.components.http import HomeAssistantView 18 | from homeassistant.components.media_player import ( 19 | ATTR_MEDIA_ANNOUNCE, 20 | ATTR_MEDIA_CONTENT_ID, 21 | ATTR_MEDIA_CONTENT_TYPE, 22 | DOMAIN as DOMAIN_MP, 23 | SERVICE_PLAY_MEDIA, 24 | MediaType, 25 | ) 26 | from homeassistant.config_entries import ConfigEntry 27 | from homeassistant.const import ATTR_ENTITY_ID, CONF_ACCESS_TOKEN 28 | from homeassistant.core import HomeAssistant 29 | from homeassistant.helpers.config_entry_oauth2_flow import OAuth2Session 30 | from homeassistant.helpers.event import async_call_later 31 | 32 | from .const import ( 33 | CONF_LANGUAGE_CODE, 34 | DATA_MEM_STORAGE, 35 | DATA_SESSION, 36 | DOMAIN, 37 | SUPPORTED_LANGUAGE_CODES, 38 | ) 39 | 40 | _LOGGER = logging.getLogger(__name__) 41 | 42 | DEFAULT_LANGUAGE_CODES = { 43 | "de": "de-DE", 44 | "en": "en-US", 45 | "es": "es-ES", 46 | "fr": "fr-FR", 47 | "it": "it-IT", 48 | "ja": "ja-JP", 49 | "ko": "ko-KR", 50 | "pt": "pt-BR", 51 | } 52 | 53 | 54 | @dataclass 55 | class CommandResponse: 56 | """Response from a single command to Google Assistant Service.""" 57 | 58 | text: str 59 | 60 | 61 | async def async_send_text_commands( 62 | hass: HomeAssistant, commands: list[str], media_players: list[str] | None = None 63 | ) -> list[CommandResponse]: 64 | """Send text commands to Google Assistant Service.""" 65 | # There can only be 1 entry (config_flow has single_instance_allowed) 66 | entry: ConfigEntry = hass.config_entries.async_entries(DOMAIN)[0] 67 | 68 | session: OAuth2Session = hass.data[DOMAIN][entry.entry_id][DATA_SESSION] 69 | try: 70 | await session.async_ensure_token_valid() 71 | except aiohttp.ClientResponseError as err: 72 | if 400 <= err.status < 500: 73 | entry.async_start_reauth(hass) 74 | raise 75 | 76 | credentials = Credentials(session.token[CONF_ACCESS_TOKEN]) # type: ignore[no-untyped-call] 77 | language_code = entry.options.get(CONF_LANGUAGE_CODE, default_language_code(hass)) 78 | with TextAssistant( 79 | credentials, language_code, audio_out=bool(media_players), display=True 80 | ) as assistant: 81 | command_response_list = [] 82 | for command in commands: 83 | resp = await hass.async_add_executor_job(assistant.assist, command) 84 | text_response = parse_response(hass, command, resp) 85 | _LOGGER.debug("command: %s\nresponse: %s", command, text_response) 86 | audio_response = resp[2] 87 | if media_players and audio_response: 88 | mem_storage: InMemoryStorage = hass.data[DOMAIN][entry.entry_id][ 89 | DATA_MEM_STORAGE 90 | ] 91 | audio_url = GoogleAssistantSDKAudioView.url.format( 92 | filename=mem_storage.store_and_get_identifier(audio_response) 93 | ) 94 | await hass.services.async_call( 95 | DOMAIN_MP, 96 | SERVICE_PLAY_MEDIA, 97 | { 98 | ATTR_ENTITY_ID: media_players, 99 | ATTR_MEDIA_CONTENT_ID: audio_url, 100 | ATTR_MEDIA_CONTENT_TYPE: MediaType.MUSIC, 101 | ATTR_MEDIA_ANNOUNCE: True, 102 | }, 103 | blocking=True, 104 | ) 105 | command_response_list.append(CommandResponse(text_response)) 106 | return command_response_list 107 | 108 | 109 | def parse_response(hass: HomeAssistant, command: str, resp): 110 | """Parse a response from Google Assistant API Service and fires an event containing request and response.""" 111 | response = "" 112 | if resp[0]: 113 | response = resp[0] 114 | elif resp[1]: 115 | soup = BeautifulSoup(resp[1], "html.parser") 116 | card_content = soup.find("div", id="assistant-card-content") 117 | if card_content: 118 | html = card_content 119 | response = html.get_text(separator="\n", strip=True) 120 | event_data = { 121 | "request": command, 122 | "response": response, 123 | } 124 | hass.bus.async_fire(DOMAIN + "_event", event_data) 125 | return response 126 | 127 | 128 | def default_language_code(hass: HomeAssistant) -> str: 129 | """Get default language code based on Home Assistant config.""" 130 | language_code = f"{hass.config.language}-{hass.config.country}" 131 | if language_code in SUPPORTED_LANGUAGE_CODES: 132 | return language_code 133 | return DEFAULT_LANGUAGE_CODES.get(hass.config.language, "en-US") 134 | 135 | 136 | def best_matching_language_code( 137 | hass: HomeAssistant, assist_language: str, agent_language: str | None = None 138 | ) -> str: 139 | """Get the best matching language, based on the preferred assist language and the configured agent language.""" 140 | 141 | # Use the assist language if supported 142 | if assist_language in SUPPORTED_LANGUAGE_CODES: 143 | return assist_language 144 | language = assist_language.split("-")[0] 145 | 146 | # Use the agent language if assist and agent start with the same language part 147 | if agent_language is not None and agent_language.startswith(language): 148 | return best_matching_language_code(hass, agent_language) 149 | 150 | # If assist and agent are not matching, try to find the default language 151 | default_language = DEFAULT_LANGUAGE_CODES.get(language) 152 | if default_language is not None: 153 | return default_language 154 | 155 | # If no default agent is available, use the agent language 156 | if agent_language is not None: 157 | return best_matching_language_code(hass, agent_language) 158 | 159 | # Fallback to the system default language 160 | return default_language_code(hass) 161 | 162 | 163 | class InMemoryStorage: 164 | """Temporarily store and retrieve data from in memory storage.""" 165 | 166 | def __init__(self, hass: HomeAssistant) -> None: 167 | """Initialize InMemoryStorage.""" 168 | self.hass: HomeAssistant = hass 169 | self.mem: dict[str, bytes] = {} 170 | 171 | def store_and_get_identifier(self, data: bytes) -> str: 172 | """Temporarily store data and return identifier to be able to retrieve it. 173 | 174 | Data expires after 5 minutes. 175 | """ 176 | identifier: str = uuid.uuid1().hex 177 | self.mem[identifier] = data 178 | 179 | def async_remove_from_mem(*_: Any) -> None: 180 | """Cleanup memory.""" 181 | self.mem.pop(identifier, None) 182 | 183 | # Remove the entry from memory 5 minutes later 184 | async_call_later(self.hass, 5 * 60, async_remove_from_mem) 185 | 186 | return identifier 187 | 188 | def retrieve(self, identifier: str) -> bytes | None: 189 | """Retrieve previously stored data.""" 190 | return self.mem.get(identifier) 191 | 192 | 193 | class GoogleAssistantSDKAudioView(HomeAssistantView): 194 | """Google Assistant SDK view to serve audio responses.""" 195 | 196 | requires_auth = True 197 | url = "/api/google_assistant_sdk/audio/{filename}" 198 | name = "api:google_assistant_sdk:audio" 199 | 200 | def __init__(self, mem_storage: InMemoryStorage) -> None: 201 | """Initialize GoogleAssistantSDKView.""" 202 | self.mem_storage: InMemoryStorage = mem_storage 203 | 204 | async def get(self, request: web.Request, filename: str) -> web.Response: 205 | """Start a get request.""" 206 | audio = self.mem_storage.retrieve(filename) 207 | if not audio: 208 | return web.Response(status=HTTPStatus.NOT_FOUND) 209 | return web.Response(body=audio, content_type="audio/mpeg") 210 | -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "services": { 3 | "send_text_command": { 4 | "service": "mdi:comment-text-outline" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "domain": "google_assistant_sdk_custom", 3 | "name": "Google Assistant SDK Custom", 4 | "codeowners": ["@tronikos"], 5 | "config_flow": true, 6 | "dependencies": ["application_credentials", "http"], 7 | "documentation": "https://github.com/tronikos/google_assistant_sdk_custom", 8 | "integration_type": "service", 9 | "iot_class": "cloud_polling", 10 | "issue_tracker": "https://github.com/tronikos/google_assistant_sdk_custom/issues", 11 | "requirements": ["beautifulsoup4", "gassist-text==0.0.11"], 12 | "version": "0.0.0" 13 | } 14 | -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/notify.py: -------------------------------------------------------------------------------- 1 | """Support for Google Assistant SDK broadcast notifications.""" 2 | 3 | from __future__ import annotations 4 | 5 | from typing import Any 6 | 7 | from homeassistant.components.notify import ATTR_TARGET, BaseNotificationService 8 | from homeassistant.config_entries import ConfigEntry 9 | from homeassistant.core import HomeAssistant 10 | from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType 11 | 12 | from .const import CONF_LANGUAGE_CODE, DOMAIN 13 | from .helpers import async_send_text_commands, default_language_code 14 | 15 | # https://support.google.com/assistant/answer/9071582?hl=en 16 | LANG_TO_BROADCAST_COMMAND = { 17 | "en": ("broadcast {0}", "broadcast to {1} {0}"), 18 | "de": ( 19 | "Nachricht an alle {0}", # codespell:ignore alle 20 | "Nachricht an alle an {1} {0}", # codespell:ignore alle 21 | ), 22 | "es": ("Anuncia {0}", "Anuncia en {1} {0}"), 23 | "fr": ("Diffuse {0}", "Diffuse dans {1} {0}"), 24 | "it": ("Trasmetti a tutti {0}", "Trasmetti in {1} {0}"), 25 | "ja": ("{0}とブロードキャストして", "{0}と{1}にブロードキャストして"), 26 | "ko": ("{0} 라고 방송해 줘", "{0} 라고 {1}에 방송해 줘"), 27 | "pt": ("Transmitir {0}", "Transmitir {0} para {1}"), 28 | } 29 | 30 | 31 | def broadcast_commands(language_code: str) -> tuple[str, str]: 32 | """Get the commands for broadcasting a message for the given language code. 33 | 34 | Return type is a tuple where [0] is for broadcasting to your entire home, 35 | while [1] is for broadcasting to a specific target. 36 | """ 37 | return LANG_TO_BROADCAST_COMMAND[language_code.split("-", maxsplit=1)[0]] 38 | 39 | 40 | async def async_get_service( 41 | hass: HomeAssistant, 42 | config: ConfigType, 43 | discovery_info: DiscoveryInfoType | None = None, 44 | ) -> BaseNotificationService: 45 | """Get the broadcast notification service.""" 46 | return BroadcastNotificationService(hass) 47 | 48 | 49 | class BroadcastNotificationService(BaseNotificationService): 50 | """Implement broadcast notification service.""" 51 | 52 | def __init__(self, hass: HomeAssistant) -> None: 53 | """Initialize the service.""" 54 | self.hass = hass 55 | 56 | async def async_send_message(self, message: str = "", **kwargs: Any) -> None: 57 | """Send a message.""" 58 | if not message: 59 | return 60 | 61 | # There can only be 1 entry (config_flow has single_instance_allowed) 62 | entry: ConfigEntry = self.hass.config_entries.async_entries(DOMAIN)[0] 63 | language_code = entry.options.get( 64 | CONF_LANGUAGE_CODE, default_language_code(self.hass) 65 | ) 66 | 67 | commands: list[str] = [] 68 | targets = kwargs.get(ATTR_TARGET) 69 | if not targets: 70 | commands.append(broadcast_commands(language_code)[0].format(message)) 71 | else: 72 | commands.extend( 73 | broadcast_commands(language_code)[1].format(message, target) 74 | for target in targets 75 | ) 76 | await async_send_text_commands(self.hass, commands) 77 | -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/services.yaml: -------------------------------------------------------------------------------- 1 | send_text_command: 2 | fields: 3 | command: 4 | example: turn off kitchen TV 5 | selector: 6 | text: 7 | media_player: 8 | example: media_player.living_room_speaker 9 | selector: 10 | entity: 11 | domain: media_player 12 | -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/strings.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "step": { 4 | "pick_implementation": { 5 | "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" 6 | }, 7 | "auth": { 8 | "title": "Link Google Account" 9 | }, 10 | "reauth_confirm": { 11 | "title": "[%key:common::config_flow::title::reauth%]", 12 | "description": "The Google Assistant SDK integration needs to re-authenticate your account" 13 | } 14 | }, 15 | "abort": { 16 | "already_configured": "[%key:common::config_flow::abort::already_configured_account%]", 17 | "already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]", 18 | "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", 19 | "timeout_connect": "[%key:common::config_flow::error::timeout_connect%]", 20 | "oauth_error": "[%key:common::config_flow::abort::oauth2_error%]", 21 | "missing_configuration": "[%key:common::config_flow::abort::oauth2_missing_configuration%]", 22 | "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]", 23 | "invalid_access_token": "[%key:common::config_flow::error::invalid_access_token%]", 24 | "unknown": "[%key:common::config_flow::error::unknown%]", 25 | "oauth_timeout": "[%key:common::config_flow::abort::oauth2_timeout%]", 26 | "oauth_unauthorized": "[%key:common::config_flow::abort::oauth2_unauthorized%]", 27 | "oauth_failed": "[%key:common::config_flow::abort::oauth2_failed%]" 28 | }, 29 | "create_entry": { 30 | "default": "[%key:common::config_flow::create_entry::authenticated%]" 31 | } 32 | }, 33 | "options": { 34 | "step": { 35 | "init": { 36 | "data": { 37 | "language_code": "Language code" 38 | } 39 | } 40 | } 41 | }, 42 | "application_credentials": { 43 | "description": "Follow the [instructions]({more_info_url}) for [OAuth consent screen]({oauth_consent_url}) to give Home Assistant access to your Google Assistant SDK. You also need to create Application Credentials linked to your account:\n1. Go to [Credentials]({oauth_creds_url}) and select **Create Credentials**.\n1. From the drop-down list select **OAuth client ID**.\n1. Select **Web application** for the Application Type." 44 | }, 45 | "services": { 46 | "send_text_command": { 47 | "name": "Send text command", 48 | "description": "Sends a command as a text query to Google Assistant.", 49 | "fields": { 50 | "command": { 51 | "name": "Command", 52 | "description": "Command(s) to send to Google Assistant." 53 | }, 54 | "media_player": { 55 | "name": "Media player entity", 56 | "description": "Name(s) of media player entities to play response on." 57 | } 58 | } 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/bg.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "\u0410\u043a\u0430\u0443\u043d\u0442\u044a\u0442 \u0432\u0435\u0447\u0435 \u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d", 5 | "cannot_connect": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435", 6 | "missing_configuration": "\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044a\u0442 \u043d\u0435 \u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d. \u041c\u043e\u043b\u044f, \u0441\u043b\u0435\u0434\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0442\u0430.", 7 | "reauth_successful": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u0442\u0430 \u0430\u0432\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u044f \u0431\u0435\u0448\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u0430", 8 | "unknown": "\u041d\u0435\u043e\u0447\u0430\u043a\u0432\u0430\u043d\u0430 \u0433\u0440\u0435\u0448\u043a\u0430" 9 | }, 10 | "create_entry": { 11 | "default": "\u0423\u0441\u043f\u0435\u0448\u043d\u0430 \u0430\u0432\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u044f" 12 | }, 13 | "step": { 14 | "auth": { 15 | "title": "\u0421\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435 \u043d\u0430 \u0430\u043a\u0430\u0443\u043d\u0442 \u0432 Google" 16 | }, 17 | "pick_implementation": { 18 | "title": "\u0418\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u043c\u0435\u0442\u043e\u0434 \u0437\u0430 \u0430\u0432\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u044f" 19 | }, 20 | "reauth_confirm": { 21 | "description": "\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f\u0442\u0430 Google Assistant SDK \u0441\u0435 \u043d\u0443\u0436\u0434\u0430\u0435 \u043e\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430 \u0430\u0432\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0430 \u0432\u0430\u0448\u0438\u044f \u0430\u043a\u0430\u0443\u043d\u0442", 22 | "title": "\u0410\u0432\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u044f\u0442\u0430 \u0437\u0430 {name} \u0435 \u0438\u0437\u0442\u0435\u043a\u043b\u0430" 23 | } 24 | } 25 | }, 26 | "options": { 27 | "step": { 28 | "init": { 29 | "data": { 30 | "enable_conversation_agent": "\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0430\u0433\u0435\u043d\u0442\u0430 \u0437\u0430 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440", 31 | "language_code": "\u0415\u0437\u0438\u043a\u043e\u0432 \u043a\u043e\u0434" 32 | }, 33 | "description": "\u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u0435\u0437\u0438\u043a \u0437\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 Google Assistant \u0438 \u0434\u0430\u043b\u0438 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u0442\u0435 \u0430\u0433\u0435\u043d\u0442\u0430 \u0437\u0430 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440." 34 | } 35 | } 36 | }, 37 | "services": { 38 | "send_text_command": { 39 | "fields": { 40 | "command": { 41 | "description": "\u041a\u043e\u043c\u0430\u043d\u0434\u0430(\u0438) \u0437\u0430 \u0438\u0437\u043f\u0440\u0430\u0449\u0430\u043d\u0435 \u0434\u043e Google Assistant.", 42 | "name": "\u041a\u043e\u043c\u0430\u043d\u0434\u0430" 43 | } 44 | }, 45 | "name": "\u0418\u0437\u043f\u0440\u0430\u0449\u0430\u043d\u0435 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430" 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/ca.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "El compte ja est\u00e0 configurat", 5 | "already_in_progress": "El flux de configuraci\u00f3 ja est\u00e0 en curs", 6 | "cannot_connect": "Ha fallat la connexi\u00f3", 7 | "invalid_access_token": "Token d'acc\u00e9s inv\u00e0lid", 8 | "missing_configuration": "El component no est\u00e0 configurat. Mira'n la documentaci\u00f3.", 9 | "oauth_error": "S'han rebut dades token inv\u00e0lides.", 10 | "oauth_failed": "S'ha produ\u00eft un error en obtenir el 'token' d'acc\u00e9s.", 11 | "oauth_timeout": "Temps m\u00e0xim d'espera de resoluci\u00f3 de 'token' OAuth esgotat.", 12 | "oauth_unauthorized": "Error d'autoritzaci\u00f3 OAuth durant l'obtenci\u00f3 del 'token' d'acc\u00e9s.", 13 | "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament", 14 | "timeout_connect": "S'ha esgotat el temps m\u00e0xim d'espera per establir connexi\u00f3", 15 | "unknown": "Error inesperat" 16 | }, 17 | "create_entry": { 18 | "default": "Autenticaci\u00f3 exitosa" 19 | }, 20 | "step": { 21 | "auth": { 22 | "title": "Vinculaci\u00f3 amb compte de Google" 23 | }, 24 | "pick_implementation": { 25 | "title": "Selecciona el m\u00e8tode d'autenticaci\u00f3" 26 | }, 27 | "reauth_confirm": { 28 | "description": "La integraci\u00f3 Google Assistant SDK ha de tornar a autenticar-se amb el teu compte", 29 | "title": "L'autenticaci\u00f3 de {name} ha caducat" 30 | } 31 | } 32 | }, 33 | "options": { 34 | "step": { 35 | "init": { 36 | "data": { 37 | "enable_conversation_agent": "Activa l'agent de conversa", 38 | "language_code": "Codi d'idioma" 39 | }, 40 | "description": "Defineix l'idioma de les interaccions amb Google Assisant i tria si voleu activar l'agent de conversa." 41 | } 42 | } 43 | }, 44 | "services": { 45 | "send_text_command": { 46 | "fields": { 47 | "command": { 48 | "description": "Comanda(es) a enviar a Google Assistant", 49 | "name": "Comanda" 50 | }, 51 | "media_player": { 52 | "name": "Entitat de reproductor multim\u00e8dia" 53 | } 54 | }, 55 | "name": "Envia comanda de text" 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/cs.json: -------------------------------------------------------------------------------- 1 | { 2 | "application_credentials": { 3 | "description": "Podle [pokyn\u016f]({more_info_url}) pro [obrazovka souhlasu OAuth]({oauth_consent_url}) ud\u011blte Home Assistantovi p\u0159\u00edstup k SDK Google Assistant. Mus\u00edte tak\u00e9 vytvo\u0159it p\u0159ihla\u0161ovac\u00ed \u00fadaje aplikace propojen\u00e9 s va\u0161\u00edm \u00fa\u010dtem:\n1. P\u0159ejd\u011bte na [Credentials]({oauth_creds_url}) a klepn\u011bte na **Create Credentials**.\n2. Z rozev\u00edrac\u00edho seznamu vyberte **OAuth client ID**.\n3. Jako Application Type vyberte **Web application**." 4 | }, 5 | "config": { 6 | "abort": { 7 | "already_configured": "\u00da\u010det je ji\u017e nastaven", 8 | "already_in_progress": "Nastaven\u00ed ji\u017e prob\u00edh\u00e1", 9 | "cannot_connect": "Nepoda\u0159ilo se p\u0159ipojit", 10 | "invalid_access_token": "Neplatn\u00fd p\u0159\u00edstupov\u00fd token", 11 | "missing_configuration": "Komponenta nen\u00ed nastavena. Postupujte podle dokumentace.", 12 | "oauth_error": "P\u0159ijata neplatn\u00e1 data tokenu.", 13 | "oauth_failed": "Chyba p\u0159i z\u00edsk\u00e1v\u00e1n\u00ed p\u0159\u00edstupov\u00e9ho tokenu.", 14 | "oauth_timeout": "P\u0159i \u0159e\u0161en\u00ed tokenu OAuth vypr\u0161el \u010dasov\u00fd limit.", 15 | "oauth_unauthorized": "Chyba autorizace OAuth p\u0159i z\u00edsk\u00e1v\u00e1n\u00ed p\u0159\u00edstupov\u00e9ho tokenu.", 16 | "reauth_successful": "Op\u011btovn\u00e9 ov\u011b\u0159en\u00ed bylo \u00fasp\u011b\u0161n\u00e9", 17 | "timeout_connect": "Vypr\u0161el \u010dasov\u00fd limit pro nav\u00e1z\u00e1n\u00ed spojen\u00ed", 18 | "unknown": "Neo\u010dek\u00e1van\u00e1 chyba" 19 | }, 20 | "create_entry": { 21 | "default": "\u00dasp\u011b\u0161n\u011b ov\u011b\u0159eno" 22 | }, 23 | "step": { 24 | "auth": { 25 | "title": "Propojit \u00fa\u010det Google" 26 | }, 27 | "pick_implementation": { 28 | "title": "Vybrat metodu ov\u011b\u0159en\u00ed" 29 | }, 30 | "reauth_confirm": { 31 | "description": "Integrace Google Assistant SDK pot\u0159ebuje znovu ov\u011b\u0159it v\u00e1\u0161 \u00fa\u010det", 32 | "title": "Platnost ov\u011b\u0159en\u00ed pro {name} vypr\u0161ela" 33 | } 34 | } 35 | }, 36 | "options": { 37 | "step": { 38 | "init": { 39 | "data": { 40 | "enable_conversation_agent": "Povolit agenta konverzace", 41 | "language_code": "K\u00f3d jazyka" 42 | }, 43 | "description": "Nastav\u00ed jazyk pro interakce s Asistentem Google a zda chcete povolit agenta konverzace." 44 | } 45 | } 46 | }, 47 | "services": { 48 | "send_text_command": { 49 | "description": "Ode\u0161le p\u0159\u00edkaz jako textov\u00fd dotaz Asistentovi Google.", 50 | "fields": { 51 | "command": { 52 | "description": "P\u0159\u00edkaz k odesl\u00e1n\u00ed Asistentovi Google.", 53 | "name": "P\u0159\u00edkaz" 54 | }, 55 | "media_player": { 56 | "description": "N\u00e1zvy entit p\u0159ehr\u00e1va\u010de m\u00e9di\u00ed, na kter\u00fdch se m\u00e1 p\u0159ehr\u00e1t odpov\u011b\u010f.", 57 | "name": "Entita p\u0159ehr\u00e1va\u010de m\u00e9di\u00ed" 58 | } 59 | }, 60 | "name": "Odeslat textov\u00fd p\u0159\u00edkaz" 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/da.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Kontoen er allerede konfigureret", 5 | "already_in_progress": "Konfigurationsflow er allerede i gang", 6 | "cannot_connect": "Forbindelse mislykkedes", 7 | "invalid_access_token": "Ugyldigt adgangstoken", 8 | "missing_configuration": "Komponenten er ikke konfigureret. F\u00f8lg venligst dokumentationen.", 9 | "oauth_error": "Modtog ugyldige token-data.", 10 | "reauth_successful": "Genautentificering lykkedes", 11 | "timeout_connect": "Timeout ved oprettelse af forbindelse", 12 | "unknown": "Uventet fejl" 13 | }, 14 | "create_entry": { 15 | "default": "Godkendelse lykkedes" 16 | }, 17 | "step": { 18 | "auth": { 19 | "title": "Tilknyt Google-konto" 20 | }, 21 | "pick_implementation": { 22 | "title": "V\u00e6lg godkendelsesmetode" 23 | }, 24 | "reauth_confirm": { 25 | "description": "Google Assistent SDK-integrationen skal godkende din konto igen", 26 | "title": "Godkendelse udl\u00f8bet for {name}" 27 | } 28 | } 29 | }, 30 | "options": { 31 | "step": { 32 | "init": { 33 | "data": { 34 | "enable_conversation_agent": "Aktiv\u00e9r samtaleagenten", 35 | "language_code": "Sprogkode" 36 | }, 37 | "description": "Indstil sprog for interaktioner med Google Assistant, og om du vil aktivere samtaleagenten." 38 | } 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "application_credentials": { 3 | "description": "Folge den [Anweisungen]({more_info_url}) f\u00fcr den [OAuth-Zustimmungsbildschirm]({oauth_consent_url}), um Home Assistant Zugriff auf dein Google Assistant SDK zu gew\u00e4hren. Du musst auch mit deinem Konto verkn\u00fcpfte Anwendungs-Anmeldeinformationen erstellen:\n1. Gehe zu [Anmeldeinformationen]({oauth_creds_url}) und klicke auf **Anmeldeinformationen erstellen**.\n2. W\u00e4hle aus der Dropdown-Liste **OAuth-Client-ID** aus.\n3. W\u00e4hle **Webanwendung** als Anwendungstyp aus." 4 | }, 5 | "config": { 6 | "abort": { 7 | "already_configured": "Konto wurde bereits konfiguriert", 8 | "already_in_progress": "Der Konfigurationsablauf wird bereits ausgef\u00fchrt", 9 | "cannot_connect": "Verbindung fehlgeschlagen", 10 | "invalid_access_token": "Ung\u00fcltiger Zugriffs-Token", 11 | "missing_configuration": "Die Komponente ist nicht konfiguriert. Bitte der Dokumentation folgen.", 12 | "oauth_error": "Ung\u00fcltige Token-Daten empfangen.", 13 | "oauth_failed": "Fehler beim Abrufen des Zugriffstokens.", 14 | "oauth_timeout": "Zeit\u00fcberschreitung beim Aufl\u00f6sen des OAuth-Tokens.", 15 | "oauth_unauthorized": "OAuth-Autorisierungsfehler beim Abrufen des Zugriffstokens.", 16 | "reauth_successful": "Die erneute Authentifizierung war erfolgreich", 17 | "timeout_connect": "Zeit\u00fcberschreitung beim Verbindungsaufbau", 18 | "unknown": "Unerwarteter Fehler" 19 | }, 20 | "create_entry": { 21 | "default": "Erfolgreich authentifiziert" 22 | }, 23 | "step": { 24 | "auth": { 25 | "title": "Google-Konto verkn\u00fcpfen" 26 | }, 27 | "pick_implementation": { 28 | "title": "W\u00e4hle die Authentifizierungsmethode" 29 | }, 30 | "reauth_confirm": { 31 | "description": "Die Google Assistant SDK-Integration muss dein Konto erneut authentifizieren", 32 | "title": "Die Authentifizierung ist abgelaufen f\u00fcr {name}" 33 | } 34 | } 35 | }, 36 | "options": { 37 | "step": { 38 | "init": { 39 | "data": { 40 | "enable_conversation_agent": "Aktiviere den Konversationsagenten", 41 | "language_code": "Sprachcode" 42 | }, 43 | "description": "Lege die Sprache f\u00fcr Interaktionen mit Google Assistant fest und ob du den Konversationsagenten aktivieren m\u00f6chtest." 44 | } 45 | } 46 | }, 47 | "services": { 48 | "send_text_command": { 49 | "description": "Sendet einen Befehl als Textanfrage an Google Assistant.", 50 | "fields": { 51 | "command": { 52 | "description": "Befehl(e) zum Senden an Google Assistant.", 53 | "name": "Befehl" 54 | }, 55 | "media_player": { 56 | "description": "Namen der Mediaplayer-Entit\u00e4ten, auf denen die Antwort abgespielt werden soll.", 57 | "name": "Mediaplayer-Entit\u00e4t" 58 | } 59 | }, 60 | "name": "Textbefehl senden" 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/el.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "\u039f \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc\u03c2 \u03ad\u03c7\u03b5\u03b9 \u03ae\u03b4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03bf\u03c1\u03c6\u03c9\u03b8\u03b5\u03af", 5 | "already_in_progress": "\u0397 \u03c1\u03bf\u03ae \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7\u03c2 \u03b2\u03c1\u03af\u03c3\u03ba\u03b5\u03c4\u03b1\u03b9 \u03ae\u03b4\u03b7 \u03c3\u03b5 \u03b5\u03be\u03ad\u03bb\u03b9\u03be\u03b7", 6 | "cannot_connect": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2", 7 | "invalid_access_token": "\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf \u03b4\u03b9\u03b1\u03ba\u03c1\u03b9\u03c4\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2", 8 | "missing_configuration": "\u03a4\u03bf \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf \u03b4\u03b5\u03bd \u03ad\u03c7\u03b5\u03b9 \u03c1\u03c5\u03b8\u03bc\u03b9\u03c3\u03c4\u03b5\u03af. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03ae\u03c3\u03c4\u03b5 \u03c4\u03b7\u03bd \u03c4\u03b5\u03ba\u03bc\u03b7\u03c1\u03af\u03c9\u03c3\u03b7.", 9 | "oauth_error": "\u039b\u03ae\u03c6\u03b8\u03b7\u03ba\u03b1\u03bd \u03bc\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03b4\u03b9\u03b1\u03ba\u03c1\u03b9\u03c4\u03b9\u03ba\u03bf\u03cd.", 10 | "oauth_failed": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7 \u03bb\u03ae\u03c8\u03b7 \u03c4\u03bf\u03c5 \u03b4\u03b9\u03b1\u03ba\u03c1\u03b9\u03c4\u03b9\u03ba\u03bf\u03cd \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2.", 11 | "oauth_timeout": "\u03a7\u03c1\u03bf\u03bd\u03b9\u03ba\u03cc \u03cc\u03c1\u03b9\u03bf \u03b5\u03c0\u03af\u03bb\u03c5\u03c3\u03b7\u03c2 \u03c4\u03bf\u03c5 \u03b4\u03b9\u03b1\u03ba\u03c1\u03b9\u03c4\u03b9\u03ba\u03bf\u03cd OAuth.", 12 | "oauth_unauthorized": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03b5\u03be\u03bf\u03c5\u03c3\u03b9\u03bf\u03b4\u03cc\u03c4\u03b7\u03c3\u03b7\u03c2 OAuth \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7 \u03bb\u03ae\u03c8\u03b7 \u03c4\u03bf\u03c5 \u03b4\u03b9\u03b1\u03ba\u03c1\u03b9\u03c4\u03b9\u03ba\u03bf\u03cd \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2.", 13 | "reauth_successful": "\u039f \u03b5\u03ba \u03bd\u03ad\u03bf\u03c5 \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03ae\u03c4\u03b1\u03bd \u03b5\u03c0\u03b9\u03c4\u03c5\u03c7\u03ae\u03c2", 14 | "timeout_connect": "\u03a7\u03c1\u03bf\u03bd\u03b9\u03ba\u03cc \u03cc\u03c1\u03b9\u03bf \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2", 15 | "unknown": "\u039c\u03b7 \u03b1\u03bd\u03b1\u03bc\u03b5\u03bd\u03cc\u03bc\u03b5\u03bd\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1" 16 | }, 17 | "create_entry": { 18 | "default": "\u0395\u03c0\u03b9\u03c4\u03c5\u03c7\u03ae\u03c2 \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2" 19 | }, 20 | "step": { 21 | "auth": { 22 | "title": "\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd Google" 23 | }, 24 | "pick_implementation": { 25 | "title": "\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03bc\u03b5\u03b8\u03cc\u03b4\u03bf\u03c5 \u03b5\u03bb\u03ad\u03b3\u03c7\u03bf\u03c5 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2" 26 | }, 27 | "reauth_confirm": { 28 | "description": "\u0397 \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 Google Assistant SDK \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03bb\u03ad\u03b3\u03be\u03b5\u03b9 \u03b5\u03ba \u03bd\u03ad\u03bf\u03c5 \u03c4\u03b7\u03bd \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1 \u03c4\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd \u03c3\u03b1\u03c2", 29 | "title": "\u039f \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03b3\u03b9\u03b1 \u03c4\u03bf {name} \u03ad\u03bb\u03b7\u03be\u03b5" 30 | } 31 | } 32 | }, 33 | "options": { 34 | "step": { 35 | "init": { 36 | "data": { 37 | "enable_conversation_agent": "\u0395\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf\u03bd \u03b5\u03ba\u03c0\u03c1\u03cc\u03c3\u03c9\u03c0\u03bf \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1\u03c2", 38 | "language_code": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1\u03c2" 39 | }, 40 | "description": "\u039f\u03c1\u03af\u03c3\u03c4\u03b5 \u03c4\u03b7 \u03b3\u03bb\u03ce\u03c3\u03c3\u03b1 \u03b3\u03b9\u03b1 \u03c4\u03b9\u03c2 \u03b1\u03bb\u03bb\u03b7\u03bb\u03b5\u03c0\u03b9\u03b4\u03c1\u03ac\u03c3\u03b5\u03b9\u03c2 \u03bc\u03b5 \u03c4\u03bf\u03bd \u0392\u03bf\u03b7\u03b8\u03cc Google \u03ba\u03b1\u03b9 \u03b5\u03ac\u03bd \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf\u03bd \u03c0\u03c1\u03ac\u03ba\u03c4\u03bf\u03c1\u03b1 \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1\u03c2." 41 | } 42 | } 43 | }, 44 | "services": { 45 | "send_text_command": { 46 | "description": "\u03a3\u03c4\u03ad\u03bb\u03bd\u03b5\u03b9 \u03bc\u03b9\u03b1 \u03b5\u03bd\u03c4\u03bf\u03bb\u03ae \u03c9\u03c2 \u03b5\u03c1\u03ce\u03c4\u03b7\u03bc\u03b1 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c3\u03c4\u03bf\u03bd \u0392\u03bf\u03b7\u03b8\u03cc Google.", 47 | "fields": { 48 | "command": { 49 | "description": "\u0395\u03bd\u03c4\u03bf\u03bb\u03ae(\u03b5\u03c2) \u03b3\u03b9\u03b1 \u03b1\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03c3\u03c4\u03bf Google Assistant.", 50 | "name": "\u0395\u03bd\u03c4\u03bf\u03bb\u03ae" 51 | }, 52 | "media_player": { 53 | "description": "\u039f\u03bd\u03bf\u03bc\u03b1(-\u03b1) \u03c4\u03c9\u03bd \u03bf\u03bd\u03c4\u03bf\u03c4\u03ae\u03c4\u03c9\u03bd \u03b1\u03bd\u03b1\u03c0\u03b1\u03c1\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03c0\u03bf\u03bb\u03c5\u03bc\u03ad\u03c3\u03c9\u03bd \u03b3\u03b9\u03b1 \u03b1\u03bd\u03b1\u03c0\u03b1\u03c1\u03b1\u03b3\u03c9\u03b3\u03ae \u03c4\u03b7\u03c2 \u03b1\u03c0\u03ac\u03bd\u03c4\u03b7\u03c3\u03b7\u03c2.", 54 | "name": "\u039f\u03bd\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1 \u03b1\u03bd\u03b1\u03c0\u03b1\u03c1\u03b1\u03b3\u03c9\u03b3\u03ae\u03c2 \u03c0\u03bf\u03bb\u03c5\u03bc\u03ad\u03c3\u03c9\u03bd" 55 | } 56 | }, 57 | "name": "\u0391\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03b5\u03bd\u03c4\u03bf\u03bb\u03ae\u03c2 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5" 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "application_credentials": { 3 | "description": "Follow the [instructions]({more_info_url}) for [OAuth consent screen]({oauth_consent_url}) to give Home Assistant access to your Google Assistant SDK. You also need to create Application Credentials linked to your account:\n1. Go to [Credentials]({oauth_creds_url}) and select **Create Credentials**.\n1. From the drop-down list select **OAuth client ID**.\n1. Select **Web application** for the Application Type." 4 | }, 5 | "config": { 6 | "abort": { 7 | "already_configured": "Account is already configured", 8 | "already_in_progress": "Configuration flow is already in progress", 9 | "cannot_connect": "Failed to connect", 10 | "invalid_access_token": "Invalid access token", 11 | "missing_configuration": "The component is not configured. Please follow the documentation.", 12 | "oauth_error": "Received invalid token data.", 13 | "oauth_failed": "Error while obtaining access token.", 14 | "oauth_timeout": "Timeout resolving OAuth token.", 15 | "oauth_unauthorized": "OAuth authorization error while obtaining access token.", 16 | "reauth_successful": "Re-authentication was successful", 17 | "timeout_connect": "Timeout establishing connection", 18 | "unknown": "Unexpected error" 19 | }, 20 | "create_entry": { 21 | "default": "Successfully authenticated" 22 | }, 23 | "step": { 24 | "auth": { 25 | "title": "Link Google Account" 26 | }, 27 | "pick_implementation": { 28 | "title": "Pick authentication method" 29 | }, 30 | "reauth_confirm": { 31 | "description": "The Google Assistant SDK integration needs to re-authenticate your account", 32 | "title": "Authentication expired for {name}" 33 | } 34 | } 35 | }, 36 | "options": { 37 | "step": { 38 | "init": { 39 | "data": { 40 | "enable_conversation_agent": "Enable the conversation agent", 41 | "language_code": "Language code" 42 | }, 43 | "description": "Set language for interactions with Google Assistant and whether you want to enable the conversation agent." 44 | } 45 | } 46 | }, 47 | "services": { 48 | "send_text_command": { 49 | "description": "Sends a command as a text query to Google Assistant.", 50 | "fields": { 51 | "command": { 52 | "description": "Command(s) to send to Google Assistant.", 53 | "name": "Command" 54 | }, 55 | "media_player": { 56 | "description": "Name(s) of media player entities to play response on.", 57 | "name": "Media player entity" 58 | } 59 | }, 60 | "name": "Send text command" 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "application_credentials": { 3 | "description": "Sigue las [instrucciones]({more_info_url}) de la [pantalla de consentimiento de OAuth]({oauth_consent_url}) para darle a Home Assistant acceso a tu SDK de Google Assistant. Tambi\u00e9n debes crear credenciales de aplicaci\u00f3n vinculadas a tu cuenta:\n1. Ve a [Credenciales]({oauth_creds_url}) y selecciona **Crear credenciales**.\n1. En la lista desplegable, selecciona **ID de cliente de OAuth**.\n1. Selecciona **Aplicaci\u00f3n web** para el tipo de aplicaci\u00f3n." 4 | }, 5 | "config": { 6 | "abort": { 7 | "already_configured": "La cuenta ya est\u00e1 configurada", 8 | "already_in_progress": "El flujo de configuraci\u00f3n ya est\u00e1 en curso", 9 | "cannot_connect": "No se pudo conectar", 10 | "invalid_access_token": "Token de acceso no v\u00e1lido", 11 | "missing_configuration": "El componente no est\u00e1 configurado. Por favor, sigue la documentaci\u00f3n.", 12 | "oauth_error": "Se han recibido datos de token no v\u00e1lidos.", 13 | "oauth_failed": "Error al obtener el token de acceso.", 14 | "oauth_timeout": "Tiempo de espera agotado mientras se resolv\u00eda el token OAuth.", 15 | "oauth_unauthorized": "Error de autorizaci\u00f3n OAuth al obtener el token de acceso.", 16 | "reauth_successful": "La autenticaci\u00f3n se volvi\u00f3 a realizar correctamente", 17 | "timeout_connect": "Tiempo de espera agotado mientras se establec\u00eda la conexi\u00f3n", 18 | "unknown": "Error inesperado" 19 | }, 20 | "create_entry": { 21 | "default": "Autenticado correctamente" 22 | }, 23 | "step": { 24 | "auth": { 25 | "title": "Vincular cuenta de Google" 26 | }, 27 | "pick_implementation": { 28 | "title": "Selecciona el m\u00e9todo de autenticaci\u00f3n" 29 | }, 30 | "reauth_confirm": { 31 | "description": "La integraci\u00f3n del SDK del Asistente de Google necesita volver a autenticar tu cuenta", 32 | "title": "Autenticaci\u00f3n caducada para {name}" 33 | } 34 | } 35 | }, 36 | "options": { 37 | "step": { 38 | "init": { 39 | "data": { 40 | "enable_conversation_agent": "Habilitar el agente de conversaci\u00f3n", 41 | "language_code": "C\u00f3digo de idioma" 42 | }, 43 | "description": "Configura el idioma para las interacciones con el Asistente de Google y si deseas habilitar el agente de conversaci\u00f3n." 44 | } 45 | } 46 | }, 47 | "services": { 48 | "send_text_command": { 49 | "description": "Env\u00eda un comando como una consulta de texto al Google Assistant.", 50 | "fields": { 51 | "command": { 52 | "description": "Comando(s) para enviar a Google Assistant.", 53 | "name": "Comando" 54 | }, 55 | "media_player": { 56 | "description": "Nombre(s) de las entidades del reproductor multimedia para reproducir la respuesta.", 57 | "name": "Entidad de reproductor multimedia" 58 | } 59 | }, 60 | "name": "Enviar comando de texto" 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/et.json: -------------------------------------------------------------------------------- 1 | { 2 | "application_credentials": { 3 | "description": "J\u00e4rgi [juhiseid]( {more_info_url} ) [OAuthi n\u00f5usoleku ekraanil]( {oauth_consent_url} ), et anda Home Assistantile juurdep\u00e4\u00e4s Google'i assistendi SDK-le. Samuti pead looma oma kontoga lingitud rakenduse mandaadid:\n 1. Ava [Mandaat] ( {oauth_creds_url} ) ja kl\u00f5psa **Loo mandaadid**.\n 1. Vali ripploendist **OAuthi kliendi ID**.\n 1. Vali rakenduse t\u00fc\u00fcbiks **Veebirakendus**." 4 | }, 5 | "config": { 6 | "abort": { 7 | "already_configured": "Kasutaja on juba seadistatud", 8 | "already_in_progress": "Seadistamine on juba k\u00e4imas", 9 | "cannot_connect": "\u00dchendamine nurjus", 10 | "invalid_access_token": "Vigane juurdep\u00e4\u00e4sut\u00f5end", 11 | "missing_configuration": "Komponent pole seadistatud. Palun loe dokumentatsiooni.", 12 | "oauth_error": "Saadi sobimatud loaandmed.", 13 | "oauth_failed": "T\u00f5rge juurdep\u00e4\u00e4sut\u00f5endi hankimisel.", 14 | "oauth_timeout": "OAuthi loa lahendamise ajal\u00f5pp.", 15 | "oauth_unauthorized": "OAuthi tuvastaimisviga juurdep\u00e4\u00e4sut\u00f5endi hankimisel.", 16 | "reauth_successful": "Taastuvastamine \u00f5nnestus", 17 | "timeout_connect": "\u00dchenduse loomise ajal\u00f5pp", 18 | "unknown": "Ootamatu t\u00f5rge" 19 | }, 20 | "create_entry": { 21 | "default": "Tuvastamine \u00f5nnestus" 22 | }, 23 | "step": { 24 | "auth": { 25 | "title": "Google'i konto linkimine" 26 | }, 27 | "pick_implementation": { 28 | "title": "Vali tuvastusmeetod" 29 | }, 30 | "reauth_confirm": { 31 | "description": "Google'i assistendi SDK sidumine peab konto uuesti autentima", 32 | "title": "{name} autentimine aegus" 33 | } 34 | } 35 | }, 36 | "options": { 37 | "step": { 38 | "init": { 39 | "data": { 40 | "enable_conversation_agent": "V\u00f5ta vestlusagent kasutusele", 41 | "language_code": "Keele kood" 42 | }, 43 | "description": "M\u00e4\u00e4ra keel Google'i assistendiga suhtlemiseks ja kas soovid vestlusagendi lubada." 44 | } 45 | } 46 | }, 47 | "services": { 48 | "send_text_command": { 49 | "description": "Saadab k\u00e4su tekstip\u00e4ringuna Google Assistantile.", 50 | "fields": { 51 | "command": { 52 | "description": "Google Assistantile saadetavad k\u00e4sud.", 53 | "name": "K\u00e4sk" 54 | }, 55 | "media_player": { 56 | "description": "Meediam\u00e4ngija olemite nimed, millel vastust esitada.", 57 | "name": "Meediam\u00e4ngija olem" 58 | } 59 | }, 60 | "name": "Saada tekstik\u00e4sk" 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/fi.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Tili on jo m\u00e4\u00e4ritetty", 5 | "already_in_progress": "M\u00e4\u00e4ritysprosessi on jo k\u00e4ynniss\u00e4", 6 | "cannot_connect": "Yhteyden muodostaminen ep\u00e4onnistui", 7 | "invalid_access_token": "Virheellinen k\u00e4ytt\u00f6oikeustunnus", 8 | "missing_configuration": "Komponenttia ei ole m\u00e4\u00e4ritetty. Seuraa dokumentaatiota.", 9 | "oauth_error": "Vastaanotettu virheelliset tunnustiedot.", 10 | "oauth_failed": "Virhe haettaessa k\u00e4ytt\u00f6tunnusta.", 11 | "oauth_timeout": "Aikakatkaisu ratkaistaessa OAuth tokenia.", 12 | "oauth_unauthorized": "OAuth -valtuutusvirhe haettaessa k\u00e4ytt\u00f6tunnusta.", 13 | "reauth_successful": "Uudelleentodennus onnistui", 14 | "timeout_connect": "Aikakatkaisu yhteytt\u00e4 luodessa", 15 | "unknown": "Odottamaton virhe" 16 | }, 17 | "create_entry": { 18 | "default": "Todennettu onnistuneesti" 19 | }, 20 | "step": { 21 | "auth": { 22 | "title": "Linkit\u00e4 Google-tili" 23 | }, 24 | "pick_implementation": { 25 | "title": "Valitse todennusmenetelm\u00e4" 26 | }, 27 | "reauth_confirm": { 28 | "description": "Google Assistant SDK -integraation on todennettava tilisi uudelleen.", 29 | "title": "Todennus vanhentui kohteella {name}" 30 | } 31 | } 32 | }, 33 | "options": { 34 | "step": { 35 | "init": { 36 | "data": { 37 | "enable_conversation_agent": "Ota keskusteluagentti k\u00e4ytt\u00f6\u00f6n", 38 | "language_code": "Koodikieli" 39 | }, 40 | "description": "M\u00e4\u00e4rit\u00e4 Google Assistantin kanssa k\u00e4yt\u00e4v\u00e4n vuorovaikutuksen kieli ja se, haluatko ottaa keskusteluagentin k\u00e4ytt\u00f6\u00f6n." 41 | } 42 | } 43 | }, 44 | "services": { 45 | "send_text_command": { 46 | "description": "L\u00e4hett\u00e4\u00e4 komennon tekstikyselyn\u00e4 Google Assistantille.", 47 | "fields": { 48 | "command": { 49 | "description": "Google Assistantille l\u00e4hetett\u00e4v\u00e4t komennot.", 50 | "name": "Komento" 51 | }, 52 | "media_player": { 53 | "description": "Mediasoitinyksik\u00f6iden nimet, joilla vastaus soietaan.", 54 | "name": "Mediasoitinentiteetti" 55 | } 56 | }, 57 | "name": "L\u00e4het\u00e4 tekstikomento" 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Le compte est d\u00e9j\u00e0 configur\u00e9", 5 | "already_in_progress": "La configuration est d\u00e9j\u00e0 en cours", 6 | "cannot_connect": "\u00c9chec de connexion", 7 | "invalid_access_token": "Jeton d'acc\u00e8s non valide", 8 | "missing_configuration": "Le composant n'est pas configur\u00e9. Veuillez suivre la documentation.", 9 | "oauth_error": "Des donn\u00e9es de jeton non valides ont \u00e9t\u00e9 re\u00e7ues.", 10 | "oauth_failed": "Erreur lors de l'obtention du jeton d'acc\u00e8s.", 11 | "oauth_timeout": "D\u00e9lai d'expiration de la r\u00e9solution du jeton OAuth.", 12 | "oauth_unauthorized": "Erreur d'autorisation OAuth lors de l'obtention du jeton d'acc\u00e8s.", 13 | "reauth_successful": "La r\u00e9-authentification a r\u00e9ussi", 14 | "timeout_connect": "D\u00e9lai d'attente pour \u00e9tablir la connexion expir\u00e9", 15 | "unknown": "Erreur inattendue" 16 | }, 17 | "create_entry": { 18 | "default": "Authentification r\u00e9ussie" 19 | }, 20 | "step": { 21 | "auth": { 22 | "title": "Associer un compte Google" 23 | }, 24 | "pick_implementation": { 25 | "title": "Choisissez la m\u00e9thode d'authentification" 26 | }, 27 | "reauth_confirm": { 28 | "title": "L'authentification a expir\u00e9 pour {name}" 29 | } 30 | } 31 | }, 32 | "options": { 33 | "step": { 34 | "init": { 35 | "data": { 36 | "enable_conversation_agent": "Activer l'agent de conversation", 37 | "language_code": "Code de langue" 38 | } 39 | } 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/gl.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "oauth_failed": "Erro ao obter o token de acceso.", 5 | "oauth_unauthorized": "Erro de autorizaci\u00f3n OAuth ao obter o token de acceso." 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/he.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d7\u05e9\u05d1\u05d5\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4", 5 | "already_in_progress": "\u05d6\u05e8\u05d9\u05de\u05ea \u05d4\u05ea\u05e6\u05d5\u05e8\u05d4 \u05db\u05d1\u05e8 \u05de\u05ea\u05d1\u05e6\u05e2\u05ea", 6 | "cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4", 7 | "invalid_access_token": "\u05d0\u05e1\u05d9\u05de\u05d5\u05df \u05d2\u05d9\u05e9\u05d4 \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9", 8 | "missing_configuration": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05e8\u05db\u05d9\u05d1 \u05dc\u05d0 \u05e0\u05e7\u05d1\u05e2\u05d4. \u05e0\u05d0 \u05e2\u05e7\u05d5\u05d1 \u05d0\u05d7\u05e8 \u05d4\u05ea\u05d9\u05e2\u05d5\u05d3.", 9 | "oauth_error": "\u05d4\u05ea\u05e7\u05d1\u05dc\u05d5 \u05e0\u05ea\u05d5\u05e0\u05d9 \u05d0\u05e1\u05d9\u05de\u05d5\u05df \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9\u05d9\u05dd.", 10 | "oauth_failed": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05e2\u05ea \u05e7\u05d1\u05dc\u05ea \u05d0\u05e1\u05d9\u05de\u05d5\u05df \u05d2\u05d9\u05e9\u05d4.", 11 | "oauth_timeout": "\u05d7\u05dc\u05e3 \u05d4\u05d6\u05de\u05df \u05dc\u05e4\u05ea\u05e8\u05d5\u05df \u05d0\u05e1\u05d9\u05de\u05d5\u05df OAuth.", 12 | "oauth_unauthorized": "\u05e9\u05d2\u05d9\u05d0\u05ea \u05d4\u05e8\u05e9\u05d0\u05ea OAuth \u05d1\u05e2\u05ea \u05d4\u05e9\u05d2\u05ea \u05d0\u05e1\u05d9\u05de\u05d5\u05df \u05d2\u05d9\u05e9\u05d4.", 13 | "reauth_successful": "\u05d4\u05d0\u05d9\u05de\u05d5\u05ea \u05de\u05d7\u05d3\u05e9 \u05d4\u05e6\u05dc\u05d9\u05d7", 14 | "timeout_connect": "\u05e4\u05e1\u05e7 \u05d6\u05de\u05df \u05dc\u05d9\u05e6\u05d9\u05e8\u05ea \u05d7\u05d9\u05d1\u05d5\u05e8", 15 | "unknown": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05dc\u05ea\u05d9 \u05e6\u05e4\u05d5\u05d9\u05d4" 16 | }, 17 | "create_entry": { 18 | "default": "\u05d0\u05d5\u05de\u05ea \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4" 19 | }, 20 | "step": { 21 | "pick_implementation": { 22 | "title": "\u05d1\u05d7\u05d9\u05e8\u05ea \u05e9\u05d9\u05d8\u05ea \u05d0\u05d9\u05de\u05d5\u05ea" 23 | }, 24 | "reauth_confirm": { 25 | "description": "\u05d4\u05e9\u05d9\u05dc\u05d5\u05d1 \u05e9\u05dc Google Assistant SDK \u05e6\u05e8\u05d9\u05da \u05dc\u05d0\u05de\u05ea \u05de\u05d7\u05d3\u05e9 \u05d0\u05ea \u05d4\u05d7\u05e9\u05d1\u05d5\u05df \u05e9\u05dc\u05da", 26 | "title": "\u05e4\u05d2 \u05ea\u05d5\u05e7\u05e3 \u05d4\u05d0\u05d9\u05de\u05d5\u05ea \u05e2\u05d1\u05d5\u05e8 {name}" 27 | } 28 | } 29 | }, 30 | "options": { 31 | "step": { 32 | "init": { 33 | "data": { 34 | "enable_conversation_agent": "\u05d4\u05e4\u05d9\u05db\u05ea \u05e1\u05d5\u05db\u05df \u05d4\u05e9\u05d9\u05d7\u05d4 \u05dc\u05d6\u05de\u05d9\u05df", 35 | "language_code": "\u05e7\u05d5\u05d3 \u05e9\u05e4\u05d4" 36 | }, 37 | "description": "\u05d4\u05d2\u05d3\u05e8\u05ea \u05e9\u05e4\u05d4 \u05dc\u05d0\u05d9\u05e0\u05d8\u05e8\u05d0\u05e7\u05e6\u05d9\u05d5\u05ea \u05e2\u05dd Google Assistant \u05d5\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05e4\u05e2\u05d9\u05dc \u05d0\u05ea \u05e1\u05d5\u05db\u05df \u05d4\u05e9\u05d9\u05d7\u05d4." 38 | } 39 | } 40 | }, 41 | "services": { 42 | "send_text_command": { 43 | "description": "\u05e9\u05dc\u05d9\u05d7\u05ea \u05e4\u05e7\u05d5\u05d3\u05d4 \u05db\u05e9\u05d0\u05d9\u05dc\u05ea\u05ea \u05d8\u05e7\u05e1\u05d8 \u05d0\u05dc Google Assistant.", 44 | "fields": { 45 | "command": { 46 | "description": "\u05e4\u05e7\u05d5\u05d3\u05d5\u05ea \u05dc\u05e9\u05dc\u05d9\u05d7\u05d4 \u05d0\u05dc Google Assistant.", 47 | "name": "\u05e4\u05e7\u05d5\u05d3\u05d4" 48 | }, 49 | "media_player": { 50 | "description": "\u05e9\u05de\u05d5\u05ea \u05e9\u05dc \u05d9\u05e9\u05d5\u05d9\u05d5\u05ea \u05e0\u05d2\u05df \u05de\u05d3\u05d9\u05d4 \u05dc\u05d4\u05e4\u05e2\u05dc\u05ea \u05ea\u05d2\u05d5\u05d1\u05d4.", 51 | "name": "\u05d9\u05e9\u05d5\u05ea \u05e0\u05d2\u05df \u05de\u05d3\u05d9\u05d4" 52 | } 53 | }, 54 | "name": "\u05e9\u05dc\u05d9\u05d7\u05ea \u05e4\u05e7\u05d5\u05d3\u05ea \u05d8\u05e7\u05e1\u05d8" 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/hu.json: -------------------------------------------------------------------------------- 1 | { 2 | "application_credentials": { 3 | "description": "K\u00f6vesse az [\u00fatmutat\u00f3t]({more_info_url}) az [OAuth hozz\u00e1j\u00e1rul\u00e1si k\u00e9perny\u0151]({oauth_consent_url}) be\u00e1ll\u00edt\u00e1s\u00e1hoz, hogy hozz\u00e1f\u00e9r\u00e9st biztos\u00edtson a Home Assistant sz\u00e1m\u00e1ra a Google Assistant SDK-hoz. Ezenk\u00edv\u00fcl l\u00e9tre kell hoznia a fi\u00f3kj\u00e1hoz kapcsol\u00f3d\u00f3 Alkalmaz\u00e1shiteles\u00edt\u0151 adatokat:\n1. L\u00e1togasson el a [Hiteles\u00edt\u0151 adatok]({oauth_creds_url}) oldalra \u00e9s v\u00e1lassza a **Create Credentials** lehet\u0151s\u00e9get.\n2. A leg\u00f6rd\u00fcl\u0151 list\u00e1b\u00f3l v\u00e1lassza az **OAuth client ID** lehet\u0151s\u00e9get.\n3. Alkalmaz\u00e1st\u00edpusk\u00e9nt v\u00e1lassza a **Web application** opci\u00f3t." 4 | }, 5 | "config": { 6 | "abort": { 7 | "already_configured": "A fi\u00f3k m\u00e1r konfigur\u00e1lva van", 8 | "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van", 9 | "cannot_connect": "Sikertelen csatlakoz\u00e1s", 10 | "invalid_access_token": "\u00c9rv\u00e9nytelen hozz\u00e1f\u00e9r\u00e9si token", 11 | "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t.", 12 | "oauth_error": "\u00c9rv\u00e9nytelen token adatok \u00e9rkeztek.", 13 | "oauth_failed": "Hiba a hozz\u00e1f\u00e9r\u00e9si token megszerz\u00e9se k\u00f6zben.", 14 | "oauth_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s az OAuth-token felold\u00e1sakor.", 15 | "oauth_unauthorized": "OAuth enged\u00e9lyez\u00e9si hiba a hozz\u00e1f\u00e9r\u00e9si token megszerz\u00e9se sor\u00e1n.", 16 | "reauth_successful": "Az \u00fajrahiteles\u00edt\u00e9s sikeres volt.", 17 | "timeout_connect": "Id\u0151t\u00fall\u00e9p\u00e9s a kapcsolat l\u00e9trehoz\u00e1sa sor\u00e1n", 18 | "unknown": "V\u00e1ratlan hiba" 19 | }, 20 | "create_entry": { 21 | "default": "Sikeres hiteles\u00edt\u00e9s" 22 | }, 23 | "step": { 24 | "auth": { 25 | "title": "Google-fi\u00f3k \u00f6sszekapcsol\u00e1sa" 26 | }, 27 | "pick_implementation": { 28 | "title": "V\u00e1lasszon egy hiteles\u00edt\u00e9si m\u00f3dszert" 29 | }, 30 | "reauth_confirm": { 31 | "description": "A Google Assistant SDK integr\u00e1ci\u00f3nak \u00fajra kell hiteles\u00edtenie fi\u00f3kj\u00e1t", 32 | "title": "A(z) {name} hiteles\u00edt\u00e9se lej\u00e1rt" 33 | } 34 | } 35 | }, 36 | "options": { 37 | "step": { 38 | "init": { 39 | "data": { 40 | "enable_conversation_agent": "A besz\u00e9lget\u00e9sk\u00f6zvet\u00edt\u0151 enged\u00e9lyez\u00e9se", 41 | "language_code": "Nyelvi k\u00f3d" 42 | }, 43 | "description": "\u00c1ll\u00edtsa be a Google Seg\u00e9ddel folytatott interakci\u00f3k nyelv\u00e9t, valamint azt, hogy enged\u00e9lyezi-e a besz\u00e9lget\u00e9sk\u00f6zvet\u00edt\u0151t." 44 | } 45 | } 46 | }, 47 | "services": { 48 | "send_text_command": { 49 | "description": "Parancsot k\u00fcld sz\u00f6veges lek\u00e9rdez\u00e9sk\u00e9nt a Google Seg\u00e9dnek.", 50 | "fields": { 51 | "command": { 52 | "description": "Parancs(ok), amelyeket a Google Seg\u00e9dnek kell k\u00fcldeni.", 53 | "name": "Parancs" 54 | }, 55 | "media_player": { 56 | "description": "A v\u00e1lasz lej\u00e1tsz\u00e1s\u00e1hoz haszn\u00e1lt m\u00e9dialej\u00e1tsz\u00f3 entit\u00e1s(ok) neve.", 57 | "name": "M\u00e9dialej\u00e1tsz\u00f3 entit\u00e1s" 58 | } 59 | }, 60 | "name": "Sz\u00f6veges parancs k\u00fcld\u00e9se" 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/id.json: -------------------------------------------------------------------------------- 1 | { 2 | "application_credentials": { 3 | "description": "Ikuti [instruksi]({more_info_url}) untuk [layar persetujuan OAuth]({oauth_consent_url}) untuk memberi Home Assistant akses ke SDK Asisten Google Anda. Anda juga perlu membuat Kredensial Aplikasi yang ditautkan ke akun Anda:\n1. Buka [Kredensial]({oauth_creds_url}) dan pilih **Buat Kredensial**.\n1. Dari daftar drop-down pilih **ID klien OAuth**.\n1. Pilih **Aplikasi web** untuk Jenis Aplikasi." 4 | }, 5 | "config": { 6 | "abort": { 7 | "already_configured": "Akun sudah dikonfigurasi", 8 | "already_in_progress": "Alur konfigurasi sedang berlangsung", 9 | "cannot_connect": "Gagal terhubung", 10 | "invalid_access_token": "Token akses tidak valid", 11 | "missing_configuration": "Komponen tidak dikonfigurasi. Ikuti petunjuk dalam dokumentasi.", 12 | "oauth_error": "Menerima respons token yang tidak valid.", 13 | "oauth_failed": "Terjadi kesalahan saat mendapatkan token akses.", 14 | "oauth_timeout": "Tenggang waktu penyelesaian token OAuth habis.", 15 | "oauth_unauthorized": "Kesalahan otorisasi OAuth saat mendapatkan token akses.", 16 | "reauth_successful": "Autentikasi ulang berhasil", 17 | "timeout_connect": "Tenggang waktu pembuatan koneksi habis", 18 | "unknown": "Kesalahan tak terduga" 19 | }, 20 | "create_entry": { 21 | "default": "Berhasil diautentikasi" 22 | }, 23 | "step": { 24 | "auth": { 25 | "title": "Tautkan Akun Google" 26 | }, 27 | "pick_implementation": { 28 | "title": "Pilih metode autentikasi" 29 | }, 30 | "reauth_confirm": { 31 | "description": "Integrasi SDK Asisten Google perlu mengautentikasi ulang akun Anda", 32 | "title": "Autentikasi ulang integrasi untuk {name}" 33 | } 34 | } 35 | }, 36 | "options": { 37 | "step": { 38 | "init": { 39 | "data": { 40 | "enable_conversation_agent": "Aktifkan agen percakapan", 41 | "language_code": "Kode bahasa" 42 | }, 43 | "description": "Tetapkan bahasa untuk interaksi dengan Asisten Google dan apakah Anda ingin mengaktifkan agen percakapan." 44 | } 45 | } 46 | }, 47 | "services": { 48 | "send_text_command": { 49 | "description": "Mengirimkan perintah sebagai kueri teks ke Asisten Google.", 50 | "fields": { 51 | "command": { 52 | "description": "Perintah untuk dikirim ke Asisten Google.", 53 | "name": "Perintah" 54 | }, 55 | "media_player": { 56 | "description": "Nama entitas pemutar media untuk memutar respons.", 57 | "name": "Entitas pemutar media" 58 | } 59 | }, 60 | "name": "Kirim perintah teks" 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/it.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "L'account \u00e8 gi\u00e0 configurato", 5 | "already_in_progress": "Il flusso di configurazione \u00e8 gi\u00e0 in corso", 6 | "cannot_connect": "Impossibile connettersi", 7 | "invalid_access_token": "Token di accesso non valido", 8 | "missing_configuration": "Il componente non \u00e8 configurato. Segui la documentazione.", 9 | "oauth_error": "Ricevuti dati token non validi.", 10 | "oauth_failed": "Errore durante l'ottenimento del token di accesso.", 11 | "oauth_timeout": "Tempo scaduto durante la risoluzione del token OAuth.", 12 | "oauth_unauthorized": "Errore di autorizzazione OAuth durante l'ottenimento del token di accesso.", 13 | "reauth_successful": "La riautenticazione ha avuto successo", 14 | "timeout_connect": "Tempo scaduto per stabile la connessione.", 15 | "unknown": "Errore imprevisto" 16 | }, 17 | "create_entry": { 18 | "default": "Autenticazione riuscita" 19 | }, 20 | "step": { 21 | "auth": { 22 | "title": "Collega l'account Google" 23 | }, 24 | "pick_implementation": { 25 | "title": "Scegli il metodo di autenticazione" 26 | }, 27 | "reauth_confirm": { 28 | "description": "L'integrazione dell'SDK dell'Assistente Google deve autenticare nuovamente il tuo account", 29 | "title": "Autenticazione scaduta per {name}" 30 | } 31 | } 32 | }, 33 | "options": { 34 | "step": { 35 | "init": { 36 | "data": { 37 | "enable_conversation_agent": "Abilita l'agente di conversazione", 38 | "language_code": "Codice lingua" 39 | }, 40 | "description": "Imposta la lingua per le interazioni con Google Assistant e se desideri abilitare l'agente di conversazione." 41 | } 42 | } 43 | }, 44 | "services": { 45 | "send_text_command": { 46 | "description": "Invia un comando come query di testo a Google Assistant.", 47 | "fields": { 48 | "command": { 49 | "description": "Comandi da inviare a Google Assistant.", 50 | "name": "Comando" 51 | }, 52 | "media_player": { 53 | "description": "Nome/i delle entit\u00e0 del lettore multimediale su cui riprodurre la risposta.", 54 | "name": "Entit\u00e0 lettore multimediale" 55 | } 56 | }, 57 | "name": "Invia comando di testo" 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "\u30a2\u30ab\u30a6\u30f3\u30c8\u306f\u3059\u3067\u306b\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059", 5 | "already_in_progress": "\u69cb\u6210\u30d5\u30ed\u30fc\u306f\u3059\u3067\u306b\u9032\u884c\u4e2d\u3067\u3059", 6 | "cannot_connect": "\u63a5\u7d9a\u306b\u5931\u6557\u3057\u307e\u3057\u305f", 7 | "invalid_access_token": "\u7121\u52b9\u306a\u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3", 8 | "missing_configuration": "\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306b\u5f93\u3063\u3066\u304f\u3060\u3055\u3044\u3002", 9 | "oauth_error": "\u7121\u52b9\u306a\u30c8\u30fc\u30af\u30f3\u30c7\u30fc\u30bf\u3092\u53d7\u4fe1\u3057\u307e\u3057\u305f\u3002", 10 | "oauth_failed": "\u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3\u306e\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002", 11 | "oauth_timeout": "OAuth \u30c8\u30fc\u30af\u30f3\u3092\u89e3\u6c7a\u3059\u308b\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3002", 12 | "oauth_unauthorized": "\u30a2\u30af\u30bb\u30b9 \u30c8\u30fc\u30af\u30f3\u306e\u53d6\u5f97\u4e2d\u306b OAuth \u8a8d\u8a3c\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002", 13 | "reauth_successful": "\u518d\u8a8d\u8a3c\u306b\u6210\u529f\u3057\u307e\u3057\u305f", 14 | "timeout_connect": "\u63a5\u7d9a\u78ba\u7acb\u6642\u306b\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8", 15 | "unknown": "\u4e88\u671f\u3057\u306a\u3044\u30a8\u30e9\u30fc" 16 | }, 17 | "create_entry": { 18 | "default": "\u6b63\u5e38\u306b\u8a8d\u8a3c\u3055\u308c\u307e\u3057\u305f" 19 | }, 20 | "step": { 21 | "auth": { 22 | "title": "Google\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u30ea\u30f3\u30af\u3059\u308b" 23 | }, 24 | "pick_implementation": { 25 | "title": "\u8a8d\u8a3c\u65b9\u6cd5\u306e\u9078\u629e" 26 | }, 27 | "reauth_confirm": { 28 | "description": "Google \u30a2\u30b7\u30b9\u30bf\u30f3\u30c8 SDK \u306e\u7d71\u5408\u3067\u306f\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u518d\u8a8d\u8a3c\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059", 29 | "title": "{name} \u306e\u8a8d\u8a3c\u306e\u6709\u52b9\u671f\u9650\u304c\u5207\u308c\u307e\u3057\u305f" 30 | } 31 | } 32 | }, 33 | "options": { 34 | "step": { 35 | "init": { 36 | "data": { 37 | "enable_conversation_agent": "\u4f1a\u8a71\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u6709\u52b9\u306b\u3059\u308b", 38 | "language_code": "\u8a00\u8a9e\u30b3\u30fc\u30c9" 39 | }, 40 | "description": "Google \u30a2\u30b7\u30b9\u30bf\u30f3\u30c8\u3068\u306e\u5bfe\u8a71\u306b\u4f7f\u7528\u3059\u308b\u8a00\u8a9e\u3068\u3001\u4f1a\u8a71\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u6709\u52b9\u306b\u3059\u308b\u304b\u3069\u3046\u304b\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002" 41 | } 42 | } 43 | }, 44 | "services": { 45 | "send_text_command": { 46 | "description": "\u30b3\u30de\u30f3\u30c9\u3092\u30c6\u30ad\u30b9\u30c8\u30af\u30a8\u30ea\u3068\u3057\u3066 Google \u30a2\u30b7\u30b9\u30bf\u30f3\u30c8\u306b\u9001\u4fe1\u3057\u307e\u3059\u3002", 47 | "fields": { 48 | "command": { 49 | "description": "Google \u30a2\u30b7\u30b9\u30bf\u30f3\u30c8\u306b\u9001\u4fe1\u3059\u308b\u30b3\u30de\u30f3\u30c9\u3002", 50 | "name": "\u30b3\u30de\u30f3\u30c9" 51 | }, 52 | "media_player": { 53 | "description": "\u5fdc\u7b54\u3092\u518d\u751f\u3059\u308b\u30e1\u30c7\u30a3\u30a2 \u30d7\u30ec\u30fc\u30e4\u30fc \u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u306e\u540d\u524d\u3002", 54 | "name": "\u30e1\u30c7\u30a3\u30a2\u30d7\u30ec\u30fc\u30e4\u30fc\u30a8\u30f3\u30c6\u30a3\u30c6\u30a3" 55 | } 56 | }, 57 | "name": "\u30c6\u30ad\u30b9\u30c8\u30b3\u30de\u30f3\u30c9\u3092\u9001\u4fe1" 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/ko.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "\uacc4\uc815\uc774 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", 5 | "already_in_progress": "\uad6c\uc131 \ud750\ub984\uc774 \uc774\ubbf8 \uc9c4\ud589 \uc911\uc785\ub2c8\ub2e4.", 6 | "cannot_connect": "\uc5f0\uacb0 \uc2e4\ud328", 7 | "invalid_access_token": "\uc798\ubabb\ub41c \uc561\uc138\uc2a4 \ud1a0\ud070", 8 | "missing_configuration": "\uad6c\uc131\uc694\uc18c\uac00 \uad6c\uc131\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \uc124\uba85\uc11c\ub97c \ucc38\uace0\ud574\uc8fc\uc138\uc694.", 9 | "oauth_error": "\uc798\ubabb\ub41c \ud1a0\ud070 \ub370\uc774\ud130\ub97c \ubc1b\uc558\uc2b5\ub2c8\ub2e4.", 10 | "oauth_failed": "\uc561\uc138\uc2a4 \ud1a0\ud070\uc744 \uac00\uc838\uc624\ub294 \uc911 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4.", 11 | "oauth_timeout": "OAuth \ud1a0\ud070\uc744 \ud655\uc778\ud558\ub294 \uc2dc\uac04\uc774 \ucd08\uacfc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", 12 | "oauth_unauthorized": "\uc561\uc138\uc2a4 \ud1a0\ud070\uc744 \uc5bb\ub294 \ub3d9\uc548 OAuth \uc778\uc99d \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4.", 13 | "reauth_successful": "\uc7ac\uc778\uc99d \uc131\uacf5", 14 | "timeout_connect": "\uc5f0\uacb0 \uc124\uc815 \uc2dc\uac04 \ucd08\uacfc", 15 | "unknown": "\uc608\uae30\uce58 \ubabb\ud55c \uc624\ub958" 16 | }, 17 | "create_entry": { 18 | "default": "\uc778\uc99d \uc131\uacf5" 19 | }, 20 | "step": { 21 | "auth": { 22 | "title": "Google \uacc4\uc815 \uc5f0\uacb0" 23 | }, 24 | "pick_implementation": { 25 | "title": "\uc778\uc99d \ubc29\ubc95 \uc120\ud0dd\ud558\uae30" 26 | }, 27 | "reauth_confirm": { 28 | "description": "Google Assistant SDK \ud1b5\ud569\uad6c\uc131\uc694\uc18c\uc5d0\uc11c \uacc4\uc815\uc744 \ub2e4\uc2dc \uc778\uc99d\ud574\uc57c \ud569\ub2c8\ub2e4", 29 | "title": "\ud1b5\ud569 \uc7ac\uc778\uc99d" 30 | } 31 | } 32 | }, 33 | "options": { 34 | "step": { 35 | "init": { 36 | "data": { 37 | "enable_conversation_agent": "\ub300\ud654 \uc5d0\uc774\uc804\ud2b8 \ud65c\uc131\ud654", 38 | "language_code": "\uc5b8\uc5b4 \ucf54\ub4dc" 39 | }, 40 | "description": "Google \uc5b4\uc2dc\uc2a4\ud134\ud2b8\uc640\uc758 \uc0c1\ud638\uc791\uc6a9 \uc5b8\uc5b4 \ubc0f \ub300\ud654 \uc5d0\uc774\uc804\ud2b8 \uc0ac\uc6a9 \uc5ec\ubd80\ub97c \uc124\uc815\ud569\ub2c8\ub2e4." 41 | } 42 | } 43 | }, 44 | "services": { 45 | "send_text_command": { 46 | "description": "Google \uc5b4\uc2dc\uc2a4\ud134\ud2b8\uc5d0 \ud14d\uc2a4\ud2b8 \ucffc\ub9ac\ub85c \uba85\ub839\uc744 \ubcf4\ub0c5\ub2c8\ub2e4.", 47 | "fields": { 48 | "command": { 49 | "description": "Google \uc5b4\uc2dc\uc2a4\ud134\ud2b8\ub85c \ubcf4\ub0bc \uba85\ub839\uc5b4\uc785\ub2c8\ub2e4.", 50 | "name": "\uba85\ub839" 51 | }, 52 | "media_player": { 53 | "description": "\uc751\ub2f5\uc744 \uc7ac\uc0dd\ud560 \ubbf8\ub514\uc5b4 \ud50c\ub808\uc774\uc5b4 \uad6c\uc131\uc694\uc18c\uc758 \uc774\ub984", 54 | "name": "\ubbf8\ub514\uc5b4 \ud50c\ub808\uc774\uc5b4 \uad6c\uc131\uc694\uc18c" 55 | } 56 | }, 57 | "name": "\ubb38\uc790 \uba85\ub839 \ubcf4\ub0b4\uae30" 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/lt.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Paskyra jau sukonfig\u016bruota", 5 | "already_in_progress": "Konfig\u016bracijos procesas jau vyksta", 6 | "cannot_connect": "Nepavyko prisijungti", 7 | "invalid_access_token": "Neteisingas prieigos raktas", 8 | "missing_configuration": "Komponentas nesukonfig\u016bruotas. Pra\u0161ome vadovautis dokumentacija.", 9 | "oauth_error": "Gauti neteisingi prieigos rakto duomenys.", 10 | "oauth_failed": "Klaida gaunant prieigos rakt\u0105.", 11 | "oauth_timeout": "Baig\u0117si skirtasis OAuth prieigos raktas.", 12 | "oauth_unauthorized": "OAuth prieigos teis\u0117s klaida gaunant prieigos rakt\u0105.", 13 | "reauth_successful": "Pakartotinis autentifikavimas buvo s\u0117kmingas", 14 | "timeout_connect": "Baig\u0117si ry\u0161io u\u017emezgimo laikas", 15 | "unknown": "Netik\u0117ta klaida" 16 | }, 17 | "create_entry": { 18 | "default": "S\u0117kmingai autentifikuota" 19 | }, 20 | "step": { 21 | "auth": { 22 | "title": "Susieti Google paskyr\u0105" 23 | }, 24 | "pick_implementation": { 25 | "title": "Pasirinkite autentifikavimo metod\u0105" 26 | }, 27 | "reauth_confirm": { 28 | "description": "Integruojant \u201eGoogle Assistant\u201c SDK reikia i\u0161 naujo autentifikuoti paskyr\u0105", 29 | "title": "Baig\u0117si {name} autentifikavimo galiojimas" 30 | } 31 | } 32 | }, 33 | "options": { 34 | "step": { 35 | "init": { 36 | "data": { 37 | "enable_conversation_agent": "\u012egalinti pokalbi\u0173 agent\u0105", 38 | "language_code": "Kalbos kodas" 39 | }, 40 | "description": "Nustatykite s\u0105veikos su \"Google Assistant\" kalb\u0105 ir ar norite \u012fjungti pokalbi\u0173 agent\u0105." 41 | } 42 | } 43 | }, 44 | "services": { 45 | "send_text_command": { 46 | "description": "Siun\u010dia komand\u0105 kaip teksto u\u017eklaus\u0105 \"Google Assistant\".", 47 | "fields": { 48 | "command": { 49 | "description": "Komand\u0105 (-as), kuri\u0105 (-ias) si\u0173sti \"Google Assistant\".", 50 | "name": "Komanda" 51 | }, 52 | "media_player": { 53 | "description": "Medijos leistuvo objekt\u0173 pavadinimas (-ai), kuriame (-i) bus leid\u017eiamas atsakymas.", 54 | "name": "Medijos grotuvo subjektas" 55 | } 56 | }, 57 | "name": "Si\u0173sti teksto komand\u0105" 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/lv.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Konts jau ir konfigur\u0113ts", 5 | "already_in_progress": "Konfigur\u0113\u0161anas process jau notiek", 6 | "cannot_connect": "Piesl\u0113guma k\u013c\u016bda", 7 | "reauth_successful": "Atk\u0101rtota autentifik\u0101cija veiksm\u012bga", 8 | "timeout_connect": "Savienojuma izveides laika ierobe\u017eojums", 9 | "unknown": "Neparedz\u0113ta k\u013c\u016bda" 10 | }, 11 | "create_entry": { 12 | "default": "Veiksm\u012bgi autentific\u0113ts" 13 | }, 14 | "step": { 15 | "auth": { 16 | "title": "Google konta piesaiste" 17 | }, 18 | "pick_implementation": { 19 | "title": "Autentifik\u0101cijas metodes izv\u0113le" 20 | }, 21 | "reauth_confirm": { 22 | "title": "{name} beigusies autentifik\u0101cija" 23 | } 24 | } 25 | }, 26 | "options": { 27 | "step": { 28 | "init": { 29 | "data": { 30 | "language_code": "Valodas kods" 31 | } 32 | } 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/nb.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Kontoen er allerede konfigurert", 5 | "already_in_progress": "Konfigurasjonsflyten p\u00e5g\u00e5r allerede", 6 | "cannot_connect": "Tilkobling mislyktes", 7 | "invalid_access_token": "Ugyldig tilgangskode", 8 | "missing_configuration": "Komponenten er ikke konfigurert, vennligst f\u00f8lg dokumentasjonen", 9 | "oauth_error": "Mottatt ugyldige token-data.", 10 | "oauth_failed": "Feil ved henting av tilgangskode.", 11 | "oauth_timeout": "Tidsavbrudd ved oppslag av OAuth-token.", 12 | "oauth_unauthorized": "OAuth-autorisasjonsfeil ved henting av tilgangskode.", 13 | "reauth_successful": "Autentisering p\u00e5 nytt var vellykket", 14 | "timeout_connect": "Tidsavbrudd oppretter forbindelse", 15 | "unknown": "Uventet feil" 16 | }, 17 | "create_entry": { 18 | "default": "Vellykket godkjenning" 19 | }, 20 | "step": { 21 | "auth": { 22 | "title": "Koble til Google-kontoen" 23 | }, 24 | "pick_implementation": { 25 | "title": "Velg godkjenningsmetode" 26 | }, 27 | "reauth_confirm": { 28 | "description": "Google Assistant SDK-integrasjonen m\u00e5 autentisere kontoen din p\u00e5 nytt", 29 | "title": "Autentisering er utl\u00f8pt for {name}" 30 | } 31 | } 32 | }, 33 | "options": { 34 | "step": { 35 | "init": { 36 | "data": { 37 | "enable_conversation_agent": "Aktiver samtaleagenten", 38 | "language_code": "Spr\u00e5kkode" 39 | }, 40 | "description": "Angi spr\u00e5k for interaksjoner med Google Assistant og om du vil aktivere samtaleagenten." 41 | } 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/nl.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Account is al geconfigureerd", 5 | "already_in_progress": "De configuratie is momenteel al bezig", 6 | "cannot_connect": "Kan geen verbinding maken", 7 | "invalid_access_token": "Ongeldig toegangstoken", 8 | "missing_configuration": "Integratie niet geconfigureerd. Raadpleeg de documentatie.", 9 | "oauth_error": "Ongeldige tokengegevens ontvangen.", 10 | "oauth_unauthorized": "OAuth autorisatiefout tijdens het verkrijgen van een toegangstoken.", 11 | "reauth_successful": "Herauthenticatie geslaagd", 12 | "timeout_connect": "Time-out bij het maken van verbinding", 13 | "unknown": "Onverwachte fout" 14 | }, 15 | "create_entry": { 16 | "default": "Authenticatie geslaagd" 17 | }, 18 | "step": { 19 | "auth": { 20 | "title": "Google-account koppelen" 21 | }, 22 | "pick_implementation": { 23 | "title": "Kies een authenticatie methode" 24 | }, 25 | "reauth_confirm": { 26 | "description": "De Google Assistent SDK integratie moet je account opnieuw verifi\u00ebren", 27 | "title": "Authenticatie is verlopen voor {name}" 28 | } 29 | } 30 | }, 31 | "options": { 32 | "step": { 33 | "init": { 34 | "data": { 35 | "enable_conversation_agent": "Schakel de conversatie in", 36 | "language_code": "Taalcode" 37 | }, 38 | "description": "Stel de taal in voor interacties met de Google Assistent en of je de gespreksagent wilt inschakelen." 39 | } 40 | } 41 | }, 42 | "services": { 43 | "send_text_command": { 44 | "description": "Stuurt een commando als text query naar Google Assistant.", 45 | "fields": { 46 | "command": { 47 | "description": "Commando('s) om te sturen naar Google Assistant", 48 | "name": "Command" 49 | }, 50 | "media_player": { 51 | "description": "Naam/namen van mediaspeler entiteiten om de reactie op af te spelen.", 52 | "name": "Mediaspeler entiteit" 53 | } 54 | }, 55 | "name": "Stuur tekstcommando" 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/pl.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "cannot_connect": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia", 5 | "invalid_access_token": "Niepoprawny token dost\u0119pu", 6 | "missing_configuration": "Komponent nie jest skonfigurowany. Post\u0119puj zgodnie z dokumentacj\u0105.", 7 | "oauth_error": "Otrzymano nieprawid\u0142owe dane tokena.", 8 | "oauth_failed": "B\u0142\u0105d podczas uzyskiwania tokena dost\u0119pu.", 9 | "oauth_timeout": "Przekroczono limit czasu rozpoznawania tokena OAuth.", 10 | "oauth_unauthorized": "B\u0142\u0105d autoryzacji OAuth podczas uzyskiwania tokena dost\u0119pu.", 11 | "timeout_connect": "Limit czasu na nawi\u0105zanie po\u0142\u0105czenia", 12 | "unknown": "Nieoczekiwany b\u0142\u0105d" 13 | }, 14 | "create_entry": { 15 | "default": "Pomy\u015blnie uwierzytelniono" 16 | }, 17 | "step": { 18 | "auth": { 19 | "title": "Po\u0142\u0105czenie z kontem Google" 20 | }, 21 | "pick_implementation": { 22 | "title": "Wybierz metod\u0119 uwierzytelniania" 23 | }, 24 | "reauth_confirm": { 25 | "description": "Integracja Google Assistant SDK wymaga ponownego uwierzytelnienia Twojego konta", 26 | "title": "Autoryzacja wygas\u0142a dla {name}" 27 | } 28 | } 29 | }, 30 | "options": { 31 | "step": { 32 | "init": { 33 | "data": { 34 | "enable_conversation_agent": "W\u0142\u0105cz agenta konwersacji", 35 | "language_code": "Kod j\u0119zyka" 36 | }, 37 | "description": "Ustaw j\u0119zyk interakcji z Asystentem Google i czy chcesz w\u0142\u0105czy\u0107 agenta konwersacji." 38 | } 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/pt-BR.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "A conta j\u00e1 foi configurada", 5 | "already_in_progress": "O fluxo de configura\u00e7\u00e3o j\u00e1 est\u00e1 em andamento", 6 | "cannot_connect": "Falha ao conectar", 7 | "invalid_access_token": "Token de acesso inv\u00e1lido", 8 | "missing_configuration": "O componente n\u00e3o est\u00e1 configurado. Por favor, siga a documenta\u00e7\u00e3o.", 9 | "oauth_error": "Dados de token recebidos inv\u00e1lidos.", 10 | "oauth_failed": "Erro ao obter token de acesso.", 11 | "oauth_timeout": "Tempo limite resolvendo o token OAuth.", 12 | "oauth_unauthorized": "Erro de autoriza\u00e7\u00e3o OAuth ao obter o token de acesso.", 13 | "reauth_successful": "A reautentica\u00e7\u00e3o foi bem-sucedida", 14 | "timeout_connect": "Tempo limite para estabelecer conex\u00e3o atingido", 15 | "unknown": "Erro inesperado" 16 | }, 17 | "create_entry": { 18 | "default": "Autenticado com sucesso" 19 | }, 20 | "step": { 21 | "auth": { 22 | "title": "Vincular conta do Google" 23 | }, 24 | "pick_implementation": { 25 | "title": "Escolha o m\u00e9todo de autentica\u00e7\u00e3o" 26 | }, 27 | "reauth_confirm": { 28 | "description": "A integra\u00e7\u00e3o do Google Assistant SDK precisa autenticar novamente sua conta", 29 | "title": "A autentica\u00e7\u00e3o expirada para {name}" 30 | } 31 | } 32 | }, 33 | "options": { 34 | "step": { 35 | "init": { 36 | "data": { 37 | "enable_conversation_agent": "Habilitar o agente de conversa", 38 | "language_code": "C\u00f3digo do idioma" 39 | }, 40 | "description": "Defina o idioma para intera\u00e7\u00f5es com o Google Assistant e se deseja ativar o agente de conversa\u00e7\u00e3o." 41 | } 42 | } 43 | }, 44 | "services": { 45 | "send_text_command": { 46 | "description": "Envia um comando como uma consulta de texto para o Google Assistant.", 47 | "fields": { 48 | "command": { 49 | "description": "Comando(s) para enviar ao Google Assistente.", 50 | "name": "Comando" 51 | }, 52 | "media_player": { 53 | "description": "Nome(s) das entidades do media player para reproduzir a resposta.", 54 | "name": "Entidade do media player" 55 | } 56 | }, 57 | "name": "Enviar comando de texto" 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/pt.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Conta j\u00e1 configurada", 5 | "already_in_progress": "O processo de configura\u00e7\u00e3o j\u00e1 est\u00e1 a decorrer", 6 | "cannot_connect": "A liga\u00e7\u00e3o falhou", 7 | "invalid_access_token": "Token de acesso inv\u00e1lido", 8 | "missing_configuration": "O componente n\u00e3o est\u00e1 configurado. Por favor, siga a documenta\u00e7\u00e3o.", 9 | "oauth_error": "Recebido token de autentica\u00e7\u00e3o inv\u00e1lido.", 10 | "oauth_timeout": "Excedido o tempo limite para o OAuth token.", 11 | "oauth_unauthorized": "Erro de autoriza\u00e7\u00e3o OAuth ao obter o token de acesso.", 12 | "reauth_successful": "Reautentica\u00e7\u00e3o bem sucedida", 13 | "timeout_connect": "Excedido o tempo limite para estabelecer liga\u00e7\u00e3o", 14 | "unknown": "Erro inesperado" 15 | }, 16 | "create_entry": { 17 | "default": "Autenticado com sucesso" 18 | }, 19 | "step": { 20 | "auth": { 21 | "title": "Vincular Conta do Google" 22 | }, 23 | "pick_implementation": { 24 | "title": "Escolha o m\u00e9todo de autentica\u00e7\u00e3o" 25 | }, 26 | "reauth_confirm": { 27 | "description": "A integra\u00e7\u00e3o do Google Assistant SDK precisa autenticar novamente sua conta", 28 | "title": "A autentica\u00e7\u00e3o expirou para {name}" 29 | } 30 | } 31 | }, 32 | "options": { 33 | "step": { 34 | "init": { 35 | "data": { 36 | "enable_conversation_agent": "Iniciar o agente de conversa\u00e7\u00e3o", 37 | "language_code": "C\u00f3digo do idioma" 38 | }, 39 | "description": "Defina o idioma para intera\u00e7\u00f5es com o Google Assistant e se deseja ativar o agente de conversa\u00e7\u00e3o." 40 | } 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/ro.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Contul a fost configurat deja", 5 | "already_in_progress": "Fluxul de configura\u021bie este deja \u00een desf\u0103\u0219urare", 6 | "cannot_connect": "A e\u0219uat conectarea", 7 | "invalid_access_token": "Token de acces nevalid", 8 | "missing_configuration": "Componenta nu este configurat\u0103. Te rug\u0103m s\u0103 urmezi instruc\u021biunile din documenta\u021bie.", 9 | "oauth_error": "Am primit date nevalide despre token.", 10 | "reauth_successful": "Re-autentificarea s-a realizat cu succes", 11 | "timeout_connect": "A expirat timpul de stabilire a conexiunii", 12 | "unknown": "Eroare nea\u0219teptat\u0103" 13 | }, 14 | "create_entry": { 15 | "default": "Autentificare realizat\u0103 cu succes" 16 | }, 17 | "step": { 18 | "auth": { 19 | "title": "Conectare Cont Google" 20 | }, 21 | "pick_implementation": { 22 | "title": "Alege metoda de autentificare" 23 | }, 24 | "reauth_confirm": { 25 | "description": "Integrarea Google Assistant SDK trebuie s\u0103 \u00ee\u021bi autentifice din nou contul", 26 | "title": "Autentificarea a expirat pentru {name}" 27 | } 28 | } 29 | }, 30 | "options": { 31 | "step": { 32 | "init": { 33 | "data": { 34 | "enable_conversation_agent": "Activeaz\u0103 agentul de conversa\u021bie", 35 | "language_code": "Codul limbii" 36 | }, 37 | "description": "Seteaz\u0103 limba pentru interac\u021biunile cu Asistentul Google \u0219i dac\u0103 dore\u0219ti s\u0103 activezi agentul de conversa\u021bie." 38 | } 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "application_credentials": { 3 | "description": "\u0421\u043b\u0435\u0434\u0443\u0439\u0442\u0435 [\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c]({more_info_url}) \u043d\u0430 [\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 OAuth]({oauth_consent_url}), \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c Home Assistant \u0434\u043e\u0441\u0442\u0443\u043f \u043a Google Assistant SDK. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0412\u0430\u0448\u0438\u043c \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u043c:\n1. \u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 [Credentials]({oauth_creds_url}) \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 **Create Credentials**.\n2. \u0412 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 **OAuth client ID**.\n3. \u0412 \u043f\u043e\u043b\u0435 **Application Type** \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 **Web application**." 4 | }, 5 | "config": { 6 | "abort": { 7 | "already_configured": "\u042d\u0442\u0430 \u0443\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 Home Assistant", 8 | "already_in_progress": "\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f", 9 | "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f", 10 | "invalid_access_token": "\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430", 11 | "missing_configuration": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439.", 12 | "oauth_error": "\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u0430.", 13 | "oauth_failed": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0442\u043e\u043a\u0435\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430.", 14 | "oauth_timeout": "\u0422\u0430\u0439\u043c-\u0430\u0443\u0442 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430 OAuth.", 15 | "oauth_unauthorized": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 OAuth \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0442\u043e\u043a\u0435\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430.", 16 | "reauth_successful": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e", 17 | "timeout_connect": "\u0418\u0441\u0442\u0435\u043a\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f", 18 | "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430" 19 | }, 20 | "create_entry": { 21 | "default": "\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e" 22 | }, 23 | "step": { 24 | "auth": { 25 | "title": "\u0423\u0447\u0435\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c Google" 26 | }, 27 | "pick_implementation": { 28 | "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438" 29 | }, 30 | "reauth_confirm": { 31 | "description": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 Google.", 32 | "title": "\u0418\u0441\u0442\u0435\u043a \u0441\u0440\u043e\u043a \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 {name}" 33 | } 34 | } 35 | }, 36 | "options": { 37 | "step": { 38 | "init": { 39 | "data": { 40 | "enable_conversation_agent": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0430\u0433\u0435\u043d\u0442 \u0434\u0438\u0430\u043b\u043e\u0433\u0430", 41 | "language_code": "\u041a\u043e\u0434 \u044f\u0437\u044b\u043a\u0430" 42 | }, 43 | "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 Google Assistant \u0438 \u0443\u043a\u0430\u0436\u0438\u0442\u0435, \u0445\u043e\u0442\u0438\u0442\u0435 \u043b\u0438 \u0412\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0430\u0433\u0435\u043d\u0442 \u0434\u0438\u0430\u043b\u043e\u0433\u0430." 44 | } 45 | } 46 | }, 47 | "services": { 48 | "send_text_command": { 49 | "description": "\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432 \u0432\u0438\u0434\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 Google Assistant.", 50 | "fields": { 51 | "command": { 52 | "description": "\u041a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0432 Google Assistant.", 53 | "name": "\u041a\u043e\u043c\u0430\u043d\u0434\u0430" 54 | } 55 | } 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/sk.json: -------------------------------------------------------------------------------- 1 | { 2 | "application_credentials": { 3 | "description": "Postupujte pod\u013ea [pokynov]({more_info_url}) pre [obrazovku s\u00fahlasu OAuth]({oauth_consent_url}), aby ste poskytli asistentovi Home Assistant pr\u00edstup k v\u00e1\u0161mu Google Assistant SDK. Mus\u00edte tie\u017e vytvori\u0165 aplika\u010dn\u00e9 poverenia prepojen\u00e9 s va\u0161\u00edm \u00fa\u010dtom:\n1. Prejdite na str\u00e1nku [Credentials]({oauth_creds_url}) a vyberte mo\u017enos\u0165 **Create Credentials** (Vytvori\u0165 poverenia**).\n2. Z rozba\u013eovacieho zoznamu vyberte polo\u017eku **OAuth client ID**.\n3. Pre typ aplik\u00e1cie vyberte **Webov\u00e1 aplik\u00e1cia**." 4 | }, 5 | "config": { 6 | "abort": { 7 | "already_configured": "\u00da\u010det je u\u017e nakonfigurovan\u00fd", 8 | "already_in_progress": "Konfigur\u00e1cia u\u017e prebieha", 9 | "cannot_connect": "Nepodarilo sa pripoji\u0165", 10 | "invalid_access_token": "Neplatn\u00fd pr\u00edstupov\u00fd token", 11 | "missing_configuration": "Komponent nie je nakonfigurovan\u00fd. Postupujte pod\u013ea dokument\u00e1cie.", 12 | "oauth_error": "Prijat\u00e9 neplatn\u00e9 \u00fadaje tokenu.", 13 | "oauth_failed": "Chyba pri z\u00edskavan\u00ed pr\u00edstupov\u00e9ho tokenu.", 14 | "oauth_timeout": "\u010casov\u00fd limit na vyrie\u0161enie tokenu OAuth.", 15 | "oauth_unauthorized": "Chyba autoriz\u00e1cie OAuth pri z\u00edskavan\u00ed pr\u00edstupov\u00e9ho tokenu.", 16 | "reauth_successful": "Op\u00e4tovn\u00e9 overenie bolo \u00faspe\u0161n\u00e9", 17 | "timeout_connect": "\u010casov\u00fd limit na nadviazanie spojenia", 18 | "unknown": "Neo\u010dak\u00e1van\u00e1 chyba" 19 | }, 20 | "create_entry": { 21 | "default": "\u00daspe\u0161ne overen\u00e9" 22 | }, 23 | "step": { 24 | "auth": { 25 | "title": "Prepoji\u0165 \u00fa\u010det Google" 26 | }, 27 | "pick_implementation": { 28 | "title": "Vyberte met\u00f3du overenia" 29 | }, 30 | "reauth_confirm": { 31 | "description": "Integr\u00e1cia s\u00fapravy Google Assistant SDK vy\u017eaduje op\u00e4tovn\u00e9 overenie v\u00e1\u0161ho \u00fa\u010dtu", 32 | "title": "Vypr\u0161ala platnos\u0165 overenia pre {name}" 33 | } 34 | } 35 | }, 36 | "options": { 37 | "step": { 38 | "init": { 39 | "data": { 40 | "enable_conversation_agent": "Povolenie agenta pre konverz\u00e1ciu", 41 | "language_code": "K\u00f3d jazyka" 42 | }, 43 | "description": "Nastavte jazyk pre interakcie s Asistentom Google a \u010di chcete povoli\u0165 agenta konverz\u00e1cie." 44 | } 45 | } 46 | }, 47 | "services": { 48 | "send_text_command": { 49 | "description": "Odo\u0161le pr\u00edkaz ako textov\u00fa po\u017eiadavku asistentovi Google.", 50 | "fields": { 51 | "command": { 52 | "description": "Pr\u00edkaz(y) na odoslanie Asistentovi Google.", 53 | "name": "Pr\u00edkaz" 54 | }, 55 | "media_player": { 56 | "description": "N\u00e1zov(-y) subjektov prehr\u00e1va\u010da m\u00e9di\u00ed, na ktor\u00fdch sa m\u00e1 prehra\u0165 odpove\u010f.", 57 | "name": "Entita prehr\u00e1va\u010da m\u00e9di\u00ed" 58 | } 59 | }, 60 | "name": "Odosla\u0165 textov\u00fd pr\u00edkaz" 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/sv.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Konto har redan konfigurerats", 5 | "already_in_progress": "Konfigurationsfl\u00f6det p\u00e5g\u00e5r redan", 6 | "cannot_connect": "Det gick inte att ansluta.", 7 | "invalid_access_token": "Ogiltig \u00e5tkomstnyckel", 8 | "missing_configuration": "Komponenten har inte konfigurerats. F\u00f6lj dokumentationen.", 9 | "oauth_error": "Mottog ogiltiga tokendata.", 10 | "oauth_failed": "Fel vid h\u00e4mtning av \u00e5tkomsttoken.", 11 | "oauth_timeout": "Timeout vid h\u00e4mtning av OAuth-token.", 12 | "oauth_unauthorized": "OAuth-auktoriseringsfel vid h\u00e4mtning av \u00e5tkomsttoken.", 13 | "reauth_successful": "\u00c5terautentisering lyckades", 14 | "timeout_connect": "Timeout vid uppr\u00e4ttande av anslutning", 15 | "unknown": "Ov\u00e4ntat fel" 16 | }, 17 | "create_entry": { 18 | "default": "Autentisering lyckades" 19 | }, 20 | "step": { 21 | "auth": { 22 | "title": "L\u00e4nka Google-konto" 23 | }, 24 | "pick_implementation": { 25 | "title": "V\u00e4lj autentiseringsmetod" 26 | }, 27 | "reauth_confirm": { 28 | "description": "Google Assistant SDK-integrationen m\u00e5ste autentisera ditt konto igen", 29 | "title": "Autentiseringen har upph\u00f6rt att g\u00e4lla f\u00f6r {name}" 30 | } 31 | } 32 | }, 33 | "options": { 34 | "step": { 35 | "init": { 36 | "data": { 37 | "enable_conversation_agent": "Aktivera konversationsagenten", 38 | "language_code": "Kod f\u00f6r spr\u00e5k" 39 | }, 40 | "description": "Ange spr\u00e5k f\u00f6r interaktion med Google Assistant och om du vill aktivera konversationsagenten." 41 | } 42 | } 43 | }, 44 | "services": { 45 | "send_text_command": { 46 | "description": "Skickar ett kommando som en textfr\u00e5ga till Google Assistant.", 47 | "fields": { 48 | "command": { 49 | "description": "Kommando(n) att skicka till Google Assistant.", 50 | "name": "Kommando" 51 | }, 52 | "media_player": { 53 | "description": "Namn p\u00e5 mediaspelare-entiteter som svaret ska spelas upp p\u00e5.", 54 | "name": "Mediaspelarentitet" 55 | } 56 | }, 57 | "name": "Skicka textkommando" 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "Hesap zaten yap\u0131land\u0131r\u0131lm\u0131\u015f", 5 | "already_in_progress": "Yap\u0131land\u0131rma ak\u0131\u015f\u0131 zaten devam ediyor", 6 | "cannot_connect": "Ba\u011flanma hatas\u0131", 7 | "invalid_access_token": "Ge\u00e7ersiz eri\u015fim anahtar\u0131", 8 | "missing_configuration": "Bile\u015fen yap\u0131land\u0131r\u0131lmam\u0131\u015f. L\u00fctfen belgeleri takip edin.", 9 | "oauth_error": "Ge\u00e7ersiz anahtar verileri al\u0131nd\u0131.", 10 | "oauth_failed": "Eri\u015fim anahtar\u0131 al\u0131n\u0131rken hata olu\u015ftu.", 11 | "oauth_timeout": "OAuth anahtar\u0131n\u0131 \u00e7\u00f6zme zaman a\u015f\u0131m\u0131.", 12 | "oauth_unauthorized": "Eri\u015fim anahtar\u0131 al\u0131n\u0131rken OAuth yetkilendirme hatas\u0131.", 13 | "reauth_successful": "Yeniden kimlik do\u011frulama ba\u015far\u0131l\u0131 oldu", 14 | "timeout_connect": "Ba\u011flant\u0131 kurulurken zaman a\u015f\u0131m\u0131", 15 | "unknown": "Beklenmeyen hata" 16 | }, 17 | "create_entry": { 18 | "default": "Ba\u015far\u0131yla do\u011fruland\u0131" 19 | }, 20 | "step": { 21 | "auth": { 22 | "title": "Google Hesab\u0131n\u0131 Ba\u011fla" 23 | }, 24 | "pick_implementation": { 25 | "title": "Kimlik do\u011frulama y\u00f6ntemini se\u00e7" 26 | }, 27 | "reauth_confirm": { 28 | "description": "Google Asistan SDK entegrasyonunun hesab\u0131n\u0131z\u0131 yeniden do\u011frulamas\u0131 gerekiyor", 29 | "title": "{name} i\u00e7in kimlik do\u011frulaman\u0131n s\u00fcresi doldu" 30 | } 31 | } 32 | }, 33 | "options": { 34 | "step": { 35 | "init": { 36 | "data": { 37 | "enable_conversation_agent": "Konu\u015fma arac\u0131s\u0131n\u0131 etkinle\u015ftir", 38 | "language_code": "Dil kodu" 39 | }, 40 | "description": "Google Asistan ile etkile\u015fimler i\u00e7in dili ve konu\u015fma arac\u0131s\u0131n\u0131 etkinle\u015ftirmek isteyip istemedi\u011finizi ayarlay\u0131n." 41 | } 42 | } 43 | }, 44 | "services": { 45 | "send_text_command": { 46 | "description": "Bir komutu Google Asistan'a metin sorgusu olarak g\u00f6nderir.", 47 | "fields": { 48 | "command": { 49 | "description": "Google Asistan'a g\u00f6nderilecek komut(lar).", 50 | "name": "Komut" 51 | }, 52 | "media_player": { 53 | "description": "Yan\u0131t\u0131n oynat\u0131laca\u011f\u0131 medya oynat\u0131c\u0131 varl\u0131klar\u0131n\u0131n ad(lar)\u0131.", 54 | "name": "Medya oynat\u0131c\u0131 varl\u0131\u011f\u0131" 55 | } 56 | }, 57 | "name": "Metin komutu g\u00f6nder" 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/uk.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "already_configured": "\u041e\u0431\u043b\u0456\u043a\u043e\u0432\u0438\u0439 \u0437\u0430\u043f\u0438\u0441 \u0443\u0436\u0435 \u043d\u0430\u043b\u0430\u0448\u0442\u043e\u0432\u0430\u043d\u043e", 5 | "already_in_progress": "\u041f\u0440\u043e\u0446\u0435\u0441 \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0432\u0436\u0435 \u0442\u0440\u0438\u0432\u0430\u0454.", 6 | "cannot_connect": "\u041d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044f \u043f\u0456\u0434'\u0454\u0434\u043d\u0430\u0442\u0438\u0441\u044f", 7 | "invalid_access_token": "\u041d\u0435\u0432\u0456\u0440\u043d\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0443.", 8 | "missing_configuration": "\u041d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0438 \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f. \u0411\u0443\u0434\u044c \u043b\u0430\u0441\u043a\u0430, \u043e\u0437\u043d\u0430\u0439\u043e\u043c\u0442\u0435\u0441\u044f \u0437 \u0456\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0456\u044f\u043c\u0438.", 9 | "oauth_error": "\u041e\u0442\u0440\u0438\u043c\u0430\u043d\u043e \u043d\u0435\u0432\u0456\u0440\u043d\u0456 \u0434\u0430\u043d\u0456 \u0442\u043e\u043a\u0435\u043d\u0430.", 10 | "reauth_successful": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430 \u0430\u0432\u0442\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0430\u0446\u0456\u044f \u043f\u0440\u043e\u0439\u0448\u043b\u0430 \u0443\u0441\u043f\u0456\u0448\u043d\u043e", 11 | "timeout_connect": "\u0422\u0430\u0439\u043c-\u0430\u0443\u0442 \u0432\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044f \u0437\u2019\u0454\u0434\u043d\u0430\u043d\u043d\u044f", 12 | "unknown": "\u041d\u0435\u043e\u0447\u0456\u043a\u0443\u0432\u0430\u043d\u0430 \u043f\u043e\u043c\u0438\u043b\u043a\u0430" 13 | }, 14 | "create_entry": { 15 | "default": "\u0410\u0432\u0442\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0430\u0446\u0456\u044e \u0443\u0441\u043f\u0456\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e." 16 | }, 17 | "step": { 18 | "auth": { 19 | "title": "\u041f\u043e\u0432\u2019\u044f\u0437\u0430\u0442\u0438 \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u0438\u0439 \u0437\u0430\u043f\u0438\u0441 Google" 20 | }, 21 | "pick_implementation": { 22 | "title": "\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044c \u0441\u043f\u043e\u0441\u0456\u0431 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0430\u0446\u0456\u0457" 23 | }, 24 | "reauth_confirm": { 25 | "description": "\u0414\u043b\u044f \u0456\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0456\u0457 Google Assistant SDK \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0430\u0432\u0442\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0443\u0432\u0430\u0442\u0438 \u0432\u0430\u0448 \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u0438\u0439 \u0437\u0430\u043f\u0438\u0441", 26 | "title": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0443\u0432\u0430\u0442\u0438 \u0456\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0456\u044e" 27 | } 28 | } 29 | }, 30 | "options": { 31 | "step": { 32 | "init": { 33 | "data": { 34 | "enable_conversation_agent": "\u0423\u0432\u0456\u043c\u043a\u043d\u0456\u0442\u044c \u0430\u0433\u0435\u043d\u0442 \u0440\u043e\u0437\u043c\u043e\u0432\u0438", 35 | "language_code": "\u041a\u043e\u0434 \u043c\u043e\u0432\u0438" 36 | }, 37 | "description": "\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044c \u043c\u043e\u0432\u0443 \u0434\u043b\u044f \u0432\u0437\u0430\u0454\u043c\u043e\u0434\u0456\u0457 \u0437 Google Assistant \u0456 \u0447\u0438 \u0445\u043e\u0447\u0435\u0442\u0435 \u0432\u0438 \u0432\u0432\u0456\u043c\u043a\u043d\u0443\u0442\u0438 \u0430\u0433\u0435\u043d\u0442 \u0440\u043e\u0437\u043c\u043e\u0432\u0438." 38 | } 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/vi.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "abort": { 4 | "unknown": "L\u1ed7i kh\u00f4ng mong \u0111\u1ee3i" 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/zh-Hans.json: -------------------------------------------------------------------------------- 1 | { 2 | "application_credentials": { 3 | "description": "\u6309\u7167\u3010OAuth \u540c\u610f\u5c4f\u5e55\u3011({oauth_consent_url}) \u4e2d\u7684\u3010\u6307\u5bfc\u3011({more_info_url}) \uff0c\u6388\u4e88 Home Assistant \u8bbf\u95ee\u60a8 Google Assistant SDK \u7684\u6743\u9650\u3002\u60a8\u8fd8\u9700\u8981\u521b\u5efa\u94fe\u63a5\u5230\u60a8\u8d26\u6237\u7684\u5e94\u7528\u7a0b\u5e8f\u51ed\u636e\uff1a\n 1. \u8f6c\u5230\u3010\u51ed\u636e\u3011({oauth_creds_url}) \u5e76\u9009\u62e9**\u521b\u5efa\u51ed\u636e** \u3002\n 1. \u5728\u4e0b\u62c9\u5217\u8868\u4e2d\u9009\u62e9 **OAuth \u5ba2\u6237\u7aef ID** \u3002\n 1. \u9009\u62e9 **Web \u5e94\u7528\u7a0b\u5e8f**\u4f5c\u4e3a\u5e94\u7528\u7a0b\u5e8f\u7c7b\u578b\u3002\n\n" 4 | }, 5 | "config": { 6 | "abort": { 7 | "already_configured": "\u8d26\u6237\u5df2\u914d\u7f6e", 8 | "already_in_progress": "\u914d\u7f6e\u6d41\u7a0b\u5df2\u5728\u8fdb\u884c\u4e2d", 9 | "cannot_connect": "\u8fde\u63a5\u5931\u8d25", 10 | "invalid_access_token": "\u8bbf\u95ee\u4ee4\u724c\u65e0\u6548", 11 | "missing_configuration": "\u6b64\u7ec4\u4ef6\u5c1a\u672a\u914d\u7f6e\u3002\u8bf7\u53c2\u9605\u6587\u6863\u3002", 12 | "oauth_error": "\u6536\u5230\u65e0\u6548\u7684\u4ee4\u724c\u6570\u636e\u3002", 13 | "oauth_failed": "\u83b7\u53d6\u8bbf\u95ee\u4ee4\u724c\u65f6\u51fa\u9519\u3002", 14 | "oauth_timeout": "\u89e3\u6790 OAuth \u4ee4\u724c\u8d85\u65f6\u3002", 15 | "oauth_unauthorized": "\u83b7\u53d6\u8bbf\u95ee\u4ee4\u724c\u65f6\u51fa\u73b0 OAuth \u6388\u6743\u9519\u8bef\u3002", 16 | "reauth_successful": "\u91cd\u65b0\u8ba4\u8bc1\u6210\u529f", 17 | "timeout_connect": "\u5efa\u7acb\u8fde\u63a5\u8d85\u65f6", 18 | "unknown": "\u610f\u5916\u9519\u8bef" 19 | }, 20 | "create_entry": { 21 | "default": "\u8ba4\u8bc1\u6210\u529f" 22 | }, 23 | "step": { 24 | "auth": { 25 | "title": "\u5173\u8054 Google \u8d26\u6237" 26 | }, 27 | "pick_implementation": { 28 | "title": "\u9009\u62e9\u8eab\u4efd\u9a8c\u8bc1\u65b9\u6cd5" 29 | }, 30 | "reauth_confirm": { 31 | "description": "Google Assistant SDK \u96c6\u6210\u9700\u8981\u91cd\u65b0\u9a8c\u8bc1\u60a8\u7684\u8d26\u6237", 32 | "title": "\u201d{name}\u201c\u7684\u8eab\u4efd\u9a8c\u8bc1\u5df2\u8fc7\u671f" 33 | } 34 | } 35 | }, 36 | "options": { 37 | "step": { 38 | "init": { 39 | "data": { 40 | "enable_conversation_agent": "\u542f\u7528\u5bf9\u8bdd\u4ee3\u7406", 41 | "language_code": "\u8bed\u8a00\u4ee3\u7801" 42 | }, 43 | "description": "\u8bbe\u7f6e\u4e0e Google Assistant \u4ea4\u4e92\u7684\u8bed\u8a00\u4ee5\u53ca\u662f\u5426\u8981\u542f\u7528\u5bf9\u8bdd\u4ee3\u7406\u3002" 44 | } 45 | } 46 | }, 47 | "services": { 48 | "send_text_command": { 49 | "description": "\u5c06\u547d\u4ee4\u4f5c\u4e3a\u6587\u672c\u67e5\u8be2\u53d1\u9001\u5230 Google Assistant\u3002", 50 | "fields": { 51 | "command": { 52 | "description": "\u53d1\u9001\u5230 Google Assistant \u7684\u547d\u4ee4\u3002", 53 | "name": "\u547d\u4ee4" 54 | }, 55 | "media_player": { 56 | "description": "\u7528\u4e8e\u64ad\u653e\u54cd\u5e94\u7684\u5a92\u4f53\u64ad\u653e\u5668\u5b9e\u4f53\u7684\u540d\u79f0\u3002", 57 | "name": "\u5a92\u4f53\u64ad\u653e\u5668\u5b9e\u4f53" 58 | } 59 | }, 60 | "name": "\u53d1\u9001\u6587\u672c\u547d\u4ee4" 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /custom_components/google_assistant_sdk_custom/translations/zh-Hant.json: -------------------------------------------------------------------------------- 1 | { 2 | "application_credentials": { 3 | "description": "\u8ddf\u96a8[\u8aaa\u660e]({more_info_url})\u4ee5\u8a2d\u5b9a\u81f3 [OAuth \u540c\u610f\u756b\u9762]({oauth_consent_url})\u3001\u4f9b Home Assistant \u5b58\u53d6\u60a8\u7684 Google Assistant SDK\u3002\u540c\u6642\u9700\u8981\u65b0\u589e\u9023\u7d50\u81f3\u5e33\u865f\u7684\u61c9\u7528\u7a0b\u5f0f\u6191\u8b49\uff1a\n1. \u700f\u89bd\u81f3 [\u6191\u8b49]({oauth_creds_url}) \u9801\u9762\u4e26\u9078\u64c7 **\u5efa\u7acb\u6191\u8b49**\u3002\n1. \u7531\u4e0b\u62c9\u9078\u55ae\u4e2d\u9078\u64c7 **OAuth \u7528\u6236\u7aef ID**\u3002\n1. \u61c9\u7528\u7a0b\u5f0f\u985e\u578b\u5247\u9078\u64c7 **Web \u61c9\u7528\u7a0b\u5f0f**\u3002" 4 | }, 5 | "config": { 6 | "abort": { 7 | "already_configured": "\u5e33\u865f\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", 8 | "already_in_progress": "\u8a2d\u5b9a\u5df2\u7d93\u9032\u884c\u4e2d", 9 | "cannot_connect": "\u9023\u7dda\u5931\u6557", 10 | "invalid_access_token": "\u5b58\u53d6\u6b0a\u6756\u7121\u6548", 11 | "missing_configuration": "\u5143\u4ef6\u5c1a\u672a\u8a2d\u7f6e\uff0c\u8acb\u53c3\u95b1\u6587\u4ef6\u8aaa\u660e\u3002", 12 | "oauth_error": "\u6536\u5230\u7121\u6548\u7684\u6b0a\u6756\u8cc7\u6599\u3002", 13 | "oauth_failed": "\u53d6\u5f97\u5b58\u53d6\u6b0a\u6756\u6642\u51fa\u73fe\u932f\u8aa4\u3002", 14 | "oauth_timeout": "\u89e3\u6790 OAuth \u6b0a\u6756\u903e\u6642\u3002", 15 | "oauth_unauthorized": "\u53d6\u5f97\u5b58\u53d6\u6b0a\u6756\u6642 OAuth \u6388\u6b0a\u932f\u8aa4\u3002", 16 | "reauth_successful": "\u91cd\u65b0\u8a8d\u8b49\u6210\u529f", 17 | "timeout_connect": "\u5efa\u7acb\u9023\u7dda\u903e\u6642", 18 | "unknown": "\u672a\u9810\u671f\u932f\u8aa4" 19 | }, 20 | "create_entry": { 21 | "default": "\u5df2\u6210\u529f\u8a8d\u8b49" 22 | }, 23 | "step": { 24 | "auth": { 25 | "title": "\u9023\u7d50 Google \u5e33\u865f" 26 | }, 27 | "pick_implementation": { 28 | "title": "\u9078\u64c7\u9a57\u8b49\u6a21\u5f0f" 29 | }, 30 | "reauth_confirm": { 31 | "description": "Google Assistant SDK \u6574\u5408\u9700\u8981\u91cd\u65b0\u8a8d\u8b49\u60a8\u7684\u5e33\u865f", 32 | "title": "{name} \u8a8d\u8b49\u5df2\u904e\u671f" 33 | } 34 | } 35 | }, 36 | "options": { 37 | "step": { 38 | "init": { 39 | "data": { 40 | "enable_conversation_agent": "\u555f\u7528\u5c0d\u8a71\u52a9\u7406", 41 | "language_code": "\u8a9e\u8a00\u4ee3\u78bc" 42 | }, 43 | "description": "\u8a2d\u5b9a\u8207 Google Assistant \u4e92\u52d5\u8a9e\u8a00\u4ee5\u53ca\u662f\u5426\u8981\u555f\u7528\u5c0d\u8a71\u52a9\u7406\u3002" 44 | } 45 | } 46 | }, 47 | "services": { 48 | "send_text_command": { 49 | "description": "\u5c07\u547d\u4ee4\u4ee5\u6587\u5b57\u67e5\u8a62\u50b3\u9001\u81f3 Google Assistant\u3002", 50 | "fields": { 51 | "command": { 52 | "description": "\u50b3\u9001\u81f3 Google Assistant \u7684\u547d\u4ee4\u3002", 53 | "name": "\u547d\u4ee4" 54 | }, 55 | "media_player": { 56 | "description": "\u64ad\u653e\u56de\u61c9\u7684\u5a92\u9ad4\u64ad\u653e\u5668\u5be6\u9ad4\u540d\u7a31\u3002", 57 | "name": "\u5a92\u9ad4\u64ad\u653e\u5668\u5be6\u9ad4" 58 | } 59 | }, 60 | "name": "\u50b3\u9001\u6587\u5b57\u547d\u4ee4" 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /hacs.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Google Assistant SDK Custom", 3 | "homeassistant": "2024.5.0", 4 | "render_readme": true, 5 | "zip_release": true, 6 | "filename": "google_assistant_sdk_custom.zip" 7 | } 8 | --------------------------------------------------------------------------------