Mailinglist Archive: opensuse-translation (62 mails)

< Previous Next >
Re: [opensuse-translation] Adding a new language
  • From: Karl Eichwalder <ke@xxxxxxx>
  • Date: Fri, 12 Oct 2007 13:41:59 +0200
  • Message-id: <shy7e8muew.fsf@xxxxxxxxxxxxxxx>
Mike FABIAN <mfabian@xxxxxxx> writes:

> We have a suitable font since openSUSE 10.3.
> Family name: "Abyssinica SIL"
> File name:   /usr/share/fonts/truetype/Abyssinica_SIL.ttf
> Package name: sil-abyssinica
> :lang=aa|am|ast|ay|bi|br|ch|co|da|de|en|es|et|eu|fi|fj|fo|fr|fur|fy|gd|gez|gl|gv|ho|ia|id|ie|io|is|it|lb|mg|nb|nds|nl|nn|no|oc|om|pt|rm|sma|smj|so|sq|sv|sw|tig|tn|ts|vo|vot|wa|xh|yap|zu

That's great--thanks for verifying, Mike.

Alex, is there more than 1 plural form in your language?  Please,

    0 (zero) trees
    1 (one)  tree
    2 (two)  trees
    3        trees
   10        trees
  100        trees

For more info about plural form, see the gettext manual:

After the first complaints from people internationalizing the code
people either completely avoided formulations like this or used strings
like `"file(s)"'.  Both look unnatural and should be avoided.  First
tries to solve the problem correctly looked like this:

        if (n == 1)
          printf ("%d file deleted", n);
          printf ("%d files deleted", n);

   But this does not solve the problem.  It helps languages where the
plural form of a noun is not simply constructed by adding an `s' but
that is all.  Once again people fell into the trap of believing the
rules their language is using are universal.  But the handling of plural
forms differs widely between the language families.  For example, Rafal
Maszkowski `<rzm@xxxxxxxxxxxxxxxx>' reports:

     In Polish we use e.g. plik (file) this way:
          1 plik
          2,3,4 pliki
          5-21 pliko'w
          22-24 pliki
          25-31 pliko'w
     and so on (o' means 8859-2 oacute which should be rather okreska,
     similar to aogonek).

   There are two things which can differ between languages (and even
inside language families);

   * The form how plural forms are built differs.  This is a problem
     with languages which have many irregularities.  German, for
     instance, is a drastic case.  Though English and German are part
     of the same language family (Germanic), the almost regular forming
     of plural noun forms (appending an `s') is hardly found in German.

   * The number of plural forms differ.  This is somewhat surprising for
     those who only have experiences with Romanic and Germanic languages
     since here the number is the same (there are two).

     But other language families have only one form or many forms.  More
     information on this in an extra section.


   The information about the plural form selection has to be stored in
the header entry of the PO file (the one with the empty `msgid' string).
The plural form information looks like this:

     Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;

   The `nplurals' value must be a decimal number which specifies how
many different plural forms exist for this language.  The string
following `plural' is an expression which is using the C language
syntax.  Exceptions are that no negative numbers are allowed, numbers
must be decimal, and the only variable allowed is `n'.  Spaces are
allowed in the expression, but backslash-newlines are not; in the
examples below the backslash-newlines are present for formatting
purposes only.  This expression will be evaluated whenever one of the
functions `ngettext', `dngettext', or `dcngettext' is called.  The
numeric value passed to these functions is then substituted for all uses
of the variable `n' in the expression.  The resulting value then must
be greater or equal to zero and smaller than the value given as the
value of `nplurals'.

The following rules are known at this point.  The language with families
are listed.  But this does not necessarily mean the information can be
generalized for the whole family (as can be easily seen in the table

Only one form:
     Some languages only require one single form.  There is no
     distinction between the singular and plural form.  An appropriate
     header entry would look like this:

          Plural-Forms: nplurals=1; plural=0;

     Languages with this property include:

    Asian family
          Japanese, Korean, Vietnamese

    Turkic/Altaic family

Two forms, singular used for one only
     This is the form used in most existing programs since it is what
     English is using.  A header entry would look like this:

          Plural-Forms: nplurals=2; plural=n != 1;

     (Note: this uses the feature of C expressions that boolean
     expressions have to value zero or one.)

     Languages with this property include:

    Germanic family
          Danish, Dutch, English, Faroese, German, Norwegian, Swedish

    Finno-Ugric family
          Estonian, Finnish

    Latin/Greek family

    Semitic family

    Romanic family
          Italian, Portuguese, Spanish


     Another language using the same header entry is:

    Finno-Ugric family

     Hungarian does not appear to have a plural if you look at
     sentences involving cardinal numbers.  For example, "1 apple" is
     "1 alma", and "123 apples" is "123 alma".  But when the number is
     not explicit, the distinction between singular and plural exists:
     "the apple" is "az alma", and "the apples" is "az alma'k".  Since
     `ngettext' has to support both types of sentences, it is
     classified here, under "two forms".

Two forms, singular used for zero and one
     Exceptional case in the language family.  The header entry would

          Plural-Forms: nplurals=2; plural=n>1;

     Languages with this property include:

    Romanic family
          French, Brazilian Portuguese

Three forms, special case for zero
     The header entry would be:

          Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;

     Languages with this property include:

    Baltic family

Three forms, special cases for one and two
     The header entry would be:

          Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;

     Languages with this property include:

          Gaeilge (Irish)

Three forms, special case for numbers ending in 00 or [2-9][0-9]
     The header entry would be:

          Plural-Forms: nplurals=3; \
              plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;

     Languages with this property include:

    Romanic family

Three forms, special case for numbers ending in 1[2-9]
     The header entry would look like this:

          Plural-Forms: nplurals=3; \
              plural=n%10==1 && n%100!=11 ? 0 : \
                     n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2;

     Languages with this property include:

    Baltic family

Three forms, special cases for numbers ending in 1 and 2, 3, 4, except those ending in 1[1-4]
     The header entry would look like this:

          Plural-Forms: nplurals=3; \
              plural=n%10==1 && n%100!=11 ? 0 : \
                     n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;

     Languages with this property include:

    Slavic family
          Croatian, Serbian, Russian, Ukrainian

Three forms, special cases for 1 and 2, 3, 4
     The header entry would look like this:

          Plural-Forms: nplurals=3; \
              plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;

     Languages with this property include:

    Slavic family
          Slovak, Czech

Three forms, special case for one and some numbers ending in 2, 3, or 4
     The header entry would look like this:

          Plural-Forms: nplurals=3; \
              plural=n==1 ? 0 : \
                     n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;

     Languages with this property include:

    Slavic family

Four forms, special case for one and all numbers ending in 02, 03, or 04
     The header entry would look like this:

          Plural-Forms: nplurals=4; \
              plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;

     Languages with this property include:

    Slavic family

Karl Eichwalder
R&D / Documentation

SUSE LINUX Products GmbH, GF: Markus Rex, HRB 16746 (AG Nuernberg)
To unsubscribe, e-mail: opensuse-translation+unsubscribe@xxxxxxxxxxxx
For additional commands, e-mail: opensuse-translation+help@xxxxxxxxxxxx

< Previous Next >