如何将https://vue-treeselect.js.org/与Vue I18n一起用作多语言组件? json文件(my-es.json,my-en.json),占位符等应根据所选语言而更改。
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@riophae/vue-treeselect@^0.4.0/dist/vue-treeselect.umd.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@riophae/vue-treeselect@^0.4.0/dist/vue-treeselect.min.css">
<script src="https://unpkg.com/vue-i18n/dist/vue-i18n.js"></script>
</head>
<body>
<div id="app">
<p>{{ $t("message.title") }}</p>
<treeselect v-model="value" :multiple="true" :options="options" :clear-on-select="clearOnSelect" placeholder="placeholder english" noResultsText="Retry?">
<label slot="option-label" slot-scope="{ node, shouldShowCount, count, labelClassName, countClassName }" :class="labelClassName">
{{ node.label }}
</label>
</treeselect>
</div>
</body>
<script>
const messages = {
en: {
message: {
title: 'Title english',
}
},
es: {
message: {
title: 'Títuo epañol',
}
}
}
const i18n = new VueI18n({
locale: 'en',
messages,
})
Vue.component('treeselect', VueTreeselect.Treeselect)
var tree = new Vue({
i18n,
data: {
value: null,
clearOnSelect: true,
closeOnSelect: true,
selectAll: true,
options: []
},
methods: {
normalizer: function (node) {
return {
id: node.id,
label: node.label,
children: node.children,
};
},
},
mounted() {
let vm = this;
$.getJSON("https://raw.githubusercontent.com/javierpose/pruebas/master/my-es.json", function (json) {
vm.options = json;
});
}
}).$mount('#app')
</script>
答案 0 :(得分:0)
按以下方式初始化i18n配置:
const messages = {
en: {
options: []
},
es: {
options: []
}
}
const i18n = new VueI18n({
locale: 'en',
messages,
})
然后在已挂接的钩子中,通过循环访问可用语言,通过ajax调用添加选项:
['en', 'es'].forEach(lng => {
$.getJSON("https://raw.githubusercontent.com/javierpose/pruebas/master/my-" + lng + ".json", function(json) {
vm.options = json;
i18n.setLocaleMessage(lng, {
options: json
})
});
});
最终绑定选择的options
属性$t('options')
。
以下示例说明了使用单选按钮更改语言的情况:
const messages = {
en: {
options: []
},
es: {
options: []
}
}
const i18n = new VueI18n({
locale: 'en',
messages,
})
Vue.component('treeselect', VueTreeselect.Treeselect)
var tree = new Vue({
i18n,
data: {
value: null,
clearOnSelect: true,
closeOnSelect: true,
selectAll: true,
options: [],
lang: 'en'
},
methods: {
normalizer: function(node) {
return {
id: node.id,
label: node.label,
children: node.children,
};
},
},
mounted() {
let vm = this;
['en', 'es'].forEach(lng => {
$.getJSON("https://raw.githubusercontent.com/javierpose/pruebas/master/my-" + lng + ".json", function(json) {
vm.options = json;
i18n.setLocaleMessage(lng, {
options: json
})
});
});
}
}).$mount('#app')
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@riophae/vue-treeselect@^0.4.0/dist/vue-treeselect.umd.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@riophae/vue-treeselect@^0.4.0/dist/vue-treeselect.min.css">
<script src="https://unpkg.com/vue-i18n/dist/vue-i18n.js"></script>
</head>
<body>
<div id="app">
<input type="radio" id="en" value="en" v-model="$i18n.locale">
<label for="en">English</label>
<br>
<input type="radio" id="es" value="es" v-model="$i18n.locale">
<label for="es">Spanish</label>
<br>
<span>Language : {{ lang }}</span>
<treeselect v-model="value" :multiple="true" :options="$t('options')" :clear-on-select="clearOnSelect" placeholder="placeholder english" noResultsText="Retry?">
<label slot="option-label" slot-scope="{ node, shouldShowCount, count, labelClassName, countClassName }" :class="labelClassName">
{{ node.label }}
</label>
</treeselect>
</div>
</body>