Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

i18n helper inside each helper results in: The 'language' parameter is not defined #61

Open
rauberdaniel opened this issue Mar 15, 2016 · 16 comments

Comments

@rauberdaniel
Copy link

I am trying to use the i18n helper inside an each helper loop. However, trying to do this will result in: Warning: The 'language' parameter is not defined Use --force to continue.. Maybe this is some issue about the scope?

{{#each press.releases}}
    <li class="press-release">
        <h3>{{i18n title}}</h3> <!-- Should use the title of the press release as the translation key -->
    </li>
{{/each}}

I’m using [email protected] and [email protected]

Note: It also does not work if I use a fixed string as translation key, e.g. {{i18n "site.title"}}.

@assemblebot
Copy link

@rauberdaniel Thanks for the issue! If you're reporting a bug, please be sure to include:

  • The version of assemble you are using.
  • Your assemblefile.js (This can be in a gist)
  • The commandline output. (Screenshot or gist is fine)
  • What you expected to happen instead.

@LaurentGoderre
Copy link
Contributor

This is due to the nature of handlebars. The each block creates a new context and that context doesn't have a language parameter. A workaround is to specify the language from the parent context.

{{#each press.releases}}
    <li class="press-release">
        <h3>{{i18n title language=../language}}</h3> <!-- Should use the title of the press release as the translation key -->
    </li>
{{/each}}
``

@rauberdaniel
Copy link
Author

@LaurentGoderre Thank you for your help! By doing this I receive a Warning: No strings found for language 'en' Use --force to continue. (also when using a fixed string instead of the title variable (which is definitely available)). Are the given translation JSON files also not available in the new context? Any idea how I can make them available there?

@LaurentGoderre
Copy link
Contributor

i18n is a bit complicated. There is the handlebars helper that allows to output translated strings and independently but related the assemble extensions allow to create several language pages using a common template. I'm not sure which part is failing.

Are you using the both or just the handlebars helper? Also, do you have a repo I can see?

@jonschlinkert
Copy link
Member

if title is on the page context, try doing {{i18n ../title language=../language}} inside the each block. also, try doing {{log this}} to see the context inside and outside the block to help debug

@LaurentGoderre
Copy link
Contributor

When was {{log}} added??? That would have save me some much time and grief!!!!

@jonschlinkert
Copy link
Member

When was {{log}} added??? That would have save me some much time and grief!!!!

haha, you might want to sit down @LaurentGoderre. I believe log has been there since the very early days of assemble. but I know the feeling lol

@LaurentGoderre
Copy link
Contributor

At least I know now

@rauberdaniel
Copy link
Author

@jonschlinkert No, title is in the each context, so that should be fine. The warning (which maybe should be an error) says that there are no strings found at all for language 'en'… missing just one string would return a different warning (No string for key … for language 'en').

@LaurentGoderre Actually I think that I’m only using the helper, which probably would mean I’m totally wrong here, right? 😕

@rauberdaniel
Copy link
Author

I just logged the page context and the each context and noticed that the translations are actually stored in the de and en properties of the page context, which probably is the issue because they do not get passed to the each context (like the language property). Any Idea on how to achieve this?

@LaurentGoderre
Copy link
Contributor

I vaguely remember there was a way around this issue where you could redefine the context.

It might be easier to investigate if there is a way to look up the chain for the translation but I remember not being able to last time I looked into it

@LaurentGoderre
Copy link
Contributor

Can you try this:

{{#each press.releases}}
    <li class="press-release">
        <h3>{{#with ..}}{{i18n title}}{{/with}}</h3> <!-- Should use the title of the press release as the translation key -->
    </li>
{{/each}}

@rauberdaniel
Copy link
Author

@LaurentGoderre Haven’t tried it yet but I guess the problem there will be that title also will come from the page context, which would be wrong. However, I found a way which currently works for me:

Instead of putting the translations in de.json and en.json I can put the translations for each press release in the press.releases object itself, e.g.

{
  "releases": [
    {
      "date": "2016-03-16",
      "de": {
        "title": "Deutscher Titel",
        "teaser": "deutsch…"
      },
      "en": {
        "title": "English Title",
        "teaser": "english…"
      }
    }
  ]
}

@LaurentGoderre
Copy link
Contributor

That is a crafty way! I never thought of doing it this way

@LaurentGoderre
Copy link
Contributor

I really like it!

@deepali52
Copy link

deepali52 commented Mar 11, 2020

how to use {{#with}} in nested loops???
like
{{#each....}}
{{#each....}}
{{#with}}
{{/each}}
{{/each}}

It doesn't work. PLease help

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants