Search code examples
vue.jsvuejs2nuxt.jsvue-i18nnuxt-i18n

How to get access to template in asyncData?


I want to get access to this.$el in asyncData. I use a database to store translations. I want to get a list of translations that are used on the current page. Then I will send a request to the server to receive them. After that, I will merge it.

i18.mergeLocaleMessage( locale, message )

How to do it ?


Solution

  • You can access i18n with something like this, no need to access the template for this use case

    asyncData ({ app }) {
      console.log(app.i18n.t('Hello'))
    }
    

    Looking at the lifecycle of Nuxt, asyncData will happen before any template is generated at all, so it is impossible with asyncData.
    And even if it was possible with some hacky trick, it would be a bit strange to have to look inside of your template to then have some logic for i18n fetching.

    Why not getting a computed nested object and loop on this through your template, after you have fetched all of your required translations ?

    Also, you're using asyncData + an API call each time ? So, for every page: you will stop the user, let him wait for the API call and then proceed ?

    Latest point, if you are on your page and you hit F5, then asyncData hook will not be triggered. Just to let you know about this caveat.

    Alternative solutions:

    • using the fetch() hook and display a loader until you have fetched all your translations, still better to not rely on the content of the template. This will work even on F5 and can produce a more smooth experience (by not blocking the navigation).
    • getting your i18n whole translations globally, at some point when your user's connection is idle. Rather than on per-page. Especially because you will need to handle the logic of not fetching some translations that you already have (if the user visits a page twice).