i18n.php 3.3 KB

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