Commit 3205a267 authored by webchick's avatar webchick

#282191 follow-up by plach: Remove ambitious parts of translatable fields UI...

#282191 follow-up by plach: Remove ambitious parts of translatable fields UI from core that are no longer relevant, given what made it into Drupal 7.
parent a2232c40
......@@ -189,12 +189,12 @@
/**
* The type of language used to define the content language.
*/
define('LANGUAGE_TYPE_CONTENT', 'language');
define('LANGUAGE_TYPE_CONTENT', 'language_content');
/**
* The type of language used to select the user interface.
*/
define('LANGUAGE_TYPE_INTERFACE', 'language_interface');
define('LANGUAGE_TYPE_INTERFACE', 'language');
/**
* The type of language used for URLs.
......@@ -1379,12 +1379,12 @@ function drupal_unpack($obj, $field = 'data') {
* The translated string.
*/
function t($string, array $args = array(), array $options = array()) {
global $language_interface;
global $language;
static $custom_strings;
// Merge in default.
if (empty($options['langcode'])) {
$options['langcode'] = isset($language_interface->language) ? $language_interface->language : 'en';
$options['langcode'] = isset($language->language) ? $language->language : 'en';
}
if (empty($options['context'])) {
$options['context'] = '';
......@@ -2081,8 +2081,8 @@ function drupal_language_initialize() {
*/
function drupal_language_types() {
return array(
LANGUAGE_TYPE_CONTENT => TRUE,
LANGUAGE_TYPE_INTERFACE => TRUE,
LANGUAGE_TYPE_CONTENT => FALSE,
LANGUAGE_TYPE_URL => FALSE,
);
}
......
......@@ -37,17 +37,34 @@ function language_types_info() {
* whose negotiation values are unchangeable and defined while defining the
* language type itself.
*
* @param $stored
* Optional. By default retrieves values from the 'language_types' variable to
* avoid unnecessary hook invocations.
* If set to FALSE retrieves values from the actual language type definitions.
* This allows to react to alterations performed on the definitions by modules
* installed after the 'language_types' variable is set.
*
* @return
* An array of language type names.
*/
function language_types_configurable() {
function language_types_configurable($stored = TRUE) {
$configurable = &drupal_static(__FUNCTION__);
if (!isset($configurable)) {
if ($stored && !isset($configurable)) {
$types = variable_get('language_types', drupal_language_types());
$configurable = array_keys(array_filter($types));
}
if (!$stored) {
$result = array();
foreach (language_types_info() as $type => $info) {
if (!isset($info['fixed'])) {
$result[] = $type;
}
}
return $result;
}
return $configurable;
}
......
......@@ -41,12 +41,12 @@
*/
/**
* Identify the language from the current content language.
* Identifies the language from the current interface language.
*
* @return
* The current content language code.
* The current interface language code.
*/
function locale_language_from_content() {
function locale_language_from_interface() {
global $language;
return isset($language->language) ? $language->language : FALSE;
}
......
......@@ -969,7 +969,7 @@ function menu_tree_all_data($menu_name, $link = NULL, $max_depth = NULL) {
// Use $mlid as a flag for whether the data being loaded is for the whole tree.
$mlid = isset($link['mlid']) ? $link['mlid'] : 0;
// Generate a cache ID (cid) specific for this $menu_name, $link, $language, and depth.
$cid = 'links:' . $menu_name . ':all-cid:' . $mlid . ':' . $GLOBALS['language_interface']->language . ':' . (int)$max_depth;
$cid = 'links:' . $menu_name . ':all-cid:' . $mlid . ':' . $GLOBALS['language']->language . ':' . (int)$max_depth;
if (!isset($tree[$cid])) {
// If the static variable doesn't have the data, check {cache_menu}.
......@@ -1081,7 +1081,7 @@ function menu_tree_page_data($menu_name, $max_depth = NULL) {
$max_depth = min($max_depth, MENU_MAX_DEPTH);
}
// Generate a cache ID (cid) specific for this page.
$cid = 'links:' . $menu_name . ':page-cid:' . $item['href'] . ':' . $GLOBALS['language_interface']->language . ':' . (int)$item['access'] . ':' . (int)$max_depth;
$cid = 'links:' . $menu_name . ':page-cid:' . $item['href'] . ':' . $GLOBALS['language']->language . ':' . (int)$item['access'] . ':' . (int)$max_depth;
if (!isset($tree[$cid])) {
// If the static variable doesn't have the data, check {cache_menu}.
......@@ -1229,7 +1229,7 @@ function menu_tree_page_data($menu_name, $max_depth = NULL) {
* Helper function - compute the real cache ID for menu tree data.
*/
function _menu_tree_cid($menu_name, $data) {
return 'links:' . $menu_name . ':tree-data:' . $GLOBALS['language_interface']->language . ':' . md5(serialize($data));
return 'links:' . $menu_name . ':tree-data:' . $GLOBALS['language']->language . ':' . md5(serialize($data));
}
/**
......
......@@ -44,7 +44,7 @@ function drupal_path_initialize() {
* found.
*/
function drupal_lookup_path($action, $path = '', $path_language = NULL) {
global $language;
global $language_content;
// Use the advanced drupal_static() pattern, since this is called very often.
static $drupal_static_fast;
if (!isset($drupal_static_fast)) {
......@@ -71,7 +71,7 @@ function drupal_lookup_path($action, $path = '', $path_language = NULL) {
}
}
$path_language = $path_language ? $path_language : $language->language;
$path_language = $path_language ? $path_language : $language_content->language;
if ($action == 'wipe') {
$cache = array();
......
......@@ -132,8 +132,8 @@ function field_multilingual_valid_language($langcode, $default = TRUE) {
if (in_array($langcode, $enabled_languages)) {
return $langcode;
}
global $language;
$langcode = $default ? language_default('language') : $language->language;
global $language_content;
$langcode = $default ? language_default('language') : $language_content->language;
if (in_array($langcode, $enabled_languages)) {
return $langcode;
}
......
......@@ -479,7 +479,7 @@ function locale_languages_configure_form() {
$form = array(
'#submit' => array('locale_languages_configure_form_submit'),
'#theme' => 'locale_languages_configure_form',
'#language_types' => language_types_configurable(),
'#language_types' => language_types_configurable(FALSE),
'#language_types_info' => language_types_info(),
'#language_providers' => language_negotiation_info(),
);
......@@ -504,7 +504,7 @@ function _locale_languages_configure_form_language_table(&$form, $type) {
$info = $form['#language_types_info'][$type];
$table_form = array(
'#title' => t('@type', array('@type' => $info['name'])),
'#title' => t('@type language detection', array('@type' => $info['name'])),
'#tree' => TRUE,
'#description' => $info['description'],
'#language_providers' => array(),
......@@ -667,9 +667,10 @@ function locale_languages_configure_form_submit($form, &$form_state) {
if (isset($info['fixed'])) {
$language_types[$type] = FALSE;
$negotiation = array();
foreach ($info['fixed'] as $id) {
foreach ($info['fixed'] as $weight => $id) {
if (isset($defined_providers[$id])) {
$negotiation[$id] = $defined_providers[$id];
$negotiation[$id]['weight'] = $weight;
}
}
language_negotiation_set($type, $negotiation);
......
......@@ -57,6 +57,8 @@ function hook_language_switch_links_alter(array &$links, $type, $path) {
* the following key-value pairs:
* - "name": The human-readable language type identifier.
* - "description": A description of the language type.
* - "fixed": An array of language provider identifiers. Defining this key
* makes the language type non-configurable.
*/
function hook_language_types_info() {
return array(
......@@ -64,6 +66,9 @@ function hook_language_types_info() {
'name' => t('Custom language'),
'description' => t('A custom language type.'),
),
'fixed_custom_language_type' => array(
'fixed' => array('custom_language_provider'),
),
);
}
......
......@@ -70,10 +70,9 @@ function locale_update_7001() {
break;
}
// Save new language negotiation options: UI language is tied to content
// language as this was Drupal 6 behavior.
language_negotiation_set(LANGUAGE_TYPE_CONTENT, array_flip($negotiation));
language_negotiation_set(LANGUAGE_TYPE_INTERFACE, array(LOCALE_LANGUAGE_NEGOTIATION_CONTENT => 0));
// Save new language negotiation options.
language_negotiation_set(LANGUAGE_TYPE_INTERFACE, array_flip($negotiation));
language_negotiation_set(LANGUAGE_TYPE_CONTENT, array(LOCALE_LANGUAGE_NEGOTIATION_INTERFACE => 0));
language_negotiation_set(LANGUAGE_TYPE_URL, array(LOCALE_LANGUAGE_NEGOTIATION_URL => 0));
// Unset the old language negotiation system variable.
......
......@@ -24,9 +24,9 @@
define('LOCALE_LANGUAGE_NEGOTIATION_BROWSER', 'locale-browser');
/**
* The language is determined using the current content language.
* The language is determined using the current interface language.
*/
define('LOCALE_LANGUAGE_NEGOTIATION_CONTENT', 'locale-content');
define('LOCALE_LANGUAGE_NEGOTIATION_INTERFACE', 'locale-interface');
/**
* The language is set based on the user language settings.
......@@ -69,7 +69,7 @@ function locale_help($path, $arg) {
case 'admin/config/regional/language/add':
return '<p>' . t('Add a language to be supported by your site. If your desired language is not available in the <em>Language name</em> drop-down, click <em>Custom language</em> and provide a language code and other details manually. When providing a language code manually, be sure to enter a standardized language code, since this code may be used by browsers to determine an appropriate display language.') . '</p>';
case 'admin/config/regional/language/configure':
$output = '<p>' . t("Define how to decide which language is used to display content (text that you create and edit) and user interface text (text provided by Drupal and modules, such as field labels and help text). This decision is made by evaluating a series of detection methods for languages; the first detection method that gets a result will determine which language is used for that type of text. Define the order of evaluation of language detection methods on this page.") . '</p>';
$output = '<p>' . t("Define how to decide which language is used to display page elements (primarily text provided by Drupal and modules, such as field labels and help text). This decision is made by evaluating a series of detection methods for languages; the first detection method that gets a result will determine which language is used for that type of text. Define the order of evaluation of language detection methods on this page.") . '</p>';
return $output;
case 'admin/config/regional/language/configure/session':
$output = '<p>' . t('Determine the language from a request/session parameter. Example: "http://example.com?language=de" sets language to German based on the use of "de" within the "language" parameter.') . '</p>';
......@@ -466,17 +466,26 @@ function locale_entity_info_alter(&$entity_info) {
/**
* Implements hook_language_types_info().
*
* Defines the three core language types:
* - Interface language is the only configurable language type in core. It is
* used by t() as the default language if none is specified.
* - Content language is by default non-configurable and inherits the interface
* language negotiated value. It is used by the Field API to determine the
* display language for fields if no explicit value is specified.
* - URL language is by default non-configurable and is determined through the
* URL language provider. It is used by l() as the default language if none is
* specified.
*/
function locale_language_types_info() {
return array(
LANGUAGE_TYPE_CONTENT => array(
'name' => t('Content language detection'),
'description' => t('Order of language detection methods for content. If a version of content is available in the detected language, it will be displayed.'),
),
LANGUAGE_TYPE_INTERFACE => array(
'name' => t('User interface text language detection'),
'name' => t('User interface text'),
'description' => t('Order of language detection methods for user interface text. If a translation of user interface text is available in the detected language, it will be displayed.'),
),
LANGUAGE_TYPE_CONTENT => array(
'fixed' => array(LOCALE_LANGUAGE_NEGOTIATION_INTERFACE),
),
LANGUAGE_TYPE_URL => array(
'fixed' => array(LOCALE_LANGUAGE_NEGOTIATION_URL),
),
......@@ -534,13 +543,13 @@ function locale_language_negotiation_info() {
'description' => t("Determine the language from the browser's language settings."),
);
$providers[LOCALE_LANGUAGE_NEGOTIATION_CONTENT] = array(
'types' => array(LANGUAGE_TYPE_INTERFACE),
'callbacks' => array('language' => 'locale_language_from_content'),
$providers[LOCALE_LANGUAGE_NEGOTIATION_INTERFACE] = array(
'types' => array(LANGUAGE_TYPE_CONTENT),
'callbacks' => array('language' => 'locale_language_from_interface'),
'file' => $file,
'weight' => 8,
'name' => t('Content'),
'description' => t('Use the detected content language.'),
'name' => t('Interface'),
'description' => t('Use the detected interface language.'),
);
return $providers;
......
......@@ -965,11 +965,11 @@ class LocaleUninstallFunctionalTest extends DrupalWebTestCase {
/**
* The default language set for the UI before uninstall.
*/
protected $language_interface;
protected $language;
function setUp() {
parent::setUp('locale');
$this->language_interface = 'en';
$this->language = 'en';
}
/**
......@@ -980,12 +980,12 @@ class LocaleUninstallFunctionalTest extends DrupalWebTestCase {
// Add a new language and optionally set it as default.
require_once DRUPAL_ROOT . '/includes/locale.inc';
locale_add_language('fr', 'French', 'Français', LANGUAGE_LTR, '', '', TRUE, $this->language_interface == 'fr');
locale_add_language('fr', 'French', 'Français', LANGUAGE_LTR, '', '', TRUE, $this->language == 'fr');
// Check the UI language.
drupal_language_initialize();
global $language_interface;
$this->assertEqual($language_interface->language, $this->language_interface, t('Current language: %lang', array('%lang' => $language_interface->language)));
global $language;
$this->assertEqual($language->language, $this->language, t('Current language: %lang', array('%lang' => $language->language)));
// Enable multilingual workflow option for articles.
variable_set('language_content_type_article', 1);
......@@ -1031,7 +1031,7 @@ class LocaleUninstallFunctionalTest extends DrupalWebTestCase {
// Check the init language logic.
drupal_language_initialize();
$this->assertEqual($language_interface->language, 'en', t('Language after uninstall: %lang', array('%lang' => $language_interface->language)));
$this->assertEqual($language->language, 'en', t('Language after uninstall: %lang', array('%lang' => $language->language)));
// Check JavaScript files deletion.
$this->assertTrue($result = !file_exists($js_file), t('JavaScript file deleted: %file', array('%file' => $result ? $js_file : t('found'))));
......@@ -1091,7 +1091,7 @@ class LocaleUninstallFrenchFunctionalTest extends LocaleUninstallFunctionalTest
function setUp() {
parent::setUp();
$this->language_interface = 'fr';
$this->language = 'fr';
}
}
......@@ -1122,8 +1122,9 @@ class LanguageSwitchingFunctionalTest extends DrupalWebTestCase {
*/
function testLanguageBlock() {
// Enable the language switching block.
$language_type = LANGUAGE_TYPE_INTERFACE;
$edit = array(
'locale_language[region]' => 'sidebar_first',
"locale_{$language_type}[region]" => 'sidebar_first',
);
$this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
......@@ -1136,14 +1137,14 @@ class LanguageSwitchingFunctionalTest extends DrupalWebTestCase {
// Set language negotiation.
drupal_load('module', 'locale');
include_once DRUPAL_ROOT . '/includes/language.inc';
language_negotiation_set(LANGUAGE_TYPE_CONTENT, locale_language_negotiation_info());
language_negotiation_set($language_type, locale_language_negotiation_info());
// Assert that the language switching block is displayed on the frontpage.
$this->drupalGet('');
$this->assertText(t('Languages'), t('Language switcher block found.'));
// Assert that only the current language is marked as active.
list($language_switcher) = $this->xpath('//div[@id="block-locale-language"]/div[@class="content"]');
list($language_switcher) = $this->xpath("//div[@id=\"block-locale-{$language_type}\"]/div[@class=\"content\"]");
$links = array(
'active' => array(),
'inactive' => array(),
......@@ -1815,9 +1816,9 @@ class LocalizeDateFormatsFunctionalTest extends DrupalWebTestCase {
$this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
// Set language negotiation.
$language_type = LANGUAGE_TYPE_INTERFACE;
$edit = array(
'language[enabled][locale-url]' => TRUE,
'language_interface[enabled][locale-url]' => TRUE,
"{$language_type}[enabled][locale-url]" => TRUE,
);
$this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
......
......@@ -1290,52 +1290,6 @@ function node_build_content($node, $view_mode = 'full') {
module_invoke_all('node_view', $node, $view_mode);
}
/**
* Implements hook_language_negotiation_info().
*/
function node_language_negotiation_info() {
$providers = array();
$providers['node-language'] = array(
'types' => array(LANGUAGE_TYPE_CONTENT),
'callbacks' => array('language' => 'node_language_provider'),
'file' => drupal_get_path('module', 'node') . '/node.module',
'name' => t('Content'),
'description' => t('Use the language of the displayed content.'),
);
return $providers;
}
/**
* Return the language of the current node.
*
* @param $languages
* An array of valid language objects.
*
* @return
* A valid language code on success, FALSE otherwise.
*/
function node_language_provider($languages) {
require_once DRUPAL_ROOT . '/' . variable_get('path_inc', 'includes/path.inc');
$path = isset($_GET['q']) ? $_GET['q'] : '';
list($language, $path) = language_url_split_prefix($path, $languages);
$language = $language ? $language : language_default();
$path = drupal_get_normal_path($path, $language->language);
// We cannot use args now.
$path = explode('/', $path);
// Act only if we are in a node page.
if (isset($path[0]) && isset($path[1]) && $path[0] == 'node' && $nid = intval($path[1])) {
// We cannot perform a node load here.
$result = db_query('SELECT n.language FROM {node} n WHERE n.nid = :nid', array(':nid' => $nid))->fetchAssoc();
return $result['language'];
}
return FALSE;
}
/**
* Generate an array which displays a node detail page.
*
......
......@@ -182,7 +182,7 @@ function translation_form_alter(&$form, &$form_state, $form_id) {
function translation_node_view($node, $view_mode) {
if (isset($node->tnid) && $translations = translation_node_get_translations($node->tnid)) {
$path = 'node/' . $node->nid;
$links = language_negotiation_get_switch_links(LANGUAGE_TYPE_CONTENT, $path);
$links = language_negotiation_get_switch_links(LANGUAGE_TYPE_INTERFACE, $path);
if (is_object($links)) {
$links = $links->links;
// Do not show link to the same node.
......@@ -440,7 +440,7 @@ function translation_path_get_translations($path) {
* Replaces links with pointers to translated versions of the content.
*/
function translation_language_switch_links_alter(array &$links, $type, $path) {
if ($type == LANGUAGE_TYPE_CONTENT && $paths = translation_path_get_translations($path)) {
if ($type == LANGUAGE_TYPE_INTERFACE && $paths = translation_path_get_translations($path)) {
foreach ($links as $langcode => $link) {
if (isset($paths[$langcode])) {
// Translation in a different node.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment