Zend_Locale-Introduction.xml 30 KB

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