Js.filters.latest.title - incomplete pluralization in Transifex

Even though all related translations are in place in Transifex:

… the “zero” translation is not used:

I suspect the issue here is that the js.filters.latest.title key has incomplete pluralization and thus is treated by Transifex as 3 separate keys:


The few key is missing.

Yes, you’re right. And there are a bunch more with the same issue. I fixed most of them in PR 3817, but there are still some unresolved ones:

  • js.filters.latest.title
  • js.filters.unread.title
  • js.filters.new.title
  • js.filters.category.title

I didn’t fix them because those keys are heavily used in JavaScript and Ruby and I was under the false impression that pluralization doesn’t make sense in those cases anyway.
@eviltrout Your weren’t happy about my last changes to the templates. How would you like to fix the pluralizations in this case?


Any updates on this? Will it be fixed in near future? Really annoying in non-english forums :disappointed_relieved:

Can you remind me what needs to change in the template for this to work? It has been some time and I can’t seem to figure it out.

As you can see in my PR 3817 I had to add a few conditional statements to some templates.



I didn’t fix the remaining four translation keys since they probably need some changes to templates as well and you expressed your concern about those changes in your comment:

The client templates seem to be quite a bit longer with this patch and I thought zero was a nice feature.

Finding all occurrences of those js.filters keys seemed like a lot of work and I wasn’t sure if you even wanted me to change the templates the way I did.

What I need from you in order to finish my PR:

  • A decision regarding my template changes. Are they fine or should I solve this e.g. by using some kind of additional parameter with the i18n method?
  • Maybe some hints where the js.filters keys are used. Looks like the keys are concatenated most of the time which makes them hard to find.

Thanks for patience with me on this one! It has lasted so much time I’d forgotten some details.

  1. Having reviewed everything I think your template approach is best. Sorry for the runaround but I think it makes the most sense even if it adds a bunch of logic.

  2. That filter text is built programatically which is unfortunate. I think the following git grep shows most of the locations:

git grep "I18n.t([\"']filters"
app/assets/javascripts/discourse/components/navigation-item.js.es6:    return I18n.t("filters." + name.replace("/", ".") + ".help", extra);
app/assets/javascripts/discourse/components/topic-post-badges.js.es6:    link(buffer, this.get('unseen'), url, 'new-topic', 'new', I18n.t('filters.new.lower_title'));
app/assets/javascripts/discourse/helpers/period-title.js.es6:  const title = I18n.t('filters.top.' + (TITLE_SUBS[period] || 'this_week'));
app/assets/javascripts/discourse/models/nav-item.js.es6:    return I18n.t("filters." + name.replace("/", ".") + ".title", extra);
app/assets/javascripts/discourse/routes/build-category-route.js.es6:      const filterText = I18n.t('filters.' + filter.replace('/', '.') + '.title', { count: 0 }),
app/assets/javascripts/discourse/routes/build-category-route.js.es6:      return I18n.t('filters.with_category', { filter: filterText, category: category.get('name') });
app/assets/javascripts/discourse/routes/build-topic-route.js.es6:      const filterText = I18n.t('filters.' + filter.replace('/', '.') + '.title', {count: 0});
app/assets/javascripts/discourse/routes/build-topic-route.js.es6:      return I18n.t('filters.with_topics', {filter: filterText});
app/assets/javascripts/discourse/routes/discovery-categories.js.es6:    return I18n.t("filters.categories.title");