Pārlūkot izejas kodu

Merge pull request #8945 from goanpeca/enh/add-translation-manager

PR: Add a standalone TranslationManager to be used outside of jlab plugins
Steven Silvester 4 gadi atpakaļ
vecāks
revīzija
895ead8588

+ 6 - 0
.github/labeler.yml

@@ -268,6 +268,12 @@ pkg:tooltip:
   - packages/tooltip-extension/**/*
   - packages/tooltip-extension/*
 
+pkg:translation:
+  - packages/translation/**/*
+  - packages/translation/*
+  - packages/translation-extension/**/*
+  - packages/translation-extension/*
+
 pkg:ui-components:
   - packages/ui-components/**/*
   - packages/ui-components/*

+ 7 - 43
packages/translation-extension/src/index.ts

@@ -15,10 +15,9 @@ import { IMainMenu } from '@jupyterlab/mainmenu';
 import { ISettingRegistry } from '@jupyterlab/settingregistry';
 
 import {
-  Gettext,
   ITranslator,
   ITranslatorConnector,
-  TranslationBundle,
+  TranslationManager,
   TranslatorConnector,
   requestTranslationsAPI
 } from '@jupyterlab/translation';
@@ -52,47 +51,12 @@ const translator: JupyterFrontEndPlugin<ITranslator> = {
   autoStart: true,
   requires: [ISettingRegistry, ITranslatorConnector],
   provides: ITranslator,
-  activate: async (
-    app: JupyterFrontEnd,
-    settings: ISettingRegistry,
-    connector: ITranslatorConnector
-  ) => {
-    let setting = await settings.load(PLUGIN_ID);
-    let currentLocale: string = setting.get('locale').composite as string;
-    let languageData = await connector.fetch({ language: currentLocale });
-    let domainData: any = languageData?.data;
-    let englishBundle = new Gettext();
-    let translationBundle: Gettext;
-    let translationBundles: any = {};
-    let metadata: any;
-    return {
-      load: (domain: string): TranslationBundle => {
-        if (currentLocale == 'en') {
-          return englishBundle;
-        } else {
-          if (!(domain in translationBundles)) {
-            translationBundle = new Gettext({
-              domain: domain,
-              locale: currentLocale
-            });
-            // TODO: Add language variations on server.
-            // So if language pack es-CO is requested and es exist, then we
-            // can use that as fallback
-            if (domain in domainData) {
-              metadata = domainData[domain][''];
-              if ('plural_forms' in metadata) {
-                metadata.pluralForms = metadata.plural_forms;
-                delete metadata.plural_forms;
-                domainData[domain][''] = metadata;
-              }
-              translationBundle.loadJSON(domainData[domain], domain);
-            }
-            translationBundles[domain] = translationBundle;
-          }
-          return translationBundles[domain];
-        }
-      }
-    };
+  activate: async (app: JupyterFrontEnd, settings: ISettingRegistry) => {
+    const setting = await settings.load(PLUGIN_ID);
+    const currentLocale: string = setting.get('locale').composite as string;
+    const translationManager = new TranslationManager();
+    await translationManager.fetch(currentLocale);
+    return translationManager;
   }
 };
 

+ 1 - 0
packages/translation/src/index.ts

@@ -4,5 +4,6 @@
 // Note: keep in alphabetical order...
 export * from './base';
 export * from './gettext';
+export * from './manager';
 export * from './server';
 export * from './tokens';

+ 69 - 0
packages/translation/src/manager.ts

@@ -0,0 +1,69 @@
+// Copyright (c) Jupyter Development Team.
+// Distributed under the terms of the Modified BSD License.
+
+import { Gettext } from './gettext';
+import { ITranslator, TranslationBundle, TranslatorConnector } from './tokens';
+
+/**
+ * Translation Manager
+ */
+export class TranslationManager implements ITranslator {
+  constructor() {
+    this._connector = new TranslatorConnector();
+  }
+
+  /**
+   * Fetch the localization data from the server.
+   *
+   * @param locale The language locale to use for translations.
+   */
+  async fetch(locale: string) {
+    this._currentLocale = locale;
+    this._languageData = await this._connector.fetch({ language: locale });
+    this._domainData = this._languageData?.data || {};
+    const message: string = this._languageData?.message;
+    if (message && locale !== 'en') {
+      console.warn(message);
+    }
+  }
+
+  /**
+   * Load translation bundles for a given domain.
+   *
+   * @param domain The translation domain to use for translations.
+   */
+  load(domain: string): TranslationBundle {
+    if (this._domainData) {
+      if (this._currentLocale == 'en') {
+        return this._englishBundle;
+      } else {
+        if (!(domain in this._translationBundles)) {
+          let translationBundle = new Gettext({
+            domain: domain,
+            locale: this._currentLocale
+          });
+          if (domain in this._domainData) {
+            let metadata = this._domainData[domain][''];
+            if ('plural_forms' in metadata) {
+              metadata.pluralForms = metadata.plural_forms;
+              delete metadata.plural_forms;
+              this._domainData[domain][''] = metadata;
+            }
+            translationBundle.loadJSON(this._domainData[domain], domain);
+          }
+          this._translationBundles[domain] = translationBundle;
+        }
+        return this._translationBundles[domain];
+      }
+    } else {
+      return this._englishBundle;
+    }
+  }
+
+  private _connector: TranslatorConnector;
+  private _currentLocale: string;
+  private _domainData: any = {};
+  private _englishBundle = new Gettext();
+  private _languageData: any;
+  private _translationBundles: any = {};
+}