2017-10-06 1055 views
0
  1. 我的主要app.js如何在vue-route中使用vue-i18n?

     import Vue from 'vue' 
         import language from './language' 
         import VueI18n from 'vue-i18n' 
    
         Vue.use(VueI18n) 
         const i18n = new VueI18n({ 
          locale: 'en', 
          messages: language.messages, 
         }) 
    
         import router from './router' 
         new Vue({ 
          el: '#app', 
          i18n, 
          router, 
          template: '<App/>', 
          components: { App } 
         }) 
    
  2. 的language.js

     export default { 
          messages : { 
          en: { 
           hello: 'hello!' 
           }, 
           ja: { 
           hello: 'こんにちは!' 
           }, 
           zh: { 
           hello: '你好!' 
           } 
          } 
         } 
    
  3. 我的问题是下面route.js代码,这是我不能用this.$i18n.t('hello'),因为$i18n是无法使用。

     import Vue from 'vue' 
         import Router from 'vue-router' 
    
         export const myRouteMap = [ 
    
          { 
          path: '/', 
          component: MyComponent, 
          redirect: '/myHome', 
          //name: 'Home', 
          name: this.$i18n.t('hello') // can't use $i18n here. 
          } 
         ] 
    

有没有人也有类似情况,想在VUE路由使用国际化,并解决了问题?

+0

'this'是不是在文件中的Vue的实例。你为什么试图将路由名称绑定到一个翻译的变量?该名称不应该改变 – thanksd

+0

我正在使用'route.name'来向用户界面显示,并希望将其更改为不同的语言。 – user2650480

回答

1

在您的例子this.i18n不会被定义,因为它不是在该文件的背景下,Vue的实例。

你根本问题是,你正试图把显示数据在route的定义。这是一般的糟糕做法,并会导致像您遇到的问题。

routename属性应该是路径的唯一标识符,并且不应该被限定后更改。

如果您希望将Vue实例的属性与已转换的路由名称相关联(对于我的口味而言,它仍然过于紧密),您可以在为路由指定的Vue组件中执行此操作。

computed: { 
    title() { 
    return this.$i18n.t(this.$route.name); 
    } 
} 

真的,不过,你不应该立足route对象上的显示数据。好像这将是更清晰,更少的工作只是指定要传递给this.$i18n.t的定义为相关的属性翻译消息键:

computed: { 
    title() { 
    return this.$i18n.t('hello'); 
    } 
} 
+0

谢谢,我现在明白了。我注意到Vue实例在该路由文件中不可用。在我看到您的消息之前,我将我的翻译代码移至导航组件。这是你所描述的。所以我给路由对象添加了另一个属性名,所以'{path:'/',name ='こんにちは',text_code ='hello'}',所以我的导航代码是'

{{$t(route_item.text_code)}}
'。 – user2650480