Zend_Locale verwendenZend_Locale liefert auch lokalisierte Informationen über
Gebietsschema für jedes Gebietsschema. Das beinhaltet unter anderem lokalisierte Namen für
andere Gebietsschema, Tage der Woche, Monatsnamen, usw.
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().
Klonenserialize();
// Wiedererstellung des Original Objekts
$localeObject = unserialize($serializedLocale);
// Erhalte eine Zeichenkette welche das Gebietsschema identifiziert
$stringLocale = $locale->toString();
// Erstelle eine geklonte Kopie des $locale Objekts
$copiedLocale = clone $locale;
print "copied: ", $copiedLocale->toString();
// PHP ruft automatisch toString() über __toString(); auf
print "copied: ", $copiedLocale;
]]>GleichheitZend_Locale bietet auch eine bequeme Funktion zum Vergleichen
von zwei Gebietsschema an. Alle lokalisierbaren Klassen sollten eine vergleichbare
Funktion für eine Gleichheitsprüfung anbieten.
Prüfung auf gleiche Gebietsschemataequals($mylocale)) {
print "Die Gebietsschemata sind gleich";
}
]]>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 Zend Framework
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, oder FRAMEWORK). Der
zweite Parameter wechselt zwischen der Rückgabe aller gefundenen Gebietsschemata
oder nur dem ersten oder besten Gebietsschema. Lokalisierbare Komponenten benutzen
normalerweise nur das erste Gebietsschema. Wenn vorhanden, wird eine Bewertung der
Qualität mit angegeben.
Das Standard-Gebietsschema erhaltengetDefault();
print_r($found);
// Nur die Gebietsschemata des Browsers zurückgeben
$found2 = $locale->getDefault(Zend_Locale::BROWSER, TRUE);
print_r($found2);
]]>
Um nur die Standard-Gebietsschemata für BROWSER,
ENVIRONMENT, oder FRAMEWORK zu
erhalten, können die folgenden Methoden benutzt werden:
getEnvironment()getBrowser()getLocale()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.
setLocaletoString();
// neues Gebietsschema
$locale->setLocale('aa_DJ');
print $locale->toString();
]]>Auslesen von Sprache und RegiongetLanguage() 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.
getLanguage and getRegiongetLanguage();
// Wenn das Gebietsschema 'de_AT' ist, wird 'AT' als Region zurückgegeben
print $locale->getRegion();
]]>Ein Gebietsschema durch die Angabe eines Territoriums erhalten
Wenn man nur ein Territorium oder ein Land hat, dann ist es auch möglich aus diesen
Informationen ein Gebietsschema zu erhalten. Man kann manuell suchen, ob es ein
Gebietsschema für dieses Territorium gibt, indem man
getLocaleToTerritory() verwendet. Diese Methode gibt ein
Gebietsschema für das angegebene Territorium zurück, oder NULL
wenn kein Gebietsschema gefunden werden konnte.
getLocaleToTerritoryGroßgeschriebene Territorien
Wenn man weiß dass man ein Territorium verwendet, dann sollte es großgeschrieben
werden. Andernfalls könnte man der Meinung sein, ein falsches Gebietsschema zu
erhalten, wenn man andere Methoden verwendet. Beispiel: Wenn man "om" angibt, dann
gibt getLocaleToTerritory() "ar_OM" zurück, da es weiß
dass man ein Territorium meint. Aber alle anderen Methoden werden "om" zurückgeben,
da dies auch eine Sprache ist.
Wenn man also weiß, dass ein angegebener String ein Territorium ist, dann sollte man
entweder getLocaleToTerritory() selbst verwenden, bevor man
ein Gebietsschema erstellt, oder die Eingabe groß schreiben.
Lokalisierte Zeichenketten erhaltengetTranslationList() gibt Zugriff auf viele Arten von
lokalisierten Informationen. Diese Informationen sind sehr nützlich, wenn man einem
Benutzer lokalisierte Daten anzeigen will, ohne dass man alles übersetzen muss. Diese
Informationen sind bereits für den Gebrauch vorhanden.
Die angefragte Liste an Informationen wird immer als benanntes Array zurückgegeben. Wenn
mehr als ein Wert zu einem expliziten Typ angegeben werden soll, von dem man Werte
erhalten will, muss ein Array statt mehrerer Werte übergeben werden.
getTranslationList Werte Paare...
// [de] -> Deutsch
// [en] -> Englisch
// Einen der zurückgegebenen Schlüssel als Wert für die
// getTranslation() Methode einer anderen Sprache verwenden
print Zend_Locale::getTranslation('de', 'language', 'zh');
// Gibt die Übersetzung für die Sprache 'de' in chinesisch zurück
]]>
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.
Wenn nur ein einzelner übersetzter Wert benötigt wird, kann die
Methode getTranslation() verwendet werden. Diese gibt immer
einen String zurück, akzeptiert aber einige andere Typen als die
Methode getTranslationList(). Auch der Wert ist der gleiche wie
vorher mit einem Unterschied. Das Detail, das man zurückerhalten will, muss als
zusätzlicher Wert angegeben werden.
Weil immer ein Wert als Detail angegeben werden muss, muss dieser Parameter als
erster Parameter angegeben werden. Das unterscheidet sich von der
Methode getTranslationList().
Siehe die folgende Tabelle für detailierte Informationen:
Mit dem Zend Framework 1.5 wurde verschiedene alte Typen umbenannt. Das wurde
notwendig durch verschiedene neue Typen, einige Schreibfehler und die Erhöhung der
Verwendbarkeit. Die folgende Tabelle zeigt eine Liste von alten und neuen Typen:
Unterschiede zwischen Zend Framework 1.0 und 1.5Alter TypNeuer TypCountryTerritory (mit dem Wert '2')CalendarType (mit dem Wert 'calendar')Month_ShortMonth (mit dem Array('gregorian', 'format', 'abbreviated')Month_NarrowMonth (mit dem Array('gregorian', 'stand-alone', 'narrow')Month_CompleteMonthsDay_ShortDay (mit dem Array('gregorian', 'format', 'abbreviated')Day_NarrowDay (mit dem Array('gregorian', 'stand-alone', 'narrow')DateFormatDateTimeFormatTimeTimezonesCityToTimezoneCurrencyNameToCurrencyCurrency_SignCurrencySymbolCurrency_DetailCurrencyToRegionTerritory_DetailTerritoryToRegionLanguage_DetailLanguageToTerritory
Das folgende Beispiel zeigt wie man die Namen für Dinge in verschiedenen Sprachen
erhalten kann.
getTranslationList
Das nächste Beispiel zeigt, wie der Name einer Sprache in einer anderen Sprache gefunden
werden kann, wenn der Zwei-Zeichen-ISO-Länder-Code unbekannt ist.
Konvertierung des Ländernamens von einer Sprache in eine andere SprachegetLanguageTranslationList();
$name2code = array_flip($code2name);
$frenchCode = $name2code['French'];
echo $locale->getLanguageTranslation($frenchCode, 'es');
// Ausgegeben wird der Spanische Name der Fransösischen Sprache
]]>
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
getCountryTranslation() 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. Man muss 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.
Alle Sprachen geschrieben in ihrer Muttersprache $content) {
try {
$output = Zend_Locale::getLanguageTranslation($language, $language);
if (is_string($output)) {
print "\n [".$language."] ".$output;
}
} catch (Exception $e) {
continue;
}
}
]]>Übersetzungen für "Ja" und "Nein" erhalten
Oft müssen Programme eine Rückmeldung mit "Ja" oder "Nein" 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 zurückgegebene
Array enthält die folgenden Informationen:
yes und no: Eine generelle Stringrepräsentation für Ja und
Nein Antworten. Es enthält die erste und generellste Antwort von yesarray und
noarray.
yesarray und noarray: Ein Array mit allen bekannten
Ja und Nein Antworten. Diverse Sprachen haben mehr als nur zwei Antworten.
Normalerweise ist das der komplette String und seine Abkürzung.
yesexpr und noexpr: Ein ersteller Regex-String, der es
erlaubt, Benutzerantworten zu behandeln und nach Ja und Nein zu suchen.
Alle diese Informationen sind natürlich lokalisiert und hängen vom eingestellten
Gebietsschema ab. Das folgende Beispiel zeigt die Informationen, die empfangen werden
können:
getQuestion()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]
)
]]>Eine Liste aller bekannten Gebietsschemata erhalten
Manchmal will man eine Liste aller bekannten Gebietsschemata erhalten. Das kann für die
verschiedensten Aufgaben nützlich sein, zum Beispiel für die Erstellung einer Auswahlbox.
Für diesen Zweck kann die statische Methode getLocaleList()
verwendet werden, welche eine Liste aller bekannten Gebietsschemata zurückgibt.
getLocaleList()
Es ist zu beachten, dass die Gebietsschemata als Schlüssel des Arrays
zurückgegeben werden, das man erhält.
Der Wert ist immer ein Boolsches TRUE.
Erkennen von Gebietsschemata
Wenn man erkennen will, ob eine vorhandene Eingabe unabhängig von ihrer Quelle ein
Gebietsschema ist, sollte man die statische Methode isLocale()
verwenden. Der erste Parameter dieser Methode ist der String den man prüfen will.
Einfache Erkennung des Gebietsschemas
Wie man sieht, ist die Ausgabe dieser Methode immer ein boolscher Wert. Es gibt nur einen
Grund, warum man eine Ausnahme erhält, wenn diese Methode aufgerufen wird. Wenn das eigene
System kein Gebietsschema anbietet und Zend Framework nicht in der Lage ist, dieses
automatisch zu erkennen. Normalerweise zeigt dies, dass ein Problem mit dem eigenen OS
in Kombination mit setlocale() von PHP
vorhanden ist.
Man sollte auch beachten, dass jeder angegebene Gebietsschema-String automatisch
degradiert wird, wenn der Regionsabschnitt für dieses Gebietsschema nicht existiert. In
unserem vorherigen Beispiel existiert die Region 'RU' nicht für die
Sprache 'to', aber es wird trotzdem TRUE
zurückgegeben, da Zend_Locale mit der vorhandenen Eingabe arbeiten
kann.
Trotzdem ist es manchmal nützlich, diese automatische Degradierung zu verhindern, und
hier kommt der zweite Parameter von isLocale() zu Tragen. Der
Parameter strict ist standardmäßig FALSE und
kann verwendet werden, um die automatische Degradierung zu verhindern, wenn er auf
TRUE gesetzt wird.
Strikte Erkennung des Gebietsschemas
Jetzt da man in der Lage zu erkennen, ob ein vorhandenen String ein Gebietsschema ist,
kann man Gebietsschema bezogenes Verhalten zu den eigenen Klassen hinzufügen. Aber man
wird schnell erkennen, dass das immer zu den gleichen 15 Zeilen Code führt. Etwas
ähnliches wie das folgende Beispiel:
Implementierung von Gebietsschema bezogenem VerhaltentoString();
}
]]>
Mit Zend Framework 1.8 haben wir die statische Methode findLocale()
hinzugefügt, welche einen Gebietsschema-String zurückgibt, mit dem man arbeiten
kann. Sie führt die folgenden Arbeiten durch:
Erkennt, ob ein angegebener String ein Gebietsschema ist.
Degradiert das Gebietsschema, wenn es in der angegebenen Region nicht existiert.
Erweitert das Gebietsschema, wenn dieses als Region ohne Sprache erkannt wurde.
Gibt das vorher gesetzte Anwendungsweite Gebietsscheam zurück, wenn keine Eingabe
angegeben wurde.
Erkennt das Gebietsschema vom Browser, wenn die vorherigen Erkennungen
fehlgeschlagen sind.
Erkennt das Gebietsschema vom Betriebssystem, wenn die vorherigen Erkennungen
fehlgeschlagen sind.
Erkennt das Gebietsschema vom Framework, wenn die vorherigen Erkennungen
fehlgeschlagen sind.
Gibt immer einen String zurück, der das gefundene Gebietsschema repräsentiert.
Das folgende Beispiel zeigt, wie diese Prüfungen und der obige Code mit einem einfachen
Aufruf vereinfacht werden kann:
Gebietsschema bezogenes Verhalten mit Zend Framework 1.8