Zend_Locale-Introduction.xml 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 21816 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.locale.introduction">
  5. <title>Wprowadzenie</title>
  6. <para>
  7. <classname>Zend_Locale</classname> to odpowiedź frameworka na pytanie: "Jak jedna aplikacja
  8. może być używana na całym świecie?". Większość odpowie: "To proste. Wystarczy przetłumaczyć
  9. wszystkie napisy na inne języki.". Jednak użycie prostych tabel mapujących frazy jednego
  10. języka na drugi nie jest wystarczające. Różne regiony mogą mieć różne konwencje dotyczące
  11. imion, nazwisk, zwrotów grzecznościowych, formatu liczb, dat, czasu, waluty itp.
  12. </para>
  13. <para>
  14. Niezbędna jest
  15. <ulink url="http://en.wikipedia.org/wiki/Internationalization_and_localization">Lokalizacja
  16. i internacjonalizacja</ulink>. Zwroty te często są przedstawiane skrótowo jako odpowiednio
  17. <emphasis>L10n</emphasis> oraz <emphasis>I18n</emphasis>. Internacjonalizacja zakłada
  18. przystosowanie do użycia systemu niezależnie od specjalnych wymogów
  19. charakterystycznych dla użytkowników
  20. w zakresie języka, regionu, sposobu zapisu liczb, konwencji finansowych, dat i czasu.
  21. Lokalizacja określa dodanie do systemu funkcjonalności obsługujących określone wymogi
  22. dotyczące języka, konwencji dat, czasu, waluty, nazw, symboli, sortowania itp.
  23. <code>L10n</code> i <code>I18n</code> uzupełniają się nawzajem. Zend Framework udostępnia
  24. ich obsługę poprzez szereg komponentów. M. in.:
  25. <classname>Zend_Locale</classname>, <classname>Zend_Date</classname>,
  26. <classname>Zend_Measure</classname>, <classname>Zend_Translate</classname>,
  27. <classname>Zend_Currency</classname>, and <classname>Zend_TimeSync</classname>.
  28. </para>
  29. <tip>
  30. <title>Zend_Locale i setlocale()</title>
  31. <para>
  32. W <ulink url="http://php.net/setlocale">dokumentacji PHP</ulink> można przeczytać, że
  33. funkcja <methodname>setlocale()</methodname> nie jest bezpieczna wątkowo (thread-safe)
  34. ponieważ działa w zasięgu procesu a nie wątku. To oznacza, że w środowisku
  35. wielowątkowym może dojść do sytuacji w której locale ulegnie zmianie pomimo braku
  36. odwołań do funkcji <methodname>setlocale()</methodname> w skrypcie.
  37. To, z kolei, może prowadzić do nieoczekiwanych rezultatów działania programu.
  38. </para>
  39. <para>
  40. Podczas używania <classname>Zend_Locale</classname> takie ograniczenia nie występują
  41. ponieważ klasa <classname>Zend_Locale</classname> jest całkowicie niezależna od funkcji
  42. <acronym>PHP</acronym> <methodname>setlocale()</methodname>.
  43. </para>
  44. </tip>
  45. <sect2 id="zend.locale.whatislocalization">
  46. <title>Co to jest lokalizacja</title>
  47. <para>
  48. Lokalizacja oznacza, że aplikacja (lub strona) może być używana przez różnych
  49. użytkowników, którzy mówią w różnych językach. Jednak przetłumaczenie napisów
  50. to tylko jedno z wielu zagadnień z tym związanych. W Zend Framework składają
  51. się na nią:
  52. </para>
  53. <itemizedlist mark='opencircle'>
  54. <listitem>
  55. <para>
  56. <classname>Zend_Locale</classname> - Główna klasa wspierająca locale dla
  57. pozostałych komponentów Zend Framework.
  58. </para>
  59. </listitem>
  60. <listitem>
  61. <para>
  62. <classname>Zend_Translate</classname> - Tłumaczenie łańcuchów znaków.
  63. </para>
  64. </listitem>
  65. <listitem>
  66. <para>
  67. <classname>Zend_Date</classname> - Lokalizacja dat, czasów.
  68. </para>
  69. </listitem>
  70. <listitem>
  71. <para>
  72. <classname>Zend_Calendar</classname> - Lokalizacja kalendarzy (ze wsparciem
  73. dla systemów kalendarzy innych niż Gregoriański)
  74. </para>
  75. </listitem>
  76. <listitem>
  77. <para>
  78. <classname>Zend_Currency</classname> - Lokalizacja walut.
  79. </para>
  80. </listitem>
  81. <listitem>
  82. <para>
  83. <classname>Zend_Locale_Format</classname> - Przetwarzanie i generowanie
  84. zlokalizowanych liczb.
  85. </para>
  86. </listitem>
  87. <listitem>
  88. <para>
  89. <classname>Zend_Locale_Data</classname> - Pozyskiwanie zlokalizowanej formy
  90. standardowych łańcuchów znaków - nazw państw, języków i
  91. <ulink url="http://unicode.org/cldr/">innych z <acronym>CLDR</acronym></ulink>.
  92. </para>
  93. </listitem>
  94. <listitem>
  95. <para>
  96. <code>TODO</code> - Lokalizacja porządków sortowania
  97. </para>
  98. </listitem>
  99. </itemizedlist>
  100. </sect2>
  101. <sect2 id="zend.locale.whatis">
  102. <title>Czym jest locale</title>
  103. <para>
  104. Każdy użytkownik komputera używa locale, nawet wtedy gdy o tym nie myśli. Aplikacje
  105. nie posiadające obsługujące wielu zestawów językowych przeważnie wspierają
  106. jedno określone locale (locale autora). Kiedy klasa lub funkcja używają lokalizacji,
  107. mówi się że jest świadoma locale. W jaki sposób kod "wie" jakiego locale użytkownik
  108. się spodziewa?
  109. </para>
  110. <para>
  111. Łańcuch znaków lub obiekt identyfikujący locale daje klasie
  112. <classname>Zend_Locale</classname> i jej klasom pochodnym dostęp do informacji
  113. dotyczących języka oraz regionu, których użytkownik się spodziewa.
  114. Na podstawie tych informacji dokonywane jest poprawne formatowanie, normalizacja
  115. oraz konwersje.
  116. </para>
  117. </sect2>
  118. <sect2 id="zend.locale.representation">
  119. <title>Jak locale są reprezentowane</title>
  120. <para>
  121. Identyfikatory locale składają się z informacji dotyczących języka użytkownika oraz
  122. preferowanego/podstawowego regionu geograficznego (np. stan, województwo, land).
  123. Łańcuchy identyfikatorów locale używane w Zend Framework przestrzegają międzynarodowych
  124. standardów dotyczących skrótów języków i regionów. Zapisane są jako
  125. <code>język_REGION</code>. Obie części są utworzone z liter znaków wchodzących w skład
  126. <acronym>ASCII</acronym>.
  127. </para>
  128. <note>
  129. <para>
  130. W przeciwieństwie do popularnego osądu istnieją identyfikatory locale składające
  131. się z więcej niż 2 liter. Dodatkowo istnieją języki i regiony których skróty
  132. również są zawarte w więcej niż 2 literach. Mając to na uwadze, należy wystrzegać
  133. się własnoręcznego wydobywania oznaczenia języka czy regionu z pełnego\
  134. identyfikatora locale. Zamiast tego należy skorzystać z
  135. <classname>Zend_Locale</classname>. W przeciwnym przypadku efekty działania kodu
  136. mogą okazać się niespodziewane.
  137. </para>
  138. </note>
  139. <para>
  140. Użytkownik z USA może spodziewać się języka angielskiego (<code>English</code>)
  141. oraz regionu <constant>USA</constant>. Daje to identyfikator locale: "en_US".
  142. Użytkownik w Niemczech będzie się spodziewał języka niemieckiego
  143. (<code>Deutsch</code>) oraz regionu Niemcy (<code>Deutschland</code>) co da
  144. locale "de_DE". Aby zasięgnąć szczegółowych informacji o konkretnym
  145. identyfikatorze locale do użytku w Zend Framework należy zapoznać się z <ulink
  146. url="http://unicode.org/cldr/data/diff/supplemental/languages_and_territories.html">listą
  147. identyfikatorów locale</ulink>.
  148. </para>
  149. <example id="zend.locale.representation.example-1">
  150. <title>Wybranie konkretnego locale</title>
  151. <programlisting language="php"><![CDATA[
  152. $locale = new Zend_Locale('de_DE'); // Język niemiecki _ Niemcy
  153. ]]></programlisting>
  154. </example>
  155. <para>
  156. Użytkownik z Niemiec przebywający w Ameryce mógłby oczekiwać języka
  157. <code>Deutsch</code> i regionu <constant>USA</constant> ale podobne niestandardowe
  158. połączenia nie są wspierane w takim stopniu jak pełnoprawne locale. Jeśli podana
  159. zostanie nieprawidłowa kombinacja to nastąpi automatyczne odrzucenie kodu regionu.
  160. Dla przykładu, "de_IS" zostałoby ograniczone do "de" a "xh_RU" - do "xh" ponieważ
  161. żadna z tych kombinacji nie jest poprawna. Dodatkowo, jeśli język podanej kombinacji
  162. nie jest wspierany (np. "zz_US") lub nie istnieje to zostanie użyte domyślne locale
  163. "root", które ma domyślny zestaw definicji międzynarodowych oznaczeń dat, czasów,
  164. liczb, walut itp. Proces odrzucania kodu regionu zależy również od żądanych informacji.
  165. Niektóre kombinacje języków i regionów mogą być odpowiednie dla określonego
  166. rodzaju danych (np. dat) ale nie dla innych (np. format waluty).
  167. </para>
  168. <para>
  169. Należy mieć na uwadze zmiany historyczne ponieważ komponenty Zend Framework mogą nie
  170. być "świadome" częstych zmian stref czasowych na przestrzeni lat w wielu regionach.
  171. Przykładowo, <ulink url="http://www.statoids.com/tus.html"> pod tym linkiem widać
  172. historyczną listę szeregu zmian</ulink> jakich dokonywały rządy w stosunku do
  173. występowania tzw. czasu letniego a nawet obowiązującej strefy czasowej. Przez to,
  174. podczas obliczeń na datach, komponenty Zend Framework nie będą brały tych zmian pod
  175. uwagę. Zamiast tego zwrócony zostanie rezultat wynikający z użycia strefy czasowej
  176. wg. obecnych zasad dotyczących czasu letniego i strefy czasowej konkretnego regionu.
  177. </para>
  178. </sect2>
  179. <sect2 id="zend.locale.selection">
  180. <title>Wybranie odpowiedniego locale</title>
  181. <para>
  182. W większości przypadków <code>new Zend_Locale()</code> automatycznie wybierze poprawne
  183. locale zachowując uprzywilejowanie w stosunku do danych udostępnionych przez
  184. przeglądarkę użytkownika. W przypadku użycia
  185. <code>new Zend_Locale(Zend_Locale::ENVIRONMENT)</code> pierwszym źródłem informacji
  186. o locale stanie się konfiguracja serwera hostingowego tak jak opisano niżej.
  187. </para>
  188. <example id="zend.locale.selection.example-1">
  189. <title>Automatyczny wybór locale</title>
  190. <programlisting language="php"><![CDATA[
  191. $locale = new Zend_Locale();
  192. // domyślne zachowanie, tak samo jak wyżej
  193. $locale1 = new Zend_Locale(Zend_Locale::BROWSER);
  194. // preferencja ustawień serwera
  195. $locale2 = new Zend_Locale(Zend_Locale::ENVIRONMENT);
  196. // perferencja ustawień frameworka
  197. $locale3 = new Zend_Locale(Zend_Locale::FRAMEWORK);
  198. ]]></programlisting>
  199. </example>
  200. <para>
  201. Algorytm automatycznego szukania locale używany przez <classname>Zend_Locale</classname>
  202. używa trzech źródeł danych:
  203. <orderedlist>
  204. <listitem>
  205. <para>
  206. const <constant>Zend_Locale::BROWSER</constant> - Przeglądarka użytkownika
  207. przy każdym żądaniu, dostarcza informacji, które przekładane są na zmienną
  208. globalną <acronym>PHP</acronym> o nazwie
  209. <varname>$_SERVER['HTTP_ACCEPT_LANGUAGE']</varname>.
  210. Jeśli brak jest odpowiedniego locale to następnym źródłem branym pod
  211. uwagę jest <constant>ENVIRONMENT</constant> i w ostateczności
  212. <constant>FRAMEWORK</constant>.
  213. </para>
  214. </listitem>
  215. <listitem>
  216. <para>
  217. const <constant>Zend_Locale::ENVIRONMENT</constant> - <acronym>PHP</acronym>
  218. udostępnia locale serwera hostingowego poprzez wewnętrzną funkcję
  219. <methodname>setlocale()</methodname>. Jeśli brak jest odpowiedniego locale
  220. to kolejnym źródłem branym pod uwagę staje się
  221. <constant>FRAMEWORK</constant> i w ostateczności
  222. <constant>BROWSER</constant>.
  223. </para>
  224. </listitem>
  225. <listitem>
  226. <para>
  227. const <constant>Zend_Locale::FRAMEWORK</constant> - W momencie, w którym
  228. Zend Framework będzie miał wystandaryzowany sposób określania
  229. domyślnych wartości komponentów (cecha jeszcze niedostępna) wtedy użycie
  230. tej stałej spowoduje wybranie locale na podstawie tych domyślnych wartości.
  231. W przypadku braku odpowiedniego locale kolejnym źródłem branym pod uwagę
  232. będzie <constant>ENVIRONMENT</constant> i na końcu
  233. <constant>BROWSER</constant>.
  234. </para>
  235. </listitem>
  236. </orderedlist>
  237. </para>
  238. </sect2>
  239. <sect2 id="zend.locale.selection.automatic">
  240. <title>Użycie automatycznego locale</title>
  241. <para>
  242. <classname>Zend_Locale</classname> oferuje trzy dodatkowe locale. Nie należą one
  243. do żadnego języka ani regionu. Są to locale "automatyczne" co oznacza, że działają
  244. na podobnej zasadzie co metoda <methodname>getDefault()</methodname> ale bez potrzeby
  245. tworzenia instancji. Locale "automatyczne" mogą być użyte w każdym momencie, w którym
  246. możliwe byłoby zdefiniowanie locale w standardowy sposób. Dzięki temu można ich używać
  247. w łatwy sposób np. w sytuacji pracy z locale udostępnianym przez przeglądarkę.
  248. </para>
  249. <para>
  250. Istnieją trzy rodzaje takich locale, których zachowanie nie jest standardowe:
  251. <orderedlist>
  252. <listitem>
  253. <para>
  254. <code>'browser'</code> - klasa <classname>Zend_Locale</classname> powinna
  255. użyć informacji dostarczanych przez przeglądarkę użytkownika. Te dane są
  256. udostępniane przez <acronym>PHP</acronym> w globalnej zmiennej
  257. <varname>$_SERVER['HTTP_ACCEPT_LANGUAGE']</varname>.
  258. </para>
  259. <para>
  260. Jeśli przeglądarka użytkownika informuje o więcej niż jednym locale
  261. <classname>Zend_Locale</classname> użyje pierwszego z listy. W przypadku
  262. nie podania żadnego locale przez przeglądarkę (lub gdy skrypt jest
  263. uruchomiony z linii poleceń) zostanie użyte "automatyczne" locale
  264. <code>'environment'</code>.
  265. </para>
  266. </listitem>
  267. <listitem>
  268. <para>
  269. <code>'environment'</code> - klasa <classname>Zend_Locale</classname>
  270. powinna brać pod uwagę informacje przekazane przez serwer hostingowy.
  271. Są one udostępnione przez <acronym>PHP</acronym> poprzez wewnętrzną funkcję
  272. <methodname>setlocale()</methodname>.
  273. </para>
  274. <para>
  275. Jeśli środowisko serwera informuje o więcej niż jednym locale
  276. <classname>Zend_Locale</classname> użyje pierwszego z listy. W przypadku
  277. nie podania żadnego locale zostanie użyte "automatyczne" locale
  278. <code>'browser'</code>.
  279. </para>
  280. </listitem>
  281. <listitem>
  282. <para>
  283. <code>'auto'</code> - klasa <classname>Zend_Locale</classname> powinna
  284. automatycznie wykryć locale, które nadaje się do użycia. W pierwszej
  285. kolejności będzie próbować znaleźć locale użytkownika, w przypadku
  286. niepowodzenia pod uwagę brane będzie środowisko serwera hostingowego.
  287. </para>
  288. <para>
  289. Jeśli nie uda się wykryć locale, klasa rzuci wyjątek i powiadomi o
  290. niepowodzeniu.
  291. </para>
  292. </listitem>
  293. </orderedlist>
  294. </para>
  295. <example id="zend.locale.selection.automatic.example-1">
  296. <title>Użycie automatycznego locale</title>
  297. <programlisting language="php"><![CDATA[
  298. // bez automatycznej detekcji
  299. //$locale = new Zend_Locale(Zend_Locale::BROWSER);
  300. //$date = new Zend_Date($locale);
  301. // z automatyczną detekcją
  302. $date = new Zend_Date('auto');
  303. ]]></programlisting>
  304. </example>
  305. </sect2>
  306. <sect2 id="zend.locale.defaultlocale">
  307. <title>Użycie domyślnego locale</title>
  308. <para>
  309. W niektórych środowiskach automatyczna detekcja locale nie jest możliwa. Można się tego
  310. spodziewać w przypadku uruchomienia skryptu z linii poleceń lub gdy przeglądarka
  311. użytkownika nie ma zdefiniowanego języka a domyślnym locale serwera hostingowego
  312. jest 'C' lub inne niestandardowe locale.
  313. </para>
  314. <para>
  315. W takim przypadku <classname>Zend_Locale</classname> rzuci wyjątek z informacją o
  316. niepowodzeniu w automatycznym wykryciu locale. Istnieją dwa wyjścia z tej sytuacji.
  317. Pierwszym jest ręczne ustawienie nowego locale, drugim - zdefiniowanie domyślnego
  318. locale.
  319. </para>
  320. <example id="zend.locale.defaultlocale.example-1">
  321. <title>Obsługa wyjątków locale</title>
  322. <programlisting language="php"><![CDATA[
  323. // w pliku bootstrap
  324. try {
  325. $locale = new Zend_Locale('auto');
  326. } catch (Zend_Locale_Exception $e) {
  327. $locale = new Zend_Locale('de');
  328. }
  329. // w modelu/kontrolerze
  330. $date = new Zend_Date($locale);
  331. ]]></programlisting>
  332. </example>
  333. <para>
  334. To podejście ma jedną wadę. Wymusza ustawienie obiektu locale poprzez
  335. <classname>Zend_Locale</classname> w każdej klasie. W przypadku używania wielu klas
  336. może to stanowić duży problem.
  337. </para>
  338. <para>
  339. Od Zend Framework 1.5 istnieje o wiele lepszy sposób na obsługę takiej sytuacji.
  340. Można ustawić domyślne locale za pomocą statycznej metody
  341. <methodname>setDefault()</methodname>. Oczywiście każde nieznane lub źle sformułowane
  342. locale również spowoduje rzucenie wyjątku. <methodname>setDefault()</methodname>
  343. powinna być wywołana przed uruchomieniem dowolnej klasy używającej
  344. <classname>Zend_Locale</classname>. Tak jak w poniższym przykładzie:
  345. </para>
  346. <example id="zend.locale.defaultlocale.example-2">
  347. <title>Ustawienie domyślnego locale</title>
  348. <programlisting language="php"><![CDATA[
  349. // w pliku bootstrap
  350. Zend_Locale::setDefault('de');
  351. // w modelu/kontrolerze
  352. $date = new Zend_Date();
  353. ]]></programlisting>
  354. </example>
  355. <para>
  356. W przypadku niepowodzenia automatycznego wykrycia locale użyte zostanie locale
  357. <emphasis>de</emphasis>. W przeciwnym przypadku - klasa użyje wykrytego locale.
  358. </para>
  359. </sect2>
  360. <sect2 id="zend.locale.interoperate">
  361. <title>Klasy ZF "świadome" locale</title>
  362. <para>
  363. Klasy, które są "świadome" locale w Zend Framework polegają na
  364. <classname>Zend_Locale</classname> w kwestii automatycznego wybrania locale na
  365. zasadach opisanych wcześniej. Np. w aplikacji webowej Zend Framework, utworzenie
  366. obiektu klasy <classname>Zend_Date</classname> bez podania locale spowoduje, że
  367. powstały obiekt będzie miał locale ustawione na podstawie przeglądarki użytkownika.
  368. </para>
  369. <example id="zend.locale.interoperate.example-1">
  370. <title>Format daty domyślnie dostosowuje się do przeglądarki</title>
  371. <programlisting language="php"><![CDATA[
  372. $date = new Zend_Date('2006',Zend_Date::YEAR);
  373. ]]></programlisting>
  374. </example>
  375. <para>
  376. Aby zmienić domyślne zachowanie i zmusić komponenty Zend Framework "świadome" locale
  377. do użytku określonego locale (obojętnie od ustawień przeglądarki użytkownika) należy
  378. podać nazwę locale w trzecim argumencie konstruktora.
  379. </para>
  380. <example id="zend.locale.interoperate.example-2">
  381. <title>Zmiana domyślnego wykrywania locale</title>
  382. <programlisting language="php"><![CDATA[
  383. $usLocale = new Zend_Locale('en_US');
  384. $date = new Zend_Date('2006', Zend_Date::YEAR, $usLocale);
  385. $temp = new Zend_Measure_Temperature('100,10',
  386. Zend_Measure::TEMPERATURE,
  387. $usLocale);
  388. ]]></programlisting>
  389. </example>
  390. <para>
  391. Jeśli jest wiadomo, że wiele obiektów powinno użyć określonego locale to należy się
  392. upewnić, że będą miały to locale określone. Dzięki temu można uniknąć dodatkowego
  393. czasu pracy skryptu wynikającego z wyszukiwania odpowiedniego locale.
  394. </para>
  395. <example id="zend.locale.interoperate.example-3">
  396. <title>Optymalizacja wydajności dzięki określeniu locale</title>
  397. <programlisting language="php"><![CDATA[
  398. $locale = new Zend_Locale();
  399. $date = new Zend_Date('2006', Zend_Date::YEAR, $locale);
  400. $temp = new Zend_Measure_Temperature('100,10',
  401. Zend_Measure::TEMPERATURE,
  402. $locale);
  403. ]]></programlisting>
  404. </example>
  405. </sect2>
  406. <sect2 id="zend.locale.frameworkwidelocale">
  407. <title>Locale obowiązujące w całej aplikacji</title>
  408. <para>
  409. Zend Framework umożliwia zdefiniowanie locale obowiązującego w całej aplikacji.
  410. Polega to na wywołaniu obiektu klasy <classname>Zend_Locale</classname> i umieszczeniu
  411. go w rejestrze z kluczem 'Zend_Locale'. Dzięki temu ta instancja będzie używana we
  412. wszystkich klasach "świadomych" locale Zend Framework. Ten sposób umożliwia
  413. ustawienie locale w rejestrze i uwolnienie się od potrzeby zwracania uwagi na to
  414. zagadnienie. Ustawione locale zostanie automatycznie użyte we wszystkich przypadkach.
  415. Przykładowe użycie znajduje się w poniższym przykładzie:
  416. </para>
  417. <example id="zend.locale.frameworkwidelocale.example">
  418. <title>Użycie locale obowiązującego w całej aplikacji</title>
  419. <programlisting language="php"><![CDATA[
  420. // w pliku bootstrap
  421. $locale = new Zend_Locale('de_AT');
  422. Zend_Registry::set('Zend_Locale', $locale);
  423. // w modelu lub kontrolerze
  424. $date = new Zend_Date();
  425. // print $date->getLocale();
  426. echo $date->getDate();
  427. ]]></programlisting>
  428. </example>
  429. </sect2>
  430. <sect2 id="zend.locale.formatoptions">
  431. <title>Zend_Locale_Format::setOptions(array $options)</title>
  432. <para>
  433. Opcja 'precision' służy do obcięcia lub wydłużenia liczby. Wartość '-1' wyłącza
  434. możliwość modyfikacji ilości liczb po przecinku. Opcja 'locale' jest pomocna podczas
  435. przetwarzania liczb i dat z użyciem separatorów oraz nazw miesięcy.
  436. Opcja formatów dat 'format_type' umożliwia wybór pomiędzy standardem
  437. <acronym>CLDR</acronym>/ISO oraz wyrażeniami funkcji <acronym>PHP</acronym> date().
  438. Opcja 'fix_date' umożliwia podanie formatu liczb do użytku z metodą
  439. <methodname>toNumber()</methodname> (więcej informacji znajduje się w rozdziale
  440. <xref linkend= "zend.locale.number.localize"/>).
  441. </para>
  442. <para>
  443. Opcja 'date_format' może być użyta do określenia domyślnego formatu daty ale należy
  444. zachować ostrożność przy używaniu <methodname>getDate()</methodname>,
  445. <methodname>checkdateFormat()</methodname> and <methodname>getTime()</methodname>.
  446. Aby ich pomyślnie używać należy umieścić w ich opcjach następującą tablicę:
  447. array('date_format' => null, 'locale' => $locale).
  448. </para>
  449. <example id="zend.locale.formatoptions.example-1">
  450. <title>Daty przyjmują domyślny format przeglądarki</title>
  451. <programlisting language="php"><![CDATA[
  452. Zend_Locale_Format::setOptions(array('locale' => 'en_US',
  453. 'fix_date' => true,
  454. 'format_type' => 'php'));
  455. ]]></programlisting>
  456. </example>
  457. <para>
  458. Aby uzyskać standardowe definicje locale można użyć stałej
  459. <constant>Zend_Locale_Format::STANDARD</constant>. Ustawienie w opcji
  460. <code>date_format</code> na <constant>Zend_Locale_Format::STANDARD</constant> spowoduje
  461. użycie standardowej definicji formatu zawartej w bieżącym locale. Umieszczenie tej
  462. stałej w opcji <code>number_format</code> spowoduje użycie standardowego
  463. formatu liczb z bieżącego locale. Ustawienie stałej w opcji <code>locale</code>
  464. spowoduje użycie standardowego locale dla środowiska bądź przeglądarki.
  465. </para>
  466. <example id="zend.locale.formatoptions.example-2">
  467. <title>Użycie standardowych definicji w metodzie setOptions()</title>
  468. <programlisting language="php"><![CDATA[
  469. Zend_Locale_Format::setOptions(array('locale' => 'en_US',
  470. 'date_format' => 'dd.MMMM.YYYY'));
  471. // nadpisanie globalnego formatu daty
  472. $date = Zend_Locale_Format::getDate('2007-04-20',
  473. array('date_format' =>
  474. Zend_Locale_Format::STANDARD);
  475. // globalne ustawienie standardowego locale
  476. Zend_Locale_Format::setOptions(array('locale' => Zend_Locale_Format::STANDARD,
  477. 'date_format' => 'dd.MMMM.YYYY'));
  478. ]]></programlisting>
  479. </example>
  480. </sect2>
  481. <sect2 id="zend.locale.cache">
  482. <title>Przyspieszenie Zend_Locale i jej klas pochodnych</title>
  483. <para>
  484. Można przyspieszyć działanie klasy <classname>Zend_Locale</classname> i jej klas
  485. pochodnych poprzez użycie <classname>Zend_Cache</classname>. W przypadku używania
  486. <classname>Zend_Locale</classname> osiągnąć to można za pomocą statycznej
  487. metody <methodname>Zend_Locale::setCache($cache)</methodname>.
  488. Klasę <classname>Zend_Locale_Format</classname> można przyspieszyć używając opcji
  489. <code>cache</code> w
  490. <classname>Zend_Locale_Format::setOptions(array('cache' => $adapter));</classname>.
  491. Jeśli używane są obie klasy należy ustawić cache jedynie dla
  492. <classname>Zend_Locale</classname>. W przeciwnym przypadku ostatni ustawiony cache
  493. nadpisze wcześniejszy. Dla ułatwienia istnieją również statyczne metody
  494. <methodname>getCache()</methodname>, <methodname>hasCache()</methodname>,
  495. <methodname>clearCache()</methodname> oraz <methodname>removeCache()</methodname>.
  496. </para>
  497. <para>
  498. Jeśli deweloper nie ustawi własnoręcznie cache'u <classname>Zend_Locale</classname>
  499. automatycznie zrobi to za niego. W niektórych sytuacjach może zajść potrzeba rezygnacji
  500. z użycia cache'u, nawet za cenę wydajności. Wtedy należy użyć statycznej metody
  501. <methodname>disableCache(true)</methodname>. Oprócz wyłączenia ewentualnego wcześniej
  502. ustawionego cache'u (bez usuwania jego zawartości) metoda ta zapobiega generowaniu
  503. cache'u (jeśli nie był wcześniej ustawiony).
  504. </para>
  505. </sect2>
  506. </sect1>
  507. <!--
  508. vim:se ts=4 sw=4 et:
  509. -->