62 lines
1.8 KiB
JavaScript
62 lines
1.8 KiB
JavaScript
import { dedupingMixin } from "https://unpkg.com/@polymer/polymer@3.4.1/lib/utils/mixin.js?module";
|
|
|
|
const LocalizeMixin = dedupingMixin(
|
|
(superClass) =>
|
|
class extends superClass {
|
|
static get properties() {
|
|
return {
|
|
hass: Object,
|
|
localize: Function,
|
|
};
|
|
}
|
|
|
|
connectedCallback() {
|
|
super.connectedCallback();
|
|
this.loadResources(this.hass.language);
|
|
}
|
|
|
|
async loadResources(language) {
|
|
let resources;
|
|
const languagesToTry = [language, language.split('-')[0], 'en'];
|
|
|
|
for (const lang of languagesToTry) {
|
|
try {
|
|
resources = await this.loadTranslationFile(lang);
|
|
if (resources) {
|
|
break;
|
|
}
|
|
} catch (e) {
|
|
console.error(`Failed to load translations for ${lang}:`, e);
|
|
}
|
|
}
|
|
|
|
if (!resources) {
|
|
console.warn('No translations could be loaded. Using default strings.');
|
|
resources = {};
|
|
}
|
|
|
|
this.localize = (key, ...args) => {
|
|
const translatedValue = key.split('.').reduce((o, i) => o && o[i], resources);
|
|
if (translatedValue === undefined) return key;
|
|
return translatedValue;
|
|
};
|
|
}
|
|
|
|
loadTranslationFile(lang) {
|
|
const url = `./translations/${lang}.js`;
|
|
return import(url)
|
|
.then(module => {
|
|
if (typeof module.default !== 'object') {
|
|
throw new Error('Translation file does not export a default object');
|
|
}
|
|
return module.default;
|
|
})
|
|
.catch(error => {
|
|
console.error(`Failed to load translations for ${lang}:`, error);
|
|
return null;
|
|
});
|
|
}
|
|
}
|
|
);
|
|
|
|
export const localize = LocalizeMixin; |