Zend_Locale-Introduction.xml 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15103 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.locale.introduction">
  5. <title>Einführung</title>
  6. <para>
  7. <classname>Zend_Locale</classname> ist die Antwort des Frameworks auf die Frage "Wie kann die selbe Anwendung
  8. auf der ganzen Welt verwendet werden?". Die meisten Leute werden sagen "Das ist einfach. Lasst uns alle
  9. Ausgaben in die unterschiedlichsten Sprachen übersetzen". Aber, eine einfache Übersetzungstabelle die
  10. Phrasen von einer Sprache in die andere übersetzt ist nicht genug. Verschiedene Regionen haben auch
  11. unterschiedliche Regeln für Vornamen, Nachnamen, Titel, Format von Nummern, Daten, Zeiten, Währungen usw.
  12. </para>
  13. <para>
  14. Was wir benötigen ist
  15. <ulink url="http://en.wikipedia.org/wiki/L10n">Lokalisierung</ulink>
  16. und die vergleichbare
  17. <ulink url="http://en.wikipedia.org/wiki/L10n">Internationalisierung</ulink>
  18. . Beide werden oft abgekürzt zu <code>L10n</code> und <code>I18n</code>. Internationalisierung bezeichnet
  19. mehr die Benutzung von Systemen für die spezielle Benutzung durch eindeutige Gruppen wie zum Beispiel
  20. Sprachübersetzung, Unterstützung von lokalen Konventionen für Plurale, Daten, Zeiten, Währungen, Namen,
  21. Symbolen, Sortierungen, Reihungen und viele mehr. <code>L10n</code> und <code>I18n</code> sind einander
  22. sehr ähnlich. Zend Framework bietet Unterstützung für diese Konventionen durch eine Kombination von
  23. Komponenten wie <classname>Zend_Locale</classname>, <classname>Zend_Date</classname>, <classname>Zend_Measure</classname>, <classname>Zend_Translate</classname>, <classname>Zend_Currency</classname> und <classname>Zend_TimeSync</classname>.
  24. </para>
  25. <tip>
  26. <title>Zend_Locale und setLocale()</title>
  27. <para>
  28. Die <ulink url="http://php.net/setlocale">Dokumentation von PHP</ulink> sagt das
  29. <code>setlocale()</code> nicht Threadsicher ist weil es pro Prozess behandelt wird und nicht
  30. pro Thread. Das bedeutet das man in multithreaded Umgebungen das Problem bekommen kann, das sich
  31. das Gebietsschema (Locale) ändert wärend das Skript diese Änderung nie selbst durchgeführt hat.
  32. Deswegen kann es zu unerwarteten Ergebnissen kommen wenn man <code>setLocale()</code> in seinen
  33. Skripts verwendet.
  34. </para>
  35. <para>
  36. Wenn <classname>Zend_Locale</classname> verwendet wird hat man diese Einschränkungen nicht, da
  37. <classname>Zend_Locale</classname> weder von PHP's <code>setlocale()</code> abhängig ist, noch irgendwie
  38. mit Ihr gekoppelt ist.
  39. </para>
  40. </tip>
  41. <sect2 id="zend.locale.whatislocalization">
  42. <title>Was ist Lokalisierung</title>
  43. <para>
  44. Lokalisierung bedeutet das eine Anwendung (oder Homepage) von verschiedenen Benutzer verwendet werden
  45. kann die unterschiedliche Sprachen sprechen. Aber wie bereits angedeutet heißt Lokalisierung mehr
  46. als nur die Übersetzung von Zeichenketten. Es beinhaltet
  47. </para>
  48. <itemizedlist mark='opencircle'>
  49. <listitem>
  50. <para>
  51. <classname>Zend_Locale</classname> - Unterstützung für Gebietsschemata welche Unterstützung für
  52. Lokalisierungen von anderen ZF Komponenten bieten.
  53. </para>
  54. </listitem>
  55. <listitem>
  56. <para>
  57. <classname>Zend_Translate</classname> - Übersetzung von Zeichenketten.
  58. </para>
  59. </listitem>
  60. <listitem>
  61. <para>
  62. <classname>Zend_Date</classname> - Lokalisierung von Daten und Zeiten.
  63. </para>
  64. </listitem>
  65. <listitem>
  66. <para>
  67. <classname>Zend_Calendar</classname> - Lokalisierung von Kalendern (Unterstützung für nicht Gregorianische Kalendersysteme)
  68. </para>
  69. </listitem>
  70. <listitem>
  71. <para>
  72. <classname>Zend_Currency</classname> - Lokalisierung von Währungen.
  73. </para>
  74. </listitem>
  75. <listitem>
  76. <para>
  77. <classname>Zend_Locale_Format</classname> - Erkennen und erzeugen von lokalisierten Zahlen.
  78. </para>
  79. </listitem>
  80. <listitem>
  81. <para>
  82. <classname>Zend_Locale_Data</classname> - Empfangen von lokalisierten Standard Übersetzungen für
  83. Länder, Sprachen und <ulink url="http://unicode.org/cldr/">mehr aus der CLDR</ulink>
  84. .
  85. </para>
  86. </listitem>
  87. <listitem>
  88. <para>
  89. <code>TODO</code> - Lokalisierung von Sammlungen
  90. </para>
  91. </listitem>
  92. </itemizedlist>
  93. </sect2>
  94. <sect2 id="zend.locale.whatis">
  95. <title>
  96. <ulink url="http://unicode.org/reports/tr35/#Locale">Was ist ein Gebietsschema?</ulink>
  97. </title>
  98. <para>
  99. Jeder Computer benutzt Gebietsschemata, selbst wenn Sie es nicht wissen. Anwendungen welche keine
  100. Unterstützung für Lokalisierung bieten, unterstützen zumindest genau ein Gebietsschema (das
  101. Gebietsschema des Authors). Wenn eine Klasse oder Funktion Lokalisierung verwendet sagen wir sie ist
  102. <code>Lokalisierbar</code>. Aber wie weiß der Code welches Gebietsschema ein Benutzer erwartet ?
  103. </para>
  104. <para>
  105. Eine Gebietsschema Zeichenkette oder Objekt welches ein unterstütztes Gebietsschema identifiziert, gibt
  106. <classname>Zend_Locale</classname> und dessen Unterklassen Zugriff auf Informationen über die Sprache und
  107. Region welche der Benutzer erwartet. Formatierungen, Normalisierungen und Konvertierungen werden
  108. anhand dieser Informationen durchgeführt.
  109. </para>
  110. </sect2>
  111. <sect2 id="zend.locale.representation">
  112. <title>Wodurch werden Gebietsschemata repräsentiert?</title>
  113. <para>
  114. Eine Gebietsschema Zeichenkette besteht aus Informationen über die Sprache des Benutzers und die
  115. bevorzugte/primäre geographische Region (z.B. Staat oder Region von seinem Zuhause oder Arbeitsplatz).
  116. Die Gebietsschema Zeichenkette welche im Zend Framework benutzt werden sind international definierte
  117. Standard Abkürzungen von Sprachen und Regionen. Sie werden geschrieben als <code>sprache_REGION</code>.
  118. Beide Teile, sowohl Sprache als auch Region, werden mit Buchstaben, ASCII Zeichen, abgekürzt.
  119. </para>
  120. <note>
  121. <para>
  122. Man muß darauf achten das nicht nur Gebietsschemata mit 2 Zeichen existieren wie die meisten
  123. Leute denken. Es gibt auch Sprachen und Regionen die nicht nur mit 2 Zeichen abgekürzt werden.
  124. Deswegen sollte man die Region und Sprache NICHT selbst trennen, sondern <classname>Zend_Locale</classname> verwenden
  125. um die Sprache oder Region von einem Gebietsschema String zu trennen. Andernfalls kann es zu
  126. unerwartetem Verhalten im eigenen Code kommen wenn man versucht das selbst zu machen.
  127. </para>
  128. </note>
  129. <para>
  130. Ein Benutzer von den USA würde die Sprache <code>Englisch</code> und die Region <code>USA</code>
  131. erwarten, beschrieben durch das Gebietsschema "en_US". Ein Benutzer von Deutschland würde die Sprache
  132. <code>Deutsch</code> und die Region <code>Deutschland</code> erwarten, beschrieben durch das
  133. Gebietsschema "de_DE". Hier findest Du eine
  134. <ulink url="http://unicode.org/cldr/data/diff/supplemental/languages_and_territories.html">Liste von vordefinierten Sprachen und Kombinationen von Regionen</ulink>
  135. wenn ein bestimmtes Gebietsschema im Zend Framework ausgewählt werden muß.
  136. </para>
  137. <example id="zend.locale.representation.example-1">
  138. <title>Auswählen eines speziellen Gebietsschemas</title>
  139. <programlisting role="php"><![CDATA[
  140. $locale = new Zend_Locale('de_DE'); // deutsche Sprache _ Deutschland
  141. ]]>
  142. </programlisting>
  143. </example>
  144. <para>
  145. Ein deutscher Benutzer in Amerika würde die Sprache <code>Deutsch</code> und die region <code>USA</code>
  146. erwarten, aber diese nicht-standardmäßigen Mischungen werden nicht als direkt als "Gebietsschema"
  147. unterstützt und erkannt. Wird stattdessen eine ungültige Kombination benutzt, dann wird Sie automatisch
  148. gekürzt, indem die Region entfernt wird. Zum Beispiel würde "de_IS" zu "de" gekürzt werden, und "xh_RU"
  149. würde zu "xh" gekürzt werden, weil keiner dieser Kombinationen gültig ist. Zusätzlich, wenn die Sprache
  150. nicht unterstützt wird (z.B. "zz_US") oder diese nicht existiert, dann wird ein Standard "root"
  151. Gebietsschema benutzt. Dieses "root" Gebietsschema hat Standarddefinitionen für international bekannte
  152. Repräsentationen von Daten, Zeiten, Nummern, Währungen usw. Der Prozess der Kürzung hängt von der
  153. gewünschten Information ab, weil einige Kombinationen von Sprache und Region für eine gewisse Art von
  154. Informationen gültig sind (z.B. Daten) aber für andere nicht (z.B. Währungs Formate).
  155. </para>
  156. <para>
  157. Achtung vor historischen Änderungen oder dem Versuch die verschiedenen Änderungen der Zeitzonen die
  158. im Laufe der langen Zeit in den vielen Regionen gemacht wurden, da ZF Komponenten darüber nichts
  159. wissen. Zum Beispiel kann <ulink url="http://www.statoids.com/tus.html">hier eine historische Liste</ulink>
  160. mit dutzenden Änderungen von Regierungen angesehen werden und ob eine Region Sommer-/Winterzeit
  161. unterstützt und sogar in welche Zeitzone eine bestimmte geographische Region gehört. Das bedeutet, wenn
  162. Datumsberechnungen gemacht werden, wird die Berechnung welche durch die ZF Komponenten durchgeführt wird,
  163. nicht an diese Änderungen angepasst. Stattdessen wird die korrekte Uhrzeit benutzt, welche für die aktuell
  164. benutzte Zeitzone angegeben wurde, wobei moderne Regeln für Sommer-/Winterzeit und Zeitzonen Zuordnung
  165. anhand von geographischen Regionen verwendet werden.
  166. </para>
  167. </sect2>
  168. <sect2 id="zend.locale.selection">
  169. <title>Auswahl des richtigen Gebietsschemas</title>
  170. <para>
  171. In den meisten Situationen wird <code>new Zend_Locale()</code> automatisch das richtige
  172. Gebietsschema auswählen, wobei die Informationen benutzt werden welche der Webbrowser des
  173. Benutzers zur Verfügung stellt. Wenn statt dessen <code>new Zend_Locale(Zend_Locale::ENVIRONMENT</code>
  174. benutzt wird, dann werden die Informationen vom Betriebsystem des hostenden Servers, wie anbei
  175. beschrieben, dafür genommen.
  176. </para>
  177. <example id="zend.locale.selection.example-1">
  178. <title>Automatische Auswahl des Gebietsschemas</title>
  179. <programlisting role="php"><![CDATA[
  180. $locale = new Zend_Locale();
  181. // Standard verhalten, wie eine Zeile weiter oben
  182. $locale1 = new Zend_Locale(Zend_Locale::BROWSER);
  183. // Bevorzuge die Einstellungen des hostenden Servers
  184. $locale2 = new Zend_Locale(Zend_Locale::ENVIRONMENT);
  185. // Bevorzuge die Einstellungen der Framework Anwendung
  186. $locale3 = new Zend_Locale(Zend_Locale::FRAMEWORK);
  187. ]]>
  188. </programlisting>
  189. </example>
  190. <para>
  191. Der Suchalgorithmus, welcher von <classname>Zend_Locale</classname> für die automatische Auswahl des
  192. Gebietsschemas verwendet wird beherrscht drei Informationsquellen:
  193. <orderedlist>
  194. <listitem>
  195. <para>
  196. const <classname>Zend_Locale::BROWSER</classname> - Der Webbrowser des Benutzer welcher die
  197. Informationen mit jeder Anfrage schickt. Diese wird von PHP durch die globale Variable
  198. <code>HTTP_ACCEPT_LANGUAGE</code> veröffentlicht. Wenn kein passendes
  199. Gebietsschema gefunden wurde, dann wird mit <code>ENVIRONMENT</code> gesucht und
  200. als letztes mit <code>FRAMEWORK</code> gesucht.
  201. </para>
  202. </listitem>
  203. <listitem>
  204. <para>
  205. const <classname>Zend_Locale::ENVIRONMENT</classname> - PHP veröffentlicht das Gebietsschema
  206. des hostenden Servers über die interne PHP Funktion <code>setlocale()</code>. Wenn
  207. kein passendes Gebietsschema gefunden wurde, dann wird mit <code>FRAMEWORK</code>
  208. und als letztes mit <code>BROWSER</code> gesucht.
  209. </para>
  210. </listitem>
  211. <listitem>
  212. <para>
  213. const <classname>Zend_Locale::FRAMEWORK</classname> - Wenn Zend Framework einen standartisierten
  214. Weg zur Verfügung stellt um für Komponenten Standardwerte zu definieren (das ist geplant
  215. aber noch nicht realisiert), dann wird die Verwendung dieser Konstante das
  216. Gebietsschema anhand dieser Standardwerte auswählen. Wenn kein passendes Gebietsschema
  217. gefunden wurde, dann wird mit <code>ENVIRONMENT</code> und als letztes mit
  218. <code>BROWSER</code> gesucht.
  219. </para>
  220. </listitem>
  221. </orderedlist>
  222. </para>
  223. </sect2>
  224. <sect2 id="zend.locale.selection.automatic">
  225. <title>Verwenden automatischer Gebietsschemata</title>
  226. <para>
  227. <classname>Zend_Locale</classname> bietet drei zusätzliche Gebietsschemata. Diese Gebietsschemata gehören
  228. nicht zu irgendeiner Sprache oder Region. Es sind "automatische" Gebietsschemata was bedeutet das
  229. Sie den gleichen Effekt wie die Methode <code>getDefault()</code> haben, aber ohne die negativen
  230. Effekte wie die Erstellung einer Instanz. Diese "automatischen" gebietsschemata können überall
  231. verwendet werden, wo auch standard Gebietsschemata verwendet werden können, und für die
  232. Definition eines Gebietsschemas, kann auch die String Repräsentation verwendet werden. Das bietet
  233. Einfachheit für Situationen wo mit Gebietsschemas gearbeitet wird die vom Browser geliefert
  234. werden.
  235. </para>
  236. <para>
  237. Es gibt drei Gebietsschemata mit leicht unterschiedlichem Verhalten:
  238. <orderedlist>
  239. <listitem>
  240. <para>
  241. <code>'browser'</code> - <classname>Zend_Locale</classname> soll mit den Informationen arbeiten
  242. die durch den Web Browser des Benutzers geliefert werden. Sie werden von PHP in der
  243. globalen Variable <code>HTTP_ACCEPT_LANGUAGE</code> veröffentlicht.
  244. </para>
  245. <para>
  246. Wenn ein Benutzer mehr als ein Gebietsschema in seinem Browser anbietet, wird
  247. <classname>Zend_Locale</classname> das erste gefundene Gebietsschema verwenden. Wenn der
  248. Benutzer kein Gebietsschema liefert oder das Skript von der Kommandozeile aufgerufen
  249. wird, wird automatisch das Gebietsschema <code>'environment'</code> verwendet und
  250. zurückgegeben.
  251. </para>
  252. </listitem>
  253. <listitem>
  254. <para>
  255. <code>'environment'</code> - <classname>Zend_Locale</classname> soll mit den Informationen arbeiten
  256. welche vom Host Server geliefert werden. Sie werden vom PHP über die interne Funktion
  257. <code>setlocale()</code> veröffentlicht.
  258. </para>
  259. <para>
  260. Wenn eine Umgebung mehr als ein Gebietsschema anbietet, wird <classname>Zend_Locale</classname>
  261. das erste gefundene Gebietsschema verwenden. Wenn der Host kein Gebietsschema anbietet
  262. wird automatisch das Gebietsschema <code>'browser'</code> verwendet und zurückgegeben.
  263. </para>
  264. </listitem>
  265. <listitem>
  266. <para>
  267. <code>'auto'</code> - <classname>Zend_Locale</classname> soll automatisch jedes beliebige
  268. Gebietsschema erkennen mit dem gearbeitet werden kann. Zuerst wird nach dem
  269. Gebietsschema des Benutzers gesucht und anschließend, wenn das nicht erfolgreich war,
  270. nach dem Gebietsschema des Hosts.
  271. </para>
  272. <para>
  273. Wenn kein Gebietsschema gefunden werden konnte, wird eine Ausnahme geworfen und
  274. bekanntgeben das die automatische Erkennung fehlgeschlagen ist.
  275. </para>
  276. </listitem>
  277. </orderedlist>
  278. </para>
  279. <example id="zend.locale.selection.automatic.example-1">
  280. <title>Verwenden automatischer Gebietsschemata</title>
  281. <programlisting role="php"><![CDATA[
  282. // ohne automatische Erkennung
  283. //$locale = new Zend_Locale(Zend_Locale::BROWSER);
  284. //$date = new Zend_Date($locale);
  285. // mit automatischer Erkennung
  286. $date = new Zend_Date('auto');
  287. ]]>
  288. </programlisting>
  289. </example>
  290. </sect2>
  291. <sect2 id="zend.locale.defaultlocale">
  292. <title>Verwenden eines Standard Gebietsschemas</title>
  293. <para>
  294. In einigen Umgebungen ist es nicht möglich automatisch ein Gebietsschema zu erkennen. Man kann
  295. dieses Verhalten zum Beispiel sehen wenn eine Anfrage von der Kommandozeile kommt, oder der
  296. anfragende Browser kein Sprachtag gesetzt hat und zusätzlich der Server das Standardgebietsschema
  297. 'C' gesetzt hat oder ein anderes propäritäres Gebietsschema.
  298. </para>
  299. <para>
  300. In solchen Fällen wirft <classname>Zend_Locale</classname> normalerweise eine Ausnahme mit einer Nachricht,
  301. das die automatische Erkennung des Gebietsschemas nicht erfolgreich war. Es gibt zwei Optionen
  302. um diese Situation handzuhaben. Entweder durch das Setzen eines neuen Gebietsschemas per Hand, oder
  303. der Definition eines Standardgebietsschemas.
  304. </para>
  305. <example id="zend.locale.defaultlocale.example-1">
  306. <title>Handhabung von Ausnahmen für Gebietsschemas</title>
  307. <programlisting role="php"><![CDATA[
  308. // In der Bootstrap Datei
  309. try {
  310. $locale = new Zend_Locale('auto');
  311. } catch (Zend_Locale_Exception $e) {
  312. $locale = new Zend_Locale('de');
  313. }
  314. // Im Modell/Kontroller
  315. $date = new Zend_Date($locale);
  316. ]]>
  317. </programlisting>
  318. </example>
  319. <para>
  320. Aber das hat einen großen negativen Effekt. Man muß das Gebietsschema-Objekt in jeder Klasse
  321. setzen die <classname>Zend_Locale</classname> verwendet. Das kann sehr unhandlch sein wenn mehrere Klassen
  322. verwendet werden.
  323. </para>
  324. <para>
  325. Seit Zend Framework Release 1.5 gibt es einen viel besseren Weg um das handzuhaben. Man kann
  326. ein Standard Gebietsschema mit der statischen <code>setDefault()</code> Methode setzen. Natürlich
  327. wird jedes unbekannte oder nicht voll qualifizierte Gebietsschema eine Ausnahme werden.
  328. <code>setDefault()</code> sollte der erste Aufruf sein bevor irgendeine Klasse initiiert wird
  329. die <classname>Zend_Locale</classname> verwendet. Siehe das folgende Beispiel für Details:
  330. </para>
  331. <example id="zend.locale.defaultlocale.example-2">
  332. <title>Setzen eines Standardgebietsschemas</title>
  333. <programlisting role="php"><![CDATA[
  334. // In der Bootstrap Datei
  335. Zend_Locale::setDefault('de');
  336. // Im Modell/Kontroller
  337. $date = new Zend_Date();
  338. ]]>
  339. </programlisting>
  340. </example>
  341. <para>
  342. Im Fall das kein Gebietsschema erkannt wird, wird automatisch das Gebietsschema
  343. <emphasis role="strong">de</emphasis> verwendet. Andernfalls wird das erkannte Gebietsschema
  344. verwendet.
  345. </para>
  346. </sect2>
  347. <sect2 id="zend.locale.interoperate">
  348. <title>ZF lokalisierbare Klassen</title>
  349. <para>
  350. Im ZF sind lokalisierbare Klassen von <classname>Zend_Locale</classname> abhängig um ein Gebietsschema
  351. automatisch auszuwählen, wie im oberen Abschnitt geschrieben. Das Erstellen eines Datums durch
  352. Verwendung von <classname>Zend_Date</classname> ohne die Angabe eines Gebietsschemas führt als Ergebnis zu
  353. einem Objekt mit einem Gebietsschema, basierend auf den Informationen welche durch den Webbrowser des
  354. Benutzers zur Verfügung gestellt werden.
  355. </para>
  356. <example id="zend.locale.interoperate.example-1">
  357. <title>Daten verwenden das aktuelle Gebietsschema des Web Benutzers</title>
  358. <programlisting role="php"><![CDATA[
  359. $date = new Zend_Date('2006',Zend_Date::YEAR);
  360. ]]>
  361. </programlisting>
  362. </example>
  363. <para>
  364. Um dieses Standardverhalten zu übergehen, und die eine lokalisierbare ZF Komponente dazu zu bringen
  365. ein spezielles Gebietsschema zu benutzen welches unabhängig vom Gebietsschema des Besucher der
  366. Webseite ist, muß als dritter Parameter im Konstruktor das Gebietsschema angegeben werden.
  367. </para>
  368. <example id="zend.locale.interoperate.example-2">
  369. <title>Übergehen der Auswahl des standardmäßigen Gebietsschemas</title>
  370. <programlisting role="php"><![CDATA[
  371. $usLocale = new Zend_Locale('en_US');
  372. $date = new Zend_Date('2006', Zend_Date::YEAR, $usLocale);
  373. $temp = new Zend_Measure_Temperature('100,10',
  374. Zend_Measure::TEMPERATURE,
  375. $usLocale);
  376. ]]>
  377. </programlisting>
  378. </example>
  379. <para>
  380. Wenn viele Objekte benutzt werden die alle das gleiche Gebietsschema verwenden, sollte das
  381. Gebietsschema explizit definiert werden, um die zusätzliche Arbeit des Objekts durch die
  382. Eruierung des Standardmäßigen Gebietsschemas zu verringern.
  383. </para>
  384. <example id="zend.locale.interoperate.example-3">
  385. <title>Optimierung der Geschwindigkeit durch Benutzung eines Standard Gebietsschemas</title>
  386. <programlisting role="php"><![CDATA[
  387. $locale = new Zend_Locale();
  388. $date = new Zend_Date('2006', Zend_Date::YEAR, $locale);
  389. $temp = new Zend_Measure_Temperature('100,10',
  390. Zend_Measure::TEMPERATURE,
  391. $locale);
  392. ]]>
  393. </programlisting>
  394. </example>
  395. </sect2>
  396. <sect2 id="zend.locale.frameworkwidelocale">
  397. <title>Anwendungsweites Gebietsschema</title>
  398. <para>
  399. Zend Framework erlaubt die Verwendung eines Anwendungsweiten Gebietsschemas. Man kann einfach eine
  400. Instanz von <classname>Zend_Locale</classname> in der Registry mit dem Schüssel 'Zend_Locale' setzen.
  401. Dann wird diese Instanz in allen Klassen vom Zend Framework die Gebietsschemata verwenden selbst
  402. verwendet. Auf diesem Weg wird eine Instanz in der Registry gesetzt und dann kann man das weitere
  403. Setzen vergessen. Sie wird automatisch in allen anderen Klassen verwendet. Siehe das folgende
  404. Beispiel für die richtige Verwendung:
  405. </para>
  406. <example id="zend.locale.frameworkwidelocale.example">
  407. <title>Verwendung eines anwendungsweiten Gebietsschemas</title>
  408. <programlisting role="php"><![CDATA[
  409. // In der Bootstrap Datei
  410. $locale = new Zend_Locale('de_AT');
  411. Zend_Registry::set('Zend_Locale', $locale);
  412. // Im Modell oder dem Controller
  413. $date = new Zend_Date();
  414. // print $date->getLocale();
  415. echo $date->getDate();
  416. ]]>
  417. </programlisting>
  418. </example>
  419. </sect2>
  420. <sect2 id="zend.locale.formatoptions">
  421. <title>Zend_Locale_Format::setOptions(array $options)</title>
  422. <para>
  423. Die Option 'precision' wird benutzt um einen Wert zu verkürzen oder mit extra Ziffern zu strecken.
  424. Ein Wert von '-1' verhindert die Veränderung der Anzahl an Ziffern im Nachkomma-Teil des Wertes.
  425. Die 'locale' Option hilft wenn Nummern und Daten analysiert werden und hierbei Trennzeichen oder
  426. Monatsnamen verwendet werden. Die Datumsformat Option 'format_type' wählt zwischen CLDR/ISO
  427. Datumsdefinitionen und PHP's date() Definitionen. Die Option 'fix_date' erlaubt oder verhindert eine
  428. Automatik welche versucht falsche Daten zu korrigieren. Die Option 'number_format' definiert ein
  429. Standard Format für Nummern bei Verwendung der Funktion <code>toNumber()</code>. (siehe
  430. <xref
  431. linkend= "zend.locale.number.localize"/>
  432. ).
  433. </para>
  434. <para>
  435. Die Option 'date_format' kann verwendet werden um ein Standard Datumsformat zu definieren. Aber Achtung
  436. bei der Verwendung von getDate(), checkDateFormat() und getTime() nach der Verwendung von setOptions()
  437. mit einem 'date_format'. Um diese vier Methoden mit einem Standard Datumsformat für ein Gebietsschema
  438. zu benutzen, muß array('date_format' => null, 'locale' => $locale) in deren Optionen angegeben werden.
  439. </para>
  440. <example id="zend.locale.formatoptions.example-1">
  441. <title>Daten die das richtige Gebietsschema des Web Benutzers verwenden</title>
  442. <programlisting role="php"><![CDATA[
  443. Zend_Locale_Format::setOptions(array('locale' => 'en_US',
  444. 'fix_date' => true,
  445. 'format_type' => 'php'));
  446. ]]>
  447. </programlisting>
  448. </example>
  449. <para>
  450. Um mit den Standarddefinitionen eines Gebietsschemas zu arbeiten kann die Konstante
  451. <classname>Zend_Locale_Format::STANDARD</classname> verwendet werden. Das Setzen der Konstante <classname>Zend_Locale_Format::STANDARD</classname>
  452. für '<code>date_format</code>' benutzt die Standarddefinition des aktuellen Gebietsschemas. Das Setzen für
  453. 'number_format' benutzt das Standard Nummernformat dieses Gebietsschemas. Und das Setzen für 'locale'
  454. verwendet das Standard Gebietsschema des Servers oder Browsers.
  455. </para>
  456. <example id="zend.locale.formatoptions.example-2">
  457. <title>Verwendung von STANDARD Definitionen für setOptions()</title>
  458. <programlisting role="php"><![CDATA[
  459. Zend_Locale_Format::setOptions(array('locale' => 'en_US',
  460. 'date_format' => 'dd.MMMM.YYYY'));
  461. // Überladen des global gesetzten Datumsformats
  462. $date = Zend_Locale_Format::getDate('2007-04-20',
  463. array('date_format' =>
  464. Zend_Locale_Format::STANDARD);
  465. // Überladen des global gesetzten Standard Gebietsschemas
  466. Zend_Locale_Format::setOptions(array('locale' => Zend_Locale_Format::STANDARD,
  467. 'date_format' => 'dd.MMMM.YYYY'));
  468. ]]>
  469. </programlisting>
  470. </example>
  471. </sect2>
  472. <sect2 id="zend.locale.cache">
  473. <title><classname>Zend_Locale</classname> und dessen Subklassen schneller machen</title>
  474. <para>
  475. <classname>Zend_Locale</classname> und dessen Subklassen können durch die Verwendung von
  476. <classname>Zend_Cache</classname> schneller gemacht werden. Man sollte die statische Methode
  477. <classname>Zend_Locale::setCache($cache)</classname> verwenden wenn man <classname>Zend_Locale</classname> benutzt.
  478. <classname>Zend_Locale_Format</classname> kann schneller gemacht werden indem die Option
  479. <code>cache</code> innerhalb von
  480. <classname>Zend_Locale_Format::setOptions(array('cache' => $adapter));</classname> aufgerufen wird. Wenn beide
  481. Klassen verwendet werden sollte nur für <classname>Zend_Locale</classname> ein Cache gesetzt werden, da der
  482. zuletzt gesetzte Cache den vorher gesetzten Cache überschreibt. Der Bequemlichkeit halber gibt es
  483. auch die statischen Methoden <classname>Zend_Locale::getCache()</classname>, <code>hasCache()</code>,
  484. <code>clearCache()</code> und <code>removeCache()</code>.
  485. </para>
  486. </sect2>
  487. </sect1>