language.inc

  1. 7.x drupal-7.x/includes/language.inc
  2. 6.x drupal-6.x/includes/language.inc

Multiple language handling functionality.

File

drupal-6.x/includes/language.inc
View source
  1. <?php
  2. /**
  3. * @file
  4. * Multiple language handling functionality.
  5. */
  6. /**
  7. * Choose a language for the page, based on language negotiation settings.
  8. */
  9. function language_initialize() {
  10. global $user;
  11. // Configured presentation language mode.
  12. $mode = variable_get('language_negotiation', LANGUAGE_NEGOTIATION_NONE);
  13. // Get a list of enabled languages.
  14. $languages = language_list('enabled');
  15. $languages = $languages[1];
  16. switch ($mode) {
  17. case LANGUAGE_NEGOTIATION_NONE:
  18. return language_default();
  19. case LANGUAGE_NEGOTIATION_DOMAIN:
  20. foreach ($languages as $language) {
  21. $parts = parse_url($language->domain);
  22. if (!empty($parts['host']) && ($_SERVER['HTTP_HOST'] == $parts['host'])) {
  23. return $language;
  24. }
  25. }
  26. return language_default();
  27. case LANGUAGE_NEGOTIATION_PATH_DEFAULT:
  28. case LANGUAGE_NEGOTIATION_PATH:
  29. // $_GET['q'] might not be available at this time, because
  30. // path initialization runs after the language bootstrap phase.
  31. $args = isset($_GET['q']) ? explode('/', $_GET['q']) : array();
  32. $prefix = array_shift($args);
  33. // Search prefix within enabled languages.
  34. foreach ($languages as $language) {
  35. if (!empty($language->prefix) && $language->prefix == $prefix) {
  36. // Rebuild $GET['q'] with the language removed.
  37. $_GET['q'] = implode('/', $args);
  38. return $language;
  39. }
  40. }
  41. if ($mode == LANGUAGE_NEGOTIATION_PATH_DEFAULT) {
  42. // If we did not found the language by prefix, choose the default.
  43. return language_default();
  44. }
  45. break;
  46. }
  47. // User language.
  48. if ($user->uid && isset($languages[$user->language])) {
  49. return $languages[$user->language];
  50. }
  51. // Browser accept-language parsing.
  52. if ($language = language_from_browser()) {
  53. return $language;
  54. }
  55. // Fall back on the default if everything else fails.
  56. return language_default();
  57. }
  58. /**
  59. * Identify language from the Accept-language HTTP header we got.
  60. */
  61. function language_from_browser() {
  62. // Specified by the user via the browser's Accept Language setting
  63. // Samples: "hu, en-us;q=0.66, en;q=0.33", "hu,en-us;q=0.5"
  64. $browser_langs = array();
  65. if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
  66. $browser_accept = explode(",", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
  67. for ($i = 0; $i < count($browser_accept); $i++) {
  68. // The language part is either a code or a code with a quality.
  69. // We cannot do anything with a * code, so it is skipped.
  70. // If the quality is missing, it is assumed to be 1 according to the RFC.
  71. if (preg_match("!([a-z-]+)(;q=([0-9\\.]+))?!", trim($browser_accept[$i]), $found)) {
  72. $browser_langs[$found[1]] = (isset($found[3]) ? (float) $found[3] : 1.0);
  73. }
  74. }
  75. }
  76. // Order the codes by quality
  77. arsort($browser_langs);
  78. // Try to find the first preferred language we have
  79. $languages = language_list('enabled');
  80. foreach ($browser_langs as $langcode => $q) {
  81. if (isset($languages['1'][$langcode])) {
  82. return $languages['1'][$langcode];
  83. }
  84. }
  85. }
  86. /**
  87. * Rewrite URL's with language based prefix. Parameters are the same
  88. * as those of the url() function.
  89. */
  90. function language_url_rewrite(&$path, &$options) {
  91. global $language;
  92. // Only modify relative (insite) URLs.
  93. if (empty($options['external'])) {
  94. // Language can be passed as an option, or we go for current language.
  95. if (!isset($options['language'])) {
  96. $options['language'] = $language;
  97. }
  98. switch (variable_get('language_negotiation', LANGUAGE_NEGOTIATION_NONE)) {
  99. case LANGUAGE_NEGOTIATION_NONE:
  100. // No language dependent path allowed in this mode.
  101. unset($options['language']);
  102. break;
  103. case LANGUAGE_NEGOTIATION_DOMAIN:
  104. if ($options['language']->domain) {
  105. // Ask for an absolute URL with our modified base_url.
  106. $options['absolute'] = TRUE;
  107. $options['base_url'] = $options['language']->domain;
  108. }
  109. break;
  110. case LANGUAGE_NEGOTIATION_PATH_DEFAULT:
  111. $default = language_default();
  112. if ($options['language']->language == $default->language) {
  113. break;
  114. }
  115. // Intentionally no break here.
  116. case LANGUAGE_NEGOTIATION_PATH:
  117. if (!empty($options['language']->prefix)) {
  118. $options['prefix'] = $options['language']->prefix .'/';
  119. }
  120. break;
  121. }
  122. }
  123. }