97 lines
2.4 KiB
JavaScript
97 lines
2.4 KiB
JavaScript
/**
|
|
|
|
import { createApp } from 'vue'
|
|
import Root from './App.vue'
|
|
import i18nPlugin from '@voerkai18n/vue'
|
|
import { t,i18nScope } from './languages'
|
|
const app = createApp(Root)
|
|
app.use(i18nPlugin,{ i18nScope })
|
|
app.mount('#app')
|
|
|
|
|
|
*/
|
|
|
|
import { computed,reactive,ref,inject} from "vue"
|
|
|
|
|
|
export const VoerkaI18nProvider = Symbol('VoerkaI18nProvider')
|
|
|
|
|
|
const defaultInject ={
|
|
activeLanguage:"",
|
|
languages:[],
|
|
defaultLanguage:""
|
|
}
|
|
|
|
|
|
export function injectVoerkaI18n(){
|
|
return inject(VoerkaI18nProvider,defaultInject)
|
|
}
|
|
|
|
|
|
export function useVoerkaI18n(){
|
|
let activeLanguage = ref(VoerkaI18n.activeLanguage)
|
|
|
|
|
|
VoerkaI18n.on((newLanguage)=>{
|
|
activeLanguage.value = newLanguage
|
|
})
|
|
|
|
return {
|
|
t:VoerkaI18n.t
|
|
|
|
}
|
|
}
|
|
|
|
export default {
|
|
install: (app, opts={}) => {
|
|
let options = Object.assign({
|
|
i18nScope:null, // 当前作用域实例
|
|
}, opts)
|
|
|
|
let i18nScope = options.i18nScope
|
|
if(i18nScope===null){
|
|
console.warn("@voerkai18n/vue: i18nScope is not provided, use default i18nScope")
|
|
i18nScope = {change:()=>{}}
|
|
}
|
|
|
|
// 插件只需要安装一次实例
|
|
if(app.voerkai18n){
|
|
return
|
|
}
|
|
app.voerkai18n = i18nScope.global
|
|
|
|
let activeLanguage = ref(i18nScope.global.activeLanguage)
|
|
|
|
app.mixin({
|
|
computed:{
|
|
$activeLanguage:{
|
|
get: () =>activeLanguage.value,
|
|
set: (value) =>i18nScope.change(value).then((newLanguage)=>activeLanguage.value=newLanguage)
|
|
}
|
|
}
|
|
})
|
|
|
|
// 注入一个全局可用的t方法
|
|
app.config.globalProperties.t = function(...args){
|
|
// 通过访问计算属性activeLanguage来实现当activeLanguage变更时的重新渲染
|
|
// 有没有更好的办法?
|
|
this.$activeLanguage
|
|
return i18nScope.t(...args)
|
|
}
|
|
|
|
|
|
|
|
app.provide(VoerkaI18nProvider, reactive({
|
|
activeLanguage: computed({
|
|
get: () => activeLanguage,
|
|
set: (value) => i18nScope.global.change(value).then(()=>{
|
|
activeLanguage.value = value
|
|
})
|
|
}),
|
|
languages:i18nScope.global.languages,
|
|
defaultLanguage:i18nScope.global.defaultLanguage,
|
|
}))
|
|
|
|
}
|
|
} |