Я пытаюсь написать пользовательский элемент с поддержкой локали. Чтобы отформатировать вывод, он ищет атрибуты lang
для себя и своих родительских элементов, возвращаясь к браузеру navigator.language
Локализация пользовательского интерфейса.
format (d, m, s) {
const lang = (this.closest('[lang]') || document.querySelector('html')).lang;
let list = navigator.languages;
try {
list = Intl.getCanonicalLocales(lang);
} catch (e) {}
const format = new Intl.NumberFormat(list, {
maximumFractionDigits: 2
}).format;
return `${d}° ${m}′ ${format(Math.round(s * 100) / 100)}″`;
}
Это даст мне наилучшую возможную информацию каждый раз, когда Компонент меняет свою стоимость. Но он не охватывает случаи, когда атрибут lang
изменяется во время выполнения. Если атрибут изменяется на самом компоненте, я могу наблюдать его изменение:
static get observedAttributes() { return ['lang']; }
attributeChangedCallback (name, oldValue, newValue) {
if (name === 'lang') // trigger re-rendering
}
Но как бы я go об обнаружении изменения, если оно происходит на родительском элементе или даже в пользовательском интерфейсе браузера, из которого параметр наследуется?
A MutationObserver
представляется неудобным выбором: мне нужно было бы присоединить его к каждому элементу в родительской цепочке, но я не могу предположить, что этот список останется stati c - мне придется заново присоединять Observer к каждому adopted
или connected
событию компонента.