assemble / grunt-assemble-i18n

Assemble middleware for adding i18n support to projects.
24 stars 8 forks source link

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

Open rauberdaniel opened 8 years ago

rauberdaniel commented 8 years ago

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 grunt-assemble@0.4.0 and grunt-assemble-i18n@0.1.1

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

assemblebot commented 8 years ago

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

LaurentGoderre commented 8 years ago

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 commented 8 years ago

@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 commented 8 years ago

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 commented 8 years ago

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 commented 8 years ago

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

jonschlinkert commented 8 years ago

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 commented 8 years ago

At least I know now

rauberdaniel commented 8 years ago

@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? :confused:

rauberdaniel commented 8 years ago

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 commented 8 years ago

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 commented 8 years ago

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 commented 8 years ago

@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 commented 8 years ago

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

LaurentGoderre commented 8 years ago

I really like it!

deepali52 commented 4 years ago

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

It doesn't work. PLease help