Quite singular plurals
In most languages, the singular is the unmarked form of a word, and the plural is obtained by inflecting the singular. For instance, to the singular form cat of the English language matches the plural form cats. English counts two grammatical numbers: singular and plural. Other languages have different forms of grammatical numbers depending on the number of items.
Different types of plurals
Some languages have a dual plural corresponding to two units, like Arabic, Slovene or Tahitian). In Slovene, for instance, one house is said mesto, two houses, mesti and more than two houses, mesta. In Arabic, hisan is used for one horse, hisan-an for two horses, and ahsinah for more than two horses.
The trial plural corresponds to three units, as in the Mwotlap language spoken in Vanuatu: na-m°alm°al (the girl), yô-ge m°alm°al (the two girls), têl-ge m°alm°al (the three girls), and ige m°alm°al (the girls).
To the quadral plural correspond four units, and Sursurunga from Papua New Guinea is often cited as an example for using it, although the authors prefer the idea of a form of paucal to mean approximately four items. This language would therefore have a dual plural, a paucal (about three units) and a greater paucal (about four units), before reaching the generic plural of larger numbers, or a number of units beyond the particular plurals.
The paucal plural is thus restricted to a small number of units, and means “a few”. Its upper boundary remains vague and its lower boundary depends on the system it is based on. For example, in Baiso, a Cushitic language spoken in Ethiopia, lubán-titi means one lion, luban-jaa, a few lions, and luban-jool, many lions.
There is also the collective which groups a set of units, and the singulative which isolates one. In Breton, a mouse (logodenn) is the singulative form of logod (mice in general), we can render plural in a specific context (logodennoù). Welsh, Arabic, and Nilo-Saharan languages also exhibit this characteristic. The colective number should not be confused with the collective noun (a school of fishes, a pack of wolves) which can have a plural form.
Some nouns are uncountable: they do not have a plural form a priori, with some exceptions. In English, courage remains singular (it is defined as a mass noun), whereas wine can be made plural, with a slight change of meaning. If we can say table wines or red wines, we cannot count it (one wine, two wines). But the count nouns of a language cannot necessarily be counted in another. You can count potatoes in English, but not in Russian: картошка rather means some potato.
Finally, there is a distributive plural number which considers a set of units as independent units, as we can find in Navajo for instance where it is indicated by the prefix da: kǫ’, one fire, and daakǫ’, many fires considered individually.
Last case often forgotten: pairs. Some objects occur in pairs without corresponding to a dual number, with pairs of a language not necessarily being pairs of another. To the English (a pair of) trousers corresponds the French pantalon, which complicates the pluralization in calque, a singular word in a language being plural in another.
The issue of plural localization
We call localization the process of preparing a software, an application or a web site to make it support different languages. Ideally, this process needs to be thought beforehand, even though most of the time new languages are added later on when we want to adapt to other target cultures.
In most Indo-European languages, we find the two grammatical numbers that are the singular and the plural, to which we can add the empty value (for a number of zero elements).
Whether we want to manage a single language or several languages in the same application, by using a system associating a word or phrase to a key, it is often necessary to manage the different possible grammatical numbers.
For example, an interface can display 0 message (or No message), 1 message (or One message), or else n messages, n being a placeholder to be replaced on the fly during processing.
A naive approach is to treat the different cases based on a condition depending on the value of n at the instant of the generation of the string to display. This approach has two major drawbacks: the code becomes heavy quite fast, and above all it does not adapt to languages with different grammatical numbers.
If your code seems a priori internationalized since it supports English, French and German, it will be no more when you will want to support Russian and Slovenian on top of them.