Language Negotiation API functionality in Drupal 7
Functions to customize the language types and the negotiation process.
The language negotiation API is based on two major concepts:
- Language types: types of translatable data (the types of data that a user can view or request).
- Language negotiation providers: functions for determining which language to use to present a particular piece of data to the user.
Both language types and language negotiation providers are customizable.
Drupal defines three built-in language types:
- Interface language: The page's main language, used to present translated user interface elements such as titles, labels, help text, and messages.
- Content language: The language used to present content that is available in more than one language (see Field Language API for details).
- URL language: The language associated with URLs. When generating a URL, this value will be used by url() as a default if no explicit preference is provided.
Modules can define additional language types through hook_language_types_info(), and alter existing language type definitions through hook_language_types_info_alter().
Language types may be configurable or fixed. The language negotiation providers associated with a configurable language type can be explicitly set through the user interface. A fixed language type has predetermined (module-defined) language negotiation settings and, thus, does not appear in the configuration page. Here is a code snippet that makes the content language (which by default inherits the interface language's values) configurable:
function mymodule_language_types_info_alter(&$language_types) {
unset($language_types[LANGUAGE_TYPE_CONTENT]['fixed']);
}
Every language type can have a different set of language negotiation providers assigned to it. Different language types often share the same language negotiation settings, but they can have independent settings if needed. If two language types are configured the same way, their language switcher configuration will be functionally identical and the same settings will act on both language types.
Drupal defines the following built-in language negotiation providers:
- URL: Determine the language from the URL (path prefix or domain).
- Session: Determine the language from a request/session parameter.
- User: Follow the user's language preference.
- Browser: Determine the language from the browser's language settings.
- Default language: Use the default site language.
Language negotiation providers are simple callback functions that implement a particular logic to return a language code. For instance, the URL provider searches for a valid path prefix or domain name in the current request URL. If a language negotiation provider does not return a valid language code, the next provider associated to the language type (based on provider weight) is invoked.
Modules can define additional language negotiation providers through hook_language_negotiation_info(), and alter existing providers through hook_language_negotiation_info_alter(). Here is an example snippet that lets path prefixes be ignored for administrative paths:
function mymodule_language_negotiation_info_alter(&$negotiation_info) {
// Replace the core function with our own function.
module_load_include('language', 'inc', 'language.negotiation');
$negotiation_info[LANGUAGE_NEGOTIATION_URL]['callbacks']['language'] = 'mymodule_from_url';
$negotiation_info[LANGUAGE_NEGOTIATION_URL]['file'] = drupal_get_path('module', 'mymodule') . '/mymodule.module';
}
function mymodule_from_url($languages) {
// Use the core URL language negotiation provider to get a valid language
// code.
module_load_include('language', 'inc', 'language.negotiation');
$langcode = language_from_url($languages);
// If we are on an administrative path, override with the default language.
if (isset($_GET['q']) && strtok($_GET['q'], '/') == 'admin') {
return language_default()->langcode;
}
return $langcode;
}
For more information, see Language Negotiation API
File
- includes/
language.inc, line 15 - Language Negotiation API.
Functions
Name | Location | Description |
---|---|---|
hook_language_negotiation_info |
modules/ |
Define language negotiation providers. |
hook_language_negotiation_info_alter |
modules/ |
Perform alterations on language negoiation providers. |
hook_language_types_info |
modules/ |
Define language types. |
hook_language_types_info_alter |
modules/ |
Perform alterations on language types. |
language_fallback_get_candidates |
includes/ |
Returns the possible fallback languages ordered by language weight. |
language_from_default |
includes/ |
Returns the default language negotiation provider. |
language_initialize |
includes/ |
Chooses a language based on language negotiation provider settings. |
language_negotiation_get |
includes/ |
Checks whether a language negotiation provider is enabled for a language type. |
language_negotiation_get_any |
includes/ |
Checks if the language negotiation provider is enabled for any language type. |
language_negotiation_get_switch_links |
includes/ |
Returns the language switch links for the given language. |
language_negotiation_info |
includes/ |
Returns all the defined language negotiation providers. |
language_negotiation_purge |
includes/ |
Removes any unused language negotiation providers from the configuration. |
language_negotiation_set |
includes/ |
Saves a list of language negotiation providers. |
language_provider_invoke |
includes/ |
Helper function used to cache the language negotiation providers results. |
language_provider_weight |
includes/ |
Returns the passed language negotiation provider weight or a default value. |
language_types_configurable |
includes/ |
Returns only the configurable language types. |
language_types_disable |
includes/ |
Disables the given language types. |
language_types_info |
includes/ |
Returns all the defined language types. |
language_types_set |
includes/ |
Updates the language type configuration. |
language_url_split_prefix |
includes/ |
Splits the given path into prefix and actual path. |