lang.class.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. <?php
  2. class Language
  3. {
  4. public $language_current;
  5. public $language_cached;
  6. public $language_default;
  7. public $language_root;
  8. public $language_file;
  9. private $languages = [
  10. 'en-US' => ['English', 'English'],
  11. 'zh-CN' => ['简体中文', 'Chinese_simplified'],
  12. 'zh-SG' => ['简体中文(新加坡)', 'Chinese_simplified'],
  13. 'zh-HK' => ['繁體中文(香港)', 'Chinese_traditional'],
  14. 'zh-TW' => ['繁體中文(台湾)', 'Chinese_traditional'],
  15. 'af' => ['Afrikaans', 'Afrikaans'],
  16. 'sq' => ['የአልባኒያ', 'Albanian'],
  17. 'am' => ['Amharic', 'Amharic'],
  18. 'ar-AR' => ['Arabic', 'Arabic'],
  19. 'hy' => ['Armenian', 'Armenian'],
  20. 'az' => ['Azərbaycan', 'Azeerbaijani'],
  21. 'eu' => ['Basque', 'Basque'],
  22. 'be' => ['Belarusian', 'Belarusian'],
  23. 'bn' => ['Bengali', 'Bengali'],
  24. 'bs' => ['Bosnian', 'Bosnian'],
  25. 'bg-BG' => ['Bulgarian', 'Bulgarian'],
  26. 'my' => ['Burmese', 'Burmese'],
  27. 'ca' => ['Catalan', 'Catalan'],
  28. 'ce' => ['Cebuano', 'Cebuano'], // 宿务语
  29. 'ch' => ['Chichewa', 'Chichewa'],
  30. 'co' => ['Corsican', 'Corsican'],
  31. 'hr' => ['Croatian', 'Croatian'],
  32. 'cs' => ['Czech', 'Czech'],
  33. 'da' => ['Danish', 'Danish'],
  34. 'nl' => ['Dutch', 'Dutch'],
  35. 'eo' => ['Esperanto', 'Esperanto'],
  36. 'et' => ['Estonian', 'Estonian'],
  37. 'fa' => ['Farsi', 'Farsi'],
  38. 'fil' => ['Filipino', 'Filipino'],
  39. 'fi' => ['Finnish', 'Finnish'],
  40. 'fr-FR' => ['français', 'French'], // 法语
  41. 'fy' => ['Frisian', 'Frisian'],
  42. 'gl' => ['Galician', 'Galician'],
  43. 'ka' => ['Georgian', 'Georgian'],
  44. 'de' => ['Deutsch', 'German'],
  45. 'el' => ['Greek', 'Greek'],
  46. 'gu' => ['Gujarati', 'Gujarati'],
  47. 'ko' => ['Haitian Creole', 'Haitian Creole'],
  48. 'ha' => ['Hausa', 'Hausa'],
  49. 'haw' => ['Hawaiian', 'Hawaiian'],
  50. 'he' => ['Hebrew', 'Hebrew'],
  51. 'hi' => ['Hindi', 'Hindi'],
  52. 'hm' => ['Hmong', 'Hmong'],
  53. 'hu' => ['Hungarian', 'Hungarian'],
  54. 'is' => ['Icelandic', 'Icelandic'],
  55. 'ig' => ['Igbo', 'Igbo'],
  56. 'id' => ['Indonesian', 'Indonesian'],
  57. 'ga' => ['Irish', 'Irish'],
  58. 'it-IT' => ['Italian', 'Italian'],
  59. 'ja-JP' => ['日本語', 'Japanese'],
  60. 'jv' => ['Wong Jawa', 'Javanese'],
  61. 'kn' => ['Kannada', 'Kannada'],
  62. 'kk' => ['Kazakh', 'Kazakh'],
  63. 'kh' => ['Khmer', 'Khmer'],
  64. 'ko-KR' => ['한국의', 'Korean'],
  65. 'ku' => ['Kurdish', 'Kurdish'],
  66. 'kz' => ['Kyrgyz', 'Kyrgyz'],
  67. 'lo' => ['ພາສາລາວ', 'Lao'],
  68. 'la' => ['Latinae', 'Latin'],
  69. 'lv' => ['Latvian', 'Latvian'],
  70. 'lt' => ['Lithuanian', 'Lithuanian'],
  71. 'lu' => ['Luxembourgish', 'Luxembourgish'],
  72. 'mk' => ['Macedonian', 'Macedonian'],
  73. 'ma' => ['Malagasy', 'Malagasy'],
  74. 'ms' => ['Malay', 'Malay'],
  75. 'ml' => ['Malayalam', 'Malayalam'],
  76. 'mt' => ['Maltese', 'Maltese'],
  77. 'ma' => ['Maori', 'Maori'],
  78. 'mr' => ['Marathi', 'Marathi'],
  79. 'mn' => ['Mongolian', 'Mongolian'],
  80. 'ne' => ['Nepali', 'Nepali'],
  81. 'no' => ['Norwegian', 'Norwegian'],
  82. 'pa' => ['Pashto', 'Pashto'],
  83. 'pe' => ['Persian', 'Persian'],
  84. 'po' => ['Polish', 'Polish'],
  85. 'pg' => ['Português', 'Portuguese'],
  86. 'pu' => ['Punjabi', 'Punjabi'],
  87. 'ro-RO' => ['Romanian', 'Romanian'],
  88. 'ru-RU' => ['Russian', 'Russian'],
  89. 'sa' => ['Samoan', 'Samoan'],
  90. 'gd' => ['Scots Gaelic', 'Scots Gaelic'],
  91. 'sr' => ['Serbian', 'Serbian'],
  92. 'se' => ['Sesotho', 'Sesotho'],
  93. 'sh' => ['Shona', 'Shona'],
  94. 'si' => ['Sindhi', 'Sindhi'],
  95. 'sin' => ['Sinhala', 'Sinhala'],
  96. 'sk' => ['Slovak', 'Slovak'],
  97. 'sl' => ['Slovenian', 'Slovenian'],
  98. 'so' => ['Somali', 'Somali'],
  99. 'es' => ['Spanish', 'Spanish'],
  100. 'su' => ['Sundanese', 'Sundanese'],
  101. 'sw' => ['Swahili', 'Swahili'],
  102. 'sv' => ['Swedish', 'Swedish'],
  103. 'tj' => ['Tajik', 'Tajik'],
  104. 'ta' => ['Tamil', 'Tamil'],
  105. 'te' => ['Telugu', 'Telugu'],
  106. 'ts' => ['Thai', 'Thai'],
  107. 'tu' => ['Turkish', 'Turkish'],
  108. 'uk' => ['Ukrainian', 'Ukrainian'],
  109. 'ur' => ['Urdu', 'Urdu'],
  110. 'uz-UZ' => ['Uzbek', 'Uzbek'],
  111. 'vi' => ['Vietnamese', 'Vietnamese'],
  112. 'we' => ['Welsh', 'Welsh'],
  113. 'xh' => ['Xhosa', 'Xhosa'],
  114. 'yi' => ['Yiddish', 'Yiddish'],
  115. 'yo' => ['Yorùbá', 'Yoruba'],
  116. 'zu' => ['Zulu', 'Zulu'],
  117. ];
  118. private $LANG;
  119. private $domain;
  120. /** 构造函数
  121. * @param string $language_root 翻译文件根目录
  122. * @param array $languages 可用语言列表
  123. * @param string $lang_default 默认语言
  124. * @return void
  125. */
  126. public function __construct($language_root, $lang_default = '')
  127. {
  128. $this->language_root = $language_root;
  129. if (!empty($lang_default) && array_key_exists($lang_default, $this->languages)) {
  130. $this->language_default = $lang_default;
  131. $this->language_current = $lang_default;
  132. } else {
  133. $this->language_default = 'en-US';
  134. $this->language_current = 'en-US';
  135. }
  136. $this->init_domain();
  137. $this->init_language();
  138. $this->init_language_file();
  139. // echo '<p>'.$this->language_cached.'</p>';
  140. }
  141. private function init_domain()
  142. {
  143. if (empty($this->domain)) {
  144. $domain = $_SERVER['SERVER_NAME'];
  145. if (strcasecmp($domain, 'localhost') === 0) {
  146. $this->domain = $domain;
  147. } else if (preg_match("/^(\\d+\\.){3}\\d+\$/", $domain, $domain_temp)) {
  148. $this->domain = $domain_temp[0];
  149. } else {
  150. preg_match_all("/\\w+\\.\\w+\$/", $domain, $domain);
  151. $this->domain = $domain[0][0];
  152. }
  153. }
  154. }
  155. private function init_language()
  156. {
  157. if (!@empty(trim($_COOKIE['lang']))) {
  158. // has cached lang
  159. $this->language_cached = trim($_COOKIE['lang']);
  160. if (array_key_exists($this->language_cached, $this->languages) && $this->has_language_file($this->language_cached)) {
  161. $this->language_current = $this->language_cached;
  162. } else {
  163. $this->language_current = $this->language_default;
  164. }
  165. } else {
  166. // get browser lang
  167. $lang_browser = $_SERVER['HTTP_ACCEPT_LANGUAGE']; // zh-CN,zh;q=0.9
  168. preg_match_all("/[\\w-]+/", $lang_browser, $lang_browser); // [['zh-CN', 'zh']]
  169. if (array_key_exists($lang_browser[0][0], $this->languages) && $this->has_language_file($lang_browser[0][0])) {
  170. $this->language_current = $lang_browser[0][0];
  171. } else if (array_key_exists($lang_browser[0][1], $this->languages) && $this->has_language_file($lang_browser[0][1])) {
  172. $this->language_current = $lang_browser[0][1];
  173. } else {
  174. $this->language_current = $this->language_default;
  175. }
  176. $this->language_cached = $this->language_current;
  177. setcookie("lang", $this->language_current, time() + 365 * 24 * 3600, "/", $this->domain);
  178. }
  179. }
  180. private function has_language_file($lang)
  181. {
  182. return !empty($lang) && file_exists($this->language_root . $lang . '/' . 'language.php');
  183. }
  184. private function init_language_file()
  185. {
  186. if ($this->has_language_file($this->language_current)) {
  187. $this->language_file = $this->language_root . $this->language_current . '/' . 'language.php';
  188. } else {
  189. $this->language_file = $this->language_root . $this->language_default . '/' . 'language.php';
  190. }
  191. $this->LANG = require $this->language_file;
  192. }
  193. public function get_languages_tags()
  194. {
  195. $tags = '';
  196. foreach ($this->languages as $k => $v) {
  197. $actived = $k == $this->language_current ? ' class="active"' : '';
  198. $tags .= '<li' . $actived . '><a class="language-change-click" data-language="' . $k . '" href="javascript://">' . $this->languages[$k][0] . '</a></li>';
  199. }
  200. return $tags;
  201. }
  202. public function get_language_name()
  203. {
  204. return $this->languages[$this->language_current][0];
  205. }
  206. /** 登录下拉框选项
  207. * language select for login to control panel
  208. * @return void
  209. */
  210. public function get_languages_options()
  211. {
  212. $options = '';
  213. foreach ($this->languages as $k => $v) {
  214. $selected = $k == $this->language_cached ? ' selected="selected"' : '';
  215. $options .= '<option value="' . $v[1] . '"' . $selected . '>' . $v[0] . '</option>';
  216. }
  217. return $options;
  218. }
  219. public function I18N($key = '')
  220. {
  221. return isset($key) ? isset($this->LANG[$key]) ? $this->LANG[$key] : $key : '';
  222. }
  223. }