2
0

Zend_Locale-Introduction.xml 30 KB

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