View source
<?php
define('LANGUAGE_COOKIE_NEGOTIATION', 'language_cookie');
function language_cookie_menu() {
$items = array();
$items['admin/config/regional/language/configure/cookie'] = array(
'title' => 'Cookie language detection configuration',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'language_cookie_admin_form',
),
'access arguments' => array(
'administer languages',
),
'file' => 'language_cookie.admin.inc',
'type' => MENU_VISIBLE_IN_BREADCRUMB,
);
return $items;
}
function language_cookie_language_negotiation_info() {
return array(
LANGUAGE_COOKIE_NEGOTIATION => array(
'types' => array(
LANGUAGE_TYPE_CONTENT,
LANGUAGE_TYPE_INTERFACE,
LANGUAGE_TYPE_URL,
),
'callbacks' => array(
'language' => 'language_cookie_language',
),
'file' => drupal_get_path('module', 'language_cookie') . '/language_cookie.module',
'weight' => -5,
'name' => t('Cookie'),
'description' => t('Determine the language from a cookie'),
'config' => 'admin/config/regional/language/configure/cookie',
),
);
}
function language_cookie_language_types_info_alter(&$language_types) {
require_once DRUPAL_ROOT . '/includes/locale.inc';
$language_types[LANGUAGE_TYPE_URL]['fixed'] = array(
LOCALE_LANGUAGE_NEGOTIATION_URL,
LANGUAGE_COOKIE_NEGOTIATION,
LOCALE_LANGUAGE_NEGOTIATION_URL_FALLBACK,
);
}
function language_cookie_set($lang = NULL) {
if (!$lang) {
global $language;
$lang = $language->language;
}
$cookie = new stdClass();
$cookie->name = variable_get('language_cookie_param', 'language');
$cookie->value = $lang;
$cookie->expire = variable_get('language_cookie_time', 31536000);
$cookie->path = variable_get('language_cookie_path', '/');
$cookie->domain = variable_get('language_cookie_domain', '');
$cookie->secure = FALSE;
$cookie->httponly = FALSE;
foreach (module_list(FALSE, TRUE) as $module) {
drupal_load('module', $module);
module_invoke($module, 'language_cookie_alter', $cookie);
}
setrawcookie($cookie->name, rawurlencode($cookie->value), REQUEST_TIME + $cookie->expire, $cookie->path, $cookie->domain, $cookie->secure, $cookie->httponly);
}
function language_cookie_language($languages) {
$param = variable_get('language_cookie_param', 'language');
return isset($_COOKIE[$param]) && in_array($_COOKIE[$param], array_keys($languages)) ? $_COOKIE[$param] : FALSE;
}
function language_cookie_boot() {
require_once DRUPAL_ROOT . '/includes/language.inc';
if (!language_negotiation_get_any(LANGUAGE_COOKIE_NEGOTIATION)) {
return;
}
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
return;
}
require_once DRUPAL_ROOT . '/' . variable_get('path_inc', 'includes/path.inc');
require_once DRUPAL_ROOT . '/includes/unicode.inc';
$language_selection = variable_get('language_selection_page_path', 'language_selection');
if ($blacklist_pages = variable_get('language_cookie_blacklisted_paths', $language_selection)) {
$blacklist_pages = drupal_strtolower($blacklist_pages);
$current_path = ltrim($_SERVER["REQUEST_URI"], '/');
if (drupal_match_path($current_path, $blacklist_pages)) {
return;
}
}
$request_path = $_SERVER["REQUEST_URI"];
$public_files_path = variable_get('file_public_path', conf_path() . '/files');
if (strpos($request_path, $public_files_path) === 0) {
return;
}
if (strpos($request_path, 'cdn/farfuture') === 0) {
return;
}
if (strpos($request_path, 'httprl_async_function_callback') === 0) {
return;
}
$lang = _language_cookie_get_language();
if (isset($lang->language)) {
$lang = $lang->language;
$param = variable_get('language_cookie_param', 'language');
if (!isset($_COOKIE[$param]) || isset($_COOKIE[$param]) && $_COOKIE[$param] != $lang || variable_get('language_cookie_set_on_every_pageload', FALSE)) {
language_cookie_set($lang);
}
}
}
function language_cookie_language_rewrite(&$path, &$options) {
}
function language_cookie_language_switcher($type, $path) {
}
function _language_cookie_get_language() {
require_once DRUPAL_ROOT . '/includes/locale.inc';
$type = variable_get('language_cookie_language_type', LANGUAGE_TYPE_INTERFACE);
$negotiation = variable_get("language_negotiation_{$type}", array());
foreach ($negotiation as $provider_id => $provider) {
if ($provider_id == LANGUAGE_COOKIE_NEGOTIATION) {
return FALSE;
}
$language = language_provider_invoke($provider_id, $provider);
if ($language) {
$language->provider = $provider_id;
return $language;
}
}
$language = language_default();
$language->provider = LANGUAGE_NEGOTIATION_DEFAULT;
return $language;
}