Kapitel 18. Zend_Locale

Inhaltsverzeichnis

18.1. Einführung
18.1.1. Was ist Lokalisierung
18.1.2. Was ist ein Gebietsschema?
18.1.3. Wodurch werden Gebietsschemata representiert?
18.1.4. Auswahl des richtigen Gebietsschemas
18.1.5. ZF lokalisierbare Klassen
18.1.6. Zend_Locale_Format::setOptions(array $options)
18.2. Zend_Locale verwenden
18.2.1. Kopieren, Klonen und Serialisieren von Gebietsschema Objekten
18.2.2. isEqual() - Gleichheit
18.2.3. Standard Gebietsschemata
18.2.4. Ein neues Gebietsschema setzen
18.2.5. Auslesen von Sprache und Region
18.2.6. Lokalisierte Zeichenketten beschaffen
18.2.7. Übersetzungen für "Ja" und "Nein" erhalten
18.3. Normalisierung und Lokalisierung
18.3.1. Normalisierung von Nummern: getNumber($input, Array $options)
18.3.2. Lokalisieren von Nummern
18.3.3. Testen von Zahlen
18.3.4. Gleitkommazahlen normalisieren
18.3.5. Lokalisieren von Gleitkommazahlen
18.3.6. Testen von Gleitkommazahlen
18.3.7. Integer Zahlen normalisieren
18.3.8. Lokalisieren von Integer Zahlen
18.3.9. Testen von Integer Zahlen
18.3.10. Konvertieren von Zahlensystemen
18.4. Arbeiten mit Daten und Zeiten
18.4.1. Daten und Zeiten normalisieren
18.4.2. Testen von Daten
18.4.3. Normalisieren von Zeiten
18.4.4. Testen von Zeiten
18.5. Unterstützte Sprachen für Gebietsschemata
18.6. Unterstützte Regionen für Gebietsschemata

18.1. Einführung

Zend_Locale ist die Antwort des Frameworks auf die Frage "Wie kann die selbe Anwendung auf der ganzen Welt verwendet werden?". Die meisten Leute werden sagen "Das ist einfach. Lasst uns alle Ausgaben in die unterschiedlichsten Sprachen übersetzen". Aber, eine einfache Übersetzungstabelle die Phrasen von einer Sprache in die andere übersetzt ist nicht genug. Verschiedene Regionen haben auch unterschiedliche Regeln für Vornamen, Nachnamen, Titel, Format von Nummern, Daten, Zeiten, Währungen usw.

Was wir benötigen ist Lokalisierung und die vergleichbare Internationalisierung . Beide werden oft abgekürzt zu L10N und I18N. Internationalisierung bezeichnet mehr die Benutzung von Systemen für die spezielle Benutzung durch eindeutige Gruppen wie zum Beispiel Sprachübersetzung, Unterstützung von lokalen Konventionen für Plurale, Daten, Zeiten, Währungen, Namen, Symbolen, Sortierungen, Reihungen und viele mehr. L10N und I18N sind einander sehr ähnlich. Der Zend Framework bietet Unterstützung für diese Konventionen durch eine Kombination von Komponenten wie Zend_Locale, Zend_Date, Zend_Measure, Zend_Translate, Zend_Currency und Zend_TimeSync.

18.1.1. Was ist Lokalisierung

Lokalisierung bedeutet das eine Anwendung (oder Homepage) von verschiedenen Benutzer verwendet werden kann die unterschiedliche Sprachen sprechen. Aber wie bereits angedeutet heißt Lokalisierung mehr als nur die Übersetzung von Zeichenketten. Es beinhaltet

  • Zend_Locale - Unterstützung für Gebietsschemata welche Unterstützung für Lokalisierungen von anderen ZF Komponenten bieten.

  • Zend_Translate - Übersetzung von Zeichenketten.

  • Zend_Date - Lokalisierung von Daten und Zeiten.

  • Zend_Calendar - Lokalisierung von Kalendern (Unterstützung für nicht Gregorianische Kalendersysteme)

  • Zend_Currency - Lokalisierung von Währungen.

  • Zend_Locale_Format - Erkennen und erzeugen von lokalisierten Zahlen.

  • Zend_Locale_Data - Empfangen von lokalisierten Standard Übersetzungen für Länder, Sprachen und mehr aus der CLDR .

  • TODO - Lokalisierung von Sammlungen

Jeder Computer benutzt Gebietsschemata, selbst wenn Sie es nicht wissen. Anwendungen welche keine Unterstützung für Lokalisierung bieten, unterstützen zumindest genau ein Gebietsschema (das Gebietsschema des Authors). Wenn eine Klasse oder Funktion Lokalisierung verwendet sagen wir sie ist Lokalisierbar. Aber wie weiß der Code welches Gebietsschema ein Benutzer erwartet ?

Eine Gebietsschema Zeichenkette oder Objekt welches ein unterstütztes Gebietsschema identifiziert, gibt Zend_Locale und dessen Unterklassen Zugriff auf Informationen über die Sprache und Region welche der Benutzer erwartet. Formatierungen, Normalisierungen und Konvertierungen werden anhand dieser Informationen durchgeführt.

18.1.3. Wodurch werden Gebietsschemata representiert?

Eine Gebietsschema Zeichenkette besteht aus Informationen über die Sprache des Benutzers und die bevorzugte/primäre geographische Region (z.B. Staat oder Region von seinem Zuhause oder Arbeitsplatz). Die Gebietsschema Zeichenkette welche im Zend Framework benutzt werden sind international definierte Standard Abkürzungen von Sprachen und Regionen. Sie werden geschrieben als sprache_REGION. Beide Teile, sowohl Sprache als auch Region, werden abgekürzt zu 2 Buchstaben, ASCII Zeichen.

Ein Benutzer von den USA würde die Sprache Englisch und die Region USA erwarten, beschrieben durch das Gebietsschema "en_US". Ein Benutzer von Deutschland würde die Sprache Deutsch und die Region Deutschland erwarten, beschrieben durch das Gebietsschema "de_DE". Hier findest Du eine Liste von vordefinierten Sprachen und Kombinationen von Regionen wenn ein bestimmtes Gebietsschema im Zend Framework ausgewählt werden muß.

Beispiel 18.1. Auswählen eines speziellen Gebietsschemas

<?php
require_once 'Zend_Locale';
$locale = new Zend_Locale('de_DE'); // deutsche Sprache _ Deutschland
?>

Ein deutscher Benutzer in Amerika würde die Sprache Deutsch und die region USA erwarten, aber diese nicht-standardmäßigen Mischungen werden nicht als direkt als "Gebietsschema" unterstützt und erkannt. Wird stattdessen eine ungültige Kombination benutzt, dann wird Sie automatisch gekürzt, indem die Region entfernt wird. Zum Beispiel würde "de_IS" zu "de" gekürzt werden, und "xh_RU" würde zu "xh" gekürzt werden, weil keiner dieser Kombinationen gültig ist. Zusätzlich, wenn die Sprache nicht unterstützt wird (z.B. "zz_US") oder diese nicht existiert, dann wird ein Standard "root" Gebietsschema benutzt. Dieses "root" Gebietsschema hat Standarddefinitionen für international bekannte Repräsentationen von Daten, Zeiten, Nummern, Währungen usw. Der Prozess der Kürzung hängt von der gewünschten Information ab, weil einige Kombinationen von Sprache und Region für eine gewisse Art von Informationen gültig sind (z.B. Daten) aber für andere nicht (z.B. Währungs Formate).

Achtung vor historischen Änderungen oder dem Versuch die verschiedenen Änderungen der Zeitzonen die im Laufe der langen Zeit in den vielen Regionen gemacht wurden, da ZF Komponenten darüber nichts wissen. Zum Beispiel kann hier eine historische Liste mit dutzenden Änderungen von Regierungen angesehen werden und ob eine Region Sommer-/Winterzeit unterstützt und sogar in welche Zeitzone eine bestimmte geographische Region gehört. Das bedeutet, wenn Datumsberechnungen gemacht werden, wird die Berechnung welche durch die ZF Komponenten durchgeführt wird, nicht an diese Änderungen angepasst. Stattdessen wird die korrekte Uhrzeit benutzt, welche für die aktuell benutzte Zeitzone angegeben wurde, wobei moderne Regeln für Sommer-/Winterzeit und Zeitzonen Zuordnung anhand von geographischen Regionen verwendet werden.

18.1.4. Auswahl des richtigen Gebietsschemas

In den meisten Situationen wird new Zend_Locale() automatisch das richtige Gebietsschema auswählen, wobei die Informationen benutzt werden welche der Webbrowser des Benutzers zur Verfügung stellt. Wenn statt dessen new Zend_Locale(Zend_Locale::ENVIRONMENT benutzt wird, dann werden die Informationen vom Betriebsystem des hostenden Servers, wie anbei beschrieben, dafür genommen.

Beispiel 18.2. Automatische Auswahl des Gebietsschemas

<?php
require_once 'Zend/Locale.php';
$locale  = new Zend_Locale();
$locale1 = new Zend_Locale(Zend_Locale::BROWSER);     // Standard verhalten, wie eine Zeile weiter oben
$locale2 = new Zend_Locale(Zend_Locale::ENVIRONMENT); // Bevorzuge die Einstellungen des hostenden Servers
$locale3 = new Zend_Locale(Zend_Locale::FRAMEWORK);   // Bevorzuge die Einstellungen der Framework Anwendung
?>

Der Suchalgorithmus, welcher von Zend_Locale für die automatische Auswahl des Gebietsschemas verwendet wird beherrscht drei Informationsquellen:

  1. const Zend_Locale::BROWSER - Der Webbrowser des Benutzer welcher die Informationen mit jeder Anfrage schickt. Diese wird von PHP durch die globale Variable HTTP_ACCEPT_LANGUAGE veröffentlicht. Wenn kein passendes Gebietsschema gefunden wurde, dann wird mit ENVIRONMENT gesucht und als letztes mit FRAMEWORK gesucht.

  2. const Zend_Locale::ENVIRONMENT - PHP veröffentlicht das Gebietsschema des hostenden Servers über die interne PHP Funktion setlocale(). Wenn kein passendes Gebietsschema gefunden wurde, dann wird mit FRAMEWORK und als letztes mit BROWSER gesucht.

  3. const Zend_Locale::FRAMEWORK - Wenn der Zend Framework einen standartisierten Weg zur Verfügung stellt um für Komponenten Standardwerte zu definieren (das ist geplant aber noch nicht realisiert), dann wird die Verwendung dieser Konstante das Gebietsschema anhand dieser Standardwerte auswählen. Wenn kein passendes Gebietsschema gefunden wurde, dann wird mit ENVIRONMENT und als letztes mit BROWSER gesucht.

18.1.5. ZF lokalisierbare Klassen

Im ZF sind lokalisierbare Klassen von Zend_Locale abhängig um ein Gebietsschema automatisch auszuwählen, wie im oberen Abschnitt geschrieben. Das Erstellen eines Datums durch Verwendung von Zend_Date ohne die Angabe eines Gebietsschemas führt als Ergebnis zu einem Objekt mit einem Gebietsschema, basierend auf den Informationen welche durch den Webbrowser des Benutzers zur Verfügung gestellt werden.

Beispiel 18.3. Daten verwenden das aktuelle Gebietsschema des Web Benutzers

<?php
require_once 'Zend/Date.php';
$date = new Zend_Date('2006',Zend_Date::YEAR);
?>

Um dieses Standardverhalten zu übergehen, und die eine lokalisierbare ZF Komponente dazu zu bringen ein spezielles Gebietsschema zu benutzen welches unabhängig vom Gebietsschema des Besucher der Webseite ist, muß als dritter Parameter im Konstruktor das Gebietsschema angegeben werden.

Beispiel 18.4. Übergehen der Auswahl des standardmäßigen Gebietsschemas

<?php
require_once 'Zend/Date.php';
require_once 'Zend/Measure/Temperature.php';

$usLocale = new Zend_Locale('en_US');
$date = new Zend_Date('2006', Zend_Date::YEAR, $usLocale);
$temp = new Zend_Measure_Temperature('100,10', Zend_Measure::TEMPERATURE, $usLocale);
?>

Wenn viele Objekte benutzt werden die alle das gleiche Gebietsschema verwenden, sollte das Gebietsschema explizit definiert werden, um die zusätzliche Arbeit des Objekts durch die Eruierung des Standardmäßigen Gebietsschemas zu verringern.

Beispiel 18.5. Optimierung der Geschwindigkeit durch Benutzung eines Standard Gebietsschemas

<?php
require_once 'Zend/Date.php';
require_once 'Zend/Measure/Temperature.php';

$locale = new Zend_Locale();
$date = new Zend_Date('2006', Zend_Date::YEAR, $locale);
$temp = new Zend_Measure_Temperature('100,10', Zend_Measure::TEMPERATURE, $locale);
?>

18.1.6. Zend_Locale_Format::setOptions(array $options)

Die Option 'precision' wird benutzt um einen Wert zu verkürzen oder mit extra Ziffern zu strecken. Ein Wert von '-1' verhindert die Veränderung der Anzahl an Ziffern im Nachkomma-Teil des Wertes. Die 'locale' Option hilft wenn Nummern und Daten analysiert werden und hierbei Trennzeichen oder Monatsnamen verwendet werden. Die Datumsformat Option 'format_type' wählt zwischen CLDR/ISO Datumsdefinitionen und PHP's date() Definitionen. Die Option 'fix_date' erlaubt oder verhindert eine Automatik welche versucht falsche Daten zu korrigieren. Die Option 'number_format' definiert ein Standard Format für Nummern bei Verwendung der Funktion toNumber(). (siehe Abschnitt 18.3.2, „Lokalisieren von Nummern“ ).

Die Option 'date_format' kann verwendet werden um ein Standard Datumsformat zu definieren. Aber Achtung bei der Verwendung von getDate(), checkDateFormat() und getTime() nach der Verwendung von setOptions() mit einem 'date_format'. Um diese vier Methoden mit einem Standard Datumsformat für ein Gebietsschema zu benutzen, muß array('date_format' => null, 'locale' => $locale) in deren Optionen angegeben werden.

Beispiel 18.6. Daten die das richtige Gebietsschema des Web Benutzers verwenden

<?php
require_once 'Zend/Locale.php';
Zend_Locale_Format::setOptions('locale' => 'en_US', 'fix_date' => true, 'format_type' => 'php');
?>

Um mit den Standarddefinitionen eines Gebietsschemas zu arbeiten kann die Konstante Zend_Locale_Format::STANDARD verwendet werden. Das Setzen der Konstante Zend_Locale_Format::STANDARD für 'date_format' benutzt die Standarddefinition des aktuellen Gebietsschemas. Das Setzen für 'number_format' benutzt das Standard Nummernformat dieses Gebietsschemas. Und das Setzen für 'locale' verwendet das Standard Gebietsschema des Servers oder Browsers.

Beispiel 18.7. Verwendung von STANDARD Definitionen für setOptions()

<?php
require_once 'Zend/Locale.php';
Zend_Locale_Format::setOptions('locale' => 'en_US', 'date_format' => 'dd.MMMM.YYYY');
// Überladen des global gesetzten Datumsformats
$date = Zend_Locale_Format::getDate('2007-04-20, array('date_format' => Zend_Locale_Format::STANDARD);

// Überladen des global gesetzten Standard Gebietsschemas
Zend_Locale_Format::setOptions('locale' => Zend_Locale_Format::STANDARD, 'date_format' => 'dd.MMMM.YYYY');

?>