i18n.php 3.6 KB

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