5

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

    security_signin: {
        slide1: 'Kitten1',
        slide2: 'Kitten2',
    },
    signup: {
        slide1: 'Kitten1',
        slide2: 'Kitten2',
        slide3: 'Kitten3'
    }

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

所以这是这样的:

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

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

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

4

3 回答 3

11

这很简单$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>

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

en: {
    security_signin: {
        slide1: 'Kitten1',
        slide2: 'Kitten2',
    },
    signup: {
        slide1: 'Kitten1',
        slide2: 'Kitten2',
        slide3: 'Kitten3'
    }
}

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

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

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

于 2018-10-18T15:22:31.573 回答
1

好的,所以它似乎$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>
于 2018-09-15T16:04:33.110 回答
0

您使用的是对象而不是数组,但 JavaScript 对象没有length属性 - 您可以尝试使用数组:

// English locale
{
  "message":
  {
    security_signing:
    {
      slides:
      [
        'Kitten1',
        'Kitten2'
      ]
    },
    signup:
    {
      slides:
      [
        'Kitten1',
        'Kitten2',
        'Kitten3'
      ]
    }
  }
}

<slide v-for="item in $t('message.'+page+'.slides').length">
    <p v-html="item"></p>
</slide>
于 2018-09-15T13:43:52.650 回答