UOJLocale.php 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. <?php
  2. class UOJLocale {
  3. public static $supported_locales = array('zh-cn', 'en');
  4. public static $supported_modules = array('basic', 'contests', 'problems');
  5. public static $data = array();
  6. public static $required = array();
  7. public static function locale() {
  8. $locale = Cookie::get('uoj_locale');
  9. if ($locale != null && !in_array($locale, self::$supported_locales)) {
  10. $locale = null;
  11. Cookie::unsetVar('uoj_locale', '/');
  12. }
  13. if ($locale == null) {
  14. $locale = 'zh-cn';
  15. }
  16. return $locale;
  17. }
  18. public static function setLocale($locale) {
  19. if (!in_array($locale, self::$supported_locales)) {
  20. return false;
  21. }
  22. return Cookie::set('uoj_locale', $locale, time() + 60 * 60 * 24 * 365 * 10, '/');
  23. }
  24. public static function requireModule($name) {
  25. if (in_array($name, self::$required)) {
  26. return;
  27. }
  28. $required[] = $name;
  29. $data = include($_SERVER['DOCUMENT_ROOT'].'/app/locale/'.$name.'/'.self::locale().'.php');
  30. $pre = $name == 'basic' ? '' : "$name::";
  31. foreach ($data as $key => $val) {
  32. self::$data[$pre.$key] = $val;
  33. }
  34. }
  35. public static function get($name) {
  36. if (!isset(self::$data[$name])) {
  37. $module_name = strtok($name, '::');
  38. if (!in_array($module_name, self::$supported_modules)) {
  39. return false;
  40. }
  41. self::requireModule($module_name);
  42. }
  43. if (!isset(self::$data[$name])) {
  44. return false;
  45. }
  46. if (is_string(self::$data[$name])) {
  47. return self::$data[$name];
  48. } else {
  49. return call_user_func_array(self::$data[$name], array_slice(func_get_args(), 1));
  50. }
  51. }
  52. }