Version Description
- Added Polish translations
- Tested in WP 4.0
- Add support for Wordpress's regionless locales
Download this release
Release Info
Developer | timwhitlock |
Plugin | Loco Translate |
Version | 1.4.7 |
Comparing to | |
See all releases |
Code changes from version 1.4.6 to 1.4.7
- languages/loco-translate-pl_PL.mo +0 -0
- languages/loco-translate-pl_PL.po +621 -0
- lib/build/gettext-compiled.php +2 -2
- lib/build/locales-compiled.php +2 -2
- lib/loco-boot.php +1 -1
- lib/loco-locales.php +55 -13
- lib/test/tests/LocalesTest.php +26 -5
- lib/test/tests/UtilsTest.php +3 -0
- loco.php +1 -1
- pub/js/lang/loco-translate-pl_PL.js +33 -0
- readme.txt +59 -23
languages/loco-translate-pl_PL.mo
ADDED
Binary file
|
languages/loco-translate-pl_PL.po
ADDED
@@ -0,0 +1,621 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
msgid ""
|
2 |
+
msgstr ""
|
3 |
+
"Project-Id-Version: Loco Translate\n"
|
4 |
+
"Report-Msgid-Bugs-To: \n"
|
5 |
+
"POT-Creation-Date: Thu Jan 02 2014 17:30:57 GMT+0000 (GMT)\n"
|
6 |
+
"PO-Revision-Date: Wed Aug 06 2014 18:24:07 GMT+0200 (Środkowoeuropejski czas "
|
7 |
+
"letni)\n"
|
8 |
+
"Last-Translator: Admin <support@localise.biz>\n"
|
9 |
+
"Language-Team: \n"
|
10 |
+
"Language: Polish\n"
|
11 |
+
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10 >= 2 && n%10<=4 "
|
12 |
+
"&&(n%100<10||n%100 >= 20)? 1 : 2)\n"
|
13 |
+
"MIME-Version: 1.0\n"
|
14 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
15 |
+
"Content-Transfer-Encoding: 8bit\n"
|
16 |
+
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
+
"X-Poedit-Basepath: .\n"
|
18 |
+
"X-Poedit-SearchPath-0: ..\n"
|
19 |
+
"X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;"
|
20 |
+
"__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;"
|
21 |
+
"_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;"
|
22 |
+
"esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;"
|
23 |
+
"esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2\n"
|
24 |
+
"X-Generator: Loco - https://localise.biz/\n"
|
25 |
+
"X-Loco-Target-Locale: pl_PL"
|
26 |
+
|
27 |
+
#: ../tpl/admin-poedit.tpl.php:135
|
28 |
+
msgctxt "Editor button"
|
29 |
+
msgid "Fuzzy"
|
30 |
+
msgstr "Niepewny"
|
31 |
+
|
32 |
+
#: ../tpl/admin-fscheck.tpl.php:17
|
33 |
+
#, php-format
|
34 |
+
msgid "File system permissions for %s"
|
35 |
+
msgstr "Uprawnienia systemu plików dla %s"
|
36 |
+
|
37 |
+
#: ../tpl/admin-fscheck.tpl.php:40
|
38 |
+
msgid "Back"
|
39 |
+
msgstr "Wstecz"
|
40 |
+
|
41 |
+
#: ../tpl/admin-fscheck.tpl.php:41 ../tpl/admin-opts.tpl.php:96
|
42 |
+
msgid "Get help"
|
43 |
+
msgstr "Pomoc"
|
44 |
+
|
45 |
+
#: ../tpl/admin-list.tpl.php:11
|
46 |
+
msgctxt "Table header"
|
47 |
+
msgid "Package details"
|
48 |
+
msgstr "Detale paczki"
|
49 |
+
|
50 |
+
#: ../tpl/admin-list.tpl.php:14
|
51 |
+
msgctxt "Table header"
|
52 |
+
msgid "Translations (PO)"
|
53 |
+
msgstr "Tłumaczenia (PO)"
|
54 |
+
|
55 |
+
#: ../tpl/admin-list.tpl.php:17
|
56 |
+
msgctxt "Table header"
|
57 |
+
msgid "Template (POT)"
|
58 |
+
msgstr "Schemat (POT)"
|
59 |
+
|
60 |
+
#: ../tpl/admin-list.tpl.php:20
|
61 |
+
msgctxt "Table header"
|
62 |
+
msgid "File permissions"
|
63 |
+
msgstr "Uprawnienia plików"
|
64 |
+
|
65 |
+
#: ../tpl/admin-list.tpl.php:40
|
66 |
+
#, php-format
|
67 |
+
msgid "Extends: %s"
|
68 |
+
msgstr "Rozszerza: %s"
|
69 |
+
|
70 |
+
#: ../tpl/admin-list.tpl.php:44
|
71 |
+
#, php-format
|
72 |
+
msgid "1 language"
|
73 |
+
msgid_plural "%u languages"
|
74 |
+
msgstr[0] "1 język"
|
75 |
+
msgstr[1] "%u języki"
|
76 |
+
msgstr[2] "%u języków"
|
77 |
+
|
78 |
+
#: ../tpl/admin-list.tpl.php:49
|
79 |
+
msgctxt "Modified time"
|
80 |
+
msgid "Updated"
|
81 |
+
msgstr "Zaktualizowano"
|
82 |
+
|
83 |
+
#: ../tpl/admin-list.tpl.php:98
|
84 |
+
msgid "OK"
|
85 |
+
msgstr "OK"
|
86 |
+
|
87 |
+
#: ../tpl/admin-nav.tpl.php:20
|
88 |
+
msgid "Powered by"
|
89 |
+
msgstr "Napędzany przez"
|
90 |
+
|
91 |
+
#: ../tpl/admin-nav.tpl.php:26
|
92 |
+
msgid "Loco may not work as expected"
|
93 |
+
msgstr "Loco może nie działać tak jak oczekujesz"
|
94 |
+
|
95 |
+
#: ../tpl/admin-opts.tpl.php:18
|
96 |
+
msgid "Configure Loco Translate"
|
97 |
+
msgstr "Konfiguruj Loco Translate"
|
98 |
+
|
99 |
+
#: ../tpl/admin-opts.tpl.php:27 ../tpl/admin-opts.tpl.php:31
|
100 |
+
msgid "Compiling MO files"
|
101 |
+
msgstr "Kompilowanie plików MO"
|
102 |
+
|
103 |
+
#: ../tpl/admin-opts.tpl.php:36
|
104 |
+
msgid "Use built-in MO compiler."
|
105 |
+
msgstr "Użyj wbudowanego kompilatora MO."
|
106 |
+
|
107 |
+
#: ../tpl/admin-opts.tpl.php:42
|
108 |
+
msgid "Use external command:"
|
109 |
+
msgstr "Użyj zewnętrznej komendy:"
|
110 |
+
|
111 |
+
#: ../tpl/admin-opts.tpl.php:47
|
112 |
+
msgid "Enter path to msgfmt on server"
|
113 |
+
msgstr "Wpisz ścieżkę do msgfmt na serwerze"
|
114 |
+
|
115 |
+
#: ../tpl/admin-opts.tpl.php:54
|
116 |
+
msgid "Generate hash tables"
|
117 |
+
msgstr "Generuj tablice hash"
|
118 |
+
|
119 |
+
#: ../tpl/admin-opts.tpl.php:61 ../tpl/admin-opts.tpl.php:65
|
120 |
+
msgid "Backing up PO files"
|
121 |
+
msgstr "Zrób kopię zapasową plików PO"
|
122 |
+
|
123 |
+
#: ../tpl/admin-opts.tpl.php:69
|
124 |
+
msgid "Number of backups to keep of each file:"
|
125 |
+
msgstr "Liczba kopii zapasowych każdego pliku do przechowania:"
|
126 |
+
|
127 |
+
#: ../tpl/admin-opts.tpl.php:77 ../tpl/admin-opts.tpl.php:81
|
128 |
+
msgid "Experimental features"
|
129 |
+
msgstr "Funkcje eksperymentalne"
|
130 |
+
|
131 |
+
#: ../tpl/admin-opts.tpl.php:86
|
132 |
+
msgid "Enable Wordpress core translations"
|
133 |
+
msgstr "Włącz tłumaczenie silnika Wordpress"
|
134 |
+
|
135 |
+
#: ../tpl/admin-opts.tpl.php:95
|
136 |
+
msgid "Save settings"
|
137 |
+
msgstr "Zapisz ustawienia"
|
138 |
+
|
139 |
+
#: ../tpl/admin-poedit.tpl.php:31
|
140 |
+
msgid "Template file"
|
141 |
+
msgstr "Plik schematu"
|
142 |
+
|
143 |
+
#: ../tpl/admin-poedit.tpl.php:39
|
144 |
+
msgctxt "Dropdown label"
|
145 |
+
msgid "Switch to..."
|
146 |
+
msgstr "Zmień na..."
|
147 |
+
|
148 |
+
#: ../tpl/admin-poedit.tpl.php:57
|
149 |
+
msgid "Updated"
|
150 |
+
msgstr "Zaktualizowano"
|
151 |
+
|
152 |
+
#: ../tpl/admin-poedit.tpl.php:62
|
153 |
+
msgid "never"
|
154 |
+
msgstr "nigdy"
|
155 |
+
|
156 |
+
#: ../tpl/admin-poedit.tpl.php:87
|
157 |
+
msgctxt "Editor button"
|
158 |
+
msgid "Save"
|
159 |
+
msgstr "Zapisz"
|
160 |
+
|
161 |
+
#: ../tpl/admin-poedit.tpl.php:94 ../tpl/admin-poedit.tpl.php:103
|
162 |
+
msgctxt "Editor button"
|
163 |
+
msgid "Download"
|
164 |
+
msgstr "Pobierz"
|
165 |
+
|
166 |
+
#: ../tpl/admin-poedit.tpl.php:115
|
167 |
+
msgctxt "Editor button"
|
168 |
+
msgid "Sync"
|
169 |
+
msgstr "Synchronizuj"
|
170 |
+
|
171 |
+
#: ../tpl/admin-poedit.tpl.php:120
|
172 |
+
msgctxt "Editor button"
|
173 |
+
msgid "Revert"
|
174 |
+
msgstr "Przywróć"
|
175 |
+
|
176 |
+
#: ../tpl/admin-poedit.tpl.php:125
|
177 |
+
msgctxt "Editor button"
|
178 |
+
msgid "Add"
|
179 |
+
msgstr "Dodaj"
|
180 |
+
|
181 |
+
#: ../tpl/admin-poedit.tpl.php:130
|
182 |
+
msgctxt "Editor button"
|
183 |
+
msgid "Del"
|
184 |
+
msgstr "Usuń"
|
185 |
+
|
186 |
+
#: ../tpl/admin-poedit.tpl.php:140
|
187 |
+
msgid "Filter translations"
|
188 |
+
msgstr "Filtruj tłumaczenia"
|
189 |
+
|
190 |
+
#: ../tpl/admin-poedit.tpl.php:145
|
191 |
+
msgctxt "Editor button"
|
192 |
+
msgid "Help"
|
193 |
+
msgstr "Pomoc"
|
194 |
+
|
195 |
+
#: ../tpl/admin-poinit.tpl.php:21
|
196 |
+
#, php-format
|
197 |
+
msgid "Initialize new translations in %s"
|
198 |
+
msgstr "Zainicjuj nowe tłumaczenie w %s"
|
199 |
+
|
200 |
+
#: ../tpl/admin-poinit.tpl.php:34
|
201 |
+
msgid "Select from common languages"
|
202 |
+
msgstr "Wybierz z częstych języków"
|
203 |
+
|
204 |
+
#: ../tpl/admin-poinit.tpl.php:45
|
205 |
+
msgctxt "Form label"
|
206 |
+
msgid "or enter any language code"
|
207 |
+
msgstr "lub wpisz dowolny kod języka"
|
208 |
+
|
209 |
+
#: ../tpl/admin-poinit.tpl.php:58
|
210 |
+
#, php-format
|
211 |
+
msgctxt "Form label"
|
212 |
+
msgid "create in <code>%s</code>"
|
213 |
+
msgstr "stwórz w <code>%s</code>"
|
214 |
+
|
215 |
+
#: ../tpl/admin-poinit.tpl.php:63
|
216 |
+
msgctxt "Form label"
|
217 |
+
msgid "create in global languages directory"
|
218 |
+
msgstr "stwórz w globalny, katalogu języków"
|
219 |
+
|
220 |
+
#: ../tpl/admin-poinit.tpl.php:68
|
221 |
+
msgctxt "Submit button"
|
222 |
+
msgid "Start translating"
|
223 |
+
msgstr "Zacznij tłumaczyć"
|
224 |
+
|
225 |
+
#: ../tpl/admin-root.tpl.php:18
|
226 |
+
msgid "New version available"
|
227 |
+
msgstr "Nowa wersja jest dostępna"
|
228 |
+
|
229 |
+
#: ../tpl/admin-root.tpl.php:21
|
230 |
+
#, php-format
|
231 |
+
msgid "Upgrade to version %s of Loco Translate"
|
232 |
+
msgstr "Zaktualizuj Loco Translate do wersji %s"
|
233 |
+
|
234 |
+
#: ../tpl/admin-root.tpl.php:31
|
235 |
+
msgid "Select a plugin or theme to translate"
|
236 |
+
msgstr "Wybierz wtyczkę lub motyw do tłumaczenia"
|
237 |
+
|
238 |
+
#: ../tpl/admin-root.tpl.php:40
|
239 |
+
msgctxt "Package list header"
|
240 |
+
msgid "Themes"
|
241 |
+
msgstr "Motywy"
|
242 |
+
|
243 |
+
#: ../tpl/admin-root.tpl.php:53
|
244 |
+
msgctxt "Package list header"
|
245 |
+
msgid "Plugins"
|
246 |
+
msgstr "Wtyczki"
|
247 |
+
|
248 |
+
#: ../tpl/admin-root.tpl.php:66
|
249 |
+
msgctxt "Package list header"
|
250 |
+
msgid "Core"
|
251 |
+
msgstr "Silnik"
|
252 |
+
|
253 |
+
#: ../lib/loco-admin.php:889
|
254 |
+
#, php-format
|
255 |
+
msgid "%s fuzzy"
|
256 |
+
msgstr "%s niepewnych"
|
257 |
+
|
258 |
+
#: ../lib/loco-admin.php:934
|
259 |
+
msgid "Failed to compile MO file with built-in compiler"
|
260 |
+
msgstr "Niepowodzenie kompilacji pliku MO używając wbudowanego kompilatora"
|
261 |
+
|
262 |
+
#: ../lib/loco-admin.php:1034
|
263 |
+
msgid "File download failed"
|
264 |
+
msgstr "Błąd pobierania pliku"
|
265 |
+
|
266 |
+
#: ../lib/loco-locales.php:65
|
267 |
+
msgid "Unknown language"
|
268 |
+
msgstr "Nieznany język"
|
269 |
+
|
270 |
+
#: ../lib/loco-packages.php:423 ../lib/loco-packages.php:430
|
271 |
+
msgid "Some files not writable"
|
272 |
+
msgstr "Niektóre pliki są tylko do odczytu"
|
273 |
+
|
274 |
+
#: ../lib/loco-packages.php:433
|
275 |
+
msgid "Some files missing"
|
276 |
+
msgstr "Brakujące niektóre pliki"
|
277 |
+
|
278 |
+
#: ../lib/loco-packages.php:439 ../lib/loco-packages.php:443
|
279 |
+
#, php-format
|
280 |
+
msgid "\"%s\" folder not writable"
|
281 |
+
msgstr "\"%s\" katalog jest tylko do odczytu"
|
282 |
+
|
283 |
+
#: ../lib/loco-packages.php:464
|
284 |
+
msgid "POT file not writable"
|
285 |
+
msgstr "Plik POT jest tylko do odczytu"
|
286 |
+
|
287 |
+
#: ../lib/loco-packages.php:469
|
288 |
+
msgid "PO file not writable"
|
289 |
+
msgstr "Plik PO jest tylko do odczytu"
|
290 |
+
|
291 |
+
#: ../lib/loco-packages.php:471
|
292 |
+
msgid "MO file not writable"
|
293 |
+
msgstr "Plik MO jest tylko do odczytu"
|
294 |
+
|
295 |
+
#: ../lib/loco-packages.php:471
|
296 |
+
msgid "MO file not found"
|
297 |
+
msgstr "Nie znaleziono pliku MO"
|
298 |
+
|
299 |
+
#: ../lib/loco-packages.php:476
|
300 |
+
msgid "Folder not writable"
|
301 |
+
msgstr "Katalog jest tylko do odczytu"
|
302 |
+
|
303 |
+
#: ../lib/loco-packages.php:476
|
304 |
+
msgid "Folder not found"
|
305 |
+
msgstr "Nie znaleziono katalogu"
|
306 |
+
|
307 |
+
#: ../php/loco-ajax.php:17 ../php/loco-download.php:21
|
308 |
+
msgid "User does not have permission to manage translations"
|
309 |
+
msgstr "Użytkownik nie ma uprawnień do zarządzania tłumaczeniami"
|
310 |
+
|
311 |
+
#: ../php/loco-download.php:75 ../php/loco-posave.php:121
|
312 |
+
#, php-format
|
313 |
+
msgid "Failed to compile MO file with %s, check your settings"
|
314 |
+
msgstr "Nie udało się skompilować pliku MO używając %s, sprawdź ustawienia"
|
315 |
+
|
316 |
+
#: ../php/loco-posave.php:10 ../php/loco-posync.php:9
|
317 |
+
msgid "Invalid data posted to server"
|
318 |
+
msgstr "Błędne dane wysłane do serwera"
|
319 |
+
|
320 |
+
#: ../php/loco-posave.php:23 ../php/loco-posync.php:22
|
321 |
+
#, php-format
|
322 |
+
msgid "Package not found called %s"
|
323 |
+
msgstr "Paczka o nazwie %s nie została znaleziona"
|
324 |
+
|
325 |
+
#: ../php/loco-posave.php:58
|
326 |
+
#, php-format
|
327 |
+
msgid ""
|
328 |
+
"Web server cannot create backups in \"%s\". Fix file permissions or disable "
|
329 |
+
"backups in settings"
|
330 |
+
msgstr ""
|
331 |
+
"Serwer www nie może utworzyć kopii w \"%s\". Popraw uprawnienia lub wyłącz "
|
332 |
+
"kopie zapasowe w ustawieniach"
|
333 |
+
|
334 |
+
#: ../php/loco-posave.php:66
|
335 |
+
#, php-format
|
336 |
+
msgid ""
|
337 |
+
"Web server cannot create \"%s\" directory in \"%s\". Fix file permissions or "
|
338 |
+
"create it manually."
|
339 |
+
msgstr ""
|
340 |
+
"Serwer www nie może utworzyć katalogu \"%s\". Popraw uprawnienia lub utwórz go "
|
341 |
+
"ręcznie."
|
342 |
+
|
343 |
+
#: ../php/loco-posave.php:69
|
344 |
+
#, php-format
|
345 |
+
msgid ""
|
346 |
+
"Web server cannot create files in the \"%s\" directory. Fix file permissions "
|
347 |
+
"or use the download function."
|
348 |
+
msgstr ""
|
349 |
+
"Serwer www nie może utworzyć plików w katalogu \"%s\". Popraw uprawnienia lub "
|
350 |
+
"użyj funkcji pobierania."
|
351 |
+
|
352 |
+
#: ../php/loco-posave.php:81
|
353 |
+
#, php-format
|
354 |
+
msgid ""
|
355 |
+
"%s file is not writable by the web server. Fix file permissions or download "
|
356 |
+
"and copy to \"%s/%s\"."
|
357 |
+
msgstr ""
|
358 |
+
"%s jest tylko do odczytu dla serwera www. Popraw uprawnienia lub pobierz i "
|
359 |
+
"skopiuj do \"%s/%s\"."
|
360 |
+
|
361 |
+
#: ../php/loco-posave.php:102
|
362 |
+
msgid "Cannot create MO file"
|
363 |
+
msgstr "Nie można utworzyć pliku MO"
|
364 |
+
|
365 |
+
#: ../php/loco-posave.php:105
|
366 |
+
msgid "Cannot overwrite MO file"
|
367 |
+
msgstr "Nie można nadpisać pliku MO"
|
368 |
+
|
369 |
+
#: ../php/loco-posave.php:131
|
370 |
+
msgid "Failed to write MO file"
|
371 |
+
msgstr "Błąd zapisu pliku MO"
|
372 |
+
|
373 |
+
#: ../php/loco-posync.php:47
|
374 |
+
msgid "No source files in this package, nothing to sync"
|
375 |
+
msgstr "Brak plików źródłowych w tej paczce, nic do synchronizacji"
|
376 |
+
|
377 |
+
#: ../php/loco-posync.php:57
|
378 |
+
msgid "No strings could be extracted from source files"
|
379 |
+
msgstr "Żadne linie nie mogą być wyciągnięte z plików źródłowych"
|
380 |
+
|
381 |
+
#: ../pub/js/lang/dummy.php:8
|
382 |
+
msgid "Unknown error"
|
383 |
+
msgstr "Nieznany błąd"
|
384 |
+
|
385 |
+
#: ../pub/js/lang/dummy.php:10
|
386 |
+
msgid "PO file saved"
|
387 |
+
msgstr "Plik PO zapisany"
|
388 |
+
|
389 |
+
#: ../pub/js/lang/dummy.php:12
|
390 |
+
msgid "and MO file compiled"
|
391 |
+
msgstr "oraz plik MO skompilowany"
|
392 |
+
|
393 |
+
#: ../pub/js/lang/dummy.php:15
|
394 |
+
#, php-format
|
395 |
+
msgid "Merged from %s"
|
396 |
+
msgstr "Połączono z %s"
|
397 |
+
|
398 |
+
#: ../pub/js/lang/dummy.php:17
|
399 |
+
msgid "Merged from source code"
|
400 |
+
msgstr "Połączono z kodu źródłowego"
|
401 |
+
|
402 |
+
#: ../pub/js/lang/dummy.php:19
|
403 |
+
#, php-format
|
404 |
+
msgid "Already up to date with %s"
|
405 |
+
msgstr "Już aktualne z %s"
|
406 |
+
|
407 |
+
#: ../pub/js/lang/dummy.php:21
|
408 |
+
msgid "Already up to date with source code"
|
409 |
+
msgstr "Już aktualne z kodu źródłowego"
|
410 |
+
|
411 |
+
#: ../pub/js/lang/dummy.php:23
|
412 |
+
#, php-format
|
413 |
+
msgid "1 new string added"
|
414 |
+
msgid_plural "%s new strings added"
|
415 |
+
msgstr[0] "1 nowa linia dodana"
|
416 |
+
msgstr[1] "%s nowe linie dodano"
|
417 |
+
msgstr[2] "%s nowych linii dodano"
|
418 |
+
|
419 |
+
#: ../pub/js/lang/dummy.php:25
|
420 |
+
#, php-format
|
421 |
+
msgid "1 obsolete string removed"
|
422 |
+
msgid_plural "%s obsolete strings removed"
|
423 |
+
msgstr[0] "1 zbędna linia usunięta"
|
424 |
+
msgstr[1] "%s zbędne linie usunięte"
|
425 |
+
msgstr[2] "%s zbędnych linii usunięto"
|
426 |
+
|
427 |
+
#: ../pub/js/lang/dummy.php:27
|
428 |
+
msgid "Your changes will be lost if you continue without saving"
|
429 |
+
msgstr "Utracisz aktualne zmiany jeśli będziesz kontynuował bez zapisywania"
|
430 |
+
|
431 |
+
#. label for the window pane holding native translation
|
432 |
+
#: ../pub/js/lang/dummy.php:35
|
433 |
+
msgctxt "Editor pane"
|
434 |
+
msgid "Source text"
|
435 |
+
msgstr "Tekst źródłowy"
|
436 |
+
|
437 |
+
#. where %s is the language, e.g French translation
|
438 |
+
#: ../pub/js/lang/dummy.php:38
|
439 |
+
#, php-format
|
440 |
+
msgctxt "Editor pane"
|
441 |
+
msgid "%s translation"
|
442 |
+
msgstr "%s tłumaczenie"
|
443 |
+
|
444 |
+
#. label for the window pane holding translator comments
|
445 |
+
#: ../pub/js/lang/dummy.php:41
|
446 |
+
msgctxt "Editor pane"
|
447 |
+
msgid "Comments"
|
448 |
+
msgstr "Komentarze"
|
449 |
+
|
450 |
+
#. label for the window pane holding message context
|
451 |
+
#: ../pub/js/lang/dummy.php:44
|
452 |
+
msgctxt "Editor pane"
|
453 |
+
msgid "Context"
|
454 |
+
msgstr "Kontekst"
|
455 |
+
|
456 |
+
#: ../tpl/admin-fscheck.tpl.php:8
|
457 |
+
msgid "File check"
|
458 |
+
msgstr "Sprawdzenie plików"
|
459 |
+
|
460 |
+
#: ../lib/loco-admin.php:313
|
461 |
+
#, php-format
|
462 |
+
msgid "PO file used as template. This will be renamed to %s on first save"
|
463 |
+
msgstr ""
|
464 |
+
"Plik PO użyty jako szablon. Nazwa zostanie zmieniona na % przy pierwszym "
|
465 |
+
"zapisie"
|
466 |
+
|
467 |
+
#: ../lib/loco-admin.php:337
|
468 |
+
msgid ""
|
469 |
+
"File cannot be created automatically. Fix the file permissions or use "
|
470 |
+
"Download instead of Save"
|
471 |
+
msgstr ""
|
472 |
+
"Plik nie może być utworzony automatycznie. Napraw uprawnienia albo użyj "
|
473 |
+
"Pobierz zamiast Zapisz"
|
474 |
+
|
475 |
+
#: ../lib/loco-admin.php:346 ../lib/loco-admin.php:355
|
476 |
+
#, php-format
|
477 |
+
msgid "%s file is empty"
|
478 |
+
msgstr "Plik %s jest pusty"
|
479 |
+
|
480 |
+
#: ../lib/loco-admin.php:347 ../lib/loco-admin.php:362
|
481 |
+
msgid "Run Sync to update from source code"
|
482 |
+
msgstr "Uruchom synchronizację aby zaktualizować z kodu źródłowego"
|
483 |
+
|
484 |
+
#: ../lib/loco-admin.php:351
|
485 |
+
msgid "No strings could be extracted from source code"
|
486 |
+
msgstr "Nie można wyciągnąć żadnych linii z kodu źródłowego"
|
487 |
+
|
488 |
+
#: ../lib/loco-admin.php:358
|
489 |
+
#, php-format
|
490 |
+
msgid "Run Sync to update from %s"
|
491 |
+
msgstr "Uruchom synchronizację aby zaktualizować z %s"
|
492 |
+
|
493 |
+
#: ../lib/loco-admin.php:377
|
494 |
+
msgid "Source code has been modified, run Sync to update POT"
|
495 |
+
msgstr ""
|
496 |
+
"Kod źródłowy został zaktualizowany, uruchom synchronizację aby zaktualizować "
|
497 |
+
"plik POT"
|
498 |
+
|
499 |
+
#: ../lib/loco-admin.php:381
|
500 |
+
msgid "POT has been modified since PO file was saved, run Sync to update"
|
501 |
+
msgstr ""
|
502 |
+
"Plik POT został zmieniony od czasu zapisu pliku PO, uruchom synchronizację "
|
503 |
+
"aby zaktualizować"
|
504 |
+
|
505 |
+
#: ../lib/loco-admin.php:468
|
506 |
+
msgid "Bad file path"
|
507 |
+
msgstr "Błędna ścieżka pliku"
|
508 |
+
|
509 |
+
#: ../lib/loco-admin.php:692
|
510 |
+
#, php-format
|
511 |
+
msgid "Empty or invalid %s file"
|
512 |
+
msgstr "Pusty lub błędny plik %s"
|
513 |
+
|
514 |
+
#: ../lib/loco-admin.php:696
|
515 |
+
#, php-format
|
516 |
+
msgid "%s file has no header"
|
517 |
+
msgstr "Plik %s nie ma nagłówka"
|
518 |
+
|
519 |
+
#: ../lib/loco-admin.php:828
|
520 |
+
msgctxt "Add button"
|
521 |
+
msgid "New template"
|
522 |
+
msgstr "Nowy szablon"
|
523 |
+
|
524 |
+
#: ../lib/loco-admin.php:847
|
525 |
+
msgctxt "Add button"
|
526 |
+
msgid "New language"
|
527 |
+
msgstr "Nowy język"
|
528 |
+
|
529 |
+
#: ../lib/loco-admin.php:886
|
530 |
+
#, php-format
|
531 |
+
msgid "%s%% translated"
|
532 |
+
msgstr "%s%% przetłumaczono"
|
533 |
+
|
534 |
+
#: ../lib/loco-admin.php:886
|
535 |
+
#, php-format
|
536 |
+
msgid "1 string"
|
537 |
+
msgid_plural "%s strings"
|
538 |
+
msgstr[0] "1 linia"
|
539 |
+
msgstr[1] "%s linie"
|
540 |
+
msgstr[2] "%s linii"
|
541 |
+
|
542 |
+
#: ../lib/loco-admin.php:892
|
543 |
+
#, php-format
|
544 |
+
msgid "%s untranslated"
|
545 |
+
msgstr "%s nie przetłumaczone"
|
546 |
+
|
547 |
+
#: ../lib/loco-admin.php:977 ../tpl/admin-nav.tpl.php:21
|
548 |
+
msgid "Loco, Translation Management"
|
549 |
+
msgstr "Loco, Menadżer Tłumaczeń"
|
550 |
+
|
551 |
+
#: ../lib/loco-admin.php:978 ../lib/loco-admin.php:1009
|
552 |
+
msgid "Manage translations"
|
553 |
+
msgstr "Zarządzaj tłumaczeniami"
|
554 |
+
|
555 |
+
#: ../lib/loco-admin.php:979
|
556 |
+
msgid "Translation options"
|
557 |
+
msgstr "Opcje tłumaczeń"
|
558 |
+
|
559 |
+
#: ../lib/loco-admin.php:986
|
560 |
+
msgid "Loco Translate"
|
561 |
+
msgstr "Loco Translate"
|
562 |
+
|
563 |
+
#: ../lib/loco-admin.php:1010 ../tpl/admin-fscheck.tpl.php:7 ../tpl/admin-opts.
|
564 |
+
#: tpl.php:7 ../tpl/admin-poedit.tpl.php:8 ../tpl/admin-poinit.tpl.php:8 ..
|
565 |
+
#: tpl/admin-root.tpl.php:7
|
566 |
+
msgid "Settings"
|
567 |
+
msgstr "Ustawienia"
|
568 |
+
|
569 |
+
#: ../pub/js/lang/dummy.php:52
|
570 |
+
msgid "Translation"
|
571 |
+
msgstr "Tłumaczenie"
|
572 |
+
|
573 |
+
#: ../tpl/admin-fscheck.tpl.php:6 ../tpl/admin-opts.tpl.php:6 ../tpl/admin-poedit.
|
574 |
+
#: tpl.php:6 ../tpl/admin-poinit.tpl.php:6 ../tpl/admin-root.tpl.php:6
|
575 |
+
msgid "Packages"
|
576 |
+
msgstr "Paczki"
|
577 |
+
|
578 |
+
#. Translators: Bold text label in admin error messages
|
579 |
+
#: ../lib/loco-admin.php:15
|
580 |
+
msgctxt "Message label"
|
581 |
+
msgid "Error"
|
582 |
+
msgstr "Błąd"
|
583 |
+
|
584 |
+
#: ../lib/loco-admin.php:24
|
585 |
+
msgctxt "Message label"
|
586 |
+
msgid "Warning"
|
587 |
+
msgstr "Ostrzeżenie"
|
588 |
+
|
589 |
+
#: ../lib/loco-admin.php:33
|
590 |
+
msgctxt "Message label"
|
591 |
+
msgid "OK"
|
592 |
+
msgstr "OK"
|
593 |
+
|
594 |
+
#: ../lib/loco-admin.php:42
|
595 |
+
msgid "Permission denied"
|
596 |
+
msgstr "Odmowa dostępu"
|
597 |
+
|
598 |
+
#: ../lib/loco-admin.php:58
|
599 |
+
msgid "Settings saved"
|
600 |
+
msgstr "Ustawienia zapisane"
|
601 |
+
|
602 |
+
#: ../lib/loco-admin.php:133
|
603 |
+
msgid "New PO file"
|
604 |
+
msgstr "Nowy plik PO"
|
605 |
+
|
606 |
+
#: ../lib/loco-admin.php:240
|
607 |
+
msgid "You must specify a valid locale for a new PO file"
|
608 |
+
msgstr "Musisz określić właściwy region dla nowego pliku PO"
|
609 |
+
|
610 |
+
#: ../lib/loco-admin.php:265 ../lib/loco-admin.php:367
|
611 |
+
msgid "No translatable strings found"
|
612 |
+
msgstr "Brak dostępnych lini do tłumaczenia"
|
613 |
+
|
614 |
+
#: ../lib/loco-admin.php:265
|
615 |
+
msgid "Cannot create a PO file."
|
616 |
+
msgstr "Nie można utworzyć pliku PO."
|
617 |
+
|
618 |
+
#: ../lib/loco-admin.php:272
|
619 |
+
#, php-format
|
620 |
+
msgid "PO file already exists with locale %s"
|
621 |
+
msgstr "Plik PO już istnieje z regionu %s"
|
lib/build/gettext-compiled.php
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
<?php
|
2 |
/**
|
3 |
* Compiled source built from Loco core. Do not edit!
|
4 |
-
* Tue,
|
5 |
*/
|
6 |
-
class LocoArray implements Iterator, Countable { private $i; private $length; private $keys; private $vals; private $index; public function __construct( array $data = array() ){ $this->keys = array_keys( $data ); $this->vals = array_values( $data ); $this->index = array_flip( array_map( 'strtolower', $this->keys ) ); $this->length = count( $this->keys ); $this->rewind(); } public function add( $key, $val ){ $k = strtolower($key); if( isset($this->index[$k]) ){ $this->keys[ $this->index[$k] ] = $key; $this->vals[ $this->index[$k] ] = $val; } else { $this->index[$k] = $this->length++; $this->keys[] = $key; $this->vals[] = $val; } return $this; } public function to_array(){ return array_combine( $this->keys, $this->vals ); } function __toString(){ $pairs = array(); foreach( $this->keys as $i => $key ){ $pairs[] = trim($key).': '.$this->vals[$i]; } return implode("\n", $pairs ); } public function count(){ return $this->length; } public function trimmed( $prop ){ return trim( $this->__get($prop) ); } public function has( $key ){ return isset( $this->index[ strtolower($key) ] ); } public function __get( $key ){ $key = strtolower( $key ); return isset($this->index[$key]) ? $this->vals[ $this->index[$key] ] : null; } public function rewind(){ $this->i = reset( $this->index ); } public function key(){ return is_int($this->i) ? $this->keys[$this->i] : null; } public function current(){ return is_int($this->i) ? $this->vals[$this->i] : null; } public function valid(){ return is_int($this->i); } public function next(){ $this->i = next( $this->index ); } } function loco_sniff_printf( $str ){ return (bool) preg_match('/%(?:\d\$)?(?:\+|-)?[ 0]?-?\d*(?:\.\d+)?[bcdeEfFgGosuxX]/', $str ); } define( 'LOCO_FLAG_OK', 0 ); define( 'LOCO_FLAG_ERROR', 1 ); define( 'LOCO_FLAG_REVIEW', 2 ); define( 'LOCO_FLAG_PENDING', 3 ); define( 'LOCO_FLAG_FUZZY', 4 ); function loco_flags(){ static $flags = array ( LOCO_FLAG_OK => 'Translated', LOCO_FLAG_ERROR => 'Incorrect', LOCO_FLAG_REVIEW => 'Needs review', LOCO_FLAG_PENDING => 'Pending sign-off', LOCO_FLAG_FUZZY => 'Fuzzy', ); return $flags; } function loco_flag( $f ){ if( -1 === $f ){ return 'Untranslated'; } $flags = loco_flags(); if( ! isset($flags[$f]) ){ throw new Exception('Invalid LOCO_FLAG_ constant ', var_export($f,1) ); } return $flags[$f]; } function loco_po_flags(){ static $map = array ( LOCO_FLAG_FUZZY => '#, fuzzy', ); return $map; } function loco_parse_reference_id( $refs, &$_id ){ if( false === ( $n = strpos($refs,'loco:') ) ){ $_id = ''; return $refs; } $_id = substr($refs, $n+5, 24 ); $refs = substr_replace( $refs, '', $n, 29 ); return trim( $refs ); } function loco_ensure_utf8( $str, $enc = false, $prefix_bom = false ){ if( false === $enc ){ $m = substr( $str, 0, 3 ); if( "\xEF\xBB\xBF" === $m ){ $str = substr( $str, 3 ); } else if( "\xFF" === $m{0} && "\xFE" === $m{1} ){ $str = substr( $str, 2 ); $enc = 'UTF-16LE'; } else if( "\xFE" === $m{0} && "\xFF" === $m{1} ){ $str = substr( $str, 2 ); $enc = 'UTF-16BE'; } else { $enc = mb_detect_encoding( $str, array('ASCII','UTF-8','Windows-1252','ISO-8859-1'), false ); if( ! $enc ){ throw new Exception('Unknown character encoding'); } } } else if( ! strcasecmp('ISO-8859-1',$enc) || ! strcasecmp('CP-1252', $enc ) ){ $enc = 'Windows-1252'; } else if( ! strcasecmp('UTF8', $enc) ){ $enc = ''; } if( $enc && $enc !== 'ASCII' && $enc !== 'UTF-8' ){ $str = iconv( $enc, 'UTF-8//TRANSLIT', $str ); if( ! $str ){ throw new Exception('Failed to ensure UTF-8 from '.$enc); } } if( $prefix_bom ){ $str = "\xEF\xBB\xBF".$str; } return $str; } function loco_parse_po( $src ){ $src = loco_ensure_utf8( $src ); $i = -1; $key = ''; $entries = array(); $template = array( '#' => array(), 'id' => array(), 'str' => array(), 'ctxt' => array() ); foreach( preg_split('/[\r\n]+/', $src) as $line ){ while( $line = trim($line) ){ $c = $line{0}; if( '"' === $c ){ if( $key && isset($entry) ){ $entry[$key][$idx][] = loco_po_unquote( $line ); } } else if( '#' === $c ){ if( isset($entry['i']) ){ unset( $entry ); $entry = $template; } $f = empty($line{1}) ? ' ' : $line{1}; $entry['#'][$f][] = trim( substr( $line, 1+strlen($f) ), "/ \n\r\t" ); } else if( preg_match('/^msg(id|str|ctxt|id_plural)(?:\[(\d+)\])?[ \t]+/', $line, $r ) ){ $key = $r[1]; $idx = isset($r[2]) ? (int) $r[2] : 0; if( 'str' === $key ){ if( ! isset($entry['i']) ){ $entry['i'] = ++$i; $entries[$i] = &$entry; } } else if( ! isset($entry) || isset($entry['i']) ){ unset( $entry ); $entry = $template; } $line = substr( $line, strlen($r[0]) ); continue; } continue 2; } } unset( $entry ); $assets = array(); foreach( $entries as $i => $entry ){ if( empty($entry['id']) ){ continue; } if( empty($entry['str']) ){ $entry['str'] = array( array('') ); } $asset = array ( 'id' => '', 'source' => implode('',$entry['id'][0]), 'target' => implode('',$entry['str'][0]), ); $parse_printf = true; if( isset($entry['ctxt'][0]) ){ $asset['context'] = implode('',$entry['ctxt'][0]); } if( isset($entry['#'][' ']) ){ $asset['comment'] = implode("\n", $entry['#'][' '] ); } if( isset($entry['#']['.']) ){ $asset['notes'] = implode("\n", $entry['#']['.'] ); } if( isset($entry['#'][':']) ){ if( $refs = implode( "\n", $entry['#'][':'] ) ) { if( $refs = loco_parse_reference_id( $refs, $_id ) ){ $asset['refs'] = $refs; } if( $_id ){ $asset['_id'] = $_id; } } } if( isset($entry['#'][',']) ){ foreach( $entry['#'][','] as $flag ){ if( preg_match('/((?:no-)?\w+)-format/', $flag, $r ) ){ $parse_printf = false; if( 'no-' === substr($r[1],0,3) ){ $asset['format'] = false; } else { $asset['format'] = $r[1]; } } else if( $flag = loco_po_parse_flag($flag) ){ $asset['flag'] = $flag; break; } } } if( $parse_printf ){ if( $asset['source'] && loco_sniff_printf( $asset['source'] ) ){ $asset['format'] = 'c'; $parse_printf = false; } } $pidx = count($assets); $assets[] = $asset; if( isset($entry['id_plural']) || isset($entry['str'][1]) ){ $idx = 0; $num = max( 2, count($entry['str']) ); while( ++$idx < $num ){ $plural = array ( 'id' => '', 'source' => '', 'target' => isset($entry['str'][$idx]) ? implode('',$entry['str'][$idx]) : '', 'plural' => $idx, 'parent' => $pidx, ); if( 1 === $idx ){ $plural['source'] = isset($entry['id_plural'][0]) ? implode('',$entry['id_plural'][0]) : ''; } if( $parse_printf ){ if( $plural['source'] && loco_sniff_printf( $plural['source'] ) ){ $assets[$pidx]['format'] = 'c'; $parse_printf = false; } } $assets[] = $plural; } } } if( $assets && '' === $assets[0]['source'] ){ $headers = loco_parse_po_headers( $assets[0]['target'] ); $indexed = $headers->__get('X-Loco-Lookup'); if( 'id' === $indexed || 'name' === $indexed ){ foreach( $assets as $i => $asset ){ if( isset($asset['notes']) ){ $notes = $texts = array(); foreach( explode("\n",$asset['notes']) as $line ){ 0 === strpos($line,'Source text: ') ? $texts[] = substr($line,13) : $notes[] = $line; } $assets[$i]['notes'] = implode("\n",$notes); $assets[$i]['id'] = $asset['source']; $assets[$i]['source'] = implode("\n",$texts); } } } } return $assets; } function loco_po_parse_flag( $text, $flag = 0 ){ $map = loco_po_flags(); foreach( explode(',',$text) as $needle ){ if( $needle = trim($needle) ){ foreach( $map as $loco_flag => $haystack ){ if( false !== stripos($haystack, $needle) ){ $flag |= $loco_flag; break; } } } } return $flag; } function loco_po_unquote( $str ){ return substr( stripcslashes($str), 1, -1 ); } function loco_parse_po_headers( $str ){ $headers = new LocoArray( array() ); foreach( explode("\n",$str) as $line ){ $i = strpos($line,':') and $key = trim( substr($line,0,$i) ) and $headers->add( $key, trim( substr($line,++$i) ) ); } return $headers; } class LocoMoParser { private $bin; private $be; private $n; private $o; private $t; private $v; public function __construct( $bin ){ $this->bin = $bin; } public function getAt( $idx ){ $offset = $this->targetOffset(); $offset += ( $idx * 8 ); $len = $this->integerAt( $offset ); $idx = $this->integerAt( $offset + 4 ); $txt = $this->bytes( $idx, $len ); if( false === strpos( $txt, "\0") ){ return $txt; } return explode( "\0", $txt ); } public function parse(){ $sourceOffset = $this->sourceOffset(); $targetOffset = $this->targetOffset(); $r = array(); $p = array(); $i = 0; $offset = $sourceOffset; while( $offset < $targetOffset ){ $r[$i] = array( 'id' => '', 'source' => '', 'target' => '' ); $len = $this->integerAt( $offset ); $idx = $this->integerAt( $offset + 4 ); $src = $this->bytes( $idx, $len ); $eot = strpos( $src, "\x04" ); if( false !== $eot ){ $r[$i]['context'] = $this->decodeStr( substr($src, 0, $eot ) ); $src = substr( $src, $eot+1 ); } $nul = strpos( $src, "\0" ); if( false !== $nul ){ $p[$i][1] = array( 'id' => '', 'source' => substr($src, $nul+1 ), 'target' => '', 'parent' => $i, 'plural' => 1 ); $src = substr( $src, 0, $nul ); } $r[$i++]['source'] = $this->decodeStr($src); $offset += 8; } $t = $i; $offset = $targetOffset; for( $i = 0; $i < $t; $i++ ){ $len = $this->integerAt( $offset ); $idx = $this->integerAt( $offset + 4 ); $txt = $this->bytes( $idx, $len ); if( false !== strpos( $txt, "\0" ) ){ $arr = explode( "\0", $txt ); $txt = array_shift( $arr ); if( isset($p[$i][1]) ){ foreach( $arr as $_i => $plural_txt ){ $plural_idx = $_i + 1; $p[$i][$plural_idx]['target'] = $this->decodeStr($plural_txt); } } else if( '' === implode('',$arr) ){ } else { throw new Exception('plural has no corresponding msgid_plural at '.$i); } } $r[$i]['target'] = $this->decodeStr($txt); $offset += 8; } foreach( $p as $parent_id => $plurals ){ foreach( $plurals as $plural_idx => $msg ){ if( 1 < $plural_idx ){ $msg['source'] = $plurals[1]['source'].' (plural '.$plural_idx.')'; } $msg['parent'] = $parent_id; $msg['plural'] = $plural_idx; $r[] = $msg; } } return $r; } public function isBigendian(){ while( is_null($this->be) ){ $str = $this->words( 0, 2 ); $arr = unpack('V', $str); if( 0x950412de === $arr[1] ){ $this->be = false; break; } if( 0xde120495 === $arr[1] ){ $this->be = true; break; } throw new Exception('Invalid MO format'); } return $this->be; } public function version(){ if( is_null($this->v) ){ $this->v = $this->integerWord(1); } return $this->v; } public function count(){ if( is_null($this->n) ){ $this->n = $this->integerWord(2); } return $this->n; } public function sourceOffset(){ if( is_null($this->o) ){ $this->o = $this->integerWord(3); } return $this->o; } public function targetOffset(){ if( is_null($this->t) ){ $this->t = $this->integerWord(4); } return $this->t; } public function getHashTable(){ $s = $this->integerWord(5); $h = $this->integerWord(6); return $this->bytes( $h, $s * 4 ); } private function bytes( $offset, $length ){ return substr( $this->bin, $offset, $length ); } private function words( $offset, $length ){ return $this->bytes( $offset * 4, $length * 4 ); } private function integerWord( $offset ){ return $this->integerAt( $offset * 4 ); } private function integerAt( $offset ){ $str = $this->bytes( $offset, 4 ); $fmt = $this->isBigendian() ? 'N' : 'V'; $arr = unpack( $fmt, $str ); if( ! isset($arr[1]) || ! is_int($arr[1]) ){ throw new Exception('Failed to read 32 bit integer at byte '.$offset); } return $arr[1]; } private function decodeStr( $str ){ $enc = mb_detect_encoding( $str, array('ASCII','UTF-8','ISO-8859-1'), false ); if( $enc && $enc !== 'ASCII' && $enc !== 'UTF-8' ){ $str = iconv( $enc, 'UTF-8', $str ); } return $str; } } function loco_parse_mo( $src ){ $mo = new LocoMoParser($src); return $mo->parse(); } final class PHPTokens implements Iterator { private $tokens; private $i; private $skip_tokens = array(); private $skip_strings = array(); private $literal_tokens = array(); public function __construct( array $tokens ){ $this->tokens = $tokens; $this->rewind(); } public function literal(){ foreach( func_get_args() as $t ){ $this->literal_tokens[ $t ] = 1; } return $this; } public function ignore(){ foreach( func_get_args() as $t ){ if( is_int($t) ){ $this->skip_tokens[$t] = true; } else { $this->skip_strings[$t] = true; } } return $this; } public function export(){ $arr = array(); foreach( $this as $tok ){ $arr[] = $tok; } return $arr; } public function advance(){ $this->next(); return $this->current(); } public function pop(){ $tok = array_pop( $this->tokens ); $this->rewind(); return $tok; } public function shift(){ $tok = array_shift( $this->tokens); $this->rewind(); return $tok; } public function rewind(){ $this->i = ( false === reset($this->tokens) ? null : key($this->tokens) ); } public function valid(){ while( isset($this->i) ){ $tok = $this->tokens[$this->i]; if( is_array($tok) ){ if( isset($this->skip_tokens[$tok[0]]) ){ $this->next(); } else { return true; } } else if( isset($this->skip_strings[$tok]) ){ $this->next(); } else { return true; } } return false; } public function key(){ return $this->i; } public function next(){ $this->i = ( false === next($this->tokens) ? null : key($this->tokens) ); } public function current(){ if( ! $this->valid() ){ return false; } $tok = $this->tokens[$this->i]; if( is_array($tok) && isset($this->literal_tokens[$tok[0]]) ){ return $tok[1]; } return $tok; } public function __toString(){ $s = ''; foreach( $this as $token ){ $s .= is_array($token) ? $token[1] : $token; } return $s; } } function loco_parse_comment($comment){ if( '*' === $comment{1} ){ $lines = array(); foreach( explode("\n", $comment) as $line ){ $line and $lines[] = trim($line,"/* \r\t"); } $comment = implode("\n", $lines); } return trim( $comment,"/ \n\r\t" ); } function decapse_string( $s ){ if( empty($s) ){ return ''; } $q = $s{0}; switch( $q ){ case "'": case '"': $s = substr( $s, 1, -1 ); if( '"' === $q ){ return stripcslashes($s); } return str_replace( array( '\\'.$q, '\\\\' ), array( $q, '\\' ), $s ); default: return $s; } } function loco_extract_php( array $tokens, $fileref = '' ){ $extractor = new LocoPHPExtractor; return $extractor->extract( $tokens, $fileref ); } final class LocoPHPExtractor { private static $rules = array ( '_' => 's', 'gettext' => 's', 'dgettext' => '_s', 'ngettext' => 'sp', 'dngettext' => '_sp', '__' => 's', '_e' => 's', '_c' => 's', '_n' => 'sp', '_n_noop' => 'sp', '_nc' => 'sp', '__ngettext' => 'sp', '__ngettext_noop' => 'sp', '_x' => 'sc', '_ex' => 'sc', '_nx' => 'sp_c', '_nx_noop' => 'spc', '_n_js' => 'sp', '_nx_js' => 'spc', 'esc_attr__' => 's', 'esc_html__' => 's', 'esc_attr_e' => 's', 'esc_html_e' => 's', 'esc_attr_x' => 'sc', 'esc_html_x' => 'sc', 'comments_number_link' => '_sp', 't' => 's', 'st' => 's', 'trans' => 's', 'transChoice' => 'sp', ); private $exp = array(); private $reg = array(); public function extract( array $tokens, $fileref = '' ){ $tokens = new PHPTokens( $tokens ); $tokens->ignore( T_WHITESPACE ); $comment = ''; foreach( $tokens as $tok ){ if( isset($args) ){ if( ')' === $tok ){ isset($arg) and $arg and $args[] = $arg; $this->push( $rule, $args, $comment, $ref ); unset($args,$arg); $comment = ''; } else if( ',' === $tok ){ isset($arg) and $arg and $args[] = $arg; unset($arg); } else if( isset($arg) ){ $arg[] = $tok; } else { $arg = array( $tok ); } } else if( is_array($tok) ){ list($t,$s) = $tok; if( T_COMMENT === $t || T_DOC_COMMENT === $t ){ $comment = $s; } else if( T_STRING === $t && isset(self::$rules[$s]) && '(' === $tokens->advance() ){ $rule = self::$rules[$s]; $args = array(); $ref = $fileref ? $fileref.':'.$tok[2]: ''; } else if( $comment && false === stripos($comment, 'translators') ){ $comment = ''; } } } return $this->exp; } private function push( $rule, array $args, $comment = '', $ref = '' ){ $s = strpos( $rule, 's'); $p = strpos( $rule, 'p'); $c = strpos( $rule, 'c'); foreach( $args as $i => $tokens ){ if( 1 === count($tokens) && is_array($tokens[0]) && T_CONSTANT_ENCAPSED_STRING === $tokens[0][0] ){ $args[$i] = decapse_string( $tokens[0][1] ); } else { $args[$i] = null; } } $key = $msgid = $args[$s]; if( ! $msgid ){ return null; } $entry = array ( 'id' => '', 'source' => $msgid, 'target' => '', ); if( $c && isset($args[$c]) ){ $entry['context'] = $args[$c]; $key .= "\0". $args[$c]; } if( $ref ){ $entry['refs'] = $ref; } $parse_printf = true; if( $comment ){ if( preg_match('/xgettext:\s*((?:no-)?\w+)-format/', $comment, $r ) ){ if( 'no-' === substr($r[1],0,3) ){ $entry['format'] = false; } else { $entry['format'] = $r[1]; } $comment = str_replace( $r[0], '', $comment ); $parse_printf = false; } $entry['notes'] = loco_parse_comment($comment); } if( $parse_printf && loco_sniff_printf( $msgid ) ){ $entry['format'] = 'php'; $parse_printf = false; } if( isset($this->reg[$key]) ){ $index = $this->reg[$key]; $a = array(); isset($this->exp[$index]['refs']) and $a[] = $this->exp[$index]['refs']; isset($entry['refs']) and $a[] = $entry['refs']; $a && $this->exp[$index]['refs'] = implode(" ", $a ); $a = array(); isset($this->exp[$index]['notes']) and $a[] = $this->exp[$index]['notes']; isset($entry['notes']) and $a[] = $entry['notes']; $a && $this->exp[$index]['notes'] = implode("\n", $a ); } else { $index = count($this->exp); $this->reg[$key] = $index; $this->exp[] = $entry; } if( $p && isset($args[$p]) ){ $msgid_plural = $args[$p]; $entry = array ( 'id' => '', 'source' => $msgid_plural, 'target' => '', 'plural' => 1, 'parent' => $index, ); if( $parse_printf && loco_sniff_printf( $msgid_plural ) ){ $this->exp[$index]['format'] = 'php'; } $key = $msgid_plural."\0\0"; if( isset($this->reg[$key]) ){ $plural_index = $this->reg[$key]; $this->exp[$plural_index] = $entry; } else { $plural_index = count($this->exp); $this->reg[$key] = $plural_index; $this->exp[] = $entry; } } return $index; } public function get_xgettext( $input = '-' ){ $cmd = defined('WHICH_XGETTEXT') ? WHICH_XGETTEXT : 'xgettext'; $cmd.= ' -LPHP -c -o-'; if( $k = $this->get_xgettext_keywords() ){ $cmd.= ' -k'.implode(' -k', $k ); } return $cmd.' '.$input; } public function get_xgettext_keywords(){ $ks = array(); foreach( self::$rules as $word => $rule ){ $s = strpos( $rule, 's'); $k = $word.':'.++$s; if( false !== $p = strpos( $rule, 'p') ){ $k.= ','.++$p; } if( false !== $p = strpos( $rule, 'c') ){ $k.= ','.++$p.'c'; } $ks[] = $k; } return $ks; } } function loco_relative_path( $source_path, $target_path ){ $rel = ''; $common = false; $src = preg_split('!/+!', $source_path, -1, PREG_SPLIT_NO_EMPTY ); $dst = preg_split('!/+!', $target_path, -1, PREG_SPLIT_NO_EMPTY ); while( $src && $dst ){ if( current($src) !== current($dst) ){ break; } $common = true; array_shift($src); array_shift($dst); } if( ! $common ){ return $target_path; } if( $src ){ $up = array_fill( 0, count($src), '..' ); $rel = implode('/', $up ); } if( $dst ){ $rel && $rel .= '/'; $rel .= implode('/', $dst ); } return $rel; } class LocoMo { private $bin; private $msgs; private $head; private $hash; public function __construct( array $export, LocoArray $head = null ){ if( ! $head ){ $head = new LocoArray( array( 'Project-Id-Version' => 'Loco', 'Language' => 'English', 'Plural-Forms' => 'nplurals=2; plural=(n!=1);', 'MIME-Version' => '1.0', 'Content-Type' => 'text/plain; charset=UTF-8', 'Content-Transfer-Encoding' => '8bit', 'X-Generator' => 'Loco '.PLUG_HTTP_ADDR, ) ); } $this->head = $head; $this->msgs = $export; $this->bin = ''; } public function enableHash(){ return $this->hash = new LocoMoTable; } public function setHeader( $key, $val ){ $this->head->add($key, $val); return $this; } public function setProject( LocoProject $Proj ){ return $this ->setHeader( 'Project-Id-Version', $Proj->proj_name ) ->setHeader($key, $val) ; } public function setLocale( LocoProjectLocale $Loc ){ return $this ->setHeader( 'Language', $Loc->label ) ->setHeader( 'Plural-Forms', 'nplurals='.$Loc->nplurals.'; plural='.$Loc->pluraleq.';' ) ; } public function count(){ return count($this->msgs); } public function compile(){ $table = array(''); $sources = array(''); $targets = array( $this->head->__toString() ); foreach( $this->msgs as $r ){ $msgid = $r['key']; if( isset($r['context']) && $r['context'] ){ $msgid or $msgid = "(".$r['context'].')'; $msgid = $r['context']."\x04".$msgid; } if( ! $msgid ){ continue; } $msgstr = $r['translation']; if( ! $msgstr ){ continue; } $table[] = $msgid; if( isset($r['plurals']) ){ foreach( $r['plurals'] as $i => $p ){ if( $i === 0 ){ $msgid .= "\0".$p['key']; } $msgstr .= "\0".$p['translation']; } } $sources[] = $msgid; $targets[] = $msgstr; } asort( $sources, SORT_STRING ); $this->bin = ''; $this->writeInteger( 0x950412de ); $this->writeInteger( 0 ); $n = count($sources); $this->writeInteger( $n ); $offset = 28; $this->writeInteger( $offset ); $offset += $n * 8; $this->writeInteger( $offset ); if( $this->hash ){ sort( $table, SORT_STRING ); $this->hash->compile( $table ); $s = $this->hash->count(); } else { $s = 0; } $this->writeInteger( $s ); $offset += $n * 8; $this->writeInteger( $offset ); if( $s ){ $offset += $s * 4; } $source = ''; foreach( $sources as $i => $str ){ $source .= $str."\0"; $this->writeInteger( $strlen = strlen($str) ); $this->writeInteger( $offset ); $offset += $strlen + 1; } $target = ''; foreach( array_keys($sources) as $i ){ $str = $targets[$i]; $target .= $str."\0"; $this->writeInteger( $strlen = strlen($str) ); $this->writeInteger( $offset ); $offset += $strlen + 1; } if( $this->hash ){ $this->bin .= $this->hash->__toString(); } $this->bin .= $source; $this->bin .= $target; return $this->bin; } private function writeInteger( $num ){ $this->bin .= pack( 'V', $num ); return $this; } } class LocoMoTable { private $size = 0; private $bin = ''; private $map; public function __construct( $data = null ){ if( is_array($data) ){ $this->compile( $data ); } else if( $data ){ $this->parse( $data ); } } public function count(){ if( ! isset($this->size) ){ if( $this->bin ){ $this->size = (int) ( strlen( $this->bin ) / 4 ); } else if( is_array($this->map) ){ $this->size = count($this->map); } else { return 0; } if( ! self::is_prime($this->size) || $this->size < 3 ){ throw new Exception('Size expected to be prime number above 2, got '.$this->size); } } return $this->size; } public function bytes(){ return $this->count() * 4; } public function __toString(){ return $this->bin; } public function export(){ if( ! is_array($this->map) ){ $this->parse( $this->bin ); } return $this->map; } private function reset( $length ){ $this->size = max( 3, self::next_prime ( $length * 4 / 3 ) ); $this->bin = null; $this->map = array(); return $this->size; } public function compile( array $msgids ){ $hash_tab_size = $this->reset( count($msgids) ); $packed = array_fill( 0, $hash_tab_size, "\0\0\0\0" ); $j = 0; foreach( $msgids as $msgid ){ $hash_val = self::hashpjw( $msgid ); $idx = $hash_val % $hash_tab_size; if( array_key_exists($idx, $this->map) ){ $incr = 1 + ( $hash_val % ( $hash_tab_size - 2 ) ); do { $idx += $incr; if( $hash_val === $idx ){ throw new Exception('Unable to find empty slot in hash table'); } $idx %= $hash_tab_size; } while( array_key_exists($idx, $this->map ) ); } $this->map[$idx] = $j; $packed[$idx] = pack('V', ++$j ); } return $this->bin = implode('',$packed); } public function lookup( $msgid, array $msgids ){ $hash_val = self::hashpjw( $msgid ); $idx = $hash_val % $this->size; $incr = 1 + ( $hash_val % ( $this->size - 2 ) ); while( true ){ if( ! array_key_exists($idx, $this->map) ){ break; } $j = $this->map[$idx]; if( isset($msgids[$j]) && $msgid === $msgids[$j] ){ return $j; } $idx += $incr; if( $idx === $hash_val ){ break; } $idx %= $this->size; } return -1; } public function parse( $bin ){ $this->bin = (string) $bin; $this->size = null; $hash_tab_size = $this->count(); $this->map = array(); $idx = -1; $byte = 0; while( ++$idx < $hash_tab_size ){ $word = substr( $this->bin, $byte, 4 ); if( "\0\0\0\0" !== $word ){ list(,$j) = unpack('V', $word ); $this->map[$idx] = $j - 1; } $byte += 4; } return $this->map; } public static function hashpjw( $str ){ $i = -1; $hval = 0; $len = strlen($str); while( ++$i < $len ){ $ord = ord( $str{$i} ); $hval = ( $hval << 4 ) + $ord; $g = $hval & 0xf0000000; if( $g !== 0 ){ $hval ^= $g >> 24; $hval ^= $g; } } return $hval; } private static function next_prime( $seed ){ $seed |= 1; while ( ! self::is_prime($seed) ){ $seed += 2; } return $seed; } private static function is_prime( $num ) { if ($num === 1 ){ return false; } if( $num === 2 ){ return true; } if( $num % 2 == 0 ) { return false; } for( $i = 3; $i <= ceil(sqrt($num)); $i = $i + 2) { if($num % $i == 0 ){ return false; } } return true; } } function loco_msgfmt( $po, $withhash = false ){ if( ! is_array($po) ){ $po = loco_parse_po( $po ); } $head = null; if( isset($po[0]) && '' === $po[0]['source'] ){ $head = loco_parse_po_headers( $po[0]['target'] ); $po[0] = null; } $export = array(); foreach( $po as $i => $r ){ if( ! $r ){ continue; } $msg = array ( 'key' => $r['source'], 'translation' => $r['target'], ); if( isset($r['parent']) ){ unset( $parent ); $parent = &$export[ $r['parent'] ]; isset($parent['plurals']) or $parent['plurals'] = array(); $parent['plurals'][] = $msg; } else { isset($r['context']) and $msg['context'] = $r['context']; $export[$i] = $msg; } } $mo = new LocoMo( $export, $head ); if( $withhash ){ $mo->enableHash(); } return $mo->compile(); } function loco_po_stats( array $po ){ $t = $n = $f = $u = 0; foreach( $po as $r ){ if( ! isset($r['source']) || '' === $r['source'] ){ continue; } if( isset($r['parent']) && is_int($r['parent']) ){ continue; } $t++; if( '' === $r['target'] ){ $u++; } else if( isset($r['flag']) && LOCO_FLAG_FUZZY === $r['flag'] ){ $f++; } else { $n++; } } $r = $t && $n ? $n / $t : 0; $p = (string) round( $r * 100 ); return compact('t','p','f','u'); }
|
1 |
<?php
|
2 |
/**
|
3 |
* Compiled source built from Loco core. Do not edit!
|
4 |
+
* Tue, 07 Oct 2014 14:14:21 +0100
|
5 |
*/
|
6 |
+
class LocoArray implements Iterator, Countable { private $i; private $length; private $keys; private $vals; private $index; public function __construct( array $data = array() ){ $this->keys = array_keys( $data ); $this->vals = array_values( $data ); $this->index = array_flip( array_map( 'strtolower', $this->keys ) ); $this->length = count( $this->keys ); $this->rewind(); } public function add( $key, $val ){ $k = strtolower($key); if( isset($this->index[$k]) ){ $this->keys[ $this->index[$k] ] = $key; $this->vals[ $this->index[$k] ] = $val; } else { $this->index[$k] = $this->length++; $this->keys[] = $key; $this->vals[] = $val; } return $this; } public function to_array(){ return array_combine( $this->keys, $this->vals ); } function __toString(){ $pairs = array(); foreach( $this->keys as $i => $key ){ $pairs[] = trim($key).': '.$this->vals[$i]; } return implode("\n", $pairs ); } public function count(){ return $this->length; } public function trimmed( $prop ){ return trim( $this->__get($prop) ); } public function has( $key ){ return isset( $this->index[ strtolower($key) ] ); } public function __get( $key ){ $key = strtolower( $key ); return isset($this->index[$key]) ? $this->vals[ $this->index[$key] ] : null; } public function rewind(){ $this->i = reset( $this->index ); } public function key(){ return is_int($this->i) ? $this->keys[$this->i] : null; } public function current(){ return is_int($this->i) ? $this->vals[$this->i] : null; } public function valid(){ return is_int($this->i); } public function next(){ $this->i = next( $this->index ); } } function loco_sniff_printf( $str ){ return (bool) preg_match('/%(?:\d\$)?(?:\+|-)?[ 0]?-?\d*(?:\.\d+)?[bcdeEfFgGosuxX]/', $str ); } define( 'LOCO_FLAG_OK', 0 ); define( 'LOCO_FLAG_ERROR', 1 ); define( 'LOCO_FLAG_REVIEW', 2 ); define( 'LOCO_FLAG_PENDING', 3 ); define( 'LOCO_FLAG_FUZZY', 4 ); function loco_flags(){ static $flags = array ( LOCO_FLAG_OK => 'Translated', LOCO_FLAG_ERROR => 'Incorrect', LOCO_FLAG_REVIEW => 'Needs review', LOCO_FLAG_PENDING => 'Pending approval', LOCO_FLAG_FUZZY => 'Fuzzy', ); return $flags; } function loco_flag( $f ){ if( -1 === $f ){ return 'Untranslated'; } $flags = loco_flags(); if( ! isset($flags[$f]) ){ throw new Exception('Invalid LOCO_FLAG_ constant ', var_export($f,1) ); } return $flags[$f]; } function loco_po_flags(){ static $map = array ( LOCO_FLAG_FUZZY => '#, fuzzy', ); return $map; } function loco_parse_reference_id( $refs, &$_id ){ if( false === ( $n = strpos($refs,'loco:') ) ){ $_id = ''; return $refs; } $_id = substr($refs, $n+5, 24 ); $refs = substr_replace( $refs, '', $n, 29 ); return trim( $refs ); } function loco_ensure_utf8( $str, $enc = false, $prefix_bom = false ){ if( false === $enc ){ $m = substr( $str, 0, 3 ); if( "\xEF\xBB\xBF" === $m ){ $str = substr( $str, 3 ); } else if( "\xFF" === $m{0} && "\xFE" === $m{1} ){ $str = substr( $str, 2 ); $enc = 'UTF-16LE'; } else if( "\xFE" === $m{0} && "\xFF" === $m{1} ){ $str = substr( $str, 2 ); $enc = 'UTF-16BE'; } else { $enc = mb_detect_encoding( $str, array('ASCII','UTF-8','Windows-1252','ISO-8859-1'), false ); if( ! $enc ){ throw new Exception('Unknown character encoding'); } } } else if( ! strcasecmp('ISO-8859-1',$enc) || ! strcasecmp('CP-1252', $enc ) ){ $enc = 'Windows-1252'; } else if( ! strcasecmp('UTF8', $enc) ){ $enc = ''; } if( $enc && $enc !== 'ASCII' && $enc !== 'UTF-8' ){ $str = iconv( $enc, 'UTF-8//TRANSLIT', $str ); if( ! $str ){ throw new Exception('Failed to ensure UTF-8 from '.$enc); } } if( $prefix_bom ){ $str = "\xEF\xBB\xBF".$str; } return $str; } function loco_parse_po( $src ){ $src = loco_ensure_utf8( $src ); $i = -1; $key = ''; $entries = array(); $template = array( '#' => array(), 'id' => array(), 'str' => array(), 'ctxt' => array() ); foreach( preg_split('/[\r\n]+/', $src) as $line ){ while( $line = trim($line) ){ $c = $line{0}; if( '"' === $c ){ if( $key && isset($entry) ){ $entry[$key][$idx][] = loco_po_unquote( $line ); } } else if( '#' === $c ){ if( isset($entry['i']) ){ unset( $entry ); $entry = $template; } $f = empty($line{1}) ? ' ' : $line{1}; $entry['#'][$f][] = trim( substr( $line, 1+strlen($f) ), "/ \n\r\t" ); } else if( preg_match('/^msg(id|str|ctxt|id_plural)(?:\[(\d+)\])?[ \t]+/', $line, $r ) ){ $key = $r[1]; $idx = isset($r[2]) ? (int) $r[2] : 0; if( 'str' === $key ){ if( ! isset($entry['i']) ){ $entry['i'] = ++$i; $entries[$i] = &$entry; } } else if( ! isset($entry) || isset($entry['i']) ){ unset( $entry ); $entry = $template; } $line = substr( $line, strlen($r[0]) ); continue; } continue 2; } } unset( $entry ); $assets = array(); foreach( $entries as $i => $entry ){ if( empty($entry['id']) ){ continue; } if( empty($entry['str']) ){ $entry['str'] = array( array('') ); } $asset = array ( 'id' => '', 'source' => implode('',$entry['id'][0]), 'target' => implode('',$entry['str'][0]), ); $parse_printf = true; if( isset($entry['ctxt'][0]) ){ $asset['context'] = implode('',$entry['ctxt'][0]); } if( isset($entry['#'][' ']) ){ $asset['comment'] = implode("\n", $entry['#'][' '] ); } if( isset($entry['#']['.']) ){ $asset['notes'] = implode("\n", $entry['#']['.'] ); } if( isset($entry['#'][':']) ){ if( $refs = implode( "\n", $entry['#'][':'] ) ) { if( $refs = loco_parse_reference_id( $refs, $_id ) ){ $asset['refs'] = $refs; } if( $_id ){ $asset['_id'] = $_id; } } } if( isset($entry['#'][',']) ){ foreach( $entry['#'][','] as $flag ){ if( preg_match('/((?:no-)?\w+)-format/', $flag, $r ) ){ $parse_printf = false; if( 'no-' === substr($r[1],0,3) ){ $asset['format'] = false; } else { $asset['format'] = $r[1]; } } else if( $flag = loco_po_parse_flag($flag) ){ $asset['flag'] = $flag; break; } } } if( $parse_printf ){ if( $asset['source'] && loco_sniff_printf( $asset['source'] ) ){ $asset['format'] = 'c'; $parse_printf = false; } } $pidx = count($assets); $assets[] = $asset; if( isset($entry['id_plural']) || isset($entry['str'][1]) ){ $idx = 0; $num = max( 2, count($entry['str']) ); while( ++$idx < $num ){ $plural = array ( 'id' => '', 'source' => '', 'target' => isset($entry['str'][$idx]) ? implode('',$entry['str'][$idx]) : '', 'plural' => $idx, 'parent' => $pidx, ); if( 1 === $idx ){ $plural['source'] = isset($entry['id_plural'][0]) ? implode('',$entry['id_plural'][0]) : ''; } if( $parse_printf ){ if( $plural['source'] && loco_sniff_printf( $plural['source'] ) ){ $assets[$pidx]['format'] = 'c'; $parse_printf = false; } } $assets[] = $plural; } } } if( $assets && '' === $assets[0]['source'] ){ $headers = loco_parse_po_headers( $assets[0]['target'] ); $indexed = $headers->__get('X-Loco-Lookup'); if( 'id' === $indexed || 'name' === $indexed ){ foreach( $assets as $i => $asset ){ if( isset($asset['notes']) ){ $notes = $texts = array(); foreach( explode("\n",$asset['notes']) as $line ){ 0 === strpos($line,'Source text: ') ? $texts[] = substr($line,13) : $notes[] = $line; } $assets[$i]['notes'] = implode("\n",$notes); $assets[$i]['id'] = $asset['source']; $assets[$i]['source'] = implode("\n",$texts); } } } } return $assets; } function loco_po_parse_flag( $text, $flag = 0 ){ $map = loco_po_flags(); foreach( explode(',',$text) as $needle ){ if( $needle = trim($needle) ){ foreach( $map as $loco_flag => $haystack ){ if( false !== stripos($haystack, $needle) ){ $flag |= $loco_flag; break; } } } } return $flag; } function loco_po_unquote( $str ){ return substr( stripcslashes($str), 1, -1 ); } function loco_parse_po_headers( $str ){ $headers = new LocoArray( array() ); foreach( explode("\n",$str) as $line ){ $i = strpos($line,':') and $key = trim( substr($line,0,$i) ) and $headers->add( $key, trim( substr($line,++$i) ) ); } return $headers; } class LocoMoParser { private $bin; private $be; private $n; private $o; private $t; private $v; public function __construct( $bin ){ $this->bin = $bin; } public function getAt( $idx ){ $offset = $this->targetOffset(); $offset += ( $idx * 8 ); $len = $this->integerAt( $offset ); $idx = $this->integerAt( $offset + 4 ); $txt = $this->bytes( $idx, $len ); if( false === strpos( $txt, "\0") ){ return $txt; } return explode( "\0", $txt ); } public function parse(){ $sourceOffset = $this->sourceOffset(); $targetOffset = $this->targetOffset(); $r = array(); $p = array(); $i = 0; $offset = $sourceOffset; while( $offset < $targetOffset ){ $r[$i] = array( 'id' => '', 'source' => '', 'target' => '' ); $len = $this->integerAt( $offset ); $idx = $this->integerAt( $offset + 4 ); $src = $this->bytes( $idx, $len ); $eot = strpos( $src, "\x04" ); if( false !== $eot ){ $r[$i]['context'] = $this->decodeStr( substr($src, 0, $eot ) ); $src = substr( $src, $eot+1 ); } $nul = strpos( $src, "\0" ); if( false !== $nul ){ $p[$i][1] = array( 'id' => '', 'source' => substr($src, $nul+1 ), 'target' => '', 'parent' => $i, 'plural' => 1 ); $src = substr( $src, 0, $nul ); } $r[$i++]['source'] = $this->decodeStr($src); $offset += 8; } $t = $i; $offset = $targetOffset; for( $i = 0; $i < $t; $i++ ){ $len = $this->integerAt( $offset ); $idx = $this->integerAt( $offset + 4 ); $txt = $this->bytes( $idx, $len ); if( false !== strpos( $txt, "\0" ) ){ $arr = explode( "\0", $txt ); $txt = array_shift( $arr ); if( isset($p[$i][1]) ){ foreach( $arr as $_i => $plural_txt ){ $plural_idx = $_i + 1; $p[$i][$plural_idx]['target'] = $this->decodeStr($plural_txt); } } else if( '' === implode('',$arr) ){ } else { throw new Exception('plural has no corresponding msgid_plural at '.$i); } } $r[$i]['target'] = $this->decodeStr($txt); $offset += 8; } foreach( $p as $parent_id => $plurals ){ foreach( $plurals as $plural_idx => $msg ){ if( 1 < $plural_idx ){ $msg['source'] = $plurals[1]['source'].' (plural '.$plural_idx.')'; } $msg['parent'] = $parent_id; $msg['plural'] = $plural_idx; $r[] = $msg; } } return $r; } public function isBigendian(){ while( is_null($this->be) ){ $str = $this->words( 0, 2 ); $arr = unpack('V', $str); if( 0x950412de === $arr[1] ){ $this->be = false; break; } if( 0xde120495 === $arr[1] ){ $this->be = true; break; } throw new Exception('Invalid MO format'); } return $this->be; } public function version(){ if( is_null($this->v) ){ $this->v = $this->integerWord(1); } return $this->v; } public function count(){ if( is_null($this->n) ){ $this->n = $this->integerWord(2); } return $this->n; } public function sourceOffset(){ if( is_null($this->o) ){ $this->o = $this->integerWord(3); } return $this->o; } public function targetOffset(){ if( is_null($this->t) ){ $this->t = $this->integerWord(4); } return $this->t; } public function getHashTable(){ $s = $this->integerWord(5); $h = $this->integerWord(6); return $this->bytes( $h, $s * 4 ); } private function bytes( $offset, $length ){ return substr( $this->bin, $offset, $length ); } private function words( $offset, $length ){ return $this->bytes( $offset * 4, $length * 4 ); } private function integerWord( $offset ){ return $this->integerAt( $offset * 4 ); } private function integerAt( $offset ){ $str = $this->bytes( $offset, 4 ); $fmt = $this->isBigendian() ? 'N' : 'V'; $arr = unpack( $fmt, $str ); if( ! isset($arr[1]) || ! is_int($arr[1]) ){ throw new Exception('Failed to read 32 bit integer at byte '.$offset); } return $arr[1]; } private function decodeStr( $str ){ $enc = mb_detect_encoding( $str, array('ASCII','UTF-8','ISO-8859-1'), false ); if( $enc && $enc !== 'ASCII' && $enc !== 'UTF-8' ){ $str = iconv( $enc, 'UTF-8', $str ); } return $str; } } function loco_parse_mo( $src ){ $mo = new LocoMoParser($src); return $mo->parse(); } final class PHPTokens implements Iterator { private $tokens; private $i; private $skip_tokens = array(); private $skip_strings = array(); private $literal_tokens = array(); public function __construct( array $tokens ){ $this->tokens = $tokens; $this->rewind(); } public function literal(){ foreach( func_get_args() as $t ){ $this->literal_tokens[ $t ] = 1; } return $this; } public function ignore(){ foreach( func_get_args() as $t ){ if( is_int($t) ){ $this->skip_tokens[$t] = true; } else { $this->skip_strings[$t] = true; } } return $this; } public function export(){ $arr = array(); foreach( $this as $tok ){ $arr[] = $tok; } return $arr; } public function advance(){ $this->next(); return $this->current(); } public function pop(){ $tok = array_pop( $this->tokens ); $this->rewind(); return $tok; } public function shift(){ $tok = array_shift( $this->tokens); $this->rewind(); return $tok; } public function rewind(){ $this->i = ( false === reset($this->tokens) ? null : key($this->tokens) ); } public function valid(){ while( isset($this->i) ){ $tok = $this->tokens[$this->i]; if( is_array($tok) ){ if( isset($this->skip_tokens[$tok[0]]) ){ $this->next(); } else { return true; } } else if( isset($this->skip_strings[$tok]) ){ $this->next(); } else { return true; } } return false; } public function key(){ return $this->i; } public function next(){ $this->i = ( false === next($this->tokens) ? null : key($this->tokens) ); } public function current(){ if( ! $this->valid() ){ return false; } $tok = $this->tokens[$this->i]; if( is_array($tok) && isset($this->literal_tokens[$tok[0]]) ){ return $tok[1]; } return $tok; } public function __toString(){ $s = ''; foreach( $this as $token ){ $s .= is_array($token) ? $token[1] : $token; } return $s; } } function loco_parse_comment($comment){ if( '*' === $comment{1} ){ $lines = array(); foreach( explode("\n", $comment) as $line ){ $line and $lines[] = trim($line,"/* \r\t"); } $comment = implode("\n", $lines); } return trim( $comment,"/ \n\r\t" ); } function decapse_string( $s ){ if( empty($s) ){ return ''; } $q = $s{0}; switch( $q ){ case "'": case '"': $s = substr( $s, 1, -1 ); if( '"' === $q ){ return stripcslashes($s); } return str_replace( array( '\\'.$q, '\\\\' ), array( $q, '\\' ), $s ); default: return $s; } } function loco_extract_php( array $tokens, $fileref = '' ){ $extractor = new LocoPHPExtractor; return $extractor->extract( $tokens, $fileref ); } final class LocoPHPExtractor { private static $rules = array ( '_' => 's', 'gettext' => 's', 'dgettext' => '_s', 'ngettext' => 'sp', 'dngettext' => '_sp', '__' => 's', '_e' => 's', '_c' => 's', '_n' => 'sp', '_n_noop' => 'sp', '_nc' => 'sp', '__ngettext' => 'sp', '__ngettext_noop' => 'sp', '_x' => 'sc', '_ex' => 'sc', '_nx' => 'sp_c', '_nx_noop' => 'spc', '_n_js' => 'sp', '_nx_js' => 'spc', 'esc_attr__' => 's', 'esc_html__' => 's', 'esc_attr_e' => 's', 'esc_html_e' => 's', 'esc_attr_x' => 'sc', 'esc_html_x' => 'sc', 'comments_number_link' => '_sp', 't' => 's', 'st' => 's', 'trans' => 's', 'transChoice' => 'sp', ); private $exp = array(); private $reg = array(); public function extract( array $tokens, $fileref = '' ){ $tokens = new PHPTokens( $tokens ); $tokens->ignore( T_WHITESPACE ); $comment = ''; foreach( $tokens as $tok ){ if( isset($args) ){ if( ')' === $tok ){ isset($arg) and $arg and $args[] = $arg; $this->push( $rule, $args, $comment, $ref ); unset($args,$arg); $comment = ''; } else if( ',' === $tok ){ isset($arg) and $arg and $args[] = $arg; unset($arg); } else if( isset($arg) ){ $arg[] = $tok; } else { $arg = array( $tok ); } } else if( is_array($tok) ){ list($t,$s) = $tok; if( T_COMMENT === $t || T_DOC_COMMENT === $t ){ $comment = $s; } else if( T_STRING === $t && isset(self::$rules[$s]) && '(' === $tokens->advance() ){ $rule = self::$rules[$s]; $args = array(); $ref = $fileref ? $fileref.':'.$tok[2]: ''; } else if( $comment && false === stripos($comment, 'translators') ){ $comment = ''; } } } return $this->exp; } private function push( $rule, array $args, $comment = '', $ref = '' ){ $s = strpos( $rule, 's'); $p = strpos( $rule, 'p'); $c = strpos( $rule, 'c'); foreach( $args as $i => $tokens ){ if( 1 === count($tokens) && is_array($tokens[0]) && T_CONSTANT_ENCAPSED_STRING === $tokens[0][0] ){ $args[$i] = decapse_string( $tokens[0][1] ); } else { $args[$i] = null; } } $key = $msgid = $args[$s]; if( ! $msgid ){ return null; } $entry = array ( 'id' => '', 'source' => $msgid, 'target' => '', ); if( $c && isset($args[$c]) ){ $entry['context'] = $args[$c]; $key .= "\0". $args[$c]; } if( $ref ){ $entry['refs'] = $ref; } $parse_printf = true; if( $comment ){ if( preg_match('/xgettext:\s*((?:no-)?\w+)-format/', $comment, $r ) ){ if( 'no-' === substr($r[1],0,3) ){ $entry['format'] = false; } else { $entry['format'] = $r[1]; } $comment = str_replace( $r[0], '', $comment ); $parse_printf = false; } $entry['notes'] = loco_parse_comment($comment); } if( $parse_printf && loco_sniff_printf( $msgid ) ){ $entry['format'] = 'php'; $parse_printf = false; } if( isset($this->reg[$key]) ){ $index = $this->reg[$key]; $a = array(); isset($this->exp[$index]['refs']) and $a[] = $this->exp[$index]['refs']; isset($entry['refs']) and $a[] = $entry['refs']; $a && $this->exp[$index]['refs'] = implode(" ", $a ); $a = array(); isset($this->exp[$index]['notes']) and $a[] = $this->exp[$index]['notes']; isset($entry['notes']) and $a[] = $entry['notes']; $a && $this->exp[$index]['notes'] = implode("\n", $a ); } else { $index = count($this->exp); $this->reg[$key] = $index; $this->exp[] = $entry; } if( $p && isset($args[$p]) ){ $msgid_plural = $args[$p]; $entry = array ( 'id' => '', 'source' => $msgid_plural, 'target' => '', 'plural' => 1, 'parent' => $index, ); if( $parse_printf && loco_sniff_printf( $msgid_plural ) ){ $this->exp[$index]['format'] = 'php'; } $key = $msgid_plural."\0\0"; if( isset($this->reg[$key]) ){ $plural_index = $this->reg[$key]; $this->exp[$plural_index] = $entry; } else { $plural_index = count($this->exp); $this->reg[$key] = $plural_index; $this->exp[] = $entry; } } return $index; } public function get_xgettext( $input = '-' ){ $cmd = defined('WHICH_XGETTEXT') ? WHICH_XGETTEXT : 'xgettext'; $cmd.= ' -LPHP -c -o-'; if( $k = $this->get_xgettext_keywords() ){ $cmd.= ' -k'.implode(' -k', $k ); } return $cmd.' '.$input; } public function get_xgettext_keywords(){ $ks = array(); foreach( self::$rules as $word => $rule ){ $s = strpos( $rule, 's'); $k = $word.':'.++$s; if( false !== $p = strpos( $rule, 'p') ){ $k.= ','.++$p; } if( false !== $p = strpos( $rule, 'c') ){ $k.= ','.++$p.'c'; } $ks[] = $k; } return $ks; } } function loco_relative_path( $source_path, $target_path ){ $rel = ''; $common = false; $src = preg_split('!/+!', $source_path, -1, PREG_SPLIT_NO_EMPTY ); $dst = preg_split('!/+!', $target_path, -1, PREG_SPLIT_NO_EMPTY ); while( $src && $dst ){ if( current($src) !== current($dst) ){ break; } $common = true; array_shift($src); array_shift($dst); } if( ! $common ){ return $target_path; } if( $src ){ $up = array_fill( 0, count($src), '..' ); $rel = implode('/', $up ); } if( $dst ){ $rel && $rel .= '/'; $rel .= implode('/', $dst ); } return $rel; } class LocoMo { private $bin; private $msgs; private $head; private $hash; public function __construct( array $export, LocoArray $head = null ){ if( ! $head ){ $head = new LocoArray( array( 'Project-Id-Version' => 'Loco', 'Language' => 'English', 'Plural-Forms' => 'nplurals=2; plural=(n!=1);', 'MIME-Version' => '1.0', 'Content-Type' => 'text/plain; charset=UTF-8', 'Content-Transfer-Encoding' => '8bit', 'X-Generator' => 'Loco '.PLUG_HTTP_ADDR, ) ); } $this->head = $head; $this->msgs = $export; $this->bin = ''; } public function enableHash(){ return $this->hash = new LocoMoTable; } public function setHeader( $key, $val ){ $this->head->add($key, $val); return $this; } public function setProject( LocoProject $Proj ){ return $this ->setHeader( 'Project-Id-Version', $Proj->proj_name ) ->setHeader($key, $val) ; } public function setLocale( LocoProjectLocale $Loc ){ return $this ->setHeader( 'Language', $Loc->label ) ->setHeader( 'Plural-Forms', 'nplurals='.$Loc->nplurals.'; plural='.$Loc->pluraleq.';' ) ; } public function count(){ return count($this->msgs); } public function compile(){ $table = array(''); $sources = array(''); $targets = array( $this->head->__toString() ); foreach( $this->msgs as $r ){ $msgid = $r['key']; if( isset($r['context']) && $r['context'] ){ $msgid or $msgid = "(".$r['context'].')'; $msgid = $r['context']."\x04".$msgid; } if( ! $msgid ){ continue; } $msgstr = $r['translation']; if( ! $msgstr ){ continue; } $table[] = $msgid; if( isset($r['plurals']) ){ foreach( $r['plurals'] as $i => $p ){ if( $i === 0 ){ $msgid .= "\0".$p['key']; } $msgstr .= "\0".$p['translation']; } } $sources[] = $msgid; $targets[] = $msgstr; } asort( $sources, SORT_STRING ); $this->bin = ''; $this->writeInteger( 0x950412de ); $this->writeInteger( 0 ); $n = count($sources); $this->writeInteger( $n ); $offset = 28; $this->writeInteger( $offset ); $offset += $n * 8; $this->writeInteger( $offset ); if( $this->hash ){ sort( $table, SORT_STRING ); $this->hash->compile( $table ); $s = $this->hash->count(); } else { $s = 0; } $this->writeInteger( $s ); $offset += $n * 8; $this->writeInteger( $offset ); if( $s ){ $offset += $s * 4; } $source = ''; foreach( $sources as $i => $str ){ $source .= $str."\0"; $this->writeInteger( $strlen = strlen($str) ); $this->writeInteger( $offset ); $offset += $strlen + 1; } $target = ''; foreach( array_keys($sources) as $i ){ $str = $targets[$i]; $target .= $str."\0"; $this->writeInteger( $strlen = strlen($str) ); $this->writeInteger( $offset ); $offset += $strlen + 1; } if( $this->hash ){ $this->bin .= $this->hash->__toString(); } $this->bin .= $source; $this->bin .= $target; return $this->bin; } private function writeInteger( $num ){ $this->bin .= pack( 'V', $num ); return $this; } } class LocoMoTable { private $size = 0; private $bin = ''; private $map; public function __construct( $data = null ){ if( is_array($data) ){ $this->compile( $data ); } else if( $data ){ $this->parse( $data ); } } public function count(){ if( ! isset($this->size) ){ if( $this->bin ){ $this->size = (int) ( strlen( $this->bin ) / 4 ); } else if( is_array($this->map) ){ $this->size = count($this->map); } else { return 0; } if( ! self::is_prime($this->size) || $this->size < 3 ){ throw new Exception('Size expected to be prime number above 2, got '.$this->size); } } return $this->size; } public function bytes(){ return $this->count() * 4; } public function __toString(){ return $this->bin; } public function export(){ if( ! is_array($this->map) ){ $this->parse( $this->bin ); } return $this->map; } private function reset( $length ){ $this->size = max( 3, self::next_prime ( $length * 4 / 3 ) ); $this->bin = null; $this->map = array(); return $this->size; } public function compile( array $msgids ){ $hash_tab_size = $this->reset( count($msgids) ); $packed = array_fill( 0, $hash_tab_size, "\0\0\0\0" ); $j = 0; foreach( $msgids as $msgid ){ $hash_val = self::hashpjw( $msgid ); $idx = $hash_val % $hash_tab_size; if( array_key_exists($idx, $this->map) ){ $incr = 1 + ( $hash_val % ( $hash_tab_size - 2 ) ); do { $idx += $incr; if( $hash_val === $idx ){ throw new Exception('Unable to find empty slot in hash table'); } $idx %= $hash_tab_size; } while( array_key_exists($idx, $this->map ) ); } $this->map[$idx] = $j; $packed[$idx] = pack('V', ++$j ); } return $this->bin = implode('',$packed); } public function lookup( $msgid, array $msgids ){ $hash_val = self::hashpjw( $msgid ); $idx = $hash_val % $this->size; $incr = 1 + ( $hash_val % ( $this->size - 2 ) ); while( true ){ if( ! array_key_exists($idx, $this->map) ){ break; } $j = $this->map[$idx]; if( isset($msgids[$j]) && $msgid === $msgids[$j] ){ return $j; } $idx += $incr; if( $idx === $hash_val ){ break; } $idx %= $this->size; } return -1; } public function parse( $bin ){ $this->bin = (string) $bin; $this->size = null; $hash_tab_size = $this->count(); $this->map = array(); $idx = -1; $byte = 0; while( ++$idx < $hash_tab_size ){ $word = substr( $this->bin, $byte, 4 ); if( "\0\0\0\0" !== $word ){ list(,$j) = unpack('V', $word ); $this->map[$idx] = $j - 1; } $byte += 4; } return $this->map; } public static function hashpjw( $str ){ $i = -1; $hval = 0; $len = strlen($str); while( ++$i < $len ){ $ord = ord( $str{$i} ); $hval = ( $hval << 4 ) + $ord; $g = $hval & 0xf0000000; if( $g !== 0 ){ $hval ^= $g >> 24; $hval ^= $g; } } return $hval; } private static function next_prime( $seed ){ $seed |= 1; while ( ! self::is_prime($seed) ){ $seed += 2; } return $seed; } private static function is_prime( $num ) { if ($num === 1 ){ return false; } if( $num === 2 ){ return true; } if( $num % 2 == 0 ) { return false; } for( $i = 3; $i <= ceil(sqrt($num)); $i = $i + 2) { if($num % $i == 0 ){ return false; } } return true; } } function loco_msgfmt( $po, $withhash = false ){ if( ! is_array($po) ){ $po = loco_parse_po( $po ); } $head = null; if( isset($po[0]) && '' === $po[0]['source'] ){ $head = loco_parse_po_headers( $po[0]['target'] ); $po[0] = null; } $export = array(); foreach( $po as $i => $r ){ if( ! $r ){ continue; } $msg = array ( 'key' => $r['source'], 'translation' => $r['target'], ); if( isset($r['parent']) ){ unset( $parent ); $parent = &$export[ $r['parent'] ]; isset($parent['plurals']) or $parent['plurals'] = array(); $parent['plurals'][] = $msg; } else { isset($r['context']) and $msg['context'] = $r['context']; $export[$i] = $msg; } } $mo = new LocoMo( $export, $head ); if( $withhash ){ $mo->enableHash(); } return $mo->compile(); } function loco_po_stats( array $po ){ $t = $n = $f = $u = 0; foreach( $po as $r ){ if( ! isset($r['source']) || '' === $r['source'] ){ continue; } if( isset($r['parent']) && is_int($r['parent']) ){ continue; } $t++; if( '' === $r['target'] ){ $u++; } else if( isset($r['flag']) && LOCO_FLAG_FUZZY === $r['flag'] ){ $f++; } else { $n++; } } $r = $t && $n ? $n / $t : 0; $p = (string) round( $r * 100 ); return compact('t','p','f','u'); }
|
lib/build/locales-compiled.php
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
<?php
|
2 |
/**
|
3 |
* Compiled source built from Loco core. Do not edit!
|
4 |
-
* Tue,
|
5 |
*/
|
6 |
-
function loco_language_country( $lang ){ static $a; if( ! isset($a) ){ $a = unserialize('a:79:{s:2:"af";s:2:"ZA";s:2:"ar";s:2:"IL";s:2:"az";s:2:"TR";s:2:"bg";s:2:"BG";s:2:"bn";s:2:"BD";s:2:"bs";s:2:"BA";s:2:"cs";s:2:"CZ";s:2:"cy";s:2:"GB";s:2:"da";s:2:"DK";s:2:"de";s:2:"DE";s:2:"el";s:2:"GR";s:2:"en";s:2:"GB";s:2:"es";s:2:"ES";s:2:"et";s:2:"EE";s:2:"fa";s:2:"AF";s:2:"fi";s:2:"FI";s:2:"fo";s:2:"FO";s:2:"fr";s:2:"FR";s:2:"ga";s:2:"IE";s:2:"gl";s:2:"ES";s:2:"gn";s:2:"PY";s:2:"he";s:2:"IL";s:2:"hi";s:2:"IN";s:2:"hr";s:2:"HR";s:2:"ht";s:2:"HT";s:2:"hu";s:2:"HU";s:2:"hy";s:2:"AM";s:2:"id";s:2:"ID";s:2:"is";s:2:"IS";s:2:"it";s:2:"IT";s:2:"ja";s:2:"JP";s:2:"jv";s:2:"ID";s:2:"ka";s:2:"GE";s:2:"kk";s:2:"KZ";s:2:"kn";s:2:"IN";s:2:"ko";s:2:"KR";s:2:"lb";s:2:"LU";s:2:"li";s:2:"NL";s:2:"lo";s:2:"LA";s:2:"lt";s:2:"LT";s:2:"lv";s:2:"LV";s:2:"mg";s:2:"MG";s:2:"ms";s:2:"MY";s:2:"mt";s:2:"MT";s:2:"my";s:2:"MM";s:2:"nb";s:2:"NO";s:2:"ne";s:2:"NP";s:2:"nl";s:2:"NL";s:2:"nn";s:2:"NO";s:2:"no";s:2:"NO";s:2:"os";s:2:"TR";s:2:"pa";s:2:"IN";s:2:"pl";s:2:"PL";s:2:"pt";s:2:"PT";s:2:"ro";s:2:"RO";s:2:"ru";s:2:"RU";s:2:"sa";s:2:"IN";s:2:"sc";s:2:"IT";s:2:"sd";s:2:"PK";s:2:"si";s:2:"LK";s:2:"sk";s:2:"SK";s:2:"sl";s:2:"SI";s:2:"so";s:2:"SO";s:2:"sq";s:2:"AL";s:2:"sr";s:2:"RS";s:2:"su";s:2:"ID";s:2:"sv";s:2:"SE";s:2:"sw";s:2:"KE";s:2:"ta";s:2:"IN";s:2:"te";s:2:"IN";s:2:"tg";s:2:"TJ";s:2:"th";s:2:"TH";s:2:"tr";s:2:"TR";s:2:"ug";s:2:"CN";s:2:"uk";s:2:"UA";s:2:"ur";s:2:"IN";s:2:"uz";s:2:"UZ";s:2:"vi";s:2:"VN";s:2:"zh";s:2:"CN";}'); } if( isset($a[$lang]) ){ return $a[$lang]; } return ''; } return unserialize('a:3:{s:7:"locales";a:79:{s:2:"af";a:1:{s:2:"ZA";s:24:"Afrikaans (South Africa)";}s:2:"ar";a:2:{s:2:"IL";s:15:"Arabic (Israel)";s:2:"AE";s:29:"Arabic (United Arab Emirates)";}s:2:"az";a:1:{s:2:"TR";s:20:"Azerbaijani (Turkey)";}s:2:"bg";a:1:{s:2:"BG";s:9:"Bulgarian";}s:2:"bn";a:1:{s:2:"BD";s:20:"Bengali (Bangladesh)";}s:2:"bs";a:1:{s:2:"BA";s:30:"Bosnian (Bosnia & Herzegovina)";}s:2:"cs";a:1:{s:2:"CZ";s:5:"Czech";}s:2:"cy";a:1:{s:2:"GB";s:5:"Welsh";}s:2:"da";a:1:{s:2:"DK";s:6:"Danish";}s:2:"de";a:3:{s:2:"DE";s:6:"German";s:2:"CH";s:20:"German (Switzerland)";s:2:"AT";s:16:"German (Austria)";}s:2:"el";a:2:{s:2:"GR";s:5:"Greek";s:2:"CY";s:14:"Greek (Cyprus)";}s:2:"en";a:11:{s:2:"GB";s:12:"English (UK)";s:2:"IE";s:17:"English (Ireland)";s:2:"US";s:13:"English (USA)";s:2:"CA";s:16:"English (Canada)";s:2:"AU";s:19:"English (Australia)";s:2:"NZ";s:21:"English (New Zealand)";s:2:"HK";s:19:"English (Hong Kong)";s:2:"SG";s:19:"English (Singapore)";s:2:"AE";s:30:"English (United Arab Emirates)";s:2:"ZA";s:22:"English (South Africa)";s:2:"IN";s:15:"English (India)";}s:2:"es";a:19:{s:2:"ES";s:7:"Spanish";s:2:"MX";s:16:"Spanish (Mexico)";s:2:"AR";s:19:"Spanish (Argentina)";s:2:"BO";s:17:"Spanish (Bolivia)";s:2:"CL";s:15:"Spanish (Chile)";s:2:"CO";s:18:"Spanish (Colombia)";s:2:"CR";s:20:"Spanish (Costa Rica)";s:2:"CU";s:14:"Spanish (Cuba)";s:2:"DO";s:28:"Spanish (Dominican Republic)";s:2:"EC";s:17:"Spanish (Ecuador)";s:2:"SV";s:21:"Spanish (El Salvador)";s:2:"GT";s:19:"Spanish (Guatemala)";s:2:"HN";s:18:"Spanish (Honduras)";s:2:"NI";s:19:"Spanish (Nicaragua)";s:2:"PA";s:16:"Spanish (Panama)";s:2:"PY";s:18:"Spanish (Paraguay)";s:2:"PE";s:14:"Spanish (Peru)";s:2:"UY";s:17:"Spanish (Uruguay)";s:2:"VE";s:19:"Spanish (Venezuela)";}s:2:"et";a:1:{s:2:"EE";s:8:"Estonian";}s:2:"fa";a:2:{s:2:"AF";s:21:"Persian (Afghanistan)";s:2:"IR";s:14:"Persian (Iran)";}s:2:"fi";a:1:{s:2:"FI";s:7:"Finnish";}s:2:"fo";a:2:{s:2:"FO";s:23:"Faroese (Faroe Islands)";s:2:"DK";s:17:"Faroese (Denmark)";}s:2:"fr";a:5:{s:2:"FR";s:6:"French";s:2:"CH";s:20:"French (Switzerland)";s:2:"BE";s:16:"French (Belgium)";s:2:"HT";s:14:"French (Haiti)";s:2:"CA";s:15:"French (Canada)";}s:2:"ga";a:1:{s:2:"IE";s:15:"Irish (Ireland)";}s:2:"gl";a:1:{s:2:"ES";s:16:"Galician (Spain)";}s:2:"gn";a:1:{s:2:"PY";s:18:"Guarani (Paraguay)";}s:2:"he";a:1:{s:2:"IL";s:15:"Hebrew (Israel)";}s:2:"hi";a:1:{s:2:"IN";s:13:"Hindi (India)";}s:2:"hr";a:1:{s:2:"HR";s:8:"Croatian";}s:2:"ht";a:1:{s:2:"HT";s:14:"Haitian Creole";}s:2:"hu";a:1:{s:2:"HU";s:9:"Hungarian";}s:2:"hy";a:1:{s:2:"AM";s:8:"Armenian";}s:2:"id";a:1:{s:2:"ID";s:10:"Indonesian";}s:2:"is";a:1:{s:2:"IS";s:9:"Icelandic";}s:2:"it";a:2:{s:2:"IT";s:7:"Italian";s:2:"CH";s:21:"Italian (Switzerland)";}s:2:"ja";a:1:{s:2:"JP";s:8:"Japanese";}s:2:"jv";a:1:{s:2:"ID";s:20:"Javanese (Indonesia)";}s:2:"ka";a:1:{s:2:"GE";s:8:"Georgian";}s:2:"kk";a:1:{s:2:"KZ";s:6:"Kazakh";}s:2:"kn";a:1:{s:2:"IN";s:15:"Kannada (India)";}s:2:"ko";a:1:{s:2:"KR";s:6:"Korean";}s:2:"lb";a:1:{s:2:"LU";s:13:"Luxembourgish";}s:2:"li";a:1:{s:2:"NL";s:24:"Limburgish (Netherlands)";}s:2:"lo";a:1:{s:2:"LA";s:10:"Lao (Laos)";}s:2:"lt";a:1:{s:2:"LT";s:10:"Lithuanian";}s:2:"lv";a:1:{s:2:"LV";s:7:"Latvian";}s:2:"mg";a:1:{s:2:"MG";s:21:"Malagasy (Madagascar)";}s:2:"ms";a:1:{s:2:"MY";s:16:"Malay (Malaysia)";}s:2:"mt";a:1:{s:2:"MT";s:7:"Maltese";}s:2:"my";a:1:{s:2:"MM";s:17:"Burmese (Myanmar)";}s:2:"nb";a:1:{s:2:"NO";s:7:"Bokmål";}s:2:"ne";a:1:{s:2:"NP";s:6:"Nepali";}s:2:"nl";a:2:{s:2:"NL";s:5:"Dutch";s:2:"BE";s:15:"Dutch (Belgium)";}s:2:"nn";a:1:{s:2:"NO";s:7:"Nynorsk";}s:2:"no";a:1:{s:2:"NO";s:9:"Norwegian";}s:2:"os";a:3:{s:2:"TR";s:17:"Ossetian (Turkey)";s:2:"RU";s:17:"Ossetian (Russia)";s:2:"GE";s:18:"Ossetian (Georgia)";}s:2:"pa";a:1:{s:2:"IN";s:15:"Punjabi (India)";}s:2:"pl";a:1:{s:2:"PL";s:6:"Polish";}s:2:"pt";a:2:{s:2:"PT";s:10:"Portuguese";s:2:"BR";s:19:"Portuguese (Brazil)";}s:2:"ro";a:1:{s:2:"RO";s:8:"Romanian";}s:2:"ru";a:2:{s:2:"RU";s:7:"Russian";s:2:"UA";s:17:"Russian (Ukraine)";}s:2:"sa";a:1:{s:2:"IN";s:16:"Sanskrit (India)";}s:2:"sc";a:1:{s:2:"IT";s:17:"Sardinian (Italy)";}s:2:"sd";a:1:{s:2:"PK";s:17:"Sindhi (Pakistan)";}s:2:"si";a:1:{s:2:"LK";s:19:"Sinhala (Sri Lanka)";}s:2:"sk";a:1:{s:2:"SK";s:6:"Slovak";}s:2:"sl";a:1:{s:2:"SI";s:9:"Slovenian";}s:2:"so";a:1:{s:2:"SO";s:6:"Somali";}s:2:"sq";a:1:{s:2:"AL";s:18:"Albanian (Albania)";}s:2:"sr";a:1:{s:2:"RS";s:7:"Serbian";}s:2:"su";a:1:{s:2:"ID";s:21:"Sundanese (Indonesia)";}s:2:"sv";a:1:{s:2:"SE";s:7:"Swedish";}s:2:"sw";a:4:{s:2:"KE";s:15:"Swahili (Kenya)";s:2:"UG";s:16:"Swahili (Uganda)";s:2:"TZ";s:18:"Swahili (Tanzania)";s:2:"KM";s:17:"Swahili (Comoros)";}s:2:"ta";a:2:{s:2:"IN";s:13:"Tamil (India)";s:2:"LK";s:17:"Tamil (Sri Lanka)";}s:2:"te";a:1:{s:2:"IN";s:14:"Telugu (India)";}s:2:"tg";a:1:{s:2:"TJ";s:18:"Tajik (Tajikistan)";}s:2:"th";a:1:{s:2:"TH";s:15:"Thai (Thailand)";}s:2:"tr";a:1:{s:2:"TR";s:7:"Turkish";}s:2:"ug";a:1:{s:2:"CN";s:14:"Uyghur (China)";}s:2:"uk";a:1:{s:2:"UA";s:19:"Ukrainian (Ukraine)";}s:2:"ur";a:2:{s:2:"IN";s:12:"Urdu (India)";s:2:"PK";s:15:"Urdu (Pakistan)";}s:2:"uz";a:1:{s:2:"UZ";s:18:"Uzbek (Uzbekistan)";}s:2:"vi";a:1:{s:2:"VN";s:10:"Vietnamese";}s:2:"zh";a:3:{s:2:"CN";s:7:"Chinese";s:2:"HK";s:19:"Chinese (Hong Kong)";s:2:"TW";s:16:"Chinese (Taiwan)";}}s:5:"langs";a:185:{s:2:"ab";a:3:{i:0;s:9:"Abkhazian";i:1;s:0:"";i:2;a:0:{}}s:2:"aa";a:3:{i:0;s:4:"Afar";i:1;s:0:"";i:2;a:0:{}}s:2:"af";a:3:{i:0;s:9:"Afrikaans";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ak";a:3:{i:0;s:4:"Akan";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"sq";a:3:{i:0;s:8:"Albanian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"am";a:3:{i:0;s:7:"Amharic";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ar";a:3:{i:0;s:6:"Arabic";i:1;s:95:"n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100 >= 3 && n%100<=10 ? 3 : n%100 >= 11 && n%100<=99 ? 4 : 5";i:2;a:6:{i:0;s:4:"zero";i:1;s:3:"one";i:2;s:3:"two";i:3;s:3:"few";i:4;s:4:"many";i:5;s:5:"other";}}s:2:"an";a:3:{i:0;s:9:"Aragonese";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"hy";a:3:{i:0;s:8:"Armenian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"as";a:3:{i:0;s:8:"Assamese";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"av";a:3:{i:0;s:6:"Avaric";i:1;s:0:"";i:2;a:0:{}}s:2:"ae";a:3:{i:0;s:7:"Avestan";i:1;s:0:"";i:2;a:0:{}}s:2:"ay";a:3:{i:0;s:6:"Aymara";i:1;s:0:"";i:2;a:0:{}}s:2:"az";a:3:{i:0;s:11:"Azerbaijani";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"bm";a:3:{i:0;s:7:"Bambara";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"ba";a:3:{i:0;s:7:"Bashkir";i:1;s:0:"";i:2;a:0:{}}s:2:"eu";a:3:{i:0;s:6:"Basque";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"be";a:3:{i:0;s:10:"Belarusian";i:1;s:82:"(n%10==1 && n%100!=11 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2)";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:4:"many";}}s:2:"bn";a:3:{i:0;s:7:"Bengali";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"bh";a:3:{i:0;s:6:"Bihari";i:1;s:28:"( n >= 0 && n <= 1 ) ? 0 : 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"bi";a:3:{i:0;s:7:"Bislama";i:1;s:0:"";i:2;a:0:{}}s:2:"bs";a:3:{i:0;s:7:"Bosnian";i:1;s:82:"(n%10==1 && n%100!=11 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2)";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:5:"other";}}s:2:"br";a:3:{i:0;s:6:"Breton";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"bg";a:3:{i:0;s:9:"Bulgarian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"my";a:3:{i:0;s:7:"Burmese";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"ca";a:3:{i:0;s:18:"Catalan; Valencian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ch";a:3:{i:0;s:8:"Chamorro";i:1;s:0:"";i:2;a:0:{}}s:2:"ce";a:3:{i:0;s:7:"Chechen";i:1;s:0:"";i:2;a:0:{}}s:2:"ny";a:3:{i:0;s:23:"Chichewa; Chewa; Nyanja";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"zh";a:3:{i:0;s:7:"Chinese";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"cu";a:3:{i:0;s:64:"Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old";i:1;s:0:"";i:2;a:0:{}}s:2:"cv";a:3:{i:0;s:7:"Chuvash";i:1;s:0:"";i:2;a:0:{}}s:2:"kw";a:3:{i:0;s:7:"Cornish";i:1;s:27:"n == 1 ? 0 : n == 2 ? 1 : 2";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"two";i:2;s:5:"other";}}s:2:"co";a:3:{i:0;s:8:"Corsican";i:1;s:0:"";i:2;a:0:{}}s:2:"cr";a:3:{i:0;s:4:"Cree";i:1;s:0:"";i:2;a:0:{}}s:2:"hr";a:3:{i:0;s:8:"Croatian";i:1;s:80:"n%10==1 && n%100!=11 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:5:"other";}}s:2:"cs";a:3:{i:0;s:5:"Czech";i:1;s:45:"( n == 1 ) ? 0 : ( n >= 2 && n <= 4 ) ? 1 : 2";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:5:"other";}}s:2:"da";a:3:{i:0;s:6:"Danish";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"dv";a:3:{i:0;s:26:"Divehi; Dhivehi; Maldivian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"nl";a:3:{i:0;s:14:"Dutch; Flemish";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"dz";a:3:{i:0;s:8:"Dzongkha";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"en";a:3:{i:0;s:7:"English";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"eo";a:3:{i:0;s:9:"Esperanto";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"et";a:3:{i:0;s:8:"Estonian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ee";a:3:{i:0;s:3:"Ewe";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"fo";a:3:{i:0;s:7:"Faroese";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"fj";a:3:{i:0;s:6:"Fijian";i:1;s:0:"";i:2;a:0:{}}s:2:"fi";a:3:{i:0;s:7:"Finnish";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"fr";a:3:{i:0;s:6:"French";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ff";a:3:{i:0;s:5:"Fulah";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"gd";a:3:{i:0;s:23:"Gaelic; Scottish Gaelic";i:1;s:26:"n < 2 ? 0 : n == 2 ? 1 : 2";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"two";i:2;s:5:"other";}}s:2:"gl";a:3:{i:0;s:8:"Galician";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"lg";a:3:{i:0;s:5:"Ganda";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ka";a:3:{i:0;s:8:"Georgian";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"de";a:3:{i:0;s:6:"German";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"el";a:3:{i:0;s:5:"Greek";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"gn";a:3:{i:0;s:7:"Guarani";i:1;s:0:"";i:2;a:0:{}}s:2:"gu";a:3:{i:0;s:8:"Gujarati";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ht";a:3:{i:0;s:23:"Haitian; Haitian Creole";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ha";a:3:{i:0;s:5:"Hausa";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"he";a:3:{i:0;s:6:"Hebrew";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"hz";a:3:{i:0;s:6:"Herero";i:1;s:0:"";i:2;a:0:{}}s:2:"hi";a:3:{i:0;s:5:"Hindi";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ho";a:3:{i:0;s:9:"Hiri Motu";i:1;s:0:"";i:2;a:0:{}}s:2:"hu";a:3:{i:0;s:9:"Hungarian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"is";a:3:{i:0;s:9:"Icelandic";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"io";a:3:{i:0;s:3:"Ido";i:1;s:0:"";i:2;a:0:{}}s:2:"ig";a:3:{i:0;s:4:"Igbo";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"id";a:3:{i:0;s:10:"Indonesian";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"ia";a:3:{i:0;s:58:"Interlingua (International Auxiliary Language Association)";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ie";a:3:{i:0;s:11:"Interlingue";i:1;s:0:"";i:2;a:0:{}}s:2:"iu";a:3:{i:0;s:9:"Inuktitut";i:1;s:27:"n == 1 ? 0 : n == 2 ? 1 : 2";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"two";i:2;s:5:"other";}}s:2:"ik";a:3:{i:0;s:7:"Inupiaq";i:1;s:0:"";i:2;a:0:{}}s:2:"ga";a:3:{i:0;s:5:"Irish";i:1;s:44:"n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4";i:2;a:5:{i:0;s:3:"one";i:1;s:3:"two";i:2;s:3:"few";i:3;s:4:"many";i:4;s:5:"other";}}s:2:"it";a:3:{i:0;s:7:"Italian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ja";a:3:{i:0;s:8:"Japanese";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"jv";a:3:{i:0;s:8:"Javanese";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"kl";a:3:{i:0;s:24:"Kalaallisut; Greenlandic";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"kn";a:3:{i:0;s:7:"Kannada";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"kr";a:3:{i:0;s:6:"Kanuri";i:1;s:0:"";i:2;a:0:{}}s:2:"ks";a:3:{i:0;s:8:"Kashmiri";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"kk";a:3:{i:0;s:6:"Kazakh";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"km";a:3:{i:0;s:5:"Khmer";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"ki";a:3:{i:0;s:14:"Kikuyu; Gikuyu";i:1;s:0:"";i:2;a:0:{}}s:2:"rw";a:3:{i:0;s:11:"Kinyarwanda";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ky";a:3:{i:0;s:7:"Kirghiz";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"kv";a:3:{i:0;s:4:"Komi";i:1;s:0:"";i:2;a:0:{}}s:2:"kg";a:3:{i:0;s:5:"Kongo";i:1;s:0:"";i:2;a:0:{}}s:2:"ko";a:3:{i:0;s:6:"Korean";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"kj";a:3:{i:0;s:18:"Kuanyama; Kwanyama";i:1;s:0:"";i:2;a:0:{}}s:2:"ku";a:3:{i:0;s:7:"Kurdish";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"lo";a:3:{i:0;s:3:"Lao";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"la";a:3:{i:0;s:5:"Latin";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"lv";a:3:{i:0;s:7:"Latvian";i:1;s:49:"n % 10 == 1 && n % 100 != 11 ? 0 : n != 0 ? 1 : 2";i:2;a:3:{i:0;s:3:"one";i:1;s:5:"other";i:2;s:4:"zero";}}s:2:"li";a:3:{i:0;s:32:"Limburgan; Limburger; Limburgish";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ln";a:3:{i:0;s:7:"Lingala";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"lt";a:3:{i:0;s:10:"Lithuanian";i:1;s:71:"(n%10==1 && n%100!=11 ? 0 : n%10 >= 2 &&(n%100<10||n%100 >= 20)? 1 : 2)";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:5:"other";}}s:2:"lu";a:3:{i:0;s:12:"Luba-Katanga";i:1;s:0:"";i:2;a:0:{}}s:2:"lb";a:3:{i:0;s:28:"Luxembourgish; Letzeburgesch";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"mk";a:3:{i:0;s:10:"Macedonian";i:1;s:40:"( n % 10 == 1 && n % 100 != 11 ) ? 0 : 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"mg";a:3:{i:0;s:8:"Malagasy";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ms";a:3:{i:0;s:5:"Malay";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"ml";a:3:{i:0;s:9:"Malayalam";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"mt";a:3:{i:0;s:7:"Maltese";i:1;s:75:"(n==1 ? 0 : n==0||( n%100>1 && n%100<11)? 1 :(n%100>10 && n%100<20)? 2 : 3)";i:2;a:4:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:4:"many";i:3;s:5:"other";}}s:2:"gv";a:3:{i:0;s:4:"Manx";i:1;s:43:"n%10==1 ? 0 : n%10==2 ? 1 : n%20==0 ? 2 : 3";i:2;a:4:{i:0;s:3:"one";i:1;s:3:"two";i:2;s:3:"few";i:3;s:5:"other";}}s:2:"mi";a:3:{i:0;s:5:"Maori";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"mr";a:3:{i:0;s:7:"Marathi";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"mh";a:3:{i:0;s:11:"Marshallese";i:1;s:0:"";i:2;a:0:{}}s:2:"mo";a:3:{i:0;s:9:"Moldavian";i:1;s:50:"n == 1 ? 0 : n % 100 >= 1 && n % 100 <= 19 ? 1 : 2";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:5:"other";}}s:2:"mn";a:3:{i:0;s:9:"Mongolian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"na";a:3:{i:0;s:5:"Nauru";i:1;s:0:"";i:2;a:0:{}}s:2:"nv";a:3:{i:0;s:14:"Navajo; Navaho";i:1;s:0:"";i:2;a:0:{}}s:2:"nd";a:3:{i:0;s:29:"Ndebele, North; North Ndebele";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"nr";a:3:{i:0;s:29:"Ndebele, South; South Ndebele";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"ng";a:3:{i:0;s:6:"Ndonga";i:1;s:0:"";i:2;a:0:{}}s:2:"ne";a:3:{i:0;s:6:"Nepali";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"se";a:3:{i:0;s:13:"Northern Sami";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"no";a:3:{i:0;s:9:"Norwegian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"nb";a:3:{i:0;s:17:"Norwegian Bokmål";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"nn";a:3:{i:0;s:17:"Norwegian Nynorsk";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"oc";a:3:{i:0;s:31:"Occitan (post 1500); Provençal";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"oj";a:3:{i:0;s:6:"Ojibwa";i:1;s:0:"";i:2;a:0:{}}s:2:"or";a:3:{i:0;s:5:"Oriya";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"om";a:3:{i:0;s:5:"Oromo";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"os";a:3:{i:0;s:17:"Ossetian; Ossetic";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"pi";a:3:{i:0;s:4:"Pali";i:1;s:0:"";i:2;a:0:{}}s:2:"pa";a:3:{i:0;s:16:"Panjabi; Punjabi";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"fa";a:3:{i:0;s:7:"Persian";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"pl";a:3:{i:0;s:6:"Polish";i:1;s:66:"(n==1 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2)";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:4:"many";}}s:2:"pt";a:3:{i:0;s:10:"Portuguese";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ps";a:3:{i:0;s:6:"Pushto";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"qu";a:3:{i:0;s:7:"Quechua";i:1;s:0:"";i:2;a:0:{}}s:2:"rm";a:3:{i:0;s:13:"Raeto-Romance";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ro";a:3:{i:0;s:8:"Romanian";i:1;s:56:"(n==1 ? 0 :(((n%100>19)||(( n%100==0)&&(n!=0)))? 2 : 1))";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:5:"other";}}s:2:"rn";a:3:{i:0;s:5:"Rundi";i:1;s:0:"";i:2;a:0:{}}s:2:"ru";a:3:{i:0;s:7:"Russian";i:1;s:82:"(n%10==1 && n%100!=11 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2)";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:4:"many";}}s:2:"sm";a:3:{i:0;s:6:"Samoan";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"sg";a:3:{i:0;s:5:"Sango";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"sa";a:3:{i:0;s:8:"Sanskrit";i:1;s:0:"";i:2;a:0:{}}s:2:"sc";a:3:{i:0;s:9:"Sardinian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"sr";a:3:{i:0;s:7:"Serbian";i:1;s:82:"(n%10==1 && n%100!=11 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2)";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:5:"other";}}s:2:"sn";a:3:{i:0;s:5:"Shona";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ii";a:3:{i:0;s:10:"Sichuan Yi";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"sd";a:3:{i:0;s:6:"Sindhi";i:1;s:0:"";i:2;a:0:{}}s:2:"si";a:3:{i:0;s:18:"Sinhala; Sinhalese";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"sk";a:3:{i:0;s:6:"Slovak";i:1;s:45:"( n == 1 ) ? 0 : ( n >= 2 && n <= 4 ) ? 1 : 2";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:5:"other";}}s:2:"sl";a:3:{i:0;s:9:"Slovenian";i:1;s:56:"n%100==1 ? 0 : n%100==2 ? 1 : n%100==3||n%100==4 ? 2 : 3";i:2;a:4:{i:0;s:3:"one";i:1;s:3:"two";i:2;s:3:"few";i:3;s:5:"other";}}s:2:"so";a:3:{i:0;s:6:"Somali";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"st";a:3:{i:0;s:15:"Sotho, Southern";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"es";a:3:{i:0;s:7:"Spanish";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"su";a:3:{i:0;s:9:"Sundanese";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"sw";a:3:{i:0;s:7:"Swahili";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ss";a:3:{i:0;s:5:"Swati";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"sv";a:3:{i:0;s:7:"Swedish";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"tl";a:3:{i:0;s:7:"Tagalog";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ty";a:3:{i:0;s:8:"Tahitian";i:1;s:0:"";i:2;a:0:{}}s:2:"tg";a:3:{i:0;s:5:"Tajik";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ta";a:3:{i:0;s:5:"Tamil";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"tt";a:3:{i:0;s:5:"Tatar";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"te";a:3:{i:0;s:6:"Telugu";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"th";a:3:{i:0;s:4:"Thai";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"bo";a:3:{i:0;s:7:"Tibetan";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"ti";a:3:{i:0;s:8:"Tigrinya";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"to";a:3:{i:0;s:21:"Tonga (Tonga Islands)";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"ts";a:3:{i:0;s:6:"Tsonga";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"tn";a:3:{i:0;s:6:"Tswana";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"tr";a:3:{i:0;s:7:"Turkish";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"tk";a:3:{i:0;s:7:"Turkmen";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"tw";a:3:{i:0;s:3:"Twi";i:1;s:0:"";i:2;a:0:{}}s:2:"ug";a:3:{i:0;s:14:"Uighur; Uyghur";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"uk";a:3:{i:0;s:9:"Ukrainian";i:1;s:82:"(n%10==1 && n%100!=11 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2)";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:4:"many";}}s:2:"ur";a:3:{i:0;s:4:"Urdu";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"uz";a:3:{i:0;s:5:"Uzbek";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ve";a:3:{i:0;s:5:"Venda";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"vi";a:3:{i:0;s:10:"Vietnamese";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"vo";a:3:{i:0;s:8:"Volapük";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"wa";a:3:{i:0;s:7:"Walloon";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"cy";a:3:{i:0;s:5:"Welsh";i:1;s:56:"n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n==3 ? 3 : n==6 ? 4 : 5";i:2;a:6:{i:0;s:4:"zero";i:1;s:3:"one";i:2;s:3:"two";i:3;s:3:"few";i:4;s:4:"many";i:5;s:5:"other";}}s:2:"fy";a:3:{i:0;s:15:"Western Frisian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"wo";a:3:{i:0;s:5:"Wolof";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"xh";a:3:{i:0;s:5:"Xhosa";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"yi";a:3:{i:0;s:7:"Yiddish";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"yo";a:3:{i:0;s:6:"Yoruba";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"za";a:3:{i:0;s:14:"Zhuang; Chuang";i:1;s:0:"";i:2;a:0:{}}s:2:"zu";a:3:{i:0;s:4:"Zulu";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}}s:7:"regions";a:249:{s:2:"AF";s:11:"Afghanistan";s:2:"AX";s:14:"Åland Islands";s:2:"AL";s:7:"Albania";s:2:"DZ";s:7:"Algeria";s:2:"AS";s:14:"American Samoa";s:2:"AD";s:7:"Andorra";s:2:"AO";s:6:"Angola";s:2:"AI";s:8:"Anguilla";s:2:"AQ";s:10:"Antarctica";s:2:"AG";s:19:"Antigua and Barbuda";s:2:"AR";s:9:"Argentina";s:2:"AM";s:7:"Armenia";s:2:"AW";s:5:"Aruba";s:2:"AU";s:9:"Australia";s:2:"AT";s:7:"Austria";s:2:"AZ";s:10:"Azerbaijan";s:2:"BS";s:7:"Bahamas";s:2:"BH";s:7:"Bahrain";s:2:"BD";s:10:"Bangladesh";s:2:"BB";s:8:"Barbados";s:2:"BY";s:7:"Belarus";s:2:"BE";s:7:"Belgium";s:2:"BZ";s:6:"Belize";s:2:"BJ";s:5:"Benin";s:2:"BM";s:7:"Bermuda";s:2:"BT";s:6:"Bhutan";s:2:"BO";s:31:"Bolivia, Plurinational State of";s:2:"BQ";s:32:"Bonaire, Sint Eustatius and Saba";s:2:"BA";s:22:"Bosnia and Herzegovina";s:2:"BW";s:8:"Botswana";s:2:"BV";s:13:"Bouvet Island";s:2:"BR";s:6:"Brazil";s:2:"IO";s:30:"British Indian Ocean Territory";s:2:"BN";s:17:"Brunei Darussalam";s:2:"BG";s:8:"Bulgaria";s:2:"BF";s:12:"Burkina Faso";s:2:"BI";s:7:"Burundi";s:2:"KH";s:8:"Cambodia";s:2:"CM";s:8:"Cameroon";s:2:"CA";s:6:"Canada";s:2:"CV";s:10:"Cape Verde";s:2:"KY";s:14:"Cayman Islands";s:2:"CF";s:24:"Central African Republic";s:2:"TD";s:4:"Chad";s:2:"CL";s:5:"Chile";s:2:"CN";s:5:"China";s:2:"CX";s:16:"Christmas Island";s:2:"CC";s:23:"Cocos (Keeling) Islands";s:2:"CO";s:8:"Colombia";s:2:"KM";s:7:"Comoros";s:2:"CG";s:5:"Congo";s:2:"CD";s:37:"Congo, The Democratic Republic of The";s:2:"CK";s:12:"Cook Islands";s:2:"CR";s:10:"Costa Rica";s:2:"CI";s:14:"Côte D\'Ivoire";s:2:"HR";s:7:"Croatia";s:2:"CU";s:4:"Cuba";s:2:"CW";s:8:"Curaçao";s:2:"CY";s:6:"Cyprus";s:2:"CZ";s:14:"Czech Republic";s:2:"DK";s:7:"Denmark";s:2:"DJ";s:8:"Djibouti";s:2:"DM";s:8:"Dominica";s:2:"DO";s:18:"Dominican Republic";s:2:"EC";s:7:"Ecuador";s:2:"EG";s:5:"Egypt";s:2:"SV";s:11:"El Salvador";s:2:"GQ";s:17:"Equatorial Guinea";s:2:"ER";s:7:"Eritrea";s:2:"EE";s:7:"Estonia";s:2:"ET";s:8:"Ethiopia";s:2:"FK";s:27:"Falkland Islands (Malvinas)";s:2:"FO";s:13:"Faroe Islands";s:2:"FJ";s:4:"Fiji";s:2:"FI";s:7:"Finland";s:2:"FR";s:6:"France";s:2:"GF";s:13:"French Guiana";s:2:"PF";s:16:"French Polynesia";s:2:"TF";s:27:"French Southern Territories";s:2:"GA";s:5:"Gabon";s:2:"GM";s:6:"Gambia";s:2:"GE";s:7:"Georgia";s:2:"DE";s:7:"Germany";s:2:"GH";s:5:"Ghana";s:2:"GI";s:9:"Gibraltar";s:2:"GR";s:6:"Greece";s:2:"GL";s:9:"Greenland";s:2:"GD";s:7:"Grenada";s:2:"GP";s:10:"Guadeloupe";s:2:"GU";s:4:"Guam";s:2:"GT";s:9:"Guatemala";s:2:"GG";s:8:"Guernsey";s:2:"GN";s:6:"Guinea";s:2:"GW";s:13:"Guinea-Bissau";s:2:"GY";s:6:"Guyana";s:2:"HT";s:5:"Haiti";s:2:"HM";s:33:"Heard Island and Mcdonald Islands";s:2:"VA";s:29:"Holy See (Vatican City State)";s:2:"HN";s:8:"Honduras";s:2:"HK";s:9:"Hong Kong";s:2:"HU";s:7:"Hungary";s:2:"IS";s:7:"Iceland";s:2:"IN";s:5:"India";s:2:"ID";s:9:"Indonesia";s:2:"IR";s:25:"Iran, Islamic Republic of";s:2:"IQ";s:4:"Iraq";s:2:"IE";s:7:"Ireland";s:2:"IM";s:11:"Isle of Man";s:2:"IL";s:6:"Israel";s:2:"IT";s:5:"Italy";s:2:"JM";s:7:"Jamaica";s:2:"JP";s:5:"Japan";s:2:"JE";s:6:"Jersey";s:2:"JO";s:6:"Jordan";s:2:"KZ";s:10:"Kazakhstan";s:2:"KE";s:5:"Kenya";s:2:"KI";s:8:"Kiribati";s:2:"KP";s:38:"Korea, Democratic People\'s Republic of";s:2:"KR";s:18:"Korea, Republic of";s:2:"KW";s:6:"Kuwait";s:2:"KG";s:10:"Kyrgyzstan";s:2:"LA";s:32:"Lao People\'s Democratic Republic";s:2:"LV";s:6:"Latvia";s:2:"LB";s:7:"Lebanon";s:2:"LS";s:7:"Lesotho";s:2:"LR";s:7:"Liberia";s:2:"LY";s:5:"Libya";s:2:"LI";s:13:"Liechtenstein";s:2:"LT";s:9:"Lithuania";s:2:"LU";s:10:"Luxembourg";s:2:"MO";s:5:"Macao";s:2:"MK";s:42:"Macedonia, The Former Yugoslav Republic of";s:2:"MG";s:10:"Madagascar";s:2:"MW";s:6:"Malawi";s:2:"MY";s:8:"Malaysia";s:2:"MV";s:8:"Maldives";s:2:"ML";s:4:"Mali";s:2:"MT";s:5:"Malta";s:2:"MH";s:16:"Marshall Islands";s:2:"MQ";s:10:"Martinique";s:2:"MR";s:10:"Mauritania";s:2:"MU";s:9:"Mauritius";s:2:"YT";s:7:"Mayotte";s:2:"MX";s:6:"Mexico";s:2:"FM";s:31:"Micronesia, Federated States of";s:2:"MD";s:20:"Moldova, Republic of";s:2:"MC";s:6:"Monaco";s:2:"MN";s:8:"Mongolia";s:2:"ME";s:10:"Montenegro";s:2:"MS";s:10:"Montserrat";s:2:"MA";s:7:"Morocco";s:2:"MZ";s:10:"Mozambique";s:2:"MM";s:7:"Myanmar";s:2:"NA";s:7:"Namibia";s:2:"NR";s:5:"Nauru";s:2:"NP";s:5:"Nepal";s:2:"NL";s:11:"Netherlands";s:2:"NC";s:13:"New Caledonia";s:2:"NZ";s:11:"New Zealand";s:2:"NI";s:9:"Nicaragua";s:2:"NE";s:5:"Niger";s:2:"NG";s:7:"Nigeria";s:2:"NU";s:4:"Niue";s:2:"NF";s:14:"Norfolk Island";s:2:"MP";s:24:"Northern Mariana Islands";s:2:"NO";s:6:"Norway";s:2:"OM";s:4:"Oman";s:2:"PK";s:8:"Pakistan";s:2:"PW";s:5:"Palau";s:2:"PS";s:31:"Palestinian Territory, Occupied";s:2:"PA";s:6:"Panama";s:2:"PG";s:16:"Papua New Guinea";s:2:"PY";s:8:"Paraguay";s:2:"PE";s:4:"Peru";s:2:"PH";s:11:"Philippines";s:2:"PN";s:8:"Pitcairn";s:2:"PL";s:6:"Poland";s:2:"PT";s:8:"Portugal";s:2:"PR";s:11:"Puerto Rico";s:2:"QA";s:5:"Qatar";s:2:"RE";s:8:"Réunion";s:2:"RO";s:7:"Romania";s:2:"RU";s:18:"Russian Federation";s:2:"RW";s:6:"Rwanda";s:2:"BL";s:17:"Saint Barthélemy";s:2:"SH";s:44:"Saint Helena, Ascension and Tristan Da Cunha";s:2:"KN";s:21:"Saint Kitts and Nevis";s:2:"LC";s:11:"Saint Lucia";s:2:"MF";s:26:"Saint Martin (French Part)";s:2:"PM";s:25:"Saint Pierre and Miquelon";s:2:"VC";s:32:"Saint Vincent and The Grenadines";s:2:"WS";s:5:"Samoa";s:2:"SM";s:10:"San Marino";s:2:"ST";s:21:"Sao Tome and Principe";s:2:"SA";s:12:"Saudi Arabia";s:2:"SN";s:7:"Senegal";s:2:"RS";s:6:"Serbia";s:2:"SC";s:10:"Seychelles";s:2:"SL";s:12:"Sierra Leone";s:2:"SG";s:9:"Singapore";s:2:"SX";s:25:"Sint Maarten (Dutch Part)";s:2:"SK";s:8:"Slovakia";s:2:"SI";s:8:"Slovenia";s:2:"SB";s:15:"Solomon Islands";s:2:"SO";s:7:"Somalia";s:2:"ZA";s:12:"South Africa";s:2:"GS";s:44:"South Georgia and The South Sandwich Islands";s:2:"SS";s:11:"South Sudan";s:2:"ES";s:5:"Spain";s:2:"LK";s:9:"Sri Lanka";s:2:"SD";s:5:"Sudan";s:2:"SR";s:8:"Suriname";s:2:"SJ";s:22:"Svalbard and Jan Mayen";s:2:"SZ";s:9:"Swaziland";s:2:"SE";s:6:"Sweden";s:2:"CH";s:11:"Switzerland";s:2:"SY";s:20:"Syrian Arab Republic";s:2:"TW";s:25:"Taiwan, Province of China";s:2:"TJ";s:10:"Tajikistan";s:2:"TZ";s:28:"Tanzania, United Republic of";s:2:"TH";s:8:"Thailand";s:2:"TL";s:11:"Timor-Leste";s:2:"TG";s:4:"Togo";s:2:"TK";s:7:"Tokelau";s:2:"TO";s:5:"Tonga";s:2:"TT";s:19:"Trinidad and Tobago";s:2:"TN";s:7:"Tunisia";s:2:"TR";s:6:"Turkey";s:2:"TM";s:12:"Turkmenistan";s:2:"TC";s:24:"Turks and Caicos Islands";s:2:"TV";s:6:"Tuvalu";s:2:"UG";s:6:"Uganda";s:2:"UA";s:7:"Ukraine";s:2:"AE";s:20:"United Arab Emirates";s:2:"GB";s:14:"United Kingdom";s:2:"US";s:13:"United States";s:2:"UM";s:36:"United States Minor Outlying Islands";s:2:"UY";s:7:"Uruguay";s:2:"UZ";s:10:"Uzbekistan";s:2:"VU";s:7:"Vanuatu";s:2:"VE";s:33:"Venezuela, Bolivarian Republic of";s:2:"VN";s:8:"Viet Nam";s:2:"VG";s:23:"Virgin Islands, British";s:2:"VI";s:20:"Virgin Islands, U.S.";s:2:"WF";s:17:"Wallis and Futuna";s:2:"EH";s:14:"Western Sahara";s:2:"YE";s:5:"Yemen";s:2:"ZM";s:6:"Zambia";s:2:"ZW";s:8:"Zimbabwe";}}');
|
1 |
<?php
|
2 |
/**
|
3 |
* Compiled source built from Loco core. Do not edit!
|
4 |
+
* Tue, 07 Oct 2014 14:14:21 +0100
|
5 |
*/
|
6 |
+
function loco_language_country( $lang ){ static $a; if( ! isset($a) ){ $a = unserialize('a:80:{s:2:"af";s:2:"ZA";s:2:"ar";s:2:"AE";s:2:"az";s:2:"AZ";s:2:"bg";s:2:"BG";s:2:"bn";s:2:"BD";s:2:"bs";s:2:"BA";s:2:"ca";s:2:"ES";s:2:"cs";s:2:"CZ";s:2:"cy";s:2:"GB";s:2:"da";s:2:"DK";s:2:"de";s:2:"DE";s:2:"el";s:2:"GR";s:2:"en";s:2:"GB";s:2:"es";s:2:"ES";s:2:"et";s:2:"EE";s:2:"fa";s:2:"AF";s:2:"fi";s:2:"FI";s:2:"fo";s:2:"FO";s:2:"fr";s:2:"FR";s:2:"ga";s:2:"IE";s:2:"gl";s:2:"ES";s:2:"gn";s:2:"PY";s:2:"he";s:2:"IL";s:2:"hi";s:2:"IN";s:2:"hr";s:2:"HR";s:2:"ht";s:2:"HT";s:2:"hu";s:2:"HU";s:2:"hy";s:2:"AM";s:2:"id";s:2:"ID";s:2:"is";s:2:"IS";s:2:"it";s:2:"IT";s:2:"ja";s:2:"JP";s:2:"jv";s:2:"ID";s:2:"ka";s:2:"GE";s:2:"kk";s:2:"KZ";s:2:"kn";s:2:"IN";s:2:"ko";s:2:"KR";s:2:"lb";s:2:"LU";s:2:"li";s:2:"NL";s:2:"lo";s:2:"LA";s:2:"lt";s:2:"LT";s:2:"lv";s:2:"LV";s:2:"mg";s:2:"MG";s:2:"ms";s:2:"MY";s:2:"mt";s:2:"MT";s:2:"my";s:2:"MM";s:2:"nb";s:2:"NO";s:2:"ne";s:2:"NP";s:2:"nl";s:2:"NL";s:2:"nn";s:2:"NO";s:2:"no";s:2:"NO";s:2:"os";s:2:"RU";s:2:"pa";s:2:"IN";s:2:"pl";s:2:"PL";s:2:"pt";s:2:"PT";s:2:"ro";s:2:"RO";s:2:"ru";s:2:"RU";s:2:"sa";s:2:"IN";s:2:"sc";s:2:"IT";s:2:"sd";s:2:"PK";s:2:"si";s:2:"LK";s:2:"sk";s:2:"SK";s:2:"sl";s:2:"SI";s:2:"so";s:2:"SO";s:2:"sq";s:2:"AL";s:2:"sr";s:2:"RS";s:2:"su";s:2:"ID";s:2:"sv";s:2:"SE";s:2:"sw";s:2:"KE";s:2:"ta";s:2:"IN";s:2:"te";s:2:"IN";s:2:"tg";s:2:"TJ";s:2:"th";s:2:"TH";s:2:"tr";s:2:"TR";s:2:"ug";s:2:"CN";s:2:"uk";s:2:"UA";s:2:"ur";s:2:"IN";s:2:"uz";s:2:"UZ";s:2:"vi";s:2:"VN";s:2:"zh";s:2:"CN";}'); } if( isset($a[$lang]) ){ return $a[$lang]; } return ''; } return unserialize('a:3:{s:7:"locales";a:84:{s:2:"af";a:1:{s:2:"ZA";s:24:"Afrikaans (South Africa)";}s:2:"ar";a:3:{s:2:"AE";s:29:"Arabic (United Arab Emirates)";s:2:"IL";s:15:"Arabic (Israel)";s:2:"ZZ";s:6:"Arabic";}s:2:"az";a:3:{s:2:"AZ";s:24:"Azerbaijani (Azerbaijan)";s:2:"TR";s:20:"Azerbaijani (Turkey)";s:2:"ZZ";s:11:"Azerbaijani";}s:2:"bg";a:1:{s:2:"BG";s:9:"Bulgarian";}s:2:"bn";a:1:{s:2:"BD";s:20:"Bengali (Bangladesh)";}s:2:"bs";a:1:{s:2:"BA";s:30:"Bosnian (Bosnia & Herzegovina)";}s:2:"ca";a:2:{s:2:"ES";s:15:"Catalan (Spain)";s:2:"AD";s:17:"Catalan (Andorra)";}s:2:"cs";a:1:{s:2:"CZ";s:5:"Czech";}s:2:"cy";a:2:{s:2:"GB";s:5:"Welsh";s:2:"ZZ";s:5:"Welsh";}s:2:"da";a:1:{s:2:"DK";s:6:"Danish";}s:2:"de";a:3:{s:2:"DE";s:6:"German";s:2:"CH";s:20:"German (Switzerland)";s:2:"AT";s:16:"German (Austria)";}s:2:"el";a:3:{s:2:"GR";s:5:"Greek";s:2:"CY";s:14:"Greek (Cyprus)";s:2:"ZZ";s:5:"Greek";}s:2:"en";a:11:{s:2:"GB";s:12:"English (UK)";s:2:"IE";s:17:"English (Ireland)";s:2:"US";s:13:"English (USA)";s:2:"CA";s:16:"English (Canada)";s:2:"AU";s:19:"English (Australia)";s:2:"NZ";s:21:"English (New Zealand)";s:2:"HK";s:19:"English (Hong Kong)";s:2:"SG";s:19:"English (Singapore)";s:2:"AE";s:30:"English (United Arab Emirates)";s:2:"ZA";s:22:"English (South Africa)";s:2:"IN";s:15:"English (India)";}s:2:"es";a:19:{s:2:"ES";s:7:"Spanish";s:2:"MX";s:16:"Spanish (Mexico)";s:2:"AR";s:19:"Spanish (Argentina)";s:2:"BO";s:17:"Spanish (Bolivia)";s:2:"CL";s:15:"Spanish (Chile)";s:2:"CO";s:18:"Spanish (Colombia)";s:2:"CR";s:20:"Spanish (Costa Rica)";s:2:"CU";s:14:"Spanish (Cuba)";s:2:"DO";s:28:"Spanish (Dominican Republic)";s:2:"EC";s:17:"Spanish (Ecuador)";s:2:"SV";s:21:"Spanish (El Salvador)";s:2:"GT";s:19:"Spanish (Guatemala)";s:2:"HN";s:18:"Spanish (Honduras)";s:2:"NI";s:19:"Spanish (Nicaragua)";s:2:"PA";s:16:"Spanish (Panama)";s:2:"PY";s:18:"Spanish (Paraguay)";s:2:"PE";s:14:"Spanish (Peru)";s:2:"UY";s:17:"Spanish (Uruguay)";s:2:"VE";s:19:"Spanish (Venezuela)";}s:2:"et";a:2:{s:2:"EE";s:8:"Estonian";s:2:"ZZ";s:8:"Estonian";}s:2:"fa";a:2:{s:2:"AF";s:21:"Persian (Afghanistan)";s:2:"IR";s:14:"Persian (Iran)";}s:2:"fi";a:2:{s:2:"FI";s:7:"Finnish";s:2:"ZZ";s:7:"Finnish";}s:2:"fo";a:2:{s:2:"FO";s:23:"Faroese (Faroe Islands)";s:2:"DK";s:17:"Faroese (Denmark)";}s:2:"fr";a:5:{s:2:"FR";s:6:"French";s:2:"CH";s:20:"French (Switzerland)";s:2:"BE";s:16:"French (Belgium)";s:2:"HT";s:14:"French (Haiti)";s:2:"CA";s:15:"French (Canada)";}s:2:"ga";a:1:{s:2:"IE";s:15:"Irish (Ireland)";}s:2:"gl";a:1:{s:2:"ES";s:16:"Galician (Spain)";}s:2:"gn";a:1:{s:2:"PY";s:18:"Guarani (Paraguay)";}s:2:"he";a:1:{s:2:"IL";s:15:"Hebrew (Israel)";}s:2:"hi";a:1:{s:2:"IN";s:13:"Hindi (India)";}s:2:"hr";a:2:{s:2:"HR";s:8:"Croatian";s:2:"ZZ";s:8:"Croatian";}s:2:"ht";a:1:{s:2:"HT";s:14:"Haitian Creole";}s:2:"hu";a:1:{s:2:"HU";s:9:"Hungarian";}s:2:"hy";a:1:{s:2:"AM";s:8:"Armenian";}s:2:"id";a:1:{s:2:"ID";s:10:"Indonesian";}s:2:"is";a:1:{s:2:"IS";s:9:"Icelandic";}s:2:"it";a:2:{s:2:"IT";s:7:"Italian";s:2:"CH";s:21:"Italian (Switzerland)";}s:2:"ja";a:2:{s:2:"JP";s:8:"Japanese";s:2:"ZZ";s:8:"Japanese";}s:2:"jv";a:1:{s:2:"ID";s:20:"Javanese (Indonesia)";}s:2:"ka";a:1:{s:2:"GE";s:8:"Georgian";}s:2:"kk";a:1:{s:2:"KZ";s:6:"Kazakh";}s:2:"kn";a:2:{s:2:"IN";s:15:"Kannada (India)";s:2:"ZZ";s:7:"Kannada";}s:2:"ko";a:1:{s:2:"KR";s:6:"Korean";}s:2:"lb";a:1:{s:2:"LU";s:13:"Luxembourgish";}s:2:"li";a:1:{s:2:"NL";s:24:"Limburgish (Netherlands)";}s:2:"lo";a:1:{s:2:"LA";s:10:"Lao (Laos)";}s:2:"lt";a:1:{s:2:"LT";s:10:"Lithuanian";}s:2:"lv";a:2:{s:2:"LV";s:7:"Latvian";s:2:"ZZ";s:7:"Latvian";}s:2:"mg";a:1:{s:2:"MG";s:21:"Malagasy (Madagascar)";}s:2:"ms";a:1:{s:2:"MY";s:16:"Malay (Malaysia)";}s:2:"mt";a:1:{s:2:"MT";s:7:"Maltese";}s:2:"my";a:1:{s:2:"MM";s:17:"Burmese (Myanmar)";}s:2:"nb";a:1:{s:2:"NO";s:7:"Bokmål";}s:2:"ne";a:1:{s:2:"NP";s:6:"Nepali";}s:2:"nl";a:2:{s:2:"NL";s:5:"Dutch";s:2:"BE";s:15:"Dutch (Belgium)";}s:2:"nn";a:1:{s:2:"NO";s:7:"Nynorsk";}s:2:"no";a:1:{s:2:"NO";s:9:"Norwegian";}s:2:"os";a:4:{s:2:"RU";s:17:"Ossetian (Russia)";s:2:"TR";s:17:"Ossetian (Turkey)";s:2:"GE";s:18:"Ossetian (Georgia)";s:2:"ZZ";s:17:"Ossetian; Ossetic";}s:2:"pa";a:1:{s:2:"IN";s:15:"Punjabi (India)";}s:2:"pl";a:1:{s:2:"PL";s:6:"Polish";}s:2:"pt";a:2:{s:2:"PT";s:10:"Portuguese";s:2:"BR";s:19:"Portuguese (Brazil)";}s:2:"ro";a:1:{s:2:"RO";s:8:"Romanian";}s:2:"ru";a:2:{s:2:"RU";s:7:"Russian";s:2:"UA";s:17:"Russian (Ukraine)";}s:2:"sa";a:1:{s:2:"IN";s:16:"Sanskrit (India)";}s:2:"sc";a:1:{s:2:"IT";s:17:"Sardinian (Italy)";}s:2:"sd";a:1:{s:2:"PK";s:17:"Sindhi (Pakistan)";}s:2:"si";a:1:{s:2:"LK";s:19:"Sinhala (Sri Lanka)";}s:2:"sk";a:1:{s:2:"SK";s:6:"Slovak";}s:2:"sl";a:1:{s:2:"SI";s:9:"Slovenian";}s:2:"so";a:1:{s:2:"SO";s:6:"Somali";}s:2:"sq";a:2:{s:2:"AL";s:18:"Albanian (Albania)";s:2:"ZZ";s:8:"Albanian";}s:2:"sr";a:1:{s:2:"RS";s:7:"Serbian";}s:2:"su";a:1:{s:2:"ID";s:21:"Sundanese (Indonesia)";}s:2:"sv";a:1:{s:2:"SE";s:7:"Swedish";}s:2:"sw";a:5:{s:2:"KE";s:15:"Swahili (Kenya)";s:2:"UG";s:16:"Swahili (Uganda)";s:2:"TZ";s:18:"Swahili (Tanzania)";s:2:"KM";s:17:"Swahili (Comoros)";s:2:"ZZ";s:7:"Swahili";}s:2:"ta";a:2:{s:2:"IN";s:13:"Tamil (India)";s:2:"LK";s:17:"Tamil (Sri Lanka)";}s:2:"te";a:1:{s:2:"IN";s:14:"Telugu (India)";}s:2:"tg";a:1:{s:2:"TJ";s:18:"Tajik (Tajikistan)";}s:2:"th";a:2:{s:2:"TH";s:15:"Thai (Thailand)";s:2:"ZZ";s:4:"Thai";}s:2:"tr";a:1:{s:2:"TR";s:7:"Turkish";}s:2:"ug";a:1:{s:2:"CN";s:14:"Uyghur (China)";}s:2:"uk";a:2:{s:2:"UA";s:19:"Ukrainian (Ukraine)";s:2:"ZZ";s:9:"Ukrainian";}s:2:"ur";a:2:{s:2:"IN";s:12:"Urdu (India)";s:2:"PK";s:15:"Urdu (Pakistan)";}s:2:"uz";a:1:{s:2:"UZ";s:18:"Uzbek (Uzbekistan)";}s:2:"vi";a:2:{s:2:"VN";s:10:"Vietnamese";s:2:"ZZ";s:10:"Vietnamese";}s:2:"zh";a:3:{s:2:"CN";s:7:"Chinese";s:2:"HK";s:19:"Chinese (Hong Kong)";s:2:"TW";s:16:"Chinese (Taiwan)";}s:2:"eu";a:1:{s:2:"ZZ";s:6:"Basque";}s:2:"eo";a:1:{s:2:"ZZ";s:9:"Esperanto";}s:2:"fy";a:1:{s:2:"ZZ";s:15:"Western Frisian";}s:2:"gd";a:1:{s:2:"ZZ";s:23:"Gaelic; Scottish Gaelic";}}s:5:"langs";a:185:{s:2:"ab";a:3:{i:0;s:9:"Abkhazian";i:1;s:0:"";i:2;a:0:{}}s:2:"aa";a:3:{i:0;s:4:"Afar";i:1;s:0:"";i:2;a:0:{}}s:2:"af";a:3:{i:0;s:9:"Afrikaans";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ak";a:3:{i:0;s:4:"Akan";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"sq";a:3:{i:0;s:8:"Albanian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"am";a:3:{i:0;s:7:"Amharic";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ar";a:3:{i:0;s:6:"Arabic";i:1;s:95:"n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100 >= 3 && n%100<=10 ? 3 : n%100 >= 11 && n%100<=99 ? 4 : 5";i:2;a:6:{i:0;s:4:"zero";i:1;s:3:"one";i:2;s:3:"two";i:3;s:3:"few";i:4;s:4:"many";i:5;s:5:"other";}}s:2:"an";a:3:{i:0;s:9:"Aragonese";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"hy";a:3:{i:0;s:8:"Armenian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"as";a:3:{i:0;s:8:"Assamese";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"av";a:3:{i:0;s:6:"Avaric";i:1;s:0:"";i:2;a:0:{}}s:2:"ae";a:3:{i:0;s:7:"Avestan";i:1;s:0:"";i:2;a:0:{}}s:2:"ay";a:3:{i:0;s:6:"Aymara";i:1;s:0:"";i:2;a:0:{}}s:2:"az";a:3:{i:0;s:11:"Azerbaijani";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"bm";a:3:{i:0;s:7:"Bambara";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"ba";a:3:{i:0;s:7:"Bashkir";i:1;s:0:"";i:2;a:0:{}}s:2:"eu";a:3:{i:0;s:6:"Basque";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"be";a:3:{i:0;s:10:"Belarusian";i:1;s:82:"(n%10==1 && n%100!=11 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2)";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:4:"many";}}s:2:"bn";a:3:{i:0;s:7:"Bengali";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"bh";a:3:{i:0;s:6:"Bihari";i:1;s:28:"( n >= 0 && n <= 1 ) ? 0 : 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"bi";a:3:{i:0;s:7:"Bislama";i:1;s:0:"";i:2;a:0:{}}s:2:"bs";a:3:{i:0;s:7:"Bosnian";i:1;s:82:"(n%10==1 && n%100!=11 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2)";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:5:"other";}}s:2:"br";a:3:{i:0;s:6:"Breton";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"bg";a:3:{i:0;s:9:"Bulgarian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"my";a:3:{i:0;s:7:"Burmese";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"ca";a:3:{i:0;s:18:"Catalan; Valencian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ch";a:3:{i:0;s:8:"Chamorro";i:1;s:0:"";i:2;a:0:{}}s:2:"ce";a:3:{i:0;s:7:"Chechen";i:1;s:0:"";i:2;a:0:{}}s:2:"ny";a:3:{i:0;s:23:"Chichewa; Chewa; Nyanja";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"zh";a:3:{i:0;s:7:"Chinese";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"cu";a:3:{i:0;s:64:"Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old";i:1;s:0:"";i:2;a:0:{}}s:2:"cv";a:3:{i:0;s:7:"Chuvash";i:1;s:0:"";i:2;a:0:{}}s:2:"kw";a:3:{i:0;s:7:"Cornish";i:1;s:27:"n == 1 ? 0 : n == 2 ? 1 : 2";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"two";i:2;s:5:"other";}}s:2:"co";a:3:{i:0;s:8:"Corsican";i:1;s:0:"";i:2;a:0:{}}s:2:"cr";a:3:{i:0;s:4:"Cree";i:1;s:0:"";i:2;a:0:{}}s:2:"hr";a:3:{i:0;s:8:"Croatian";i:1;s:80:"n%10==1 && n%100!=11 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:5:"other";}}s:2:"cs";a:3:{i:0;s:5:"Czech";i:1;s:45:"( n == 1 ) ? 0 : ( n >= 2 && n <= 4 ) ? 1 : 2";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:5:"other";}}s:2:"da";a:3:{i:0;s:6:"Danish";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"dv";a:3:{i:0;s:26:"Divehi; Dhivehi; Maldivian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"nl";a:3:{i:0;s:14:"Dutch; Flemish";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"dz";a:3:{i:0;s:8:"Dzongkha";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"en";a:3:{i:0;s:7:"English";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"eo";a:3:{i:0;s:9:"Esperanto";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"et";a:3:{i:0;s:8:"Estonian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ee";a:3:{i:0;s:3:"Ewe";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"fo";a:3:{i:0;s:7:"Faroese";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"fj";a:3:{i:0;s:6:"Fijian";i:1;s:0:"";i:2;a:0:{}}s:2:"fi";a:3:{i:0;s:7:"Finnish";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"fr";a:3:{i:0;s:6:"French";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ff";a:3:{i:0;s:5:"Fulah";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"gd";a:3:{i:0;s:23:"Gaelic; Scottish Gaelic";i:1;s:26:"n < 2 ? 0 : n == 2 ? 1 : 2";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"two";i:2;s:5:"other";}}s:2:"gl";a:3:{i:0;s:8:"Galician";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"lg";a:3:{i:0;s:5:"Ganda";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ka";a:3:{i:0;s:8:"Georgian";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"de";a:3:{i:0;s:6:"German";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"el";a:3:{i:0;s:5:"Greek";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"gn";a:3:{i:0;s:7:"Guarani";i:1;s:0:"";i:2;a:0:{}}s:2:"gu";a:3:{i:0;s:8:"Gujarati";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ht";a:3:{i:0;s:23:"Haitian; Haitian Creole";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ha";a:3:{i:0;s:5:"Hausa";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"he";a:3:{i:0;s:6:"Hebrew";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"hz";a:3:{i:0;s:6:"Herero";i:1;s:0:"";i:2;a:0:{}}s:2:"hi";a:3:{i:0;s:5:"Hindi";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ho";a:3:{i:0;s:9:"Hiri Motu";i:1;s:0:"";i:2;a:0:{}}s:2:"hu";a:3:{i:0;s:9:"Hungarian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"is";a:3:{i:0;s:9:"Icelandic";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"io";a:3:{i:0;s:3:"Ido";i:1;s:0:"";i:2;a:0:{}}s:2:"ig";a:3:{i:0;s:4:"Igbo";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"id";a:3:{i:0;s:10:"Indonesian";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"ia";a:3:{i:0;s:58:"Interlingua (International Auxiliary Language Association)";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ie";a:3:{i:0;s:11:"Interlingue";i:1;s:0:"";i:2;a:0:{}}s:2:"iu";a:3:{i:0;s:9:"Inuktitut";i:1;s:27:"n == 1 ? 0 : n == 2 ? 1 : 2";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"two";i:2;s:5:"other";}}s:2:"ik";a:3:{i:0;s:7:"Inupiaq";i:1;s:0:"";i:2;a:0:{}}s:2:"ga";a:3:{i:0;s:5:"Irish";i:1;s:44:"n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4";i:2;a:5:{i:0;s:3:"one";i:1;s:3:"two";i:2;s:3:"few";i:3;s:4:"many";i:4;s:5:"other";}}s:2:"it";a:3:{i:0;s:7:"Italian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ja";a:3:{i:0;s:8:"Japanese";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"jv";a:3:{i:0;s:8:"Javanese";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"kl";a:3:{i:0;s:24:"Kalaallisut; Greenlandic";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"kn";a:3:{i:0;s:7:"Kannada";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"kr";a:3:{i:0;s:6:"Kanuri";i:1;s:0:"";i:2;a:0:{}}s:2:"ks";a:3:{i:0;s:8:"Kashmiri";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"kk";a:3:{i:0;s:6:"Kazakh";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"km";a:3:{i:0;s:5:"Khmer";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"ki";a:3:{i:0;s:14:"Kikuyu; Gikuyu";i:1;s:0:"";i:2;a:0:{}}s:2:"rw";a:3:{i:0;s:11:"Kinyarwanda";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ky";a:3:{i:0;s:7:"Kirghiz";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"kv";a:3:{i:0;s:4:"Komi";i:1;s:0:"";i:2;a:0:{}}s:2:"kg";a:3:{i:0;s:5:"Kongo";i:1;s:0:"";i:2;a:0:{}}s:2:"ko";a:3:{i:0;s:6:"Korean";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"kj";a:3:{i:0;s:18:"Kuanyama; Kwanyama";i:1;s:0:"";i:2;a:0:{}}s:2:"ku";a:3:{i:0;s:7:"Kurdish";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"lo";a:3:{i:0;s:3:"Lao";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"la";a:3:{i:0;s:5:"Latin";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"lv";a:3:{i:0;s:7:"Latvian";i:1;s:49:"n % 10 == 1 && n % 100 != 11 ? 0 : n != 0 ? 1 : 2";i:2;a:3:{i:0;s:3:"one";i:1;s:5:"other";i:2;s:4:"zero";}}s:2:"li";a:3:{i:0;s:32:"Limburgan; Limburger; Limburgish";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ln";a:3:{i:0;s:7:"Lingala";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"lt";a:3:{i:0;s:10:"Lithuanian";i:1;s:71:"(n%10==1 && n%100!=11 ? 0 : n%10 >= 2 &&(n%100<10||n%100 >= 20)? 1 : 2)";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:5:"other";}}s:2:"lu";a:3:{i:0;s:12:"Luba-Katanga";i:1;s:0:"";i:2;a:0:{}}s:2:"lb";a:3:{i:0;s:28:"Luxembourgish; Letzeburgesch";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"mk";a:3:{i:0;s:10:"Macedonian";i:1;s:40:"( n % 10 == 1 && n % 100 != 11 ) ? 0 : 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"mg";a:3:{i:0;s:8:"Malagasy";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ms";a:3:{i:0;s:5:"Malay";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"ml";a:3:{i:0;s:9:"Malayalam";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"mt";a:3:{i:0;s:7:"Maltese";i:1;s:75:"(n==1 ? 0 : n==0||( n%100>1 && n%100<11)? 1 :(n%100>10 && n%100<20)? 2 : 3)";i:2;a:4:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:4:"many";i:3;s:5:"other";}}s:2:"gv";a:3:{i:0;s:4:"Manx";i:1;s:43:"n%10==1 ? 0 : n%10==2 ? 1 : n%20==0 ? 2 : 3";i:2;a:4:{i:0;s:3:"one";i:1;s:3:"two";i:2;s:3:"few";i:3;s:5:"other";}}s:2:"mi";a:3:{i:0;s:5:"Maori";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"mr";a:3:{i:0;s:7:"Marathi";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"mh";a:3:{i:0;s:11:"Marshallese";i:1;s:0:"";i:2;a:0:{}}s:2:"mo";a:3:{i:0;s:9:"Moldavian";i:1;s:50:"n == 1 ? 0 : n % 100 >= 1 && n % 100 <= 19 ? 1 : 2";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:5:"other";}}s:2:"mn";a:3:{i:0;s:9:"Mongolian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"na";a:3:{i:0;s:5:"Nauru";i:1;s:0:"";i:2;a:0:{}}s:2:"nv";a:3:{i:0;s:14:"Navajo; Navaho";i:1;s:0:"";i:2;a:0:{}}s:2:"nd";a:3:{i:0;s:29:"Ndebele, North; North Ndebele";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"nr";a:3:{i:0;s:29:"Ndebele, South; South Ndebele";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"ng";a:3:{i:0;s:6:"Ndonga";i:1;s:0:"";i:2;a:0:{}}s:2:"ne";a:3:{i:0;s:6:"Nepali";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"se";a:3:{i:0;s:13:"Northern Sami";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"no";a:3:{i:0;s:9:"Norwegian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"nb";a:3:{i:0;s:17:"Norwegian Bokmål";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"nn";a:3:{i:0;s:17:"Norwegian Nynorsk";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"oc";a:3:{i:0;s:31:"Occitan (post 1500); Provençal";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"oj";a:3:{i:0;s:6:"Ojibwa";i:1;s:0:"";i:2;a:0:{}}s:2:"or";a:3:{i:0;s:5:"Oriya";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"om";a:3:{i:0;s:5:"Oromo";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"os";a:3:{i:0;s:17:"Ossetian; Ossetic";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"pi";a:3:{i:0;s:4:"Pali";i:1;s:0:"";i:2;a:0:{}}s:2:"pa";a:3:{i:0;s:16:"Panjabi; Punjabi";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"fa";a:3:{i:0;s:7:"Persian";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"pl";a:3:{i:0;s:6:"Polish";i:1;s:66:"(n==1 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2)";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:4:"many";}}s:2:"pt";a:3:{i:0;s:10:"Portuguese";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ps";a:3:{i:0;s:6:"Pushto";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"qu";a:3:{i:0;s:7:"Quechua";i:1;s:0:"";i:2;a:0:{}}s:2:"rm";a:3:{i:0;s:13:"Raeto-Romance";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ro";a:3:{i:0;s:8:"Romanian";i:1;s:56:"(n==1 ? 0 :(((n%100>19)||(( n%100==0)&&(n!=0)))? 2 : 1))";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:5:"other";}}s:2:"rn";a:3:{i:0;s:5:"Rundi";i:1;s:0:"";i:2;a:0:{}}s:2:"ru";a:3:{i:0;s:7:"Russian";i:1;s:82:"(n%10==1 && n%100!=11 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2)";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:4:"many";}}s:2:"sm";a:3:{i:0;s:6:"Samoan";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"sg";a:3:{i:0;s:5:"Sango";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"sa";a:3:{i:0;s:8:"Sanskrit";i:1;s:0:"";i:2;a:0:{}}s:2:"sc";a:3:{i:0;s:9:"Sardinian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"sr";a:3:{i:0;s:7:"Serbian";i:1;s:82:"(n%10==1 && n%100!=11 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2)";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:5:"other";}}s:2:"sn";a:3:{i:0;s:5:"Shona";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ii";a:3:{i:0;s:10:"Sichuan Yi";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"sd";a:3:{i:0;s:6:"Sindhi";i:1;s:0:"";i:2;a:0:{}}s:2:"si";a:3:{i:0;s:18:"Sinhala; Sinhalese";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"sk";a:3:{i:0;s:6:"Slovak";i:1;s:45:"( n == 1 ) ? 0 : ( n >= 2 && n <= 4 ) ? 1 : 2";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:5:"other";}}s:2:"sl";a:3:{i:0;s:9:"Slovenian";i:1;s:56:"n%100==1 ? 0 : n%100==2 ? 1 : n%100==3||n%100==4 ? 2 : 3";i:2;a:4:{i:0;s:3:"one";i:1;s:3:"two";i:2;s:3:"few";i:3;s:5:"other";}}s:2:"so";a:3:{i:0;s:6:"Somali";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"st";a:3:{i:0;s:15:"Sotho, Southern";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"es";a:3:{i:0;s:7:"Spanish";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"su";a:3:{i:0;s:9:"Sundanese";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"sw";a:3:{i:0;s:7:"Swahili";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ss";a:3:{i:0;s:5:"Swati";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"sv";a:3:{i:0;s:7:"Swedish";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"tl";a:3:{i:0;s:7:"Tagalog";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ty";a:3:{i:0;s:8:"Tahitian";i:1;s:0:"";i:2;a:0:{}}s:2:"tg";a:3:{i:0;s:5:"Tajik";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ta";a:3:{i:0;s:5:"Tamil";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"tt";a:3:{i:0;s:5:"Tatar";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"te";a:3:{i:0;s:6:"Telugu";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"th";a:3:{i:0;s:4:"Thai";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"bo";a:3:{i:0;s:7:"Tibetan";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"ti";a:3:{i:0;s:8:"Tigrinya";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"to";a:3:{i:0;s:21:"Tonga (Tonga Islands)";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"ts";a:3:{i:0;s:6:"Tsonga";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"tn";a:3:{i:0;s:6:"Tswana";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"tr";a:3:{i:0;s:7:"Turkish";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"tk";a:3:{i:0;s:7:"Turkmen";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"tw";a:3:{i:0;s:3:"Twi";i:1;s:0:"";i:2;a:0:{}}s:2:"ug";a:3:{i:0;s:14:"Uighur; Uyghur";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"uk";a:3:{i:0;s:9:"Ukrainian";i:1;s:82:"(n%10==1 && n%100!=11 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2)";i:2;a:3:{i:0;s:3:"one";i:1;s:3:"few";i:2;s:4:"many";}}s:2:"ur";a:3:{i:0;s:4:"Urdu";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"uz";a:3:{i:0;s:5:"Uzbek";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"ve";a:3:{i:0;s:5:"Venda";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"vi";a:3:{i:0;s:10:"Vietnamese";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"vo";a:3:{i:0;s:8:"Volapük";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"wa";a:3:{i:0;s:7:"Walloon";i:1;s:5:"n > 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"cy";a:3:{i:0;s:5:"Welsh";i:1;s:56:"n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n==3 ? 3 : n==6 ? 4 : 5";i:2;a:6:{i:0;s:4:"zero";i:1;s:3:"one";i:2;s:3:"two";i:3;s:3:"few";i:4;s:4:"many";i:5;s:5:"other";}}s:2:"fy";a:3:{i:0;s:15:"Western Frisian";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"wo";a:3:{i:0;s:5:"Wolof";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"xh";a:3:{i:0;s:5:"Xhosa";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"yi";a:3:{i:0;s:7:"Yiddish";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}s:2:"yo";a:3:{i:0;s:6:"Yoruba";i:1;s:1:"0";i:2;a:1:{i:0;s:5:"other";}}s:2:"za";a:3:{i:0;s:14:"Zhuang; Chuang";i:1;s:0:"";i:2;a:0:{}}s:2:"zu";a:3:{i:0;s:4:"Zulu";i:1;s:6:"n != 1";i:2;a:2:{i:0;s:3:"one";i:1;s:5:"other";}}}s:7:"regions";a:249:{s:2:"AF";s:11:"Afghanistan";s:2:"AX";s:14:"Åland Islands";s:2:"AL";s:7:"Albania";s:2:"DZ";s:7:"Algeria";s:2:"AS";s:14:"American Samoa";s:2:"AD";s:7:"Andorra";s:2:"AO";s:6:"Angola";s:2:"AI";s:8:"Anguilla";s:2:"AQ";s:10:"Antarctica";s:2:"AG";s:19:"Antigua and Barbuda";s:2:"AR";s:9:"Argentina";s:2:"AM";s:7:"Armenia";s:2:"AW";s:5:"Aruba";s:2:"AU";s:9:"Australia";s:2:"AT";s:7:"Austria";s:2:"AZ";s:10:"Azerbaijan";s:2:"BS";s:7:"Bahamas";s:2:"BH";s:7:"Bahrain";s:2:"BD";s:10:"Bangladesh";s:2:"BB";s:8:"Barbados";s:2:"BY";s:7:"Belarus";s:2:"BE";s:7:"Belgium";s:2:"BZ";s:6:"Belize";s:2:"BJ";s:5:"Benin";s:2:"BM";s:7:"Bermuda";s:2:"BT";s:6:"Bhutan";s:2:"BO";s:31:"Bolivia, Plurinational State of";s:2:"BQ";s:32:"Bonaire, Sint Eustatius and Saba";s:2:"BA";s:22:"Bosnia and Herzegovina";s:2:"BW";s:8:"Botswana";s:2:"BV";s:13:"Bouvet Island";s:2:"BR";s:6:"Brazil";s:2:"IO";s:30:"British Indian Ocean Territory";s:2:"BN";s:17:"Brunei Darussalam";s:2:"BG";s:8:"Bulgaria";s:2:"BF";s:12:"Burkina Faso";s:2:"BI";s:7:"Burundi";s:2:"KH";s:8:"Cambodia";s:2:"CM";s:8:"Cameroon";s:2:"CA";s:6:"Canada";s:2:"CV";s:10:"Cape Verde";s:2:"KY";s:14:"Cayman Islands";s:2:"CF";s:24:"Central African Republic";s:2:"TD";s:4:"Chad";s:2:"CL";s:5:"Chile";s:2:"CN";s:5:"China";s:2:"CX";s:16:"Christmas Island";s:2:"CC";s:23:"Cocos (Keeling) Islands";s:2:"CO";s:8:"Colombia";s:2:"KM";s:7:"Comoros";s:2:"CG";s:5:"Congo";s:2:"CD";s:37:"Congo, The Democratic Republic of The";s:2:"CK";s:12:"Cook Islands";s:2:"CR";s:10:"Costa Rica";s:2:"CI";s:14:"Côte D\'Ivoire";s:2:"HR";s:7:"Croatia";s:2:"CU";s:4:"Cuba";s:2:"CW";s:8:"Curaçao";s:2:"CY";s:6:"Cyprus";s:2:"CZ";s:14:"Czech Republic";s:2:"DK";s:7:"Denmark";s:2:"DJ";s:8:"Djibouti";s:2:"DM";s:8:"Dominica";s:2:"DO";s:18:"Dominican Republic";s:2:"EC";s:7:"Ecuador";s:2:"EG";s:5:"Egypt";s:2:"SV";s:11:"El Salvador";s:2:"GQ";s:17:"Equatorial Guinea";s:2:"ER";s:7:"Eritrea";s:2:"EE";s:7:"Estonia";s:2:"ET";s:8:"Ethiopia";s:2:"FK";s:27:"Falkland Islands (Malvinas)";s:2:"FO";s:13:"Faroe Islands";s:2:"FJ";s:4:"Fiji";s:2:"FI";s:7:"Finland";s:2:"FR";s:6:"France";s:2:"GF";s:13:"French Guiana";s:2:"PF";s:16:"French Polynesia";s:2:"TF";s:27:"French Southern Territories";s:2:"GA";s:5:"Gabon";s:2:"GM";s:6:"Gambia";s:2:"GE";s:7:"Georgia";s:2:"DE";s:7:"Germany";s:2:"GH";s:5:"Ghana";s:2:"GI";s:9:"Gibraltar";s:2:"GR";s:6:"Greece";s:2:"GL";s:9:"Greenland";s:2:"GD";s:7:"Grenada";s:2:"GP";s:10:"Guadeloupe";s:2:"GU";s:4:"Guam";s:2:"GT";s:9:"Guatemala";s:2:"GG";s:8:"Guernsey";s:2:"GN";s:6:"Guinea";s:2:"GW";s:13:"Guinea-Bissau";s:2:"GY";s:6:"Guyana";s:2:"HT";s:5:"Haiti";s:2:"HM";s:33:"Heard Island and Mcdonald Islands";s:2:"VA";s:29:"Holy See (Vatican City State)";s:2:"HN";s:8:"Honduras";s:2:"HK";s:9:"Hong Kong";s:2:"HU";s:7:"Hungary";s:2:"IS";s:7:"Iceland";s:2:"IN";s:5:"India";s:2:"ID";s:9:"Indonesia";s:2:"IR";s:25:"Iran, Islamic Republic of";s:2:"IQ";s:4:"Iraq";s:2:"IE";s:7:"Ireland";s:2:"IM";s:11:"Isle of Man";s:2:"IL";s:6:"Israel";s:2:"IT";s:5:"Italy";s:2:"JM";s:7:"Jamaica";s:2:"JP";s:5:"Japan";s:2:"JE";s:6:"Jersey";s:2:"JO";s:6:"Jordan";s:2:"KZ";s:10:"Kazakhstan";s:2:"KE";s:5:"Kenya";s:2:"KI";s:8:"Kiribati";s:2:"KP";s:38:"Korea, Democratic People\'s Republic of";s:2:"KR";s:18:"Korea, Republic of";s:2:"KW";s:6:"Kuwait";s:2:"KG";s:10:"Kyrgyzstan";s:2:"LA";s:32:"Lao People\'s Democratic Republic";s:2:"LV";s:6:"Latvia";s:2:"LB";s:7:"Lebanon";s:2:"LS";s:7:"Lesotho";s:2:"LR";s:7:"Liberia";s:2:"LY";s:5:"Libya";s:2:"LI";s:13:"Liechtenstein";s:2:"LT";s:9:"Lithuania";s:2:"LU";s:10:"Luxembourg";s:2:"MO";s:5:"Macao";s:2:"MK";s:42:"Macedonia, The Former Yugoslav Republic of";s:2:"MG";s:10:"Madagascar";s:2:"MW";s:6:"Malawi";s:2:"MY";s:8:"Malaysia";s:2:"MV";s:8:"Maldives";s:2:"ML";s:4:"Mali";s:2:"MT";s:5:"Malta";s:2:"MH";s:16:"Marshall Islands";s:2:"MQ";s:10:"Martinique";s:2:"MR";s:10:"Mauritania";s:2:"MU";s:9:"Mauritius";s:2:"YT";s:7:"Mayotte";s:2:"MX";s:6:"Mexico";s:2:"FM";s:31:"Micronesia, Federated States of";s:2:"MD";s:20:"Moldova, Republic of";s:2:"MC";s:6:"Monaco";s:2:"MN";s:8:"Mongolia";s:2:"ME";s:10:"Montenegro";s:2:"MS";s:10:"Montserrat";s:2:"MA";s:7:"Morocco";s:2:"MZ";s:10:"Mozambique";s:2:"MM";s:7:"Myanmar";s:2:"NA";s:7:"Namibia";s:2:"NR";s:5:"Nauru";s:2:"NP";s:5:"Nepal";s:2:"NL";s:11:"Netherlands";s:2:"NC";s:13:"New Caledonia";s:2:"NZ";s:11:"New Zealand";s:2:"NI";s:9:"Nicaragua";s:2:"NE";s:5:"Niger";s:2:"NG";s:7:"Nigeria";s:2:"NU";s:4:"Niue";s:2:"NF";s:14:"Norfolk Island";s:2:"MP";s:24:"Northern Mariana Islands";s:2:"NO";s:6:"Norway";s:2:"OM";s:4:"Oman";s:2:"PK";s:8:"Pakistan";s:2:"PW";s:5:"Palau";s:2:"PS";s:31:"Palestinian Territory, Occupied";s:2:"PA";s:6:"Panama";s:2:"PG";s:16:"Papua New Guinea";s:2:"PY";s:8:"Paraguay";s:2:"PE";s:4:"Peru";s:2:"PH";s:11:"Philippines";s:2:"PN";s:8:"Pitcairn";s:2:"PL";s:6:"Poland";s:2:"PT";s:8:"Portugal";s:2:"PR";s:11:"Puerto Rico";s:2:"QA";s:5:"Qatar";s:2:"RE";s:8:"Réunion";s:2:"RO";s:7:"Romania";s:2:"RU";s:18:"Russian Federation";s:2:"RW";s:6:"Rwanda";s:2:"BL";s:17:"Saint Barthélemy";s:2:"SH";s:44:"Saint Helena, Ascension and Tristan Da Cunha";s:2:"KN";s:21:"Saint Kitts and Nevis";s:2:"LC";s:11:"Saint Lucia";s:2:"MF";s:26:"Saint Martin (French Part)";s:2:"PM";s:25:"Saint Pierre and Miquelon";s:2:"VC";s:32:"Saint Vincent and The Grenadines";s:2:"WS";s:5:"Samoa";s:2:"SM";s:10:"San Marino";s:2:"ST";s:21:"Sao Tome and Principe";s:2:"SA";s:12:"Saudi Arabia";s:2:"SN";s:7:"Senegal";s:2:"RS";s:6:"Serbia";s:2:"SC";s:10:"Seychelles";s:2:"SL";s:12:"Sierra Leone";s:2:"SG";s:9:"Singapore";s:2:"SX";s:25:"Sint Maarten (Dutch Part)";s:2:"SK";s:8:"Slovakia";s:2:"SI";s:8:"Slovenia";s:2:"SB";s:15:"Solomon Islands";s:2:"SO";s:7:"Somalia";s:2:"ZA";s:12:"South Africa";s:2:"GS";s:44:"South Georgia and The South Sandwich Islands";s:2:"SS";s:11:"South Sudan";s:2:"ES";s:5:"Spain";s:2:"LK";s:9:"Sri Lanka";s:2:"SD";s:5:"Sudan";s:2:"SR";s:8:"Suriname";s:2:"SJ";s:22:"Svalbard and Jan Mayen";s:2:"SZ";s:9:"Swaziland";s:2:"SE";s:6:"Sweden";s:2:"CH";s:11:"Switzerland";s:2:"SY";s:20:"Syrian Arab Republic";s:2:"TW";s:25:"Taiwan, Province of China";s:2:"TJ";s:10:"Tajikistan";s:2:"TZ";s:28:"Tanzania, United Republic of";s:2:"TH";s:8:"Thailand";s:2:"TL";s:11:"Timor-Leste";s:2:"TG";s:4:"Togo";s:2:"TK";s:7:"Tokelau";s:2:"TO";s:5:"Tonga";s:2:"TT";s:19:"Trinidad and Tobago";s:2:"TN";s:7:"Tunisia";s:2:"TR";s:6:"Turkey";s:2:"TM";s:12:"Turkmenistan";s:2:"TC";s:24:"Turks and Caicos Islands";s:2:"TV";s:6:"Tuvalu";s:2:"UG";s:6:"Uganda";s:2:"UA";s:7:"Ukraine";s:2:"AE";s:20:"United Arab Emirates";s:2:"GB";s:14:"United Kingdom";s:2:"US";s:13:"United States";s:2:"UM";s:36:"United States Minor Outlying Islands";s:2:"UY";s:7:"Uruguay";s:2:"UZ";s:10:"Uzbekistan";s:2:"VU";s:7:"Vanuatu";s:2:"VE";s:33:"Venezuela, Bolivarian Republic of";s:2:"VN";s:8:"Viet Nam";s:2:"VG";s:23:"Virgin Islands, British";s:2:"VI";s:20:"Virgin Islands, U.S.";s:2:"WF";s:17:"Wallis and Futuna";s:2:"EH";s:14:"Western Sahara";s:2:"YE";s:5:"Yemen";s:2:"ZM";s:6:"Zambia";s:2:"ZW";s:8:"Zimbabwe";}}');
|
lib/loco-boot.php
CHANGED
@@ -8,7 +8,7 @@ abstract class Loco {
|
|
8 |
/** plugin namespace */
|
9 |
const NS = 'loco-translate';
|
10 |
|
11 |
-
const VERSION = '1.4.
|
12 |
const CAPABILITY = 'manage_options';
|
13 |
|
14 |
/* current plugin locale */
|
8 |
/** plugin namespace */
|
9 |
const NS = 'loco-translate';
|
10 |
|
11 |
+
const VERSION = '1.4.7';
|
12 |
const CAPABILITY = 'manage_options';
|
13 |
|
14 |
/* current plugin locale */
|
lib/loco-locales.php
CHANGED
@@ -58,7 +58,8 @@ final class LocoLocale {
|
|
58 |
}
|
59 |
|
60 |
public function icon_class(){
|
61 |
-
|
|
|
62 |
}
|
63 |
|
64 |
public function get_name(){
|
@@ -83,17 +84,22 @@ final class LocoLocale {
|
|
83 |
public static function init( $lc, $cc ){
|
84 |
extract( self::data() );
|
85 |
if( ! $cc ){
|
86 |
-
|
|
|
|
|
|
|
|
|
|
|
87 |
}
|
88 |
$label = '';
|
89 |
$locale = new LocoLocale( $lc, $cc );
|
90 |
-
//
|
91 |
if( isset($locales[$lc]) ){
|
92 |
-
|
93 |
-
|
94 |
-
$locale->
|
95 |
}
|
96 |
-
if( isset($locales[$lc][$cc]) ){
|
97 |
$locale->label = $locales[$lc][$cc];
|
98 |
}
|
99 |
}
|
@@ -140,15 +146,51 @@ final class LocoLocale {
|
|
140 |
* @return array
|
141 |
*/
|
142 |
public static function get_names(){
|
143 |
-
$names = array();
|
144 |
-
$
|
145 |
-
|
146 |
-
foreach( $
|
147 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
148 |
}
|
|
|
149 |
}
|
150 |
return $names;
|
151 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
152 |
|
153 |
}
|
154 |
|
58 |
}
|
59 |
|
60 |
public function icon_class(){
|
61 |
+
$cc = $this->region or $cc = self::default_region($this->lang) or $cc = 'zz';
|
62 |
+
return 'flag flag-'.strtolower($cc);
|
63 |
}
|
64 |
|
65 |
public function get_name(){
|
84 |
public static function init( $lc, $cc ){
|
85 |
extract( self::data() );
|
86 |
if( ! $cc ){
|
87 |
+
if( self::is_regionless($lc) ){
|
88 |
+
// Wordpress expects this locale to be regionless
|
89 |
+
}
|
90 |
+
else {
|
91 |
+
$cc = self::default_region($lc);
|
92 |
+
}
|
93 |
}
|
94 |
$label = '';
|
95 |
$locale = new LocoLocale( $lc, $cc );
|
96 |
+
// get locale name from our own list
|
97 |
if( isset($locales[$lc]) ){
|
98 |
+
$names = self::get_names();
|
99 |
+
if( ! $cc && isset($names[$lc]) ){
|
100 |
+
$locale->label = $names[$lc];
|
101 |
}
|
102 |
+
else if( isset($locales[$lc][$cc]) ){
|
103 |
$locale->label = $locales[$lc][$cc];
|
104 |
}
|
105 |
}
|
146 |
* @return array
|
147 |
*/
|
148 |
public static function get_names(){
|
149 |
+
static $names = array();
|
150 |
+
if( ! $names ){
|
151 |
+
$data = self::data();
|
152 |
+
foreach( $data['locales'] as $lc => $regions ){
|
153 |
+
$no_cc = self::is_regionless($lc);
|
154 |
+
foreach( $regions as $cc => $label ){
|
155 |
+
if( 'ZZ' === $cc ){
|
156 |
+
$names[$lc] = $label;
|
157 |
+
}
|
158 |
+
else if( $cc === $no_cc ){
|
159 |
+
// already have as regionless
|
160 |
+
}
|
161 |
+
else {
|
162 |
+
$names[$lc.'_'.$cc] = $label;
|
163 |
+
}
|
164 |
+
}
|
165 |
}
|
166 |
+
asort($names,SORT_ASC|SORT_NATURAL);
|
167 |
}
|
168 |
return $names;
|
169 |
+
}
|
170 |
+
|
171 |
+
|
172 |
+
|
173 |
+
/**
|
174 |
+
* Test whether a language code is considered regionless by Wordpress core.
|
175 |
+
* example: Thai is not "th_TH" but only "th"
|
176 |
+
*/
|
177 |
+
public static function is_regionless( $lc ){
|
178 |
+
$data = self::data();
|
179 |
+
if( ! isset($data['locales'][$lc]['ZZ']) ){
|
180 |
+
return false;
|
181 |
+
}
|
182 |
+
// return the default region for this language if there was to be one
|
183 |
+
return key($data['locales'][$lc]);
|
184 |
+
}
|
185 |
+
|
186 |
+
|
187 |
+
/**
|
188 |
+
* Alias to loco_language_country
|
189 |
+
*/
|
190 |
+
private static function default_region( $lang ){
|
191 |
+
self::data(); // <- ensure lazy load of libs
|
192 |
+
return loco_language_country( $lang );
|
193 |
+
}
|
194 |
|
195 |
}
|
196 |
|
lib/test/tests/LocalesTest.php
CHANGED
@@ -10,7 +10,16 @@ class LocalesTest extends PHPUnit_Framework_TestCase {
|
|
10 |
|
11 |
public function testGetAllLocales(){
|
12 |
$map = LocoLocale::get_names();
|
13 |
-
$this->assertCount(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
}
|
15 |
|
16 |
|
@@ -25,10 +34,22 @@ class LocalesTest extends PHPUnit_Framework_TestCase {
|
|
25 |
}
|
26 |
|
27 |
|
28 |
-
public function
|
29 |
-
$locale = loco_locale_resolve('
|
30 |
-
$this->assertEquals( '
|
31 |
-
$this->assertEquals( '
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
}
|
33 |
|
34 |
|
10 |
|
11 |
public function testGetAllLocales(){
|
12 |
$map = LocoLocale::get_names();
|
13 |
+
$this->assertCount( 137, $map );
|
14 |
+
return $map;
|
15 |
+
}
|
16 |
+
|
17 |
+
|
18 |
+
/**
|
19 |
+
* @depends testGetAllLocales
|
20 |
+
*/
|
21 |
+
public function testRegionlessLocalesInNames( array $map ){
|
22 |
+
$this->assertArrayHasKey( 'th', $map );
|
23 |
}
|
24 |
|
25 |
|
34 |
}
|
35 |
|
36 |
|
37 |
+
public function testLanguageResolvesToDefaultRegion(){
|
38 |
+
$locale = loco_locale_resolve('fr');
|
39 |
+
$this->assertEquals( 'French', $locale->get_name() );
|
40 |
+
$this->assertEquals( 'fr_FR', $locale->get_code() );
|
41 |
+
}
|
42 |
+
|
43 |
+
|
44 |
+
public function testRegionlessLanguageResolvesToLanguageOnly(){
|
45 |
+
$locale = loco_locale_resolve('th');
|
46 |
+
$this->assertEquals( 'Thai', $locale->get_name() );
|
47 |
+
$this->assertEquals( 'th', $locale->get_code() );
|
48 |
+
}
|
49 |
+
|
50 |
+
public function testRegionlessLocaleHasFlag(){
|
51 |
+
$locale = LocoLocale::init('th', null );
|
52 |
+
$this->assertEquals( 'flag flag-th', $locale->icon_class() );
|
53 |
}
|
54 |
|
55 |
|
lib/test/tests/UtilsTest.php
CHANGED
@@ -24,6 +24,9 @@ class UtilsTest extends PHPUnit_Framework_TestCase {
|
|
24 |
$this->assertEquals( 'en_GB', $locale->get_code() );
|
25 |
|
26 |
$locale = LocoAdmin::resolve_file_locale('/foo-ja.po');
|
|
|
|
|
|
|
27 |
$this->assertEquals( 'ja_JP', $locale->get_code() );
|
28 |
}
|
29 |
|
24 |
$this->assertEquals( 'en_GB', $locale->get_code() );
|
25 |
|
26 |
$locale = LocoAdmin::resolve_file_locale('/foo-ja.po');
|
27 |
+
$this->assertEquals( 'ja', $locale->get_code() );
|
28 |
+
|
29 |
+
$locale = LocoAdmin::resolve_file_locale('/foo-ja_jp.po');
|
30 |
$this->assertEquals( 'ja_JP', $locale->get_code() );
|
31 |
}
|
32 |
|
loco.php
CHANGED
@@ -4,7 +4,7 @@ Plugin Name: Loco Translate
|
|
4 |
Plugin URI: http://wordpress.org/extend/plugins/loco-translate
|
5 |
Description: Translate Wordpress plugins and themes directly in your browser
|
6 |
Author: Tim Whitlock
|
7 |
-
Version: 1.4.
|
8 |
Author URI: http://localise.biz/help/wordpress/translate-plugin
|
9 |
Text Domain: loco-translate
|
10 |
Domain Path: /languages/
|
4 |
Plugin URI: http://wordpress.org/extend/plugins/loco-translate
|
5 |
Description: Translate Wordpress plugins and themes directly in your browser
|
6 |
Author: Tim Whitlock
|
7 |
+
Version: 1.4.7
|
8 |
Author URI: http://localise.biz/help/wordpress/translate-plugin
|
9 |
Text Domain: loco-translate
|
10 |
Domain Path: /languages/
|
pub/js/lang/loco-translate-pl_PL.js
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Loco js export: JavaScript function
|
3 |
+
* Project: loco.js conversion
|
4 |
+
* Release: Working copy
|
5 |
+
* Locale: pl_PL, Polish
|
6 |
+
* Exported at: Wed, 06 Aug 2014 18:03:07 +0100
|
7 |
+
*/
|
8 |
+
loco = window.loco||{}, loco.t = function( pairs ){
|
9 |
+
|
10 |
+
// named plural forms
|
11 |
+
var pluralForms = ["one","few","many"];
|
12 |
+
|
13 |
+
// calc numeric index of a plural form (0-2)
|
14 |
+
function pluralIndex( n ){
|
15 |
+
return Number( (n==1 ? 0 : n%10 >= 2 && n%10<=4 &&(n%100<10||n%100 >= 20)? 1 : 2) );
|
16 |
+
}
|
17 |
+
|
18 |
+
// expose public t() function
|
19 |
+
return function( msgid1, msgid2, n ){
|
20 |
+
var value = pairs[msgid1];
|
21 |
+
// singular if no multiplier
|
22 |
+
if( null == n ){
|
23 |
+
n = 1;
|
24 |
+
}
|
25 |
+
// plurals stored as objects, e.g. { one: "" }
|
26 |
+
if( value instanceof Object ){
|
27 |
+
value = value[ pluralForms[ pluralIndex(n) ] || 'one' ];
|
28 |
+
}
|
29 |
+
return value || ( 1 === n ? msgid1 : msgid2 ) || msgid1 || '';
|
30 |
+
};
|
31 |
+
}(
|
32 |
+
{"Fuzzy":"Niepewny","File system permissions for %s":"Uprawnienia systemu plik\u00f3w dla %s","Back":"Wstecz","Get help":"Pomoc","Package details":"Detale paczki","Translations (PO)":"T\u0142umaczenia (PO)","Template (POT)":"Schemat (POT)","File permissions":"Uprawnienia plik\u00f3w","Extends: %s":"Rozszerza: %s","1 language":{"one":"1 j\u0119zyk","few":"%u j\u0119zyki","many":"%u j\u0119zyk\u00f3w"},"Updated":"Zaktualizowano","OK":"OK","Powered by":"Nap\u0119dzany przez","Loco may not work as expected":"Loco mo\u017ce nie dzia\u0142a\u0107 tak jak oczekujesz","Configure Loco Translate":"Konfiguruj Loco Translate","Compiling MO files":"Kompilowanie plik\u00f3w MO","Use built-in MO compiler.":"U\u017cyj wbudowanego kompilatora MO.","Use external command:":"U\u017cyj zewn\u0119trznej komendy:","Enter path to msgfmt on server":"Wpisz \u015bcie\u017ck\u0119 do msgfmt na serwerze","Generate hash tables":"Generuj tablice hash","Backing up PO files":"Zr\u00f3b kopi\u0119 zapasow\u0105 plik\u00f3w PO","Number of backups to keep of each file:":"Liczba kopii zapasowych ka\u017cdego pliku do przechowania:","Experimental features":"Funkcje eksperymentalne","Enable Wordpress core translations":"W\u0142\u0105cz t\u0142umaczenie silnika Wordpress","Save settings":"Zapisz ustawienia","Template file":"Plik schematu","Switch to...":"Zmie\u0144 na...","never":"nigdy","Save":"Zapisz","Download":"Pobierz","Sync":"Synchronizuj","Revert":"Przywr\u00f3\u0107","Add":"Dodaj","Del":"Usu\u0144","Filter translations":"Filtruj t\u0142umaczenia","Help":"Pomoc","Initialize new translations in %s":"Zainicjuj nowe t\u0142umaczenie w %s","Select from common languages":"Wybierz z cz\u0119stych j\u0119zyk\u00f3w","or enter any language code":"lub wpisz dowolny kod j\u0119zyka","create in <code>%s<\/code>":"stw\u00f3rz w <code>%s<\/code>","create in global languages directory":"stw\u00f3rz w globalny, katalogu j\u0119zyk\u00f3w","Start translating":"Zacznij t\u0142umaczy\u0107","New version available":"Nowa wersja jest dost\u0119pna","Upgrade to version %s of Loco Translate":"Zaktualizuj Loco Translate do wersji %s","Select a plugin or theme to translate":"Wybierz wtyczk\u0119 lub motyw do t\u0142umaczenia","Themes":"Motywy","Plugins":"Wtyczki","Core":"Silnik","%s fuzzy":"%s niepewnych","Failed to compile MO file with built-in compiler":"Niepowodzenie kompilacji pliku MO u\u017cywaj\u0105c wbudowanego kompilatora","File download failed":"B\u0142\u0105d pobierania pliku","Unknown language":"Nieznany j\u0119zyk","Some files not writable":"Niekt\u00f3re pliki s\u0105 tylko do odczytu","Some files missing":"Brakuj\u0105ce niekt\u00f3re pliki","\"%s\" folder not writable":"\"%s\" katalog jest tylko do odczytu","POT file not writable":"Plik POT jest tylko do odczytu","PO file not writable":"Plik PO jest tylko do odczytu","MO file not writable":"Plik MO jest tylko do odczytu","MO file not found":"Nie znaleziono pliku MO","Folder not writable":"Katalog jest tylko do odczytu","Folder not found":"Nie znaleziono katalogu","User does not have permission to manage translations":"U\u017cytkownik nie ma uprawnie\u0144 do zarz\u0105dzania t\u0142umaczeniami","Failed to compile MO file with %s, check your settings":"Nie uda\u0142o si\u0119 skompilowa\u0107 pliku MO u\u017cywaj\u0105c %s, sprawd\u017a ustawienia","Invalid data posted to server":"B\u0142\u0119dne dane wys\u0142ane do serwera","Package not found called %s":"Paczka o nazwie %s nie zosta\u0142a znaleziona","Web server cannot create backups in \"%s\". Fix file permissions or disable backups in settings":"Serwer www nie mo\u017ce utworzy\u0107 kopii w \"%s\". Popraw uprawnienia lub wy\u0142\u0105cz kopie zapasowe w ustawieniach","Web server cannot create \"%s\" directory in \"%s\". Fix file permissions or create it manually.":"Serwer www nie mo\u017ce utworzy\u0107 katalogu \"%s\". Popraw uprawnienia lub utw\u00f3rz go r\u0119cznie.","Web server cannot create files in the \"%s\" directory. Fix file permissions or use the download function.":"Serwer www nie mo\u017ce utworzy\u0107 plik\u00f3w w katalogu \"%s\". Popraw uprawnienia lub u\u017cyj funkcji pobierania.","%s file is not writable by the web server. Fix file permissions or download and copy to \"%s\/%s\".":"%s jest tylko do odczytu dla serwera www. Popraw uprawnienia lub pobierz i skopiuj do \"%s\/%s\".","Cannot create MO file":"Nie mo\u017cna utworzy\u0107 pliku MO","Cannot overwrite MO file":"Nie mo\u017cna nadpisa\u0107 pliku MO","Failed to write MO file":"B\u0142\u0105d zapisu pliku MO","No source files in this package, nothing to sync":"Brak plik\u00f3w \u017ar\u00f3d\u0142owych w tej paczce, nic do synchronizacji","No strings could be extracted from source files":"\u017badne linie nie mog\u0105 by\u0107 wyci\u0105gni\u0119te z plik\u00f3w \u017ar\u00f3d\u0142owych","Unknown error":"Nieznany b\u0142\u0105d","PO file saved":"Plik PO zapisany","and MO file compiled":"oraz plik MO skompilowany","Merged from %s":"Po\u0142\u0105czono z %s","Merged from source code":"Po\u0142\u0105czono z kodu \u017ar\u00f3d\u0142owego","Already up to date with %s":"Ju\u017c aktualne z %s","Already up to date with source code":"Ju\u017c aktualne z kodu \u017ar\u00f3d\u0142owego","1 new string added":{"one":"1 nowa linia dodana","few":"%s nowe linie dodano","many":"%s nowych linii dodano"},"1 obsolete string removed":{"one":"1 zb\u0119dna linia usuni\u0119ta","few":"%s zb\u0119dne linie usuni\u0119te","many":"%s zb\u0119dnych linii usuni\u0119to"},"Your changes will be lost if you continue without saving":"Utracisz aktualne zmiany je\u015bli b\u0119dziesz kontynuowa\u0142 bez zapisywania","Source text":"Tekst \u017ar\u00f3d\u0142owy","%s translation":"%s t\u0142umaczenie","Comments":"Komentarze","Context":"Kontekst","File check":"Sprawdzenie plik\u00f3w","PO file used as template. This will be renamed to %s on first save":"Plik PO u\u017cyty jako szablon. Nazwa zostanie zmieniona na % przy pierwszym zapisie","File cannot be created automatically. Fix the file permissions or use Download instead of Save":"Plik nie mo\u017ce by\u0107 utworzony automatycznie. Napraw uprawnienia albo u\u017cyj Pobierz zamiast Zapisz","%s file is empty":"Plik %s jest pusty","Run Sync to update from source code":"Uruchom synchronizacj\u0119 aby zaktualizowa\u0107 z kodu \u017ar\u00f3d\u0142owego","No strings could be extracted from source code":"Nie mo\u017cna wyci\u0105gn\u0105\u0107 \u017cadnych linii z kodu \u017ar\u00f3d\u0142owego","Run Sync to update from %s":"Uruchom synchronizacj\u0119 aby zaktualizowa\u0107 z %s","Source code has been modified, run Sync to update POT":"Kod \u017ar\u00f3d\u0142owy zosta\u0142 zaktualizowany, uruchom synchronizacj\u0119 aby zaktualizowa\u0107 plik POT","POT has been modified since PO file was saved, run Sync to update":"Plik POT zosta\u0142 zmieniony od czasu zapisu pliku PO, uruchom synchronizacj\u0119 aby zaktualizowa\u0107","Bad file path":"B\u0142\u0119dna \u015bcie\u017cka pliku","Empty or invalid %s file":"Pusty lub b\u0142\u0119dny plik %s","%s file has no header":"Plik %s nie ma nag\u0142\u00f3wka","New template":"Nowy szablon","New language":"Nowy j\u0119zyk","%s%% translated":"%s%% przet\u0142umaczono","1 string":{"one":"1 linia","few":"%s linie","many":"%s linii"},"%s untranslated":"%s nie przet\u0142umaczone","Loco, Translation Management":"Loco, Menad\u017cer T\u0142umacze\u0144","Manage translations":"Zarz\u0105dzaj t\u0142umaczeniami","Translation options":"Opcje t\u0142umacze\u0144","Loco Translate":"Loco Translate","Settings":"Ustawienia","Translation":"T\u0142umaczenie","Packages":"Paczki","Error":"B\u0142\u0105d","Warning":"Ostrze\u017cenie","Permission denied":"Odmowa dost\u0119pu","Settings saved":"Ustawienia zapisane","New PO file":"Nowy plik PO","You must specify a valid locale for a new PO file":"Musisz okre\u015bli\u0107 w\u0142a\u015bciwy region dla nowego pliku PO","No translatable strings found":"Brak dost\u0119pnych lini do t\u0142umaczenia","Cannot create a PO file.":"Nie mo\u017cna utworzy\u0107 pliku PO.","PO file already exists with locale %s":"Plik PO ju\u017c istnieje z regionu %s"}
|
33 |
+
);
|
readme.txt
CHANGED
@@ -2,8 +2,8 @@
|
|
2 |
Contributors: timwhitlock
|
3 |
Tags: translation, translators, localization, localisation, l10n, i18n, Gettext, POEdit, productivity
|
4 |
Requires at least: 3.5
|
5 |
-
Tested up to:
|
6 |
-
Stable tag: 1.4.
|
7 |
License: GPLv2 or later
|
8 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
9 |
|
@@ -22,6 +22,7 @@ Features include:
|
|
22 |
* Native MO file compilation without the need for Gettext on your system
|
23 |
* Support for PO features including comments, references and plural forms
|
24 |
* Configurable PO file backups
|
|
|
25 |
|
26 |
Official [Loco](https://localise.biz/) WordPress plugin by <a href="//twitter.com/timwhitlock">@timwhitlock</a> / <a rel="author" href="https://plus.google.com/106703751121449519322">Tim Whitlock</a>
|
27 |
|
@@ -34,13 +35,23 @@ Official [Loco](https://localise.biz/) WordPress plugin by <a href="//twitter.co
|
|
34 |
3. Go to *Loco Translate > Manage Translations* in the left-hand menu to start translating
|
35 |
|
36 |
|
37 |
-
|
38 |
|
39 |
-
1. Create a `languages`
|
40 |
-
2.
|
41 |
3. Find the theme or plugin in the list at *Loco Translate > Manage Translations*
|
42 |
4. Click `+ New language` and follow the on-screen prompts.
|
43 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
A quick guide on using the plugin is [available here](https://localise.biz/help/wordpress/translate-plugin), but make sure you're familiar with the conventions of [Translating Wordpress](http://codex.wordpress.org/Translating_WordPress) before you start.
|
45 |
|
46 |
Please note that this plugin doesn’t support Windows servers and the editor doesn't fully support MSIE<=8.
|
@@ -53,48 +64,63 @@ Please note that this plugin doesn’t support Windows servers and the editor do
|
|
53 |
No. It's for manually entering your own translations, but we do intend to be integrating some automatic translation services into the plugin soon.
|
54 |
|
55 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
56 |
= Why can't it extract any translatable strings from my code? =
|
57 |
|
58 |
The extraction process looks for Wordpress translation functions with string literal arguments, such as `__('Foo')`.
|
59 |
|
60 |
Using your own custom functions like `myTranslate('Foo')` won't work. Neither will using variables, such as `__( $foo )`.
|
61 |
|
62 |
-
|
63 |
-
|
64 |
-
All Loco Translate does is manage your translation process and organize your files. There is more to localizing your theme or plugin than just creating the files.
|
65 |
|
66 |
-
Make sure you're familiar with the conventions of [translating Wordpress](http://codex.wordpress.org/Translating_WordPress) and if you think Loco is saving invalid files or putting them in the wrong place, then open a [support ticket](http://wordpress.org/support/plugin/loco-translate).
|
67 |
|
|
|
68 |
|
|
|
69 |
|
70 |
-
|
71 |
|
72 |
-
There are some good reasons to do so, but you don't have to in order to use this plugin.
|
73 |
|
74 |
-
Loco Translate allows you to work purely with PO files and keep them up to date with the source code without the interim step of maintaining a POT file.
|
75 |
|
|
|
76 |
|
77 |
-
|
78 |
|
79 |
-
|
80 |
|
81 |
-
You shouldn't do this on a live server, only for developing your theme or plugin on a local server.
|
82 |
|
83 |
-
|
84 |
|
|
|
85 |
|
86 |
-
= How do I create MO files? =
|
87 |
|
88 |
-
|
89 |
|
90 |
-
|
91 |
-
|
92 |
|
93 |
|
94 |
= Does it support Windows? =
|
95 |
|
96 |
-
You can access the interface on Windows using Internet Explorer, but version 9 or above is recommended.
|
97 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
|
99 |
|
100 |
|
@@ -107,6 +133,15 @@ Loco Translate does not support Windows versions of PHP, so if your server runni
|
|
107 |
|
108 |
== Changelog ==
|
109 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
110 |
= 1.4.6 =
|
111 |
* Updated Swedish and Turkish translations
|
112 |
* Added Indonesian translations
|
@@ -204,7 +239,7 @@ Loco Translate does not support Windows versions of PHP, so if your server runni
|
|
204 |
|
205 |
== Upgrade Notice ==
|
206 |
|
207 |
-
= 1.4.
|
208 |
* Bug fixes and improvements.
|
209 |
|
210 |
|
@@ -227,4 +262,5 @@ These features are on our todo list. There's no particular timeframe for any of
|
|
227 |
* Russian translations by [Alexey Tkachenko](http://atkachenko.ru)
|
228 |
* Indonesian translations by [Ivan Lanin](https://twitter.com/ivanlanin)
|
229 |
* Italian translations by [ElectricFeet](http://wordpress.org/support/profile/electricfeet)
|
|
|
230 |
|
2 |
Contributors: timwhitlock
|
3 |
Tags: translation, translators, localization, localisation, l10n, i18n, Gettext, POEdit, productivity
|
4 |
Requires at least: 3.5
|
5 |
+
Tested up to: 4.0
|
6 |
+
Stable tag: 1.4.7
|
7 |
License: GPLv2 or later
|
8 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
9 |
|
22 |
* Native MO file compilation without the need for Gettext on your system
|
23 |
* Support for PO features including comments, references and plural forms
|
24 |
* Configurable PO file backups
|
25 |
+
* Built-in Wordpress locale codes
|
26 |
|
27 |
Official [Loco](https://localise.biz/) WordPress plugin by <a href="//twitter.com/timwhitlock">@timwhitlock</a> / <a rel="author" href="https://plus.google.com/106703751121449519322">Tim Whitlock</a>
|
28 |
|
35 |
3. Go to *Loco Translate > Manage Translations* in the left-hand menu to start translating
|
36 |
|
37 |
|
38 |
+
To translate your own theme or plugin, follow these steps:
|
39 |
|
40 |
+
1. Create a `languages` subdirectory in your plugin or theme's root directory
|
41 |
+
2. Ensure this directory writable by the web server
|
42 |
3. Find the theme or plugin in the list at *Loco Translate > Manage Translations*
|
43 |
4. Click `+ New language` and follow the on-screen prompts.
|
44 |
|
45 |
+
|
46 |
+
To translate someone else’s theme into your language, follow these steps:
|
47 |
+
|
48 |
+
1. Create the global languages directory exists at `wp-content/languages/themes`
|
49 |
+
2. Ensure this directory writable by the web server
|
50 |
+
3. Find the theme in the list at *Loco Translate > Manage Translations*
|
51 |
+
4. Click `+ New language` and follow the on-screen prompts.
|
52 |
+
|
53 |
+
|
54 |
+
|
55 |
A quick guide on using the plugin is [available here](https://localise.biz/help/wordpress/translate-plugin), but make sure you're familiar with the conventions of [Translating Wordpress](http://codex.wordpress.org/Translating_WordPress) before you start.
|
56 |
|
57 |
Please note that this plugin doesn’t support Windows servers and the editor doesn't fully support MSIE<=8.
|
64 |
No. It's for manually entering your own translations, but we do intend to be integrating some automatic translation services into the plugin soon.
|
65 |
|
66 |
|
67 |
+
= Why can't I see the translations appearing in my theme/plugin? =
|
68 |
+
|
69 |
+
All Loco Translate does is manage your translation process and organize your files, it does not run when people are visiting your site.
|
70 |
+
|
71 |
+
If you think Loco is saving invalid MO files or putting them in the wrong place, then open a [support ticket](http://wordpress.org/support/plugin/loco-translate),
|
72 |
+
but please see [this extended FAQ](https://wordpress.org/support/topic/faq-why-arent-my-translations-showing-up) before posting.
|
73 |
+
|
74 |
+
|
75 |
= Why can't it extract any translatable strings from my code? =
|
76 |
|
77 |
The extraction process looks for Wordpress translation functions with string literal arguments, such as `__('Foo')`.
|
78 |
|
79 |
Using your own custom functions like `myTranslate('Foo')` won't work. Neither will using variables, such as `__( $foo )`.
|
80 |
|
81 |
+
See [more tips on localizing your theme](https://localise.biz/help/wordpress/theme-localization).
|
|
|
|
|
82 |
|
|
|
83 |
|
84 |
+
= Do I need to create a POT (template) file? =
|
85 |
|
86 |
+
If you’re not familiar with the [Gettext](https://www.gnu.org/software/gettext/) workflow and don’t plan to distribute your plugin then you might want to work without a POT file.
|
87 |
|
88 |
+
There are some good reasons to maintain a POT file, but Loco Translate doesn’t require it and can sync your translations directly with your source code.
|
89 |
|
|
|
90 |
|
|
|
91 |
|
92 |
+
= Why do I get file warnings when I try to save translations? =
|
93 |
|
94 |
+
To save PO files directly to your site some files and directories must be writable by the web server. If you're unsure how to manage file permissions on your server, ask your system administrator or hosting provider.
|
95 |
|
96 |
+
If writable directories pose a security risk then restrict translation to a development server. The file permissions are only required for editing translations and not related to viewing them.
|
97 |
|
|
|
98 |
|
99 |
+
= How do I create MO files? =
|
100 |
|
101 |
+
Every time you save a PO file Loco Translate tries to compile a MO file in the same location. As above, ensure that the web server is able to write to disk, otherwise MO compilation will fail.
|
102 |
|
|
|
103 |
|
104 |
+
= Why do I get a syntax error when saving and syncing? =
|
105 |
|
106 |
+
This error means something has gone unexpectedly wrong on your server.
|
107 |
+
See [this extended FAQ](https://wordpress.org/support/topic/faq-what-is-causing-unexpected-tokencharacter-syntax-error) for some tips on what to do.
|
108 |
|
109 |
|
110 |
= Does it support Windows? =
|
111 |
|
112 |
+
You can access the interface on Windows using Internet Explorer, but version 9 or above is recommended.
|
113 |
+
|
114 |
+
Loco Translate does not support Windows versions of PHP, so if your server has a Windows operating system the plugin may not work properly.
|
115 |
+
|
116 |
+
|
117 |
+
= This is too technical; why doesn’t it just work? =
|
118 |
+
|
119 |
+
In most cases it does, but Loco Translate is not a standalone application - it runs on your server and extraneous factors occasionally cause problems. If the plugin is unable to handle a particular situation automatically then you might have to intervene, and there isn’t always a *non-technical* solution to a technical problem.
|
120 |
+
|
121 |
+
If you think there is a problem with Loco Translate you can open a [support ticket](https://wordpress.org/support/plugin/loco-translate) and provide as much relevant detail as possible.
|
122 |
+
|
123 |
+
If you have a suggestion on how to improve the experience of using Loco Translate then please [get in touch](https://localise.biz/contact).
|
124 |
|
125 |
|
126 |
|
133 |
|
134 |
== Changelog ==
|
135 |
|
136 |
+
= 1.4.8 =
|
137 |
+
* Added WPLANG warning for WP4 deprecation
|
138 |
+
* Added some FAQs
|
139 |
+
|
140 |
+
= 1.4.7 =
|
141 |
+
* Added Polish translations
|
142 |
+
* Tested in WP 4.0
|
143 |
+
* Add support for Wordpress's regionless locales
|
144 |
+
|
145 |
= 1.4.6 =
|
146 |
* Updated Swedish and Turkish translations
|
147 |
* Added Indonesian translations
|
239 |
|
240 |
== Upgrade Notice ==
|
241 |
|
242 |
+
= 1.4.7 =
|
243 |
* Bug fixes and improvements.
|
244 |
|
245 |
|
262 |
* Russian translations by [Alexey Tkachenko](http://atkachenko.ru)
|
263 |
* Indonesian translations by [Ivan Lanin](https://twitter.com/ivanlanin)
|
264 |
* Italian translations by [ElectricFeet](http://wordpress.org/support/profile/electricfeet)
|
265 |
+
* Polish translations by [Jerry1333](http://www.jerry1333.net)
|
266 |
|