作为对象访问 vue-i18n 消息

Bal*_*áni 3 javascript vue.js vue-i18n

我想创建一个取决于页面的动态滑块。

    security_signin: {
        slide1: 'Kitten1',
        slide2: 'Kitten2',
    },
    signup: {
        slide1: 'Kitten1',
        slide2: 'Kitten2',
        slide3: 'Kitten3'
    }
Run Code Online (Sandbox Code Playgroud)

问题是我想在我的组件中根据幻灯片的数量呈现我的滑块。

所以这是这样的:

<slide v-for="(item, index) in $t('message.'+page).length">
    <p v-html="$t('message.'+page+'.slide'+index)"></p>
</slide>
Run Code Online (Sandbox Code Playgroud)

但是,我无法通过这种方式正确访问消息。因为 $t('message.'+page).length它给了我第一张幻灯片的长度(在 Kitten1 案例中为 7)。

有没有办法在不重新创建 i18n 实例的情况下访问它?

小智 8

这很简单,访问消息属性$i18n。例如:

<slide v-for="(item, index) in Object.keys($i18n.messages[$i18n.fallbackLocale].message[page]).length">
    <p v-html="$t('message.'+page+'.slide'+index)"></p>
</slide>
Run Code Online (Sandbox Code Playgroud)

更详细地说,$i18n.messages保存所有的翻译,例如

en: {
    security_signin: {
        slide1: 'Kitten1',
        slide2: 'Kitten2',
    },
    signup: {
        slide1: 'Kitten1',
        slide2: 'Kitten2',
        slide3: 'Kitten3'
    }
}
Run Code Online (Sandbox Code Playgroud)

子集您选择的语言环境,$i18n.fallbackLocale用于后备语言环境或$i18n.locale当前语言环境。您应该获取您的 javascript 对象。

非常小心,当您翻译$t()任何丢失的翻译时,将从后备语言环境中恢复。但是当你直接访问javascript对象时,你就放弃了这个安全网。某些语言环境可能缺少键。

在这种情况下fallbackLocale就足够了,因为我们不想访问翻译,只想访问元素的数量。


Bal*_*áni 3

好的,看起来$t()总是返回一个字符串。

所以我发现的解决方案是在我的组件中导入消息并直接从那里使用它:

import messages from '../messages'

export default {
   props: ['page', 'locale'],
   data(){
       return {
           slides: messages[this.locale].message[this.page]
       }
   }
}

<slide v-for="(slide, i) in slides">
    <p v-html="slide"></p>
    <img :src="'/assets/img/slider-bg-'+ i +'.png'" alt="">
</slide>
Run Code Online (Sandbox Code Playgroud)