From c93550681f3373062d490a3c3a1836c72e034adc Mon Sep 17 00:00:00 2001
From: Manuel Kocher <manuel.kocher@tugraz.at>
Date: Wed, 17 Aug 2022 11:08:50 +0200
Subject: [PATCH] Remove i18n from adapter, add translation overrides to all
 components that use i18n

---
 packages/common/src/adapter-lit-element.js    | 14 --------
 packages/common/src/translation.js            | 14 ++++++--
 .../data-table-view/src/data-table-view.js    |  8 ++++-
 packages/data-table-view/src/i18n.js          |  4 ++-
 packages/file-handling/src/clipboard.js       | 11 ++++--
 packages/file-handling/src/file-sink.js       |  7 +++-
 packages/file-handling/src/file-source.js     | 13 ++++---
 packages/file-handling/src/i18n.js            |  4 ++-
 .../src/nextcloud-file-picker.js              | 36 +++++++++++--------
 ...owledge-base-web-page-element-view-demo.js | 12 ++++++-
 .../src/i18n.js                               |  4 ++-
 .../knowledge-base-web-page-element-view.js   | 10 +++++-
 packages/matomo/src/dbp-matomo-demo.js        | 13 ++++++-
 packages/matomo/src/i18n.js                   |  4 ++-
 .../notification/src/dbp-notification-demo.js | 12 ++++++-
 packages/notification/src/i18n.js             |  4 ++-
 packages/notification/src/notification.js     |  7 +++-
 .../src/dbp-person-profile-demo.js            |  7 +++-
 packages/person-profile/src/i18n.js           |  4 ++-
 packages/person-profile/src/person-profile.js | 11 +++++-
 .../src/dbp-person-select-demo.js             | 12 ++++++-
 packages/person-select/src/i18n.js            |  4 ++-
 packages/person-select/src/person-select.js   |  9 +++--
 packages/provider/src/dbp-provider-demo.js    | 13 +++++--
 packages/provider/src/i18n.js                 |  4 ++-
 .../src/dbp-qr-code-scanner-demo.js           | 11 ++++--
 packages/qr-code-scanner/src/i18n.js          |  4 ++-
 .../qr-code-scanner/src/qr-code-scanner.js    |  9 +++--
 .../src/dbp-resource-select-demo.js           | 12 ++++++-
 packages/resource-select/src/i18n.js          |  4 ++-
 .../resource-select/src/resource-select.js    |  8 ++++-
 packages/theme-switcher/src/theme-switcher.js |  8 ++++-
 packages/tooltip/src/dbp-tooltip-demo.js      | 12 ++++++-
 packages/tooltip/src/i18n.js                  |  4 ++-
 packages/typescript-example/src/i18n.ts       |  4 ++-
 .../src/typescript-example.ts                 | 14 +++++++-
 36 files changed, 259 insertions(+), 72 deletions(-)

diff --git a/packages/common/src/adapter-lit-element.js b/packages/common/src/adapter-lit-element.js
index 5d46a75b..aebc8115 100644
--- a/packages/common/src/adapter-lit-element.js
+++ b/packages/common/src/adapter-lit-element.js
@@ -1,6 +1,5 @@
 import {LitElement} from 'lit';
 import {Logger} from './logger';
-import {createInstance, setOverridesByGlobalCache} from './i18n.js';
 
 export class AdapterLitElement extends LitElement {
     constructor() {
@@ -15,10 +14,6 @@ export class AdapterLitElement extends LitElement {
         this.subscribe = '';
         this.unsubscribe = '';
 
-        // dir and i18next instance of translation overrides
-        this._i18n = createInstance();
-        this.langDir = '';
-
         this.callbackStore = [];
 
         // Previously we used direct properties like this["lang"] (instead of this.propertyStore["lang"]) for storing the
@@ -84,11 +79,6 @@ export class AdapterLitElement extends LitElement {
 
         this.connected = true;
 
-        // use translation overrides if path is given
-        if(this.langDir != '') {
-          setOverridesByGlobalCache(this._i18n, this);
-        }
-
         const that = this;
 
         this.addEventListener(
@@ -276,10 +266,6 @@ export class AdapterLitElement extends LitElement {
                             value
                     );
 
-                    if(this.langDir) {
-                      setOverridesByGlobalCache(this._i18n, this);
-                    }
-
                     // If value is an object set it directly as property
                     if (typeof value === 'object' && value !== null) {
                         // Logger.debug("value is object", value);
diff --git a/packages/common/src/translation.js b/packages/common/src/translation.js
index bb4ea411..58eb373e 100644
--- a/packages/common/src/translation.js
+++ b/packages/common/src/translation.js
@@ -2,7 +2,7 @@ import {html} from 'lit';
 import {unsafeHTML} from 'lit/directives/unsafe-html.js';
 import DBPLitElement from '../dbp-lit-element';
 import * as commonStyles from '../styles.js';
-import {getOverrideNamespace, setOverridesByGlobalCache} from './i18n.js';
+import {getOverrideNamespace, setOverridesByGlobalCache, createInstance} from './i18n.js';
 
 export class Translation extends DBPLitElement {
     constructor() {
@@ -11,6 +11,11 @@ export class Translation extends DBPLitElement {
         this.lang = '';
         this.interpolation = '';
         this.unsafe = false;
+
+        // dir and i18next instance of translation overrides
+        this._i18n = createInstance();
+        this.langDir = '';
+
     }
 
     static get properties() {
@@ -37,6 +42,11 @@ export class Translation extends DBPLitElement {
       // get overrides everytime
       setOverridesByGlobalCache(this._i18n, this);
 
+      // use translation overrides if path is given
+      //if(this.langDir != '') {
+      //  setOverridesByGlobalCache(this._i18n, this);
+      //}
+
       // supercall after default i18n init to override translations only
       // if a override with this tagname is given
       super.connectedCallback();
@@ -84,7 +94,7 @@ export class Translation extends DBPLitElement {
         } else if (this._i18n.hasResourceBundle(this.lang, overrideNamespace)){
           keyComment = unsafeHTML("<!-- key '" + this.key + "' not found! -->");
           translation = "";
-          console.error("Key '" + this.key + "' not found! " + this._i18n.t(this.key));
+          console.error("Key '" + this.key + "' not found!");
         } else {
           keyComment = unsafeHTML("<!-- key '" + this.key + "' and namespace '" + overrideNamespace + "' not found! -->");
           translation = "";
diff --git a/packages/data-table-view/src/data-table-view.js b/packages/data-table-view/src/data-table-view.js
index 576934ea..aff9e74e 100644
--- a/packages/data-table-view/src/data-table-view.js
+++ b/packages/data-table-view/src/data-table-view.js
@@ -7,7 +7,7 @@ import bttn from 'datatables.net-buttons-dt';
 import bttn2 from 'datatables.net-buttons';
 import bttnHtml5 from 'datatables.net-buttons/js/buttons.html5.js';
 import bttnPrint from 'datatables.net-buttons/js/buttons.print.js';
-import {createInstance} from './i18n';
+import {createInstance, setOverridesByGlobalCache} from './i18n';
 import {css, html, unsafeCSS} from 'lit';
 import de from '../assets/datatables/i18n/German';
 import en from '../assets/datatables/i18n/English';
@@ -30,6 +30,7 @@ export class DataTableView extends AdapterLitElement {
         super();
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
         // datatable properties
         this.table = null;
         this.responsive = null;
@@ -246,6 +247,11 @@ export class DataTableView extends AdapterLitElement {
         this.updateComplete.then(this.set_datatable(this.data, languageChange)).catch((e) => {
             console.log(e);
         });
+
+        if(this.langDir != '') {
+          setOverridesByGlobalCache(this._i18n, this);
+        }
+
         super.update(changedProperties);
     }
 
diff --git a/packages/data-table-view/src/i18n.js b/packages/data-table-view/src/i18n.js
index 0c6fedc8..930f3538 100644
--- a/packages/data-table-view/src/i18n.js
+++ b/packages/data-table-view/src/i18n.js
@@ -1,4 +1,4 @@
-import {createInstance as _createInstance} from '@dbp-toolkit/common/i18next.js';
+import {createInstance as _createInstance, setOverridesByGlobalCache} from '@dbp-toolkit/common/i18next.js';
 
 import de from './i18n/de/translation.json';
 import en from './i18n/en/translation.json';
@@ -6,3 +6,5 @@ import en from './i18n/en/translation.json';
 export function createInstance() {
     return _createInstance({en: en, de: de}, 'de', 'en');
 }
+
+export {setOverridesByGlobalCache};
diff --git a/packages/file-handling/src/clipboard.js b/packages/file-handling/src/clipboard.js
index fedc4d8e..a607d0dc 100644
--- a/packages/file-handling/src/clipboard.js
+++ b/packages/file-handling/src/clipboard.js
@@ -1,4 +1,4 @@
-import {createInstance} from './i18n';
+import {createInstance, setOverridesByGlobalCache} from './i18n';
 import {css, html} from 'lit';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import * as commonUtils from '@dbp-toolkit/common/utils';
@@ -21,6 +21,8 @@ export class Clipboard extends ScopedElementsMixin(AdapterLitElement) {
         super();
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
+
         this.allowedMimeTypes = '';
         this.clipboardFiles = {files: ''};
         this.clipboardSelectBtnDisabled = true;
@@ -109,6 +111,11 @@ export class Clipboard extends ScopedElementsMixin(AdapterLitElement) {
                     break;
             }
         });
+
+        if(this.langDir != '') {
+          setOverridesByGlobalCache(this._i18n, this);
+        }
+
         super.update(changedProperties);
     }
 
@@ -865,7 +872,7 @@ export class Clipboard extends ScopedElementsMixin(AdapterLitElement) {
             ${commonStyles.getTabulatorStyles()}
             ${fileHandlingStyles.getFileHandlingCss()}
 
-            
+
             a {
                 border-bottom: var(--dbp-border);
                 padding: 0;
diff --git a/packages/file-handling/src/file-sink.js b/packages/file-handling/src/file-sink.js
index f30ef90c..6b0b75af 100644
--- a/packages/file-handling/src/file-sink.js
+++ b/packages/file-handling/src/file-sink.js
@@ -1,4 +1,4 @@
-import {createInstance} from './i18n';
+import {createInstance, setOverridesByGlobalCache} from './i18n';
 import {css, html} from 'lit';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import * as commonUtils from '@dbp-toolkit/common/utils';
@@ -22,6 +22,7 @@ export class FileSink extends ScopedElementsMixin(DbpFileHandlingLitElement) {
         this.context = '';
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
         this.nextcloudAuthUrl = '';
         this.nextcloudWebDavUrl = '';
         this.nextcloudName = 'Nextcloud';
@@ -101,6 +102,10 @@ export class FileSink extends ScopedElementsMixin(DbpFileHandlingLitElement) {
             }
 
         });
+
+        if (this.langDir != '') {
+          setOverridesByGlobalCache(this._i18n, this);
+        }
     }
 
     async downloadCompressedFiles() {
diff --git a/packages/file-handling/src/file-source.js b/packages/file-handling/src/file-source.js
index da8abdd4..73839baf 100644
--- a/packages/file-handling/src/file-source.js
+++ b/packages/file-handling/src/file-source.js
@@ -1,4 +1,4 @@
-import {createInstance} from './i18n';
+import {createInstance, setOverridesByGlobalCache} from './i18n';
 import {css, html} from 'lit';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import * as commonUtils from '@dbp-toolkit/common/utils';
@@ -38,6 +38,7 @@ export class FileSource extends ScopedElementsMixin(DbpFileHandlingLitElement) {
         super();
         this.context = '';
         this._i18n = createInstance();
+        this.langDir = '';
         this.lang = this._i18n.language;
         this.nextcloudAuthUrl = '';
         this.nextcloudName = 'Nextcloud';
@@ -174,6 +175,10 @@ export class FileSource extends ScopedElementsMixin(DbpFileHandlingLitElement) {
             }
 
         });
+
+        if (this.langDir != '') {
+          setOverridesByGlobalCache(this._i18n, this);
+        }
     }
 
     disconnectedCallback() {
@@ -595,8 +600,8 @@ export class FileSource extends ScopedElementsMixin(DbpFileHandlingLitElement) {
             ${commonStyles.getModalDialogCSS()}
             ${fileHandlingStyles.getFileHandlingCss()}
 
-           
-            
+
+
             p {
                 margin-top: 0;
             }
@@ -686,7 +691,7 @@ export class FileSource extends ScopedElementsMixin(DbpFileHandlingLitElement) {
                 .paddles {
                     display: inherit;
                 }
-                
+
                 .paddles.hidden {
                     display: none
                 }
diff --git a/packages/file-handling/src/i18n.js b/packages/file-handling/src/i18n.js
index 0c6fedc8..930f3538 100644
--- a/packages/file-handling/src/i18n.js
+++ b/packages/file-handling/src/i18n.js
@@ -1,4 +1,4 @@
-import {createInstance as _createInstance} from '@dbp-toolkit/common/i18next.js';
+import {createInstance as _createInstance, setOverridesByGlobalCache} from '@dbp-toolkit/common/i18next.js';
 
 import de from './i18n/de/translation.json';
 import en from './i18n/en/translation.json';
@@ -6,3 +6,5 @@ import en from './i18n/en/translation.json';
 export function createInstance() {
     return _createInstance({en: en, de: de}, 'de', 'en');
 }
+
+export {setOverridesByGlobalCache};
diff --git a/packages/file-handling/src/nextcloud-file-picker.js b/packages/file-handling/src/nextcloud-file-picker.js
index 2521f62a..6ee29370 100644
--- a/packages/file-handling/src/nextcloud-file-picker.js
+++ b/packages/file-handling/src/nextcloud-file-picker.js
@@ -1,4 +1,4 @@
-import {createInstance} from './i18n';
+import {createInstance, setOverridesByGlobalCache} from './i18n';
 import {css, html} from 'lit';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import DBPLitElement from '@dbp-toolkit/common/dbp-lit-element';
@@ -22,6 +22,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
         super();
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
 
         this.auth = {};
         this.authUrl = '';
@@ -323,6 +324,11 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
 
             window.addEventListener('resize', this.boundRefreshOnWindowSizeChange);
         });
+
+        // set translation overrides if requested
+        if (this.langDir != '') {
+          setOverridesByGlobalCache(this._i18n, this);
+        }
     }
 
     tableBuiltFunction() {
@@ -494,7 +500,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
             for (let key of Object.keys(localStorage)) {
                 if (
                     key.includes('nextcloud-webdav-username-') ||
-                    key.includes('nextcloud-webdav-password-') || 
+                    key.includes('nextcloud-webdav-password-') ||
                     key.includes('nextcloud-webdav-url-')
                 ) {
                     localStorage.removeItem(key);
@@ -839,7 +845,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
                     ]);
 
                     if (this._('.tabulator-placeholder-contents')) {
-                        this._('.tabulator-placeholder-contents').innerText = 
+                        this._('.tabulator-placeholder-contents').innerText =
                             i18n.t('nextcloud-file-picker.no-favorites', {
                                 name: this.nextcloudName,
                             });
@@ -977,7 +983,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
                 '</d:literal>' +
                 '               </d:gte>' +
 
-                
+
                 '               <d:or>' +
                 this.getMimeTypes() +
                 '               </d:or>' +
@@ -996,7 +1002,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
                 '           </d:limit>' +
                 '       </d:basicsearch>' +
                 '   </d:searchrequest>',
-                
+
             })
             .then((contents) => {
                 parseXML(contents.data).then((davResp) => {
@@ -1010,7 +1016,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
                     this.tabulatorTable.setSort([{column: 'lastmod', dir: 'desc'}]);
 
                     if (this._('.tabulator-placeholder-contents')) {
-                        this._('.tabulator-placeholder-contents').innerText = 
+                        this._('.tabulator-placeholder-contents').innerText =
                             i18n.t('nextcloud-file-picker.no-recent-files', {
                                 name: this.nextcloudName,
                             });
@@ -1061,21 +1067,21 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
 
     getMimeTypes() {
         let mimePart = '';
-        
+
         if (this.allowedMimeTypes && this.allowedMimeTypes !== 0 && this.allowedMimeTypes !== '*/*') {
             const mimeTypes = this.allowedMimeTypes.split(',');
-                
+
             mimeTypes.forEach((str) => {
-                mimePart += 
+                mimePart +=
                     '               <d:like>' +
                     '                  <d:prop>' +
                     '                      <d:getcontenttype/>' +
-                    '                  </d:prop>' + 
-                    '                  <d:literal>' + str + '</d:literal>' + 
+                    '                  </d:prop>' +
+                    '                  <d:literal>' + str + '</d:literal>' +
                     '               </d:like>';
             });
         } else {
-                mimePart = 
+                mimePart =
                     '               <d:like>' +
                     '                   <d:prop>' +
                     '                       <d:getcontenttype/>' +
@@ -1239,7 +1245,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
                     this.tabulatorTable.setSort([{column: 'lastmod', dir: 'desc'}]);
 
                     if (this._('.tabulator-placeholder-contents')) {
-                        this._('.tabulator-placeholder-contents').innerText = 
+                        this._('.tabulator-placeholder-contents').innerText =
                             i18n.t('nextcloud-file-picker.no-recent-files', {
                                 name: this.nextcloudName,
                             });
@@ -3004,7 +3010,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
                 left: 0px;
                 top: 1px;
             }
-            
+
             .table-wrapper {
                 max-width: 100%;
                 width: 100%;
@@ -3349,7 +3355,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
                                 <li
                                         class="${classMap({hidden: !this.storeSession})}"
                                         title="${i18n.t('nextcloud-file-picker.log-out')}">
-                                    <a 
+                                    <a
                                         class=""
                                         @click="${() => {
                                             this.logOut();
diff --git a/packages/knowledge-base-web-page-element-view/src/dbp-knowledge-base-web-page-element-view-demo.js b/packages/knowledge-base-web-page-element-view/src/dbp-knowledge-base-web-page-element-view-demo.js
index 84ad091a..b65aaf9a 100644
--- a/packages/knowledge-base-web-page-element-view/src/dbp-knowledge-base-web-page-element-view-demo.js
+++ b/packages/knowledge-base-web-page-element-view/src/dbp-knowledge-base-web-page-element-view-demo.js
@@ -1,4 +1,4 @@
-import {createInstance} from './i18n';
+import {createInstance, setOverridesByGlobalCache} from './i18n';
 import {css, html} from 'lit';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import {AuthKeycloak, LoginButton} from '@dbp-toolkit/auth';
@@ -12,6 +12,7 @@ export class KnowledgeBaseWebPageElementViewDemo extends ScopedElementsMixin(DBP
         super();
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
         this.entryPointUrl = '';
         this.noAuth = false;
     }
@@ -33,6 +34,15 @@ export class KnowledgeBaseWebPageElementViewDemo extends ScopedElementsMixin(DBP
         };
     }
 
+    connectedCallback() {
+      super.connectedCallback();
+
+      // set translation overrides if requested
+      if (this.langDir != '') {
+        setOverridesByGlobalCache(this._i18n, this);
+      }
+    }
+
     update(changedProperties) {
         changedProperties.forEach((oldValue, propName) => {
             if (propName === 'lang') {
diff --git a/packages/knowledge-base-web-page-element-view/src/i18n.js b/packages/knowledge-base-web-page-element-view/src/i18n.js
index 0c6fedc8..930f3538 100644
--- a/packages/knowledge-base-web-page-element-view/src/i18n.js
+++ b/packages/knowledge-base-web-page-element-view/src/i18n.js
@@ -1,4 +1,4 @@
-import {createInstance as _createInstance} from '@dbp-toolkit/common/i18next.js';
+import {createInstance as _createInstance, setOverridesByGlobalCache} from '@dbp-toolkit/common/i18next.js';
 
 import de from './i18n/de/translation.json';
 import en from './i18n/en/translation.json';
@@ -6,3 +6,5 @@ import en from './i18n/en/translation.json';
 export function createInstance() {
     return _createInstance({en: en, de: de}, 'de', 'en');
 }
+
+export {setOverridesByGlobalCache};
diff --git a/packages/knowledge-base-web-page-element-view/src/knowledge-base-web-page-element-view.js b/packages/knowledge-base-web-page-element-view/src/knowledge-base-web-page-element-view.js
index 598075f5..9bf0ddd5 100644
--- a/packages/knowledge-base-web-page-element-view/src/knowledge-base-web-page-element-view.js
+++ b/packages/knowledge-base-web-page-element-view/src/knowledge-base-web-page-element-view.js
@@ -1,4 +1,4 @@
-import {createInstance} from './i18n';
+import {createInstance, setOverridesByGlobalCache} from './i18n';
 import {html} from 'lit';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import {MiniSpinner} from '@dbp-toolkit/common';
@@ -14,6 +14,7 @@ export class KnowledgeBaseWebPageElementView extends ScopedElementsMixin(Adapter
         super();
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
         this.value = '';
         this.html = '';
         this.entryPointUrl = '';
@@ -129,6 +130,13 @@ export class KnowledgeBaseWebPageElementView extends ScopedElementsMixin(Adapter
             .catch();
     }
 
+    connectedCallback() {
+      super.connectedCallback();
+
+      if (this.langDir != '') {
+        setOverridesByGlobalCache(this._i18n, this);
+      }
+    }
     update(changedProperties) {
         changedProperties.forEach((oldValue, propName) => {
             if (propName === 'lang') {
diff --git a/packages/matomo/src/dbp-matomo-demo.js b/packages/matomo/src/dbp-matomo-demo.js
index 18748614..0af5ce76 100644
--- a/packages/matomo/src/dbp-matomo-demo.js
+++ b/packages/matomo/src/dbp-matomo-demo.js
@@ -1,4 +1,4 @@
-import {createInstance} from './i18n.js';
+import {createInstance, setOverridesByGlobalCache} from './i18n.js';
 import {css, html} from 'lit';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import {AuthKeycloak, LoginButton} from '@dbp-toolkit/auth';
@@ -12,6 +12,8 @@ export class MatomoDemo extends ScopedElementsMixin(DBPLitElement) {
         super();
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
+
         this.entryPointUrl = '';
         this.matomoUrl = '';
         this.matomoSiteId = -1;
@@ -37,6 +39,15 @@ export class MatomoDemo extends ScopedElementsMixin(DBPLitElement) {
         };
     }
 
+    connectedCallback() {
+      super.connectedCallback();
+
+      // use translation overrides if path is given
+      if(this.langDir != '') {
+        setOverridesByGlobalCache(this._i18n, this);
+      }
+    }
+
     update(changedProperties) {
         changedProperties.forEach((oldValue, propName) => {
             if (propName === 'lang') {
diff --git a/packages/matomo/src/i18n.js b/packages/matomo/src/i18n.js
index 0c6fedc8..930f3538 100644
--- a/packages/matomo/src/i18n.js
+++ b/packages/matomo/src/i18n.js
@@ -1,4 +1,4 @@
-import {createInstance as _createInstance} from '@dbp-toolkit/common/i18next.js';
+import {createInstance as _createInstance, setOverridesByGlobalCache} from '@dbp-toolkit/common/i18next.js';
 
 import de from './i18n/de/translation.json';
 import en from './i18n/en/translation.json';
@@ -6,3 +6,5 @@ import en from './i18n/en/translation.json';
 export function createInstance() {
     return _createInstance({en: en, de: de}, 'de', 'en');
 }
+
+export {setOverridesByGlobalCache};
diff --git a/packages/notification/src/dbp-notification-demo.js b/packages/notification/src/dbp-notification-demo.js
index 7470f538..f0bfa34b 100644
--- a/packages/notification/src/dbp-notification-demo.js
+++ b/packages/notification/src/dbp-notification-demo.js
@@ -1,4 +1,4 @@
-import {createInstance} from './i18n';
+import {createInstance, setOverridesByGlobalCache} from './i18n';
 import {send as notify} from '@dbp-toolkit/common/notification';
 import {css, html, LitElement} from 'lit';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
@@ -11,6 +11,7 @@ export class NotificationDemo extends ScopedElementsMixin(LitElement) {
         super();
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
     }
 
     static get scopedElements() {
@@ -25,6 +26,15 @@ export class NotificationDemo extends ScopedElementsMixin(LitElement) {
         };
     }
 
+    connectedCallback() {
+      super.connectedCallback();
+
+      // use translation overrides if path is given
+      if(this.langDir != '') {
+        setOverridesByGlobalCache(this._i18n, this);
+      }
+    }
+
     update(changedProperties) {
         changedProperties.forEach((oldValue, propName) => {
             if (propName === 'lang') {
diff --git a/packages/notification/src/i18n.js b/packages/notification/src/i18n.js
index 0c6fedc8..930f3538 100644
--- a/packages/notification/src/i18n.js
+++ b/packages/notification/src/i18n.js
@@ -1,4 +1,4 @@
-import {createInstance as _createInstance} from '@dbp-toolkit/common/i18next.js';
+import {createInstance as _createInstance, setOverridesByGlobalCache} from '@dbp-toolkit/common/i18next.js';
 
 import de from './i18n/de/translation.json';
 import en from './i18n/en/translation.json';
@@ -6,3 +6,5 @@ import en from './i18n/en/translation.json';
 export function createInstance() {
     return _createInstance({en: en, de: de}, 'de', 'en');
 }
+
+export {setOverridesByGlobalCache};
diff --git a/packages/notification/src/notification.js b/packages/notification/src/notification.js
index f1079be4..78e81ab9 100644
--- a/packages/notification/src/notification.js
+++ b/packages/notification/src/notification.js
@@ -1,4 +1,4 @@
-import {createInstance} from './i18n';
+import {createInstance, setOverridesByGlobalCache} from './i18n';
 import {createUUID} from './utils';
 import {css, html} from 'lit';
 import DBPLitElement from '@dbp-toolkit/common/dbp-lit-element';
@@ -11,6 +11,7 @@ export class Notification extends DBPLitElement {
     constructor() {
         super();
         this._i18n = createInstance();
+        this.langDir = '';
         this.lang = this._i18n.language;
     }
 
@@ -64,6 +65,10 @@ export class Notification extends DBPLitElement {
             // mark the event as handled
             e.preventDefault();
         });
+
+        if (this.langDir != '') {
+          setOverridesByGlobalCache(this._i18n, this);
+        }
     }
 
     removeMessageId(messageElementId) {
diff --git a/packages/person-profile/src/dbp-person-profile-demo.js b/packages/person-profile/src/dbp-person-profile-demo.js
index 08e5a30b..f6c07f3d 100644
--- a/packages/person-profile/src/dbp-person-profile-demo.js
+++ b/packages/person-profile/src/dbp-person-profile-demo.js
@@ -1,5 +1,5 @@
 import {AuthKeycloak, LoginButton} from '@dbp-toolkit/auth';
-import {createInstance} from './i18n.js';
+import {createInstance, setOverridesByGlobalCache} from './i18n.js';
 import {css, html} from 'lit';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import DBPLitElement from '@dbp-toolkit/common/dbp-lit-element';
@@ -14,6 +14,7 @@ export class PersonProfileDemo extends ScopedElementsMixin(DBPLitElement) {
         super();
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
         this.entryPointUrl = '';
         this.person = '';
         this.selectedPerson = '';
@@ -74,6 +75,10 @@ export class PersonProfileDemo extends ScopedElementsMixin(DBPLitElement) {
                 that.selectedPerson = $(this).data('object').identifier;
             };
         });
+
+        if (this.langDir != '') {
+          setOverridesByGlobalCache(this._i18n, this);
+        }
     }
 
     static get styles() {
diff --git a/packages/person-profile/src/i18n.js b/packages/person-profile/src/i18n.js
index 0c6fedc8..930f3538 100644
--- a/packages/person-profile/src/i18n.js
+++ b/packages/person-profile/src/i18n.js
@@ -1,4 +1,4 @@
-import {createInstance as _createInstance} from '@dbp-toolkit/common/i18next.js';
+import {createInstance as _createInstance, setOverridesByGlobalCache} from '@dbp-toolkit/common/i18next.js';
 
 import de from './i18n/de/translation.json';
 import en from './i18n/en/translation.json';
@@ -6,3 +6,5 @@ import en from './i18n/en/translation.json';
 export function createInstance() {
     return _createInstance({en: en, de: de}, 'de', 'en');
 }
+
+export {setOverridesByGlobalCache};
diff --git a/packages/person-profile/src/person-profile.js b/packages/person-profile/src/person-profile.js
index 125c1a4d..f073d4f5 100644
--- a/packages/person-profile/src/person-profile.js
+++ b/packages/person-profile/src/person-profile.js
@@ -1,6 +1,6 @@
 import JSONLD from '@dbp-toolkit/common/jsonld';
 import {css, html} from 'lit';
-import {createInstance} from './i18n.js';
+import {createInstance, setOverridesByGlobalCache} from './i18n.js';
 import DBPLitElement from '@dbp-toolkit/common/dbp-lit-element';
 import * as commonStyles from '@dbp-toolkit/common/styles';
 
@@ -9,6 +9,7 @@ export class PersonProfile extends DBPLitElement {
         super();
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
         this.entryPointUrl = '';
         this.jsonld = null;
         this.value = '';
@@ -27,6 +28,14 @@ export class PersonProfile extends DBPLitElement {
         };
     }
 
+    connectedCallback() {
+      super.connectedCallback();
+
+      if (this.langDir != '') {
+        setOverridesByGlobalCache(this._i18n, this);
+      }
+    }
+
     update(changedProperties) {
         changedProperties.forEach((oldValue, propName) => {
             switch (propName) {
diff --git a/packages/person-select/src/dbp-person-select-demo.js b/packages/person-select/src/dbp-person-select-demo.js
index 18ab05f5..363f40dc 100644
--- a/packages/person-select/src/dbp-person-select-demo.js
+++ b/packages/person-select/src/dbp-person-select-demo.js
@@ -1,4 +1,4 @@
-import {createInstance} from './i18n.js';
+import {createInstance, setOverridesByGlobalCache} from './i18n.js';
 import {css, html} from 'lit';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import {PersonSelect} from './person-select.js';
@@ -11,6 +11,7 @@ export class PersonSelectDemo extends ScopedElementsMixin(DBPLitElement) {
     constructor() {
         super();
         this._i18n = createInstance();
+        this.langDir = '';
         this.lang = this._i18n.language;
         this.entryPointUrl = '';
         this.noAuth = false;
@@ -49,6 +50,15 @@ export class PersonSelectDemo extends ScopedElementsMixin(DBPLitElement) {
         ];
     }
 
+    connectedCallback() {
+      super.connectedCallback();
+
+      // set translation overrides if requested
+      if (this.langDir != '') {
+        setOverridesByGlobalCache(this._i18n, this);
+      }
+    }
+
     update(changedProperties) {
         if (changedProperties.has('lang')) {
             this._i18n.changeLanguage(this.lang);
diff --git a/packages/person-select/src/i18n.js b/packages/person-select/src/i18n.js
index 0c6fedc8..930f3538 100644
--- a/packages/person-select/src/i18n.js
+++ b/packages/person-select/src/i18n.js
@@ -1,4 +1,4 @@
-import {createInstance as _createInstance} from '@dbp-toolkit/common/i18next.js';
+import {createInstance as _createInstance, setOverridesByGlobalCache} from '@dbp-toolkit/common/i18next.js';
 
 import de from './i18n/de/translation.json';
 import en from './i18n/en/translation.json';
@@ -6,3 +6,5 @@ import en from './i18n/en/translation.json';
 export function createInstance() {
     return _createInstance({en: en, de: de}, 'de', 'en');
 }
+
+export {setOverridesByGlobalCache};
diff --git a/packages/person-select/src/person-select.js b/packages/person-select/src/person-select.js
index f56fc9b6..cd0bed53 100644
--- a/packages/person-select/src/person-select.js
+++ b/packages/person-select/src/person-select.js
@@ -6,7 +6,7 @@ import select2LangEn from './i18n/en/select2';
 import JSONLD from '@dbp-toolkit/common/jsonld';
 import {css, html} from 'lit';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
-import {createInstance} from './i18n.js';
+import {createInstance, setOverridesByGlobalCache} from './i18n.js';
 import {Icon} from '@dbp-toolkit/common';
 import * as commonUtils from '@dbp-toolkit/common/utils';
 import * as commonStyles from '@dbp-toolkit/common/styles';
@@ -30,6 +30,7 @@ export class PersonSelect extends ScopedElementsMixin(AdapterLitElement) {
         this.auth = {};
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
         this.entryPointUrl = '';
         this.jsonld = null;
         this.$select = null;
@@ -93,6 +94,10 @@ export class PersonSelect extends ScopedElementsMixin(AdapterLitElement) {
             // try an init when user-interface is loaded
             this.initJSONLD();
         });
+
+        if (this.langDir != '') {
+          setOverridesByGlobalCache(this._i18n, this);
+        }
     }
 
     disconnectedCallback() {
@@ -395,7 +400,7 @@ export class PersonSelect extends ScopedElementsMixin(AdapterLitElement) {
                 .select2-bug .loading-results {
                     display: none !important;
                 }
-                
+
                 .select2-results__option.loading-results,
                 {
                     background-image: url("data:image/gif;base64,R0lGODlhTABKAMIFAAAAADU3NF1fXIuNirq8uf///////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQBAQAHACwAAAAATABKAEAD/li63P6NFAmrvXgNAbr/IBhQWWkSQ6iGgTCQJkNwa/daRB0KcFwSAd1HEBF6Rr6kI2UkLoLGnjI5gOp4MmMnMJjGmFopo6oViXGzMsipJKvfRqTXS0BtAvhgS8C/zf8RbkIBgIVgcGZKNB5dJ1ZajYUFgnFiOVpykhePNZmXUZoxZTKcK5GhFYc6YqpCp5KtOq84iLVvXKhptpBnqA8SdyqZvnNAcITEbbtbdAJcvRjGywB5VCvDGKVCLpKL29CxNbOwatgK3lfJDug1Pdoq0L7Srguf9OoVowrznfHE/NdIhFuDDwI7FWzOlfEnyV66JWr8yHunYpwGOAmbwbHo/gDgLRc36ojcMI1hR0rTdj0L5SxlRJOF6hz8KLHgDzvO8GS0OaUOHh3IeCZBQXEHTKEoagUVegHlGyw9OfoYWM4LDVxenCpVFuLovpmYXIj06tED1AxlgZ7VCAoDWFNeUxUFIbXAXLq5tJqq8JagOqp4O5bBis/hqgh3bSBNvBawWaaT7g7rywxyAcoAEpap+w9Tvc2WFeibkDhuIUwkUIfWO4QEZs6+HGceM3oxJFJaduLDDAAiL568x/Fe2rmMbtKDjwOSvaWXLkw1i7Fm4S/xh5U9eR9hmLSW2GgzrIvwkfYWtZ8uYT+Y7rKcegvs28sK9Vx+pb/ibbUwnV17Ee736qDAQX7fhaZEHfvwZ0ICACH5BAEBAAcALAAAAABMAEoAQAP+WLrc/o0UIiu8OOcBuv9gKHqSZmLBqHoCdb6wQqTrV8Z4Xgh1N+jAAqcnYNBqv2CO0AMUGcwmIKnMRHuB22NwlDq1JgrP2wlQcUOyeiU4V1+UwUAQoAfu9PbA9a4SuGshT30ogVJZhA9XUi2JfYdgjlZzXQBalSKIklaYIZoTnSFum1BNZg+hmaNVaU2rEDOGsj2RSn+pswBmtaQRf2Neda+9CwR0uR8BxA6xyCLDjq2BKXfVR5+9gGSnyzHSNcrdOt8j2OIXFGDkIucMcz1Uxk28xIsqms017VC4ZTfrIAa169dB4A4p0BLZU2FQATB49Gw9RIJhIrhGEgl+SFj+TGM5PelCcvEoAiMaZ8i49bmFEsuefZRIejK374IcLnao1TGzJ2LNCZRkhfspQxsyn6SMomzYDeAsmsQstuS40ikyppsWbhPQImQ6SkjfSCUSdp9MXVR/jh2BlaiDtZ7KErW60e0LuHXtLpCDJwKjn3HuZNJyDJzaJoPk0fqptFxHLHIJ5bvHwFTklRqL4dV1+c1kFQw2T2Fsyp2UzkEUU6xsuZ1oAA4aOxb3epVHqIk8mnRHsq0S2eXoaV3x0jPdZD4/kw3ybtuL44P5oAu6xreisyBoVNOVErUQ7C2zp8WgPLwr7xBeh8f9prn5ZCrFARda3O4vaqacyEHfzoIE9F4JAAAh+QQBAQAHACwAAAAATABKAEAD/li63P6NECWhvThLwLv/YChywZSdBRGMLBAI5kUMwgrEaGa3HJ7/wAaPFCwaF6qh78hEJZXN02AUCAyWj8Fu6IIFCQKux3okiM9ccvQ709aqcIF8kMKugU80S26PhvWAHF53eUODd2tmQwGIjQyKPHSOkylcfZSXGVNiko2bXJ2aW4GkIqGJWqUsVpmUC1qjPC9Xrpqqlph/t4uUn6pwLiynibGRTK1fxSKMtU26LbTNzrjSUaDVUZAtyNgYviOH3UVg1NVPsz/fwtxFz9sX6i3hRuRnwxD1gLNXEhUDNMoMsXsUb5eeaHdqGJSF0FwqUisE3BP3YEYVFxfhvJBYzYGiN3eBOHqUEPCWmmYPF4qY1wikyg8T15R8edKRy5djBubQpo9VvzoAt7BcczOSTjANERWkEtNjg6UhBDjdKabEVBQpoV3NkUanU6gevDqdSUIsxULgtlKFovYEzxFmz15re6Koh6Z0Xy2KS5EsAKniaiTVwAVwNZAvWuVrYbXW4mVDFfjt4gpsTgtoVxnOlpVxpseyOo6zG5Wb5ZWRkRSgERLPZMbATJrtjLMqXwW0azNtBFr35cqkd9Wslhvi4JGwXs+63W2Cc+YZEgAAIfkEAQEABwAsAAAAAEwASgBAA/5Yutz+jRRCK7w4ZwG6/2AojqIgaVhArkAgDCckEVwooBnBgjHu/5caawAsGh+qHfHIPBKSu1tzChTuPC4KkEYFDqDXsGjZpVIGA4FAFWi71Jby9CsOw+WMZ32/C/SKA3t+eF06VwGEiXo7iY0TYX+OZYFiMJKEdHyaAJGXCwSZmyuDnhcUa3wvWqUOVqJ9nVOLr6ImVK60fGRNlHu7gBykZnXCrD9go8ZMvUPKTJDOTrghxdE/0zbWR9gg1doozCxS3z7hUbHkEbSqFmdpYN6NobnNxqD09dag3GEuv+kT0Lgh0cYSQAZpcvlDJ4kGPhEB/ilC9nCELTyzKoaRaKYko8ZzZfh9DMGxiCFRbyqcUYOKxDgq5jaabNmCYRVBNlGAKmmE4qic30R+iHdQwckoRVPITCrDJzWmQQ4BBeiUB9QLYa42haXVgUeIUwEKBcCTaUxqYdNVHdrVwdmnbRmM7VC26FoQL7t+JVg33dF+q67u7fNC5zsAeSfSa9OiqkFJbz8mlncX30VPDkcOTTtn7iaiDRM+zAJwX+WhquJ+MqqFc5EEACH5BAEBAAcALAAAAABMAEoAQAP+WLrc/o3IIomyMOv9yABgKI5kaZYCxkFEcL5AkHKE4J6BujYCLOq7oBDiAwmGyKSjVQQqn8LBzeeEWjnSokhWvXojxdx3TC6bF0ytOte19tTwuHiY1s690vaOoD2ex3xFA39lH02EZoZag4hkgXF6jUkeAVMAfpKNlHEglYyZDDWco2xldaOoIwGfSYqpryF3SKd9UANvnZE0ljAzoEO4MAO6vw+8J8TFS4vKk1rJzQ2uJ5jRQsEv0NYK0y/D20HdvdrNoqTgG+LU6NfHIazsdBI25PEbNe6xMsP1f5uwRvpZUQcwhC9CBAuW+OYon0IYq7zQeijHDcVUsmYB5FKNgYIAG3YELsCm5uCOLCQytuIET4mhiFcSkjAp8QtKHwHsQbgpTGcHh1tEgpL5zicEkiVUGp2IwmiHZ06XHYoaCminllGRzqQqzWoMob+8xuDKgOc6sgq0pgSbSSwIrEbdxqjm1NwauPFAckrB1pRcETTtmYXYF6FbvD7tmqCL1mPSwtFuIm4cirLlBQkAACH5BAEBAAcALAAAAABMAEoAQAP+WLrc/o0UQsmQMOutBfhgKI5kWQ7cFpjsF6DYQw0tIKRQHcZ472eeGupHLDpWQqNSSUC2XssokRYS8KTYrHbL7Xo1VJ3Ydc02x+j05/YLiwNlJY3NdLICX+25lucSxHF9S24lVoKHiImKixAUdmgCQ4wEQWpqdHqWmiySRZWboCEXRoRimEQCj51FpXeBjA+PJniwPq0kq7UcgLo+e669Pp8mp8Ebwyavxg23uMspt1DPP5QvytPY2drbzxapNQGG2AOymuKL5KFPh3/qaHB+5e5iuUW/85vXx/ihxb7q4S7MIBdAHgl/tsxNkYdQmBp9HH6NimKwBERfWZDNulhYq52Oht0qiuLGIB04kgw0joCHUoHIDxyDvQTQcsG9EixbUgIXs5dKEfW2NQuRs+VMkONM1ZzwU8Q5kjt5Lr0JdGkDWdKsMnMxUauMnl7Dih1LtqzZs88SAAAh+QQBAQAHACwAAAAATABKAEAD/li63P6LyEmKhDjrTAL4YCiOZFkOm+aZLBBcGDEILShUKUPXH57/wMyuhQoaj45Vy4dsOp/QqHRKrVqv2GxsyOu6ilUC10smB8CpjpnpFH/Ozu6ArT2qW6+6lKLv+/+AgYKDD25lIAE3dHV3h4cCVo2OkyM3TQOUmSaWQQSOeXYCSiFonWMsnGFQmDyQhDmsNYuvhacjoLQpoyW4uRpjAYkDcxa+xsfIycrLzM3Oz30ywbu3AsTHsZpfs1me2iy9V7bfJnBUkuRkqU3o6YelQePua3bawhcyotQt60Dy/Nxq7bPh5F8JV212wQMigx6VAebaeAmXzBuPhcga8ghoOqzdLYzJDH5A+GygCJAZTSLi2FHlG5a+PI6A6etfsH7NPAmbQxOaz59AgwodSrSo0aNIkypdyrTpsgQAIfkEAQEABwAsAAAAAEwASgBAA/5Yutz+jBRCxLgS6s23AGAojmRpmkPWQd/pAkHKVe8pqFpQg/fq/8AG5SL4xILIpHLJbDqf0Kh0Sq1ar9iCQLfrhgbWlndMBoF/BG43IBWLLMD0TpCt2+/4vH7P7/ubNGUgAT17goeFUXKHjCR0SwONki4BODNqXmxKgS83lhqLc1UEAzpHSZGifx0EO5WrsLGys7S1tre4ubq7vL11pG4nhGexpJMhr3qpxyanV8vMO59OmNFeiUuh1oKPSsHbh8Ro32VFKURbkpo+2tfTHtWU4h3QXe9x8SIyQPUvyVGl3tzbENDVFVL/kLQ7MTAWORLOcLXaMU8isAAYHfnaQByBwsaPIEOKHEmypMmTKFOqXMmypcuXMGPKXJUAACH5BAEBAAcALAAAAABMAEoAQAP+WLrc/otIOUiVhcDNOxRAKI5kaZ6n4HUg6gLBkG1W8LrqyhCCTea64K71kwmPyKRyyWw6n9CodEqtWq9Y1m1rAk6J3LB4ZNQRfNyA5nkWq7PwuHxOr9vv+Ly+PR4J1nVofWMBVYKDiD9MA4eJjiVvZo03f0p8boA0PTcVVWAoAV5CNQBlWS1/mXqrrK2ur7CxsrO0tba3uLlHPAGTJL2Vrp+PonGbjy+mVQPIfcpOl819wU3D0tOqo77XhM8r22GhFwPHjtQejIPnHjyDMSvMY95H8WLzEWLrTe1h9xG8KIpJqWciRrYVpET4g5IuRCgMUCwcrCJRl8WLGDNq3MgVsaPHjyBDihxJsqTJkyhTqlzJskACACH5BAEBAAcALAAAAABMAEoAQAP+WLrc/o2QQQcpF+rN9QBgKI5kaZpD1w3B6QZX9kyt6wpqru+OYIc4nnAI+QACSAFFopARn9CodEqtWq/YrHaLNf6+okAq6wWbzyKBk0jwkYJTQg0c4GLdNph9z+/7/4CBgoMdNGhpa314h2h6V3OMkSSOQwSSl19jQm2QJmpsnV9wTyxHmlZtZnWEO4sup6wdoSWwsba3uLm6u7y9vr/AwcJ7EgKzkxa5cpgiyX+lzK92ltFntVKu1apUZdqMlELd3pKjOamXAQJKFgPGx6qJHBLvtPEa543XKtAm9jvUZ8r9MxYi3Z2AUdp80kJvhD5d/F74yxXxhMBe4voNy1YiMJ2zYBMsTBxGsqTJkyhTqlzJsqXLlzBjypxJs6bNm1oSAAAh+QQBAQAHACwAAAAATABKAEAD/li63P6LFCKplTDrnQX4YCiOZFkGGKdOgxkGaPpQgWsHa67vkx0KvKDQ0fIBh8gdwQfAJZ/QqHRKrVqvWOWgxuyCjtWld0z+yqDbj+A8LHpRWarH54xDCVwX3J4lDAZsfIKDhIWGHAMCeWVrh3NlZXtTj5CVI5JDBJSWnCIDUW4vjUF4kIFCp0+bLqOHOosun646pT6pszOwJJi4GrV6t70MFH+KumDCycrLzM3Oz9DRfYkwNwGAyn66lsiCmp0+sli/4F3dT9/llbykoerrwRvp753nPKt0AtjEiuDxiHpaqZhHxh6PNCDYHdymJwoebFLIGZE2gSEJcdHcufjXPUtiCYHQENrAGA3fCIPNxNygqMDjJZYVmcB0KaKOtFIWm8BsYIEaF5I7gwodSrSo0aNIkypdyrSp06dREgAAIfkEAQEABwAsAAAAAEwASgBAA/5Yutz+jEgyZCEw670H+GAojmRZClz6COYXoFhGBW0dqHiuX7W4/0CHp4cKGnXDmiB2bEIGtB6A6axqkiCqdcvter2EqHT8GXwVLLJ6DQhoqyxzlcCWn7fi2vtulLr5TXRSe4AqMz12hYqLjE4UaWwBiYyQbGs3XViWmyOEP5WcoSCTR6AApDmmg407YWqerBpkRbE5miaotRqCPbo5rjawvgyqI7TDMmPHyA7FJLnMDQTO0NG7NEvW2tvc3dN5JS8V1tOiIJKx4OadfMDrY8I/t+9jf4H0oval+KGYTfMmXiyZMECAOjbxVABEh2TTMiNJ9AXhRcafIy7u/HSLcFnwxEYGAJ99XBBShMSNzkIwHFmgo4iH3jSyVDBm5gWX5xIOy3hCp6+SIGBu41miWrSUIWYiHTWSqMeRUKRkm+k0p80F5UZYvEpSjFCuF6aCHUu2rNmzaNMmAAAh+QQBAQAHACwAAAAATABKAEAD/li63P6MFEJVhTjrTAL4YCiOZEkKW/p0JhAIkkYIbR2oeK5PdYjuwGCE1gPEhEgcoQhIOmXMwPGJnDFDgQF1S7Rpt+Dwk+K5Xr9iS9nMZv7EHbSTdYWl7+va9D5m7vlCSz1SgEIDZnKFHF1mf4o4hyJZjxAUAnlXL46KA5htUZtIkZ+kJIRUdKWqIYlJqQACrUqMV6GUKZ4tt1WjNW+7O68mv8A5vS22xRDHJsnKDrQlxM8cbtQbBMwmstcT2i3cxd9Fdt0N4yXh5hO5H5rrKjMv6sUUA5ft7uXwVqvu9Gn6+SsxCVC2fANHANzRKeGnU06iOTQDsQrCib5QXfQRjmuCvUv+nMXLlUXkgmykpgUqsy9QmwEmU8QciQheho0gFnZDJ2LmM2EmbFYrorMbzhtCIUgk4VOZoB5JK/mJ6uCpHqrnyDUFBpREUWpLR2zdFVbE13o4YY191LBIRZsoM63lc48NUnj30opQSa3roLl3eI4oGNXvYJhYLfRombjA0reN1YAoGZnDhcq7EgAAIfkEAQEABwAsAAAAAEwASgBAA/5Yutz+jMhJSoU460wC+GAojmRJCtemOsRABqjEDa5pA0G67vxK3CJdb0hk1G6CorI48NwCy6jqCBRKlQQBcBQYXDHUrRjn/fIkNIEgwG7DaBar+dwci3NzTMfO30LzEWZ7dnKAV4NPhoaIJniKX2ElXY9LdWJJiox9W2WPmpsgXYWUC1lOdm+jlANaoHYoiq2usziqTKe0oJ2CrbBKsoSkUp82tsIrY7vHRcQjystDP0C+0EV+xtUPWZzZQ5ElmN0q25fiGuRjf48ubwMUaKy4fOGewLkiosfS96HPwmuuPAjwZy6OGjaN1Mgo2KCFPVDUoLWQx++Do3oUK54A1KhMY6MvF9B5vINtR8eRL+ZMfKLGXYUWTTIG4yUiRg9L8/JkiXiLjzqGGWRKArrhZE2iG76VIIh0gVIuTTU8LFES6NQR9KKyuKYVgtFaXbUJDRFW2xaeZZ+G+FlWwVgQTJt+BdvWwlu4dd3eyat2RNVsfZ11lXC1mLCFHES++lvkoZt7FyntQzlJH0qLcXUWnhX52OZNAxlfCXzHHdCJCO+Ezqvg5ctjCQAAIfkEAQEABwAsAAAAAEwASgBAA/5Yutz+jRAlJbw4azqA/2AojiQ4bKjWeYFgYdIQlDQQTGmub3IN7sCgQ+Cz4YTIFKEY2BFkp6RqVjw+esVP65XCZj9W3epL9gWiUudgIBDMAvBWu5JOP+Hl2rmeIxDzgB8CfIQPfmQuhYoLBFQ+i4tLVZB8knpohn6OIwNhUmNFmBmNgaWXil6mJImUMAUyf4idrReHqkWstJa3WYO0sSNUwLe+lJ45bmVNtGnDNaLMQZs0xdFCu9TWSaA02kikesfeG86c4uO1vUqNm9CV3DTujNM1uUjlNOcR+L2ddDEy6H2xlwMeL0D61Ag8GOJMQkJP+GVpIQ8do4htqGyi+MnQW0ReBKM9YRisoxRwJEnc0LUwpaA64iS6tNEq1UwR1Qqh1CJgTYEKnQKqqiiFSMhRNpkQtcggaT2mKGypg4qiJU6qKJxywroBWz6uGmS+BJthItkMYj2YpOqVxFKyWdZC1Qpi2VkIBq/ehZDlLde0K4HIvddXxx0Wgw1bBZETBr7GdfKWRLrYht+odEUExpC27mVDbJSZ7NywZ1dNgCDDqMzkDetwQSTffHby9c09lUgz3IzKtqnE14Qe3IL1jm+Oew1RsAA8RwIAIfkEAQEABwAsAAAAAEwASgBAA/5Yutz+jRQiK7w4a0wC+GAojmQ4bGi6UFkllDAYSGptc7EYRO8X/ILBgHUrNga5j4BW6OWYRtvAk9sxOskPNIpBZgGnC+ErWm5bBCcZcE5h1/BYIMy1EQZBQUD/2++FRHWCC2pxIXttgypehl8CipAPaXB0kZYFVFVMb3KJlwxZVgpjWZWfDIUwphOMWYGCd5lJjyhTjbdVq3W2uCU/uqcOsbKzQZ7BEJO9I7TIycsxzc6EMj59AMSGwNMasXHH3BrZMeDhHOMk2+YbX3Sc5OsToUzoh+WW775MrTBL644N6tnjxg/GDAcF+wVLpfBCwmj3NDCMoe7KxFACjFWgcPvnhUCIRXhBu3UQkp6RSfaY6/hRzo9X8YR15NOnT8YhMGM2OInLmM4rLdfM+fmwV8l1RZf5qxNRGUodK4P2DDfmD8cJrIRILRFxXT6AP1ts9RG220USosqK2SpNLYSkIrr+JDXLrQa4PirhAWRB7VkQlQQCkTvo64i0LY9STUzDsA7CsP5iaxwUMtNQKySDiadZGl5sXttZzLJ0mlRTdHO0PaUZwOomX9JecprkQmswlu+u2UY7FySRKcH1nlVRLJzSGT6TMNOiAJ6xIF6fg3YNOtrcwJ9q40JBe5w5uSXdRqk4UgfrcIaGm4Le1xC1z6UCeW83GdYJOS0lAAAh+QQBAQAHACwAAAAATABKAEAD/li63P6PyEKgvTjrGID/YCgCQrVBwziYp0UMQjfOn4ARAh2WbU/pIkcOCBj4jg0ZkaXUsZBHAhEQaBCatMATihlgZ9rLdboz9nDfJdRLbrcDZm50AIt1AgGBXr+S+31SbXp/KFtnQ240cRpjQHmGfiluiwuNQDyEGWkjT2SZLZZZLIFqnzdkkJJkNqZsZJQuiImzb5BcL3i0jnCmhKoiHQJ9vb2hgrDEPZuJyCeucLYZXrnLq9EOxiB5xdUz1zhkvMS/pQ3kNJjJCtlgVlNV6hGrDN1U18nnMwye8RZT6bLQ9XsQcAarBfXsDVTg6tKDfAbvQQGH6gJERRIzsNPR/gxbQUHCJlCQQCeGLhIZPZ5cCWyYL5aJ0g3EtRJPyIVr7uDJEzIlTmnvoP080rCNy6GndD1CKiahDnFMhcD00FEDm6oZPp7EGkEWVEAjX9hR2qIoiKN+0Mw6aJGIzJdu4Fm4KIJtJlL/XAjy6cNkXmwJw/SjGwKW1hCCBxL+kPjHFK6fDhdmsJgK08D0HjOtnJgf0o0h9k2JCpoxkyl8M71jIfkD5FZ/GSZMLae06yT/aENp/cGB2YgLeVNVmbuf07frhHtA/qdy71iTdEdw7qFx10TWe/x2dMJvzBX3xOqyq9FpOPOikCifqlnOdvbvXm+wDX9yMrX1gYmcOQ2+EdCoDKCRCxHBoAXgCRLsl0wCACH5BAEBAAcALAAAAABMAEoAQAP+WLrc/jDKSSkRIOsNQm0EJwrEF2FiygXkdwVqnA1ldMlba+7KjWcCB+w34Bkfgx8g2BviiseoIqmsNZUBqLQycD4lBC82YHW9lJwyr4tut7NbKYEwGAgC+A5eIKhr44AFdE5MR0NZaoFTYjhkJihtfxaMMXCKBXdviQpohZcSkDIeC2E/jp8fWFZURKgTbK0OrEqSgbONnq+UbrymtYB8vZ2/rhBzW5vFDqUpyROhGn3FsLEuuyu5PMy8oxS3bc7L0KbHUWHXKafG6BuWrtSNm98q2crjKpLzIurKIPcif9h1INZPkMBuIWgVhKBPhBWBHcK52iaqAUR+BeFVStT+EKDELR05ECwQcsRHC/9ijGTgQxgLEnNi0rEDkd5JJMJW5BT5ic7OXogWsjyTE0afm0KTLqSDAamsoEpJacT44RbUfkRT1JtAkYOOTxpVOMVUJZBPTSYSolnJVRjbK27cpU354yRdGV+91dTAYqygTHHflmyX1xzgta/cvNWmOMJgIH5dPAbwq2uMyIyx1LqrAfORtWUsN4sqCE2ZwVsLcl5CarVnOarginptDiIp06Rly7itMPfjGqL35SarhMFqALQz//CkFkdh1YiNd1J6vF715GBqbm1ZDdXkbg+4dwc0OSKFvUAWMzzO9+RZbleNkWTPc0dwbnrQq6BaVf8tz/FHhPUfN+pVkNWAnWC3Dnr+waQUUwhmgAcNw7E0Hx5iULIHhRXaJ4hMQiUAACH5BAEBAAcALAAAAABMAEoAQAP+WLrc/jDKSSkJIOvNcyCVQ2gCGEJDp3aBMJhnca2qQAk0Z8e8jOckBzDYKzJSw50MM4QZi0hgoDEbApzPSVSKbQyYVk+pR/iFPYNn9cyWprNGAmEwEAgC+Hygnu7C1V85Sn+EW20ZbydmKokhYEN7fkVzj1wPhjSDhBJzYQwjVo2bFpUqUwuBTaMVmKaiCq00r3+pVqcVoIe6YXurMl+luxyRvjFzdxuzxWprQGNxy7VtkhLSAC1ZzbvKD2WQ1CLBNHhyauLj4No53HDW6A+LgsvwYaLxNODL9Qu5QOzz/TKZCIhv3gRbMO7VMBhBYYdG3qzkGxWrgyZYZ14YdLj+MEJFU8+ycVxxEUJEXS3oyFkpp865JBNRCJvJKKailzSHaWT4yR0bPC54kjkWUighSsH+GbXgc9hSI8h4PUlR9Ki6b2QWfdjUNBSPqwCUVstZMgJBnWRw5khZLsTHDbdYqR1WNcZIFkrltKlbJOq+sRmLveXAbTCReXeTXZp7RejZFV14iT06V5PhsE9lhHGSOENmBZ2VgNXxWTNW06pKq92KGojNVaM38Js7GbbakKFLG47bVQPrpbE1iJobl2dwD1h6H+bJ+NVJSwaPI4fAuFc0NuAYZyg76bLwG20+vBbRmYNNv2da8P1UoM4u7ia1r82T89r4I/Lrj6vtMb8nft/8WVDefwCsd9SAu+ARIBx3+Lfffb60ZMc1vNgBYWkyZKghQwkAADs=")
diff --git a/packages/provider/src/dbp-provider-demo.js b/packages/provider/src/dbp-provider-demo.js
index becd642c..f2d0d982 100644
--- a/packages/provider/src/dbp-provider-demo.js
+++ b/packages/provider/src/dbp-provider-demo.js
@@ -1,4 +1,4 @@
-import {createInstance} from './i18n.js';
+import {createInstance, setOverridesByGlobalCache} from './i18n.js';
 import {css, html} from 'lit';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import {AuthKeycloak, LoginButton} from '@dbp-toolkit/auth';
@@ -14,6 +14,7 @@ class ProviderDemo extends ScopedElementsMixin(DBPLitElement) {
         super();
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
     }
 
     static get scopedElements() {
@@ -34,6 +35,14 @@ class ProviderDemo extends ScopedElementsMixin(DBPLitElement) {
         };
     }
 
+    connectedCallback() {
+      super.connectedCallback();
+
+      if (this.langDir != '') {
+        setOverridesByGlobalCache(this._i18n, this);
+      }
+    }
+
     attributeChangedCallback(name, oldValue, newValue) {
         console.debug(
             'ProviderDemo (' +
@@ -146,7 +155,7 @@ class ProviderDemo extends ScopedElementsMixin(DBPLitElement) {
                         </div>
                     </dbp-provider>
                 </dbp-provider>
-                
+
                 <h2> DBP Provider Adapter</h2>
                 <p> The dbp-provider is for third party webcomponents, which we want to configure with a provider.</p>
                 <pre>&lt;dbp-provider  id="demoadapter"  dbp-style-red="color:red;" dbp-style-green="color:green;" >&lt;/dbp-provider&gt;</pre>
diff --git a/packages/provider/src/i18n.js b/packages/provider/src/i18n.js
index 0c6fedc8..930f3538 100644
--- a/packages/provider/src/i18n.js
+++ b/packages/provider/src/i18n.js
@@ -1,4 +1,4 @@
-import {createInstance as _createInstance} from '@dbp-toolkit/common/i18next.js';
+import {createInstance as _createInstance, setOverridesByGlobalCache} from '@dbp-toolkit/common/i18next.js';
 
 import de from './i18n/de/translation.json';
 import en from './i18n/en/translation.json';
@@ -6,3 +6,5 @@ import en from './i18n/en/translation.json';
 export function createInstance() {
     return _createInstance({en: en, de: de}, 'de', 'en');
 }
+
+export {setOverridesByGlobalCache};
diff --git a/packages/qr-code-scanner/src/dbp-qr-code-scanner-demo.js b/packages/qr-code-scanner/src/dbp-qr-code-scanner-demo.js
index 248b91e2..df27f246 100644
--- a/packages/qr-code-scanner/src/dbp-qr-code-scanner-demo.js
+++ b/packages/qr-code-scanner/src/dbp-qr-code-scanner-demo.js
@@ -1,4 +1,4 @@
-import {createInstance} from './i18n';
+import {createInstance, setOverridesByGlobalCache} from './i18n';
 import {css, html, LitElement} from 'lit';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import * as commonUtils from '@dbp-toolkit/common/utils';
@@ -10,6 +10,7 @@ export class QrCodeScannerDemo extends ScopedElementsMixin(LitElement) {
         super();
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
     }
 
     static get scopedElements() {
@@ -24,6 +25,12 @@ export class QrCodeScannerDemo extends ScopedElementsMixin(LitElement) {
         };
     }
 
+    connectedCallback() {
+      if (this.langDir != '') {
+        setOverridesByGlobalCache(this._i18n, this);
+      }
+    }
+
     update(changedProperties) {
         if (changedProperties.has('lang')) {
             this._i18n.changeLanguage(this.lang);
@@ -37,7 +44,7 @@ export class QrCodeScannerDemo extends ScopedElementsMixin(LitElement) {
             ${commonStyles.getThemeCSS()}
             ${commonStyles.getGeneralCSS()}
             ${commonStyles.getButtonCSS()}
-            
+
             h1 {
                 margin-bottom: 20px;
             }
diff --git a/packages/qr-code-scanner/src/i18n.js b/packages/qr-code-scanner/src/i18n.js
index 0c6fedc8..930f3538 100644
--- a/packages/qr-code-scanner/src/i18n.js
+++ b/packages/qr-code-scanner/src/i18n.js
@@ -1,4 +1,4 @@
-import {createInstance as _createInstance} from '@dbp-toolkit/common/i18next.js';
+import {createInstance as _createInstance, setOverridesByGlobalCache} from '@dbp-toolkit/common/i18next.js';
 
 import de from './i18n/de/translation.json';
 import en from './i18n/en/translation.json';
@@ -6,3 +6,5 @@ import en from './i18n/en/translation.json';
 export function createInstance() {
     return _createInstance({en: en, de: de}, 'de', 'en');
 }
+
+export {setOverridesByGlobalCache};
diff --git a/packages/qr-code-scanner/src/qr-code-scanner.js b/packages/qr-code-scanner/src/qr-code-scanner.js
index e1ffcd07..bf50eb9a 100644
--- a/packages/qr-code-scanner/src/qr-code-scanner.js
+++ b/packages/qr-code-scanner/src/qr-code-scanner.js
@@ -1,4 +1,4 @@
-import {createInstance} from './i18n';
+import {createInstance, setOverridesByGlobalCache} from './i18n';
 import {css, html, unsafeCSS} from 'lit';
 import DBPLitElement from '@dbp-toolkit/common/dbp-lit-element';
 import * as commonStyles from '@dbp-toolkit/common/styles';
@@ -122,6 +122,7 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
         super();
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
 
         this._askPermission = false;
         this._loading = false;
@@ -175,6 +176,10 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
         if (!this.stopScan) {
             await this.startScanning();
         }
+
+        if (this.langDir != '') {
+          setOverridesByGlobalCache(this._i18n, this);
+        }
     }
 
     async disconnectedCallback() {
@@ -446,7 +451,7 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
             ${commonStyles.getGeneralCSS()}
             ${commonStyles.getSelect2CSS()}
             ${commonStyles.getButtonCSS()}
-            
+
             #loadingMessage {
                 text-align: center;
                 padding: 40px;
diff --git a/packages/resource-select/src/dbp-resource-select-demo.js b/packages/resource-select/src/dbp-resource-select-demo.js
index 7fad3a5d..4c550238 100644
--- a/packages/resource-select/src/dbp-resource-select-demo.js
+++ b/packages/resource-select/src/dbp-resource-select-demo.js
@@ -1,4 +1,4 @@
-import {createInstance} from './i18n.js';
+import {createInstance, setOverridesByGlobalCache} from './i18n.js';
 import {css, html} from 'lit';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import {ResourceSelect} from './resource-select.js';
@@ -12,6 +12,7 @@ export class ResourceSelectDemo extends ScopedElementsMixin(DBPLitElement) {
         super();
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
         this.entryPointUrl = '';
         this.noAuth = false;
     }
@@ -33,6 +34,15 @@ export class ResourceSelectDemo extends ScopedElementsMixin(DBPLitElement) {
         };
     }
 
+    connectedCallback() {
+      super.connectedCallback();
+
+      // set translation overrides if requested
+      if (this.langDir != '') {
+        setOverridesByGlobalCache(this._i18n, this);
+      }
+    }
+
     update(changedProperties) {
         if (changedProperties.has('lang')) {
             this._i18n.changeLanguage(this.lang);
diff --git a/packages/resource-select/src/i18n.js b/packages/resource-select/src/i18n.js
index 0c6fedc8..930f3538 100644
--- a/packages/resource-select/src/i18n.js
+++ b/packages/resource-select/src/i18n.js
@@ -1,4 +1,4 @@
-import {createInstance as _createInstance} from '@dbp-toolkit/common/i18next.js';
+import {createInstance as _createInstance, setOverridesByGlobalCache} from '@dbp-toolkit/common/i18next.js';
 
 import de from './i18n/de/translation.json';
 import en from './i18n/en/translation.json';
@@ -6,3 +6,5 @@ import en from './i18n/en/translation.json';
 export function createInstance() {
     return _createInstance({en: en, de: de}, 'de', 'en');
 }
+
+export {setOverridesByGlobalCache};
diff --git a/packages/resource-select/src/resource-select.js b/packages/resource-select/src/resource-select.js
index ec19718c..151e3408 100644
--- a/packages/resource-select/src/resource-select.js
+++ b/packages/resource-select/src/resource-select.js
@@ -1,7 +1,7 @@
 import $ from 'jquery';
 import select2 from 'select2';
 import select2CSSPath from 'select2/dist/css/select2.min.css';
-import {createInstance} from './i18n.js';
+import {createInstance, setOverridesByGlobalCache} from './i18n.js';
 import {css, html} from 'lit';
 import * as commonUtils from '@dbp-toolkit/common/utils';
 import * as commonStyles from '@dbp-toolkit/common/styles';
@@ -21,6 +21,7 @@ export class ResourceSelect extends AdapterLitElement {
 
         this.auth = {};
         this.lang = this._i18n.language;
+        this.langDir = '';
         this.entryPointUrl = null;
         this.resourcePath = null;
         this.value = null;
@@ -57,6 +58,11 @@ export class ResourceSelect extends AdapterLitElement {
         super.connectedCallback();
         document.addEventListener('click', this._onDocumentClicked);
         this._updateAll();
+
+        // set translation overrides if requested
+        if (this.langDir != '') {
+          setOverridesByGlobalCache(this._i18n, this);
+        }
     }
 
     disconnectedCallback() {
diff --git a/packages/theme-switcher/src/theme-switcher.js b/packages/theme-switcher/src/theme-switcher.js
index 4d7374e9..2370f803 100644
--- a/packages/theme-switcher/src/theme-switcher.js
+++ b/packages/theme-switcher/src/theme-switcher.js
@@ -1,4 +1,4 @@
-import {createInstance} from './i18n.js';
+import {createInstance, setOverridesByGlobalCache} from './i18n.js';
 import {html, css} from 'lit';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import {AdapterLitElement, Icon} from '@dbp-toolkit/common';
@@ -10,6 +10,8 @@ export class ThemeSwitcher extends ScopedElementsMixin(AdapterLitElement) {
         super();
 
         this._i18n = createInstance();
+        this.langDir = '';
+
         this.lang = this._i18n.language;
         this.themes = [];
         this.boundCloseAdditionalMenuHandler = this.hideModeMenu.bind(this);
@@ -57,6 +59,10 @@ export class ThemeSwitcher extends ScopedElementsMixin(AdapterLitElement) {
             this.loadTheme('light-theme');
             this.detectInitialMode();
         });
+
+        if(this.langDir != '') {
+          setOverridesByGlobalCache(this._i18n, this);
+        }
     }
 
     detectInitialMode() {
diff --git a/packages/tooltip/src/dbp-tooltip-demo.js b/packages/tooltip/src/dbp-tooltip-demo.js
index 59d4025c..c6f86e70 100644
--- a/packages/tooltip/src/dbp-tooltip-demo.js
+++ b/packages/tooltip/src/dbp-tooltip-demo.js
@@ -1,4 +1,4 @@
-import {createInstance} from './i18n.js';
+import {createInstance, setOverridesByGlobalCache} from './i18n.js';
 import {css, html} from 'lit';
 import {ScopedElementsMixin} from '@open-wc/scoped-elements';
 import * as commonUtils from '@dbp-toolkit/common/utils';
@@ -13,6 +13,7 @@ export class TooltipDemo extends ScopedElementsMixin(DBPLitElement) {
         super();
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
     }
 
     static get scopedElements() {
@@ -30,6 +31,15 @@ export class TooltipDemo extends ScopedElementsMixin(DBPLitElement) {
         };
     }
 
+    connectedCallback() {
+      super.connectedCallback();
+
+      // set translation overrides if requested
+      if (this.langDir != '') {
+        setOverridesByGlobalCache(this._i18n, this);
+      }
+    }
+
     update(changedProperties) {
         changedProperties.forEach((oldValue, propName) => {
             if (propName === 'lang') {
diff --git a/packages/tooltip/src/i18n.js b/packages/tooltip/src/i18n.js
index 0c6fedc8..930f3538 100644
--- a/packages/tooltip/src/i18n.js
+++ b/packages/tooltip/src/i18n.js
@@ -1,4 +1,4 @@
-import {createInstance as _createInstance} from '@dbp-toolkit/common/i18next.js';
+import {createInstance as _createInstance, setOverridesByGlobalCache} from '@dbp-toolkit/common/i18next.js';
 
 import de from './i18n/de/translation.json';
 import en from './i18n/en/translation.json';
@@ -6,3 +6,5 @@ import en from './i18n/en/translation.json';
 export function createInstance() {
     return _createInstance({en: en, de: de}, 'de', 'en');
 }
+
+export {setOverridesByGlobalCache};
diff --git a/packages/typescript-example/src/i18n.ts b/packages/typescript-example/src/i18n.ts
index 0c6fedc8..930f3538 100644
--- a/packages/typescript-example/src/i18n.ts
+++ b/packages/typescript-example/src/i18n.ts
@@ -1,4 +1,4 @@
-import {createInstance as _createInstance} from '@dbp-toolkit/common/i18next.js';
+import {createInstance as _createInstance, setOverridesByGlobalCache} from '@dbp-toolkit/common/i18next.js';
 
 import de from './i18n/de/translation.json';
 import en from './i18n/en/translation.json';
@@ -6,3 +6,5 @@ import en from './i18n/en/translation.json';
 export function createInstance() {
     return _createInstance({en: en, de: de}, 'de', 'en');
 }
+
+export {setOverridesByGlobalCache};
diff --git a/packages/typescript-example/src/typescript-example.ts b/packages/typescript-example/src/typescript-example.ts
index 3df50f67..a80bb0de 100644
--- a/packages/typescript-example/src/typescript-example.ts
+++ b/packages/typescript-example/src/typescript-example.ts
@@ -1,22 +1,34 @@
 import {html, LitElement} from 'lit';
-import {createInstance} from './i18n';
+import {createInstance, setOverridesByGlobalCache} from './i18n';
 
 export class TypeScriptExample extends LitElement {
     private _i18n;
+    private langDir;
 
     constructor() {
         super();
 
         this._i18n = createInstance();
         this.lang = this._i18n.language;
+        this.langDir = '';
     }
 
     static get properties() {
         return {
             lang: {type: String},
+            langDir: {type: String},
         };
     }
 
+    connectedCallback() {
+      super.connectedCallback();
+
+      // set translation overrides if requested
+      if (this.langDir != '') {
+        setOverridesByGlobalCache(this._i18n, this);
+      }
+    }
+
     update(changedProperties) {
         if (changedProperties.has('lang')) {
             this._i18n.changeLanguage(this.lang);
-- 
GitLab