Search code examples
javascriptvue.jsvue-i18n

Access vue-i18n messages as object


I want to create a dynamical slider which depends on the page.

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

The thing is I want to render in my component my slider in function of the number of slide.

So this is something like this:

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

However I do not manage to access properly messages this way. Since $t('message.'+page).length is giving me back the length of the first slide (7 in the Kitten1 case).

Is there a way to access i18n without recreating an instance of it ?


Solution

  • Okay so it appears that $t() is always returning a string.

    So the solution I found out was to import messages in my components and directly use it from there :

    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>