Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

i18n on attributes with pluralization/selection in Angular 7

Short question

Can I have an input element where the placeholder text changes depending on the state of the component?

Longer question

Angular has the possibility to add i18n through the following syntax example:

<input i18n-placeholder placeholder="default placeholder" />

It also has the possibility to add pluralization rules through the following syntax example:

<span i18n>
    Updated {minutes, plural, =0 {just now} =1 {one minute ago} other {{{minutes}} minutes ago}}
</span>

I've tried to merge these two features, so that the text of the placeholder changes depending on the state of the component. The component template contains the following html:

<input i18n-placeholder placeholder="Add {stuff.length, plural, =0 {} other {more}} stuff..." />

I expect the placeholder to say Add stuff... in the singular case, and Add more stuff... in the plural case, but all I get in the placeholder is Add.

Is there a way to get pluralized i18n in html attributes without copying the element and using *ngIf?

Here's a stackblitz with a working example

like image 402
ShamPooSham Avatar asked Jul 03 '19 11:07

ShamPooSham


2 Answers

This doesn't actually have much to do with i18n. It only shows that Angular doesn't seem to be able to properly parse and process plural expressions inside attributes.

A (relatively dirty) workaround would be to simply put that expression inside an invisible DOM node (a template, for example), to i18n this DOM node, and to insert the text of that DOM node inside the placeholder:

<input #myInput [placeholder]="ph.innerText">

<template #ph i18n>Add {stuff.length, plural, =0 {} other {more}} stuff...</template>

Note: it's <template>, not <ng-template>!

like image 62
JB Nizet Avatar answered Nov 13 '22 03:11

JB Nizet


There is a solution with i18nPlural pipe.

<input placeholder="{{ stuff.length | i18nPlural : {
    '=0': 'No stuff.',
    '=1': 'One stuff.',
    'other': '# stuff.'} }}">
like image 32
vasi1y Avatar answered Nov 13 '22 04:11

vasi1y