You are here

function geoip_language_negotiation in GeoIP API 6

Same name and namespace in other branches
  1. 7 geoip_language/geoip_language.module \geoip_language_negotiation()

Determine the appropriate language based on path prefix, with fallbacks for user preferred language and GeoIP mapped language.

1 call to geoip_language_negotiation()
geoip_language_init in geoip_language/geoip_language.module
Implementation of hook_init().

File

geoip_language/geoip_language.module, line 70
Language negotiation based on GeoIP detection.

Code

function geoip_language_negotiation() {

  // Get a list of enabled languages.
  $languages = language_list('enabled');
  $languages = $languages[1];

  // Get the original q, as it is before path un-aliasing.  This is important
  // because a path alias which is the same as a language prefix will have been
  // improperly un-aliased and the language prefix will be lost.
  $query = array();
  parse_str($_SERVER['QUERY_STRING'], $query);
  $q = $query['q'];

  // Mostly copied from language_initialize(). Do a basic path prefix lookup to
  // determine the language.
  $args = explode('/', $q);
  $prefix = array_shift($args);

  // Search prefix within enabled languages.
  foreach ($languages as $language) {
    if (!empty($language->prefix) && $language->prefix == $prefix) {

      // Set the global language object.
      $GLOBALS['language'] = $language;

      // Rebuild $_GET['q'] with the language removed.
      $_GET['q'] = implode('/', $args);

      // Re-initialize the path.
      drupal_init_path();

      // Make PressFlow happy by only storing the language code if there's an
      // existing session.
      if (count($_SESSION)) {
        $_SESSION['geoip_language'] = $language->language;
      }
      return;
    }
  }

  // Begin fallbacks. At this point, we know that there is not a valid path
  // prefix, so we must first determine a language, and then do a redirect to
  // the current path, in that language.
  global $user;

  // First check to see if a language was previously determined.
  if (isset($_SESSION['geoip_language']) && isset($languages[$_SESSION['geoip_language']])) {
    $language = $languages[$_SESSION['geoip_language']];
  }
  elseif ($user->uid && isset($languages[$user->language])) {
    $language = $languages[$user->language];
  }
  else {
    $language = geoip_language_detect_language();
  }

  // Set the global language object.
  $GLOBALS['language'] = $language;
  global $base_path;

  // Abort the redirect if bootstrap happened outside of index.php or if the
  // requested path is inside the files directory
  if ($_SERVER['SCRIPT_NAME'] != $base_path . 'index.php' || strpos($_GET['q'], file_directory_path()) === 0 || $_SERVER['REQUEST_METHOD'] == 'POST') {
    return;
  }

  // Now that the language is detected, do an absolute redirect to avoid page
  // caching in the wrong language.
  $url = url($_GET['q'], array(
    'language' => $language,
    'absolute' => TRUE,
    'query' => drupal_query_string_encode($_GET, array(
      'q',
    )),
  ));
  drupal_goto($url, NULL, NULL, 301);
  exit;
}