如何在 Vue 路由器中为除默认语言环境之外的所有语言环境添加 i18n 语言环境前缀?
How to add an i18n locale prefix in Vue router for all the locales except for the default one?
我正在尝试创建一个路由来为所有路由添加区域设置前缀,我使用以下代码让它工作:
routes: [{
path: '/:lang',
component: {
template: '<router-view />'
},
children: [
{
path: '',
name: 'home',
component: Home
},
{
path: 'about',
name: 'about',
component: About
},
{
path: 'contact',
name: 'contact',
component: Contact
}
]
}]
对于默认的语言环境 en
我不想设置这个前缀所以 params.lang
在这种情况下将是完整路径而不是语言环境代码,所以请求任何路径而不语言环境代码将呈现匹配的 Home
组件。
那我该怎么做呢? beforeEnter
这样的导航卫士在这种情况下有帮助吗?
其实不用导航守卫也可以做到。这里的主要目标是让路由器理解你有一个没有 :lang
参数的 url 。要区分语言前缀和实际路径,您可以对 :lang
参数使用正则表达式模式,例如:(de|fr|en|zu)
(任何适合您的代码列表)。并使 :lang
成为可选的 ?
.
所以像这样的东西应该有用:path: '/:lang(de|fr|en|zu)?'
至少对我有用:) ...
所以现在如果你请求 /about
或 /de/about
两者都会匹配 About
.. 但是第一个将有 params.lang
=== 未定义。所以我想无论何时设置语言环境,您都可以这样做:const locale = this.$route.params.lang || 'en'
的文档
routes: [{
path: '/:lang(de|fr|en|zu)?',
component: {
template: '<router-view />'
},
children: [
{
path: '',
name: 'home',
component: Home
},
{
path: 'about',
name: 'about',
component: About
},
{
path: 'contact',
name: 'contact',
component: Contact
}
]
}]
我正在尝试创建一个路由来为所有路由添加区域设置前缀,我使用以下代码让它工作:
routes: [{
path: '/:lang',
component: {
template: '<router-view />'
},
children: [
{
path: '',
name: 'home',
component: Home
},
{
path: 'about',
name: 'about',
component: About
},
{
path: 'contact',
name: 'contact',
component: Contact
}
]
}]
对于默认的语言环境 en
我不想设置这个前缀所以 params.lang
在这种情况下将是完整路径而不是语言环境代码,所以请求任何路径而不语言环境代码将呈现匹配的 Home
组件。
那我该怎么做呢? beforeEnter
这样的导航卫士在这种情况下有帮助吗?
其实不用导航守卫也可以做到。这里的主要目标是让路由器理解你有一个没有 :lang
参数的 url 。要区分语言前缀和实际路径,您可以对 :lang
参数使用正则表达式模式,例如:(de|fr|en|zu)
(任何适合您的代码列表)。并使 :lang
成为可选的 ?
.
所以像这样的东西应该有用:path: '/:lang(de|fr|en|zu)?'
至少对我有用:) ...
所以现在如果你请求 /about
或 /de/about
两者都会匹配 About
.. 但是第一个将有 params.lang
=== 未定义。所以我想无论何时设置语言环境,您都可以这样做:const locale = this.$route.params.lang || 'en'
routes: [{
path: '/:lang(de|fr|en|zu)?',
component: {
template: '<router-view />'
},
children: [
{
path: '',
name: 'home',
component: Home
},
{
path: 'about',
name: 'about',
component: About
},
{
path: 'contact',
name: 'contact',
component: Contact
}
]
}]