Skip to content
Snippets Groups Projects
Commit 92cebd58 authored by Reiter, Christoph's avatar Reiter, Christoph :snake:
Browse files

Add a i18next wrapper

parent 44a04409
No related branches found
No related tags found
No related merge requests found
import i18next from 'i18next';
/**
* Like Intl.DateTimeFormat().format() but uses the current language as locale.
*
* A i18next instance can be created with createInstance()
*
* @param {i18next.i18n} i18n - The i18next instance
* @param {Date} date - The date to format
* @param options - Options passed to Intl.DateTimeFormat
* @returns {string}
*/
export function dateTimeFormat(i18n, date, options) {
return new Intl.DateTimeFormat(i18n.languages, options).format(date);
}
/**
* Like Intl.NumberFormat().format() but uses the current language as locale.
*
* A i18next instance can be created with createInstance()
*
* @param {i18next.i18n} i18n - The i18next instance
* @param {Number} number - The number to format
* @param {Object} options - Options passed to Intl.NumberFormat
* @returns {string}
*/
export function numberFormat(i18n, number, options) {
return new Intl.NumberFormat(i18n.languages, options).format(number);
}
/**
* Creates a new i18next instance that is fully initialized.
*
* Call changeLanguage() on the returned object to change the language.
*
* @param {Object} languages - Mapping from languages to translation objects
* @param {string} lng - The default language
* @param {string} fallback - The fallback language to use for unknown languages or untranslated keys
* @returns {i18next.i18n}
*/
export function createInstance(languages, lng, fallback) {
var options = {
lng: lng,
fallbackLng: fallback,
debug: false,
initImmediate: false, // Don't init async
resources: {},
};
Object.keys(languages).forEach(function(key) {
options['resources'][key] = {translation: languages[key]};
});
var i18n = i18next.createInstance();
i18n.init(options);
console.assert(i18n.isInitialized);
return i18n;
}
\ No newline at end of file
...@@ -21,5 +21,8 @@ ...@@ -21,5 +21,8 @@
"build": "npm run build-local", "build": "npm run build-local",
"build-test": "rollup -c --environment BUILD:test", "build-test": "rollup -c --environment BUILD:test",
"test": "npm run build-test && karma start --singleRun" "test": "npm run build-test && karma start --singleRun"
},
"dependencies": {
"i18next": "^17.0.9"
} }
} }
import * as i18next from '../i18next.js';
describe('i18next', () => {
it('createInstance', () => {
var inst = i18next.createInstance({de: {}}, 'de', 'en');
assert.exists(inst);
assert.deepEqual(inst.languages, ['de', 'en']);
});
it('translations', () => {
var inst = i18next.createInstance({de: {foo: 'bar'}, en: {foo: 'baz', extra: 'quux'}}, 'de', 'en');
assert.deepEqual(inst.languages, ['de', 'en']);
assert.equal( inst.t('foo'), 'bar');
assert.equal( inst.t('nope'), 'nope');
assert.equal( inst.t('extra'), 'quux');
inst.changeLanguage('en');
assert.deepEqual(inst.languages, ['en']);
assert.equal( inst.t('foo'), 'baz');
assert.equal( inst.t('nope'), 'nope');
inst.changeLanguage('nope');
assert.deepEqual(inst.languages, ['nope', 'en']);
assert.equal( inst.t('foo'), 'baz');
assert.equal( inst.t('nope'), 'nope');
});
it('date format', () => {
var inst = i18next.createInstance({de: {}}, 'de', 'en');
assert.deepEqual(inst.languages, ['de', 'en']);
var date = new Date('1995-12-17T03:24:00');
assert.equal(i18next.dateTimeFormat(inst, date), '17.12.1995');
inst.changeLanguage('en');
// TODO: not sure it's a good idea to use the english format even if english is selected because it's just confusing
assert.equal(i18next.dateTimeFormat(inst, date), '12/17/1995');
});
it('number format', () => {
var inst = i18next.createInstance({de: {}}, 'de', 'en');
assert.deepEqual(inst.languages, ['de', 'en']);
assert.equal(i18next.numberFormat(inst, 42), '42');
assert.equal(i18next.numberFormat(inst, 1.25), '1,25');
assert.equal(i18next.numberFormat(inst, 1234), '1.234');
inst.changeLanguage('en');
assert.equal(i18next.numberFormat(inst, 42), '42');
assert.equal(i18next.numberFormat(inst, 1.25), '1.25');
assert.equal(i18next.numberFormat(inst, 1234), '1,234');
});
});
...@@ -18,7 +18,7 @@ describe('utils', () => { ...@@ -18,7 +18,7 @@ describe('utils', () => {
var res = utils.defineCustomElement("test-some-element", SomeElement); var res = utils.defineCustomElement("test-some-element", SomeElement);
expect(res).to.equal(true); expect(res).to.equal(true);
node = document.createElement('test-some-element'); var node = document.createElement('test-some-element');
expect(node.foo).to.equal(42); expect(node.foo).to.equal(42);
}); });
}); });
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment