i18n.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <?php
  2. // Functions for internationalization
  3. require_once(__DIR__.'/exec.php');
  4. /**
  5. * Translates string to given language in first parameter, key given in second parameter (dynamically loads required language). Works like spritf from second parameter
  6. * @global array $LANG Associative array of language pharses
  7. * @return string Translated string
  8. */
  9. function _translate() {
  10. global $LANG;
  11. $args = func_get_args();
  12. $l = $args[0];
  13. if (!$l) return 'NO LANGUAGE DEFINED';
  14. $key = $args[1];
  15. if (!isset($LANG[$l])) {
  16. require_once(__DIR__."/i18n/$l.php");
  17. }
  18. if (!isset($LANG[$l][$key])) {
  19. $text = $key;
  20. } else {
  21. $text = $LANG[$l][$key];
  22. }
  23. array_shift($args);
  24. if (count($args) > 1) {
  25. $args[0] = $text;
  26. return call_user_func_array('sprintf', $args);
  27. } else {
  28. return $text;
  29. }
  30. }
  31. /**
  32. * Translates string by a given key in first parameter to current session language. Works like sprintf
  33. * @global array $LANG Associative array of language pharses
  34. * @return string Translated string
  35. * @see _translate()
  36. */
  37. function __() {
  38. $args = func_get_args();
  39. array_unshift($args, $_SESSION['language']);
  40. return call_user_func_array('_translate', $args);
  41. }
  42. /**
  43. * Detects user language from Accept-Language HTTP header.
  44. * @param string Fallback language (default: 'en')
  45. * @return string Language code (such as 'en' and 'ja')
  46. */
  47. function detect_user_language($fallback='en') {
  48. static $user_lang = '';
  49. // Already detected
  50. if (!empty($user_lang)) return $user_lang;
  51. // Check if Accept-Language header is available
  52. if (!isset($_SERVER) ||
  53. !isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ||
  54. !is_string($_SERVER['HTTP_ACCEPT_LANGUAGE'])
  55. ) {
  56. // Store result for reusing
  57. $user_lang = $fallback;
  58. return $user_lang;
  59. }
  60. // Sort Accept-Language by `q` value
  61. $accept_langs = explode(',', preg_replace('/\s/', '', strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])));
  62. $accept_langs_sorted = [];
  63. foreach ($accept_langs as $lang) {
  64. $div = explode(';q=', $lang, 2);
  65. if (count($div) < 2) {
  66. // `q` value was not specfied
  67. // -> Set default `q` value (1)
  68. $div[] = '1';
  69. }
  70. list($code, $q) = $div;
  71. if (preg_match('/^[\w\-]+$/', $code)) {
  72. // Acceptable language code
  73. $accept_langs_sorted[$code] = (double)$q;
  74. }
  75. }
  76. arsort($accept_langs_sorted);
  77. // List languages
  78. v_exec('v-list-sys-languages', ['json'], false, $output);
  79. $languages = json_decode($output, true);
  80. // Find best matching language
  81. foreach ($accept_langs_sorted as $req_lang => $dummy) {
  82. $decision = '';
  83. foreach ($languages as $prov_lang) {
  84. if (strlen($decision) > strlen($prov_lang)) continue;
  85. if (stripos($req_lang, $prov_lang) !== false) {
  86. $decision = $prov_lang;
  87. }
  88. }
  89. if (!empty($decision)) {
  90. // Store result for reusing
  91. $user_lang = $decision;
  92. return $user_lang;
  93. }
  94. }
  95. // Store result for reusing
  96. $user_lang = $fallback;
  97. return $user_lang;
  98. }