From 50ed61d55a4b09e568875c17b51aa160939568a2 Mon Sep 17 00:00:00 2001
From: Christoph Reiter <reiter.christoph@gmail.com>
Date: Thu, 10 Jun 2021 16:03:08 +0200
Subject: [PATCH] language-select: Port to new translation overrides API

We need a separate i18next instance per component instance and
call setOverrides() to override the translations.
---
 .../language-select/i18next-scanner.config.js    |  1 +
 .../src/dbp-language-select-demo.js              | 16 +++-------------
 packages/language-select/src/i18n.js             |  8 ++++++--
 packages/language-select/src/language-select.js  | 16 +++++++++-------
 4 files changed, 19 insertions(+), 22 deletions(-)

diff --git a/packages/language-select/i18next-scanner.config.js b/packages/language-select/i18next-scanner.config.js
index 8c277798..aeb8fdb6 100644
--- a/packages/language-select/i18next-scanner.config.js
+++ b/packages/language-select/i18next-scanner.config.js
@@ -6,6 +6,7 @@ module.exports = {
     options: {
         debug: false,
         removeUnusedKeys: true,
+        func: {list: ['i18n.t', '_i18n.t']},
         lngs: ['en','de'],
         resource: {
             loadPath: 'src/i18n/{{lng}}/{{ns}}.json',
diff --git a/packages/language-select/src/dbp-language-select-demo.js b/packages/language-select/src/dbp-language-select-demo.js
index 2bbf7395..cabad2ed 100644
--- a/packages/language-select/src/dbp-language-select-demo.js
+++ b/packages/language-select/src/dbp-language-select-demo.js
@@ -4,7 +4,7 @@ import * as commonUtils from '@dbp-toolkit/common/utils';
 import { ScopedElementsMixin } from '@open-wc/scoped-elements';
 import {AdapterLitElement} from "@dbp-toolkit/provider/src/adapter-lit-element";
 import {Provider} from "@dbp-toolkit/provider";
-import {i18n} from './i18n.js';
+import {createInstance, setOverrides} from './i18n.js';
 
 // This is an example on how to override translations at runtime
 let OVERRIDES = {
@@ -20,23 +20,13 @@ let OVERRIDES = {
     }
 };
 
-function applyOverrides(i18n, namespace, overrides) {
-    for(let lang of Object.keys(overrides)) {
-        let data = overrides[lang][namespace];
-        if (data !== undefined) {
-            i18n.addResourceBundle(lang, namespace + '-override', data);
-        }
-    }
-}
-
 class LanguageSelectDisplay extends AdapterLitElement {
 
     constructor() {
         super();
         this.lang = 'de';
-        this._i18n = i18n.cloneInstance();
-        // FIXME: this overrides the translations for all clones
-        applyOverrides(this._i18n, 'translation', OVERRIDES);
+        this._i18n = createInstance();
+        setOverrides(this._i18n, OVERRIDES);
     }
 
     static get properties() {
diff --git a/packages/language-select/src/i18n.js b/packages/language-select/src/i18n.js
index 498d9f03..fbc1b032 100644
--- a/packages/language-select/src/i18n.js
+++ b/packages/language-select/src/i18n.js
@@ -1,6 +1,10 @@
-import {createInstance} from '@dbp-toolkit/common/i18next.js';
+import {createInstance as _createInstance, setOverrides} from '@dbp-toolkit/common/i18next.js';
 
 import de from './i18n/de/translation.json';
 import en from './i18n/en/translation.json';
 
-export const i18n = createInstance({en: en, de: de}, 'de', 'en');
\ No newline at end of file
+export function createInstance() {
+    return _createInstance({en: en, de: de}, 'de', 'en');
+}
+
+export {setOverrides};
\ No newline at end of file
diff --git a/packages/language-select/src/language-select.js b/packages/language-select/src/language-select.js
index 2ab2f3ca..b5f06f21 100644
--- a/packages/language-select/src/language-select.js
+++ b/packages/language-select/src/language-select.js
@@ -1,8 +1,9 @@
 import {html, css} from 'lit-element';
-import {i18n} from './i18n.js';
+import {createInstance} from './i18n.js';
 import * as commonStyles from '@dbp-toolkit/common/styles';
 import {AdapterLitElement} from "@dbp-toolkit/provider/src/adapter-lit-element";
 
+
 /**
  * Emits a dbp-language-changed event where event.detail.lang is the new selected language
  */
@@ -13,11 +14,12 @@ export class LanguageSelect extends AdapterLitElement {
         this._lang = 'de';
         this.languages = ['de', 'en'];
 
+        this._i18n = createInstance();
         // for the i18next scanner
-        i18n.t('de');
-        i18n.t('de-action');
-        i18n.t('en');
-        i18n.t('en-action');
+        this._i18n.t('de');
+        this._i18n.t('de-action');
+        this._i18n.t('en');
+        this._i18n.t('en-action');
     }
 
     _getNextLanguage(lang) {
@@ -58,7 +60,7 @@ export class LanguageSelect extends AdapterLitElement {
             // Unlike other cases we use the next language for the translations so that
             // users not knowing the current language can understand it.
             // In case of more than two this doesn't make that much sense, but for now..
-            i18n.changeLanguage(this.next);
+            this._i18n.changeLanguage(this.next);
         }
     }
 
@@ -106,7 +108,7 @@ export class LanguageSelect extends AdapterLitElement {
     }
 
     render() {
-        var linkTitle = i18n.t(this.next + '-action');
+        var linkTitle = this._i18n.t(this.next + '-action');
         return html`
             <a href="#" title="${linkTitle}" @click=${this.onClick}>${this.next.toUpperCase()}</a>
         `;
-- 
GitLab