# Schreibweisen von Pluralformen für Übersetzungen

Ab Zend Framework 1.9 ist `Zend_Translate` in der Lage, Unterstützung für Pluralformen anzubieten. Professionelle Übersetzung wird immer die Notwendigkeit haben, den Plural zu verwenden, da dieser in allen Sprachen gängig ist.

Was sind Pluralformen? Im Allgemeinen sind Wörter im Plural Wörter, die eine numerische Bedeutung haben. Wie man sich sicher vorstellen kann, hat jede Sprache ihre eigene Definition von Pluralformen. Im Englischen gibt es einen einzigen Plural. Es gibt einen Singular, zum Beispiel "Car", was implizit ein Auto bedeutet. Und es gibt den Plural "Cars", welcher mehr als ein Auto aber auch null Autos bedeuten kann. Andere Sprachen wie russisch oder polnisch haben mehrere Pluralformen und auch die Regeln für die Pluralformen sind unterschiedlich.

Wenn man Pluralformen mit `Zend_Translate` verwenden will, muß man nicht wissen, wie Pluralformen definiert werden. Nur der Übersetzer muß das wissen, da er die Übersetzung durchführt. Die einzige Information, die man haben muß, ist die Sprache.

Es gibt zwei Wege für die Verwendung von Pluralformen: den traditionellen, der bedeutet, dass man eine eigene Methode verwendet, und einen modernen, der es erlaubt, Übersetzungen im Plural mit der gleichen Methode durchzuführen wie normale Übersetzungen.

## Traditionelle Übersetzung des Plurals

Personen, die in der Vergangenheit mit Gettext gearbeitet haben, werden mit traditionellen Pluralübersetzungen besser zurechtkommen. Es gibt eine eigene Methode `plural()`, die für Übersetzungen des Plurals verwendet werden kann.

### Beispiel einer traditionellen Übersetzung des Plurals

Die Methode `plural()` akzeptiert 4 Parameter. Der erste Parameter ist die messageId des Singular, der zweite ist die messageId des Plural und der dritte ist die Zahl oder Menge.

Die Zahl wird verwendet, um den Plural zu erkennen, der zurückzugeben ist. Als optionaler vierter Parameter kann ein Gebietsschema angegeben werden, das verwendet wird, um die Übersetzung zurückzugeben.

    $translate = new Zend_Translate(
        array(
            'adapter' => 'gettext',
            'content' => '/path/to/german.mo',
            'locale'  => 'de'
        )
    );
    $translate->plural('Car', 'Cars', $number);

## Moderne Übersetzungen des Plurals

Da traditionelle Übersetzungen des Plurals begrenzt ist auf Quellcode, der die englische Pluralform verwendet, wurde ein neuer Weg für Übersetzungen des Plurals hinzugefügt. Er erlaubt es, die gleiche `translate()` Methode für normale und Pluralübersetzungen zu verwenden.

Um Plural-Übersetzungen mit `translate()` zu verwenden, muß man statt einem String ein Array als messageId angeben. Dieses Array muß die originalen messageId's der Plurale enthalten, dann die Anzahl und als letztes ein optionales Gebietsschema, wenn die angegebenen messageId's nicht in englischer Schreibweise vorliegen.

### Beispiel für moderne Übersetzungen des Plurals

Wenn wir dieselben Pluraldefinitionen übersetzen wollen wie vorher, dann müsste unser Beispiel wie folgt aussehen.

    $translate = new Zend_Translate(
        array(
            'adapter' => 'gettext',
            'content' => '/path/to/german.mo',
            'locale'  => 'de'
        )
    );
    $translate->translate(array('Car', 'Cars', $number));

Bei der Verwendung von Pluralübersetzungen ist es auch möglich, jede Sprache als Quelle für messageId's zu verwenden.

### Beispiel einer modernen Übersetzung des Plurals durch Verwendung einer anderen Quellsprache

Nehmen wir an, wir wollen russisch verwenden und nehmen wir außerdem an, dass die gegebenen messageId's russisch und nicht englisch sind.

    $translate = new Zend_Translate(
        array(
            'adapter' => 'gettext',
            'content' => '/path/to/german.mo',
            'locale'  => 'de'
        )
    );
    $translate->translate(array('Car',
                                'Cars first plural',
                                'Cars second plural',
                                $number,
                                'ru'));

Wie man sieht, kann man mehr als ein englisches Plural angeben. Aber dann muß man die Quellsprache angeben, damit `Zend_Translate` in diesem Fall weiß, welche Pluralregeln anzuwenden sind.

Wenn man die Pluralsprache nicht angibt, dann wird standardmäßig englisch verwendet und jede zusätzliche Pluraldefinition wird ignoriert.

## Pluralquelldateien

Nicht alle Quellformate unterstützen Pluralformen. Sehen Sie sich für Details diese Liste an:

### Unterstützung für Plural

Adapter | Plural unterstützt
--- | ---
Array | Ja
Csv | Ja
Gettext | Ja
Ini | Nein
Qt | Nein
Tbx | Nein
Tmx | Nein
Xliff | Nein
XmlTm | Nein

Im folgenden sind Beispiele für die Definition von Pluralquelldateien zu finden.

### Array-Quellen mit Pluraldefinitionen

Ein Array mit Pluraldefinitionen hat wie im folgenden Beispiel auszusehen.

    array(
        'plural_0' => array(
            'plural_0 (ru)',
            'plural_1 (ru)',
            'plural_2 (ru)',
            'plural_3 (ru)'
        ),
        'plural_1' => ''
    );

Im obigen Beispiel sind 'plural_0' und 'plural_1' die Pluraldefinitionen des Quellcodes. Und im Array 'plural_0' sind alle übersetzten Pluralformen verfügbar. Sehen Sie sich das folgende Beispiel an, das tatsächlichen Inhalt und die Übersetzung von einer englischen Quelle ins Deutsche beinhaltet.

    array(
        'Car' => array(
            'Auto',
            'Autos'
        ),
        'Cars' => ''
    );

Wenn die eigene übersetzte Sprache mehr Pluralformen unterstützt, müssen diese einfach an das Array der ersten Pluralform angehängt werden. Wenn die eigene Quellsprache mehr Pluralformen unterstützt, dann muß einfach eine neue leere Übersetzung hinzugefügt werden.

### CSV-Quellen mit Pluraldefinitionen

Eine CSV-Datei mit Pluraldefinitionen muß wie im folgenden Beispiel aussehen.

    "plural_0";"plural_0 (ru)";"plural_1 (ru)";"plural_2 (ru)";"plural_3 (ru)"
    "plural_1";

Alle übersetzten Pluralformen müssen nach dem ersten Plural der Quellsprache hinzugefügt werden. Und alle weiteren Pluralformen der Quellsprache müssen darunter ohne Übersetzung hinzugefügt werden. Es ist zu beachten, dass ein Trennzeichen bei den leeren Quellpluralformen hinzugefügt werden muß.

### Gettext-Quellen mit Pluraldefinitionen

Gettext-Quellen unterstützen Pluralformen von Haus aus. Es gibt keine Notwendigkeit Anpassungen durchzuführen, da die `*.mo` Datei alle notwendigen Daten enthält.

Es ist zu beachten, dass Gettext die Verwendung von Quellsprachen, welche keine englischen Pluralformen verwenden, nicht unterstützt. Wenn man plant Quellsprachen zu verwenden, welche andere Pluralformen unterstützt, wie zum Beispiel russisch, dann kann man Gettext nicht als Quelle verwenden.

## Eigene Pluralregeln

In seltenen Fällen kann es nützlich sein, wenn man in der Lage ist eigene Pluralregeln zu definieren. Chinesisch zum Beispiel. Diese Sprache definiert zwei Pluralregeln. Standardmäßig verwendet Sie kein Plural. Aber in seltenen Fällen wird eine Regel wie diese verwendet: (number == 1) ? 0 : 1.

Auch wenn man eine Sprache verwenden will, die keine bekannten Plural Regeln hat und man eigene Regeln definieren will.

Das kann durch Verwendung von `Zend_Translate_Plural::setRule()` getan werden. Diese Methode erwartet zwei Parameter, welche angegeben werden müssen. Eine Regel, welche einfach ein Callback zu einer selbst definierten Methode ist. Und ein Gebietsschema für das diese Regel verwendet wird.

Die eigene Regel könnte wie folgt aussehen:

    public function MyRule($number) {
        return ($number == 10) ? 0 : 1;
    }

Wie man sieht muss die eigene Regel einen Parameter akzeptieren. Er ist eine Zahl die man verwendet um zurückzugeben, welches Plural der Übersetzung verwendet werden muss. In unserem Beispiel haben wir definiert, dass wenn wir eine '10' erhalten, die Plural Definition 0 verwendet werden soll, und in allen anderen Fälle verwenden wir eine 1.

Eigene Regeln können so einfach oder so kompliziert sein wie man will. Man muss einfach nur einen Integer-Wert zurückgeben. Die Pluraldefinition 0 steht hierbei für die Singular-Übersetzung und 1 steht für die erste Pluralregel.

Um die eigene Regel zu aktivieren und diese mit dem gewünschten Gebietsschema zu verknüpfen, muss man den folgenden Aufruf tätigen:

    Zend_Translate_Plural::setPlural('MyPlural', 'zh');

Jetzt haben wir unsere Pluraldefinition mit der chinesischen Sprache verknüpft.

Man kann für jede Sprache eigene Pluralregeln definieren. Aber man sollte aufpassen dass man Pluralregeln setzt, bevor Übersetzungen durchgeführt werden.

### Eigene Pluralregeln nur definieren, wenn dies benötigt wird

`Zend_Translate` definiert Plurale für die meisten bekannten Sprachen. Man sollte keine eigenen Plurale definieren, wenn man das nicht benötigt. Die Standardregeln funktionieren meistens.