mirror of
https://github.com/XiaoMi/ha_xiaomi_home.git
synced 2026-01-17 07:10:44 +08:00
feat: translate using the i18n module
This commit is contained in:
parent
86e0276108
commit
820d5e1e1b
@ -91,7 +91,8 @@ from .miot.miot_cloud import MIoTHttpClient, MIoTOauthClient
|
|||||||
from .miot.miot_storage import MIoTStorage, MIoTCert
|
from .miot.miot_storage import MIoTStorage, MIoTCert
|
||||||
from .miot.miot_mdns import MipsService
|
from .miot.miot_mdns import MipsService
|
||||||
from .miot.web_pages import oauth_redirect_page
|
from .miot.web_pages import oauth_redirect_page
|
||||||
from .miot.miot_error import MIoTConfigError, MIoTError, MIoTOauthError
|
from .miot.miot_error import (
|
||||||
|
MIoTConfigError, MIoTError, MIoTErrorCode, MIoTOauthError)
|
||||||
from .miot.miot_i18n import MIoTI18n
|
from .miot.miot_i18n import MIoTI18n
|
||||||
from .miot.miot_network import MIoTNetwork
|
from .miot.miot_network import MIoTNetwork
|
||||||
from .miot.miot_client import MIoTClient, get_miot_instance_async
|
from .miot.miot_client import MIoTClient, get_miot_instance_async
|
||||||
@ -430,6 +431,8 @@ class XiaomiMihomeConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
redirect_url=self._oauth_redirect_url_full)
|
redirect_url=self._oauth_redirect_url_full)
|
||||||
self.hass.data[DOMAIN][self._virtual_did]['oauth_state'] = (
|
self.hass.data[DOMAIN][self._virtual_did]['oauth_state'] = (
|
||||||
miot_oauth.state)
|
miot_oauth.state)
|
||||||
|
self.hass.data[DOMAIN][self._virtual_did]['i18n'] = (
|
||||||
|
self._miot_i18n)
|
||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
'async_step_oauth, oauth_url: %s', self._cc_oauth_auth_url)
|
'async_step_oauth, oauth_url: %s', self._cc_oauth_auth_url)
|
||||||
webhook_async_unregister(
|
webhook_async_unregister(
|
||||||
@ -1152,6 +1155,8 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
|
|||||||
redirect_url=self._oauth_redirect_url_full)
|
redirect_url=self._oauth_redirect_url_full)
|
||||||
self.hass.data[DOMAIN][self._virtual_did]['oauth_state'] = (
|
self.hass.data[DOMAIN][self._virtual_did]['oauth_state'] = (
|
||||||
self._miot_oauth.state)
|
self._miot_oauth.state)
|
||||||
|
self.hass.data[DOMAIN][self._virtual_did]['i18n'] = (
|
||||||
|
self._miot_i18n)
|
||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
'async_step_oauth, oauth_url: %s', self._cc_oauth_auth_url)
|
'async_step_oauth, oauth_url: %s', self._cc_oauth_auth_url)
|
||||||
webhook_async_unregister(
|
webhook_async_unregister(
|
||||||
@ -1967,29 +1972,61 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
|
|||||||
async def _handle_oauth_webhook(hass, webhook_id, request):
|
async def _handle_oauth_webhook(hass, webhook_id, request):
|
||||||
"""Webhook to handle oauth2 callback."""
|
"""Webhook to handle oauth2 callback."""
|
||||||
# pylint: disable=inconsistent-quotes
|
# pylint: disable=inconsistent-quotes
|
||||||
|
i18n: MIoTI18n = hass.data[DOMAIN][webhook_id].get('i18n', None)
|
||||||
try:
|
try:
|
||||||
data = dict(request.query)
|
data = dict(request.query)
|
||||||
if data.get('code', None) is None or data.get('state', None) is None:
|
if data.get('code', None) is None or data.get('state', None) is None:
|
||||||
raise MIoTConfigError('invalid oauth code')
|
raise MIoTConfigError(
|
||||||
|
'invalid oauth code or state',
|
||||||
|
MIoTErrorCode.CODE_CONFIG_INVALID_INPUT)
|
||||||
|
|
||||||
if data['state'] != hass.data[DOMAIN][webhook_id]['oauth_state']:
|
if data['state'] != hass.data[DOMAIN][webhook_id]['oauth_state']:
|
||||||
raise MIoTConfigError(
|
raise MIoTConfigError(
|
||||||
f'invalid oauth state, '
|
f'inconsistent state, '
|
||||||
f'{hass.data[DOMAIN][webhook_id]["oauth_state"]}, '
|
f'{hass.data[DOMAIN][webhook_id]["oauth_state"]}!='
|
||||||
f'{data["state"]}')
|
f'{data["state"]}', MIoTErrorCode.CODE_CONFIG_INVALID_STATE)
|
||||||
|
|
||||||
fut_oauth_code: asyncio.Future = hass.data[DOMAIN][webhook_id].pop(
|
fut_oauth_code: asyncio.Future = hass.data[DOMAIN][webhook_id].pop(
|
||||||
'fut_oauth_code', None)
|
'fut_oauth_code', None)
|
||||||
fut_oauth_code.set_result(data['code'])
|
fut_oauth_code.set_result(data['code'])
|
||||||
_LOGGER.info('webhook code: %s', data['code'])
|
_LOGGER.info('webhook code: %s', data['code'])
|
||||||
|
|
||||||
|
success_trans: dict = {}
|
||||||
|
if i18n:
|
||||||
|
success_trans = i18n.translate(
|
||||||
|
'oauth2.success') or {} # type: ignore
|
||||||
|
# Delete
|
||||||
|
del hass.data[DOMAIN][webhook_id]['oauth_state']
|
||||||
|
del hass.data[DOMAIN][webhook_id]['i18n']
|
||||||
return web.Response(
|
return web.Response(
|
||||||
body=await oauth_redirect_page(
|
body=await oauth_redirect_page(
|
||||||
hass.config.language, 'success'), content_type='text/html')
|
title=success_trans.get('title', 'Success'),
|
||||||
|
content=success_trans.get(
|
||||||
|
'content', (
|
||||||
|
'Please close this page and return to the account '
|
||||||
|
'authentication page to click NEXT')),
|
||||||
|
button=success_trans.get('button', 'Close Page'),
|
||||||
|
success=True,
|
||||||
|
), content_type='text/html')
|
||||||
|
|
||||||
except MIoTConfigError:
|
except Exception as err: # pylint: disable=broad-exception-caught
|
||||||
|
fail_trans: dict = {}
|
||||||
|
err_msg: str = str(err)
|
||||||
|
if i18n:
|
||||||
|
if isinstance(err, MIoTConfigError):
|
||||||
|
err_msg = i18n.translate(
|
||||||
|
f'oauth2.error_msg.{err.code.value}'
|
||||||
|
) or err.message # type: ignore
|
||||||
|
fail_trans = i18n.translate('oauth2.fail') or {} # type: ignore
|
||||||
return web.Response(
|
return web.Response(
|
||||||
body=await oauth_redirect_page(hass.config.language, 'fail'),
|
body=await oauth_redirect_page(
|
||||||
|
title=fail_trans.get('title', 'Authentication Failed'),
|
||||||
|
content=str(fail_trans.get('content', (
|
||||||
|
'{error_msg}, Please close this page and return to the '
|
||||||
|
'account authentication page to click the authentication '
|
||||||
|
'link again.'))).replace('{error_msg}', err_msg),
|
||||||
|
button=fail_trans.get('button', 'Close Page'),
|
||||||
|
success=False),
|
||||||
content_type='text/html')
|
content_type='text/html')
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -64,6 +64,22 @@
|
|||||||
"net_unavailable": "Schnittstelle nicht verfügbar"
|
"net_unavailable": "Schnittstelle nicht verfügbar"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"oauth2": {
|
||||||
|
"success": {
|
||||||
|
"title": "Authentifizierung erfolgreich",
|
||||||
|
"content": "Bitte schließen Sie diese Seite und kehren Sie zur Kontoauthentifizierungsseite zurück, um auf „Weiter“ zu klicken.",
|
||||||
|
"button": "Schließen"
|
||||||
|
},
|
||||||
|
"fail": {
|
||||||
|
"title": "Authentifizierung fehlgeschlagen",
|
||||||
|
"content": "{error_msg}, bitte schließen Sie diese Seite und kehren Sie zur Kontoauthentifizierungsseite zurück, um den Authentifizierungslink erneut zu klicken.",
|
||||||
|
"button": "Schließen"
|
||||||
|
},
|
||||||
|
"error_msg": {
|
||||||
|
"-10100": "Ungültige Antwortparameter ('code' oder 'state' Feld ist leer)",
|
||||||
|
"-10101": "Übergebenes 'state' Feld stimmt nicht überein"
|
||||||
|
}
|
||||||
|
},
|
||||||
"miot": {
|
"miot": {
|
||||||
"client": {
|
"client": {
|
||||||
"invalid_oauth_info": "Ungültige Authentifizierungsinformationen, Cloud-Verbindung nicht verfügbar, bitte betreten Sie die Xiaomi Home-Integrationsseite und klicken Sie auf 'Optionen', um die Authentifizierung erneut durchzuführen",
|
"invalid_oauth_info": "Ungültige Authentifizierungsinformationen, Cloud-Verbindung nicht verfügbar, bitte betreten Sie die Xiaomi Home-Integrationsseite und klicken Sie auf 'Optionen', um die Authentifizierung erneut durchzuführen",
|
||||||
|
|||||||
@ -64,6 +64,22 @@
|
|||||||
"net_unavailable": "Interface unavailable"
|
"net_unavailable": "Interface unavailable"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"oauth2": {
|
||||||
|
"success": {
|
||||||
|
"title": "Authentication Successful",
|
||||||
|
"content": "Please close this page and return to the account authentication page to click 'Next'.",
|
||||||
|
"button": "Close"
|
||||||
|
},
|
||||||
|
"fail": {
|
||||||
|
"title": "Authentication Failed",
|
||||||
|
"content": "{error_msg}, please close this page and return to the account authentication page to click the authentication link again.",
|
||||||
|
"button": "Close"
|
||||||
|
},
|
||||||
|
"error_msg": {
|
||||||
|
"-10100": "Invalid response parameters ('code' or 'state' field is empty)",
|
||||||
|
"-10101": "Passed-in 'state' field mismatch"
|
||||||
|
}
|
||||||
|
},
|
||||||
"miot": {
|
"miot": {
|
||||||
"client": {
|
"client": {
|
||||||
"invalid_oauth_info": "Authentication information is invalid, cloud link will be unavailable, please enter the Xiaomi Home integration page, click 'Options' to re-authenticate",
|
"invalid_oauth_info": "Authentication information is invalid, cloud link will be unavailable, please enter the Xiaomi Home integration page, click 'Options' to re-authenticate",
|
||||||
|
|||||||
@ -64,6 +64,22 @@
|
|||||||
"net_unavailable": "Interfaz no disponible"
|
"net_unavailable": "Interfaz no disponible"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"oauth2": {
|
||||||
|
"success": {
|
||||||
|
"title": "Autenticación exitosa",
|
||||||
|
"content": "Por favor, cierre esta página y regrese a la página de autenticación de la cuenta para hacer clic en 'Siguiente'.",
|
||||||
|
"button": "Cerrar"
|
||||||
|
},
|
||||||
|
"fail": {
|
||||||
|
"title": "Autenticación fallida",
|
||||||
|
"content": "{error_msg}, por favor, cierre esta página y regrese a la página de autenticación de la cuenta para hacer clic en el enlace de autenticación nuevamente.",
|
||||||
|
"button": "Cerrar"
|
||||||
|
},
|
||||||
|
"error_msg": {
|
||||||
|
"-10100": "Parámetros de respuesta inválidos ('code' o 'state' está vacío)",
|
||||||
|
"-10101": "El campo 'state' proporcionado no coincide"
|
||||||
|
}
|
||||||
|
},
|
||||||
"miot": {
|
"miot": {
|
||||||
"client": {
|
"client": {
|
||||||
"invalid_oauth_info": "La información de autenticación es inválida, la conexión en la nube no estará disponible, por favor, vaya a la página de integración de Xiaomi Home, haga clic en 'Opciones' para volver a autenticar",
|
"invalid_oauth_info": "La información de autenticación es inválida, la conexión en la nube no estará disponible, por favor, vaya a la página de integración de Xiaomi Home, haga clic en 'Opciones' para volver a autenticar",
|
||||||
|
|||||||
@ -64,6 +64,22 @@
|
|||||||
"net_unavailable": "Interface non disponible"
|
"net_unavailable": "Interface non disponible"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"oauth2": {
|
||||||
|
"success": {
|
||||||
|
"title": "Authentification réussie",
|
||||||
|
"content": "Veuillez fermer cette page et revenir à la page d'authentification du compte pour cliquer sur 'Suivant'.",
|
||||||
|
"button": "Fermer"
|
||||||
|
},
|
||||||
|
"fail": {
|
||||||
|
"title": "Échec de l'authentification",
|
||||||
|
"content": "{error_msg}, veuillez fermer cette page et revenir à la page d'authentification du compte pour cliquer à nouveau sur le lien d'authentification.",
|
||||||
|
"button": "Fermer"
|
||||||
|
},
|
||||||
|
"error_msg": {
|
||||||
|
"-10100": "Paramètres de réponse invalides ('code' ou 'state' est vide)",
|
||||||
|
"-10101": "Le champ 'state' transmis ne correspond pas"
|
||||||
|
}
|
||||||
|
},
|
||||||
"miot": {
|
"miot": {
|
||||||
"client": {
|
"client": {
|
||||||
"invalid_oauth_info": "Informations d'authentification non valides, le lien cloud ne sera pas disponible, veuillez accéder à la page d'intégration Xiaomi Home, cliquez sur \"Options\" pour vous réauthentifier",
|
"invalid_oauth_info": "Informations d'authentification non valides, le lien cloud ne sera pas disponible, veuillez accéder à la page d'intégration Xiaomi Home, cliquez sur \"Options\" pour vous réauthentifier",
|
||||||
|
|||||||
@ -64,6 +64,22 @@
|
|||||||
"net_unavailable": "インターフェースが利用できません"
|
"net_unavailable": "インターフェースが利用できません"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"oauth2": {
|
||||||
|
"success": {
|
||||||
|
"title": "認証成功",
|
||||||
|
"content": "このページを閉じて、アカウント認証ページに戻り、「次へ」をクリックしてください。",
|
||||||
|
"button": "閉じる"
|
||||||
|
},
|
||||||
|
"fail": {
|
||||||
|
"title": "認証失敗",
|
||||||
|
"content": "{error_msg}、このページを閉じて、アカウント認証ページに戻り、再度認証リンクをクリックしてください。",
|
||||||
|
"button": "閉じる"
|
||||||
|
},
|
||||||
|
"error_msg": {
|
||||||
|
"-10100": "無効な応答パラメータ('code'または'state'フィールドが空です)",
|
||||||
|
"-10101": "渡された'state'フィールドが一致しません"
|
||||||
|
}
|
||||||
|
},
|
||||||
"miot": {
|
"miot": {
|
||||||
"client": {
|
"client": {
|
||||||
"invalid_oauth_info": "認証情報が無効です。クラウドリンクは利用できません。Xiaomi Home統合ページに入り、[オプション]をクリックして再認証してください",
|
"invalid_oauth_info": "認証情報が無効です。クラウドリンクは利用できません。Xiaomi Home統合ページに入り、[オプション]をクリックして再認証してください",
|
||||||
|
|||||||
@ -64,6 +64,22 @@
|
|||||||
"net_unavailable": "Interface niet beschikbaar"
|
"net_unavailable": "Interface niet beschikbaar"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"oauth2": {
|
||||||
|
"success": {
|
||||||
|
"title": "Authenticatie geslaagd",
|
||||||
|
"content": "Sluit deze pagina en ga terug naar de accountauthenticatiepagina om op 'Volgende' te klikken.",
|
||||||
|
"button": "Sluiten"
|
||||||
|
},
|
||||||
|
"fail": {
|
||||||
|
"title": "Authenticatie mislukt",
|
||||||
|
"content": "{error_msg}, sluit deze pagina en ga terug naar de accountauthenticatiepagina om opnieuw op de authenticatielink te klikken.",
|
||||||
|
"button": "Sluiten"
|
||||||
|
},
|
||||||
|
"error_msg": {
|
||||||
|
"-10100": "Ongeldige antwoordparameters ('code' of 'state' veld is leeg)",
|
||||||
|
"-10101": "Doorgegeven 'state' veld komt niet overeen"
|
||||||
|
}
|
||||||
|
},
|
||||||
"miot": {
|
"miot": {
|
||||||
"client": {
|
"client": {
|
||||||
"invalid_oauth_info": "Authenticatie-informatie is ongeldig, cloudverbinding zal niet beschikbaar zijn. Ga naar de Xiaomi Home-integratiepagina en klik op 'Opties' om opnieuw te verifiëren.",
|
"invalid_oauth_info": "Authenticatie-informatie is ongeldig, cloudverbinding zal niet beschikbaar zijn. Ga naar de Xiaomi Home-integratiepagina en klik op 'Opties' om opnieuw te verifiëren.",
|
||||||
|
|||||||
@ -64,6 +64,22 @@
|
|||||||
"net_unavailable": "Interface indisponível"
|
"net_unavailable": "Interface indisponível"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"oauth2": {
|
||||||
|
"success": {
|
||||||
|
"title": "Autenticação bem-sucedida",
|
||||||
|
"content": "Por favor, feche esta página e volte para a página de autenticação da conta para clicar em 'Próximo'.",
|
||||||
|
"button": "Fechar"
|
||||||
|
},
|
||||||
|
"fail": {
|
||||||
|
"title": "Falha na autenticação",
|
||||||
|
"content": "{error_msg}, por favor, feche esta página e volte para a página de autenticação da conta para clicar no link de autenticação novamente.",
|
||||||
|
"button": "Fechar"
|
||||||
|
},
|
||||||
|
"error_msg": {
|
||||||
|
"-10100": "Parâmetros de resposta inválidos ('code' ou 'state' está vazio)",
|
||||||
|
"-10101": "O campo 'state' fornecido não corresponde"
|
||||||
|
}
|
||||||
|
},
|
||||||
"miot": {
|
"miot": {
|
||||||
"client": {
|
"client": {
|
||||||
"invalid_oauth_info": "Informações de autenticação inválidas, a conexão com a nuvem estará indisponível. Vá para a página de integração do Xiaomi Home e clique em 'Opções' para reautenticar.",
|
"invalid_oauth_info": "Informações de autenticação inválidas, a conexão com a nuvem estará indisponível. Vá para a página de integração do Xiaomi Home e clique em 'Opções' para reautenticar.",
|
||||||
|
|||||||
@ -64,6 +64,22 @@
|
|||||||
"net_unavailable": "Interface indisponível"
|
"net_unavailable": "Interface indisponível"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"oauth2": {
|
||||||
|
"success": {
|
||||||
|
"title": "Autenticação bem-sucedida",
|
||||||
|
"content": "Por favor, feche esta página e volte para a página de autenticação da conta para clicar em 'Seguinte'.",
|
||||||
|
"button": "Fechar"
|
||||||
|
},
|
||||||
|
"fail": {
|
||||||
|
"title": "Falha na autenticação",
|
||||||
|
"content": "{error_msg}, por favor, feche esta página e volte para a página de autenticação da conta para clicar no link de autenticação novamente.",
|
||||||
|
"button": "Fechar"
|
||||||
|
},
|
||||||
|
"error_msg": {
|
||||||
|
"-10100": "Parâmetros de resposta inválidos ('code' ou 'state' está vazio)",
|
||||||
|
"-10101": "O campo 'state' fornecido não corresponde"
|
||||||
|
}
|
||||||
|
},
|
||||||
"miot": {
|
"miot": {
|
||||||
"client": {
|
"client": {
|
||||||
"invalid_oauth_info": "Informações de autenticação inválidas, a conexão na nuvem ficará indisponível. Por favor, acesse a página de integração do Xiaomi Home e clique em 'Opções' para autenticar novamente.",
|
"invalid_oauth_info": "Informações de autenticação inválidas, a conexão na nuvem ficará indisponível. Por favor, acesse a página de integração do Xiaomi Home e clique em 'Opções' para autenticar novamente.",
|
||||||
|
|||||||
@ -64,6 +64,22 @@
|
|||||||
"net_unavailable": "Интерфейс недоступен"
|
"net_unavailable": "Интерфейс недоступен"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"oauth2": {
|
||||||
|
"success": {
|
||||||
|
"title": "Аутентификация успешна",
|
||||||
|
"content": "Пожалуйста, закройте эту страницу и вернитесь на страницу аутентификации учетной записи, чтобы нажать 'Далее'.",
|
||||||
|
"button": "Закрыть"
|
||||||
|
},
|
||||||
|
"fail": {
|
||||||
|
"title": "Аутентификация не удалась",
|
||||||
|
"content": "{error_msg}, пожалуйста, закройте эту страницу и вернитесь на страницу аутентификации учетной записи, чтобы снова нажать на ссылку аутентификации.",
|
||||||
|
"button": "Закрыть"
|
||||||
|
},
|
||||||
|
"error_msg": {
|
||||||
|
"-10100": "Недействительные параметры ответа ('code' или 'state' поле пусто)",
|
||||||
|
"-10101": "Переданное поле 'state' не совпадает"
|
||||||
|
}
|
||||||
|
},
|
||||||
"miot": {
|
"miot": {
|
||||||
"client": {
|
"client": {
|
||||||
"invalid_oauth_info": "Информация об аутентификации недействительна, облако будет недоступно, пожалуйста, войдите на страницу интеграции Xiaomi Home, нажмите 'Опции' для повторной аутентификации",
|
"invalid_oauth_info": "Информация об аутентификации недействительна, облако будет недоступно, пожалуйста, войдите на страницу интеграции Xiaomi Home, нажмите 'Опции' для повторной аутентификации",
|
||||||
|
|||||||
@ -64,6 +64,22 @@
|
|||||||
"net_unavailable": "接口不可用"
|
"net_unavailable": "接口不可用"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"oauth2": {
|
||||||
|
"success": {
|
||||||
|
"title": "认证成功",
|
||||||
|
"content": "请关闭此页面,返回账号认证页面点击“下一步”",
|
||||||
|
"button": "关闭"
|
||||||
|
},
|
||||||
|
"fail": {
|
||||||
|
"title": "认证失败",
|
||||||
|
"content": "{error_msg},请关闭此页面,返回账号认证页面重新点击认链接进行认证。",
|
||||||
|
"button": "关闭"
|
||||||
|
},
|
||||||
|
"error_msg": {
|
||||||
|
"-10100": "无效的响应参数(“code”或者“state”字段为空)",
|
||||||
|
"-10101": "传入“state”字段不一致"
|
||||||
|
}
|
||||||
|
},
|
||||||
"miot": {
|
"miot": {
|
||||||
"client": {
|
"client": {
|
||||||
"invalid_oauth_info": "认证信息失效,云端链路将不可用,请进入 Xiaomi Home 集成页面,点击“选项”重新认证",
|
"invalid_oauth_info": "认证信息失效,云端链路将不可用,请进入 Xiaomi Home 集成页面,点击“选项”重新认证",
|
||||||
|
|||||||
@ -64,6 +64,22 @@
|
|||||||
"net_unavailable": "接口不可用"
|
"net_unavailable": "接口不可用"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"oauth2": {
|
||||||
|
"success": {
|
||||||
|
"title": "認證成功",
|
||||||
|
"content": "請關閉此頁面,返回帳號認證頁面點擊“下一步”",
|
||||||
|
"button": "關閉"
|
||||||
|
},
|
||||||
|
"fail": {
|
||||||
|
"title": "認證失敗",
|
||||||
|
"content": "{error_msg},請關閉此頁面,返回帳號認證頁面重新點擊認鏈接進行認證。",
|
||||||
|
"button": "關閉"
|
||||||
|
},
|
||||||
|
"error_msg": {
|
||||||
|
"-10100": "無效的響應參數('code'或者'state'字段為空)",
|
||||||
|
"-10101": "傳入的'state'字段不一致"
|
||||||
|
}
|
||||||
|
},
|
||||||
"miot": {
|
"miot": {
|
||||||
"client": {
|
"client": {
|
||||||
"invalid_oauth_info": "認證信息失效,雲端鏈路將不可用,請進入 Xiaomi Home 集成頁面,點擊“選項”重新認證",
|
"invalid_oauth_info": "認證信息失效,雲端鏈路將不可用,請進入 Xiaomi Home 集成頁面,點擊“選項”重新認證",
|
||||||
|
|||||||
@ -72,6 +72,8 @@ class MIoTErrorCode(Enum):
|
|||||||
# MIoT ev error code, -10080
|
# MIoT ev error code, -10080
|
||||||
# Mips service error code, -10090
|
# Mips service error code, -10090
|
||||||
# Config flow error code, -10100
|
# Config flow error code, -10100
|
||||||
|
CODE_CONFIG_INVALID_INPUT = -10100
|
||||||
|
CODE_CONFIG_INVALID_STATE = -10101
|
||||||
# Options flow error code , -10110
|
# Options flow error code , -10110
|
||||||
# MIoT lan error code, -10120
|
# MIoT lan error code, -10120
|
||||||
CODE_LAN_UNAVAILABLE = -10120
|
CODE_LAN_UNAVAILABLE = -10120
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<link as="style"
|
<link as="style"
|
||||||
href="https://font.sec.miui.com/font/css?family=MiSans:300,400,500,600,700:Chinese_Simplify,Chinese_Traditional,Latin&display=swap"
|
href="https://font.sec.miui.com/font/css?family=MiSans:300,400,500,600,700:Chinese_Simplify,Chinese_Traditional,Latin&display=swap"
|
||||||
rel="preload">
|
rel="preload">
|
||||||
<title></title>
|
<title>TITLE_PLACEHOLDER</title>
|
||||||
<style>
|
<style>
|
||||||
body {
|
body {
|
||||||
background: white;
|
background: white;
|
||||||
@ -115,145 +115,21 @@
|
|||||||
</div>
|
</div>
|
||||||
<!-- TITLE -->
|
<!-- TITLE -->
|
||||||
<div class="title-frame">
|
<div class="title-frame">
|
||||||
<a id="titleArea"></a>
|
<a id="titleArea">TITLE_PLACEHOLDER</a>
|
||||||
</div>
|
</div>
|
||||||
<!-- CONTENT -->
|
<!-- CONTENT -->
|
||||||
<div class="content-frame">
|
<div class="content-frame">
|
||||||
<a id="contentArea"></a>
|
<a id="contentArea">CONTENT_PLACEHOLDER</a>
|
||||||
</div>
|
</div>
|
||||||
<!-- BUTTON -->
|
<!-- BUTTON -->
|
||||||
<button onClick="window.close();" id="buttonArea"></button>
|
<button onClick="window.close();" id="buttonArea">BUTTON_PLACEHOLDER</button>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
// get language (user language -> system language)
|
if (STATUS_PLACEHOLDER) {
|
||||||
const systemLanguage = 'LANG_PLACEHOLDER'; // DO NOT edit.
|
window.opener = null;
|
||||||
const locale = (localStorage.getItem('selectedLanguage') ?? systemLanguage).replaceAll('"', '');
|
window.open('', '_self');
|
||||||
const language = locale.split('-')[0].trim();
|
window.close();
|
||||||
const status = 'STATUS_PLACEHOLDER'; // DO NOT edit.
|
|
||||||
console.log(locale);
|
|
||||||
/**
|
|
||||||
* @type {{
|
|
||||||
* [locale: string] : {
|
|
||||||
* success: {
|
|
||||||
* title:string;
|
|
||||||
* content:string;
|
|
||||||
* button:string;
|
|
||||||
* };
|
|
||||||
* fail: {
|
|
||||||
* title:string;
|
|
||||||
* content:string;
|
|
||||||
* button:string;
|
|
||||||
* };
|
|
||||||
* };
|
|
||||||
* }}
|
|
||||||
*/
|
|
||||||
const translations = {
|
|
||||||
zh: {
|
|
||||||
success: {
|
|
||||||
title: "认证完成",
|
|
||||||
content: "请关闭此页面,返回账号认证页面点击“下一步”",
|
|
||||||
button: "关闭页面"
|
|
||||||
},
|
|
||||||
fail: {
|
|
||||||
title: "认证失败",
|
|
||||||
content: "请关闭此页面,返回账号认证页面重新点击认链接进行认证。",
|
|
||||||
button: "关闭页面"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'zh-Hant': {
|
|
||||||
success: {
|
|
||||||
title: "認證完成",
|
|
||||||
content: "請關閉此頁面,返回帳號認證頁面點擊「下一步」。",
|
|
||||||
button: "關閉頁面"
|
|
||||||
},
|
|
||||||
fail: {
|
|
||||||
title: "認證失敗",
|
|
||||||
content: "請關閉此頁面,返回帳號認證頁面重新點擊認鏈接進行認證。",
|
|
||||||
button: "關閉頁面"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
en: {
|
|
||||||
success: {
|
|
||||||
title: "Authentication Completed",
|
|
||||||
content: "Please close this page and return to the account authentication page to click NEXT",
|
|
||||||
button: "Close Page"
|
|
||||||
},
|
|
||||||
fail: {
|
|
||||||
title: "Authentication Failed",
|
|
||||||
content: "Please close this page and return to the account authentication page to click the authentication link again.",
|
|
||||||
button: "Close Page"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
fr: {
|
|
||||||
success: {
|
|
||||||
title: "Authentification Terminée",
|
|
||||||
content: "Veuillez fermer cette page et revenir à la page d'authentification du compte pour cliquer sur « SUIVANT »",
|
|
||||||
button: "Fermer la page"
|
|
||||||
},
|
|
||||||
fail: {
|
|
||||||
title: "Échec de l'Authentification",
|
|
||||||
content: "Veuillez fermer cette page et revenir à la page d'authentification du compte pour cliquer de nouveau sur le lien d'authentification.",
|
|
||||||
button: "Fermer la page"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
ru: {
|
|
||||||
success: {
|
|
||||||
title: "Подтверждение завершено",
|
|
||||||
content: "Пожалуйста, закройте эту страницу, вернитесь на страницу аутентификации учетной записи и нажмите кнопку «Далее».",
|
|
||||||
button: "Закрыть страницу"
|
|
||||||
},
|
|
||||||
fail: {
|
|
||||||
title: "Ошибка аутентификации",
|
|
||||||
content: "Пожалуйста, закройте эту страницу, вернитесь на страницу аутентификации учетной записи и повторите процесс аутентификации, щелкнув ссылку.",
|
|
||||||
button: "Закрыть страницу"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
de: {
|
|
||||||
success: {
|
|
||||||
title: "Authentifizierung abgeschlossen",
|
|
||||||
content: "Bitte schließen Sie diese Seite, kehren Sie zur Kontobestätigungsseite zurück und klicken Sie auf „WEITER“.",
|
|
||||||
button: "Seite schließen"
|
|
||||||
},
|
|
||||||
fail: {
|
|
||||||
title: "Authentifizierung fehlgeschlagen",
|
|
||||||
content: "Bitte schließen Sie diese Seite, kehren Sie zur Kontobestätigungsseite zurück und wiederholen Sie den Authentifizierungsprozess, indem Sie auf den Link klicken.",
|
|
||||||
button: "Seite schließen"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
es: {
|
|
||||||
success: {
|
|
||||||
title: "Autenticación completada",
|
|
||||||
content: "Por favor, cierre esta página, regrese a la página de autenticación de la cuenta y haga clic en 'SIGUIENTE'.",
|
|
||||||
button: "Cerrar página"
|
|
||||||
},
|
|
||||||
fail: {
|
|
||||||
title: "Error de autenticación",
|
|
||||||
content: "Por favor, cierre esta página, regrese a la página de autenticación de la cuenta y vuelva a hacer clic en el enlace de autenticación.",
|
|
||||||
button: "Cerrar página"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
ja: {
|
|
||||||
success: {
|
|
||||||
title: "認証完了",
|
|
||||||
content: "このページを閉じて、アカウント認証ページに戻り、「次」をクリックしてください。",
|
|
||||||
button: "ページを閉じる"
|
|
||||||
},
|
|
||||||
fail: {
|
|
||||||
title: "認証失敗",
|
|
||||||
content: "このページを閉じて、アカウント認証ページに戻り、認証リンクを再度クリックしてください。",
|
|
||||||
button: "ページを閉じる"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// insert translate into page / match order: locale > language > english
|
|
||||||
const translation = (translations[locale] ?? translations[language] ?? translations["en"])[status];
|
|
||||||
document.title = translation.title;
|
|
||||||
document.getElementById("titleArea").innerText = translation.title;
|
|
||||||
document.getElementById("contentArea").innerText = translation.content;
|
|
||||||
document.getElementById("buttonArea").innerText = translation.button;
|
|
||||||
window.opener = null;
|
|
||||||
window.open('', '_self');
|
|
||||||
window.close();
|
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|||||||
@ -49,23 +49,28 @@ MIoT redirect web pages.
|
|||||||
import os
|
import os
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
_template = ""
|
_template = ''
|
||||||
|
|
||||||
|
|
||||||
def _load_page_template():
|
def _load_page_template():
|
||||||
path = os.path.join(
|
path = os.path.join(
|
||||||
os.path.dirname(os.path.abspath(__file__)),
|
os.path.dirname(os.path.abspath(__file__)),
|
||||||
"resource/oauth_redirect_page.html")
|
'resource/oauth_redirect_page.html')
|
||||||
with open(path, "r", encoding="utf-8") as f:
|
with open(path, 'r', encoding='utf-8') as f:
|
||||||
global _template
|
global _template
|
||||||
_template = f.read()
|
_template = f.read()
|
||||||
|
|
||||||
|
|
||||||
async def oauth_redirect_page(lang: str, status: str) -> str:
|
async def oauth_redirect_page(
|
||||||
|
title: str, content: str, button: str, success: bool
|
||||||
|
) -> str:
|
||||||
"""Return oauth redirect page."""
|
"""Return oauth redirect page."""
|
||||||
if _template == "":
|
if _template == '':
|
||||||
await asyncio.get_running_loop().run_in_executor(
|
await asyncio.get_running_loop().run_in_executor(
|
||||||
None, _load_page_template)
|
None, _load_page_template)
|
||||||
web_page = _template.replace("LANG_PLACEHOLDER", lang)
|
web_page = _template.replace('TITLE_PLACEHOLDER', title)
|
||||||
web_page = web_page.replace("STATUS_PLACEHOLDER", status)
|
web_page = web_page.replace('CONTENT_PLACEHOLDER', content)
|
||||||
|
web_page = web_page.replace('BUTTON_PLACEHOLDER', button)
|
||||||
|
web_page = web_page.replace(
|
||||||
|
'STATUS_PLACEHOLDER', 'true' if success else 'false')
|
||||||
return web_page
|
return web_page
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user