diff --git a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts index d0a39569e..6338b5320 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -82,7 +82,7 @@ import { } from '../common/protocol/authentication-service'; import { ArduinoFirmwareUploaderImpl } from './arduino-firmware-uploader-impl'; import { PlotterBackendContribution } from './plotter/plotter-backend-contribution'; -import { ArduinoLocalizationContribution } from './arduino-localization-contribution'; +import { ArduinoLocalizationContribution } from './i18n/arduino-localization-contribution'; import { LocalizationContribution } from '@theia/core/lib/node/i18n/localization-contribution'; import { MonitorManagerProxyImpl } from './monitor-manager-proxy-impl'; import { MonitorManager, MonitorManagerName } from './monitor-manager'; @@ -102,6 +102,8 @@ import WebSocketProviderImpl from './web-socket/web-socket-provider-impl'; import { WebSocketProvider } from './web-socket/web-socket-provider'; import { ClangFormatter } from './clang-formatter'; import { FormatterPath } from '../common/protocol/formatter'; +import { LocalizationBackendContribution } from './i18n/localization-backend-contribution'; +import { LocalizationBackendContribution as TheiaLocalizationBackendContribution } from '@theia/core/lib/node/i18n/localization-backend-contribution'; export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(BackendApplication).toSelf().inSingletonScope(); @@ -395,4 +397,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(BackendApplicationContribution).toService(PlotterBackendContribution); bind(ArduinoLocalizationContribution).toSelf().inSingletonScope(); bind(LocalizationContribution).toService(ArduinoLocalizationContribution); + bind(LocalizationBackendContribution).toSelf().inSingletonScope(); + rebind(TheiaLocalizationBackendContribution).toService( + LocalizationBackendContribution + ); }); diff --git a/arduino-ide-extension/src/node/arduino-localization-contribution.ts b/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts similarity index 63% rename from arduino-ide-extension/src/node/arduino-localization-contribution.ts rename to arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts index 5921be830..3465ab83d 100644 --- a/arduino-ide-extension/src/node/arduino-localization-contribution.ts +++ b/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts @@ -11,142 +11,142 @@ export class ArduinoLocalizationContribution async registerLocalizations(registry: LocalizationRegistry): Promise { registry.registerLocalizationFromRequire( 'af', - require('../../build/i18n/af.json') + require('../../../build/i18n/af.json') ); registry.registerLocalizationFromRequire( 'en', - require('../../build/i18n/en.json') + require('../../../build/i18n/en.json') ); registry.registerLocalizationFromRequire( 'fr', - require('../../build/i18n/fr.json') + require('../../../build/i18n/fr.json') ); registry.registerLocalizationFromRequire( 'ko', - require('../../build/i18n/ko.json') + require('../../../build/i18n/ko.json') ); registry.registerLocalizationFromRequire( 'pt-br', - require('../../build/i18n/pt.json') + require('../../../build/i18n/pt.json') ); registry.registerLocalizationFromRequire( 'uk_UA', - require('../../build/i18n/uk_UA.json') + require('../../../build/i18n/uk_UA.json') ); registry.registerLocalizationFromRequire( 'ar', - require('../../build/i18n/ar.json') + require('../../../build/i18n/ar.json') ); registry.registerLocalizationFromRequire( 'es', - require('../../build/i18n/es.json') + require('../../../build/i18n/es.json') ); registry.registerLocalizationFromRequire( 'he', - require('../../build/i18n/he.json') + require('../../../build/i18n/he.json') ); registry.registerLocalizationFromRequire( 'my_MM', - require('../../build/i18n/my_MM.json') + require('../../../build/i18n/my_MM.json') ); registry.registerLocalizationFromRequire( 'ro', - require('../../build/i18n/ro.json') + require('../../../build/i18n/ro.json') ); registry.registerLocalizationFromRequire( 'zh-cn', - require('../../build/i18n/zh.json') + require('../../../build/i18n/zh.json') ); registry.registerLocalizationFromRequire( 'bg', - require('../../build/i18n/bg.json') + require('../../../build/i18n/bg.json') ); registry.registerLocalizationFromRequire( 'eu', - require('../../build/i18n/eu.json') + require('../../../build/i18n/eu.json') ); registry.registerLocalizationFromRequire( 'hu', - require('../../build/i18n/hu.json') + require('../../../build/i18n/hu.json') ); registry.registerLocalizationFromRequire( 'ne', - require('../../build/i18n/ne.json') + require('../../../build/i18n/ne.json') ); registry.registerLocalizationFromRequire( 'ru', - require('../../build/i18n/ru.json') + require('../../../build/i18n/ru.json') ); registry.registerLocalizationFromRequire( 'zh_TW', - require('../../build/i18n/zh_TW.json') + require('../../../build/i18n/zh_TW.json') ); registry.registerLocalizationFromRequire( 'de', - require('../../build/i18n/de.json') + require('../../../build/i18n/de.json') ); registry.registerLocalizationFromRequire( 'fa', - require('../../build/i18n/fa.json') + require('../../../build/i18n/fa.json') ); registry.registerLocalizationFromRequire( 'it', - require('../../build/i18n/it.json') + require('../../../build/i18n/it.json') ); registry.registerLocalizationFromRequire( 'nl', - require('../../build/i18n/nl.json') + require('../../../build/i18n/nl.json') ); registry.registerLocalizationFromRequire( 'sv_SE', - require('../../build/i18n/sv_SE.json') + require('../../../build/i18n/sv_SE.json') ); registry.registerLocalizationFromRequire( 'el', - require('../../build/i18n/el.json') + require('../../../build/i18n/el.json') ); registry.registerLocalizationFromRequire( 'fil', - require('../../build/i18n/fil.json') + require('../../../build/i18n/fil.json') ); registry.registerLocalizationFromRequire( 'ja', - require('../../build/i18n/ja.json') + require('../../../build/i18n/ja.json') ); registry.registerLocalizationFromRequire( 'pl', - require('../../build/i18n/pl.json') + require('../../../build/i18n/pl.json') ); registry.registerLocalizationFromRequire( 'tr', - require('../../build/i18n/tr.json') + require('../../../build/i18n/tr.json') ); } } diff --git a/arduino-ide-extension/src/node/i18n/localization-backend-contribution.ts b/arduino-ide-extension/src/node/i18n/localization-backend-contribution.ts new file mode 100644 index 000000000..e5bc11f03 --- /dev/null +++ b/arduino-ide-extension/src/node/i18n/localization-backend-contribution.ts @@ -0,0 +1,45 @@ +import * as express from 'express'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { LocalizationBackendContribution as TheiaLocalizationBackendContribution } from '@theia/core/lib/node/i18n/localization-backend-contribution'; +import { PluginDeployer } from '@theia/plugin-ext/lib/common/plugin-protocol'; +import { PluginDeployerImpl } from '@theia/plugin-ext/lib/main/node/plugin-deployer-impl'; +import { Deferred } from '@theia/core/lib/common/promise-util'; + +@injectable() +export class LocalizationBackendContribution extends TheiaLocalizationBackendContribution { + @inject(PluginDeployer) + private readonly pluginDeployer: PluginDeployerImpl; + + private readonly initialized = new Deferred(); + + override async initialize(): Promise { + this.pluginDeployer.onDidDeploy(() => { + this.initialized.resolve(); + }); + return super.initialize(); + } + + override configure(app: express.Application): void { + app.get('/i18n/:locale', async (req, res) => { + let locale = req.params.locale; + /* + Waiting for the deploy of the language plugins is neecessary to avoid checking the available + languages before they're finished to be loaded: https://github.com/eclipse-theia/theia/issues/11471 + */ + const start = performance.now(); + await this.initialized.promise; + console.info( + 'Waiting for the deploy of the language plugins took: ' + + (performance.now() - start) + + ' ms.' + ); + locale = this.localizationProvider + .getAvailableLanguages() + .some((e) => e.languageId === locale) + ? locale + : 'en'; + this.localizationProvider.setCurrentLanguage(locale); + res.send(this.localizationProvider.loadLocalization(locale)); + }); + } +}