├── CHANGELOG.md ├── COPYING ├── README.md ├── composer.lock ├── data ├── langdb.yaml └── language-data.json ├── src ├── LanguageUtil.php ├── index.js └── util │ └── ulsdata2json.php └── yaml-sort-checker.yml /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | Documentation can be found [here](https://language-data.readthedocs.io/en/latest/). Changelog is divided into the following sections, 4 | 5 | - [Language updates](#language-updates) 6 | - [PHP library updates](#php) 7 | - [Node.js library updates](#nodejs) 8 | 9 | ## Language updates 10 | 11 | ### 2024-07-12 12 | 1. [Add Latin script for Manchu (mnc-latn)](https://github.com/wikimedia/language-data/pull/263) 13 | 2. [Add Iban (iba)](https://github.com/wikimedia/language-data/pull/339) 14 | 3. [Change mui autonym according to Ethnologue](https://github.com/wikimedia/language-data/pull/341) 15 | 4. [Add Pothwari (phr)](https://github.com/wikimedia/language-data/pull/342) 16 | 5. [Correct script for taq-tfng](https://github.com/wikimedia/language-data/pull/343) 17 | 6. [Correct autonym for American Sign Language](https://github.com/wikimedia/language-data/pull/344) 18 | 7. [Add Ekpeye (ekp)](https://github.com/wikimedia/language-data/pull/346) 19 | 8. [Add Edo (bin)](https://github.com/wikimedia/language-data/pull/351) 20 | 9. [Add Waalii (wlx)](https://github.com/wikimedia/language-data/pull/352) 21 | 10. [Add Chitonga (toi) and Chiluvale (lue)](https://github.com/wikimedia/language-data/pull/350) 22 | 11. [Change autonym for tdd](https://github.com/wikimedia/language-data/pull/349) 23 | 12. [Update the autonym for ku-arab](https://github.com/wikimedia/language-data/pull/347) 24 | 13. [Add Interslavic (isv)](https://github.com/wikimedia/language-data/pull/353) 25 | 14. [Add Jakalteko (jac)](https://github.com/wikimedia/language-data/pull/354) 26 | 15. [Add Kihunde (hke)](https://github.com/wikimedia/language-data/pull/355) 27 | 16. [Rename wlx autonym](https://github.com/wikimedia/language-data/pull/356) 28 | 17. [Make a less ambiguous autonym for acf](https://github.com/wikimedia/language-data/pull/357) 29 | 18. [Add Torwali (trw)](https://github.com/wikimedia/language-data/pull/360) 30 | 19. [Add Abron (a.k.a. Bono, Brong, abr)](https://github.com/wikimedia/language-data/pull/358) 31 | 20. [Add Assyrian Neo-Aramaic (aii)](https://github.com/wikimedia/language-data/pull/359) 32 | 21. [Add Sheshi Kham (kip)](https://github.com/wikimedia/language-data/pull/365) 33 | 22. [Add Tamazight (Latin) (zgh-latn)](https://github.com/wikimedia/language-data/pull/366) 34 | 35 | ### 2024-04-15 36 | 1. [Add Ebira (igb)](https://github.com/wikimedia/language-data/pull/332) 37 | 2. [Add Petjoh (pey)](https://github.com/wikimedia/language-data/pull/335) 38 | 39 | ### 2024-01-24 40 | 1. [Add Western Apache](https://github.com/wikimedia/language-data/pull/321) 41 | 2. [Add Komering](https://github.com/wikimedia/language-data/pull/322) 42 | 3. [Add Nyoro (nyo) and Tooro (ttj)](https://github.com/wikimedia/language-data/pull/326) 43 | 4. [Update Mon (mnw) autonym](https://github.com/wikimedia/language-data/pull/325) 44 | 5. [Add Gondi and Kolami](https://github.com/wikimedia/language-data/pull/324) 45 | 6. [Add Nupe (nup)](https://github.com/wikimedia/language-data/pull/327) 46 | 47 | ### 2023-10-25 48 | 1. [Add Pintupi-Luritja](https://github.com/wikimedia/language-data/pull/310) 49 | 2. [Add Bole (bol) and Karekare (kai)](https://github.com/wikimedia/language-data/pull/311) 50 | 3. [Add Najdi (ars)](https://github.com/wikimedia/language-data/pull/312) 51 | 4. [Remove akan](https://github.com/wikimedia/language-data/pull/313) 52 | 5. [Add Dangme](https://github.com/wikimedia/language-data/pull/316) 53 | 54 | ### 2023-07-17 55 | 1. [Add Crimean Tatar (Romania)](https://github.com/wikimedia/language-data/pull/290) 56 | 2. [Add languages used in Wikimedia MinT](https://github.com/wikimedia/language-data/pull/292) 57 | 3. [Add Brazilian Sign Language](https://github.com/wikimedia/language-data/pull/298) 58 | 4. [Correct Choctaw autonym](https://github.com/wikimedia/language-data/pull/297) 59 | 5. [Update the autonym for Guadeloupean Creole (gcf)](https://github.com/wikimedia/language-data/pull/296) 60 | 6. [Add cpx with three variants](https://github.com/wikimedia/language-data/pull/299) 61 | 7. [Update Betawi (bew) autonym](https://github.com/wikimedia/language-data/pull/300) 62 | 8. [Run src/util/ulsdata2json.php](https://github.com/wikimedia/language-data/pull/301) 63 | 9. [Add script variants for Serbo-Croatian (sh-cyrl and sh-latn)](https://github.com/wikimedia/language-data/pull/271) 64 | 10. [Add wuu and yue variants by @amire80](https://github.com/wikimedia/language-data/pull/302) 65 | 11. [Split Buginese to Latin and Lontara script]( https://github.com/wikimedia/language-data/pull/304) 66 | 67 | ### 2023-04-17 68 | 1. [Add Hindko (hno)](https://github.com/wikimedia/language-data/pull/277) 69 | 2. [Add Hassaniya (mey)](https://github.com/wikimedia/language-data/pull/278) 70 | 3. [Add American English (en-us)](https://github.com/wikimedia/language-data/pull/264) 71 | 4. [Add Jèrriais (nrf-je) and Guernésiais (nrf-gg)](https://github.com/wikimedia/language-data/pull/259) 72 | 5. [Add Láadan (ldn)](https://github.com/wikimedia/language-data/pull/279) 73 | 6. [Add Levantine Arabic (apc)](https://github.com/wikimedia/language-data/pull/281) 74 | 7. [Add Haryanvi (bgc)](https://github.com/wikimedia/language-data/pull/283) 75 | 8. [Add Tausug (tsg)](https://github.com/wikimedia/language-data/pull/284) 76 | 9. [Add Dendi (ddn)](https://github.com/wikimedia/language-data/pull/285) 77 | 10. [Add Ibibio (ibb)](https://github.com/wikimedia/language-data/pull/286) 78 | 79 | ### 2023-01-24 80 | 1. [Add ajp language](https://github.com/wikimedia/language-data/pull/266) 81 | 2. [Add Kʋsaal and Dagaare languages](https://github.com/wikimedia/language-data/pull/265) 82 | 3. [Add Nzema (nzi) and bèrom (bom) languages](https://github.com/wikimedia/language-data/pull/268) 83 | 4. [Add Høgnorsk (nn-hognorsk)](https://github.com/wikimedia/language-data/pull/260) 84 | 5. [Add Romansh variants](https://github.com/wikimedia/language-data/pull/262) 85 | 6. [Add Monégasque (lij-mc)](https://github.com/wikimedia/language-data/pull/261) 86 | 7. [Add Manado language (xmm)](https://github.com/wikimedia/language-data/pull/269) 87 | 8. [Add Igala](https://github.com/wikimedia/language-data/pull/270) 88 | 9. [Fix Hawaiian (haw) autonym](https://github.com/wikimedia/language-data/pull/258) 89 | 10. [Add Arbëresh language (aae)](https://github.com/wikimedia/language-data/pull/272) 90 | 91 | ### 2022-10-27 92 | 1. [Add Wolaytta](https://github.com/wikimedia/language-data/pull/245) 93 | 2. [Add Kalanga (kck)](https://github.com/wikimedia/language-data/pull/244) 94 | 3. [Add Yonaguni (yoi)](https://github.com/wikimedia/language-data/pull/242) 95 | 4. [Fix Wolaytta autonym](https://github.com/wikimedia/language-data/pull/246) 96 | 5. [Fix Bunun autonym](https://github.com/wikimedia/language-data/pull/247) 97 | 6. [Add Esan language](https://github.com/wikimedia/language-data/pull/248) 98 | 7. [Fix the autonym of the Iñupiaq language](https://github.com/wikimedia/language-data/pull/250) 99 | 8. [Add Makassarese (mak)](https://github.com/wikimedia/language-data/pull/251) 100 | 9. [Add Iraqi Arabic (acm)](https://github.com/wikimedia/language-data/pull/252) 101 | 10. [Add Magahi](https://github.com/wikimedia/language-data/pull/254) 102 | 103 | ### 2022-07-07 104 | 1. [Rename Okinawan](https://github.com/wikimedia/language-data/pull/225) 105 | 2. [Update Kinyarwanda autonym](https://github.com/wikimedia/language-data/pull/227) 106 | 3. [Add Campidanese Sardinian (sro)](https://github.com/wikimedia/language-data/pull/228) 107 | 4. [Update autonym for the Efik language](https://github.com/wikimedia/language-data/pull/231) 108 | 5. [Add Tai Nüa (tdd)](https://github.com/wikimedia/language-data/pull/233) 109 | 6. [Add Bura](https://github.com/wikimedia/language-data/pull/237) 110 | 7. [Change Kanuri autonym to lowercase](https://github.com/wikimedia/language-data/pull/238) 111 | 112 | 113 | ### 2022-04-20 114 | 1. [Auto-update of region-language information](https://github.com/wikimedia/language-data/pull/200) 115 | 2. [Add shy-latn, uz-cyrl and uz-latn](https://github.com/wikimedia/language-data/pull/190) 116 | 3. [Add Fur (fvr)](https://github.com/wikimedia/language-data/pull/201) 117 | 4. [Add se-fi, se-no and se-se](https://github.com/wikimedia/language-data/pull/202) 118 | 5. [Update Toki Pona](https://github.com/wikimedia/language-data/pull/205) 119 | 6. [Rename Seediq (trv)](https://github.com/wikimedia/language-data/pull/207) 120 | 7. [Add the Moore language (mos)](https://github.com/wikimedia/language-data/pull/208) 121 | 8. [Add [ken] Kenyang](https://github.com/wikimedia/language-data/pull/210) 122 | 9. [Add the Bulu language (bum)](https://github.com/wikimedia/language-data/pull/211) 123 | 10. [Add Fante (fat)](https://github.com/wikimedia/language-data/pull/213) 124 | 11. [Add Pannonian Rusyn](https://github.com/wikimedia/language-data/pull/214) 125 | 12. [Fix the autonym for Rundi (rn)](https://github.com/wikimedia/language-data/pull/215) 126 | 13. [Add Efik (efi)](https://github.com/wikimedia/language-data/pull/217) 127 | 14. [Fix the geo data of Karay-a (krj)](https://github.com/wikimedia/language-data/pull/218) 128 | 15. [Redirect "Eastern Yiddish" (ydd) to Yiddish (yi)](https://github.com/wikimedia/language-data/pull/220) 129 | 16. [Change trp autonym](https://github.com/wikimedia/language-data/pull/223) 130 | 17. [Remove Livvi Karelian from Asia](https://github.com/wikimedia/language-data/pull/222) 131 | 132 | ### 2022-01-18 133 | Language data related changes, 134 | 1. [Add Aghem (agq) and Masana (mcn)](https://github.com/wikimedia/language-data/pull/183) 135 | 2. [Change names of Cyrillic-script languages to lowercase](https://github.com/wikimedia/language-data/pull/184) 136 | 3. [Add Ghanaian Pidgin (gpe)](https://github.com/wikimedia/language-data/pull/187) 137 | 4. [Split Northern Thai to nod and nod-thai](https://github.com/wikimedia/language-data/pull/186) 138 | 5. [Add Nawdm (nmz)](https://github.com/wikimedia/language-data/pull/185) 139 | 6. [Add Aja (ajg)](https://github.com/wikimedia/language-data/pull/188) 140 | 7. [Add Logooli (rag)](https://github.com/wikimedia/language-data/pull/189) 141 | 8. [Add Aleut languages](https://github.com/wikimedia/language-data/pull/192) 142 | 9. [Update Abkhaz autonym](https://github.com/wikimedia/language-data/pull/191) 143 | 10. [Update Nheengatu (yrl) autonym](https://github.com/wikimedia/language-data/pull/193) 144 | 11. [Fix the Angika (anp) autonym](https://github.com/wikimedia/language-data/pull/194) 145 | 12. [Add the Nyankore language (nyn)](https://github.com/wikimedia/language-data/pull/195) 146 | 147 | ### 2021-10-25 148 | Language data related changes, 149 | 1. [Add yrl to CO and VE countries](https://github.com/wikimedia/language-data/pull/170) 150 | 2. [Add Makhuwa (vmw)](https://github.com/wikimedia/language-data/pull/169) 151 | 3. [Add Pacific or America regions to rap, id, and zh](https://github.com/wikimedia/language-data/pull/171) 152 | 4. [Add the Pa'O language](https://github.com/wikimedia/language-data/pull/174) 153 | 5. [Update blk autonym](https://github.com/wikimedia/language-data/pull/177) 154 | 6. [Add Nigerian Pidgin (pcm)](https://github.com/wikimedia/language-data/pull/178) 155 | 7. [Rename gur to "farefare"](https://github.com/wikimedia/language-data/pull/176) 156 | 8. [Change the autonym for S'gaw Karen](https://github.com/wikimedia/language-data/pull/179) 157 | 158 | 159 | ### 2021-07-16 160 | Language data related changes, 161 | 1. [Add Levantive Arabic](https://github.com/wikimedia/language-data/pull/166) 162 | 2. [Add Siriono (srq) and update Cape Verdean (kea) capitalization](https://github.com/wikimedia/language-data/pull/163) 163 | 3. [Change lmo language name](https://github.com/wikimedia/language-data/pull/160) 164 | 4. [Add Rohingya as a language of Bangladesh and Burma](https://github.com/wikimedia/language-data/pull/162) 165 | 5. [Add the Paiwan language (pwn)](https://github.com/wikimedia/language-data/pull/161) 166 | 6. [Make 'ha' the primary code for Hausa](https://github.com/wikimedia/language-data/pull/158) 167 | 7. [Split language ciw to ciw and ojb](https://github.com/wikimedia/language-data/pull/157) 168 | 169 | ### 2021-04-01 170 | Language data related changes, 171 | 1. [Add Carpathian Romani](https://github.com/wikimedia/language-data/pull/140) 172 | 2. [Cleanup the data for the Talysh language](https://github.com/wikimedia/language-data/pull/142) 173 | 3. [Add Aruba Papiamento](https://github.com/wikimedia/language-data/pull/143) 174 | 4. [Add Rohg to rtlscripts](https://github.com/wikimedia/language-data/pull/144) 175 | 5. [Add Nuer language (nus)](https://github.com/wikimedia/language-data/pull/145) 176 | 6. [Update the autonym for guc](https://github.com/wikimedia/language-data/pull/147) 177 | 7. [Consistently use parentheses in Chinese-script autonyms](https://github.com/wikimedia/language-data/pull/148) 178 | 8. [Add nan-hani](https://github.com/wikimedia/language-data/pull/149) 179 | 9. [Add Belizean Creole (bzj)](https://github.com/wikimedia/language-data/pull/150) 180 | 10. [Add the Basaa language (bas)](https://github.com/wikimedia/language-data/pull/151) 181 | 11. [Add the Kom language (bkm)](https://github.com/wikimedia/language-data/pull/152) 182 | 183 | ### 2021-01-27 184 | Language data related changes, 185 | 1. [Update Min Dong Chinese languages](https://github.com/wikimedia/language-data/commit/190423dd29d16fcb44645313b864d794f6a4df36) 186 | 2. [Add the Tyap language (kcg)](https://github.com/wikimedia/language-data/commit/69074e24757a59ad9a20be4a28ddbe4285ae06a6) 187 | 3. [Change capitalization for koi, olo, and vro ](https://github.com/wikimedia/language-data/commit/17280471ccf691b4bd60970bfdada4d5a035d220) 188 | 4. [Add the Nias (nia) language](https://github.com/wikimedia/language-data/commit/762b7c5e0c93e1e7a61f16c6fbeef83d9139c7fb) 189 | 5. [Update the autonym of language shi](https://github.com/wikimedia/language-data/commit/4b7cee6c3d4c5ae67f1e4b80f9594fafc92cf8d1) 190 | 6. [Add Nanai and Gungbe languages](https://github.com/wikimedia/language-data/commit/c0f628fb15d9910982829904c17597583828cd9c) 191 | 7. [Add Rohingya language (rhg)](https://github.com/wikimedia/language-data/commit/f8bc4b8cd49a4964e8a5161a81c730037c8c30ed) 192 | 193 | ### 2020-10-27 194 | Language data related changes, 195 | 1. [Add a redirect from cbk-zam to cbk](https://github.com/wikimedia/language-data/pull/119) 196 | 197 | ### 2020-07-23 198 | Language data related changes, 199 | 1. [Change Madurese autonym to capital](https://github.com/wikimedia/language-data/pull/106) 200 | 2. [Add Nuxalk language](https://github.com/wikimedia/language-data/pull/108) 201 | 3. [Add Altay languages](https://github.com/wikimedia/language-data/pull/107) 202 | 4. [Add Obolo (ann) and Mara (mrh)](https://github.com/wikimedia/language-data/pull/109) 203 | 5. [Add Baoule (bci)](https://github.com/wikimedia/language-data/pull/110) 204 | 205 | ### 2020-05-26 206 | Language data related changes, 207 | 1. [Add shy-latn and szy](https://github.com/wikimedia/language-data/pull/76) 208 | 2. [Add Chukchi (ckt)](https://github.com/wikimedia/language-data/pull/78) 209 | 3. [Fix autonym for Kildin Sami (sjd)](https://github.com/wikimedia/language-data/pull/90) 210 | 4. [Change spelling of Innu-aimun autonym](https://github.com/wikimedia/language-data/pull/93) 211 | 5. [Add Sylheti ](https://github.com/wikimedia/language-data/pull/94) 212 | 6. [Split ary to ary-latn and ary-arab](https://github.com/wikimedia/language-data/pull/92) 213 | 7. [Add Middle East and Africa to relevant Arabic varieties](https://github.com/wikimedia/language-data/pull/92) 214 | 8. [Add Mongolian in vertical script ](https://github.com/wikimedia/language-data/pull/95) 215 | 9. [Add AM as a region for Venetian](https://github.com/wikimedia/language-data/pull/96) 216 | 10. [Add Madurese (mad)](https://github.com/wikimedia/language-data/pull/#104) 217 | 218 | ## PHP 219 | 220 | ### PHP 1.1.8 (2024-07-12) 221 | - See [language updates 2024-07-12](#2024-07-12) 222 | - [Update PHP dependencies](https://github.com/wikimedia/language-data/pull/363) 223 | 224 | ### PHP 1.1.7 (2024-04-15) 225 | - See [language updates 2024-04-15](#2024-04-15) 226 | - [Update PHP dependencies](https://github.com/wikimedia/language-data/pull/337) 227 | 228 | ### PHP 1.1.6 (2024-01-24) 229 | - See [language updates 2024-01-24](#2024-01-24) 230 | - [Update DEV dependencies](https://github.com/wikimedia/language-data/pull/328) 231 | 232 | ### PHP 1.1.5 (2023-10-25) 233 | - See [language updates 2023-10-25](#2023-10-25) 234 | - [Update DEV dependencies](https://github.com/wikimedia/language-data/pull/319) 235 | 236 | ### PHP 1.1.4 (2023-07-17) 237 | - See [language updates 2023-07-17](#2023-07-17) 238 | - [Update DEV dependencies](https://github.com/wikimedia/language-data/pull/305) 239 | 240 | ### PHP 1.1.3 (2023-04-17) 241 | - See [language updates 2023-04-17](#2023-04-17) 242 | - [Update DEV dependencies](https://github.com/wikimedia/language-data/pull/288) 243 | 244 | ### PHP 1.1.2 (2023-01-24) 245 | - See [language updates 2023-01-24](#2023-01-24) 246 | - [Drop support for PHP 7.2, and update dependencies](https://github.com/wikimedia/language-data/pull/275) 247 | 248 | ### PHP 1.1.1 (2022-10-27) 249 | - See [language updates 2022-10-27](#2022-10-27). 250 | - [Update DEV dependencies](https://github.com/wikimedia/language-data/pull/256) 251 | 252 | ### PHP 1.1.0 (2022-07-07) 253 | - See [language updates 2022-07-07](#2022-07-07). 254 | - [Update DEV dependencies](https://github.com/wikimedia/language-data/pull/239) 255 | 256 | ### PHP 1.0.9 (2022-04-20) 257 | - See [language updates 2022-04-20](#2022-04-20). 258 | - [Update DEV dependencies](https://github.com/wikimedia/language-data/pull/219) 259 | 260 | ### PHP 1.0.8 (2022-01-18) 261 | - See [language updates 2022-01-18](#2022-01-18). 262 | - [Update DEV dependencies](https://github.com/wikimedia/language-data/pull/197) 263 | 264 | ### PHP 1.0.7 (2021-10-25) 265 | - See [language updates 2021-10-25](#2021-10-25). 266 | 267 | ### PHP 1.0.6 (2021-07-16) 268 | - See [language updates 2021-07-16](#2021-07-16). 269 | 270 | ### PHP 1.0.5 (2021-04-01) 271 | - See [language updates 2021-04-01](#2021-04-01). 272 | 273 | ### PHP 1.0.4 (2021-01-27) 274 | - See [language updates 2021-01-27](#2021-01-27). 275 | 276 | ### PHP 1.0.3 (2020-10-27) 277 | - See [language updates 2020-10-27](#2020-10-27). 278 | - Update mediawiki-codesniffer to 31.0.0 279 | 280 | ### PHP 1.0.1 (2020-07-23) 281 | - See [language updates 2020-07-23](#2020-07-23). 282 | - No other changes 283 | 284 | ### PHP 1.0.0 (2020-05-26) 285 | - See [language updates 2020-05-20](#2020-05-20). 286 | - Add PHP support. [Documentation](https://language-data.readthedocs.io/en/latest/api/languagedata/languageutil.html). [Packagist](https://packagist.org/packages/wikimedia/language-data). 287 | 288 | ## Node.js 289 | 290 | ### Node.js 1.1.8 (2024-07-12) 291 | - See [language updates 2024-07-12](#2024-07-12) 292 | - [Update DEV dependencies](https://github.com/wikimedia/language-data/pull/361) 293 | 294 | ### Node.js 1.1.7 (2024-04-15) 295 | - See [language updates 2024-04-15](#2024-04-15) 296 | - [Update DEV dependencies](https://github.com/wikimedia/language-data/pull/336) 297 | 298 | ### Node.js 1.1.6 (2024-01-24) 299 | - See [language updates 2024-01-24](#2024-01-24) 300 | - [Update DEV dependencies](https://github.com/wikimedia/language-data/pull/329) 301 | 302 | ### Node.js 1.1.5 (2023-10-25) 303 | - See [language updates 2023-10-25](#2023-10-25) 304 | - Update DEV dependencies and fix security issues 305 | - https://github.com/wikimedia/language-data/pull/309 306 | - https://github.com/wikimedia/language-data/pull/317 307 | - https://github.com/wikimedia/language-data/pull/318 308 | 309 | ### Node.js 1.1.4 (2023-07-17) 310 | - See [language updates 2023-07-17](#2023-07-17) 311 | - [Update DEV dependencies](https://github.com/wikimedia/language-data/pull/306) 312 | 313 | ### Node.js 1.1.3 (2023-04-17) 314 | - See [language updates 2023-04-17](#2023-04-17) 315 | - [Update DEV dependencies](https://github.com/wikimedia/language-data/pull/287) 316 | 317 | ### Node.js 1.1.2 (2023-01-24) 318 | - See [language updates 2023-01-24](#2023-01-24) 319 | - [Drop support for Node.js 12 and update dependencies](https://github.com/wikimedia/language-data/pull/273) 320 | 321 | ### Node.js 1.1.1 (2022-10-27) 322 | - See [language updates 2022-10-27](#2022-10-27). 323 | - [Update DEV dependencies](https://github.com/wikimedia/language-data/pull/255) 324 | 325 | ### Node.js 1.1.0 (2022-07-07) 326 | - See [language updates 2022-07-07](#2022-07-07). 327 | - [Update DEV dependencies](https://github.com/wikimedia/language-data/pull/240) 328 | 329 | ### Node.js 1.0.9 (2022-04-20) 330 | - See [language updates 2022-04-20](#2022-04-20). 331 | - Update DEV dependencies to address security issues 332 | - https://github.com/wikimedia/language-data/pull/196 333 | - https://github.com/wikimedia/language-data/pull/204 334 | - https://github.com/wikimedia/language-data/pull/216 335 | 336 | ### Node.js 1.0.8 (2022-01-18) 337 | - See [language updates 2022-01-18](#2022-01-18). 338 | - Update minimum supported Node.js version to 12.0.0. 339 | - [Update DEV dependencies](https://github.com/wikimedia/language-data/pull/196) 340 | - Bump version from 1.0.4 to 1.0.8 to be same as the PHP library. 341 | 342 | ### Node.js 1.0.4 (2021-10-25) 343 | - See [language updates 2021-10-25](#2021-10-25) 344 | - [Update dependencies to add support for Node.js 14.x, 16.x](https://github.com/wikimedia/language-data/pull/173) 345 | - Security fixes for dev dependencies: 346 | - [Update ansi-regex for CVE-2021-3807](https://github.com/wikimedia/language-data/pull/180) 347 | - [Update path-parse for CVE-2021-23343](https://github.com/wikimedia/language-data/pull/172). 348 | 349 | ### Node.js 1.0.3 (2021-07-16) 350 | - See [language updates 2021-07-16](#2021-07-16). 351 | - [Security fix: Update glob-parent to 5.1.2](https://github.com/wikimedia/language-data/pull/164) 352 | 353 | ### Node.js 1.0.2 (2021-04-01) 354 | - See [language updates 2021-04-01](#2021-04-01). 355 | - [Fix y18n (required by mocha) related security warning](https://github.com/wikimedia/language-data/pull/153) 356 | 357 | ### Node.js 1.0.1 (2021-01-27) 358 | - See [language updates 2021-01-27](#2021-01-27). 359 | - [Return an empty array if there are no languages in territory](https://github.com/wikimedia/language-data/commit/4a6136095000a4ea9e9171dad36739a68861b24a) 360 | 361 | ### Node.js 1.0.0 (2020-10-27) 362 | - See [language updates 2020-10-27](#2020-10-27). 363 | - Bump eslint-config-wikimedia to 0.17.0 364 | - Bump minimum Node.js version to 10.x 365 | 366 | ### Node.js 0.2.2 (2020-07-28) 367 | - [Fix entrypoint in package.json](https://github.com/wikimedia/language-data/pull/116) 368 | 369 | ### Node.js 0.2.1 (2020-07-23) 370 | - See [language updates 2020-07-23](#2020-07-23). 371 | - Fix `npm audit` warnings. 372 | 373 | ### Node.js 0.2.0 (2020-05-26) 374 | - See [language updates 2020-05-20](#2020-05-20). 375 | - Fix `npm audit` warnings. 376 | - Update minimum supported Node.js version to 8.0.0. 377 | -------------------------------------------------------------------------------- /COPYING: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Language data and utilities 2 | 3 | [![npm][npm]][npm-url] 4 | [![node-build][node-build]][node-build-url] 5 | [![php-build][php-build]][php-build-url] 6 | 7 | This library contains language related data, and utility libraries written in PHP and Node.js to 8 | interact with that data. 9 | 10 | The language related data comprises of the following, 11 | 12 | 1. The script in which a language is written 13 | 2. The script code 14 | 3. The language code 15 | 4. The regions in which the language is spoken 16 | 5. The autonym - language name written in its own script 17 | 6. The directionality of the text 18 | 19 | This data is populated from the current version of 20 | [CLDR supplemental data](http://unicode.org/repos/cldr/trunk/common/supplemental/supplementalData.xml) 21 | and various other sources. 22 | 23 | ## Documentation 24 | 25 | 1. [Full documentation](https://language-data.readthedocs.io/en/latest/index.html) 26 | 2. [Using the PHP library](https://language-data.readthedocs.io/en/latest/index.html#using-the-php-library) 27 | * [PHP API documentation](https://language-data.readthedocs.io/en/latest/api/languagedata/languageutil.html) 28 | 3. [Using the Node.js library](https://language-data.readthedocs.io/en/latest/index.html#using-the-node-js-library) 29 | 4. [Adding Languages](https://language-data.readthedocs.io/en/latest/user/adding_new_language.html) 30 | 31 | [npm]: https://img.shields.io/npm/v/@wikimedia/language-data.svg 32 | [npm-url]: https://npmjs.com/package/@wikimedia/language-data 33 | [node-build]: https://github.com/wikimedia/language-data/workflows/Node.js%20build/badge.svg 34 | [node-build-url]: https://github.com/wikimedia/language-data/actions?query=workflow%3A%22Node.js+build%22 35 | [php-build]: https://github.com/wikimedia/language-data/workflows/PHP%20build/badge.svg 36 | [php-build-url]: https://github.com/wikimedia/language-data/actions?query=workflow%3A%22PHP+build%22 37 | 38 | ## Release schedule 39 | Similar to [MLEB](https://www.mediawiki.org/wiki/MediaWiki_Language_Extension_Bundle), this library 40 | will have a quarterly release schedule, and will be released along with MLEB. Intermediate releases 41 | will be made for important bug fixes. 42 | 43 | ## Changelog 44 | The full changelog is available in [CHANGELOG.md](https://github.com/wikimedia/language-data/blob/master/CHANGELOG.md). 45 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "1769e6b8fe45402a2efae146ce8e8605", 8 | "packages": [ 9 | { 10 | "name": "mustangostang/spyc", 11 | "version": "0.6.3", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/mustangostang/spyc.git", 15 | "reference": "4627c838b16550b666d15aeae1e5289dd5b77da0" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/mustangostang/spyc/zipball/4627c838b16550b666d15aeae1e5289dd5b77da0", 20 | "reference": "4627c838b16550b666d15aeae1e5289dd5b77da0", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=5.3.1" 25 | }, 26 | "require-dev": { 27 | "phpunit/phpunit": "4.3.*@dev" 28 | }, 29 | "type": "library", 30 | "extra": { 31 | "branch-alias": { 32 | "dev-master": "0.5.x-dev" 33 | } 34 | }, 35 | "autoload": { 36 | "files": [ 37 | "Spyc.php" 38 | ] 39 | }, 40 | "notification-url": "https://packagist.org/downloads/", 41 | "license": [ 42 | "MIT" 43 | ], 44 | "authors": [ 45 | { 46 | "name": "mustangostang", 47 | "email": "vlad.andersen@gmail.com" 48 | } 49 | ], 50 | "description": "A simple YAML loader/dumper class for PHP", 51 | "homepage": "https://github.com/mustangostang/spyc/", 52 | "keywords": [ 53 | "spyc", 54 | "yaml", 55 | "yml" 56 | ], 57 | "support": { 58 | "issues": "https://github.com/mustangostang/spyc/issues", 59 | "source": "https://github.com/mustangostang/spyc/tree/0.6.3" 60 | }, 61 | "time": "2019-09-10T13:16:29+00:00" 62 | } 63 | ], 64 | "packages-dev": [ 65 | { 66 | "name": "composer/semver", 67 | "version": "3.4.0", 68 | "source": { 69 | "type": "git", 70 | "url": "https://github.com/composer/semver.git", 71 | "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" 72 | }, 73 | "dist": { 74 | "type": "zip", 75 | "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", 76 | "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", 77 | "shasum": "" 78 | }, 79 | "require": { 80 | "php": "^5.3.2 || ^7.0 || ^8.0" 81 | }, 82 | "require-dev": { 83 | "phpstan/phpstan": "^1.4", 84 | "symfony/phpunit-bridge": "^4.2 || ^5" 85 | }, 86 | "type": "library", 87 | "extra": { 88 | "branch-alias": { 89 | "dev-main": "3.x-dev" 90 | } 91 | }, 92 | "autoload": { 93 | "psr-4": { 94 | "Composer\\Semver\\": "src" 95 | } 96 | }, 97 | "notification-url": "https://packagist.org/downloads/", 98 | "license": [ 99 | "MIT" 100 | ], 101 | "authors": [ 102 | { 103 | "name": "Nils Adermann", 104 | "email": "naderman@naderman.de", 105 | "homepage": "http://www.naderman.de" 106 | }, 107 | { 108 | "name": "Jordi Boggiano", 109 | "email": "j.boggiano@seld.be", 110 | "homepage": "http://seld.be" 111 | }, 112 | { 113 | "name": "Rob Bast", 114 | "email": "rob.bast@gmail.com", 115 | "homepage": "http://robbast.nl" 116 | } 117 | ], 118 | "description": "Semver library that offers utilities, version constraint parsing and validation.", 119 | "keywords": [ 120 | "semantic", 121 | "semver", 122 | "validation", 123 | "versioning" 124 | ], 125 | "support": { 126 | "irc": "ircs://irc.libera.chat:6697/composer", 127 | "issues": "https://github.com/composer/semver/issues", 128 | "source": "https://github.com/composer/semver/tree/3.4.0" 129 | }, 130 | "funding": [ 131 | { 132 | "url": "https://packagist.com", 133 | "type": "custom" 134 | }, 135 | { 136 | "url": "https://github.com/composer", 137 | "type": "github" 138 | }, 139 | { 140 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 141 | "type": "tidelift" 142 | } 143 | ], 144 | "time": "2023-08-31T09:50:34+00:00" 145 | }, 146 | { 147 | "name": "composer/spdx-licenses", 148 | "version": "1.5.8", 149 | "source": { 150 | "type": "git", 151 | "url": "https://github.com/composer/spdx-licenses.git", 152 | "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a" 153 | }, 154 | "dist": { 155 | "type": "zip", 156 | "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", 157 | "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", 158 | "shasum": "" 159 | }, 160 | "require": { 161 | "php": "^5.3.2 || ^7.0 || ^8.0" 162 | }, 163 | "require-dev": { 164 | "phpstan/phpstan": "^0.12.55", 165 | "symfony/phpunit-bridge": "^4.2 || ^5" 166 | }, 167 | "type": "library", 168 | "extra": { 169 | "branch-alias": { 170 | "dev-main": "1.x-dev" 171 | } 172 | }, 173 | "autoload": { 174 | "psr-4": { 175 | "Composer\\Spdx\\": "src" 176 | } 177 | }, 178 | "notification-url": "https://packagist.org/downloads/", 179 | "license": [ 180 | "MIT" 181 | ], 182 | "authors": [ 183 | { 184 | "name": "Nils Adermann", 185 | "email": "naderman@naderman.de", 186 | "homepage": "http://www.naderman.de" 187 | }, 188 | { 189 | "name": "Jordi Boggiano", 190 | "email": "j.boggiano@seld.be", 191 | "homepage": "http://seld.be" 192 | }, 193 | { 194 | "name": "Rob Bast", 195 | "email": "rob.bast@gmail.com", 196 | "homepage": "http://robbast.nl" 197 | } 198 | ], 199 | "description": "SPDX licenses list and validation library.", 200 | "keywords": [ 201 | "license", 202 | "spdx", 203 | "validator" 204 | ], 205 | "support": { 206 | "irc": "ircs://irc.libera.chat:6697/composer", 207 | "issues": "https://github.com/composer/spdx-licenses/issues", 208 | "source": "https://github.com/composer/spdx-licenses/tree/1.5.8" 209 | }, 210 | "funding": [ 211 | { 212 | "url": "https://packagist.com", 213 | "type": "custom" 214 | }, 215 | { 216 | "url": "https://github.com/composer", 217 | "type": "github" 218 | }, 219 | { 220 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 221 | "type": "tidelift" 222 | } 223 | ], 224 | "time": "2023-11-20T07:44:33+00:00" 225 | }, 226 | { 227 | "name": "dealerdirect/phpcodesniffer-composer-installer", 228 | "version": "v1.0.0", 229 | "source": { 230 | "type": "git", 231 | "url": "https://github.com/PHPCSStandards/composer-installer.git", 232 | "reference": "4be43904336affa5c2f70744a348312336afd0da" 233 | }, 234 | "dist": { 235 | "type": "zip", 236 | "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", 237 | "reference": "4be43904336affa5c2f70744a348312336afd0da", 238 | "shasum": "" 239 | }, 240 | "require": { 241 | "composer-plugin-api": "^1.0 || ^2.0", 242 | "php": ">=5.4", 243 | "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" 244 | }, 245 | "require-dev": { 246 | "composer/composer": "*", 247 | "ext-json": "*", 248 | "ext-zip": "*", 249 | "php-parallel-lint/php-parallel-lint": "^1.3.1", 250 | "phpcompatibility/php-compatibility": "^9.0", 251 | "yoast/phpunit-polyfills": "^1.0" 252 | }, 253 | "type": "composer-plugin", 254 | "extra": { 255 | "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" 256 | }, 257 | "autoload": { 258 | "psr-4": { 259 | "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" 260 | } 261 | }, 262 | "notification-url": "https://packagist.org/downloads/", 263 | "license": [ 264 | "MIT" 265 | ], 266 | "authors": [ 267 | { 268 | "name": "Franck Nijhof", 269 | "email": "franck.nijhof@dealerdirect.com", 270 | "homepage": "http://www.frenck.nl", 271 | "role": "Developer / IT Manager" 272 | }, 273 | { 274 | "name": "Contributors", 275 | "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" 276 | } 277 | ], 278 | "description": "PHP_CodeSniffer Standards Composer Installer Plugin", 279 | "homepage": "http://www.dealerdirect.com", 280 | "keywords": [ 281 | "PHPCodeSniffer", 282 | "PHP_CodeSniffer", 283 | "code quality", 284 | "codesniffer", 285 | "composer", 286 | "installer", 287 | "phpcbf", 288 | "phpcs", 289 | "plugin", 290 | "qa", 291 | "quality", 292 | "standard", 293 | "standards", 294 | "style guide", 295 | "stylecheck", 296 | "tests" 297 | ], 298 | "support": { 299 | "issues": "https://github.com/PHPCSStandards/composer-installer/issues", 300 | "source": "https://github.com/PHPCSStandards/composer-installer" 301 | }, 302 | "time": "2023-01-05T11:28:13+00:00" 303 | }, 304 | { 305 | "name": "doctrine/instantiator", 306 | "version": "1.5.0", 307 | "source": { 308 | "type": "git", 309 | "url": "https://github.com/doctrine/instantiator.git", 310 | "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" 311 | }, 312 | "dist": { 313 | "type": "zip", 314 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", 315 | "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", 316 | "shasum": "" 317 | }, 318 | "require": { 319 | "php": "^7.1 || ^8.0" 320 | }, 321 | "require-dev": { 322 | "doctrine/coding-standard": "^9 || ^11", 323 | "ext-pdo": "*", 324 | "ext-phar": "*", 325 | "phpbench/phpbench": "^0.16 || ^1", 326 | "phpstan/phpstan": "^1.4", 327 | "phpstan/phpstan-phpunit": "^1", 328 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 329 | "vimeo/psalm": "^4.30 || ^5.4" 330 | }, 331 | "type": "library", 332 | "autoload": { 333 | "psr-4": { 334 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 335 | } 336 | }, 337 | "notification-url": "https://packagist.org/downloads/", 338 | "license": [ 339 | "MIT" 340 | ], 341 | "authors": [ 342 | { 343 | "name": "Marco Pivetta", 344 | "email": "ocramius@gmail.com", 345 | "homepage": "https://ocramius.github.io/" 346 | } 347 | ], 348 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 349 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 350 | "keywords": [ 351 | "constructor", 352 | "instantiate" 353 | ], 354 | "support": { 355 | "issues": "https://github.com/doctrine/instantiator/issues", 356 | "source": "https://github.com/doctrine/instantiator/tree/1.5.0" 357 | }, 358 | "funding": [ 359 | { 360 | "url": "https://www.doctrine-project.org/sponsorship.html", 361 | "type": "custom" 362 | }, 363 | { 364 | "url": "https://www.patreon.com/phpdoctrine", 365 | "type": "patreon" 366 | }, 367 | { 368 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 369 | "type": "tidelift" 370 | } 371 | ], 372 | "time": "2022-12-30T00:15:36+00:00" 373 | }, 374 | { 375 | "name": "mediawiki/mediawiki-codesniffer", 376 | "version": "v43.0.0", 377 | "source": { 378 | "type": "git", 379 | "url": "https://github.com/wikimedia/mediawiki-tools-codesniffer.git", 380 | "reference": "c559bc02e87b0a969b6ed7380d7fa1d02738158b" 381 | }, 382 | "dist": { 383 | "type": "zip", 384 | "url": "https://api.github.com/repos/wikimedia/mediawiki-tools-codesniffer/zipball/c559bc02e87b0a969b6ed7380d7fa1d02738158b", 385 | "reference": "c559bc02e87b0a969b6ed7380d7fa1d02738158b", 386 | "shasum": "" 387 | }, 388 | "require": { 389 | "composer/semver": "3.3.2 || 3.4.0", 390 | "composer/spdx-licenses": "~1.5.2", 391 | "ext-json": "*", 392 | "ext-mbstring": "*", 393 | "php": ">=7.4.0", 394 | "phpcsstandards/phpcsextra": "1.1.2", 395 | "squizlabs/php_codesniffer": "3.8.1", 396 | "symfony/polyfill-php80": "^1.26.0" 397 | }, 398 | "require-dev": { 399 | "mediawiki/mediawiki-phan-config": "0.12.1", 400 | "mediawiki/minus-x": "1.1.1", 401 | "php-parallel-lint/php-console-highlighter": "1.0.0", 402 | "php-parallel-lint/php-parallel-lint": "1.3.2", 403 | "phpunit/phpunit": "9.5.28" 404 | }, 405 | "type": "phpcodesniffer-standard", 406 | "autoload": { 407 | "psr-4": { 408 | "MediaWiki\\Sniffs\\": "MediaWiki/Sniffs/", 409 | "MediaWiki\\Sniffs\\Tests\\": "MediaWiki/Tests/" 410 | } 411 | }, 412 | "notification-url": "https://packagist.org/downloads/", 413 | "license": [ 414 | "GPL-2.0-or-later" 415 | ], 416 | "description": "MediaWiki CodeSniffer Standards", 417 | "homepage": "https://www.mediawiki.org/wiki/Manual:Coding_conventions/PHP", 418 | "keywords": [ 419 | "codesniffer", 420 | "mediawiki" 421 | ], 422 | "support": { 423 | "source": "https://github.com/wikimedia/mediawiki-tools-codesniffer/tree/v43.0.0" 424 | }, 425 | "time": "2024-01-29T16:06:37+00:00" 426 | }, 427 | { 428 | "name": "myclabs/deep-copy", 429 | "version": "1.12.0", 430 | "source": { 431 | "type": "git", 432 | "url": "https://github.com/myclabs/DeepCopy.git", 433 | "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" 434 | }, 435 | "dist": { 436 | "type": "zip", 437 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", 438 | "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", 439 | "shasum": "" 440 | }, 441 | "require": { 442 | "php": "^7.1 || ^8.0" 443 | }, 444 | "conflict": { 445 | "doctrine/collections": "<1.6.8", 446 | "doctrine/common": "<2.13.3 || >=3 <3.2.2" 447 | }, 448 | "require-dev": { 449 | "doctrine/collections": "^1.6.8", 450 | "doctrine/common": "^2.13.3 || ^3.2.2", 451 | "phpspec/prophecy": "^1.10", 452 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 453 | }, 454 | "type": "library", 455 | "autoload": { 456 | "files": [ 457 | "src/DeepCopy/deep_copy.php" 458 | ], 459 | "psr-4": { 460 | "DeepCopy\\": "src/DeepCopy/" 461 | } 462 | }, 463 | "notification-url": "https://packagist.org/downloads/", 464 | "license": [ 465 | "MIT" 466 | ], 467 | "description": "Create deep copies (clones) of your objects", 468 | "keywords": [ 469 | "clone", 470 | "copy", 471 | "duplicate", 472 | "object", 473 | "object graph" 474 | ], 475 | "support": { 476 | "issues": "https://github.com/myclabs/DeepCopy/issues", 477 | "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" 478 | }, 479 | "funding": [ 480 | { 481 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 482 | "type": "tidelift" 483 | } 484 | ], 485 | "time": "2024-06-12T14:39:25+00:00" 486 | }, 487 | { 488 | "name": "nikic/php-parser", 489 | "version": "v5.1.0", 490 | "source": { 491 | "type": "git", 492 | "url": "https://github.com/nikic/PHP-Parser.git", 493 | "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1" 494 | }, 495 | "dist": { 496 | "type": "zip", 497 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1", 498 | "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1", 499 | "shasum": "" 500 | }, 501 | "require": { 502 | "ext-ctype": "*", 503 | "ext-json": "*", 504 | "ext-tokenizer": "*", 505 | "php": ">=7.4" 506 | }, 507 | "require-dev": { 508 | "ircmaxell/php-yacc": "^0.0.7", 509 | "phpunit/phpunit": "^9.0" 510 | }, 511 | "bin": [ 512 | "bin/php-parse" 513 | ], 514 | "type": "library", 515 | "extra": { 516 | "branch-alias": { 517 | "dev-master": "5.0-dev" 518 | } 519 | }, 520 | "autoload": { 521 | "psr-4": { 522 | "PhpParser\\": "lib/PhpParser" 523 | } 524 | }, 525 | "notification-url": "https://packagist.org/downloads/", 526 | "license": [ 527 | "BSD-3-Clause" 528 | ], 529 | "authors": [ 530 | { 531 | "name": "Nikita Popov" 532 | } 533 | ], 534 | "description": "A PHP parser written in PHP", 535 | "keywords": [ 536 | "parser", 537 | "php" 538 | ], 539 | "support": { 540 | "issues": "https://github.com/nikic/PHP-Parser/issues", 541 | "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0" 542 | }, 543 | "time": "2024-07-01T20:03:41+00:00" 544 | }, 545 | { 546 | "name": "phar-io/manifest", 547 | "version": "2.0.4", 548 | "source": { 549 | "type": "git", 550 | "url": "https://github.com/phar-io/manifest.git", 551 | "reference": "54750ef60c58e43759730615a392c31c80e23176" 552 | }, 553 | "dist": { 554 | "type": "zip", 555 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", 556 | "reference": "54750ef60c58e43759730615a392c31c80e23176", 557 | "shasum": "" 558 | }, 559 | "require": { 560 | "ext-dom": "*", 561 | "ext-libxml": "*", 562 | "ext-phar": "*", 563 | "ext-xmlwriter": "*", 564 | "phar-io/version": "^3.0.1", 565 | "php": "^7.2 || ^8.0" 566 | }, 567 | "type": "library", 568 | "extra": { 569 | "branch-alias": { 570 | "dev-master": "2.0.x-dev" 571 | } 572 | }, 573 | "autoload": { 574 | "classmap": [ 575 | "src/" 576 | ] 577 | }, 578 | "notification-url": "https://packagist.org/downloads/", 579 | "license": [ 580 | "BSD-3-Clause" 581 | ], 582 | "authors": [ 583 | { 584 | "name": "Arne Blankerts", 585 | "email": "arne@blankerts.de", 586 | "role": "Developer" 587 | }, 588 | { 589 | "name": "Sebastian Heuer", 590 | "email": "sebastian@phpeople.de", 591 | "role": "Developer" 592 | }, 593 | { 594 | "name": "Sebastian Bergmann", 595 | "email": "sebastian@phpunit.de", 596 | "role": "Developer" 597 | } 598 | ], 599 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 600 | "support": { 601 | "issues": "https://github.com/phar-io/manifest/issues", 602 | "source": "https://github.com/phar-io/manifest/tree/2.0.4" 603 | }, 604 | "funding": [ 605 | { 606 | "url": "https://github.com/theseer", 607 | "type": "github" 608 | } 609 | ], 610 | "time": "2024-03-03T12:33:53+00:00" 611 | }, 612 | { 613 | "name": "phar-io/version", 614 | "version": "3.2.1", 615 | "source": { 616 | "type": "git", 617 | "url": "https://github.com/phar-io/version.git", 618 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 619 | }, 620 | "dist": { 621 | "type": "zip", 622 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 623 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 624 | "shasum": "" 625 | }, 626 | "require": { 627 | "php": "^7.2 || ^8.0" 628 | }, 629 | "type": "library", 630 | "autoload": { 631 | "classmap": [ 632 | "src/" 633 | ] 634 | }, 635 | "notification-url": "https://packagist.org/downloads/", 636 | "license": [ 637 | "BSD-3-Clause" 638 | ], 639 | "authors": [ 640 | { 641 | "name": "Arne Blankerts", 642 | "email": "arne@blankerts.de", 643 | "role": "Developer" 644 | }, 645 | { 646 | "name": "Sebastian Heuer", 647 | "email": "sebastian@phpeople.de", 648 | "role": "Developer" 649 | }, 650 | { 651 | "name": "Sebastian Bergmann", 652 | "email": "sebastian@phpunit.de", 653 | "role": "Developer" 654 | } 655 | ], 656 | "description": "Library for handling version information and constraints", 657 | "support": { 658 | "issues": "https://github.com/phar-io/version/issues", 659 | "source": "https://github.com/phar-io/version/tree/3.2.1" 660 | }, 661 | "time": "2022-02-21T01:04:05+00:00" 662 | }, 663 | { 664 | "name": "phpcsstandards/phpcsextra", 665 | "version": "1.1.2", 666 | "source": { 667 | "type": "git", 668 | "url": "https://github.com/PHPCSStandards/PHPCSExtra.git", 669 | "reference": "746c3190ba8eb2f212087c947ba75f4f5b9a58d5" 670 | }, 671 | "dist": { 672 | "type": "zip", 673 | "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/746c3190ba8eb2f212087c947ba75f4f5b9a58d5", 674 | "reference": "746c3190ba8eb2f212087c947ba75f4f5b9a58d5", 675 | "shasum": "" 676 | }, 677 | "require": { 678 | "php": ">=5.4", 679 | "phpcsstandards/phpcsutils": "^1.0.8", 680 | "squizlabs/php_codesniffer": "^3.7.1" 681 | }, 682 | "require-dev": { 683 | "php-parallel-lint/php-console-highlighter": "^1.0", 684 | "php-parallel-lint/php-parallel-lint": "^1.3.2", 685 | "phpcsstandards/phpcsdevcs": "^1.1.6", 686 | "phpcsstandards/phpcsdevtools": "^1.2.1", 687 | "phpunit/phpunit": "^4.5 || ^5.0 || ^6.0 || ^7.0" 688 | }, 689 | "type": "phpcodesniffer-standard", 690 | "extra": { 691 | "branch-alias": { 692 | "dev-stable": "1.x-dev", 693 | "dev-develop": "1.x-dev" 694 | } 695 | }, 696 | "notification-url": "https://packagist.org/downloads/", 697 | "license": [ 698 | "LGPL-3.0-or-later" 699 | ], 700 | "authors": [ 701 | { 702 | "name": "Juliette Reinders Folmer", 703 | "homepage": "https://github.com/jrfnl", 704 | "role": "lead" 705 | }, 706 | { 707 | "name": "Contributors", 708 | "homepage": "https://github.com/PHPCSStandards/PHPCSExtra/graphs/contributors" 709 | } 710 | ], 711 | "description": "A collection of sniffs and standards for use with PHP_CodeSniffer.", 712 | "keywords": [ 713 | "PHP_CodeSniffer", 714 | "phpcbf", 715 | "phpcodesniffer-standard", 716 | "phpcs", 717 | "standards", 718 | "static analysis" 719 | ], 720 | "support": { 721 | "issues": "https://github.com/PHPCSStandards/PHPCSExtra/issues", 722 | "source": "https://github.com/PHPCSStandards/PHPCSExtra" 723 | }, 724 | "time": "2023-09-20T22:06:18+00:00" 725 | }, 726 | { 727 | "name": "phpcsstandards/phpcsutils", 728 | "version": "1.0.9", 729 | "source": { 730 | "type": "git", 731 | "url": "https://github.com/PHPCSStandards/PHPCSUtils.git", 732 | "reference": "908247bc65010c7b7541a9551e002db12e9dae70" 733 | }, 734 | "dist": { 735 | "type": "zip", 736 | "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/908247bc65010c7b7541a9551e002db12e9dae70", 737 | "reference": "908247bc65010c7b7541a9551e002db12e9dae70", 738 | "shasum": "" 739 | }, 740 | "require": { 741 | "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0", 742 | "php": ">=5.4", 743 | "squizlabs/php_codesniffer": "^3.8.0 || 4.0.x-dev@dev" 744 | }, 745 | "require-dev": { 746 | "ext-filter": "*", 747 | "php-parallel-lint/php-console-highlighter": "^1.0", 748 | "php-parallel-lint/php-parallel-lint": "^1.3.2", 749 | "phpcsstandards/phpcsdevcs": "^1.1.6", 750 | "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0" 751 | }, 752 | "type": "phpcodesniffer-standard", 753 | "extra": { 754 | "branch-alias": { 755 | "dev-stable": "1.x-dev", 756 | "dev-develop": "1.x-dev" 757 | } 758 | }, 759 | "autoload": { 760 | "classmap": [ 761 | "PHPCSUtils/" 762 | ] 763 | }, 764 | "notification-url": "https://packagist.org/downloads/", 765 | "license": [ 766 | "LGPL-3.0-or-later" 767 | ], 768 | "authors": [ 769 | { 770 | "name": "Juliette Reinders Folmer", 771 | "homepage": "https://github.com/jrfnl", 772 | "role": "lead" 773 | }, 774 | { 775 | "name": "Contributors", 776 | "homepage": "https://github.com/PHPCSStandards/PHPCSUtils/graphs/contributors" 777 | } 778 | ], 779 | "description": "A suite of utility functions for use with PHP_CodeSniffer", 780 | "homepage": "https://phpcsutils.com/", 781 | "keywords": [ 782 | "PHP_CodeSniffer", 783 | "phpcbf", 784 | "phpcodesniffer-standard", 785 | "phpcs", 786 | "phpcs3", 787 | "standards", 788 | "static analysis", 789 | "tokens", 790 | "utility" 791 | ], 792 | "support": { 793 | "docs": "https://phpcsutils.com/", 794 | "issues": "https://github.com/PHPCSStandards/PHPCSUtils/issues", 795 | "security": "https://github.com/PHPCSStandards/PHPCSUtils/security/policy", 796 | "source": "https://github.com/PHPCSStandards/PHPCSUtils" 797 | }, 798 | "funding": [ 799 | { 800 | "url": "https://github.com/PHPCSStandards", 801 | "type": "github" 802 | }, 803 | { 804 | "url": "https://github.com/jrfnl", 805 | "type": "github" 806 | }, 807 | { 808 | "url": "https://opencollective.com/php_codesniffer", 809 | "type": "open_collective" 810 | } 811 | ], 812 | "time": "2023-12-08T14:50:00+00:00" 813 | }, 814 | { 815 | "name": "phpunit/php-code-coverage", 816 | "version": "9.2.31", 817 | "source": { 818 | "type": "git", 819 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 820 | "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" 821 | }, 822 | "dist": { 823 | "type": "zip", 824 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", 825 | "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", 826 | "shasum": "" 827 | }, 828 | "require": { 829 | "ext-dom": "*", 830 | "ext-libxml": "*", 831 | "ext-xmlwriter": "*", 832 | "nikic/php-parser": "^4.18 || ^5.0", 833 | "php": ">=7.3", 834 | "phpunit/php-file-iterator": "^3.0.3", 835 | "phpunit/php-text-template": "^2.0.2", 836 | "sebastian/code-unit-reverse-lookup": "^2.0.2", 837 | "sebastian/complexity": "^2.0", 838 | "sebastian/environment": "^5.1.2", 839 | "sebastian/lines-of-code": "^1.0.3", 840 | "sebastian/version": "^3.0.1", 841 | "theseer/tokenizer": "^1.2.0" 842 | }, 843 | "require-dev": { 844 | "phpunit/phpunit": "^9.3" 845 | }, 846 | "suggest": { 847 | "ext-pcov": "PHP extension that provides line coverage", 848 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 849 | }, 850 | "type": "library", 851 | "extra": { 852 | "branch-alias": { 853 | "dev-master": "9.2-dev" 854 | } 855 | }, 856 | "autoload": { 857 | "classmap": [ 858 | "src/" 859 | ] 860 | }, 861 | "notification-url": "https://packagist.org/downloads/", 862 | "license": [ 863 | "BSD-3-Clause" 864 | ], 865 | "authors": [ 866 | { 867 | "name": "Sebastian Bergmann", 868 | "email": "sebastian@phpunit.de", 869 | "role": "lead" 870 | } 871 | ], 872 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 873 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 874 | "keywords": [ 875 | "coverage", 876 | "testing", 877 | "xunit" 878 | ], 879 | "support": { 880 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 881 | "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", 882 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31" 883 | }, 884 | "funding": [ 885 | { 886 | "url": "https://github.com/sebastianbergmann", 887 | "type": "github" 888 | } 889 | ], 890 | "time": "2024-03-02T06:37:42+00:00" 891 | }, 892 | { 893 | "name": "phpunit/php-file-iterator", 894 | "version": "3.0.6", 895 | "source": { 896 | "type": "git", 897 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 898 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" 899 | }, 900 | "dist": { 901 | "type": "zip", 902 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 903 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 904 | "shasum": "" 905 | }, 906 | "require": { 907 | "php": ">=7.3" 908 | }, 909 | "require-dev": { 910 | "phpunit/phpunit": "^9.3" 911 | }, 912 | "type": "library", 913 | "extra": { 914 | "branch-alias": { 915 | "dev-master": "3.0-dev" 916 | } 917 | }, 918 | "autoload": { 919 | "classmap": [ 920 | "src/" 921 | ] 922 | }, 923 | "notification-url": "https://packagist.org/downloads/", 924 | "license": [ 925 | "BSD-3-Clause" 926 | ], 927 | "authors": [ 928 | { 929 | "name": "Sebastian Bergmann", 930 | "email": "sebastian@phpunit.de", 931 | "role": "lead" 932 | } 933 | ], 934 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 935 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 936 | "keywords": [ 937 | "filesystem", 938 | "iterator" 939 | ], 940 | "support": { 941 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 942 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" 943 | }, 944 | "funding": [ 945 | { 946 | "url": "https://github.com/sebastianbergmann", 947 | "type": "github" 948 | } 949 | ], 950 | "time": "2021-12-02T12:48:52+00:00" 951 | }, 952 | { 953 | "name": "phpunit/php-invoker", 954 | "version": "3.1.1", 955 | "source": { 956 | "type": "git", 957 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 958 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" 959 | }, 960 | "dist": { 961 | "type": "zip", 962 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 963 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 964 | "shasum": "" 965 | }, 966 | "require": { 967 | "php": ">=7.3" 968 | }, 969 | "require-dev": { 970 | "ext-pcntl": "*", 971 | "phpunit/phpunit": "^9.3" 972 | }, 973 | "suggest": { 974 | "ext-pcntl": "*" 975 | }, 976 | "type": "library", 977 | "extra": { 978 | "branch-alias": { 979 | "dev-master": "3.1-dev" 980 | } 981 | }, 982 | "autoload": { 983 | "classmap": [ 984 | "src/" 985 | ] 986 | }, 987 | "notification-url": "https://packagist.org/downloads/", 988 | "license": [ 989 | "BSD-3-Clause" 990 | ], 991 | "authors": [ 992 | { 993 | "name": "Sebastian Bergmann", 994 | "email": "sebastian@phpunit.de", 995 | "role": "lead" 996 | } 997 | ], 998 | "description": "Invoke callables with a timeout", 999 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 1000 | "keywords": [ 1001 | "process" 1002 | ], 1003 | "support": { 1004 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 1005 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" 1006 | }, 1007 | "funding": [ 1008 | { 1009 | "url": "https://github.com/sebastianbergmann", 1010 | "type": "github" 1011 | } 1012 | ], 1013 | "time": "2020-09-28T05:58:55+00:00" 1014 | }, 1015 | { 1016 | "name": "phpunit/php-text-template", 1017 | "version": "2.0.4", 1018 | "source": { 1019 | "type": "git", 1020 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 1021 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" 1022 | }, 1023 | "dist": { 1024 | "type": "zip", 1025 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 1026 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 1027 | "shasum": "" 1028 | }, 1029 | "require": { 1030 | "php": ">=7.3" 1031 | }, 1032 | "require-dev": { 1033 | "phpunit/phpunit": "^9.3" 1034 | }, 1035 | "type": "library", 1036 | "extra": { 1037 | "branch-alias": { 1038 | "dev-master": "2.0-dev" 1039 | } 1040 | }, 1041 | "autoload": { 1042 | "classmap": [ 1043 | "src/" 1044 | ] 1045 | }, 1046 | "notification-url": "https://packagist.org/downloads/", 1047 | "license": [ 1048 | "BSD-3-Clause" 1049 | ], 1050 | "authors": [ 1051 | { 1052 | "name": "Sebastian Bergmann", 1053 | "email": "sebastian@phpunit.de", 1054 | "role": "lead" 1055 | } 1056 | ], 1057 | "description": "Simple template engine.", 1058 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 1059 | "keywords": [ 1060 | "template" 1061 | ], 1062 | "support": { 1063 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 1064 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" 1065 | }, 1066 | "funding": [ 1067 | { 1068 | "url": "https://github.com/sebastianbergmann", 1069 | "type": "github" 1070 | } 1071 | ], 1072 | "time": "2020-10-26T05:33:50+00:00" 1073 | }, 1074 | { 1075 | "name": "phpunit/php-timer", 1076 | "version": "5.0.3", 1077 | "source": { 1078 | "type": "git", 1079 | "url": "https://github.com/sebastianbergmann/php-timer.git", 1080 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" 1081 | }, 1082 | "dist": { 1083 | "type": "zip", 1084 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 1085 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 1086 | "shasum": "" 1087 | }, 1088 | "require": { 1089 | "php": ">=7.3" 1090 | }, 1091 | "require-dev": { 1092 | "phpunit/phpunit": "^9.3" 1093 | }, 1094 | "type": "library", 1095 | "extra": { 1096 | "branch-alias": { 1097 | "dev-master": "5.0-dev" 1098 | } 1099 | }, 1100 | "autoload": { 1101 | "classmap": [ 1102 | "src/" 1103 | ] 1104 | }, 1105 | "notification-url": "https://packagist.org/downloads/", 1106 | "license": [ 1107 | "BSD-3-Clause" 1108 | ], 1109 | "authors": [ 1110 | { 1111 | "name": "Sebastian Bergmann", 1112 | "email": "sebastian@phpunit.de", 1113 | "role": "lead" 1114 | } 1115 | ], 1116 | "description": "Utility class for timing", 1117 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 1118 | "keywords": [ 1119 | "timer" 1120 | ], 1121 | "support": { 1122 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 1123 | "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" 1124 | }, 1125 | "funding": [ 1126 | { 1127 | "url": "https://github.com/sebastianbergmann", 1128 | "type": "github" 1129 | } 1130 | ], 1131 | "time": "2020-10-26T13:16:10+00:00" 1132 | }, 1133 | { 1134 | "name": "phpunit/phpunit", 1135 | "version": "9.6.20", 1136 | "source": { 1137 | "type": "git", 1138 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1139 | "reference": "49d7820565836236411f5dc002d16dd689cde42f" 1140 | }, 1141 | "dist": { 1142 | "type": "zip", 1143 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/49d7820565836236411f5dc002d16dd689cde42f", 1144 | "reference": "49d7820565836236411f5dc002d16dd689cde42f", 1145 | "shasum": "" 1146 | }, 1147 | "require": { 1148 | "doctrine/instantiator": "^1.5.0 || ^2", 1149 | "ext-dom": "*", 1150 | "ext-json": "*", 1151 | "ext-libxml": "*", 1152 | "ext-mbstring": "*", 1153 | "ext-xml": "*", 1154 | "ext-xmlwriter": "*", 1155 | "myclabs/deep-copy": "^1.12.0", 1156 | "phar-io/manifest": "^2.0.4", 1157 | "phar-io/version": "^3.2.1", 1158 | "php": ">=7.3", 1159 | "phpunit/php-code-coverage": "^9.2.31", 1160 | "phpunit/php-file-iterator": "^3.0.6", 1161 | "phpunit/php-invoker": "^3.1.1", 1162 | "phpunit/php-text-template": "^2.0.4", 1163 | "phpunit/php-timer": "^5.0.3", 1164 | "sebastian/cli-parser": "^1.0.2", 1165 | "sebastian/code-unit": "^1.0.8", 1166 | "sebastian/comparator": "^4.0.8", 1167 | "sebastian/diff": "^4.0.6", 1168 | "sebastian/environment": "^5.1.5", 1169 | "sebastian/exporter": "^4.0.6", 1170 | "sebastian/global-state": "^5.0.7", 1171 | "sebastian/object-enumerator": "^4.0.4", 1172 | "sebastian/resource-operations": "^3.0.4", 1173 | "sebastian/type": "^3.2.1", 1174 | "sebastian/version": "^3.0.2" 1175 | }, 1176 | "suggest": { 1177 | "ext-soap": "To be able to generate mocks based on WSDL files", 1178 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 1179 | }, 1180 | "bin": [ 1181 | "phpunit" 1182 | ], 1183 | "type": "library", 1184 | "extra": { 1185 | "branch-alias": { 1186 | "dev-master": "9.6-dev" 1187 | } 1188 | }, 1189 | "autoload": { 1190 | "files": [ 1191 | "src/Framework/Assert/Functions.php" 1192 | ], 1193 | "classmap": [ 1194 | "src/" 1195 | ] 1196 | }, 1197 | "notification-url": "https://packagist.org/downloads/", 1198 | "license": [ 1199 | "BSD-3-Clause" 1200 | ], 1201 | "authors": [ 1202 | { 1203 | "name": "Sebastian Bergmann", 1204 | "email": "sebastian@phpunit.de", 1205 | "role": "lead" 1206 | } 1207 | ], 1208 | "description": "The PHP Unit Testing framework.", 1209 | "homepage": "https://phpunit.de/", 1210 | "keywords": [ 1211 | "phpunit", 1212 | "testing", 1213 | "xunit" 1214 | ], 1215 | "support": { 1216 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 1217 | "security": "https://github.com/sebastianbergmann/phpunit/security/policy", 1218 | "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.20" 1219 | }, 1220 | "funding": [ 1221 | { 1222 | "url": "https://phpunit.de/sponsors.html", 1223 | "type": "custom" 1224 | }, 1225 | { 1226 | "url": "https://github.com/sebastianbergmann", 1227 | "type": "github" 1228 | }, 1229 | { 1230 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", 1231 | "type": "tidelift" 1232 | } 1233 | ], 1234 | "time": "2024-07-10T11:45:39+00:00" 1235 | }, 1236 | { 1237 | "name": "sebastian/cli-parser", 1238 | "version": "1.0.2", 1239 | "source": { 1240 | "type": "git", 1241 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 1242 | "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" 1243 | }, 1244 | "dist": { 1245 | "type": "zip", 1246 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", 1247 | "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", 1248 | "shasum": "" 1249 | }, 1250 | "require": { 1251 | "php": ">=7.3" 1252 | }, 1253 | "require-dev": { 1254 | "phpunit/phpunit": "^9.3" 1255 | }, 1256 | "type": "library", 1257 | "extra": { 1258 | "branch-alias": { 1259 | "dev-master": "1.0-dev" 1260 | } 1261 | }, 1262 | "autoload": { 1263 | "classmap": [ 1264 | "src/" 1265 | ] 1266 | }, 1267 | "notification-url": "https://packagist.org/downloads/", 1268 | "license": [ 1269 | "BSD-3-Clause" 1270 | ], 1271 | "authors": [ 1272 | { 1273 | "name": "Sebastian Bergmann", 1274 | "email": "sebastian@phpunit.de", 1275 | "role": "lead" 1276 | } 1277 | ], 1278 | "description": "Library for parsing CLI options", 1279 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 1280 | "support": { 1281 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 1282 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" 1283 | }, 1284 | "funding": [ 1285 | { 1286 | "url": "https://github.com/sebastianbergmann", 1287 | "type": "github" 1288 | } 1289 | ], 1290 | "time": "2024-03-02T06:27:43+00:00" 1291 | }, 1292 | { 1293 | "name": "sebastian/code-unit", 1294 | "version": "1.0.8", 1295 | "source": { 1296 | "type": "git", 1297 | "url": "https://github.com/sebastianbergmann/code-unit.git", 1298 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" 1299 | }, 1300 | "dist": { 1301 | "type": "zip", 1302 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", 1303 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", 1304 | "shasum": "" 1305 | }, 1306 | "require": { 1307 | "php": ">=7.3" 1308 | }, 1309 | "require-dev": { 1310 | "phpunit/phpunit": "^9.3" 1311 | }, 1312 | "type": "library", 1313 | "extra": { 1314 | "branch-alias": { 1315 | "dev-master": "1.0-dev" 1316 | } 1317 | }, 1318 | "autoload": { 1319 | "classmap": [ 1320 | "src/" 1321 | ] 1322 | }, 1323 | "notification-url": "https://packagist.org/downloads/", 1324 | "license": [ 1325 | "BSD-3-Clause" 1326 | ], 1327 | "authors": [ 1328 | { 1329 | "name": "Sebastian Bergmann", 1330 | "email": "sebastian@phpunit.de", 1331 | "role": "lead" 1332 | } 1333 | ], 1334 | "description": "Collection of value objects that represent the PHP code units", 1335 | "homepage": "https://github.com/sebastianbergmann/code-unit", 1336 | "support": { 1337 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 1338 | "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" 1339 | }, 1340 | "funding": [ 1341 | { 1342 | "url": "https://github.com/sebastianbergmann", 1343 | "type": "github" 1344 | } 1345 | ], 1346 | "time": "2020-10-26T13:08:54+00:00" 1347 | }, 1348 | { 1349 | "name": "sebastian/code-unit-reverse-lookup", 1350 | "version": "2.0.3", 1351 | "source": { 1352 | "type": "git", 1353 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1354 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" 1355 | }, 1356 | "dist": { 1357 | "type": "zip", 1358 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1359 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1360 | "shasum": "" 1361 | }, 1362 | "require": { 1363 | "php": ">=7.3" 1364 | }, 1365 | "require-dev": { 1366 | "phpunit/phpunit": "^9.3" 1367 | }, 1368 | "type": "library", 1369 | "extra": { 1370 | "branch-alias": { 1371 | "dev-master": "2.0-dev" 1372 | } 1373 | }, 1374 | "autoload": { 1375 | "classmap": [ 1376 | "src/" 1377 | ] 1378 | }, 1379 | "notification-url": "https://packagist.org/downloads/", 1380 | "license": [ 1381 | "BSD-3-Clause" 1382 | ], 1383 | "authors": [ 1384 | { 1385 | "name": "Sebastian Bergmann", 1386 | "email": "sebastian@phpunit.de" 1387 | } 1388 | ], 1389 | "description": "Looks up which function or method a line of code belongs to", 1390 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1391 | "support": { 1392 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 1393 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" 1394 | }, 1395 | "funding": [ 1396 | { 1397 | "url": "https://github.com/sebastianbergmann", 1398 | "type": "github" 1399 | } 1400 | ], 1401 | "time": "2020-09-28T05:30:19+00:00" 1402 | }, 1403 | { 1404 | "name": "sebastian/comparator", 1405 | "version": "4.0.8", 1406 | "source": { 1407 | "type": "git", 1408 | "url": "https://github.com/sebastianbergmann/comparator.git", 1409 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a" 1410 | }, 1411 | "dist": { 1412 | "type": "zip", 1413 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", 1414 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a", 1415 | "shasum": "" 1416 | }, 1417 | "require": { 1418 | "php": ">=7.3", 1419 | "sebastian/diff": "^4.0", 1420 | "sebastian/exporter": "^4.0" 1421 | }, 1422 | "require-dev": { 1423 | "phpunit/phpunit": "^9.3" 1424 | }, 1425 | "type": "library", 1426 | "extra": { 1427 | "branch-alias": { 1428 | "dev-master": "4.0-dev" 1429 | } 1430 | }, 1431 | "autoload": { 1432 | "classmap": [ 1433 | "src/" 1434 | ] 1435 | }, 1436 | "notification-url": "https://packagist.org/downloads/", 1437 | "license": [ 1438 | "BSD-3-Clause" 1439 | ], 1440 | "authors": [ 1441 | { 1442 | "name": "Sebastian Bergmann", 1443 | "email": "sebastian@phpunit.de" 1444 | }, 1445 | { 1446 | "name": "Jeff Welch", 1447 | "email": "whatthejeff@gmail.com" 1448 | }, 1449 | { 1450 | "name": "Volker Dusch", 1451 | "email": "github@wallbash.com" 1452 | }, 1453 | { 1454 | "name": "Bernhard Schussek", 1455 | "email": "bschussek@2bepublished.at" 1456 | } 1457 | ], 1458 | "description": "Provides the functionality to compare PHP values for equality", 1459 | "homepage": "https://github.com/sebastianbergmann/comparator", 1460 | "keywords": [ 1461 | "comparator", 1462 | "compare", 1463 | "equality" 1464 | ], 1465 | "support": { 1466 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 1467 | "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" 1468 | }, 1469 | "funding": [ 1470 | { 1471 | "url": "https://github.com/sebastianbergmann", 1472 | "type": "github" 1473 | } 1474 | ], 1475 | "time": "2022-09-14T12:41:17+00:00" 1476 | }, 1477 | { 1478 | "name": "sebastian/complexity", 1479 | "version": "2.0.3", 1480 | "source": { 1481 | "type": "git", 1482 | "url": "https://github.com/sebastianbergmann/complexity.git", 1483 | "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" 1484 | }, 1485 | "dist": { 1486 | "type": "zip", 1487 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", 1488 | "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", 1489 | "shasum": "" 1490 | }, 1491 | "require": { 1492 | "nikic/php-parser": "^4.18 || ^5.0", 1493 | "php": ">=7.3" 1494 | }, 1495 | "require-dev": { 1496 | "phpunit/phpunit": "^9.3" 1497 | }, 1498 | "type": "library", 1499 | "extra": { 1500 | "branch-alias": { 1501 | "dev-master": "2.0-dev" 1502 | } 1503 | }, 1504 | "autoload": { 1505 | "classmap": [ 1506 | "src/" 1507 | ] 1508 | }, 1509 | "notification-url": "https://packagist.org/downloads/", 1510 | "license": [ 1511 | "BSD-3-Clause" 1512 | ], 1513 | "authors": [ 1514 | { 1515 | "name": "Sebastian Bergmann", 1516 | "email": "sebastian@phpunit.de", 1517 | "role": "lead" 1518 | } 1519 | ], 1520 | "description": "Library for calculating the complexity of PHP code units", 1521 | "homepage": "https://github.com/sebastianbergmann/complexity", 1522 | "support": { 1523 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 1524 | "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" 1525 | }, 1526 | "funding": [ 1527 | { 1528 | "url": "https://github.com/sebastianbergmann", 1529 | "type": "github" 1530 | } 1531 | ], 1532 | "time": "2023-12-22T06:19:30+00:00" 1533 | }, 1534 | { 1535 | "name": "sebastian/diff", 1536 | "version": "4.0.6", 1537 | "source": { 1538 | "type": "git", 1539 | "url": "https://github.com/sebastianbergmann/diff.git", 1540 | "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" 1541 | }, 1542 | "dist": { 1543 | "type": "zip", 1544 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", 1545 | "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", 1546 | "shasum": "" 1547 | }, 1548 | "require": { 1549 | "php": ">=7.3" 1550 | }, 1551 | "require-dev": { 1552 | "phpunit/phpunit": "^9.3", 1553 | "symfony/process": "^4.2 || ^5" 1554 | }, 1555 | "type": "library", 1556 | "extra": { 1557 | "branch-alias": { 1558 | "dev-master": "4.0-dev" 1559 | } 1560 | }, 1561 | "autoload": { 1562 | "classmap": [ 1563 | "src/" 1564 | ] 1565 | }, 1566 | "notification-url": "https://packagist.org/downloads/", 1567 | "license": [ 1568 | "BSD-3-Clause" 1569 | ], 1570 | "authors": [ 1571 | { 1572 | "name": "Sebastian Bergmann", 1573 | "email": "sebastian@phpunit.de" 1574 | }, 1575 | { 1576 | "name": "Kore Nordmann", 1577 | "email": "mail@kore-nordmann.de" 1578 | } 1579 | ], 1580 | "description": "Diff implementation", 1581 | "homepage": "https://github.com/sebastianbergmann/diff", 1582 | "keywords": [ 1583 | "diff", 1584 | "udiff", 1585 | "unidiff", 1586 | "unified diff" 1587 | ], 1588 | "support": { 1589 | "issues": "https://github.com/sebastianbergmann/diff/issues", 1590 | "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" 1591 | }, 1592 | "funding": [ 1593 | { 1594 | "url": "https://github.com/sebastianbergmann", 1595 | "type": "github" 1596 | } 1597 | ], 1598 | "time": "2024-03-02T06:30:58+00:00" 1599 | }, 1600 | { 1601 | "name": "sebastian/environment", 1602 | "version": "5.1.5", 1603 | "source": { 1604 | "type": "git", 1605 | "url": "https://github.com/sebastianbergmann/environment.git", 1606 | "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" 1607 | }, 1608 | "dist": { 1609 | "type": "zip", 1610 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", 1611 | "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", 1612 | "shasum": "" 1613 | }, 1614 | "require": { 1615 | "php": ">=7.3" 1616 | }, 1617 | "require-dev": { 1618 | "phpunit/phpunit": "^9.3" 1619 | }, 1620 | "suggest": { 1621 | "ext-posix": "*" 1622 | }, 1623 | "type": "library", 1624 | "extra": { 1625 | "branch-alias": { 1626 | "dev-master": "5.1-dev" 1627 | } 1628 | }, 1629 | "autoload": { 1630 | "classmap": [ 1631 | "src/" 1632 | ] 1633 | }, 1634 | "notification-url": "https://packagist.org/downloads/", 1635 | "license": [ 1636 | "BSD-3-Clause" 1637 | ], 1638 | "authors": [ 1639 | { 1640 | "name": "Sebastian Bergmann", 1641 | "email": "sebastian@phpunit.de" 1642 | } 1643 | ], 1644 | "description": "Provides functionality to handle HHVM/PHP environments", 1645 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1646 | "keywords": [ 1647 | "Xdebug", 1648 | "environment", 1649 | "hhvm" 1650 | ], 1651 | "support": { 1652 | "issues": "https://github.com/sebastianbergmann/environment/issues", 1653 | "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" 1654 | }, 1655 | "funding": [ 1656 | { 1657 | "url": "https://github.com/sebastianbergmann", 1658 | "type": "github" 1659 | } 1660 | ], 1661 | "time": "2023-02-03T06:03:51+00:00" 1662 | }, 1663 | { 1664 | "name": "sebastian/exporter", 1665 | "version": "4.0.6", 1666 | "source": { 1667 | "type": "git", 1668 | "url": "https://github.com/sebastianbergmann/exporter.git", 1669 | "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" 1670 | }, 1671 | "dist": { 1672 | "type": "zip", 1673 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", 1674 | "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", 1675 | "shasum": "" 1676 | }, 1677 | "require": { 1678 | "php": ">=7.3", 1679 | "sebastian/recursion-context": "^4.0" 1680 | }, 1681 | "require-dev": { 1682 | "ext-mbstring": "*", 1683 | "phpunit/phpunit": "^9.3" 1684 | }, 1685 | "type": "library", 1686 | "extra": { 1687 | "branch-alias": { 1688 | "dev-master": "4.0-dev" 1689 | } 1690 | }, 1691 | "autoload": { 1692 | "classmap": [ 1693 | "src/" 1694 | ] 1695 | }, 1696 | "notification-url": "https://packagist.org/downloads/", 1697 | "license": [ 1698 | "BSD-3-Clause" 1699 | ], 1700 | "authors": [ 1701 | { 1702 | "name": "Sebastian Bergmann", 1703 | "email": "sebastian@phpunit.de" 1704 | }, 1705 | { 1706 | "name": "Jeff Welch", 1707 | "email": "whatthejeff@gmail.com" 1708 | }, 1709 | { 1710 | "name": "Volker Dusch", 1711 | "email": "github@wallbash.com" 1712 | }, 1713 | { 1714 | "name": "Adam Harvey", 1715 | "email": "aharvey@php.net" 1716 | }, 1717 | { 1718 | "name": "Bernhard Schussek", 1719 | "email": "bschussek@gmail.com" 1720 | } 1721 | ], 1722 | "description": "Provides the functionality to export PHP variables for visualization", 1723 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 1724 | "keywords": [ 1725 | "export", 1726 | "exporter" 1727 | ], 1728 | "support": { 1729 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 1730 | "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" 1731 | }, 1732 | "funding": [ 1733 | { 1734 | "url": "https://github.com/sebastianbergmann", 1735 | "type": "github" 1736 | } 1737 | ], 1738 | "time": "2024-03-02T06:33:00+00:00" 1739 | }, 1740 | { 1741 | "name": "sebastian/global-state", 1742 | "version": "5.0.7", 1743 | "source": { 1744 | "type": "git", 1745 | "url": "https://github.com/sebastianbergmann/global-state.git", 1746 | "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" 1747 | }, 1748 | "dist": { 1749 | "type": "zip", 1750 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", 1751 | "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", 1752 | "shasum": "" 1753 | }, 1754 | "require": { 1755 | "php": ">=7.3", 1756 | "sebastian/object-reflector": "^2.0", 1757 | "sebastian/recursion-context": "^4.0" 1758 | }, 1759 | "require-dev": { 1760 | "ext-dom": "*", 1761 | "phpunit/phpunit": "^9.3" 1762 | }, 1763 | "suggest": { 1764 | "ext-uopz": "*" 1765 | }, 1766 | "type": "library", 1767 | "extra": { 1768 | "branch-alias": { 1769 | "dev-master": "5.0-dev" 1770 | } 1771 | }, 1772 | "autoload": { 1773 | "classmap": [ 1774 | "src/" 1775 | ] 1776 | }, 1777 | "notification-url": "https://packagist.org/downloads/", 1778 | "license": [ 1779 | "BSD-3-Clause" 1780 | ], 1781 | "authors": [ 1782 | { 1783 | "name": "Sebastian Bergmann", 1784 | "email": "sebastian@phpunit.de" 1785 | } 1786 | ], 1787 | "description": "Snapshotting of global state", 1788 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1789 | "keywords": [ 1790 | "global state" 1791 | ], 1792 | "support": { 1793 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 1794 | "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" 1795 | }, 1796 | "funding": [ 1797 | { 1798 | "url": "https://github.com/sebastianbergmann", 1799 | "type": "github" 1800 | } 1801 | ], 1802 | "time": "2024-03-02T06:35:11+00:00" 1803 | }, 1804 | { 1805 | "name": "sebastian/lines-of-code", 1806 | "version": "1.0.4", 1807 | "source": { 1808 | "type": "git", 1809 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 1810 | "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" 1811 | }, 1812 | "dist": { 1813 | "type": "zip", 1814 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", 1815 | "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", 1816 | "shasum": "" 1817 | }, 1818 | "require": { 1819 | "nikic/php-parser": "^4.18 || ^5.0", 1820 | "php": ">=7.3" 1821 | }, 1822 | "require-dev": { 1823 | "phpunit/phpunit": "^9.3" 1824 | }, 1825 | "type": "library", 1826 | "extra": { 1827 | "branch-alias": { 1828 | "dev-master": "1.0-dev" 1829 | } 1830 | }, 1831 | "autoload": { 1832 | "classmap": [ 1833 | "src/" 1834 | ] 1835 | }, 1836 | "notification-url": "https://packagist.org/downloads/", 1837 | "license": [ 1838 | "BSD-3-Clause" 1839 | ], 1840 | "authors": [ 1841 | { 1842 | "name": "Sebastian Bergmann", 1843 | "email": "sebastian@phpunit.de", 1844 | "role": "lead" 1845 | } 1846 | ], 1847 | "description": "Library for counting the lines of code in PHP source code", 1848 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 1849 | "support": { 1850 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 1851 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" 1852 | }, 1853 | "funding": [ 1854 | { 1855 | "url": "https://github.com/sebastianbergmann", 1856 | "type": "github" 1857 | } 1858 | ], 1859 | "time": "2023-12-22T06:20:34+00:00" 1860 | }, 1861 | { 1862 | "name": "sebastian/object-enumerator", 1863 | "version": "4.0.4", 1864 | "source": { 1865 | "type": "git", 1866 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1867 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" 1868 | }, 1869 | "dist": { 1870 | "type": "zip", 1871 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", 1872 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", 1873 | "shasum": "" 1874 | }, 1875 | "require": { 1876 | "php": ">=7.3", 1877 | "sebastian/object-reflector": "^2.0", 1878 | "sebastian/recursion-context": "^4.0" 1879 | }, 1880 | "require-dev": { 1881 | "phpunit/phpunit": "^9.3" 1882 | }, 1883 | "type": "library", 1884 | "extra": { 1885 | "branch-alias": { 1886 | "dev-master": "4.0-dev" 1887 | } 1888 | }, 1889 | "autoload": { 1890 | "classmap": [ 1891 | "src/" 1892 | ] 1893 | }, 1894 | "notification-url": "https://packagist.org/downloads/", 1895 | "license": [ 1896 | "BSD-3-Clause" 1897 | ], 1898 | "authors": [ 1899 | { 1900 | "name": "Sebastian Bergmann", 1901 | "email": "sebastian@phpunit.de" 1902 | } 1903 | ], 1904 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1905 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1906 | "support": { 1907 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 1908 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" 1909 | }, 1910 | "funding": [ 1911 | { 1912 | "url": "https://github.com/sebastianbergmann", 1913 | "type": "github" 1914 | } 1915 | ], 1916 | "time": "2020-10-26T13:12:34+00:00" 1917 | }, 1918 | { 1919 | "name": "sebastian/object-reflector", 1920 | "version": "2.0.4", 1921 | "source": { 1922 | "type": "git", 1923 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1924 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" 1925 | }, 1926 | "dist": { 1927 | "type": "zip", 1928 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 1929 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 1930 | "shasum": "" 1931 | }, 1932 | "require": { 1933 | "php": ">=7.3" 1934 | }, 1935 | "require-dev": { 1936 | "phpunit/phpunit": "^9.3" 1937 | }, 1938 | "type": "library", 1939 | "extra": { 1940 | "branch-alias": { 1941 | "dev-master": "2.0-dev" 1942 | } 1943 | }, 1944 | "autoload": { 1945 | "classmap": [ 1946 | "src/" 1947 | ] 1948 | }, 1949 | "notification-url": "https://packagist.org/downloads/", 1950 | "license": [ 1951 | "BSD-3-Clause" 1952 | ], 1953 | "authors": [ 1954 | { 1955 | "name": "Sebastian Bergmann", 1956 | "email": "sebastian@phpunit.de" 1957 | } 1958 | ], 1959 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1960 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1961 | "support": { 1962 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 1963 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" 1964 | }, 1965 | "funding": [ 1966 | { 1967 | "url": "https://github.com/sebastianbergmann", 1968 | "type": "github" 1969 | } 1970 | ], 1971 | "time": "2020-10-26T13:14:26+00:00" 1972 | }, 1973 | { 1974 | "name": "sebastian/recursion-context", 1975 | "version": "4.0.5", 1976 | "source": { 1977 | "type": "git", 1978 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1979 | "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" 1980 | }, 1981 | "dist": { 1982 | "type": "zip", 1983 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", 1984 | "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", 1985 | "shasum": "" 1986 | }, 1987 | "require": { 1988 | "php": ">=7.3" 1989 | }, 1990 | "require-dev": { 1991 | "phpunit/phpunit": "^9.3" 1992 | }, 1993 | "type": "library", 1994 | "extra": { 1995 | "branch-alias": { 1996 | "dev-master": "4.0-dev" 1997 | } 1998 | }, 1999 | "autoload": { 2000 | "classmap": [ 2001 | "src/" 2002 | ] 2003 | }, 2004 | "notification-url": "https://packagist.org/downloads/", 2005 | "license": [ 2006 | "BSD-3-Clause" 2007 | ], 2008 | "authors": [ 2009 | { 2010 | "name": "Sebastian Bergmann", 2011 | "email": "sebastian@phpunit.de" 2012 | }, 2013 | { 2014 | "name": "Jeff Welch", 2015 | "email": "whatthejeff@gmail.com" 2016 | }, 2017 | { 2018 | "name": "Adam Harvey", 2019 | "email": "aharvey@php.net" 2020 | } 2021 | ], 2022 | "description": "Provides functionality to recursively process PHP variables", 2023 | "homepage": "https://github.com/sebastianbergmann/recursion-context", 2024 | "support": { 2025 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 2026 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" 2027 | }, 2028 | "funding": [ 2029 | { 2030 | "url": "https://github.com/sebastianbergmann", 2031 | "type": "github" 2032 | } 2033 | ], 2034 | "time": "2023-02-03T06:07:39+00:00" 2035 | }, 2036 | { 2037 | "name": "sebastian/resource-operations", 2038 | "version": "3.0.4", 2039 | "source": { 2040 | "type": "git", 2041 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 2042 | "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" 2043 | }, 2044 | "dist": { 2045 | "type": "zip", 2046 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", 2047 | "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", 2048 | "shasum": "" 2049 | }, 2050 | "require": { 2051 | "php": ">=7.3" 2052 | }, 2053 | "require-dev": { 2054 | "phpunit/phpunit": "^9.0" 2055 | }, 2056 | "type": "library", 2057 | "extra": { 2058 | "branch-alias": { 2059 | "dev-main": "3.0-dev" 2060 | } 2061 | }, 2062 | "autoload": { 2063 | "classmap": [ 2064 | "src/" 2065 | ] 2066 | }, 2067 | "notification-url": "https://packagist.org/downloads/", 2068 | "license": [ 2069 | "BSD-3-Clause" 2070 | ], 2071 | "authors": [ 2072 | { 2073 | "name": "Sebastian Bergmann", 2074 | "email": "sebastian@phpunit.de" 2075 | } 2076 | ], 2077 | "description": "Provides a list of PHP built-in functions that operate on resources", 2078 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 2079 | "support": { 2080 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" 2081 | }, 2082 | "funding": [ 2083 | { 2084 | "url": "https://github.com/sebastianbergmann", 2085 | "type": "github" 2086 | } 2087 | ], 2088 | "time": "2024-03-14T16:00:52+00:00" 2089 | }, 2090 | { 2091 | "name": "sebastian/type", 2092 | "version": "3.2.1", 2093 | "source": { 2094 | "type": "git", 2095 | "url": "https://github.com/sebastianbergmann/type.git", 2096 | "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" 2097 | }, 2098 | "dist": { 2099 | "type": "zip", 2100 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", 2101 | "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", 2102 | "shasum": "" 2103 | }, 2104 | "require": { 2105 | "php": ">=7.3" 2106 | }, 2107 | "require-dev": { 2108 | "phpunit/phpunit": "^9.5" 2109 | }, 2110 | "type": "library", 2111 | "extra": { 2112 | "branch-alias": { 2113 | "dev-master": "3.2-dev" 2114 | } 2115 | }, 2116 | "autoload": { 2117 | "classmap": [ 2118 | "src/" 2119 | ] 2120 | }, 2121 | "notification-url": "https://packagist.org/downloads/", 2122 | "license": [ 2123 | "BSD-3-Clause" 2124 | ], 2125 | "authors": [ 2126 | { 2127 | "name": "Sebastian Bergmann", 2128 | "email": "sebastian@phpunit.de", 2129 | "role": "lead" 2130 | } 2131 | ], 2132 | "description": "Collection of value objects that represent the types of the PHP type system", 2133 | "homepage": "https://github.com/sebastianbergmann/type", 2134 | "support": { 2135 | "issues": "https://github.com/sebastianbergmann/type/issues", 2136 | "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" 2137 | }, 2138 | "funding": [ 2139 | { 2140 | "url": "https://github.com/sebastianbergmann", 2141 | "type": "github" 2142 | } 2143 | ], 2144 | "time": "2023-02-03T06:13:03+00:00" 2145 | }, 2146 | { 2147 | "name": "sebastian/version", 2148 | "version": "3.0.2", 2149 | "source": { 2150 | "type": "git", 2151 | "url": "https://github.com/sebastianbergmann/version.git", 2152 | "reference": "c6c1022351a901512170118436c764e473f6de8c" 2153 | }, 2154 | "dist": { 2155 | "type": "zip", 2156 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", 2157 | "reference": "c6c1022351a901512170118436c764e473f6de8c", 2158 | "shasum": "" 2159 | }, 2160 | "require": { 2161 | "php": ">=7.3" 2162 | }, 2163 | "type": "library", 2164 | "extra": { 2165 | "branch-alias": { 2166 | "dev-master": "3.0-dev" 2167 | } 2168 | }, 2169 | "autoload": { 2170 | "classmap": [ 2171 | "src/" 2172 | ] 2173 | }, 2174 | "notification-url": "https://packagist.org/downloads/", 2175 | "license": [ 2176 | "BSD-3-Clause" 2177 | ], 2178 | "authors": [ 2179 | { 2180 | "name": "Sebastian Bergmann", 2181 | "email": "sebastian@phpunit.de", 2182 | "role": "lead" 2183 | } 2184 | ], 2185 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2186 | "homepage": "https://github.com/sebastianbergmann/version", 2187 | "support": { 2188 | "issues": "https://github.com/sebastianbergmann/version/issues", 2189 | "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" 2190 | }, 2191 | "funding": [ 2192 | { 2193 | "url": "https://github.com/sebastianbergmann", 2194 | "type": "github" 2195 | } 2196 | ], 2197 | "time": "2020-09-28T06:39:44+00:00" 2198 | }, 2199 | { 2200 | "name": "squizlabs/php_codesniffer", 2201 | "version": "3.8.1", 2202 | "source": { 2203 | "type": "git", 2204 | "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", 2205 | "reference": "14f5fff1e64118595db5408e946f3a22c75807f7" 2206 | }, 2207 | "dist": { 2208 | "type": "zip", 2209 | "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/14f5fff1e64118595db5408e946f3a22c75807f7", 2210 | "reference": "14f5fff1e64118595db5408e946f3a22c75807f7", 2211 | "shasum": "" 2212 | }, 2213 | "require": { 2214 | "ext-simplexml": "*", 2215 | "ext-tokenizer": "*", 2216 | "ext-xmlwriter": "*", 2217 | "php": ">=5.4.0" 2218 | }, 2219 | "require-dev": { 2220 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" 2221 | }, 2222 | "bin": [ 2223 | "bin/phpcbf", 2224 | "bin/phpcs" 2225 | ], 2226 | "type": "library", 2227 | "extra": { 2228 | "branch-alias": { 2229 | "dev-master": "3.x-dev" 2230 | } 2231 | }, 2232 | "notification-url": "https://packagist.org/downloads/", 2233 | "license": [ 2234 | "BSD-3-Clause" 2235 | ], 2236 | "authors": [ 2237 | { 2238 | "name": "Greg Sherwood", 2239 | "role": "Former lead" 2240 | }, 2241 | { 2242 | "name": "Juliette Reinders Folmer", 2243 | "role": "Current lead" 2244 | }, 2245 | { 2246 | "name": "Contributors", 2247 | "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" 2248 | } 2249 | ], 2250 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 2251 | "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", 2252 | "keywords": [ 2253 | "phpcs", 2254 | "standards", 2255 | "static analysis" 2256 | ], 2257 | "support": { 2258 | "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", 2259 | "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", 2260 | "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", 2261 | "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" 2262 | }, 2263 | "funding": [ 2264 | { 2265 | "url": "https://github.com/PHPCSStandards", 2266 | "type": "github" 2267 | }, 2268 | { 2269 | "url": "https://github.com/jrfnl", 2270 | "type": "github" 2271 | }, 2272 | { 2273 | "url": "https://opencollective.com/php_codesniffer", 2274 | "type": "open_collective" 2275 | } 2276 | ], 2277 | "time": "2024-01-11T20:47:48+00:00" 2278 | }, 2279 | { 2280 | "name": "symfony/polyfill-php80", 2281 | "version": "v1.30.0", 2282 | "source": { 2283 | "type": "git", 2284 | "url": "https://github.com/symfony/polyfill-php80.git", 2285 | "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" 2286 | }, 2287 | "dist": { 2288 | "type": "zip", 2289 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", 2290 | "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", 2291 | "shasum": "" 2292 | }, 2293 | "require": { 2294 | "php": ">=7.1" 2295 | }, 2296 | "type": "library", 2297 | "extra": { 2298 | "thanks": { 2299 | "name": "symfony/polyfill", 2300 | "url": "https://github.com/symfony/polyfill" 2301 | } 2302 | }, 2303 | "autoload": { 2304 | "files": [ 2305 | "bootstrap.php" 2306 | ], 2307 | "psr-4": { 2308 | "Symfony\\Polyfill\\Php80\\": "" 2309 | }, 2310 | "classmap": [ 2311 | "Resources/stubs" 2312 | ] 2313 | }, 2314 | "notification-url": "https://packagist.org/downloads/", 2315 | "license": [ 2316 | "MIT" 2317 | ], 2318 | "authors": [ 2319 | { 2320 | "name": "Ion Bazan", 2321 | "email": "ion.bazan@gmail.com" 2322 | }, 2323 | { 2324 | "name": "Nicolas Grekas", 2325 | "email": "p@tchwork.com" 2326 | }, 2327 | { 2328 | "name": "Symfony Community", 2329 | "homepage": "https://symfony.com/contributors" 2330 | } 2331 | ], 2332 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 2333 | "homepage": "https://symfony.com", 2334 | "keywords": [ 2335 | "compatibility", 2336 | "polyfill", 2337 | "portable", 2338 | "shim" 2339 | ], 2340 | "support": { 2341 | "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" 2342 | }, 2343 | "funding": [ 2344 | { 2345 | "url": "https://symfony.com/sponsor", 2346 | "type": "custom" 2347 | }, 2348 | { 2349 | "url": "https://github.com/fabpot", 2350 | "type": "github" 2351 | }, 2352 | { 2353 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2354 | "type": "tidelift" 2355 | } 2356 | ], 2357 | "time": "2024-05-31T15:07:36+00:00" 2358 | }, 2359 | { 2360 | "name": "theseer/tokenizer", 2361 | "version": "1.2.3", 2362 | "source": { 2363 | "type": "git", 2364 | "url": "https://github.com/theseer/tokenizer.git", 2365 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" 2366 | }, 2367 | "dist": { 2368 | "type": "zip", 2369 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 2370 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 2371 | "shasum": "" 2372 | }, 2373 | "require": { 2374 | "ext-dom": "*", 2375 | "ext-tokenizer": "*", 2376 | "ext-xmlwriter": "*", 2377 | "php": "^7.2 || ^8.0" 2378 | }, 2379 | "type": "library", 2380 | "autoload": { 2381 | "classmap": [ 2382 | "src/" 2383 | ] 2384 | }, 2385 | "notification-url": "https://packagist.org/downloads/", 2386 | "license": [ 2387 | "BSD-3-Clause" 2388 | ], 2389 | "authors": [ 2390 | { 2391 | "name": "Arne Blankerts", 2392 | "email": "arne@blankerts.de", 2393 | "role": "Developer" 2394 | } 2395 | ], 2396 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 2397 | "support": { 2398 | "issues": "https://github.com/theseer/tokenizer/issues", 2399 | "source": "https://github.com/theseer/tokenizer/tree/1.2.3" 2400 | }, 2401 | "funding": [ 2402 | { 2403 | "url": "https://github.com/theseer", 2404 | "type": "github" 2405 | } 2406 | ], 2407 | "time": "2024-03-03T12:36:25+00:00" 2408 | } 2409 | ], 2410 | "aliases": [], 2411 | "minimum-stability": "stable", 2412 | "stability-flags": [], 2413 | "prefer-stable": false, 2414 | "prefer-lowest": false, 2415 | "platform": { 2416 | "php": ">=7.3" 2417 | }, 2418 | "platform-dev": { 2419 | "ext-curl": "*" 2420 | }, 2421 | "plugin-api-version": "2.3.0" 2422 | } 2423 | -------------------------------------------------------------------------------- /data/langdb.yaml: -------------------------------------------------------------------------------- 1 | languages: 2 | aa: [Latn, [AF], Qafár af] 3 | aae: [Latn, [EU], arbërisht] 4 | ab: [Cyrl, [EU], аԥсшәа] 5 | abe: [Latn, [AM], Wôbanakiôdwawôgan] 6 | abr: [Latn, [AF], Abron] 7 | abs: [Latn, [AS], Bahasa Ambon] 8 | ace: [Latn, [AS, PA], Acèh] 9 | acf: [Latn, [AM], Kwéyòl Sent Lisi] 10 | ach: [Latn, [AF], Acoli] 11 | acm: [Arab, [ME], عراقي] 12 | acq: [Arab, [ME, AF], تعزية-عدنية] 13 | ada: [Latn, [AF], Dangme] 14 | ady: [Cyrl, [EU, ME], адыгабзэ] 15 | ady-cyrl: [ady] 16 | ady-latn: [Latn, [EU, ME], Adygabze] 17 | aeb: [aeb-arab] 18 | aeb-arab: [Arab, [AF], تونسي] 19 | aeb-latn: [Latn, [AF], Tûnsî] 20 | af: [Latn, [AF], Afrikaans] 21 | agq: [Latn, [AF], aghɨ̂m] 22 | ahr: [Deva, [AS], अहिराणी] 23 | aii: [Syrc, [ME], ܣܘܪܝܬ] 24 | ajg: [Latn, [AF], ajagbe] 25 | # The code ajp was deprecated by ISO and merged into apc: 26 | # https://iso639-3.sil.org/code/ajp 27 | ajp: [apc] 28 | ajp-arab: [apc] 29 | ajp-latn: [apc-latn] 30 | akb: [Latn, [AS, PA], Batak Angkola] 31 | akz: [Latn, [AM], Albaamo innaaɬiilka] 32 | ale: [Latn, [AM, AS], unangam tunuu] 33 | ale-cyrl: [Cyrl, [AS], унаӈам тунуу] 34 | aln: [Latn, [EU], Gegë] 35 | als: [sq] 36 | alt: [Cyrl, [EU, AS], алтай тил] 37 | am: [Ethi, [AF], አማርኛ] 38 | ami: [Latn, [AS], Pangcah] 39 | an: [Latn, [EU], aragonés] 40 | ang: [Latn, [EU], Ænglisc] 41 | ann: [Latn, [AF], Obolo] 42 | anp: [Deva, [AS], अंगिका] 43 | apc: [Arab, [ME], شامي] 44 | apc-arab: [apc] 45 | apc-latn: [Latn, [ME], šāmi] 46 | apw: [Latn, [AM], "Ndee biyati'"] 47 | ar: [Arab, [AF, ME], العربية] 48 | arc: [Syrc, [ME], ܐܪܡܝܐ] 49 | arn: [Latn, [AM], mapudungun] 50 | aro: [Latn, [AM], Araona] 51 | arq: [Arab, [AF, ME], جازايرية] 52 | ars: [Arab, [ME], نجدي] 53 | ary: [Arab, [AF, ME], الدارجة] 54 | ary-arab: [ary] 55 | ary-latn: [Latn, [AF, ME], ed-dārija] 56 | arz: [Arab, [AF, ME], مصرى] 57 | as: [Beng, [AS], অসমীয়া] 58 | ase: [Sgnw, [AM], American Sign Language] 59 | ast: [Latn, [EU], asturianu] 60 | atj: [Latn, [AM], atikamekw] 61 | atv: [Cyrl, [EU, AS], тÿндÿк алтай тил] 62 | av: [Cyrl, [EU], авар] 63 | avk: [Latn, [WW], Kotava] 64 | awa: [Deva, [AS], अवधी] 65 | ay: [Latn, [AM], Aymar aru] 66 | # The Latin script is the default in the North Azerbaijani Wikipedia, 67 | # which uses the macro code 'az'. Its own standard code is 'azj'. 68 | # The Arabic script is the default in the South Azerbaijani Wikipedia, 69 | # which correctly uses the code 'azb'. 70 | # CLDR uses az-latn and az-arab. 71 | az: [Latn, [EU, ME], azərbaycanca] 72 | az-arab: [azb] 73 | az-cyrl: [Cyrl, [EU, ME], азәрбајҹанҹа] 74 | az-latn: [az] 75 | azb: [Arab, [AS, ME], تۆرکجه] 76 | azj: [az] 77 | ba: [Cyrl, [EU], башҡортса] 78 | # The common modern default. 79 | ban: [Latn, [AS, PA], Bali] 80 | # For support in webfonts. 81 | ban-bali: [Bali, [AS, PA], ᬩᬮᬶ] 82 | bar: [Latn, [EU], Boarisch] 83 | bas: [Latn, [AF], ɓasaá] 84 | bat-smg: [sgs] 85 | bax: [Latn, [AF], Shüpamom] 86 | bax-bamu: [Bamu, [AF], ꚶꛉ꛰꛲ꚫꛦꚳ] 87 | bbc: [bbc-latn] 88 | bbc-batk: [Batk, [AS], ᯅᯖᯂ᯲ ᯖᯬᯅ] 89 | bbc-latn: [Latn, [AS], Batak Toba] 90 | bcc: [Arab, [AS, ME], جهلسری بلوچی] 91 | bci: [Latn, [AF], wawle] 92 | bcl: [Latn, [AS], Bikol Central] 93 | bdr: [Latn, [AS], Bajau Sama] 94 | be: [Cyrl, [EU], беларуская] 95 | be-tarask: [Cyrl, [EU], беларуская (тарашкевіца)] 96 | be-x-old: [be-tarask] 97 | bem: [Latn, [AF], IciBemba] 98 | bew: [Latn, [AS], Betawi] 99 | bfa: [Latn, [AF], Bari] 100 | bfq: [Taml, [AS], படகா] 101 | bft: [Arab, [AS], بلتی] 102 | bfw: [Orya, [AS], ରେମସାମ୍] 103 | bg: [Cyrl, [EU], български] 104 | bgc: [Deva, [AS], हरियाणवी] 105 | bgc-arab: [Arab, [AS], ہریانوی] 106 | bgn: [Arab, [AS, ME], روچ کپتین بلوچی] 107 | # FIXME - currently says Bhojpuri, but it's a macrolanguage. 108 | bh: [bho] 109 | bho: [Deva, [AS], भोजपुरी] 110 | bi: [Latn, [PA], Bislama] 111 | bin: [Latn, [AF], Ẹdo] 112 | bjn: [Latn, [AS], Banjar] 113 | bkm: [Latn, [AF], Itaŋikom] 114 | blc: [Latn, [AM], ItNuxalkmc] 115 | blk: [Mymr, [AS], ပအိုဝ်ႏဘာႏသာႏ] 116 | bm: [Latn, [AF], bamanankan] 117 | bn: [Beng, [AS], বাংলা] 118 | bnn: [Latn, [AS], bunun] 119 | bo: [Tibt, [AS], བོད་ཡིག] 120 | bol: [Latn, [AF], bòo pìkkà] 121 | bom: [Latn, [AF], bèrom] 122 | bpy: [Beng, [AS], বিষ্ণুপ্রিয়া মণিপুরী] 123 | bqi: [Arab, [AS, ME], بختیاری] 124 | br: [Latn, [EU], brezhoneg] 125 | brh: [Latn, [ME, AS], Bráhuí] 126 | brx: [Deva, [AS], "बर'"] 127 | bs: [Latn, [EU], bosanski] 128 | btd: [Latn, [AS, PA], Batak Dairi] 129 | btm: [Latn, [AS], Mandailing] 130 | bto: [Latn, [AS], Iriga Bicolano] 131 | bts: [Latn, [AS, PA], Sahap Simalungun] 132 | btx: [Latn, [AS, PA], cakap Karo] 133 | btz: [Latn, [AS, PA], Batak Alas-Kluet] 134 | bug: [Latn, [AS, PA], Basa Ugi] 135 | bug-bugi: [Bugi, [AS, PA], ᨅᨔ ᨕᨘᨁᨗ] 136 | bug-latn: [bug] 137 | bum: [Latn, [AF], bulu] 138 | bwr: [Latn, [AF], bura] 139 | bxr: [Cyrl, [AS], буряад] 140 | byn: [Ethi, [AF], ብሊን] 141 | byv: [Latn, [AF], Mə̀dʉ̂mbɑ̀] 142 | bzj: [Latn, [AM], Bileez Kriol] 143 | bzs: [Sgnw, [AM], Língua brasileira de sinais] 144 | ca: [Latn, [EU], català] 145 | cak: [Latn, [AM], Kaqchikel] 146 | cbk: [Latn, [AS], Chavacano de Zamboanga] 147 | cbk-zam: [cbk] 148 | ccp: [Cakm, [AS], 𑄌𑄋𑄴𑄟𑄳𑄦] 149 | cdo: [Latn, [AS], 閩東語 / Mìng-dĕ̤ng-ngṳ̄] 150 | cdo-hani: [Hani, [AS], 閩東語(漢字)] 151 | cdo-hans: [Hans, [AS], 闽东语(简化汉字)] 152 | cdo-hant: [Hant, [AS], 閩東語(傳統漢字)] 153 | cdo-latn: [Latn, [AS], Mìng-dĕ̤ng-ngṳ̄ (Bàng-uâ-cê)] 154 | ce: [Cyrl, [EU], нохчийн] 155 | ceb: [Latn, [AS], Cebuano] 156 | ch: [Latn, [PA], Chamoru] 157 | # FIXME chm is actually a macro language that includes 158 | # mhr and mrj, but CLDR Territory-Language information 159 | # uses chm instead of mhr, so for practical reasons 160 | # it should redirect there. 161 | # A better fix would be this: 162 | # https://phabricator.wikimedia.org/T136164 163 | chm: [mhr] 164 | chn: [Latn, [AM], chinuk wawa] 165 | cho: [Latn, [AM], Chahta anumpa] 166 | chr: [Cher, [AM], ᏣᎳᎩ] 167 | chy: [Latn, [AM], Tsetsêhestâhese] 168 | ciw: [Latn, [AM], Anishinaabemowin] 169 | cja: [cja-latn] 170 | cja-arab: [Arab, [AS], چم فور] 171 | cja-cham: [Cham, [AS], ꨌꩌ ꨚꨭꩉ] 172 | cja-latn: [Latn, [AS], Cam pur] 173 | cjk: [Latn, [AF], cokwe] 174 | cjm: [cjm-cham] 175 | cjm-arab: [Arab, [AS], چم فاي] 176 | cjm-cham: [Cham, [AS], ꨌꩌ ꨚꨰ] 177 | cjm-latn: [Latn, [AS], Cam pai] 178 | cjy: [Hant, [AS], 晉語] 179 | cjy-hans: [Hans, [AS], 晋语(简化字)] 180 | cjy-hant: [Hant, [AS], 晉語(正字)] 181 | ckb: [Arab, [ME], کوردی] 182 | cko: [Latn, [AF], Anufɔ] 183 | ckt: [Cyrl, [AS], ԓыгъоравэтԓьэн] 184 | cnh: [Latn, [AS], Lai holh] 185 | cnr: [cnr-latn] 186 | cnr-cyrl: [Cyrl, [EU], црногорски] 187 | cnr-latn: [Latn, [EU], crnogorski] 188 | co: [Latn, [EU], corsu] 189 | cop: [Copt, [AF, ME], ϯⲙⲉⲧⲣⲉⲙⲛ̀ⲭⲏⲙⲓ] 190 | cps: [Latn, [AS], Capiceño] 191 | cpx: [Hant, [AS], 莆仙語 / Pó-sing-gṳ̂] 192 | cpx-hans: [Hans, [AS], 莆仙语(简体)] 193 | cpx-hant: [Hant, [AS], 莆仙語(繁體)] 194 | cpx-latn: [Latn, [AS], Pó-sing-gṳ̂ (Báⁿ-uā-ci̍)] 195 | cr: [Cans, [AM], ᓀᐦᐃᔭᐍᐏᐣ] 196 | cr-cans: [cr] 197 | cr-latn: [Latn, [AM], Nēhiyawēwin] 198 | crg: [Latn, [AM], Michif] 199 | crh: [Latn, [EU], qırımtatarca] 200 | crh-cyrl: [Cyrl, [EU], къырымтатарджа] 201 | crh-latn: [crh] 202 | crh-ro: [Latn, [EU], tatarşa] 203 | cs: [Latn, [EU], čeština] 204 | csb: [Latn, [EU], kaszëbsczi] 205 | # FIXME: which script to prefer?.. 206 | cu: [Cyrl, [EU], словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ] 207 | cv: [Cyrl, [EU], чӑвашла] 208 | cy: [Latn, [EU], Cymraeg] 209 | da: [Latn, [EU], dansk] 210 | dag: [Latn, [AF], dagbanli] 211 | dar: [Cyrl, [EU], дарган] 212 | ddn: [Latn, [AF], dendi] 213 | de: [Latn, [EU], Deutsch] 214 | de-at: [Latn, [EU], Österreichisches Deutsch] 215 | de-ch: [Latn, [EU], Schweizer Hochdeutsch] 216 | de-formal: [Latn, [EU], Deutsch (Sie-Form)] 217 | dga: [Latn, [AF], Dagaare] 218 | # In ISO 639, it refers to Rek Dinka. It may 219 | # be changed like that here, too, but for 220 | # now, redirect it to macro Dinka. 221 | dik: [din] 222 | din: [Latn, [AF], Thuɔŋjäŋ] 223 | diq: [Latn, [EU, AS], Zazaki] 224 | dlg: [Cyrl, [RU], долган тыла] 225 | doi: [Deva, [AS], डोगरी] 226 | dru: [Latn, [AS], drekai] 227 | dsb: [Latn, [EU], dolnoserbski] 228 | dso: [Orya ,[AS], ଦେଶିଆ] 229 | dtp: [Latn, [AS], Kadazandusun] 230 | dty: [Deva, [AS], डोटेली] 231 | dua: [Latn, [AF], Duálá] 232 | dv: [Thaa, [AS], ދިވެހިބަސް] 233 | dyu: [Latn, [AF], Julakan] 234 | dz: [Tibt, [AS], ཇོང་ཁ] 235 | ee: [Latn, [AF], eʋegbe] 236 | efi: [Latn, [AF], efịk] 237 | egl: [Latn, [EU], Emiliàn] 238 | ekp: [Latn, [AF], ẹkpeye] 239 | el: [Grek, [EU], Ελληνικά] 240 | elm: [Latn, [AF], Eleme] 241 | eml: [Latn, [EU], emiliàn e rumagnòl] 242 | en: [Latn, [EU, AM, AF, ME, AS, PA, WW], English] 243 | en-ca: [Latn, [AM], Canadian English] 244 | en-gb: [Latn, [EU, AS, PA], British English] 245 | en-simple: [Latn, [WW], Simple English] 246 | en-us: [Latn, [AM], American English] 247 | eo: [Latn, [WW], Esperanto] 248 | es: [Latn, [EU, AM, AF, WW, PA], español] 249 | es-419: [Latn, [AM], español de América Latina] 250 | es-formal: [Latn, [EU, AM, AF, WW], español (formal)] 251 | es-ni: [Latn, [AM], español nicaragüense] 252 | esu: [Latn, [AM], "Yup'ik"] 253 | et: [Latn, [EU], eesti] 254 | eu: [Latn, [EU], euskara] 255 | ext: [Latn, [EU], estremeñu] 256 | eya: [Latn, [AM], I·ya·q] 257 | fa: [Arab, [AS, ME], فارسی] 258 | fan: [Latn, [AF], Faŋ] 259 | fat: [Latn, [AF], mfantse] 260 | fax: [Latn, [EU], Fala] 261 | ff: [Latn, [AF], Fulfulde] 262 | fi: [Latn, [EU], suomi] 263 | fil: [tl] 264 | fit: [Latn, [EU], meänkieli] 265 | fiu-vro: [vro] 266 | fj: [Latn, [PA], Na Vosa Vakaviti] 267 | fkv: [Latn, [EU], kvääni] 268 | fo: [Latn, [EU], føroyskt] 269 | fon: [Latn, [AF], fɔ̀ngbè] 270 | fr: [Latn, [EU, AM, WW], français] 271 | frc: [Latn, [AM], français cadien] 272 | frp: [Latn, [EU], arpetan] 273 | frr: [Latn, [EU], Nordfriisk] 274 | frs: [Latn, [EU], Oostfräisk] 275 | fuf: [Latn, [AF], Fuuta Jalon] 276 | fur: [Latn, [EU], furlan] 277 | # In ISO 639, it refers to Nigerian Fula. It may 278 | # be changed like that here, too, but for 279 | # now, redirect it to macro Fula. 280 | fuv: [ff] 281 | fvr: [Latn, [AF], poor’íŋ belé’ŋ] 282 | fy: [Latn, [EU], Frysk] 283 | ga: [Latn, [EU], Gaeilge] 284 | gaa: [Latn, [AF], Ga] 285 | gag: [Latn, [EU], Gagauz] 286 | gah: [Latn, [AS], Alekano] 287 | gan: [Hant, [AS], 贛語] 288 | gan-hans: [Hans, [AS], 赣语(简体)] 289 | gan-hant: [Hant, [AS], 贛語(繁體)] 290 | # In ISO 639, it refers to West Central Oromo. It may 291 | # be changed like that here, too, but for 292 | # now, redirect it to macro Oromo. 293 | gaz: [om] 294 | gbm: [Deva, [AS], गढ़वळि] 295 | gbz: [Latn, [AS], Dari-e Mazdeyasnā] 296 | gcf: [Latn, [AM], kréyòl Gwadloup] 297 | gcr: [Latn, [AM], kriyòl gwiyannen] 298 | gd: [Latn, [EU], Gàidhlig] 299 | gez: [Ethi, [AF], ግዕዝ] 300 | gju-arab: [Arab, [AS], گوجری] 301 | gju-deva: [Deva, [AS], गुज्जरी] 302 | gl: [Latn, [EU], galego] 303 | gld: [Cyrl, [AS], на̄ни] 304 | glk: [Arab, [AS, ME], گیلکی] 305 | gn: [Latn, [AM], "Avañe'ẽ"] 306 | gom: [gom-deva] 307 | gom-deva: [Deva, [AS], गोंयची कोंकणी] 308 | gom-latn: [Latn, [AS], Gõychi Konknni] 309 | gor: [Latn, [AS], Bahasa Hulontalo] 310 | got: [Goth, [EU], 𐌲𐌿𐍄𐌹𐍃𐌺] 311 | gpe: [Latn, [AF], Ghanaian Pidgin] 312 | grc: [Grek, [EU], Ἀρχαία ἑλληνικὴ] 313 | gsw: [Latn, [EU], Alemannisch] 314 | gu: [Gujr, [AS], ગુજરાતી] 315 | guc: [Latn, [AM], wayuunaiki] 316 | gum: [Latn, [AM], Namtrik] 317 | gur: [Latn, [AF], farefare] 318 | guw: [Latn, [AF], gungbe] 319 | gv: [Latn, [EU], Gaelg] 320 | # CLDR uses ha for Latin script and ha-arab for Arabic script. 321 | # Latin is more common and is used in Wikipedia. 322 | ha: [Latn, [AF], Hausa] 323 | ha-arab: [Arab, [AF], هَوُسَ] 324 | ha-latn: [ha] 325 | hai: [Latn, [AM], X̱aat Kíl] 326 | hak: [Hant, [AS], 客家語 / Hak-kâ-ngî] 327 | hak-hans: [Hans, [AS], 客家语(简体)] 328 | hak-hant: [Hant, [AS], 客家語(繁體)] 329 | hak-latn: [Latn, [AS], Hak-kâ-ngî (Pha̍k-fa-sṳ)] 330 | hav: [Latn, [AF], Kihavu] 331 | haw: [Latn, [AM, PA], Hawaiʻi] 332 | he: [Hebr, [ME], עברית] 333 | hi: [Deva, [AS], हिन्दी] 334 | hif: [Latn, [PA, AS], Fiji Hindi] 335 | hif-deva: [Deva, [AS], फ़ीजी हिन्दी] 336 | hif-latn: [hif] 337 | hil: [Latn, [AS], Ilonggo] 338 | hke: [Latn, [AF], kihunde] 339 | hne: [Deva, [AS], छत्तीसगढ़ी] 340 | hno: [Arab, [AS], ہندکو] 341 | ho: [Latn, [PA], Hiri Motu] 342 | hoc: [Wara, [AS], 𑢹𑣉𑣉] 343 | hoc-latn: [Latn, [AS], Ho] 344 | hr: [Latn, [EU], hrvatski] 345 | hrx: [Latn, [AM], Hunsrik] 346 | hsb: [Latn, [EU], hornjoserbsce] 347 | hsn: [Hant, [AS], 湘語] 348 | ht: [Latn, [AM], Kreyòl ayisyen] 349 | hu: [Latn, [EU], magyar] 350 | hu-formal: [Latn, [EU], Magyar (magázó)] 351 | hy: [Armn, [EU, ME], հայերեն] 352 | hyw: [Armn, [EU, ME], Արեւմտահայերէն] 353 | hz: [Latn, [AF], Otsiherero] 354 | ia: [Latn, [WW], interlingua] 355 | iba: [Latn, [AS, PA], Jaku Iban] 356 | ibb: [Latn, [AF], ibibio] 357 | id: [Latn, [AS, PA], Bahasa Indonesia] 358 | ie: [Latn, [WW], Interlingue] 359 | ig: [Latn, [AF], Igbo] 360 | igb: [Latn, [AF], Ebira] 361 | igl: [Latn, [AF], Igala] 362 | ii: [Yiii, [AS], ꆇꉙ] 363 | ik: [Latn, [AM], Iñupiatun] 364 | ike-cans: [Cans, [AM], ᐃᓄᒃᑎᑐᑦ] 365 | ike-latn: [Latn, [AM], inuktitut] 366 | ilo: [Latn, [AS], Ilokano] 367 | inh: [Cyrl, [EU], гӀалгӀай] 368 | io: [Latn, [WW], Ido] 369 | is: [Latn, [EU], íslenska] 370 | ish: [Latn, [AF], awain] 371 | isv: [isv-latn] 372 | isv-cyrl: [Cyrl, [EU], меджусловјанскы] 373 | isv-latn: [Latn, [EU], medžuslovjansky] 374 | it: [Latn, [EU], italiano] 375 | iu: [ike-cans] 376 | izh: [Latn, [EU], ižoran keel] 377 | ja: [Jpan, [AS], 日本語] 378 | jac: [Latn, [AM], Abꞌxubꞌal Poptiꞌ] 379 | jam: [Latn, [AM], Patois] 380 | jbo: [Latn, [WW], lojban] 381 | jdt: [jdt-cyrl] 382 | jdt-cyrl: [Cyrl, [EU, AS], жугьури] 383 | jje: [Kore, [AS], 제주말] 384 | jut: [Latn, [EU], jysk] 385 | jv: [Latn, [AS, PA], Jawa] 386 | # For support in webfonts. 387 | jv-java: [Java, [AS, PA], ꦗꦮ] 388 | ka: [Geor, [EU], ქართული] 389 | kaa: [Latn, [AS], Qaraqalpaqsha] 390 | # Can also be Tfng, but the Wikipedia is mostly Latn 391 | kab: [Latn, [AF, EU], Taqbaylit] 392 | kac: [Latn, [AS], Jinghpaw] 393 | kai: [Latn, [AF], Karai-karai] 394 | kaj: [Latn, [AF], Jju] 395 | kam: [Latn, [AF], kĩkamba] 396 | kbd: [Cyrl, [EU, ME], адыгэбзэ] 397 | kbd-cyrl: [kbd] 398 | kbd-latn: [Latn, [EU], Qabardjajəbza] 399 | kbp: [Latn, [AF], Kabɩyɛ] 400 | kcg: [Latn, [AF], Tyap] 401 | kck: [Latn, [AF], tjikalanga] 402 | kea: [Latn, [AF], kabuverdianu] 403 | ken: [Latn, [AF], kɛ́nyáŋ] 404 | kg: [Latn, [AF], Kongo] 405 | kge: [Latn, [AS, PA], Kumoring] 406 | kge-arab: [Arab, [AS, PA], كوموريڠ] 407 | kgg: [Deva, [AS], गेम्येहाक़ गिपन] 408 | kgp: [Latn, [AM], Kaingáng] 409 | khk: [mn] 410 | khw: [Arab, [ME, AS], کھوار] 411 | ki: [Latn, [AF], Gĩkũyũ] 412 | kip: [Deva, [AS], शेषी पाङ] 413 | kiu: [Latn, [EU, ME], Kırmancki] 414 | kj: [Latn, [AF], Kwanyama] 415 | kjh: [Cyrl, [AS], хакас] 416 | kjp: [Mymr, [AS], ဖၠုံလိက်] 417 | kk: [kk-cyrl] 418 | kk-arab: [Arab, [EU, AS], قازاقشا (تٶتە)] 419 | kk-cn: [kk-arab] 420 | kk-cyrl: [Cyrl, [EU, AS], қазақша] 421 | kk-kz: [kk-cyrl] 422 | kk-latn: [Latn, [EU, AS, ME], qazaqşa] 423 | kk-tr: [kk-latn] 424 | kl: [Latn, [AM, EU], kalaallisut] 425 | km: [Khmr, [AS], ភាសាខ្មែរ] 426 | kmb: [Latn, [AF], kimbundu] 427 | kmr: [ku-latn] 428 | kn: [Knda, [AS], ಕನ್ನಡ] 429 | knc: [Latn, [AF], Yerwa Kanuri] 430 | knn: [Deva, [AS], महाराष्ट्रीय कोंकणी] 431 | ko: [Kore, [AS], 한국어] 432 | ko-kp: [Kore, [AS], 조선말] 433 | koi: [Cyrl, [EU], перем коми] 434 | koy: [Latn, [AM], "Denaakkenaageʼ"] 435 | kr: [Latn, [AF], kanuri] 436 | krc: [Cyrl, [EU], къарачай-малкъар] 437 | kri: [Latn, [AF], Krio] 438 | krj: [Latn, [AS], Kinaray-a] 439 | krl: [Latn, [EU], Karjala] 440 | ks: [Arab, [AS], کٲشُر] 441 | ks-arab: [ks] 442 | ks-deva: [Deva, [AS], कॉशुर] 443 | ksf: [Latn, [AF], Bafia] 444 | ksh: [Latn, [EU], Ripoarisch] 445 | ksw: [Mymr, [AS], စှီၤ] 446 | # CLDR uses ku-latn and ku-arab. Latin is more common and is used in Wikipedia. 447 | ku: [ku-latn] 448 | # Note: The first word here is the same as the name of ckb. 449 | # It should probably be made less ambiguous. 450 | ku-arab: [Arab, [EU, ME], کوردی (عەرەبی)] 451 | ku-latn: [Latn, [EU, ME], kurdî] 452 | kum: [Cyrl, [EU], къумукъ] 453 | kus: [Latn, [AF], Kʋsaal] 454 | kv: [Cyrl, [EU], коми] 455 | kw: [Latn, [EU], kernowek] 456 | ky: [Cyrl, [AS], кыргызча] 457 | la: [Latn, [EU], Latina] 458 | lad: [lad-latn] 459 | lad-hebr: [Hebr, [ME, EU, AM], לאדינו] 460 | lad-latn: [Latn, [ME, EU, AM], Ladino] 461 | lag: [Latn, [AF], Kilaangi] 462 | laj: [Latn, [AF], Lëblaŋo] 463 | lb: [Latn, [EU], Lëtzebuergesch] 464 | lbe: [Cyrl, [EU], лакку] 465 | ldn: [Latn, [WW], Láadan] 466 | lez: [Cyrl, [EU], лезги] 467 | lfn: [Latn, [WW], Lingua Franca Nova] 468 | lg: [Latn, [AF], Luganda] 469 | li: [Latn, [EU], Limburgs] 470 | lij: [Latn, [EU], Ligure] 471 | lij-mc: [Latn, [EU], munegascu] 472 | liv: [Latn, [EU], Līvõ kēļ] 473 | ljp: [Latn, [AS, PA], Lampung Api] 474 | lki: [Arab, [AS, ME], لەکی] 475 | lkt: [Latn, [AM], Lakȟótiyapi] 476 | lld: [Latn, [EU], Ladin] 477 | lmo: [Latn, [EU], lombard] 478 | ln: [Latn, [AF], lingála] 479 | lo: [Laoo, [AS], ລາວ] 480 | lou: [Latn, [AM], Kouri-Vini] 481 | loz: [Latn, [AF], Silozi] 482 | lrc: [Arab, [AS, ME], لۊری شومالی] 483 | lt: [Latn, [EU], lietuvių] 484 | ltg: [Latn, [EU], latgaļu] 485 | lua: [Latn, [AF], ciluba] 486 | lud: [Latn, [EU], lüüdi] 487 | lue: [Latn, [AF], chiluvale] 488 | luo: [Latn, [AF], dholuo] 489 | lus: [Latn, [AS], Mizo ţawng] 490 | lut: [Latn, [AM], dxʷləšucid] 491 | luz: [Arab, [ME], لئری دوٙمینی] 492 | lv: [Latn, [EU], latviešu] 493 | lvs: [lv] 494 | lzh: [Hant, [AS], 文言] 495 | # Also Geor, but the incubator is in Latn 496 | lzz: [Latn, [EU, ME], Lazuri] 497 | mad: [Latn, [AS], Madhurâ] 498 | mag: [Deva, [AS], मगही] 499 | mai: [Deva, [AS], मैथिली] 500 | mak: [Latn, [AS, PA], Mangkasarak] 501 | mak-bugi: [Bugi, [AS, PA], ᨆᨀᨔᨑ] 502 | map-bms: [Latn, [AS], Basa Banyumasan] 503 | maw: [Latn, [AF], Ŋmampulli] 504 | mcn: [Latn, [AF], vùn màsànà] 505 | mdf: [Cyrl, [EU], мокшень] 506 | mdh: [Latn, [AS, PA], Magindanawn] 507 | mey: [Arab, [AF], الحسانية] 508 | mfa: [Latn, [AS, PA], Klate-Ttaning] 509 | mfe: [Latn, [AM], Morisyen] 510 | mg: [Latn, [AF], Malagasy] 511 | mh: [Latn, [PA], Ebon] 512 | mhr: [Cyrl, [EU], олык марий] 513 | mi: [Latn, [PA], Māori] 514 | mic: [Latn, [AM], "Mi'kmaq"] 515 | min: [Latn, [AS], Minangkabau] 516 | miq: [Latn, [AM], Mískitu] 517 | mk: [Cyrl, [EU], македонски] 518 | ml: [Mlym, [AS, ME], മലയാളം] 519 | mn: [Cyrl, [AS], монгол] 520 | mn-cyrl: [mn] 521 | mn-mong: [mvf] 522 | mnc: [Latn, [AS], manju gisun] 523 | mnc-latn: [mnc] 524 | mnc-mong: [Mong, [AS], ᠮᠠᠨᠵᡠ ᡤᡳᠰᡠᠨ] 525 | mni: [Mtei, [AS], ꯃꯤꯇꯩ ꯂꯣꯟ] 526 | mni-beng: [Beng, [AS], মেইতেই লোন্] 527 | mns: [Cyrl, [EU, AS], ма̄ньси] 528 | mnw: [Mymr, [AS], ဘာသာမန်] 529 | mo: [Cyrl, [EU], молдовеняскэ] 530 | moe: [Latn, [AM], innu-aimun] 531 | mos: [Latn, [AF], moore] 532 | mr: [Deva, [AS, ME], मराठी] 533 | mrh: [Latn, [AS], Mara] 534 | mrj: [Cyrl, [EU], кырык мары] 535 | mrt: [Latn, [AF], Margi] 536 | mrv: [Latn, [PA], Magareva] 537 | ms: [Latn, [AS], Bahasa Melayu] 538 | ms-arab: [Arab, [AS], بهاس ملايو] 539 | msi: [Latn, [AS], Bahasa Sabah] 540 | mt: [Latn, [EU], Malti] 541 | mui: [Latn, [AS], Baso Palembang] 542 | mus: [Latn, [AM], Mvskoke] 543 | mvf: [Mong, [AS], ᠮᠣᠩᠭᠣᠯ] 544 | mwl: [Latn, [EU], Mirandés] 545 | mwv: [Latn, [AS], Behase Mentawei] 546 | mww: [mww-latn] 547 | mww-latn: [Latn, [AS], Hmoob Dawb] 548 | my: [Mymr, [AS], မြန်မာဘာသာ] 549 | myv: [Cyrl, [EU], эрзянь] 550 | mzn: [Arab, [ME, AS], مازِرونی] 551 | na: [Latn, [PA], Dorerin Naoero] 552 | nah: [Latn, [AM], Nāhuatl] 553 | nan: [Latn, [AS], 閩南語 / Bân-lâm-gú] 554 | nan-hani: [Hani, [AS], 閩南語(漢字)] 555 | nan-hans: [Hans, [AS], 闽南语(简化汉字)] 556 | nan-hant: [Hant, [AS], 閩南語(傳統漢字)] 557 | nan-latn: [Latn, [AS], Bân-lâm-gú (Lô-má-jī)] 558 | nan-latn-pehoeji: [Latn, [AS], Bân-lâm-gú (Pe̍h-ōe-jī)] 559 | nan-latn-tailo: [Latn, [AS], Bân-lâm-gú (Tâi-lô)] 560 | nap: [Latn, [EU], Napulitano] 561 | naq: [Latn, [AF], Khoekhoegowab] 562 | nb: [Latn, [EU], norsk (bokmål)] 563 | nd: [Latn, [AF], siNdebele saseNyakatho] 564 | nds: [Latn, [EU], Plattdüütsch] 565 | nds-nl: [Latn, [EU], Nedersaksisch] 566 | ne: [Deva, [AS], नेपाली] 567 | new: [Deva, [AS], नेपाल भाषा] 568 | ng: [Latn, [AF], Oshiwambo] 569 | nia: [Latn, [AS], Li Niha] 570 | nit: [Telu, [AS], కొలామి] 571 | niu: [Latn, [PA], ko e vagahau Niuē] 572 | njo: [Latn, [AS], Ao] 573 | nl: [Latn, [EU, AM], Nederlands] 574 | nl-informal: [Latn, [EU, AM], Nederlands (informeel)] 575 | nmz: [Latn, [AF], nawdm] 576 | nn: [Latn, [EU], norsk (nynorsk)] 577 | nn-hognorsk: [Latn, [EU], norsk (høgnorsk)] 578 | nnh: [Latn, [AF], ngiembɔɔn] 579 | # There's also nb for Bokmål and nn for Nynorsk 580 | "no": [Latn, [EU], norsk] 581 | nod: [Lana, [AS], ᨣᩴᩤᨾᩮᩥᩬᨦ] 582 | nod-thai: [Thai, [AS], คำเมือง] 583 | nog: [Cyrl, [EU], ногайша] 584 | nov: [Latn, [WW], Novial] 585 | npi: [ne] 586 | nqo: [Nkoo, [AF], ߒߞߏ] 587 | nr: [Latn, [AF], isiNdebele seSewula] 588 | nrf-gg: [Latn, [EU], Guernésiais] 589 | nrf-je: [Latn, [EU], Jèrriais] 590 | nrm: [Latn, [EU], Nouormand] 591 | nso: [Latn, [AF], Sesotho sa Leboa] 592 | nup: [Latn, [AF], Nupe] 593 | nus: [Latn, [AF], Thok Naath] 594 | nv: [Latn, [AM], Diné bizaad] 595 | ny: [Latn, [AF], Chi-Chewa] 596 | nyn: [Latn, [AF], runyankore] 597 | nyo: [Latn, [AF], Orunyoro] 598 | nys: [Latn, [PA], Nyungar] 599 | nzi: [Latn, [AF], Nzema] 600 | oc: [Latn, [EU], occitan] 601 | ojb: [Latn, [AM], Ojibwemowin] 602 | oka: [Latn, [AM], n̓səl̓xcin̓] 603 | olo: [Latn, [EU], livvinkarjala] 604 | om: [Latn, [AF], Oromoo] 605 | ood: [Latn, [AM], "ʼOʼodham ha-ñeʼokĭ"] 606 | or: [Orya, [AS], ଓଡ଼ିଆ] 607 | ory: [or] 608 | os: [Cyrl, [EU], ирон] 609 | osi: [Latn, [AS], Using] 610 | ota: [Arab, [AS, EU], لسان عثمانى] 611 | ovd: [Latn, [EU], övdalsk] 612 | pa: [Guru, [AS], ਪੰਜਾਬੀ] 613 | pa-arab: [pnb] 614 | pa-guru: [pa] 615 | pag: [Latn, [AS], Pangasinan] 616 | pam: [Latn, [AS], Kapampangan] 617 | pap: [Latn, [AM], Papiamentu] 618 | pap-aw: [Latn, [AM], Papiamento (Aruba)] 619 | pbb: [Latn, [AM], Nasa Yuwe] 620 | # In ISO 639, it refers to Southern Pashto. It may 621 | # be changed like that here, too, but for 622 | # now, redirect it to macro Pashto. 623 | pbt: [ps] 624 | pcd: [Latn, [EU], Picard] 625 | pcm: [Latn, [AF], Naijá] 626 | pdc: [Latn, [EU, AM], Deitsch] 627 | pdt: [Latn, [EU, AM], Plautdietsch] 628 | pes: [fa] 629 | pey: [Latn, [EU, PA, AS], Petjoh] 630 | pfl: [Latn, [EU], Pälzisch] 631 | phr: [Arab, [AS], پوٹھواری] 632 | pi: [Deva, [AS], पालि] 633 | pih: [Latn, [PA], Norfuk / Pitkern] 634 | pis: [Latn, [PA], Solomon Aelan Pijin] 635 | piu: [Latn, [PA], Pintupi-Luritja] 636 | pjt: [Latn, [PA], Pitjantjatjara] 637 | pko: [Latn, [AF], Pökoot] 638 | pl: [Latn, [EU], polski] 639 | plt: [mg] 640 | pms: [Latn, [EU], Piemontèis] 641 | pnb: [Arab, [AS, ME], پنجابی] 642 | pnt: [Grek, [EU], Ποντιακά] 643 | pov: [Latn, [AF], guinensi] 644 | ppl: [Latn, [AM], Nawat] 645 | prg: [Latn, [EU], Prūsiskan] 646 | prs: [Arab, [AS, ME], دری] 647 | ps: [Arab, [AS, ME], پښتو] 648 | pt: [Latn, [EU, AM, AS, PA, AF, WW], português] 649 | pt-br: [Latn, [AM], português do Brasil] 650 | pwn: [Latn, [AS], pinayuanan] 651 | pzh: [Latn, [AS], Pazeh] 652 | qu: [Latn, [AM], Runa Simi] 653 | quc: [Latn, [AM], "K'iche'"] 654 | qug: [Latn, [AM], Runa shimi] 655 | # In ISO 639, it refers to Chanka Quechua. It may 656 | # be changed like that here, too, but for 657 | # now, redirect it to macro Quechua. 658 | quy: [qu] 659 | qwh: [Latn, [AM], anqash qichwa] 660 | qxp: [Latn, [AM], Punu qhichwa] 661 | rag: [Latn, [AF], Lologooli] 662 | raj: [Deva, [AS], राजस्थानी] 663 | rap: [Latn, [PA, AM], arero rapa nui] 664 | rcf: [Latn, [AF], Kreol Réyoné] 665 | rej: [Latn, [AS, PA], Jang] 666 | rgn: [Latn, [EU], Rumagnôl] 667 | rhg: [Rohg, [AS], 𐴌𐴟𐴇𐴥𐴝𐴚𐴒𐴙𐴝] 668 | rif: [Latn, [AF], Tarifit] 669 | rki: [Mymr, [AS], ရခိုင်] 670 | rm: [Latn, [EU], rumantsch] 671 | rm-puter: [Latn, [EU], puter] 672 | rm-rumgr: [Latn, [EU], rumantsch grischun] 673 | rm-surmiran: [Latn, [EU], surmiran] 674 | rm-sursilv: [Latn, [EU], sursilvan] 675 | rm-sutsilv: [Latn, [EU], sutsilvan] 676 | rm-vallader: [Latn, [EU], vallader] 677 | rmc: [Latn, [EU], romaňi čhib] 678 | # Also known as Fíntika Rómma 679 | rmf: [Latn, [EU], kaalengo tšimb] 680 | rml-cyrl: [Cyrl, [EU], романы] 681 | rmy: [Latn, [EU], Romani] 682 | rn: [Latn, [AF], ikirundi] 683 | ro: [Latn, [EU], română] 684 | roa-rup: [rup] 685 | roa-tara: [Latn, [EU], tarandíne] 686 | rsk: [Cyrl, [EU], руски] 687 | rtm: [Latn, [PA], Faeag Rotuma] 688 | ru: [Cyrl, [EU, AS, ME], русский] 689 | rue: [Cyrl, [EU], русиньскый] 690 | rup: [Latn, [EU], armãneashti] 691 | ruq: [Cyrl, [EU], Влахесте] 692 | ruq-cyrl: [ruq] 693 | ruq-latn: [Latn, [EU], Vlăheşte] 694 | rut: [Cyrl, [EU], мыхаӀбишды] 695 | rw: [Latn, [AF], Ikinyarwanda] 696 | # Bug: 60815 697 | rwr: [Deva, [AS], मारवाड़ी] 698 | ryu: [Jpan, [AS], うちなーぐち] 699 | sa: [Deva, [AS], संस्कृतम्] 700 | sah: [Cyrl, [EU, AS], саха тыла] 701 | sas: [Latn, [AS], Sasak] 702 | sat: [Olck, [AS], ᱥᱟᱱᱛᱟᱲᱤ] 703 | saz: [Saur, [AS], ꢱꣃꢬꢵꢯ꣄ꢡ꣄ꢬꢵ] 704 | sc: [Latn, [EU], sardu] 705 | scn: [Latn, [EU], sicilianu] 706 | sco: [Latn, [EU], Scots] 707 | sd: [Arab, [AS], سنڌي] 708 | sdc: [Latn, [EU], Sassaresu] 709 | sdh: [Arab, [ME], کوردی خوارگ] 710 | se: [Latn, [EU], davvisámegiella] 711 | se-fi: [Latn, [EU], davvisámegiella (Suoma bealde)] 712 | se-no: [Latn, [EU], davvisámegiella (Norgga bealde)] 713 | se-se: [Latn, [EU], davvisámegiella (Ruoŧa bealde)] 714 | sei: [Latn, [AM], Cmique Itom] 715 | ses: [Latn, [AF], Koyraboro Senni] 716 | sg: [Latn, [AF], Sängö] 717 | sgs: [Latn, [EU], žemaitėška] 718 | sh: [Latn, [EU], srpskohrvatski / српскохрватски] 719 | sh-cyrl: [Cyrl, [EU], српскохрватски] 720 | sh-latn: [Latn, [EU], srpskohrvatski] 721 | shi: [shi-latn] 722 | shi-latn: [Latn, [AF], Taclḥit] 723 | shi-tfng: [Tfng, [AF], ⵜⴰⵛⵍⵃⵉⵜ] 724 | shn: [Mymr, [AS], တႆး] 725 | shy: [shy-latn] 726 | shy-latn: [Latn, [AF], tacawit] 727 | si: [Sinh, [AS], සිංහල] 728 | simple: [en-simple] 729 | sjd: [Cyrl, [EU], кӣллт са̄мь кӣлл] 730 | sje: [Latn, [EU], bidumsámegiella] 731 | sjo: [Mong, [AS], ᠰᡞᠪᡝ ᡤᡞᠰᡠᠨ] 732 | sju: [Latn, [EU], ubmejesámiengiälla] 733 | sk: [Latn, [EU], slovenčina] 734 | skr: [skr-arab] 735 | skr-arab: [Arab, [AS], سرائیکی] 736 | sl: [Latn, [EU], slovenščina] 737 | sli: [Latn, [EU], Schläsch] 738 | slr: [Latn, [AS], Salırça] 739 | sly: [Latn, [AS], Bahasa Selayar] 740 | sm: [Latn, [PA], Gagana Samoa] 741 | sma: [Latn, [EU], åarjelsaemien] 742 | smj: [Latn, [EU], julevsámegiella] 743 | smn: [Latn, [EU], anarâškielâ] 744 | sms: [Latn, [EU], nuõrttsääʹmǩiõll] 745 | sn: [Latn, [AF], chiShona] 746 | so: [Latn, [AF], Soomaaliga] 747 | son: [Latn, [AF], soŋay] 748 | sq: [Latn, [EU], shqip] 749 | sr: [sr-cyrl] 750 | sr-cyrl: [Cyrl, [EU], српски] 751 | sr-ec: [sr-cyrl] 752 | sr-el: [sr-latn] 753 | sr-latn: [Latn, [EU], srpski] 754 | srn: [Latn, [AM, EU], Sranantongo] 755 | sro: [Latn, [EU], sardu campidanesu] 756 | srq: [Latn, [AM], mbia cheë] 757 | ss: [Latn, [AF], SiSwati] 758 | st: [Latn, [AF], Sesotho] 759 | stq: [Latn, [EU], Seeltersk] 760 | sty: [Cyrl, [EU, AS], себертатар] 761 | su: [Latn, [AS], Sunda] 762 | sv: [Latn, [EU], svenska] 763 | sw: [Latn, [AF], Kiswahili] 764 | swb: [Latn, [AF], Shikomoro] 765 | swh: [sw] 766 | sxu: [Latn, [EU], Säggssch] 767 | syc: [Syrc, [ME], ܣܘܪܝܝܐ] 768 | syl: [Sylo, [AS], ꠍꠤꠟꠐꠤ] 769 | syl-beng: [Beng, [AS], সিলেটি] 770 | syl-sylo: [syl] 771 | szl: [Latn, [EU], ślůnski] 772 | szy: [Latn, [AS], Sakizaya] 773 | ta: [Taml, [AS], தமிழ்] 774 | # This is initially added for Wikimiedia MinT, which outputs Tifinagh. 775 | # Perhaps some day it can be changed to Latin as default. 776 | taq: [taq-tfng] 777 | taq-latn: [Latn, [AF], təmajəq] 778 | taq-tfng: [Tfng, [AF], ⵜⴰⵎⴰⵌⴰⵆ] 779 | tay: [Latn, [AS], Tayal] 780 | tcy: [Knda, [AS], ತುಳು] 781 | tdd: [Tale, [AS], ᥖᥭᥰ ᥖᥬᥲ ᥑᥨᥒᥰ] 782 | te: [Telu, [AS], తెలుగు] 783 | tet: [Latn, [AS, PA], tetun] 784 | tg: [Cyrl, [AS], тоҷикӣ] 785 | tg-cyrl: [tg] 786 | tg-latn: [Latn, [AS], tojikī] 787 | th: [Thai, [AS], ไทย] 788 | thq: [Deva, [AS], काेचिला थारु] 789 | thr: [Deva, [AS], राना थारू] 790 | ti: [Ethi, [AF], ትግርኛ] 791 | tig: [Ethi, [AF], ትግሬ] 792 | tji: [Latn, [AS], bifzivsar] 793 | tk: [Latn, [AS], Türkmençe] 794 | tkr: [Cyrl, [AS], цӀаӀхна миз] 795 | tl: [Latn, [AS], Tagalog] 796 | tly: [Latn, [EU, AS, ME], tolışi] 797 | tly-cyrl: [Cyrl, [EU, AS, ME], толыши] 798 | tmr: [Hebr, [ME, EU, AM], ארמית בבלית] 799 | tn: [Latn, [AF], Setswana] 800 | to: [Latn, [PA], lea faka-Tonga] 801 | toi: [Latn, [AF], chitonga] 802 | tok: [Latn, [WW], toki pona] 803 | tokipona: [tok] 804 | tpi: [Latn, [PA, AS], Tok Pisin] 805 | tr: [Latn, [EU, ME], Türkçe] 806 | trp: [Latn, [AS], Kokborok] 807 | tru: [Latn, [AS], Ṫuroyo] 808 | trv: [Latn, [AS], Seediq] 809 | trw: [Arab, [AS], توروالی] 810 | ts: [Latn, [AF], Xitsonga] 811 | tsd: [Grek, [EU], Τσακωνικά] 812 | tsg: [Latn, [AS], Sinūg] 813 | tt: [Cyrl, [EU], татарча] 814 | tt-cyrl: [tt] 815 | tt-latn: [Latn, [EU], tatarça] 816 | ttj: [Latn, [AF], Orutooro] 817 | ttt: [Cyrl, [AS], Tati] 818 | tum: [Latn, [AF], chiTumbuka] 819 | tw: [Latn, [AF], Twi] 820 | twd: [Latn, [EU], Tweants] 821 | ty: [Latn, [PA], reo tahiti] 822 | tyv: [Cyrl, [AS], тыва дыл] 823 | tzl: [Latn, [WW], Talossan] 824 | tzm: [Tfng, [AF], ⵜⴰⵎⴰⵣⵉⵖⵜ] 825 | udm: [Cyrl, [EU], удмурт] 826 | # CLDR uses ug-arab, ug-latn and ug-cyrl. 827 | # Arabic seems to have the largest number of users and is the main script in the Wikipedia. 828 | ug: [ug-arab] 829 | ug-arab: [Arab, [AS], ئۇيغۇرچە] 830 | ug-cyrl: [Cyrl, [AS], уйғурчә] 831 | ug-latn: [Latn, [AS], uyghurche] 832 | uk: [Cyrl, [EU], українська] 833 | umb: [Latn, [AF], umbundu] 834 | umu: [Latn, [AM], Huluníixsuwaakan] 835 | ur: [Arab, [AS, ME], اردو] 836 | uz: [Latn, [AS], oʻzbekcha] 837 | uz-cyrl: [Cyrl, [AS], ўзбекча] 838 | uz-latn: [uz] 839 | uzn: [uz] 840 | vai: [Vaii, [AF], ꕙꔤ] 841 | ve: [Latn, [AF], Tshivenda] 842 | vec: [Latn, [EU, AM], vèneto] 843 | vep: [Latn, [EU], vepsän kel’] 844 | vi: [Latn, [AS], Tiếng Việt] 845 | vls: [Latn, [EU], West-Vlams] 846 | vmf: [Latn, [EU], Mainfränkisch] 847 | vmw: [Latn, [AF], emakhuwa] 848 | vo: [Latn, [WW], Volapük] 849 | vot: [Latn, [EU], Vaďďa] 850 | vro: [Latn, [EU], võro] 851 | wa: [Latn, [EU], walon] 852 | wal: [Latn, [AF], wolaytta] 853 | war: [Latn, [AS], Winaray] 854 | wls: [Latn, [PA], "Faka'uvea"] 855 | wlx: [Latn, [AF], waale] 856 | wo: [Latn, [AF], Wolof] 857 | wsg: [Telu, [AS], గోండి] 858 | wuu: [Hani, [AS], 吴语] 859 | wuu-hans: [Hans, [AS], 吴语(简体)] 860 | wuu-hant: [Hant, [AS], 吳語(正體)] 861 | xal: [Cyrl, [EU], хальмг] 862 | xh: [Latn, [AF], isiXhosa] 863 | xmf: [Geor, [EU], მარგალური] 864 | xmm: [Latn, [AS, PA], Manado] 865 | xon: [Latn, [AF], likpakpaanl] 866 | xsy: [Latn, [AS], SaiSiyat] 867 | ydd: [yi] 868 | yi: [Hebr, [ME, EU, AM], ייִדיש] 869 | yo: [Latn, [AF], Yorùbá] 870 | yoi: [Jpan, [AS], 与那国物言] 871 | yrk: [Cyrl, [AS], ненэцяʼ вада] 872 | yrl: [Latn, [AM], Nhẽẽgatú] 873 | yua: [Latn, [AM], "Maaya T'aan"] 874 | yue: [Hant, [AS], 粵語] 875 | yue-hans: [Hans, [AS], 粵语(简体)] 876 | yue-hant: [Hant, [AS], 粵語(繁體)] 877 | za: [Latn, [AS], Vahcuengh] 878 | zea: [Latn, [EU], Zeêuws] 879 | zgh: [Tfng, [AF], ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ] 880 | zgh-latn: [Latn, [AF], tamaziɣt tanawayt] 881 | zh: [Hani, [AS, PA, AM, WW], 中文] 882 | zh-cdo: [cdo] 883 | zh-classical: [lzh] 884 | zh-cn: [Hans, [AS], 中文(中国大陆)] 885 | zh-hans: [Hans, [AS, PA, AM, WW], 中文(简体)] 886 | zh-hant: [Hant, [AS, PA, AM, WW], 中文(繁體)] 887 | zh-hk: [Hant, [AS], 中文(香港)] 888 | zh-min-nan: [nan] 889 | zh-mo: [Hant, [AS], 中文(澳門)] 890 | zh-my: [Hans, [AS], 中文(马来西亚)] 891 | zh-sg: [Hans, [AS], 中文(新加坡)] 892 | zh-tw: [Hant, [AS], 中文(臺灣)] 893 | zh-yue: [yue] 894 | zmi: [Latn, [AS, PA], Nismilan] 895 | zsm: [ms] 896 | zu: [Latn, [AF], isiZulu] 897 | zun: [Latn, [AM], "Shiwi'ma"] 898 | 899 | # All the supported scripts, grouped logically. 900 | # 901 | # The codes are taken from http://unicode.org/iso15924/iso15924-codes.html . 902 | # 903 | # The classification is roughly based on http://www.unicode.org/charts/ 904 | # with some practical corrections. 905 | # 906 | # The order of the groups affects display. Pau Giner suggested the order; 907 | # the rationale of the order is to distance the largest groups from 908 | # one another to improve discoverability. 909 | # 910 | # The group name "Other" is reserved. 911 | scriptgroups: 912 | # It's hard to find a better place for Goth except the Latin group. 913 | Latin: [Latn, Goth] 914 | # Greek is probably different enough from Latin and Cyrillic, but user testing 915 | # may prove otherwise. 916 | Greek: [Grek] 917 | WestCaucasian: [Armn, Geor] 918 | Arabic: [Arab] 919 | # Maybe MiddleEastern can be unified with Arabic. 920 | # Maybe Thaana can be moved here from SouthAsian. 921 | # Maybe it can be unified with African. 922 | MiddleEastern: [Hebr, Syrc] 923 | African: [Bamu, Copt, Ethi, Nkoo, Tfng, Vaii] 924 | # India, Nepal, Bangladesh, Sri-Lanka, Bhutan, Maldives. 925 | # 926 | # Thaana (Thaa, the script of Maldives) is here, even though it's RTL, 927 | # because it's closer geographically to India. Maybe it should be moved 928 | # to MiddleEastern or to Arabic, if that would be easier to users. 929 | # 930 | # Tibetan (Tibt) is here, even though it's classified as "Central Asian" by 931 | # Unicode, because linguistically and geographically it's closely related to 932 | # the Brahmic family. 933 | SouthAsian: [Beng, Cakm, Deva, Gujr, Guru, Knda, Mlym, Mtei, Olck, Orya, Rohg, Saur, Sinh, Sylo, Taml, Telu, Tibt, Thaa, Wara] 934 | Cyrillic: [Cyrl] 935 | CJK: [Hani, Hans, Hant, Kore, Jpan, Yiii] 936 | SouthEastAsian: [Bali, Batk, Bugi, Cham, Java, Khmr, Laoo, Lana, Mymr, Thai, Tale] 937 | Mongolian: [Mong] 938 | SignWriting: [Sgnw] 939 | NativeAmerican: [Cher, Cans] 940 | # Undetermined script 941 | Special: [Zyyy] 942 | 943 | rtlscripts: 944 | [Arab, Hebr, Syrc, Nkoo, Rohg, Thaa] 945 | 946 | # The numbers are also used in HTML id attributes 947 | regiongroups: 948 | # Worldwide, international 949 | WW: 1 950 | # Special languages. To be shown near Worldwide when relevant. 951 | SP: 1 952 | # America 953 | AM: 2 954 | # Europe 955 | EU: 3 956 | # Middle East 957 | ME: 3 958 | # Africa 959 | AF: 3 960 | # Asia 961 | AS: 4 962 | # Pacific 963 | PA: 4 964 | -------------------------------------------------------------------------------- /src/LanguageUtil.php: -------------------------------------------------------------------------------- 1 | loadData(); 47 | } 48 | 49 | return self::$instance; 50 | } 51 | 52 | private function loadData() { 53 | $this->data = json_decode( file_get_contents( __DIR__ . '/' . self::LANGUAGE_DATA_PATH ) ); 54 | } 55 | 56 | /** 57 | * Checks if a language code is valid 58 | * @param string $languageCode Language code 59 | * @return bool 60 | */ 61 | public function isKnown( string $languageCode ): bool { 62 | return isset( $this->data->languages->$languageCode ); 63 | } 64 | 65 | /** 66 | * Checks if the language is a redirect and returns the target language code 67 | * @param string $languageCode Language code 68 | * @return string|bool Target language code if it's a redirect or false if it's not 69 | */ 70 | public function isRedirect( string $languageCode ) { 71 | if ( 72 | $this->isKnown( $languageCode ) && 73 | count( $this->getLanguage( $languageCode ) ) === 1 74 | ) { 75 | return $this->getLanguage( $languageCode )[0]; 76 | } 77 | 78 | return false; 79 | } 80 | 81 | /** 82 | * Get all the languages. The properties in the returned object are ISO 639 language codes 83 | * The value of each property is an array that has, 84 | * [writing system code, [regions list], autonym] 85 | * @return stdClass 86 | */ 87 | public function getLanguages() { 88 | return $this->data->languages; 89 | } 90 | 91 | /** 92 | * Returns the script of the language 93 | * @param string $languageCode Language code 94 | * @return string|bool Language script or false if the language is unknown 95 | */ 96 | public function getScript( string $languageCode ) { 97 | if ( !$this->isKnown( $languageCode ) ) { 98 | return false; 99 | } 100 | 101 | $targetCode = $this->isRedirect( $languageCode ); 102 | if ( $targetCode ) { 103 | return $this->getScript( $targetCode ); 104 | } 105 | 106 | return $this->getLanguage( $languageCode )[0]; 107 | } 108 | 109 | /** 110 | * Returns the regions in which a language is spoken 111 | * @param string $languageCode Language code 112 | * @return array|bool List of regions or false if language is unknown 113 | */ 114 | public function getRegions( string $languageCode ) { 115 | if ( !$this->isKnown( $languageCode ) ) { 116 | return false; 117 | } 118 | 119 | $targetCode = $this->isRedirect( $languageCode ); 120 | if ( $targetCode ) { 121 | return $this->getRegions( $targetCode ); 122 | } 123 | 124 | return $this->getLanguage( $languageCode )[1]; 125 | } 126 | 127 | /** 128 | * Returns the autonym of the language 129 | * @param string $languageCode Language code 130 | * @return string|bool Autonym of the language or false if the language is unknown 131 | */ 132 | public function getAutonym( string $languageCode ) { 133 | if ( !$this->isKnown( $languageCode ) ) { 134 | return false; 135 | } 136 | 137 | $targetCode = $this->isRedirect( $languageCode ); 138 | if ( $targetCode ) { 139 | return $this->getAutonym( $targetCode ); 140 | } 141 | 142 | $language = $this->getLanguage( $languageCode ); 143 | return count( $language ) >= 2 ? $language[2] : $languageCode; 144 | } 145 | 146 | /** 147 | * Returns all language codes and corresponding autonyms 148 | * @return array The key is the language code, and the values are corresponding 149 | * autonym 150 | */ 151 | public function getAutonyms(): array { 152 | $languages = $this->getLanguages(); 153 | $languageAutonyms = []; 154 | foreach ( $languages as $languageCode => $languageData ) { 155 | if ( $this->isRedirect( $languageCode ) ) { 156 | continue; 157 | } 158 | $languageAutonyms[$languageCode] = $this->getAutonym( $languageCode ); 159 | } 160 | 161 | return $languageAutonyms; 162 | } 163 | 164 | /** 165 | * Returns all languages written in the given scripts 166 | * @param array $scripts List of strings, each being the name of a script 167 | * @return array 168 | */ 169 | public function getLanguagesInScripts( array $scripts ): array { 170 | $languages = $this->getLanguages(); 171 | $languagesInScripts = []; 172 | foreach ( $languages as $languageCode => $languageData ) { 173 | if ( $this->isRedirect( $languageCode ) ) { 174 | continue; 175 | } 176 | 177 | $script = $this->getScript( $languageCode ); 178 | if ( in_array( $script, $scripts ) ) { 179 | $languagesInScripts[] = $languageCode; 180 | } 181 | } 182 | 183 | return $languagesInScripts; 184 | } 185 | 186 | /** 187 | * Returns all languages written in the given script 188 | * @param string $script Name of the script 189 | * @return array 190 | */ 191 | public function getLanguagesInScript( string $script ): array { 192 | return $this->getLanguagesInScripts( [ $script ] ); 193 | } 194 | 195 | /** 196 | * Returns the script group of a script or "Other" if it doesn't belong to any group 197 | * @param string $script Name of the script 198 | * @return string Script group name or "Other" if the script doesn't belong to any group 199 | */ 200 | public function getGroupOfScript( string $script ): string { 201 | $scriptGroups = $this->data->scriptgroups; 202 | foreach ( $scriptGroups as $scriptGroup => $scriptGroupData ) { 203 | if ( in_array( $script, $scriptGroupData ) ) { 204 | return $scriptGroup; 205 | } 206 | } 207 | 208 | return self::OTHER_SCRIPT_GROUP; 209 | } 210 | 211 | /** 212 | * Returns the script group of a language. Language belongs to a script, and the script 213 | * belongs to a script group 214 | * @param string $languageCode Language code 215 | * @return string script group name 216 | */ 217 | public function getScriptGroupOfLanguage( string $languageCode ): string { 218 | return $this->getGroupOfScript( $this->getScript( $languageCode ) ); 219 | } 220 | 221 | /** 222 | * Return the list of languages passed, grouped by their script group 223 | * @param array $languageCodes List of language codes to group 224 | * @return array List of language codes grouped by script group 225 | */ 226 | public function getLanguagesByScriptGroup( array $languageCodes ): array { 227 | $languagesByScriptGroup = []; 228 | 229 | foreach ( $languageCodes as $languageCode ) { 230 | if ( !$this->isKnown( $languageCode ) ) { 231 | continue; 232 | } 233 | 234 | $targetLanguageCode = $this->isRedirect( $languageCode ); 235 | if ( $targetLanguageCode === false ) { 236 | $targetLanguageCode = $languageCode; 237 | } 238 | $langScriptGroup = $this->getScriptGroupOfLanguage( $targetLanguageCode ); 239 | 240 | if ( !isset( $languagesByScriptGroup[$langScriptGroup] ) ) { 241 | $languagesByScriptGroup[$langScriptGroup] = []; 242 | } 243 | 244 | $languagesByScriptGroup[$langScriptGroup][] = $languageCode; 245 | } 246 | 247 | return $languagesByScriptGroup; 248 | } 249 | 250 | /** 251 | * Returns an associative array of languages in several regions, 252 | * grouped by script group 253 | * @param array $regions List of strings representing region codes 254 | * @return array Returns an associative array. They key is the script group name, 255 | * and the value is a list of language codes in that region. 256 | */ 257 | public function getLanguagesByScriptGroupInRegions( array $regions ): array { 258 | $languagesByScriptGroupInRegions = []; 259 | $languages = $this->getLanguages(); 260 | 261 | foreach ( $languages as $languageCode => $languageData ) { 262 | if ( $this->isRedirect( $languageCode ) ) { 263 | continue; 264 | } 265 | 266 | $languageRegions = $this->getRegions( $languageCode ); 267 | foreach ( $regions as $region ) { 268 | if ( !in_array( $region, $languageRegions ) ) { 269 | continue; 270 | } 271 | 272 | $langScriptGroup = $this->getScriptGroupOfLanguage( $languageCode ); 273 | if ( !isset( $languagesByScriptGroupInRegions[$langScriptGroup] ) ) { 274 | $languagesByScriptGroupInRegions[$langScriptGroup] = []; 275 | } 276 | 277 | $languagesByScriptGroupInRegions[$langScriptGroup][] = $languageCode; 278 | } 279 | } 280 | 281 | return $languagesByScriptGroupInRegions; 282 | } 283 | 284 | /** 285 | * Returns an associative array of languages in a region, grouped by their script 286 | * @see LanguageUtil#getLanguagesByScriptGroupInRegions 287 | * @param string $region Region code 288 | * @return array 289 | */ 290 | public function getLanguagesByScriptGroupInRegion( string $region ): array { 291 | return $this->getLanguagesByScriptGroupInRegions( [ $region ] ); 292 | } 293 | 294 | /** 295 | * Return the list of languages sorted by their script groups 296 | * @param array $languageCodes List of language codes to sort 297 | * @return array Sorted list of strings containing language codes 298 | */ 299 | public function sortByScriptGroup( array $languageCodes ): array { 300 | $groupedLanguageData = $this->getLanguagesByScriptGroup( $languageCodes ); 301 | ksort( $groupedLanguageData, SORT_STRING | SORT_FLAG_CASE ); 302 | 303 | $sortedLanguageData = []; 304 | foreach ( $groupedLanguageData as $languageData ) { 305 | $sortedLanguageData = array_merge( $sortedLanguageData, $languageData ); 306 | } 307 | 308 | return $sortedLanguageData; 309 | } 310 | 311 | /** 312 | * Sort languages by their autonym 313 | * @param array $languageCodes List of language codes to sort 314 | * @return array List of sorted language codes returned by their autonym 315 | */ 316 | public function sortByAutonym( array $languageCodes ): array { 317 | $sortedLanguages = []; 318 | foreach ( $languageCodes as $languageCode ) { 319 | $autonym = $this->getAutonym( $languageCode ); 320 | if ( $autonym !== false ) { 321 | $sortedLanguages[$languageCode] = $autonym; 322 | } 323 | } 324 | 325 | asort( $sortedLanguages, SORT_STRING | SORT_FLAG_CASE ); 326 | 327 | return array_keys( $sortedLanguages ); 328 | } 329 | 330 | /** 331 | * Check if a language is right-to-left 332 | * @param string $languageCode Language code 333 | * @return bool true if it is an RTL language, else false. Returns false if an 334 | * unknown language code is passed. 335 | */ 336 | public function isRtl( string $languageCode ): bool { 337 | $script = $this->getScript( $languageCode ); 338 | return in_array( $script, $this->data->rtlscripts ); 339 | } 340 | 341 | /** 342 | * Return the direction of the language 343 | * @param string $languageCode Language code 344 | * @return string|bool Returns 'rtl' or 'ltr'. If the language code is unknown, 345 | * returns false. 346 | */ 347 | public function getDir( string $languageCode ) { 348 | if ( $this->isKnown( $languageCode ) ) { 349 | return $this->isRtl( $languageCode ) ? 'rtl' : 'ltr'; 350 | } 351 | 352 | return false; 353 | } 354 | 355 | /** 356 | * Returns the languages spoken in a territory 357 | * @param string $territory Territory code 358 | * @return array|bool List of language codes in the territory, or else false if invalid 359 | * territory is passed 360 | */ 361 | public function getLanguagesInTerritory( string $territory ) { 362 | if ( isset( $this->data->territories->$territory ) ) { 363 | return $this->data->territories->$territory; 364 | } 365 | 366 | return false; 367 | } 368 | 369 | /** 370 | * Adds a language in run time and sets its options as provided. 371 | * If the target option is provided, the language is defined as a redirect. 372 | * Other possible options are `script` (string), `regions` (array) and `autonym` (string). 373 | * @param string $languageCode New language code. 374 | * @param array $options Language properties. 375 | */ 376 | public function addLanguage( string $languageCode, array $options ): void { 377 | $languages = $this->getLanguages(); 378 | if ( isset( $options['target'] ) ) { 379 | $languages->$languageCode = [ $options['target'] ]; 380 | } else { 381 | $languages->$languageCode = 382 | [ $options['script'], $options['regions'], $options['autonym'] ]; 383 | } 384 | } 385 | 386 | /** 387 | * Return the language data based on language code. Performs no check, meant for 388 | * internal use only 389 | * @param string $languageCode 390 | * @return array 391 | */ 392 | private function getLanguage( string $languageCode ): array { 393 | return $this->data->languages->$languageCode; 394 | } 395 | } 396 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | var languageData = require( '../data/language-data.json' ); 2 | 3 | /** 4 | * Utility functions for querying language data. 5 | */ 6 | 7 | /** 8 | * Check whether the languageCode is known to the language database. 9 | * For practical purposes it may be same as checking if given language code is valid, 10 | * but not guaranteed that all valid language codes are in our database. 11 | * 12 | * @param {string} languageCode language code 13 | * @return {boolean} 14 | */ 15 | function isKnown( languageCode ) { 16 | return !!languageData.languages[ languageCode ]; 17 | } 18 | 19 | /** 20 | * Is this language a redirect to another language? 21 | * 22 | * @param {string} language Language code 23 | * @return {string} Target language code if it's a redirect or false if it's not 24 | */ 25 | function isRedirect( language ) { 26 | return ( isKnown( language ) && languageData.languages[ language ].length === 1 ) ? 27 | languageData.languages[ language ][ 0 ] : false; 28 | } 29 | 30 | /** 31 | * Get all the languages 32 | * 33 | * @return {Object} 34 | */ 35 | function getLanguages() { 36 | return languageData.languages; 37 | } 38 | 39 | /** 40 | * Returns the script of the language. 41 | * 42 | * @param {string} language Language code 43 | * @return {string} 44 | */ 45 | function getScript( language ) { 46 | var target = isRedirect( language ); 47 | if ( target ) { 48 | return getScript( target ); 49 | } 50 | if ( !isKnown( language ) ) { 51 | // Undetermined 52 | return 'Zyyy'; 53 | } 54 | return languageData.languages[ language ][ 0 ]; 55 | } 56 | 57 | /** 58 | * Returns the regions in which a language is spoken. 59 | * 60 | * @param {string} language Language code 61 | * @return {string[]} 'UNKNOWN' 62 | */ 63 | function getRegions( language ) { 64 | var target = isRedirect( language ); 65 | if ( target ) { 66 | return getRegions( target ); 67 | } 68 | return ( isKnown( language ) && languageData.languages[ language ][ 1 ] ) || 'UNKNOWN'; 69 | } 70 | 71 | /** 72 | * Returns the autonym of the language. 73 | * 74 | * @param {string} language Language code 75 | * @return {string} 76 | */ 77 | function getAutonym( language ) { 78 | var target = isRedirect( language ); 79 | if ( target ) { 80 | return getAutonym( target ); 81 | } 82 | return ( isKnown( language ) && languageData.languages[ language ][ 2 ] ) || language; 83 | } 84 | 85 | /** 86 | * Returns all language codes and corresponding autonyms 87 | * 88 | * @return {Array} 89 | */ 90 | function getAutonyms() { 91 | var language, 92 | autonymsByCode = {}; 93 | for ( language in languageData.languages ) { 94 | if ( isRedirect( language ) ) { 95 | continue; 96 | } 97 | autonymsByCode[ language ] = getAutonym( language ); 98 | } 99 | return autonymsByCode; 100 | } 101 | 102 | /** 103 | * Returns all languages written in the given scripts. 104 | * 105 | * @param {string[]} scripts 106 | * @return {string[]} languages codes 107 | */ 108 | function getLanguagesInScripts( scripts ) { 109 | var language, i, 110 | languagesInScripts = []; 111 | for ( language in languageData.languages ) { 112 | if ( isRedirect( language ) ) { 113 | continue; 114 | } 115 | for ( i = 0; i < scripts.length; i++ ) { 116 | if ( scripts[ i ] === getScript( language ) ) { 117 | languagesInScripts.push( language ); 118 | break; 119 | } 120 | } 121 | } 122 | return languagesInScripts; 123 | } 124 | 125 | /** 126 | * Returns all languages written in script. 127 | * 128 | * @param {string} script 129 | * @return {string[]} array of strings (languages codes) 130 | */ 131 | function getLanguagesInScript( script ) { 132 | return getLanguagesInScripts( [ script ] ); 133 | } 134 | 135 | /** 136 | * Returns the script group of a script or 'Other' if it doesn't 137 | * belong to any group. 138 | * 139 | * @param {string} script Script code 140 | * @return {string} script group name 141 | */ 142 | function getGroupOfScript( script ) { 143 | var scriptGroup; 144 | for ( scriptGroup in languageData.scriptgroups ) { 145 | if ( languageData.scriptgroups[ scriptGroup ].includes( script ) ) { 146 | return scriptGroup; 147 | } 148 | } 149 | return 'Other'; 150 | } 151 | 152 | /** 153 | * Returns the script group of a language. 154 | * 155 | * @param {string} language Language code 156 | * @return {string} script group name 157 | */ 158 | function getScriptGroupOfLanguage( language ) { 159 | return getGroupOfScript( getScript( language ) ); 160 | } 161 | 162 | /** 163 | * Get the given list of languages grouped by script. 164 | * 165 | * @param {string[]} languages Array of language codes to group 166 | * @return {string[]} Array of language codes 167 | */ 168 | function getLanguagesByScriptGroup( languages ) { 169 | var languagesByScriptGroup = {}, 170 | language, languageIndex, resolvedRedirect, langScriptGroup; 171 | 172 | for ( languageIndex = 0; languageIndex < languages.length; languageIndex++ ) { 173 | language = languages[ languageIndex ]; 174 | resolvedRedirect = isRedirect( language ) || language; 175 | langScriptGroup = getScriptGroupOfLanguage( resolvedRedirect ); 176 | if ( !languagesByScriptGroup[ langScriptGroup ] ) { 177 | languagesByScriptGroup[ langScriptGroup ] = []; 178 | } 179 | languagesByScriptGroup[ langScriptGroup ].push( language ); 180 | } 181 | return languagesByScriptGroup; 182 | } 183 | 184 | /** 185 | * Returns an associative array of languages in several regions, 186 | * grouped by script group. 187 | * 188 | * @param {string[]} regions array of region codes 189 | * @return {Object} 190 | */ 191 | function getLanguagesByScriptGroupInRegions( regions ) { 192 | var language, i, scriptGroup, 193 | languagesByScriptGroupInRegions = {}; 194 | for ( language in languageData.languages ) { 195 | if ( isRedirect( language ) ) { 196 | continue; 197 | } 198 | for ( i = 0; i < regions.length; i++ ) { 199 | if ( getRegions( language ).includes( regions[ i ] ) ) { 200 | scriptGroup = getScriptGroupOfLanguage( language ); 201 | if ( languagesByScriptGroupInRegions[ scriptGroup ] === undefined ) { 202 | languagesByScriptGroupInRegions[ scriptGroup ] = []; 203 | } 204 | languagesByScriptGroupInRegions[ scriptGroup ].push( language ); 205 | break; 206 | } 207 | } 208 | } 209 | return languagesByScriptGroupInRegions; 210 | } 211 | 212 | /** 213 | * Returns an associative array of languages in a region, 214 | * grouped by script group. 215 | * 216 | * @param {string} region Region code 217 | * @return {Object} 218 | */ 219 | function getLanguagesByScriptGroupInRegion( region ) { 220 | return getLanguagesByScriptGroupInRegions( [ region ] ); 221 | } 222 | 223 | /** 224 | * Return the list of languages sorted by script groups. 225 | * 226 | * @param {string[]} languages Array of language codes to sort 227 | * @return {string[]} Array of language codes 228 | */ 229 | function sortByScriptGroup( languages ) { 230 | var groupedLanguages, scriptGroups, i, 231 | allLanguages = []; 232 | 233 | groupedLanguages = getLanguagesByScriptGroup( languages ); 234 | scriptGroups = Object.keys( groupedLanguages ).sort(); 235 | 236 | for ( i = 0; i < scriptGroups.length; i++ ) { 237 | allLanguages = allLanguages.concat( groupedLanguages[ scriptGroups[ i ] ] ); 238 | } 239 | 240 | return allLanguages; 241 | } 242 | 243 | /** 244 | * A callback for sorting languages by autonym. 245 | * Can be used as an argument to a sort function. 246 | * 247 | * @param {string} a Language code 248 | * @param {string} b Language code 249 | * @return {number} 250 | */ 251 | function sortByAutonym( a, b ) { 252 | var autonymA = getAutonym( a ) || a, 253 | autonymB = getAutonym( b ) || b; 254 | return ( autonymA.toLowerCase() < autonymB.toLowerCase() ) ? -1 : 1; 255 | } 256 | 257 | /** 258 | * Check if a language is right-to-left. 259 | * 260 | * @param {string} language Language code 261 | * @return {boolean} 262 | */ 263 | function isRtl( language ) { 264 | return languageData.rtlscripts.includes( getScript( language ) ); 265 | } 266 | 267 | /** 268 | * Return the direction of the language 269 | * 270 | * @param {string} language Language code 271 | * @return {string} 272 | */ 273 | function getDir( language ) { 274 | return isRtl( language ) ? 'rtl' : 'ltr'; 275 | } 276 | 277 | /** 278 | * Returns the languages spoken in a territory. 279 | * 280 | * @param {string} territory Territory code 281 | * @return {string[]} list of language codes 282 | */ 283 | function getLanguagesInTerritory( territory ) { 284 | return languageData.territories[ territory ] || []; 285 | } 286 | 287 | /** 288 | * Adds a language in run time and sets its options as provided. 289 | * If the target option is provided, the language is defined as a redirect. 290 | * Other possible options are script, regions and autonym. 291 | * 292 | * @param {string} code New language code. 293 | * @param {Object} options Language properties. 294 | */ 295 | function addLanguage( code, options ) { 296 | if ( options.target ) { 297 | languageData.languages[ code ] = [ options.target ]; 298 | } else { 299 | languageData.languages[ code ] = [ options.script, options.regions, options.autonym ]; 300 | } 301 | } 302 | 303 | module.exports = { 304 | addLanguage, 305 | getAutonym, 306 | getAutonyms, 307 | getDir, 308 | getGroupOfScript, 309 | getLanguages, 310 | getLanguagesByScriptGroup, 311 | getLanguagesByScriptGroupInRegion, 312 | getLanguagesByScriptGroupInRegions, 313 | getLanguagesInScript, 314 | getLanguagesInScripts, 315 | getLanguagesInTerritory, 316 | getRegions, 317 | getScript, 318 | getScriptGroupOfLanguage, 319 | isKnown, 320 | isRedirect, 321 | isRtl, 322 | sortByScriptGroup, 323 | sortByAutonym 324 | }; 325 | -------------------------------------------------------------------------------- /src/util/ulsdata2json.php: -------------------------------------------------------------------------------- 1 | territoryInfo->territory as $territoryRecord ) { 54 | $territoryAtributes = $territoryRecord->attributes(); 55 | $territoryCodeAttr = $territoryAtributes['type']; 56 | $territoryCode = (string)$territoryCodeAttr[0]; 57 | $parsedLangdb['territories'][$territoryCode] = []; 58 | 59 | foreach ( $territoryRecord->languagePopulation as $languageRecord ) { 60 | $languageAttributes = $languageRecord->attributes(); 61 | $languageCodeAttr = $languageAttributes['type']; 62 | // Lower case is a convention for language codes in ULS. 63 | // '_' is used in CLDR for compound codes and it's replaced with '-' here. 64 | 65 | $normalisedCode = strtr( strtolower( (string)$languageCodeAttr[0] ), '_', '-' ); 66 | 67 | $parsedLangdb['territories'][$territoryCode][] = $normalisedCode; 68 | 69 | // In case of codes with variants, also add the base because ULS might consider 70 | // them as separate languages, e.g. zh, zh-hant and zh-hans. 71 | if ( strpos( $normalisedCode, '-' ) !== false ) { 72 | $parts = explode( '-', $normalisedCode ); 73 | $parsedLangdb['territories'][$territoryCode][] = $parts[0]; 74 | } 75 | } 76 | } 77 | 78 | foreach ( $parsedLangdb['territories'] as $territoryCode => $languages ) { 79 | foreach ( $languages as $index => $language ) { 80 | if ( !isset( $parsedLangdb['languages'][$language] ) ) { 81 | echo "Unknown language $language for territory $territoryCode\n"; 82 | unset( $parsedLangdb['territories'][$territoryCode][$index] ); 83 | continue; 84 | } 85 | 86 | $data = $parsedLangdb['languages'][$language]; 87 | if ( count( $data ) === 1 ) { 88 | echo "Redirect for language $language to {$data[0]} territory $territoryCode\n"; 89 | $parsedLangdb['territories'][$territoryCode][$index] = $data[0]; 90 | continue; 91 | } 92 | } 93 | 94 | // Clean-up to save space 95 | if ( count( $parsedLangdb['territories'][$territoryCode] ) === 0 ) { 96 | unset( $parsedLangdb['territories'][$territoryCode] ); 97 | continue; 98 | } 99 | 100 | // Remove duplicates we might have created 101 | $parsedLangdb['territories'][$territoryCode] = 102 | array_unique( $parsedLangdb['territories'][$territoryCode] ); 103 | 104 | // We need to renumber or json conversion thinks these are objects 105 | $parsedLangdb['territories'][$territoryCode] = 106 | array_values( $parsedLangdb['territories'][$territoryCode] ); 107 | } 108 | 109 | print "Writing JSON langdb...\n"; 110 | $jsonVerbose = json_encode( $parsedLangdb, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE ) . "\n"; 111 | // For making diff review easier. 112 | file_put_contents( DATA_DIRECTORY . '/language-data.json', $jsonVerbose ); 113 | 114 | print "Done.\n"; 115 | -------------------------------------------------------------------------------- /yaml-sort-checker.yml: -------------------------------------------------------------------------------- 1 | files: 2 | data/langdb.yaml: 3 | excludedSections: 4 | - scriptgroups 5 | - rtlscripts 6 | - regiongroups 7 | yaml-sort-checker.yml: 8 | --------------------------------------------------------------------------------