@spectrum-web-components/reactive-controllers
Version:
ReactiveControllers for powering common UI patterns
3 lines (2 loc) • 1.49 kB
JavaScript
"use strict";export const languageResolverUpdatedSymbol=Symbol("language resolver updated");const i=new Set;let n;function r(a){return i.add(a),n||(n=new MutationObserver(()=>{for(const e of i)e()}),n.observe(document.documentElement,{attributes:!0,attributeFilter:["lang"]})),()=>{i.delete(a),i.size===0&&(n==null||n.disconnect(),n=void 0)}}export class LanguageResolutionController{constructor(e){this.language=this.getDocumentLanguage();this.host=e,this.host.addController(this)}getDocumentLanguage(){const e=document.documentElement.lang||navigator.language||"en-US";try{return Intl.DateTimeFormat.supportedLocalesOf([e]),e}catch(t){return"en-US"}}hostConnected(){this.resolveLanguage(),this.removeLangListener=r(this.handleLangChange.bind(this))}hostDisconnected(){var e,t;(e=this.unsubscribe)==null||e.call(this),this.unsubscribe=void 0,(t=this.removeLangListener)==null||t.call(this),this.removeLangListener=void 0}handleLangChange(){if(this.unsubscribe)return;const e=this.getDocumentLanguage();if(e===this.language)return;const t=this.language;this.language=e,this.host.requestUpdate(languageResolverUpdatedSymbol,t)}resolveLanguage(){this.language=this.getDocumentLanguage();const e=new CustomEvent("sp-language-context",{bubbles:!0,composed:!0,detail:{callback:(t,s)=>{const o=this.language;this.language=t,this.unsubscribe=s,this.host.requestUpdate(languageResolverUpdatedSymbol,o)}},cancelable:!0});this.host.dispatchEvent(e)}}
//# sourceMappingURL=LanguageResolution.js.map