uview-plus
Version:
零云®uview-plus已兼容vue3支持多语言,120+全面的组件和便捷的工具会让您信手拈来。近期新增拖动排序、条码、图片裁剪、下拉刷新、虚拟列表、签名、Markdown等。
90 lines (80 loc) • 2.4 kB
JavaScript
import zhHans from './locales/zh-Hans.js'
const settings = {
lang: typeof uni !== 'undefined' && typeof uni.getLocale === 'function'
? uni.getLocale()
: 'zh-Hans',
locales: {
'zh-Hans': zhHans
}
}
if (typeof uni !== 'undefined' && typeof uni.onLocaleChange === 'function') {
uni.onLocaleChange((locale) => {
// uni-app 部分平台回调可能是字符串,也可能是 { locale }
settings.lang = typeof locale === 'string'
? locale
: (locale && locale.locale) || settings.lang
})
}
function isPlainObject(value) {
return Object.prototype.toString.call(value) === '[object Object]'
}
export function hasLocale(locale) {
return !!(locale && settings.locales[locale])
}
export function getLocale() {
return settings.lang
}
export function setLocale(locale) {
if (!locale || typeof locale !== 'string') return settings.lang
settings.lang = locale
if (typeof uni !== 'undefined' && typeof uni.setLocale === 'function') {
try {
uni.setLocale(locale)
} catch (e) {
// 部分平台 setLocale 可能受限,忽略以保持 set 内部状态成功
}
}
return settings.lang
}
/**
* 注册语言包
* registerLocale('en', messages)
* registerLocale({ en: messages, ja: messages2 })
*/
export function registerLocale(localeOrMap, messages) {
if (typeof localeOrMap === 'string') {
if (!localeOrMap || !isPlainObject(messages)) return
settings.locales[localeOrMap] = messages
return
}
if (!isPlainObject(localeOrMap)) return
Object.keys(localeOrMap).forEach((key) => {
const value = localeOrMap[key]
if (isPlainObject(value)) {
settings.locales[key] = value
}
})
}
/**
* 多语言方法
*/
export function t(value, params = {}) {
if (value) {
let lang = settings.lang
if (!settings.locales[settings.lang]) {
lang = 'zh-Hans'
}
let result = settings.locales[lang][value] || value
if (params && typeof params === 'object') {
Object.keys(params).forEach((key) => {
const reg = new RegExp(`{${key}}`, 'g')
result = String(result).replace(reg, params[key])
})
}
return result
}
return value
}
export default {
settings
}