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.
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 ?>
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.
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()
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.
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.
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; } } ?>
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] ) ?>