View Helpers
In This Article
Plural
Most languages have specific rules for handling plurals. For instance, in English, we say "0 cars" and "2 cars" (plural) while we say "1 car" (singular). On the other hand, French uses the singular form for both 0 and 1 ("0 voiture" and "1 voiture") and the plural form otherwise ("3 voitures").
Therefore we often need to handle plural cases even without translation
(mono-lingual application). The Plural
helper was created for this.
Plural helper does not translate
If you need to handle both plural cases and translations, you must use the
TranslatePlural
helper;Plural
does not translate.
Internally, the Plural
helper uses the Zend\I18n\Translator\Plural\Rule
class to handle rules.
Setup
Defining plural rules is left to the developer. To help you with this process, here are some links with up-to-date plural rules for tons of languages:
- http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
- https://developer.mozilla.org/en-US/docs/Localization_and_Plurals
Define Plural Rules
As an example, you could add the following code in your
Module
class:
// Get the ViewHelperPlugin Manager from the ServiceManager, so we can fetch the
// Plural helper and add the plural rule for the application's language:
$viewHelperManager = $serviceManager->get('ViewHelperManager');
$pluralHelper = $viewHelperManager->get('Plural');
Rule for French
$pluralHelper->setPluralRule('nplurals=2; plural=(n==0 || n==1 ? 0 : 1)');
The string reads as follows:
- First, we specify how many plural forms we have. For French, only two (singular/plural).
- Next, we specify the rule. Here, if the count is 0 or 1, this is rule n°0 (singular) while it's rule n°1 otherwise.
Rule for English
As noted earlier earlier, English considers "1" as singular and "0/other" as plural. Here is how that would be declared:
$pluralHelper->setPluralRule('nplurals=2; plural=(n==1 ? 0 : 1)');
Basic Usage
Now that we have defined the rule, we can use it in our view scripts.
French
echo $this->plural(['voiture', 'voitures'], 0); // 'voiture'
echo $this->plural(['voiture', 'voitures'], 1); // 'voiture'
echo $this->plural(['voiture', 'voitures'], 2); // 'voitures'
English
echo $this->plural(['car', 'cars'], 0); // 'cars'
echo $this->plural(['car', 'cars'], 1); // 'car'
Found a mistake or want to contribute to the documentation? Edit this page on GitHub!