From af6b0d32664f677011ee6b7837f44d30ffaa2e82 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 18 May 2022 13:37:47 -0500 Subject: [PATCH] Support requesting translations for multiple integrations in one request (#12704) * Support requesting translations for multiple integrations in one request - Requires https://github.com/home-assistant/core/pull/71979 * onboarding as well * integrations -> integration * fix cache * short return if they are all loaded * reduce * reduce * reduce --- src/data/translation.ts | 2 +- src/onboarding/onboarding-integrations.ts | 4 +++- .../integrations/ha-config-integrations.ts | 11 +++++----- src/state/translations-mixin.ts | 20 +++++++++++++------ 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/data/translation.ts b/src/data/translation.ts index aee999172a..7374f40639 100644 --- a/src/data/translation.ts +++ b/src/data/translation.ts @@ -52,7 +52,7 @@ export const getHassTranslations = async ( hass: HomeAssistant, language: string, category: TranslationCategory, - integration?: string, + integration?: string | string[], config_flow?: boolean ): Promise> => { const result = await hass.callWS<{ resources: Record }>({ diff --git a/src/onboarding/onboarding-integrations.ts b/src/onboarding/onboarding-integrations.ts index 9fc15b0c07..1c21b94008 100644 --- a/src/onboarding/onboarding-integrations.ts +++ b/src/onboarding/onboarding-integrations.ts @@ -49,12 +49,14 @@ class OnboardingIntegrations extends LitElement { this.hass.loadBackendTranslation("title", undefined, true); this._unsubEvents = subscribeConfigFlowInProgress(this.hass, (flows) => { this._discovered = flows; + const integrations: Set = new Set(); for (const flow of flows) { // To render title placeholders if (flow.context.title_placeholders) { - this.hass.loadBackendTranslation("config", flow.handler); + integrations.add(flow.handler); } } + this.hass.loadBackendTranslation("config", Array.from(integrations)); }); } diff --git a/src/panels/config/integrations/ha-config-integrations.ts b/src/panels/config/integrations/ha-config-integrations.ts index c6dbcb1787..60df2ccec4 100644 --- a/src/panels/config/integrations/ha-config-integrations.ts +++ b/src/panels/config/integrations/ha-config-integrations.ts @@ -156,17 +156,18 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { this._deviceRegistryEntries = entries; }), subscribeConfigFlowInProgress(this.hass, async (flowsInProgress) => { - const translationsPromisses: Promise[] = []; + const integrations: Set = new Set(); flowsInProgress.forEach((flow) => { // To render title placeholders if (flow.context.title_placeholders) { - translationsPromisses.push( - this.hass.loadBackendTranslation("config", flow.handler) - ); + integrations.add(flow.handler); } this._fetchManifest(flow.handler); }); - await Promise.all(translationsPromisses); + await this.hass.loadBackendTranslation( + "config", + Array.from(integrations) + ); await nextRender(); this._configEntriesInProgress = flowsInProgress.map((flow) => ({ ...flow, diff --git a/src/state/translations-mixin.ts b/src/state/translations-mixin.ts index 8205817911..d02144ffd0 100644 --- a/src/state/translations-mixin.ts +++ b/src/state/translations-mixin.ts @@ -242,12 +242,22 @@ export default >(superClass: T) => }; } + let integrationsToLoad: string[] = []; + // Check if already loaded if (!force) { - if (integration) { + if (integration && Array.isArray(integration)) { + integrationsToLoad = integration.filter( + (i) => !alreadyLoaded.integrations.includes(i) + ); + if (!integrationsToLoad.length) { + return this.hass!.localize; + } + } else if (integration) { if (alreadyLoaded.integrations.includes(integration)) { return this.hass!.localize; } + integrationsToLoad = [integration]; } else if ( configFlow ? alreadyLoaded.configFlow : alreadyLoaded.setup ) { @@ -256,10 +266,8 @@ export default >(superClass: T) => } // Add to cache - if (integration) { - if (!alreadyLoaded.integrations.includes(integration)) { - alreadyLoaded.integrations.push(integration); - } + if (integrationsToLoad.length) { + alreadyLoaded.integrations.push(...integrationsToLoad); } else { alreadyLoaded.setup = true; if (configFlow) { @@ -271,7 +279,7 @@ export default >(superClass: T) => this.hass!, language, category, - integration, + integrationsToLoad.length ? integrationsToLoad : undefined, configFlow );