1. 什么是路由?
在前端开发中,路由是指一种将 URL 与对应的处理方法相匹配的机制,它可以帮助我们实现不同页面之间的跳转和切换。
在 Vue 中,我们可以使用 Vue Router 来实现路由的功能。Vue Router 是 Vue.js 官方提供的路由管理器,它和 Vue.js 的核心协作非常紧密,可以让我们轻松实现 SPA(单页应用)和多页应用的页面路由控制。
2. 什么是国际化?
国际化(Internationalization)是指将软件产品设计成可适应不同国家和不同地区的本地化需求。一个好的国际化产品应该能够支持全球主要语言,包括语言文字、日期、时间等方面的本地化需要。
在前端应用中,国际化主要是指通过不同语言版本的文本资源文件来切换应用程序的语言环境。当我们需要将应用程序扩展到更多市场时,这项功能格外重要。
3. 如何使用 Vue Router 实现国际化的多语言切换?
3.1 创建多语言资源文件
在 Vue 中实现国际化,我们需要为每个语言编写一个相关的文本资源文件。文本资源文件中包含了应用程序中需要显示的所有文本字符串,根据不同的语言环境,我们可以切换到对应的文本资源文件。
在本例中,我们将创建两个资源文件,分别为英文和中文。
在 src 文件夹中创建 lang 文件夹,并在其中新建两个资源文件 en.js 和 zh.js:
//en.js
export default {
welcome: 'Welcome to our website!',
about: 'About us',
contact: 'Contact us'
}
//zh.js
export default {
welcome: '欢迎来到我们的网站!',
about: '关于我们',
contact: '联系我们'
}
在这两个文件中,分别导出了三个键值对。这里我们只添加了一些简单的文本字符串,实际应用中可能会更复杂,例如时间、日期、货币符号等等。
3.2 配置 Vue Router
我们需要在 Vue Router 中添加一个语言环境参数,以支持不同的语言版本。
在 router 文件夹中创建 index.js 文件,并添加以下代码:
import Vue from 'vue'
import Router from 'vue-router'
import HomePage from '@/components/HomePage'
import AboutUs from '@/components/AboutUs'
import ContactUs from '@/components/ContactUs'
Vue.use(Router)
const router = new Router({
mode: 'history',
routes: [
{
path: '/',
name: 'HomePage',
component: HomePage
},
{
path: '/about',
name: 'AboutUs',
component: AboutUs
},
{
path: '/contact',
name: 'ContactUs',
component: ContactUs
}
]
})
export default router
在这个文件中,我们首先引入了 Vue 和 Vue Router,并用 Vue.use() 注册了 Router 插件。然后我们配置了三个路由,分别是首页、关于我们和联系我们。
接下来,我们需要在路由中添加一个语言环境参数。我们可以在路由的 meta 块中添加一个 lang 属性,然后将其初始化为默认值,例如 'en':
const router = new Router({
mode: 'history',
routes: [
{
path: '/',
name: 'HomePage',
component: HomePage,
meta: { lang: 'en' }
},
{
path: '/about',
name: 'AboutUs',
component: AboutUs,
meta: { lang: 'en' }
},
{
path: '/contact',
name: 'ContactUs',
component: ContactUs,
meta: { lang: 'en' }
}
]
})
3.3 创建语言选择控件
我们需要为应用程序添加一个语言选择控件,让用户可以切换语言环境。可以使用下拉列表或按钮组等控件来实现。
在本例中,我们使用了一个按钮组,用户可以通过单击按钮来切换语言环境。
在 src 文件夹中创建 components 文件夹,并在其中新建一个 LanguageSelector.vue 文件,添加以下代码:
<div class="language-selector">
<button class="btn lang-switch" @click="setLang('en')" :class="{ active: lang==='en' }">English</button>
<button class="btn lang-switch" @click="setLang('zh')" :class="{ active: lang==='zh' }">中文</button>
</div>
<script>
export default {
data () {
return {
lang: 'en'
}
},
methods: {
setLang (lang) {
this.lang = lang
// 在路由 meta 中设置当前语言
this.$router.currentRoute.meta.lang = lang
}
}
}
</script>
<style scoped>
.language-selector {
display: flex;
justify-content: flex-end;
margin-top: -40px;
margin-right: 20px;
margin-bottom: 20px;
}
.lang-switch {
margin-left: 5px;
margin-right: 5px;
}
.btn {
font-size: 14px;
padding: 6px 12px;
border: 1px solid #ccc;
border-radius: 4px;
background-color: #fff;
color: #333;
cursor: pointer;
}
.btn.active {
background-color: #333;
color: #fff;
}
</style>
在这个文件中,我们创建了一个名为 LanguageSelector 的 Vue 组件,用来显示语言选择的按钮组。在 data 中设置了默认语言为英语('en')。
setLang 方法用来响应语言选择按钮的点击事件,并更新当前语言环境。为了将这个语言环境传递到路由中,我们需要设置当前的路由 meta 属性的 lang 为指定的语言环境。
最后,在样式的部分,我们设置了按钮的样式,不同语言的按钮之间用空隙隔开,用户可以通过点击来选择自己需要的语言。
3.4 更新视图层显示
现在我们已经添加了语言选择控件并可以在路由中传递语言环境参数了,但我们的视图层还不知道该如何显示不同语言的文本字符串。
我们需要在每个组件中添加一个语言资源文件,并在模板中使用相关的字符串。这里以 HomePage 组件为例,我们将在模板中添加一个 {{ $t('welcome') }} 字符串,它会根据当前语言环境从资源文件中取出对应的文本串。
在 components 文件夹中打开 HomePage.vue 文件,添加以下代码:
<div class="home-page">
<h1>{{ $t('welcome') }}</h1>
<p>{{ $t('about') }}</p>
<p>{{ $t('contact') }}</p>
</div>
<script>
import lang from '@/lang/en'
export default {
name: 'HomePage',
data () {
return {}
},
created () {
this.$router.beforeEach((to, from, next) => {
const lang = to.meta.lang || 'en'
this.$i18n.locale = lang
import('@/lang/' + lang).then(res => {
this.$i18n.setLocaleMessage(lang, res.default)
})
next()
})
import('@/lang/' + lang).then(res => {
this.$i18n.setLocaleMessage(lang, res.default)
})
}
}
</script>
在这个文件中,我们首先引入了语言资源文件 en.js,并将其作为组件的默认语言。在模板中,我们使用 $t() 方法来添加需要翻译的文本字符串。
为了在组件中使用 $t() 方法,我们需要在 Vue 实例中全局注册一个 i18n(国际化)对象,代码如下:
// main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import VueI18n from 'vue-i18n'
Vue.use(VueI18n)
const i18n = new VueI18n({
fallbackLocale: 'en',
messages: {}
})
new Vue({
router,
i18n,
render: h => h(App)
}).$mount('#app')
我们将 i18n 对象设置为全局对象,将其作为 Vue 实例的一个参数传入。fallbackLocale 用于设置默认的语言环境,如果当前语言版本找不到相应的翻译资源,i18n 会使用该默认语言。
最后,在组件创建完毕后,我们通过 $router.beforeEach 函数实现了一个全局的路由守卫,用于在路由切换时更新语言资源。具体操作是从语言资源文件中动态导入数据,然后更新 i18n 实例中的翻译数据,这样我们就可以通过 $t() 方法来翻译模板中的文本字符串了。
4. 总结
Vue Router 是 Vue.js 官方提供的路由管理器,可以帮助我们实现 SPA 和多页应用的页面路由控制。在进行国际化开发时,我们可以使用 Vue Router 来配置语言环境参数,并通过 i18n 来实现动态翻译文本资源。
通过本文的介绍,我们已经学习了使用 Vue Router 实现国际化的多语言切换的方法,我们可以更好地扩展我们的应用,以适应不同的市场需求。