2017-10-06 5 views
0
  1. Mes principaux app.jsComment utiliser vue-i18n dans ma vue route?

     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. Les language.js

     export default { 
          messages : { 
          en: { 
           hello: 'hello!' 
           }, 
           ja: { 
           hello: 'こんにちは!' 
           }, 
           zh: { 
           hello: '你好!' 
           } 
          } 
         } 
    
  3. mon problème suit le code route.js, que je ne peux pas utiliser this.$i18n.t('hello'), parce que $i18n est indisponible.

     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. 
          } 
         ] 
    

Est-ce qu'il ya quelqu'un a une situation similaire, veulent utiliser i18n à vue route et résolu le problème?

+0

'this' n'est pas une instance Vue dans ce fichier. Pourquoi essayez-vous de lier le nom de la route à une variable traduite? Le nom ne devrait jamais changer – thanksd

+0

J'utilise 'route.name' pour afficher à l'interface utilisateur et que vous voulez changer pour les différentes langues. – user2650480

Répondre

1

Dans votre exemple this.i18n ne va pas à définir car il n'est pas une instance Vue dans le contexte de ce fichier.

Votre racine du problème est que vous essayez de mettre les données d'affichage dans la définition de l » route. Ceci est une mauvaise pratique en général et entraîne des problèmes comme celui que vous avez rencontré.

La propriété name du route doit être un identifiant unique de l'itinéraire et ne doit pas changer après avoir été défini.

Si vous voulez baser la propriété d'une occurrence de Vue sur le nom traduit de l'itinéraire (qui est encore un couplage trop serré à mon goût), vous pouvez le faire dans le composant Vue que vous avez spécifié pour l'itinéraire.

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

Vraiment, si, vous ne devriez pas baser vos données d'affichage sur l'objet route. On dirait que ce serait plus clair et moins de travail pour indiquer que la clé du message de traduction que vous voulez passer à this.$i18n.t dans la définition de cette propriété liée:

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

Merci, je comprends maintenant. Je remarque que l'instance de Vue ne sera pas disponible dans ce fichier de route. Avant de voir votre message, j'ai déplacé mon code de traduction vers le composant de navigation. C'est en quelque sorte ce que vous décrivez. J'ajoute donc un autre nom de propriété pour objet route, donc '{chemin: '/', name = 'こ ん に ち は', text_code = 'bonjour'}', donc mon code de navigation est ''

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