![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)
i18n-element
I18N Base Element for lit-html
and Polymer with i18n-behavior
as I18N engine
i18n-element
inserts I18N layer into UI definitions in HTML templates transparentlyi18n-element
comes with the full-featured automation tools
Extendable and composable HTML template literals based on lit-html
import { html, i18n, bind } from 'i18n-element/i18n.js';
class MyI18nElement extends i18n(HTMLElement) {
...
render() {
return html`${bind(this, 'my-i18n-element')}
<span>localizable message with ${this.property}</span>`;
}
...
}
class ExtendedElement extends MyI18nElement {
render() {
return html`${bind(this, 'extended-element')}
<div>extended message with ${this.property}</div>
${super.render()}`;
}
}
class CompositeElement extends i18n(HTMLElement) {
render() {
return html`${bind(this /* bound to 'composite-element' */)}
<div>composite element with ${getMessage()}</div>
<extended-element></extended-element>`;
}
}
const binding = bind('get-message', import.meta);
const getMessage = () => html`${'get-message', binding}<span>get message</span>`;
- Each HTML template literal is bound to its unique (pseudo-)element name
- Fetch JSON for locale resources at
locales/{element-name}.{locale}.json
Install
npm install i18n-element
Import
import { html, i18n, bind } from 'i18n-element/i18n.js';
import { Localizable } from 'i18n-element/i18n-element.js';
Quick Tour
I18N-ready pwa-starter-kit
npm install -g polymer-cli
git clone https://github.com/t2ym/pwa-starter-kit
cd pwa-starter-kit
npm ci
gulp locales --targets="de es fr ja zh-Hans"
gulp
gulp
polymer serve
polymer build
cd build/{esm-unbundled|esm-bundled|es6-bundled|es5-bundled}
python -m SimpleHTTPServer 8080
Syntax
I18N for lit-html
elements
import { html, i18n, bind } from 'i18n-element/i18n.js';
class AwesomeElement extends i18n(HTMLElement) {
static get importMeta() { return import.meta; }
constructor() {
super();
this.attachShadow({mode: 'open'});
this.addEventListener('lang-updated', this._langUpdated.bind(this));
}
connectedCallback() { this.invalidate(); }
_langUpdated(event) { this.invalidate(); }
render() {
return html`${bind(this, 'awesome-element')}
<div>localizable message from ${this.is}</div>`;
}
invalidate() {
render(this.render(), this.shadowRoot);
}
}
customElements.define('awesome-element', AwesomeElement);
npm run demo -- locales --targets="de es fr ja zh-Hans"
npm run demo
Localizable
mixin for Polymer elements
Demo Source
import { LegacyElementMixin } from '@polymer/polymer/lib/legacy/legacy-element-mixin.js';
import { html } from '@polymer/polymer/lib/utils/html-tag.js';
import { Localizable } from 'i18n-element/i18n-element.js';
class LocalizableElement extends Localizable(LegacyElementMixin(HTMLElement)) {
static get importMeta() { return import.meta; }
static get template() {
return html`<span id="label1">Localizable UI label 1</span>`;
}
static get is() { return 'localizable-element'; }
}
customElements.define(LocalizableElement.is, LocalizableElement);
Define = class
Thin Definition Syntax
import 'i18n-element/define-element.js';
Define = class ThinElement extends Localizable(LegacyElementMixin(HTMLElement)) {
static get importMeta() { return import.meta; }
static get template() {
return html`<span id="label1">Localizable UI label 1</span>`;
}
}
I18N-ready Bound Element i18n-dom-bind
based on Polymer dom-bind
import 'i18n-element/i18n-dom-bind.js';
- Based on Polymer
dom-bind
Element i18n-dom-bind
element must have id
attribute
Demo Source
<i18n-dom-bind id="el5">
<template>
<span id="label1">Bound UI label 1</span>
</template>
</i18n-dom-bind>
Tools
Full-featured automation tools are available
They are fully integrated in these samples:
Compatible Versions
i18n-behavior | i18n-element | Polymer | lit-html |
---|
3.x | 3.x | 3.x | 1.x |
2.x | 2.x | 1.x-2.x | - |
1.x | - | 1.x | - |
Browser Compatibility
- Polyfilled by
@webcomponents/webcomponentsjs/webcomponents-{bundle|loader}.js
Browser | Chrome | Firefox | Edge 13+ | IE 11 | Safari 9+ | Chrome Android | Mobile Safari | Opera |
---|
Supported | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
License
BSD-2-Clause