unibest/src/locale/index.ts

75 lines
2.1 KiB
TypeScript
Raw Normal View History

import { createI18n } from 'vue-i18n'
import en from './en.json'
import zhHans from './zh-Hans.json' // 简体中文
const messages = {
en,
'zh-Hans': zhHans, // key 不能乱写,查看截图 screenshots/i18n.png
2024-01-29 16:59:12 +08:00
}
const i18n = createI18n({
locale: uni.getLocale(), // 获取已设置的语言fallback 语言需要再 manifest.config.ts 中设置
messages,
})
console.log(uni.getLocale())
console.log(i18n.global.locale)
2024-01-29 16:59:12 +08:00
/**
* vue 使
* @param { string } localeKey keyeg: "app.name"
*/
export const translate = (localeKey: string) => {
2024-01-29 18:59:17 +08:00
if (!localeKey) {
console.error(`[i18n] Function translate(), localeKey param is required`)
return ''
}
const locale = uni.getLocale()
console.log('locale:', locale)
2024-01-29 16:59:12 +08:00
const message = messages[locale]
if (Object.keys(message).includes(localeKey)) {
return message[localeKey]
}
return localeKey
}
/**
* formatString('已阅读并同意{0}和{1}','用户协议','隐私政策') ->
* @param template
* @param values
* @returns
*/
export function formatString(template: string, ...values: any) {
console.log(template, values)
// 使用map来替换{0}, {1}, ...等占位符
return template.replace(/{(\d+)}/g, (match, index) => {
const value = values[index]
return value !== undefined ? value : match
})
}
2024-04-25 16:18:14 +08:00
/**
2024-05-04 10:59:10 +08:00
* formatI18n('我是{name},身高{detail.height},体重{detail.weight}',{name:'张三',detail:{height:178,weight:'75kg'}})
2024-04-25 16:18:14 +08:00
*
2024-05-04 10:59:10 +08:00
* @param template eg: `我是{name}`
* @param obj key与多语言字符串对应eg: `{name:'菲鸽'}`
2024-04-25 16:18:14 +08:00
* @returns
*/
2024-05-04 10:59:10 +08:00
export function formatI18n(template, obj) {
2024-04-25 16:18:14 +08:00
const match = /\{(.*?)\}/g.exec(template)
if (match) {
const variableList = match[0].replace('{', '').replace('}', '').split('.')
2024-05-04 10:59:10 +08:00
let result = obj
2024-04-25 16:18:14 +08:00
for (let i = 0; i < variableList.length; i++) {
result = result[variableList[i]] || ''
}
2024-05-04 10:59:10 +08:00
return formatI18n(template.replace(match[0], result), obj)
2024-04-25 16:18:14 +08:00
} else {
return template
}
}
export default i18n