added translations

This commit is contained in:
Hendrik Behme committed 2026-10-09 16:37:53 +02:00
1 parent 36ed3880e8
commit 71635eb574
33 files changed
+1025 -241

No files matched your search

+55
View File
@@ -0,0 +1,55 @@
// Browser-side translations. The server prints the catalog for the current
// language (translations/js.<locale>.yaml, via the vindn_i18n_json Twig
// function in base.html.twig) into window.VINDN_I18N; this module only looks
// things up. All visible text in public/js goes through t()/count() so a new
// language is a translations/ change, not a code change.
(function (window) {
var data = window.VINDN_I18N || {};
var locale = data.locale || 'de';
var messages = data.messages || {};
var numberFormats = {};
var pluralRules;
try {
pluralRules = new Intl.PluralRules(locale);
} catch (e) { /* unknown locale tag — fall back to "other" below */ }
// "Hello %name%" + {name: 'x'} — same %placeholder% syntax as Symfony's
// catalogs. An unknown key shows itself, which is visible but harmless.
function t(key, params) {
var text = Object.prototype.hasOwnProperty.call(messages, key) ? messages[key] : key;
if (params) {
Object.keys(params).forEach(function (name) {
text = text.split('%' + name + '%').join(params[name]);
});
}
return text;
}
// Number in the page language, at most `decimals` fraction digits.
function number(value, decimals) {
decimals = decimals || 0;
if (!numberFormats[decimals]) {
numberFormats[decimals] = new Intl.NumberFormat(locale, { maximumFractionDigits: decimals });
}
return numberFormats[decimals].format(value);
}
// Plural-aware message: looks up "<key>.<rule>" (one, other, few, …) for
// the language's own plural rules, falling back to "<key>.other". The
// count itself is available as %n%, already formatted.
function count(key, n, params) {
var rule = pluralRules ? pluralRules.select(n) : 'other';
var full = key + '.' + rule;
if (!Object.prototype.hasOwnProperty.call(messages, full)) full = key + '.other';
return t(full, Object.assign({ n: number(n) }, params || {}));
}
window.VindnI18n = {
locale: locale,
dateFormat: data.dateFormat || 'd.m.Y',
t: t,
number: number,
count: count
};
})(window);