quasar
Version:
Build high-performance VueJS user interfaces (SPA, PWA, SSR, Mobile and Desktop) in record time
118 lines (94 loc) • 2.95 kB
JavaScript
import { createReactivePlugin } from '../../utils/private.create/create.js'
import defaultLang from '../../../lang/en-US.js'
function getLocale () {
if (__QUASAR_SSR_SERVER__) return
const val = Array.isArray(navigator.languages) === true && navigator.languages.length !== 0
? navigator.languages[ 0 ]
: navigator.language
if (typeof val === 'string') {
return val.split(/[-_]/).map((v, i) => (
i === 0
? v.toLowerCase()
: (
i > 1 || v.length < 4
? v.toUpperCase()
: (v[ 0 ].toUpperCase() + v.slice(1).toLowerCase())
)
)).join('-')
}
}
const Plugin = createReactivePlugin({
__qLang: {}
}, {
// props: object
// __langConfig: object
getLocale,
set (langObject = defaultLang, ssrContext) {
const lang = {
...langObject,
rtl: langObject.rtl === true,
getLocale
}
if (__QUASAR_SSR_SERVER__) {
if (ssrContext === void 0) {
console.error('SSR ERROR: second param required: Lang.set(lang, ssrContext)')
return
}
lang.set = ssrContext.$q.lang.set
if (ssrContext.$q.config.lang === void 0 || ssrContext.$q.config.lang.noHtmlAttrs !== true) {
const dir = lang.rtl === true ? 'rtl' : 'ltr'
const attrs = `lang=${ lang.isoName } dir=${ dir }`
ssrContext._meta.htmlAttrs = ssrContext.__qPrevLang !== void 0
? ssrContext._meta.htmlAttrs.replace(ssrContext.__qPrevLang, attrs)
: attrs
ssrContext.__qPrevLang = attrs
}
ssrContext.$q.lang = lang
}
else {
lang.set = Plugin.set
if (Plugin.__langConfig === void 0 || Plugin.__langConfig.noHtmlAttrs !== true) {
const el = document.documentElement
el.setAttribute('dir', lang.rtl === true ? 'rtl' : 'ltr')
el.setAttribute('lang', lang.isoName)
}
Object.assign(Plugin.__qLang, lang)
}
},
install ({ $q, lang, ssrContext }) {
if (__QUASAR_SSR_SERVER__) {
const initialLang = lang || defaultLang
$q.lang = {}
$q.lang.set = langObject => {
this.set(langObject, ssrContext)
}
$q.lang.set(initialLang)
// one-time SSR server operation
if (
this.props === void 0
|| this.props.isoName !== initialLang.isoName
) {
this.props = { ...initialLang }
}
}
else {
$q.lang = Plugin.__qLang
Plugin.__langConfig = $q.config.lang
if (this.__installed === true) {
lang !== void 0 && this.set(lang)
}
else {
this.props = new Proxy(this.__qLang, {
get () { return Reflect.get(...arguments) },
ownKeys (target) {
return Reflect.ownKeys(target)
.filter(key => key !== 'set' && key !== 'getLocale')
}
})
this.set(lang || defaultLang)
}
}
}
})
export default Plugin
export { defaultLang }