Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • 987FCF504483CBC8/toolkit
1 result
Select Git revision
Show changes
Commits on Source (39)
Showing
with 69 additions and 60 deletions
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
"scripts": { "scripts": {
"test": "lerna run test", "test": "lerna run test",
"build": "lerna run build", "build": "lerna run build",
"i18next": "lerna run i18next",
"version-patch": "lerna version patch", "version-patch": "lerna version patch",
"version-minor": "lerna version minor", "version-minor": "lerna version minor",
"version": "lerna version", "version": "lerna version",
......
module.exports = {
input: [
'src/*.js',
],
output: './',
options: {
debug: false,
removeUnusedKeys: true,
func: {list: ['i18n.t', '_i18n.t']},
lngs: ['en','de'],
resource: {
loadPath: 'src/i18n/{{lng}}/{{ns}}.json',
savePath: 'src/i18n/{{lng}}/{{ns}}.json'
},
},
}
...@@ -31,7 +31,8 @@ ...@@ -31,7 +31,8 @@
"rollup-plugin-copy": "^3.1.0", "rollup-plugin-copy": "^3.1.0",
"rollup-plugin-delete": "^2.0.0", "rollup-plugin-delete": "^2.0.0",
"rollup-plugin-emit-ejs": "^3.1.0", "rollup-plugin-emit-ejs": "^3.1.0",
"rollup-plugin-serve": "^1.0.1" "rollup-plugin-serve": "^1.0.1",
"i18next-scanner": "^3.0.0"
}, },
"dependencies": { "dependencies": {
"@dbp-toolkit/auth": "^0.2.2", "@dbp-toolkit/auth": "^0.2.2",
...@@ -47,6 +48,7 @@ ...@@ -47,6 +48,7 @@
"universal-router": "^9.0.1" "universal-router": "^9.0.1"
}, },
"scripts": { "scripts": {
"i18next": "i18next-scanner",
"build": "npm run build-local", "build": "npm run build-local",
"build-local": "rollup -c", "build-local": "rollup -c",
"build-test": "rollup -c --environment BUILD:test", "build-test": "rollup -c --environment BUILD:test",
......
import {createI18nInstance} from './i18n.js'; import {createInstance} from './i18n.js';
import {html, css} from 'lit-element'; import {html, css} from 'lit-element';
import {ScopedElementsMixin} from '@open-wc/scoped-elements'; import {ScopedElementsMixin} from '@open-wc/scoped-elements';
import {LanguageSelect} from '@dbp-toolkit/language-select'; import {LanguageSelect} from '@dbp-toolkit/language-select';
...@@ -15,18 +15,16 @@ import {appWelcomeMeta} from './dbp-app-shell-welcome.js'; ...@@ -15,18 +15,16 @@ import {appWelcomeMeta} from './dbp-app-shell-welcome.js';
import {MatomoElement} from "@dbp-toolkit/matomo/src/matomo"; import {MatomoElement} from "@dbp-toolkit/matomo/src/matomo";
import DBPLitElement from "@dbp-toolkit/common/dbp-lit-element"; import DBPLitElement from "@dbp-toolkit/common/dbp-lit-element";
const i18n = createI18nInstance();
/** /**
* In case the application gets updated future dynamic imports might fail. * In case the application gets updated future dynamic imports might fail.
* This sends a notification suggesting the user to reload the page. * This sends a notification suggesting the user to reload the page.
* *
* uage: importNotify(import('<path>')); * usage: importNotify(import('<path>'));
* *
* @param i18n
* @param {Promise} promise * @param {Promise} promise
*/ */
const importNotify = async (promise) => { const importNotify = async (i18n, promise) => {
try { try {
return await promise; return await promise;
} catch (error) { } catch (error) {
...@@ -43,7 +41,6 @@ const importNotify = async (promise) => { ...@@ -43,7 +41,6 @@ const importNotify = async (promise) => {
export class AppShell extends ScopedElementsMixin(DBPLitElement) { export class AppShell extends ScopedElementsMixin(DBPLitElement) {
constructor() { constructor() {
super(); super();
this.lang = i18n.language;
this.activeView = ''; this.activeView = '';
this.entryPointUrl = ''; this.entryPointUrl = '';
this.subtitle = ''; this.subtitle = '';
...@@ -62,6 +59,8 @@ export class AppShell extends ScopedElementsMixin(DBPLitElement) { ...@@ -62,6 +59,8 @@ export class AppShell extends ScopedElementsMixin(DBPLitElement) {
this.buildTime = ''; this.buildTime = '';
this._loginStatus = 'unknown'; this._loginStatus = 'unknown';
this._roles = []; this._roles = [];
this._i18n = createInstance();
this.lang = this._i18n.language;
this.matomoUrl = ''; this.matomoUrl = '';
this.matomoSiteId = -1; this.matomoSiteId = -1;
...@@ -271,7 +270,7 @@ export class AppShell extends ScopedElementsMixin(DBPLitElement) { ...@@ -271,7 +270,7 @@ export class AppShell extends ScopedElementsMixin(DBPLitElement) {
*/ */
updateLangIfChanged(lang) { updateLangIfChanged(lang) {
// in case the language is unknown, fall back to the default // in case the language is unknown, fall back to the default
if (!i18n.languages.includes(lang)) { if (!this._i18n.languages.includes(lang)) {
lang = this.lang; lang = this.lang;
} }
if (this.lang !== lang) { if (this.lang !== lang) {
...@@ -287,10 +286,9 @@ export class AppShell extends ScopedElementsMixin(DBPLitElement) { ...@@ -287,10 +286,9 @@ export class AppShell extends ScopedElementsMixin(DBPLitElement) {
changedProperties.forEach((oldValue, propName) => { changedProperties.forEach((oldValue, propName) => {
switch (propName) { switch (propName) {
case 'lang': case 'lang':
i18n.changeLanguage(this.lang); this._i18n.changeLanguage(this.lang);
// For screen readers // For screen readers
document.documentElement.setAttribute("lang", this.lang); document.documentElement.setAttribute("lang", this.lang);
i18n.changeLanguage(this.lang);
this.router.update(); this.router.update();
this.subtitle = this.activeMetaDataText("short_name"); this.subtitle = this.activeMetaDataText("short_name");
...@@ -420,7 +418,7 @@ export class AppShell extends ScopedElementsMixin(DBPLitElement) { ...@@ -420,7 +418,7 @@ export class AppShell extends ScopedElementsMixin(DBPLitElement) {
return; return;
} }
importNotify(import(metadata.module_src)).then(() => { importNotify(this._i18n, import(metadata.module_src)).then(() => {
updateFunc(); updateFunc();
}).catch((e) => { }).catch((e) => {
console.error(`Error loading ${ metadata.element }`); console.error(`Error loading ${ metadata.element }`);
...@@ -836,6 +834,8 @@ export class AppShell extends ScopedElementsMixin(DBPLitElement) { ...@@ -836,6 +834,8 @@ export class AppShell extends ScopedElementsMixin(DBPLitElement) {
} }
render() { render() {
let i18n = this._i18n;
const getSelectClasses = (name => { const getSelectClasses = (name => {
return classMap({selected: this.activeView === name}); return classMap({selected: this.activeView === name});
}); });
......
import {createI18nInstance} from './i18n.js'; import {createInstance} from './i18n.js';
import {html, css} from 'lit-element'; import {html, css} from 'lit-element';
import {unsafeHTML} from 'lit-html/directives/unsafe-html.js'; import {unsafeHTML} from 'lit-html/directives/unsafe-html.js';
import {ScopedElementsMixin} from '@open-wc/scoped-elements'; import {ScopedElementsMixin} from '@open-wc/scoped-elements';
...@@ -7,14 +7,12 @@ import {Icon} from '@dbp-toolkit/common'; ...@@ -7,14 +7,12 @@ import {Icon} from '@dbp-toolkit/common';
import {AdapterLitElement} from "@dbp-toolkit/provider/src/adapter-lit-element"; import {AdapterLitElement} from "@dbp-toolkit/provider/src/adapter-lit-element";
import {LoginStatus} from "@dbp-toolkit/auth/src/util"; import {LoginStatus} from "@dbp-toolkit/auth/src/util";
const i18n = createI18nInstance();
export class AuthMenuButton extends ScopedElementsMixin(AdapterLitElement) { export class AuthMenuButton extends ScopedElementsMixin(AdapterLitElement) {
constructor() { constructor() {
super(); super();
this.lang = 'de'; this._i18n = createInstance();
this.lang = this._i18n.language;
this.showImage = false; this.showImage = false;
this.auth = {}; this.auth = {};
...@@ -82,7 +80,7 @@ export class AuthMenuButton extends ScopedElementsMixin(AdapterLitElement) { ...@@ -82,7 +80,7 @@ export class AuthMenuButton extends ScopedElementsMixin(AdapterLitElement) {
update(changedProperties) { update(changedProperties) {
changedProperties.forEach((oldValue, propName) => { changedProperties.forEach((oldValue, propName) => {
if (propName === "lang") { if (propName === "lang") {
i18n.changeLanguage(this.lang); this._i18n.changeLanguage(this.lang);
} }
}); });
...@@ -246,6 +244,7 @@ export class AuthMenuButton extends ScopedElementsMixin(AdapterLitElement) { ...@@ -246,6 +244,7 @@ export class AuthMenuButton extends ScopedElementsMixin(AdapterLitElement) {
} }
renderLoggedIn() { renderLoggedIn() {
const i18n = this._i18n;
const person = this.auth.person; const person = this.auth.person;
const imageURL = (this.showImage && person && person.image) ? person.image : null; const imageURL = (this.showImage && person && person.image) ? person.image : null;
...@@ -270,6 +269,7 @@ export class AuthMenuButton extends ScopedElementsMixin(AdapterLitElement) { ...@@ -270,6 +269,7 @@ export class AuthMenuButton extends ScopedElementsMixin(AdapterLitElement) {
} }
renderLoggedOut() { renderLoggedOut() {
const i18n = this._i18n;
let loginSVG = ` let loginSVG = `
<svg <svg
viewBox="0 0 100 100" viewBox="0 0 100 100"
......
import {html , LitElement} from 'lit-element'; import {html , LitElement} from 'lit-element';
import {createI18nInstance} from './i18n.js'; import {createInstance} from './i18n.js';
import * as commonUtils from '@dbp-toolkit/common/utils'; import * as commonUtils from '@dbp-toolkit/common/utils';
const i18n = createI18nInstance();
class ActivityExample extends LitElement { class ActivityExample extends LitElement {
constructor() { constructor() {
super(); super();
this.lang = i18n.language; this._i18n = createInstance();
this.lang = this._i18n.language;
} }
static get properties() { static get properties() {
...@@ -21,7 +20,7 @@ class ActivityExample extends LitElement { ...@@ -21,7 +20,7 @@ class ActivityExample extends LitElement {
changedProperties.forEach((oldValue, propName) => { changedProperties.forEach((oldValue, propName) => {
switch (propName) { switch (propName) {
case "lang": case "lang":
i18n.changeLanguage(this.lang); this._i18n.changeLanguage(this.lang);
break; break;
} }
}); });
...@@ -30,6 +29,7 @@ class ActivityExample extends LitElement { ...@@ -30,6 +29,7 @@ class ActivityExample extends LitElement {
} }
render() { render() {
const i18n = this._i18n;
return html` return html`
<h3>${i18n.t('activity-example.hello-world')}</h3> <h3>${i18n.t('activity-example.hello-world')}</h3>
<ul>${(Array.from(Array(100).keys())).map(i => html`<li>${i18n.t('activity-example.hello-world') + ' ' + i}</li>`)}</ul> <ul>${(Array.from(Array(100).keys())).map(i => html`<li>${i18n.t('activity-example.hello-world') + ' ' + i}</li>`)}</ul>
......
import {createI18nInstance} from './i18n.js'; import {createInstance} from './i18n.js';
import {css, html, LitElement} from 'lit-element'; import {css, html, LitElement} from 'lit-element';
import {ScopedElementsMixin} from '@open-wc/scoped-elements'; import {ScopedElementsMixin} from '@open-wc/scoped-elements';
import * as commonUtils from '@dbp-toolkit/common/utils'; import * as commonUtils from '@dbp-toolkit/common/utils';
import * as commonStyles from '@dbp-toolkit/common/styles'; import * as commonStyles from '@dbp-toolkit/common/styles';
const i18n = createI18nInstance();
class AppShellWelcome extends ScopedElementsMixin(LitElement) { class AppShellWelcome extends ScopedElementsMixin(LitElement) {
constructor() { constructor() {
super(); super();
this.lang = i18n.language; this._i18n = createInstance();
this.lang = this._i18n.language;
this._onVisibilityChanged = this._onVisibilityChanged.bind(this); this._onVisibilityChanged = this._onVisibilityChanged.bind(this);
} }
...@@ -28,7 +27,7 @@ class AppShellWelcome extends ScopedElementsMixin(LitElement) { ...@@ -28,7 +27,7 @@ class AppShellWelcome extends ScopedElementsMixin(LitElement) {
update(changedProperties) { update(changedProperties) {
changedProperties.forEach((oldValue, propName) => { changedProperties.forEach((oldValue, propName) => {
if (propName === "lang") { if (propName === "lang") {
i18n.changeLanguage(this.lang); this._i18n.changeLanguage(this.lang);
} }
}); });
...@@ -75,6 +74,7 @@ class AppShellWelcome extends ScopedElementsMixin(LitElement) { ...@@ -75,6 +74,7 @@ class AppShellWelcome extends ScopedElementsMixin(LitElement) {
} }
render() { render() {
const i18n = this._i18n;
const app = AppShellWelcome._app; const app = AppShellWelcome._app;
let itemTemplates = []; let itemTemplates = [];
......
import {createInstance} from '@dbp-toolkit/common/i18next.js'; import {createInstance as _createInstance} from '@dbp-toolkit/common/i18next.js';
import de from './i18n/de/translation.json'; import de from './i18n/de/translation.json';
import en from './i18n/en/translation.json'; import en from './i18n/en/translation.json';
const i18n = createInstance({en: en, de: de}, 'de', 'en'); export function createInstance() {
return _createInstance({en: en, de: de}, 'de', 'en');
export function createI18nInstance () {
return i18n.cloneInstance();
} }
/**
* Dummy function to mark strings as i18next keys for i18next-scanner
*
* @param {string} key
* @returns {string} The key param as is
*/
export function i18nKey(key) {
return key;
}
\ No newline at end of file
...@@ -12,10 +12,10 @@ ...@@ -12,10 +12,10 @@
"hello-world": "Hallo Welt" "hello-world": "Hallo Welt"
}, },
"welcome": { "welcome": {
"headline": "Willkommen bei der Applikation '{{appname}}'." "headline": "Willkommen bei der Applikation '{{appname}}'."
}, },
"login": "Einloggen", "login": "Einloggen",
"logout": "Ausloggen", "logout": "Ausloggen",
"page-not-found": "Die gewünschte Seite wurde nicht gefunden", "page-not-found": "Die gewünschte Seite wurde nicht gefunden",
"choose-from-menu": "Bitte wählen Sie eine Aktivität aus dem Menu." "choose-from-menu": "Bitte wählen Sie eine Aktivität aus dem Menu."
} }
\ No newline at end of file
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
"hello-world": "Hello World" "hello-world": "Hello World"
}, },
"welcome": { "welcome": {
"headline": "Welcome to the '{{appname}}' application." "headline": "Welcome to the '{{appname}}' application."
}, },
"login": "Login", "login": "Login",
"logout": "Logout", "logout": "Logout",
......
import {html, css} from 'lit-element'; import {html, css} from 'lit-element';
import * as commonStyles from '@dbp-toolkit/common/styles'; import * as commonStyles from '@dbp-toolkit/common/styles';
import {createI18nInstance} from './i18n.js'; import {createInstance} from './i18n.js';
import {AdapterLitElement} from "@dbp-toolkit/provider/src/adapter-lit-element"; import {AdapterLitElement} from "@dbp-toolkit/provider/src/adapter-lit-element";
const i18n = createI18nInstance();
export class TUGrazLogo extends AdapterLitElement { export class TUGrazLogo extends AdapterLitElement {
constructor() { constructor() {
super(); super();
this.lang = i18n.language; this._i18n = createInstance();
this.lang = this._i18n.language;
} }
static get properties() { static get properties() {
...@@ -23,7 +22,7 @@ export class TUGrazLogo extends AdapterLitElement { ...@@ -23,7 +22,7 @@ export class TUGrazLogo extends AdapterLitElement {
update(changedProperties) { update(changedProperties) {
changedProperties.forEach((oldValue, propName) => { changedProperties.forEach((oldValue, propName) => {
if (propName === "lang") { if (propName === "lang") {
i18n.changeLanguage(this.lang); this._i18n.changeLanguage(this.lang);
} }
}); });
super.update(changedProperties); super.update(changedProperties);
...@@ -67,6 +66,7 @@ export class TUGrazLogo extends AdapterLitElement { ...@@ -67,6 +66,7 @@ export class TUGrazLogo extends AdapterLitElement {
} }
render() { render() {
const i18n = this._i18n;
return html` return html`
<a href="https://www.tugraz.at" title="TU Graz Home" target="_blank" rel="noopener"> <a href="https://www.tugraz.at" title="TU Graz Home" target="_blank" rel="noopener">
<div id="claim"> <div id="claim">
......
...@@ -8,7 +8,6 @@ module.exports = { ...@@ -8,7 +8,6 @@ module.exports = {
removeUnusedKeys: true, removeUnusedKeys: true,
func: {list: ['i18n.t', '_i18n.t']}, func: {list: ['i18n.t', '_i18n.t']},
lngs: ['en','de'], lngs: ['en','de'],
defaultNs: 'dbp-auth',
resource: { resource: {
loadPath: 'src/i18n/{{lng}}/{{ns}}.json', loadPath: 'src/i18n/{{lng}}/{{ns}}.json',
savePath: 'src/i18n/{{lng}}/{{ns}}.json' savePath: 'src/i18n/{{lng}}/{{ns}}.json'
......
...@@ -20,7 +20,6 @@ import {AdapterLitElement} from "@dbp-toolkit/provider/src/adapter-lit-element"; ...@@ -20,7 +20,6 @@ import {AdapterLitElement} from "@dbp-toolkit/provider/src/adapter-lit-element";
export class AuthKeycloak extends AdapterLitElement { export class AuthKeycloak extends AdapterLitElement {
constructor() { constructor() {
super(); super();
this.lang = 'de';
this.forceLogin = false; this.forceLogin = false;
this.loadPerson = false; this.loadPerson = false;
this.token = ""; this.token = "";
...@@ -33,6 +32,7 @@ export class AuthKeycloak extends AdapterLitElement { ...@@ -33,6 +32,7 @@ export class AuthKeycloak extends AdapterLitElement {
this._loginStatus = LoginStatus.UNKNOWN; this._loginStatus = LoginStatus.UNKNOWN;
this.requestedLoginStatus = LoginStatus.UNKNOWN; this.requestedLoginStatus = LoginStatus.UNKNOWN;
this._i18n = createInstance(); this._i18n = createInstance();
this.lang = this._i18n.language;
// Keycloak config // Keycloak config
this.keycloakUrl = null; this.keycloakUrl = null;
......
...@@ -10,11 +10,11 @@ import DBPLitElement from "@dbp-toolkit/common/dbp-lit-element"; ...@@ -10,11 +10,11 @@ import DBPLitElement from "@dbp-toolkit/common/dbp-lit-element";
export class DbpAuthDemo extends ScopedElementsMixin(DBPLitElement) { export class DbpAuthDemo extends ScopedElementsMixin(DBPLitElement) {
constructor() { constructor() {
super(); super();
this.lang = 'de';
this.entryPointUrl = ''; this.entryPointUrl = '';
this.auth = {}; this.auth = {};
this.noAuth = false; this.noAuth = false;
this._i18n = createInstance(); this._i18n = createInstance();
this.lang = this._i18n.language;
} }
static get scopedElements() { static get scopedElements() {
......
import {createInstance as _createInstance, setOverrides} from '@dbp-toolkit/common/i18next.js'; import {createInstance as _createInstance, setOverrides} from '@dbp-toolkit/common/i18next.js';
import de from './i18n/de/dbp-auth.json'; import de from './i18n/de/translation.json';
import en from './i18n/en/dbp-auth.json'; import en from './i18n/en/translation.json';
export function createInstance() { export function createInstance() {
return _createInstance({en: en, de: de}, 'de', 'en', 'dbp-auth'); return _createInstance({en: en, de: de}, 'de', 'en');
} }
export {setOverrides}; export {setOverrides};
\ No newline at end of file
...@@ -55,8 +55,8 @@ export class LoginButton extends ScopedElementsMixin(AdapterLitElement) { ...@@ -55,8 +55,8 @@ export class LoginButton extends ScopedElementsMixin(AdapterLitElement) {
constructor() { constructor() {
super(); super();
this.lang = 'de';
this._i18n = createInstance(); this._i18n = createInstance();
this.lang = this._i18n.language;
this.auth = {}; this.auth = {};
} }
......
...@@ -25,7 +25,6 @@ export class CheckInPlaceSelect extends ScopedElementsMixin(AdapterLitElement) { ...@@ -25,7 +25,6 @@ export class CheckInPlaceSelect extends ScopedElementsMixin(AdapterLitElement) {
constructor() { constructor() {
super(); super();
Object.assign(CheckInPlaceSelect.prototype, errorUtils.errorMixin); Object.assign(CheckInPlaceSelect.prototype, errorUtils.errorMixin);
this.lang = 'de';
this.entryPointUrl = ''; this.entryPointUrl = '';
this.jsonld = null; this.jsonld = null;
this.$select = null; this.$select = null;
...@@ -42,6 +41,7 @@ export class CheckInPlaceSelect extends ScopedElementsMixin(AdapterLitElement) { ...@@ -42,6 +41,7 @@ export class CheckInPlaceSelect extends ScopedElementsMixin(AdapterLitElement) {
this.showCapacity = false; this.showCapacity = false;
this.auth = {}; this.auth = {};
this._i18n = createInstance(); this._i18n = createInstance();
this.lang = this._i18n.language;
this._onDocumentClicked = this._onDocumentClicked.bind(this); this._onDocumentClicked = this._onDocumentClicked.bind(this);
} }
......
...@@ -5,11 +5,14 @@ import {AuthKeycloak, LoginButton} from '@dbp-toolkit/auth'; ...@@ -5,11 +5,14 @@ import {AuthKeycloak, LoginButton} from '@dbp-toolkit/auth';
import * as commonUtils from '@dbp-toolkit/common/utils'; import * as commonUtils from '@dbp-toolkit/common/utils';
import * as commonStyles from '@dbp-toolkit/common/styles'; import * as commonStyles from '@dbp-toolkit/common/styles';
import DBPLitElement from "@dbp-toolkit/common/dbp-lit-element"; import DBPLitElement from "@dbp-toolkit/common/dbp-lit-element";
import {createInstance} from './i18n.js';
export class CheckInPlaceSelectDemo extends ScopedElementsMixin(DBPLitElement) { export class CheckInPlaceSelectDemo extends ScopedElementsMixin(DBPLitElement) {
constructor() { constructor() {
super(); super();
this.lang = 'de'; this._i18n = createInstance();
this.lang = this._i18n.language;
this.entryPointUrl = ''; this.entryPointUrl = '';
this.noAuth = false; this.noAuth = false;
} }
......