diff --git a/packages/core/src/node/i18n/localization-backend-contribution.ts b/packages/core/src/node/i18n/localization-backend-contribution.ts index 4ab18bb35e15e..68c0357a50e2c 100644 --- a/packages/core/src/node/i18n/localization-backend-contribution.ts +++ b/packages/core/src/node/i18n/localization-backend-contribution.ts @@ -16,12 +16,14 @@ import * as express from 'express'; import { inject, injectable } from 'inversify'; +import { Deferred } from '../../common/promise-util'; import { BackendApplicationContribution } from '../backend-application'; import { LocalizationRegistry } from './localization-contribution'; import { LocalizationProvider } from './localization-provider'; @injectable() export class LocalizationBackendContribution implements BackendApplicationContribution { + protected readonly initialized = new Deferred(); @inject(LocalizationRegistry) protected readonly localizationRegistry: LocalizationRegistry; @@ -31,15 +33,20 @@ export class LocalizationBackendContribution implements BackendApplicationContri async initialize(): Promise { await this.localizationRegistry.initialize(); + this.initialized.resolve(); + } + + waitForInitialization(): Promise { + return this.initialized.promise; } configure(app: express.Application): void { - app.get('/i18n/:locale', (req, res) => { + app.get('/i18n/:locale', async (req, res) => { + await this.waitForInitialization(); let locale = req.params.locale; locale = this.localizationProvider.getAvailableLanguages().some(e => e.languageId === locale) ? locale : 'en'; this.localizationProvider.setCurrentLanguage(locale); res.send(this.localizationProvider.loadLocalization(locale)); }); } - } diff --git a/packages/plugin-ext/src/main/node/plugin-ext-backend-module.ts b/packages/plugin-ext/src/main/node/plugin-ext-backend-module.ts index dfcb84e349c2b..57d6e6ffef50f 100644 --- a/packages/plugin-ext/src/main/node/plugin-ext-backend-module.ts +++ b/packages/plugin-ext/src/main/node/plugin-ext-backend-module.ts @@ -40,8 +40,10 @@ import { PluginTheiaEnvironment } from '../common/plugin-theia-environment'; import { PluginTheiaDeployerParticipant } from './plugin-theia-deployer-participant'; import { WebviewBackendSecurityWarnings } from './webview-backend-security-warnings'; import { PluginUninstallationManager } from './plugin-uninstallation-manager'; +import { LocalizationBackendContribution } from '@theia/core/lib/node/i18n/localization-backend-contribution'; +import { PluginLocalizationBackendContribution } from './plugin-localization-backend-contribution'; -export function bindMainBackend(bind: interfaces.Bind): void { +export function bindMainBackend(bind: interfaces.Bind, unbind: interfaces.Unbind, isBound: interfaces.IsBound, rebind: interfaces.Rebind): void { bind(PluginApiContribution).toSelf().inSingletonScope(); bind(BackendApplicationContribution).toService(PluginApiContribution); bind(WsRequestValidatorContribution).toService(PluginApiContribution); @@ -87,4 +89,7 @@ export function bindMainBackend(bind: interfaces.Bind): void { bind(WebviewBackendSecurityWarnings).toSelf().inSingletonScope(); bind(BackendApplicationContribution).toService(WebviewBackendSecurityWarnings); + + rebind(LocalizationBackendContribution).to(PluginLocalizationBackendContribution).inSingletonScope(); + } diff --git a/packages/plugin-ext/src/main/node/plugin-localization-backend-contribution.ts b/packages/plugin-ext/src/main/node/plugin-localization-backend-contribution.ts new file mode 100644 index 0000000000000..2f5c3aff101a6 --- /dev/null +++ b/packages/plugin-ext/src/main/node/plugin-localization-backend-contribution.ts @@ -0,0 +1,42 @@ +// ***************************************************************************** +// Copyright (C) 2021 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { inject, injectable } from '@theia/core/shared/inversify'; +import { LocalizationBackendContribution } from '@theia/core/lib/node/i18n/localization-backend-contribution'; +import { PluginDeployer } from '../../common/plugin-protocol'; +import { PluginDeployerImpl } from './plugin-deployer-impl'; +import { Deferred } from '@theia/core/lib/common/promise-util'; + +@injectable() +export class PluginLocalizationBackendContribution extends LocalizationBackendContribution { + @inject(PluginDeployer) + protected readonly pluginDeployer: PluginDeployerImpl; + protected readonly pluginsDeployed = new Deferred(); + + override async initialize(): Promise { + this.pluginDeployer.onDidDeploy(() => { + this.pluginsDeployed.resolve(); + }); + await super.initialize(); + } + + override async waitForInitialization(): Promise { + await Promise.all([ + super.waitForInitialization(), + this.pluginsDeployed.promise, + ]); + } +} diff --git a/packages/plugin-ext/src/plugin-ext-backend-electron-module.ts b/packages/plugin-ext/src/plugin-ext-backend-electron-module.ts index 78926963336a3..ca1fd59d6bce0 100644 --- a/packages/plugin-ext/src/plugin-ext-backend-electron-module.ts +++ b/packages/plugin-ext/src/plugin-ext-backend-electron-module.ts @@ -18,7 +18,7 @@ import { ContainerModule } from '@theia/core/shared/inversify'; import { bindElectronBackend } from './hosted/node-electron/plugin-ext-hosted-electron-backend-module'; import { bindMainBackend } from './main/node/plugin-ext-backend-module'; -export default new ContainerModule(bind => { - bindMainBackend(bind); +export default new ContainerModule((bind, unbind, isBound, rebind) => { + bindMainBackend(bind, unbind, isBound, rebind); bindElectronBackend(bind); }); diff --git a/packages/plugin-ext/src/plugin-ext-backend-module.ts b/packages/plugin-ext/src/plugin-ext-backend-module.ts index aec5f0b3d32cc..6093561e11ff1 100644 --- a/packages/plugin-ext/src/plugin-ext-backend-module.ts +++ b/packages/plugin-ext/src/plugin-ext-backend-module.ts @@ -18,7 +18,7 @@ import { ContainerModule } from '@theia/core/shared/inversify'; import { bindHostedBackend } from './hosted/node/plugin-ext-hosted-backend-module'; import { bindMainBackend } from './main/node/plugin-ext-backend-module'; -export default new ContainerModule(bind => { - bindMainBackend(bind); +export default new ContainerModule((bind, unbind, isBound, rebind) => { + bindMainBackend(bind, unbind, isBound, rebind); bindHostedBackend(bind); });