سایت چند زبانه در nuxt js
سلام به جاوااسکریپتی های عزیز.
کارهایی که میخواهیم انجام بدیم:
- نصب کتابخانه vue-i18n
- نصب و کانفیگ
- ایجاد یه میدلویر برای رسیدگی به وضیعت زبان های مختلف
- ساخت فایل زبان ها
نصب کتابخانه vue-i18n
$ npm install vue-i18n --save
داخل پوشه plugins یه پلاگین جدید بسازید با عنوان : i18n.js
محتوای درونش:
import Vue from 'vue';
import VueI18n from 'vue-i18n';
Vue.use(VueI18n);
export default ({ app, store }) => {
// Setup i18n
app.i18n = new VueI18n({
locale: store.state.locale,
fallbackLocale: 'fa',
messages: {
'fa': require('~/locales/fa.json')
}
});
app.i18n.path = (link) => {
if (app.i18n.locale === app.i18n.fallbackLocale) {
return `/${link}`;
}
return `/${app.i18n.locale}/${link}`;
}
}
من زبان پیش فرض رو فارسی گذاشتم و شما میتونید هر چیز دیگه ای بزارید.
داخل store/index.js یه state تعریف میکنیم برای نگهداری زبان فعلی و زبان هایی که قراره داشته باشیم.
state: () => ({
locales: ['fa','en'],
locale: 'fa'
}),
اولی برای زبان هایی که داریم.
دومی زبان فعلی.
حالا تکه کد زیر رو تو قسمت mutations فایل store/index.js قرار بدید برای تغییر زبان فعلی:
mutations: {
SET_LANG(state, locale) {
if (state.locales.indexOf(locale) !== -1) {
state.locale = locale
}
}
},
خب حالا باید پلاگینی که ساختیم رو داخل nuxt.config.js فراخوانی بکنیم:
module.exports = {
build: {
vendor: ['vue-i18n']
},
router: {
middleware: 'i18n' // برای اعمال بر روی تمامی مسیر ها
},
plugins: ['~/plugins/i18n.js'],
}
حالا نوبت ساختن فایل میدلویر هستش:
middleware/i18n.js
export default function({ isHMR, app, store, route, params, error, redirect }) {
if (isHMR) {
return
}
else if (!params.lang) {//اگر پارامتر زبان وجود نداشته باشد اظافه میکند
return redirect('/fa' + route.fullPath)
}
const locale = params.lang || 'fa'
store.commit('SET_LANG', locale)
app.i18n.locale = store.state.locale
}
حالا باید فایل زبان هارو بسازیم.
من یک فایل برای زبان فارسی و زبان انگلیسی میسازم و شما میتونید چندین زبان دلخواه خودتون رو بسازید.
locales/fa.json
{
"links": {
"home": "خانه",
"about: "درباره ما"
},
"index": {
"title": "سلام دنیا",
},
}
locales/en.json
{ "links": { "home": "home", "about: "about" }, "index": { "title": "Hello world!", }, }
حالا کافیه داخل پوشه pages یک پوشه بسازید با عنوان lang_ و بقیه صفحه هاتون رو داخل این قرار بدید.
برای صدا زدن محتوایی که تعریف کردیم برای مثال من یه صفحه ای ایجاد میکنم :
pages/_lang/index.vue
<template>
<div>
<h1 class="page_title">{{ $t('links.home') }}</h1>
<nuxt-link class="navbar-item" :to="'/' + $i18n.locale + '/about'">{{$t('links.contact') }}</nuxt-link>
</div>
</template>
export default {
head() {
return { title: this.$t('index.title') }
}
}
بعضی وقت ها نیاز هستش که برای ترجمه ها یه پارامتر هم تعریف بکنیم که یه مقداری رو بهشون پاس بدیم، برای اینکار از روش زیر استفاده میکنیم:
{
"links" : {
"home": "خانه شماره {number}",
"about: "درباره ما"
},
"index": {
"title": "سلام دنیا",
},
}
موقع صدا زدن هم به این شکل:
<h1 class="page_title">{{ $t('links.home',{number:1}) }}</h1>
امیدوارم بدردتون بخوره.
موفق باشید.
مطلبی دیگر از این انتشارات
ویو فریم ورک خوش بر و رو جی اس - بخش اول
مطلبی دیگر از این انتشارات
ویو دِو تولز (Vue Devtools) نسخه ۵.۰ منتشر شد
مطلبی دیگر از این انتشارات
رفع ارور event های vue.js در W3C