18.2. Zend_Locale verwenden

Zend_Locale liefert auch lokalisierte Informationen über Gebietsschema für jedes Gebietsschema. Das beinhaltet unser anderem lokalisierte Namen für andere gebietsschema, Tage der Woche, Monatsnamen, usw.

18.2.1. Kopieren, Klonen und Serialisieren von Gebietsschema Objekten

Verwende Klonen von Objekten um Gebietsschema Objekte exakt und effizient zu duplizieren. Die meisten lokalisierbaren Methoden akzeptieren auch eine Zeichenkette welche das Gebietsschema repräsentiert. Dieser entspricht dem Ergebnis von $locale->toString().

Beispiel 18.8. Klonen

<?php
require_once 'Zend/Locale.php';

$locale = new Zend_Locale('ar');

// Speichere das $locale Objekt als Serialisierung
$serializedLocale = $locale->serialize();
// Wiedererstellung des Original Objekts
$localeObject = unserialize($serializedLocale);

// Erhalte eine Zeichenkette welche das Gebietsschema identifiziert
$stringLocale = $locale->toString();

// Erstelle eine geklonte Kopie des $locale Objektes
$copiedLocale = clone $locale;

print "copied: ", $copiedLocale->toString();
print "copied: ", $copiedLocale; // PHP ruft automatisch toString() über __toString(); auf
?>

18.2.2. isEqual() - Gleichheit

Zend_Locale bietet auch eine erwartete Funktion zum Vergleichen von zwei Gebietsschema an. Alle lokalisierbaren Klassen sollten eine Vergleichbare Funktion für eine Gleichheitsprüfung anbieten.

Beispiel 18.9. Prüfung auf gleiche Gebietsschemata

<?php
require_once 'Zend/Locale.php';

$locale = new Zend_Locale();
$mylocale = new Zend_Locale('en_US');

// Prüfe ob die Gebietsschema gleich sind
if ($locale->isEqual($mylocale) { 
    print "Die Gebietsschemata sind gleich";
}
?>

18.2.3. Standard Gebietsschemata

Die Methode getDefault() gibt ein Array mit relevanten Gebietsschemata zurück wobei Informationen vom Web Browser des Benutzers (wenn vorhanden), Informationen vom Betriebsystem des Host Servers und ZF Einstellungen benutzt werden. Wie beim Konstruktor von Zend_Locale wählt der erste Parameter die bevorzugte Umgebung von der die Informationen zuerst geholt werden sollen (BROWSER, ENVIRONMENT, or FRAMEWORK) . Der zweite Parameter wechselt zwischen der Rückgabe aller gefundenen Gebietsschemata oder nur dem ersten/besten Gebietsschema. Lokalisierbare Komponenten benutzen normalerweise nur das erste Gebietsschema. Wenn vorhanden, wird eine Bewertung der Qualität mit angegeben.

Beispiel 18.10. Das Standard Gebietsschema erhalten

<?php
require_once 'Zend/Locale.php';

$locale = new Zend_Locale();

// Alle Standard Gebietsschema zurückgeben
$found = $locale->getDefault();
print_r($found);

// Nur die Gebietsschema des Browsers zurück geben
$found2 = $locale->getDefault(Zend_Locale::BROWSER,TRUE);
print_r($found2);
?>

Um nur die Standard Gebietsschema für BROWSER, ENVIRONMENT, oder FRAMEWORK zu erhalten, können die folgenden Methoden benutzt werden:

  • getEnvironment()

  • getBrowser()

  • getLocale()

18.2.4. Ein neues Gebietsschema setzen

Ein neues Gebietsschema kann mit der Funktion setLocale() gesetzt werden. Diese Funktion nimmt eine Gebietsschema Zeichenkette als Parameter an. Wenn kein Gebietsschema angegeben wurde, wird ein automatisch gewähltes Gebietsschema benutzt. Da Zend_Locale Objekte sehr "leicht" sind, existiert diese Methode hauptsächlich um Nebeneffekte auszuschließen, für Klassen die ein existierendes angelegtes Objekt referenzieren.

Beispiel 18.11. setLocale

<?php
require_once 'Zend/Locale.php';

$locale = new Zend_Locale();

// Aktuelles Gebietsschema
print $locale->toString();

// neues Gebietsschema
$locale->setLocale('aa_DJ');
print $locale->toString();
?>

18.2.5. Auslesen von Sprache und Region

getLanguage() gibt eine Zeichenkette zurück welche den zwei-Zeichen Code der Sprache des Gebietsschemas enthält. getRegion() gibt eine Zeichenkette zurück welche den Zwei-Zeichen Code der Region des Gebietsschemas enthält.

18.2.6. Lokalisierte Zeichenketten beschaffen

getTranslationList() gibt Zugriff auf viele Arten von lokalisierten Informationen. Diese Informationen sind sehr nützlich wenn man einem Benutzer lokalisierte Daten anzeigen will, ohne das man alles Übersetzen muß. Diese Informationen sind bereits für den Gebrauch vorhanden.

Man kann diese Informationen für alle Sprachen auslesen. Aber nicht alle dieser Informationen sind komplett für alle Sprachen. Einige dieser Arten sind auch durch eine eigene Funktion erhältlich wegen der Einfachheit. Anbei eine Liste für detailierte Informationen hierüber.

Tabelle 18.1. Details für getTranslationList($type = null, $locale = null)

Type Zusätzliche Funktion Beschreibung Vollständigkeit
Language getLanguageTranslationList Lokalisierte Liste aller Sprachen Komplett
Script getScriptTranslationList Lokalisierte Sprache aller Schriften/Schreibweisen Komplett
Country getCountryTranslationList Lokalisierte Liste aller Länder Komplett
Territory getTerritoryTranslationList Lokalisierte Liste aller Gegenden/Kontinente Komplett
Calendar   Lokalisierte Liste aller Kalendar-Namen Komplett
Month   Lokalisierte Liste aller Monatsnamen Komplett
Month_short   Lokalisierte Liste aller abgekürzten Monatsnamen (normalerweise nur 2-4 Zeichen) Komplett
Month_narrow   Lokalisierte Liste aller eingeengten Monatsnamen (normalerweise nur ein Zeichen) Komplett
Day   Lokalisierte Liste aller Tage Komplett
Day_short   Lokalisierte Liste aller abgekürzten Tage (normalerweise nur 2-4 Zeichen) Komplett
Day_narrow   Lokalisierte Liste aller eingeengten Tage (normalerweise nur ein Zeichen) Komplett
Dateformat   Lokalisierte Liste aller Datumsformate Komplett
Timeformat   Lokalisierte Liste aller Zeitformate Komplett
Timezone   Lokalisierte Liste aller bekannten Zeitzonen Nicht komplett, da Sie sich von Sprache zu Sprache unterscheiden
Currency   Lokalisierte Liste aller bekannten Währungen Nicht komplett, da Sie sich von Sprache zu Sprache unterscheiden
Currency_sign   Lokalisierte Liste aller bekannten Symbole für Währungen Nicht komplett, da Sie sich von Sprache zu Sprache unterscheiden
Currency_detail   Liste aller Länder und der aktuell benutzten Währung in diesen Ländern Komplett
Territory_detail   Liste aller Gegenden/Kontinente und der Länder welche in diesen Gegenden/Kontinenten enthalten sind Komplett
Language_detail   Liste aller Länder und der bekannten gesprochenen Sprachen in diesen Ländern Komplett
Characters   Liste aller bekannten Zeichen für dieses Gebietsschema, regex Syntax Komplett

Wenn ein einzelner übersetzter Wert benötigt wird, kann stattdessen getTranslation() statt getTranslationList() benutzt werden. Sie gibt eine einzelne Zeichenkette oder ein Array zurück, abhängig davon ob das Ergebnis mehrere Werte enthalten kann (zum Beispiel 'language_detail' weil eine Sprache in mehr als einem Land gesprochen wird), oder nur einen Wert (zum Beispiel 'language' weil es für eine Sprache immer nur einen Übersetzten Namen gibt). Beide Funktionen akzeptieren die Arten in der oben angeführten Liste. Wegen der Bequemlichkeit gibt es die folgenden einfachen und zu den zwei oben beschriebenen Funktionen auch gleichwertigen Funktionen:

Beispiel 18.12. Bequemliche Funktionen für getTranslation()

<?php
getCountryTranslation($what, $locale = null)
getCountryTranslationList($locale = null)
getLanguageTranslation($what, $locale = null)
getLanguageTranslationList($locale = null)
getScriptTranslation($what, $locale = null)
getScriptTranslationList($locale = null)
getTerritoryTranslation($what, $locale = null)
getTerritoryTranslationList($locale = null)
?>

Das folgende Beispiel zeigt wie man die Namen für Dinge in verschiedenen Sprachen erhalten kann.

Beispiel 18.13. getTranslationList

<?php
require_once 'Zend/Locale.php';

$locale = new Zend_Locale('en_US');
// Gibt die Namen aller Länder in der Französischen Sprache aus
print_r($locale->getTranslationList('country', 'fr'));
?>

Das nächste Beispiel zeigt wie der Name einer Sprache in einer anderen Sprache gefunden werden kann, wenn der Zwei-Zeichen Länder-Code der CLDR unbekannt ist.

Beispiel 18.14. Konvertierung des Ländernamens von einer Sprache in eine andere Sprache

<?php
require 'Zend/Locale.php';
$locale = new Zend_Locale('en_US');
$code2name = $locale->getLanguageTranslationList();
$name2code = array_flip($code2name);
$frenchCode = $name2code['French'];
echo $locale->getLanguageTranslation($frenchCode, 'es');
// Ausgegeben wird der Spanische Name der Fransösischen Sprache
?>

Um etwas mehr Erfahrung damit zu bekommen was verfügbar ist, sollen die Beispiele ausprobiert und die Ausgabe angesehen werden.

Beispiel 18.15. Alle möglichen Übersetzungen

<?php
// Erhalte eine Liste aller Übersetzungslisten
$lists = $locale->getTranslationList();

// Zeige alle vorhandenen Übersetzungslisten (viel Ausgabe, alles in der gewählten Sprache)
foreach ($lists as $list) {
    echo "List $list = ";
    print_r($locale->getTranslationList($list));
}
?>

Um von Zend_Locale eine Liste aller bekannten Sprachen zu bekommen wobei jede Sprache in Ihrer eigenen Sprache geschrieben wird, kann das untere Beispiel in einer Web Seite benutzt werden. Genauso können getCountryTranslationList() und getRegionDisplay() benutzt werden um eine Tabelle zu erhalten die Namen für Muttersprachen einer Region und Namen für Regionen in einer anderen Sprache zu erhalten. getCalendarTranslationList() und getCalendarDisplay() arbeiten auf die gleiche Art und Weise. Man muß einen try .. catch Block benutzen um Ausnahmen abzufangen die auftreten wenn ein Gebietsschema benutzt wird das nicht existiert. Nicht alle Sprachen sind auch ein Gebietsschema. Im Beispiel werden die Ausnahmen ignoriert um einen frühen Abbruch zu verhindern.

Beispiel 18.16. Alle Sprachen geschrieben in Ihrer Muttersprache

<?php
require_once 'Zend/Locale.php';

$sourceLanguage = null; // Setze hier deine Muttersprache ein
$locale = new Zend_Locale($sourceLanguage);
$list = $locale->getLanguageTranslationList();

foreach($list as $language => $content) {
    try {
        $output = $locale->getLanguageDisplay($language, $language);
        if (is_string($output)) {
            print "\n<br>[".$language."] ".$output;
        }
    } catch (Exception $e) {
        continue;
    }
}
?>

18.2.7. Übersetzungen für "Ja" und "Nein" erhalten

Oft müssen Programme eine "Ja" oder "Nein" Rückmeldung eines Benutzers erkennen. getQuestion() gibt ein Array zurück welches die richtigen Wörter oder Regex Zeichenketten enthält um einem Benutzer in einer bestimmten $locale zu antworten (Standardmäßig das aktuelle Gebietsschema des Objekts). Das Array enthält sechs Wertepaare, für "Ja", "Nein", deren Abkürzungen und Regex Zeichenketten für das korrekte Analysieren wie im Beispiel gezeigt.

Beispiel 18.17. getQuestion()

<?php
require_once 'Zend/Locale.php';

$locale = new Zend_Locale();

// Zeichenketten für Fragen
print_r($locale->getQuestion('de'));

- - - Output - - -

Array
(
    [yes]ja[/yes]
    [no]nein[/no]
    [yesabbr]j[/yesabbr]
    [noabbr]n[/noabbr]
    [yesexpr]^([yY]([eE][sS])?)|([jJ][aA]?)[/yesexpr]
    [noexpr]^([nN]([oO]|([eE][iI][nN]))?)[/noexpr]
)
?>