Using Zend_Locale für Web Internationalisierung
eCommerce winkt: möchten Sie ein Teil des Kuchens aus den internationalen
Märkten? Zend_Locale() ist ein fantastischer Begleiter wenn Sie
ihren Webs Fremdsprachen beibringen möchten.
In dieser Übung zeige ich lediglich ein kleines Teil des Zend_Locale();
die Methode getTranslation().
Aufgabe: Liste der Weltgebiete (territories) in mehreren Sprachen
Stellen wir uns vor, für ein eCommerce Projekt (Airline?) wird eine Liste der
Ländernamen gebraucht und zwar in 5 Sprachen:
- Englisch (hauptsächlich für den Web Developer, der ausser Englisch
nur PHP spricht ;-)
- Original gemeint wird Ländername geschrieben in der Sprache
des Landes, z.B., España für Spanien oder "Ελλάδα" für Griechenland
- Chinesisch - unser neuer Zielmarkt
- Traditionell Chinesisch (wir möchten Hong Kong and Taiwan nicht vermissen)
- Deutsch (Investoren gesucht)
(Hong Kong und Taiwan sprechen dieselbe Sprache,
geschrieben wird aber anders)
Wozu brauche ich diese Namen? Für die <SELECT> statements in meiner Webforms, zum Beispiel, oder für eMail Templates.
Zum Schluss möchte ich ein Array bekommen mit allen Territorien der Welt
(fast 300, mehr als UNO Mitglieder), und jedes Element als Sub-array
von 5 weiteren Elementen.
Für Griechenland, zum Beispiel, werde ich fünf Zeichenketten benötigen:
"Greece", "Ελλάδα", "希腊", "希臘", "Griechenland"
Frage: wie viele Zeilen muss ich schreiben, um die gewünschten Daten von Zend zu bekommen?
Ich wäre auch mit ca. 10 fertig, da aber Kodierungsregeln von Zend
80 Zeichen pro Zeile empfehlen (haben die überhaupt bemerkt,
wie die Displays in den letzten Jahren gewachesn sind?)
werden es warscheinlich 20
Wir starten mit der Kodierung:
$locale = new Zend_Locale();
$territoryList = $locale->getTranslationList('territory');
Einfacher geht es kaum. Zend_Locale initialisiert und die Liste
der Territorien bekommen. Analog könnte man eine Liste der
Monate, Währungssymbole und ähnlich süsser Sachen bekommen.
Sie werden bemerkt haben, dass ich kein locale ('de_CH' z.B.)
dem Konstruktor übergeben habe. locale kann oft wichtig und
praktisch sein, nicht aber für diese Übung.
Es wäre an der Zeit, den Array zu bauen:
foreach ($territoryList as $key => $value) {
try {
$aCountries[$key] = array(
'english' => $value,
'original' => $locale->getTranslation($key, 'territory', $key),
'china' => $locale->getTranslation($key, 'territory', 'zh_ZH'),
'hong_kong' => $locale->getTranslation($key, 'territory', 'zh_HK'),
'german' => $locale->getTranslation($key, 'territory', 'de')
);
} catch (Exception $e) {
continue;
}
}
Das wäre's, liebe Leute.
Kommentare
der $key ist 2-Zeichen
Code für das Territorium, z.B. GR für Griechenland.
der $value wird in
Englisch zurückgegeben und somit eignet sich als der 1. Element des Arrays
getTranslation()
bekommt drei Parameter: (1) der Landeskode,
(2) die Kategorie, oder der Dateninhalt, (3) locale, wie 'en_US', oder
sogar nur die Sprachabkürzung ('en') für den String, der zurückgegeben wird.
Achtung: Der Wert
im zweiten Element des Arrrays ('original')
kann täuschen. Hier wollte ich Landesname in der Sprache des Landes bekommen,
was auf dem Beispiel von Griechenland auch kein Problem war. Für Länder
mit mehreren Nationalsprachen (Kanada, Schweiz, etc.) Zend wird selbst die
Entscheidung treffen. Für das Territorium von Kanada
($key == 'CA') Zend gibt English zurück und für das Territorium
von der Schweiz ($key == 'CH') bekommt man Deutsch zurück.
Der Grund ist, dass in dem Beispiel geben wir territory als $key
und nicht ein Locale (fr_CH) oder Sprache (fr).
territory wird in deutscher Zend Dokumentation als
Gebietsschema
bezeichnet.
Beachten Sie bitte, wie
mächtig der dritte Parameter interpretiert wird. Wenn es eine locale
ist, wie 'zh_HK', bekommen wir den Rückgabewert in der Sprachversion
(Dialekt) aus dem Gebiet. In diesem Beispiel: Hong-Kong Chinesisch
Endergebnis wird ausgegeben: $aCountries
...
["GR"] =>
array (
["english"] => "Greece",
["original"] => "Ελλάδα",
["china"] => "希腊",
["hong_kong"] => "希臘",
["german"] => "Griechenland"
),
["GS"] =>
...
|