LanguageCodes.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. /**
  3. * @package Grav\Common\Language
  4. *
  5. * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. namespace Grav\Common\Language;
  9. /**
  10. * Class LanguageCodes
  11. * @package Grav\Common\Language
  12. */
  13. class LanguageCodes
  14. {
  15. /** @var array */
  16. protected static $codes = [
  17. 'af' => [ 'name' => 'Afrikaans', 'nativeName' => 'Afrikaans' ],
  18. 'ak' => [ 'name' => 'Akan', 'nativeName' => 'Akan' ], // unverified native name
  19. 'ast' => [ 'name' => 'Asturian', 'nativeName' => 'Asturianu' ],
  20. 'ar' => [ 'name' => 'Arabic', 'nativeName' => 'عربي', 'orientation' => 'rtl'],
  21. 'as' => [ 'name' => 'Assamese', 'nativeName' => 'অসমীয়া' ],
  22. 'be' => [ 'name' => 'Belarusian', 'nativeName' => 'Беларуская' ],
  23. 'bg' => [ 'name' => 'Bulgarian', 'nativeName' => 'Български' ],
  24. 'bn' => [ 'name' => 'Bengali', 'nativeName' => 'বাংলা' ],
  25. 'bn-BD' => [ 'name' => 'Bengali (Bangladesh)', 'nativeName' => 'বাংলা (বাংলাদেশ)' ],
  26. 'bn-IN' => [ 'name' => 'Bengali (India)', 'nativeName' => 'বাংলা (ভারত)' ],
  27. 'br' => [ 'name' => 'Breton', 'nativeName' => 'Brezhoneg' ],
  28. 'bs' => [ 'name' => 'Bosnian', 'nativeName' => 'Bosanski' ],
  29. 'ca' => [ 'name' => 'Catalan', 'nativeName' => 'Català' ],
  30. 'ca-valencia'=> [ 'name' => 'Catalan (Valencian)', 'nativeName' => 'Català (valencià)' ], // not iso-639-1. a=l10n-drivers
  31. 'cs' => [ 'name' => 'Czech', 'nativeName' => 'Čeština' ],
  32. 'cy' => [ 'name' => 'Welsh', 'nativeName' => 'Cymraeg' ],
  33. 'da' => [ 'name' => 'Danish', 'nativeName' => 'Dansk' ],
  34. 'de' => [ 'name' => 'German', 'nativeName' => 'Deutsch' ],
  35. 'de-AT' => [ 'name' => 'German (Austria)', 'nativeName' => 'Deutsch (Österreich)' ],
  36. 'de-CH' => [ 'name' => 'German (Switzerland)', 'nativeName' => 'Deutsch (Schweiz)' ],
  37. 'de-DE' => [ 'name' => 'German (Germany)', 'nativeName' => 'Deutsch (Deutschland)' ],
  38. 'dsb' => [ 'name' => 'Lower Sorbian', 'nativeName' => 'Dolnoserbšćina' ], // iso-639-2
  39. 'el' => [ 'name' => 'Greek', 'nativeName' => 'Ελληνικά' ],
  40. 'en' => [ 'name' => 'English', 'nativeName' => 'English' ],
  41. 'en-AU' => [ 'name' => 'English (Australian)', 'nativeName' => 'English (Australian)' ],
  42. 'en-CA' => [ 'name' => 'English (Canadian)', 'nativeName' => 'English (Canadian)' ],
  43. 'en-GB' => [ 'name' => 'English (British)', 'nativeName' => 'English (British)' ],
  44. 'en-NZ' => [ 'name' => 'English (New Zealand)', 'nativeName' => 'English (New Zealand)' ],
  45. 'en-US' => [ 'name' => 'English (US)', 'nativeName' => 'English (US)' ],
  46. 'en-ZA' => [ 'name' => 'English (South African)', 'nativeName' => 'English (South African)' ],
  47. 'eo' => [ 'name' => 'Esperanto', 'nativeName' => 'Esperanto' ],
  48. 'es' => [ 'name' => 'Spanish', 'nativeName' => 'Español' ],
  49. 'es-AR' => [ 'name' => 'Spanish (Argentina)', 'nativeName' => 'Español (de Argentina)' ],
  50. 'es-CL' => [ 'name' => 'Spanish (Chile)', 'nativeName' => 'Español (de Chile)' ],
  51. 'es-ES' => [ 'name' => 'Spanish (Spain)', 'nativeName' => 'Español (de España)' ],
  52. 'es-MX' => [ 'name' => 'Spanish (Mexico)', 'nativeName' => 'Español (de México)' ],
  53. 'et' => [ 'name' => 'Estonian', 'nativeName' => 'Eesti keel' ],
  54. 'eu' => [ 'name' => 'Basque', 'nativeName' => 'Euskara' ],
  55. 'fa' => [ 'name' => 'Persian', 'nativeName' => 'فارسی' , 'orientation' => 'rtl' ],
  56. 'fi' => [ 'name' => 'Finnish', 'nativeName' => 'Suomi' ],
  57. 'fj-FJ' => [ 'name' => 'Fijian', 'nativeName' => 'Vosa vaka-Viti' ],
  58. 'fr' => [ 'name' => 'French', 'nativeName' => 'Français' ],
  59. 'fr-CA' => [ 'name' => 'French (Canada)', 'nativeName' => 'Français (Canada)' ],
  60. 'fr-FR' => [ 'name' => 'French (France)', 'nativeName' => 'Français (France)' ],
  61. 'fur' => [ 'name' => 'Friulian', 'nativeName' => 'Furlan' ],
  62. 'fur-IT' => [ 'name' => 'Friulian', 'nativeName' => 'Furlan' ],
  63. 'fy' => [ 'name' => 'Frisian', 'nativeName' => 'Frysk' ],
  64. 'fy-NL' => [ 'name' => 'Frisian', 'nativeName' => 'Frysk' ],
  65. 'ga' => [ 'name' => 'Irish', 'nativeName' => 'Gaeilge' ],
  66. 'ga-IE' => [ 'name' => 'Irish (Ireland)', 'nativeName' => 'Gaeilge (Éire)' ],
  67. 'gd' => [ 'name' => 'Gaelic (Scotland)', 'nativeName' => 'Gàidhlig' ],
  68. 'gl' => [ 'name' => 'Galician', 'nativeName' => 'Galego' ],
  69. 'gu' => [ 'name' => 'Gujarati', 'nativeName' => 'ગુજરાતી' ],
  70. 'gu-IN' => [ 'name' => 'Gujarati', 'nativeName' => 'ગુજરાતી' ],
  71. 'he' => [ 'name' => 'Hebrew', 'nativeName' => 'עברית', 'orientation' => 'rtl' ],
  72. 'hi' => [ 'name' => 'Hindi', 'nativeName' => 'हिन्दी' ],
  73. 'hi-IN' => [ 'name' => 'Hindi (India)', 'nativeName' => 'हिन्दी (भारत)' ],
  74. 'hr' => [ 'name' => 'Croatian', 'nativeName' => 'Hrvatski' ],
  75. 'hsb' => [ 'name' => 'Upper Sorbian', 'nativeName' => 'Hornjoserbsce' ],
  76. 'hu' => [ 'name' => 'Hungarian', 'nativeName' => 'Magyar' ],
  77. 'hy' => [ 'name' => 'Armenian', 'nativeName' => 'Հայերեն' ],
  78. 'hy-AM' => [ 'name' => 'Armenian', 'nativeName' => 'Հայերեն' ],
  79. 'id' => [ 'name' => 'Indonesian', 'nativeName' => 'Bahasa Indonesia' ],
  80. 'is' => [ 'name' => 'Icelandic', 'nativeName' => 'íslenska' ],
  81. 'it' => [ 'name' => 'Italian', 'nativeName' => 'Italiano' ],
  82. 'ja' => [ 'name' => 'Japanese', 'nativeName' => '日本語' ],
  83. 'ja-JP' => [ 'name' => 'Japanese', 'nativeName' => '日本語' ], // not iso-639-1
  84. 'ka' => [ 'name' => 'Georgian', 'nativeName' => 'ქართული' ],
  85. 'kk' => [ 'name' => 'Kazakh', 'nativeName' => 'Қазақ' ],
  86. 'km' => [ 'name' => 'Khmer', 'nativeName' => 'Khmer' ],
  87. 'kn' => [ 'name' => 'Kannada', 'nativeName' => 'ಕನ್ನಡ' ],
  88. 'ko' => [ 'name' => 'Korean', 'nativeName' => '한국어' ],
  89. 'ku' => [ 'name' => 'Kurdish', 'nativeName' => 'Kurdî' ],
  90. 'la' => [ 'name' => 'Latin', 'nativeName' => 'Latina' ],
  91. 'lb' => [ 'name' => 'Luxembourgish', 'nativeName' => 'Lëtzebuergesch' ],
  92. 'lg' => [ 'name' => 'Luganda', 'nativeName' => 'Luganda' ],
  93. 'lo' => [ 'name' => 'Lao', 'nativeName' => 'Lao' ],
  94. 'lt' => [ 'name' => 'Lithuanian', 'nativeName' => 'Lietuvių' ],
  95. 'lv' => [ 'name' => 'Latvian', 'nativeName' => 'Latviešu' ],
  96. 'mai' => [ 'name' => 'Maithili', 'nativeName' => 'मैथिली মৈথিলী' ],
  97. 'mg' => [ 'name' => 'Malagasy', 'nativeName' => 'Malagasy' ],
  98. 'mi' => [ 'name' => 'Maori (Aotearoa)', 'nativeName' => 'Māori (Aotearoa)' ],
  99. 'mk' => [ 'name' => 'Macedonian', 'nativeName' => 'Македонски' ],
  100. 'ml' => [ 'name' => 'Malayalam', 'nativeName' => 'മലയാളം' ],
  101. 'mn' => [ 'name' => 'Mongolian', 'nativeName' => 'Монгол' ],
  102. 'mr' => [ 'name' => 'Marathi', 'nativeName' => 'मराठी' ],
  103. 'my' => [ 'name' => 'Myanmar (Burmese)', 'nativeName' => 'ဗမာी' ],
  104. 'no' => [ 'name' => 'Norwegian', 'nativeName' => 'Norsk' ],
  105. 'nb' => [ 'name' => 'Norwegian', 'nativeName' => 'Norsk' ],
  106. 'nb-NO' => [ 'name' => 'Norwegian (Bokmål)', 'nativeName' => 'Norsk bokmål' ],
  107. 'ne-NP' => [ 'name' => 'Nepali', 'nativeName' => 'नेपाली' ],
  108. 'nn-NO' => [ 'name' => 'Norwegian (Nynorsk)', 'nativeName' => 'Norsk nynorsk' ],
  109. 'nl' => [ 'name' => 'Dutch', 'nativeName' => 'Nederlands' ],
  110. 'nr' => [ 'name' => 'Ndebele, South', 'nativeName' => 'IsiNdebele' ],
  111. 'nso' => [ 'name' => 'Northern Sotho', 'nativeName' => 'Sepedi' ],
  112. 'oc' => [ 'name' => 'Occitan (Lengadocian)', 'nativeName' => 'Occitan (lengadocian)' ],
  113. 'or' => [ 'name' => 'Oriya', 'nativeName' => 'ଓଡ଼ିଆ' ],
  114. 'pa' => [ 'name' => 'Punjabi', 'nativeName' => 'ਪੰਜਾਬੀ' ],
  115. 'pa-IN' => [ 'name' => 'Punjabi', 'nativeName' => 'ਪੰਜਾਬੀ' ],
  116. 'pl' => [ 'name' => 'Polish', 'nativeName' => 'Polski' ],
  117. 'pt' => [ 'name' => 'Portuguese', 'nativeName' => 'Português' ],
  118. 'pt-BR' => [ 'name' => 'Portuguese (Brazilian)', 'nativeName' => 'Português (do Brasil)' ],
  119. 'pt-PT' => [ 'name' => 'Portuguese (Portugal)', 'nativeName' => 'Português (Europeu)' ],
  120. 'ro' => [ 'name' => 'Romanian', 'nativeName' => 'Română' ],
  121. 'rm' => [ 'name' => 'Romansh', 'nativeName' => 'Rumantsch' ],
  122. 'ru' => [ 'name' => 'Russian', 'nativeName' => 'Русский' ],
  123. 'rw' => [ 'name' => 'Kinyarwanda', 'nativeName' => 'Ikinyarwanda' ],
  124. 'si' => [ 'name' => 'Sinhala', 'nativeName' => 'සිංහල' ],
  125. 'sk' => [ 'name' => 'Slovak', 'nativeName' => 'Slovenčina' ],
  126. 'sl' => [ 'name' => 'Slovenian', 'nativeName' => 'Slovensko' ],
  127. 'son' => [ 'name' => 'Songhai', 'nativeName' => 'Soŋay' ],
  128. 'sq' => [ 'name' => 'Albanian', 'nativeName' => 'Shqip' ],
  129. 'sr' => [ 'name' => 'Serbian', 'nativeName' => 'Српски' ],
  130. 'sr-Latn' => [ 'name' => 'Serbian', 'nativeName' => 'Srpski' ], // follows RFC 4646
  131. 'ss' => [ 'name' => 'Siswati', 'nativeName' => 'siSwati' ],
  132. 'st' => [ 'name' => 'Southern Sotho', 'nativeName' => 'Sesotho' ],
  133. 'sv' => [ 'name' => 'Swedish', 'nativeName' => 'Svenska' ],
  134. 'sv-SE' => [ 'name' => 'Swedish', 'nativeName' => 'Svenska' ],
  135. 'sw' => [ 'name' => 'Swahili', 'nativeName' => 'Swahili' ],
  136. 'ta' => [ 'name' => 'Tamil', 'nativeName' => 'தமிழ்' ],
  137. 'ta-IN' => [ 'name' => 'Tamil (India)', 'nativeName' => 'தமிழ் (இந்தியா)' ],
  138. 'ta-LK' => [ 'name' => 'Tamil (Sri Lanka)', 'nativeName' => 'தமிழ் (இலங்கை)' ],
  139. 'te' => [ 'name' => 'Telugu', 'nativeName' => 'తెలుగు' ],
  140. 'th' => [ 'name' => 'Thai', 'nativeName' => 'ไทย' ],
  141. 'tlh' => [ 'name' => 'Klingon', 'nativeName' => 'Klingon' ],
  142. 'tn' => [ 'name' => 'Tswana', 'nativeName' => 'Setswana' ],
  143. 'tr' => [ 'name' => 'Turkish', 'nativeName' => 'Türkçe' ],
  144. 'ts' => [ 'name' => 'Tsonga', 'nativeName' => 'Xitsonga' ],
  145. 'tt' => [ 'name' => 'Tatar', 'nativeName' => 'Tatarça' ],
  146. 'tt-RU' => [ 'name' => 'Tatar', 'nativeName' => 'Tatarça' ],
  147. 'uk' => [ 'name' => 'Ukrainian', 'nativeName' => 'Українська' ],
  148. 'ur' => [ 'name' => 'Urdu', 'nativeName' => 'اُردو', 'orientation' => 'rtl' ],
  149. 've' => [ 'name' => 'Venda', 'nativeName' => 'Tshivenḓa' ],
  150. 'vi' => [ 'name' => 'Vietnamese', 'nativeName' => 'Tiếng Việt' ],
  151. 'wo' => [ 'name' => 'Wolof', 'nativeName' => 'Wolof' ],
  152. 'xh' => [ 'name' => 'Xhosa', 'nativeName' => 'isiXhosa' ],
  153. 'yi' => [ 'name' => 'Yiddish', 'nativeName' => 'ייִדיש', 'orientation' => 'rtl' ],
  154. 'ydd' => [ 'name' => 'Yiddish', 'nativeName' => 'ייִדיש', 'orientation' => 'rtl' ],
  155. 'zh' => [ 'name' => 'Chinese (Simplified)', 'nativeName' => '中文 (简体)' ],
  156. 'zh-CN' => [ 'name' => 'Chinese (Simplified)', 'nativeName' => '中文 (简体)' ],
  157. 'zh-TW' => [ 'name' => 'Chinese (Traditional)', 'nativeName' => '正體中文 (繁體)' ],
  158. 'zu' => [ 'name' => 'Zulu', 'nativeName' => 'isiZulu' ]
  159. ];
  160. /**
  161. * @param string $code
  162. * @return string|false
  163. */
  164. public static function getName($code)
  165. {
  166. return static::get($code, 'name');
  167. }
  168. /**
  169. * @param string $code
  170. * @return string|false
  171. */
  172. public static function getNativeName($code)
  173. {
  174. if (isset(static::$codes[$code])) {
  175. return static::get($code, 'nativeName');
  176. }
  177. if (preg_match('/[a-zA-Z]{2}-[a-zA-Z]{2}/', $code)) {
  178. return static::get(substr($code, 0, 2), 'nativeName') . ' (' . substr($code, -2) . ')';
  179. }
  180. return $code;
  181. }
  182. /**
  183. * @param string $code
  184. * @return string
  185. */
  186. public static function getOrientation($code)
  187. {
  188. return static::$codes[$code]['orientation'] ?? 'ltr';
  189. }
  190. /**
  191. * @param string $code
  192. * @return bool
  193. */
  194. public static function isRtl($code)
  195. {
  196. return static::getOrientation($code) === 'rtl';
  197. }
  198. /**
  199. * @param array $keys
  200. * @return array
  201. */
  202. public static function getNames(array $keys)
  203. {
  204. $results = [];
  205. foreach ($keys as $key) {
  206. if (isset(static::$codes[$key])) {
  207. $results[$key] = static::$codes[$key];
  208. }
  209. }
  210. return $results;
  211. }
  212. /**
  213. * @param string $code
  214. * @param string $type
  215. * @return string|false
  216. */
  217. public static function get($code, $type)
  218. {
  219. return static::$codes[$code][$type] ?? false;
  220. }
  221. /**
  222. * @param bool $native
  223. * @return array
  224. */
  225. public static function getList($native = true)
  226. {
  227. $list = [];
  228. foreach (static::$codes as $key => $names) {
  229. $list[$key] = $native ? $names['nativeName'] : $names['name'];
  230. }
  231. return $list;
  232. }
  233. }