AngularJS translation with pluralization using angular-translate

Einius picture Einius · Jun 15, 2015 · Viewed 11.6k times · Source

Hello I need to make translations with pluralization depending on a value, but can't find how to do that.

for example I have variable peopleCount.

  1. peopleCount = 1 translations should be: english: {{ peopleCount }} person likes this lithuanian: {{ peopleCount }} zmogus tai megsta
  2. if peopleCount is more than 1 english translation would be: {{ peopleCount }} people like this.

but for lithuanian translations:

  1. if peopleCount is between 2 and 9 or any number ending with those numbers except numbers which ends with numbers provided in 4th rule (example: 225, 249, 210 <--- these are correct numbers. and incorrent ones: 215, 250...). it would be {{ peopleCount }} zmones tai megsta
  2. if count is between 10 and 20 or 30, 40 or any other number ending with a zero like 150 or 90 it would be {{ peopleCount }} zmoniu tai megsta

How do I accomplish that?

Answer

Ilya Dmitriev picture Ilya Dmitriev · Jun 15, 2015

Angular-translate has service with functionality of MessageFormat which is really powerful and also has built-in locale for lithuanian. Article about MessageFormat and angular-translate.

Installing

You can install this package via bower:

$ bower install angular-translate-interpolation-messageformat

After that include necessary scripts with MessageFormat and angular-translate-interpolation-messageformat in that order:

<script src="path/to/messageformat.js"></script>
<script src="path/to/angular-translate-interpolation-messageformat.js"></script>

And finally in your config function call useMessageFormatInterpolation function from $translateProvider:

$translateProvider.useMessageFormatInterpolation();

Usage

After installing angular-translate-interpolation-messageformat into your app you can work with it.

For example, you can create english localization for code 'PEOPLE' as this:

{
    "PEOPLE" : "{peopleCount, plural, one {There is one man (in lithuanian)} few {# zmones tai megsta} other {# zmoniu tai megsta}}"
}

And than use it in your html like this:

<span translate="PEOPLE" translate-values="{peopleCount: 12}" translate-interpolation="messageformat"></span>

The output will be: "12 zmones tai megsta".