summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2007-03-26 01:32:22 +0000
committerDries Buytaert <dries@buytaert.net>2007-03-26 01:32:22 +0000
commiteb0caa354ea6fec8d63f930ee249121c09eec1b7 (patch)
treece8a8238193314fc604c11830671201ab18b8445 /modules
parent5739c24c1450a81777813610021bfa452138a939 (diff)
downloadbrdo-eb0caa354ea6fec8d63f930ee249121c09eec1b7.tar.gz
brdo-eb0caa354ea6fec8d63f930ee249121c09eec1b7.tar.bz2
- Patch #128866 by Gabor, Steven, chx, Jose et al: new language subsystem.
Diffstat (limited to 'modules')
-rw-r--r--modules/locale/locale.install97
-rw-r--r--modules/locale/locale.module186
-rw-r--r--modules/node/node.module4
-rw-r--r--modules/path/path.module63
-rw-r--r--modules/system/system.install35
5 files changed, 276 insertions, 109 deletions
diff --git a/modules/locale/locale.install b/modules/locale/locale.install
index ecba85916..da8b26c6b 100644
--- a/modules/locale/locale.install
+++ b/modules/locale/locale.install
@@ -11,14 +11,18 @@ function locale_install() {
switch ($GLOBALS['db_type']) {
case 'mysql':
case 'mysqli':
- db_query("CREATE TABLE {locales_meta} (
- locale varchar(12) NOT NULL default '',
+ db_query("CREATE TABLE {languages} (
+ language varchar(12) NOT NULL default '',
name varchar(64) NOT NULL default '',
+ native varchar(64) NOT NULL default '',
+ direction int NOT NULL default '0',
enabled int NOT NULL default '0',
- isdefault int NOT NULL default '0',
plurals int NOT NULL default '0',
formula varchar(128) NOT NULL default '',
- PRIMARY KEY (locale)
+ domain varchar(128) NOT NULL default '',
+ prefix varchar(128) NOT NULL default '',
+ weight int NOT NULL default '0',
+ PRIMARY KEY (language)
) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
db_query("CREATE TABLE {locales_source} (
@@ -32,25 +36,29 @@ function locale_install() {
db_query("CREATE TABLE {locales_target} (
lid int NOT NULL default '0',
translation blob NOT NULL,
- locale varchar(12) NOT NULL default '',
+ language varchar(12) NOT NULL default '',
plid int NOT NULL default '0',
plural int NOT NULL default '0',
KEY lid (lid),
- KEY lang (locale),
+ KEY lang (language),
KEY plid (plid),
KEY plural (plural)
) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
break;
case 'pgsql':
- db_query("CREATE TABLE {locales_meta} (
- locale varchar(12) NOT NULL default '',
+ db_query("CREATE TABLE {languages} (
+ language varchar(12) NOT NULL default '',
name varchar(64) NOT NULL default '',
+ native varchar(64) NOT NULL default '',
+ direction int NOT NULL default '0',
enabled int NOT NULL default '0',
- isdefault int NOT NULL default '0',
plurals int NOT NULL default '0',
formula varchar(128) NOT NULL default '',
- PRIMARY KEY (locale)
+ domain varchar(128) NOT NULL default '',
+ prefix varchar(128) NOT NULL default '',
+ weight int NOT NULL default '0',
+ PRIMARY KEY (language)
)");
db_query("CREATE TABLE {locales_source} (
@@ -63,25 +71,86 @@ function locale_install() {
db_query("CREATE TABLE {locales_target} (
lid int NOT NULL default '0',
translation text NOT NULL,
- locale varchar(12) NOT NULL default '',
+ language varchar(12) NOT NULL default '',
plid int NOT NULL default '0',
plural int NOT NULL default '0'
)");
db_query("CREATE INDEX {locales_target}_lid_idx ON {locales_target} (lid)");
- db_query("CREATE INDEX {locales_target}_locale_idx ON {locales_target} (locale)");
+ db_query("CREATE INDEX {locales_target}_language_idx ON {locales_target} (language)");
db_query("CREATE INDEX {locales_target}_plid_idx ON {locales_target} (plid)");
db_query("CREATE INDEX {locales_target}_plural_idx ON {locales_target} (plural)");
db_query("CREATE INDEX {locales_source}_source_idx ON {locales_source} (source)");
break;
}
- db_query("INSERT INTO {locales_meta} (locale, name, enabled, isdefault) VALUES ('en', 'English', '1', '1')");
+ db_query("INSERT INTO {languages} (language, name, native, direction, enabled, weight) VALUES ('en', 'English', 'English', '0', '1', '0')");
}
/**
+ * @defgroup updates-5.0-to-x.x Locale updates from 5.0 to x.x
+ * @{
+ */
+
+function locale_update_2001() {
+ $ret = array();
+ switch ($GLOBALS['db_type']) {
+ case 'mysql':
+ case 'mysqli':
+ $ret[] = update_sql("CREATE TABLE {languages} (
+ language varchar(12) NOT NULL default '',
+ name varchar(64) NOT NULL default '',
+ native varchar(64) NOT NULL default '',
+ direction int NOT NULL default '0',
+ enabled int NOT NULL default '0',
+ plurals int NOT NULL default '0',
+ formula varchar(128) NOT NULL default '',
+ domain varchar(128) NOT NULL default '',
+ prefix varchar(128) NOT NULL default '',
+ weight int NOT NULL default '0',
+ PRIMARY KEY (language)
+ ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
+ break;
+ case 'pgsql':
+ $ret[] = update_sql("CREATE TABLE {languages} (
+ language varchar(12) NOT NULL default '',
+ name varchar(64) NOT NULL default '',
+ native varchar(64) NOT NULL default '',
+ direction int NOT NULL default '0',
+ enabled int NOT NULL default '0',
+ plurals int NOT NULL default '0',
+ formula varchar(128) NOT NULL default '',
+ domain varchar(128) NOT NULL default '',
+ prefix varchar(128) NOT NULL default '',
+ weight int NOT NULL default '0',
+ PRIMARY KEY (language)
+ )");
+ break;
+ }
+
+ // Save the languages
+ $ret[] = update_sql("INSERT INTO {languages} (language, name, native, direction, enabled, plurals, formula, domain, prefix, weight) SELECT locale, name, '', 0, enabled, plurals, formula, '', locale, 0 FROM {locales_meta}");
+
+ // Save the language count in the variable table
+ $count = db_result(db_query('SELECT COUNT(*) FROM {languages} WHERE enabled = 1'));
+ variable_set('language_count', $count);
+
+ // Save the default language in the variable table
+ $default = db_fetch_object(db_query('SELECT * FROM {locales_meta} WHERE isdefault = 1'));
+ variable_set('language_default', (object) array('language' => $default->locale, 'name' => $default->name, 'native' => '', 'direction' => 0, 'enabled' => 1, 'plurals' => $default->plurals, 'formula' => $default->formula, 'domain' => '', 'prefix' => $default->locale, 'weight' => 0));
+
+ $ret[] = update_sql("DROP TABLE {locales_meta}");
+ return $ret;
+}
+
+/**
+ * @} End of "defgroup updates-5.0-to-x.x"
+ * The next series of updates should start at 3000.
+ */
+
+/**
* Implementation of hook_uninstall().
*/
function locale_uninstall() {
- db_query('DROP TABLE {locales_meta}');
+ db_query('DROP TABLE {languages}');
db_query('DROP TABLE {locales_source}');
db_query('DROP TABLE {locales_target}');
}
diff --git a/modules/locale/locale.module b/modules/locale/locale.module
index df8103cc1..9c63936b2 100644
--- a/modules/locale/locale.module
+++ b/modules/locale/locale.module
@@ -25,6 +25,7 @@ function locale_help($section) {
$output .= '<p>'. t('For more information please read the configuration and customization handbook <a href="@locale">Locale page</a>.', array('@locale' => 'http://drupal.org/handbook/modules/locale/')) .'</p>';
return $output;
case 'admin/build/locale':
+ case 'admin/build/locale/language':
case 'admin/build/locale/language/overview':
return t("<p>Drupal provides support for the translation of its interface text into different languages. This page provides an overview of the installed languages. You can add a language on the <a href=\"@add-language\">add language page</a>, or directly by <a href=\"@import\">importing a translation</a>. If multiple languages are enabled, registered users will be able to set their preferred language. The site default will be used for anonymous visitors and for users without their own settings.</p><p>Drupal interface translations may be added or extended by several courses: by <a href=\"@import\">importing</a> an existing translation, by <a href=\"@search\">translating everything</a> from scratch, or by a combination of these approaches.</p>", array("@search" => url("admin/build/locale/string/search"), "@import" => url("admin/build/locale/language/import"), "@add-language" => url("admin/build/locale/language/add")));
case 'admin/build/locale/language/add':
@@ -35,6 +36,8 @@ function locale_help($section) {
return '<p>'. t("This page allows you to export Drupal strings. The first option is to export a translation so it can be shared. The second option generates a translation template, which contains all Drupal strings, but without their translations. You can use this template to start a new translation using various software packages designed for this task.") .'</p>';
case 'admin/build/locale/string/search':
return '<p>'. t("It is often convenient to get the strings from your setup on the <a href=\"@export\">export page</a>, and use a desktop Gettext translation editor to edit the translations. On this page you can search in the translated and untranslated strings, and the default English texts provided by Drupal.", array("@export" => url("admin/build/locale/language/export"))) .'</p>';
+ case 'admin/build/locale/language/configure':
+ return '<p>'. t('The language used to display a web page is determined with a negotiation algorithm. You can choose how this algorithm should work. By default, there is no negotiation and the default language is used. You can use path prefixes (like "de" and "it" for German and Italian content) with different fallback options, so you can have web addresses like /de/contact and /it/contact. Alternatively you can use custom domains like de.example.com and it.example.com. Customize path prefixes and set domain names on the <a href="@languages">language editing pages</a>.', array('@languages' => url('admin/build/locale/language/overview'))) .'</p>';
}
}
@@ -44,8 +47,8 @@ function locale_help($section) {
function locale_menu() {
// Main admin menu item
$items['admin/build/locale'] = array(
- 'title' => t('Localization'),
- 'description' => t('Configure site localization and user interface translation.'),
+ 'title' => t('Languages'),
+ 'description' => t('Configure languages and user interface translation.'),
'page callback' => 'locale_admin_manage',
'access arguments' => array('administer locales'),
);
@@ -56,8 +59,8 @@ function locale_menu() {
'weight' => -10,
'type' => MENU_DEFAULT_LOCAL_TASK,
);
- $items['admin/build/locale/string/search'] = array(
- 'title' => t('Manage strings'),
+ $items['admin/build/locale/string'] = array(
+ 'title' => t('Manage interface strings'),
'page callback' => 'locale_string_search',
'weight' => 10,
'type' => MENU_LOCAL_TASK,
@@ -76,13 +79,32 @@ function locale_menu() {
'weight' => 5,
'type' => MENU_LOCAL_TASK,
);
- $items['admin/build/locale/language/import'] = array(
+ $items['admin/build/locale/language/configure'] = array(
+ 'title' => t('Configure'),
+ 'page callback' => 'locale_admin_manage_configure',
+ 'weight' => 10,
+ 'type' => MENU_LOCAL_TASK,
+ );
+ $items['admin/build/locale/language/edit/%'] = array(
+ 'title' => t('Edit language'),
+ 'page callback' => 'drupal_get_form',
+ 'page arguments' => array('locale_admin_manage_edit', 5),
+ 'type' => MENU_CALLBACK,
+ );
+
+ // Manage interface translations subtabs
+ $items['admin/build/locale/string/search'] = array(
+ 'title' => t('Search'),
+ 'weight' => 0,
+ 'type' => MENU_DEFAULT_LOCAL_TASK,
+ );
+ $items['admin/build/locale/string/import'] = array(
'title' => t('Import'),
'page callback' => 'locale_admin_import',
'weight' => 10,
'type' => MENU_LOCAL_TASK,
);
- $items['admin/build/locale/language/export'] = array(
+ $items['admin/build/locale/string/export'] = array(
'title' => t('Export'),
'page callback' => 'locale_admin_export',
'weight' => 20,
@@ -124,12 +146,17 @@ function locale_perm() {
* Implementation of hook_user().
*/
function locale_user($type, $edit, &$user, $category = NULL) {
- $languages = locale_supported_languages();
- if ($type == 'form' && $category == 'account' && count($languages['name']) > 1) {
+ if ($type == 'form' && $category == 'account' && variable_get('language_count', 1) > 1 && variable_get('language_negotiation', LANGUAGE_NEGOTIATION_NONE) == LANGUAGE_NEGOTIATION_PATH) {
+ $languages = language_list('enabled');
+ $languages = $languages['1'];
if ($user->language == '') {
- $user->language = key($languages['name']);
+ $default = language_default();
+ $user->language = $default->language;
+ }
+ $names = array();
+ foreach($languages as $langcode => $language) {
+ $names[$langcode] = t($language->name) .' ('. $language->native .')';
}
- $languages['name'] = array_map('check_plain', array_map('t', $languages['name']));
$form['locale'] = array('#type' => 'fieldset',
'#title' => t('Interface language settings'),
'#weight' => 1,
@@ -137,13 +164,31 @@ function locale_user($type, $edit, &$user, $category = NULL) {
$form['locale']['language'] = array('#type' => 'radios',
'#title' => t('Language'),
'#default_value' => $user->language,
- '#options' => $languages['name'],
+ '#options' => $names,
'#description' => t('Selecting a different locale will change the interface language of the site.'),
);
return $form;
}
}
+/**
+ * Implementation of hook_form_alter(). Adds language fields to forms.
+ */
+function locale_form_alter($form_id, &$form) {
+ switch ($form_id) {
+ case 'path_admin_edit':
+ $form['language'] = array(
+ '#type' => 'radios',
+ '#title' => t('Language'),
+ '#options' => array('' => t('All languages')) + locale_language_list('name'),
+ '#default_value' => $form['#alias'] ? $form['#alias']['language'] : '',
+ '#weight' => -10
+ );
+ break;
+ }
+}
+
+
// ---------------------------------------------------------------------------------
// Locale core functionality (needed on all page loads)
@@ -153,16 +198,14 @@ function locale_user($type, $edit, &$user, $category = NULL) {
* This function is called from t() to translate a string if needed.
*/
function locale($string) {
- global $locale;
+ global $language;
static $locale_t;
// Store database cached translations in a static var.
if (!isset($locale_t)) {
- $cache = cache_get("locale:$locale", 'cache');
-
- if (!$cache) {
+ if (!($cache = cache_get('locale:'. $language->language, 'cache'))) {
locale_refresh_cache();
- $cache = cache_get("locale:$locale", 'cache');
+ $cache = cache_get('locale:'. $language->language, 'cache');
}
$locale_t = unserialize($cache->data);
}
@@ -175,7 +218,7 @@ function locale($string) {
// We do not have this translation cached, so get it from the DB.
else {
- $result = db_query("SELECT s.lid, t.translation FROM {locales_source} s INNER JOIN {locales_target} t ON s.lid = t.lid WHERE s.source = '%s' AND t.locale = '%s'", $string, $locale);
+ $result = db_query("SELECT s.lid, t.translation FROM {locales_source} s INNER JOIN {locales_target} t ON s.lid = t.lid WHERE s.source = '%s' AND t.language = '%s'", $string, $language->language);
// Translation found
if ($trans = db_fetch_object($result)) {
if (!empty($trans->translation)) {
@@ -189,20 +232,20 @@ function locale($string) {
$result = db_query("SELECT lid, source FROM {locales_source} WHERE source = '%s'", $string);
// We have no such translation
if ($obj = db_fetch_object($result)) {
- if ($locale) {
- db_query("INSERT INTO {locales_target} (lid, locale, translation) VALUES (%d, '%s', '')", $obj->lid, $locale);
+ if ($language) {
+ db_query("INSERT INTO {locales_target} (lid, language, translation) VALUES (%d, '%s', '')", $obj->lid, $language->language);
}
}
// We have no such source string
else {
db_query("INSERT INTO {locales_source} (location, source) VALUES ('%s', '%s')", request_uri(), $string);
- if ($locale) {
+ if ($language) {
$lid = db_fetch_object(db_query("SELECT lid FROM {locales_source} WHERE source = '%s'", $string));
- db_query("INSERT INTO {locales_target} (lid, locale, translation) VALUES (%d, '%s', '')", $lid->lid, $locale);
+ db_query("INSERT INTO {locales_target} (lid, language, translation) VALUES (%d, '%s', '')", $lid->lid, $language->language);
}
}
// Clear locale cache in DB
- cache_clear_all("locale:$locale", 'cache');
+ cache_clear_all('locale:' . $language->language, 'cache');
}
}
@@ -215,61 +258,31 @@ function locale($string) {
* We only store short strings to improve performance and consume less memory.
*/
function locale_refresh_cache() {
- $languages = locale_supported_languages();
+ $languages = language_list('enabled');
+ $languages = $languages['1'];
- foreach (array_keys($languages['name']) as $locale) {
- $result = db_query("SELECT s.source, t.translation, t.locale FROM {locales_source} s INNER JOIN {locales_target} t ON s.lid = t.lid WHERE t.locale = '%s' AND LENGTH(s.source) < 75", $locale);
+ foreach ($languages as $language) {
+ $result = db_query("SELECT s.source, t.translation, t.language FROM {locales_source} s INNER JOIN {locales_target} t ON s.lid = t.lid WHERE t.language = '%s' AND LENGTH(s.source) < 75", $language->language);
$t = array();
while ($data = db_fetch_object($result)) {
$t[$data->source] = (empty($data->translation) ? TRUE : $data->translation);
}
- cache_set("locale:$locale", 'cache', serialize($t));
+ cache_set('locale:' . $language->language, 'cache', serialize($t));
}
}
/**
- * Returns list of languages supported on this site.
- *
- * @param $reset Refresh cached language list.
- * @param $getall Return all languages (even disabled ones)
- */
-function locale_supported_languages($reset = FALSE, $getall = FALSE) {
- static $enabled = NULL;
- static $all = NULL;
-
- if ($reset) {
- unset($enabled); unset($all);
- }
-
- if (!isset($enabled)) {
- $enabled = $all = array();
- $all['name'] = $all['formula'] = $enabled['name'] = $enabled['formula'] = array();
- $result = db_query('SELECT locale, name, formula, enabled FROM {locales_meta} ORDER BY isdefault DESC, enabled DESC, name ASC');
- while ($row = db_fetch_object($result)) {
- $all['name'][$row->locale] = $row->name;
- $all['formula'][$row->locale] = $row->formula;
- if ($row->enabled) {
- $enabled['name'][$row->locale] = $row->name;
- $enabled['formula'][$row->locale] = $row->formula;
- }
- }
- }
- return $getall ? $all : $enabled;
-}
-
-/**
* Returns plural form index for a specific number.
*
* The index is computed from the formula of this language.
*/
function locale_get_plural($count) {
- global $locale;
+ global $language;
static $locale_formula, $plurals = array();
if (!isset($plurals[$count])) {
if (!isset($locale_formula)) {
- $languages = locale_supported_languages();
- $locale_formula = $languages['formula'][$locale];
+ $locale_formula = $language->formula;
}
if ($locale_formula) {
$n = $count;
@@ -284,6 +297,34 @@ function locale_get_plural($count) {
return $plurals[$count];
}
+
+/**
+ * Returns a language name
+ */
+function locale_language_name($lang) {
+ static $list = NULL;
+ if (!isset($list)) {
+ $list = locale_language_list();
+ }
+ return ($lang && isset($list[$lang])) ? $list[$lang] : t('All');
+}
+
+/**
+ * Returns array of language names
+ *
+ * @param $field
+ * 'name' => names in current language, localized
+ * 'native' => native names
+ */
+function locale_language_list($field = 'name') {
+ $languages = language_list('enabled');
+ $list = array();
+ foreach($languages[1] as $language) {
+ $list[$language->language] = ($field == 'name') ? t($language->name) : $language->$field;
+ }
+ return $list;
+}
+
// ---------------------------------------------------------------------------------
// Language management functionality (administration only)
@@ -308,14 +349,15 @@ function locale_admin_manage_delete_form($langcode) {
}
// For other locales, warn user that data loss is ahead.
- $languages = locale_supported_languages(FALSE, TRUE);
+ $languages = language_list();
- if (!isset($languages['name'][$langcode])) {
+ if (!isset($languages[$langcode])) {
drupal_not_found();
}
else {
$form['langcode'] = array('#type' => 'value', '#value' => $langcode);
- return confirm_form($form, t('Are you sure you want to delete the language %name?', array('%name' => t($languages['name'][$langcode]))), 'admin/build/locale/language/overview', t('Deleting a language will remove all data associated with it. This action cannot be undone.'), t('Delete'), t('Cancel'));
+ $form['#submit']['locale_admin_manage_delete_form_submit'] = array();
+ return confirm_form($form, t('Are you sure you want to delete the language %name?', array('%name' => t($languages[$langcode]->name))), 'admin/build/locale/language/overview', t('Deleting a language will remove all data associated with it. This action cannot be undone.'), t('Delete'), t('Cancel'));
}
}
@@ -323,11 +365,11 @@ function locale_admin_manage_delete_form($langcode) {
* Process language deletion submissions.
*/
function locale_admin_manage_delete_form_submit($form_id, $form_values) {
- $languages = locale_supported_languages(FALSE, TRUE);
- if (isset($languages['name'][$form_values['langcode']])) {
- db_query("DELETE FROM {locales_meta} WHERE locale = '%s'", $form_values['langcode']);
- db_query("DELETE FROM {locales_target} WHERE locale = '%s'", $form_values['langcode']);
- $message = t('The language %locale has been removed.', array('%locale' => t($languages['name'][$form_values['langcode']])));
+ $languages = language_list();
+ if (isset($languages[$form_values['langcode']])) {
+ db_query("DELETE FROM {languages} WHERE language = '%s'", $form_values['langcode']);
+ db_query("DELETE FROM {locales_target} WHERE language = '%s'", $form_values['langcode']);
+ $message = t('The language %locale has been removed.', array('%locale' => t($languages[$form_values['langcode']]->name)));
drupal_set_message($message);
watchdog('locale', $message);
}
@@ -346,6 +388,16 @@ function locale_admin_manage_add() {
return _locale_admin_manage_add_screen();
}
+function locale_admin_manage_edit($langcode) {
+ include_once './includes/locale.inc';
+ return _locale_admin_manage_edit_screen($langcode);
+}
+
+function locale_admin_manage_configure() {
+ include_once './includes/locale.inc';
+ return drupal_get_form("locale_configure_language_form");
+}
+
// ---------------------------------------------------------------------------------
// Gettext Portable Object import functionality (administration only)
diff --git a/modules/node/node.module b/modules/node/node.module
index 5e9bce1a6..3ccec64ab 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -1747,7 +1747,7 @@ function node_block($op = 'list', $delta = 0) {
* The link should be an absolute URL.
*/
function node_feed($nodes = 0, $channel = array()) {
- global $base_url, $locale;
+ global $base_url, $language;
if (!$nodes) {
$nodes = db_query_range(db_rewrite_sql('SELECT n.nid, n.created FROM {node} n WHERE n.promote = 1 AND n.status = 1 ORDER BY n.created DESC'), 0, variable_get('feed_default_items', 10));
@@ -1809,7 +1809,7 @@ function node_feed($nodes = 0, $channel = array()) {
'title' => variable_get('site_name', 'Drupal') .' - '. variable_get('site_slogan', ''),
'link' => $base_url,
'description' => variable_get('site_mission', ''),
- 'language' => $locale
+ 'language' => $language->language
);
$channel = array_merge($channel_defaults, $channel);
diff --git a/modules/path/path.module b/modules/path/path.module
index c245fb63b..f78300f1c 100644
--- a/modules/path/path.module
+++ b/modules/path/path.module
@@ -26,6 +26,7 @@ function path_help($section) {
$output .= '<p>'. t('For more information please read the configuration and customization handbook <a href="@path">Path page</a>.', array('@path' => 'http://drupal.org/handbook/modules/path/')) .'</p>';
return $output;
case 'admin/build/path':
+ case 'admin/build/path/list':
return '<p>'. t("Drupal provides users complete control over URLs through aliasing. This feature is typically used to make URLs human-readable or easy to remember. For example, one could map the relative URL 'node/1' onto 'about'. Each system path can have multiple aliases.") .'</p>';
case 'admin/build/path/add':
return '<p>'. t('Enter the path you wish to create the alias for, followed by the name of the new alias.') .'</p>';
@@ -105,7 +106,6 @@ function path_admin_delete_confirm($pid) {
$_GET['destination'] ? $_GET['destination'] : 'admin/build/path', t('This action cannot be undone.'),
t('Delete'), t('Cancel') );
}
-
return $output;
}
@@ -127,49 +127,51 @@ function path_admin_delete($pid = 0) {
drupal_set_message(t('The alias has been deleted.'));
}
-
-
/**
* Set an aliased path for a given Drupal path, preventing duplicates.
*/
-function path_set_alias($path = NULL, $alias = NULL, $pid = NULL) {
+function path_set_alias($path = NULL, $alias = NULL, $pid = NULL, $language = '') {
if ($path && !$alias) {
- db_query("DELETE FROM {url_alias} WHERE src = '%s'", $path);
+ // Delete based on path
+ db_query("DELETE FROM {url_alias} WHERE src = '%s' AND language = '%s'", $path, $language);
db_query("UPDATE {menu} SET link_path = path WHERE path = '%s'", $path);
drupal_clear_path_cache();
}
else if (!$path && $alias) {
- db_query("DELETE FROM {url_alias} WHERE dst = '%s'", $alias);
+ // Delete based on alias
+ db_query("DELETE FROM {url_alias} WHERE dst = '%s' AND language = '%s'", $alias, $language);
db_query("UPDATE {menu} SET link_path = path WHERE link_path = '%s'", $alias);
drupal_clear_path_cache();
}
else if ($path && $alias) {
$path = urldecode($path);
- $path_count = db_result(db_query("SELECT COUNT(src) FROM {url_alias} WHERE src = '%s'", $path));
+ $path_count = db_result(db_query("SELECT COUNT(src) FROM {url_alias} WHERE src = '%s' AND language = '%s'", $path, $language));
$alias = urldecode($alias);
// Alias count can only be 0 or 1.
- $alias_count = db_result(db_query("SELECT COUNT(dst) FROM {url_alias} WHERE dst = '%s'", $alias));
+ $alias_count = db_result(db_query("SELECT COUNT(dst) FROM {url_alias} WHERE dst = '%s' AND language = '%s'", $alias, $language));
if ($alias_count == 0) {
if ($pid) {
- db_query("UPDATE {url_alias} SET dst = '%s', src = '%s' WHERE pid = %d", $alias, $path, $pid);
+ // Existing path changed data
+ db_query("UPDATE {url_alias} SET src = '%s', dst = '%s', language = '%s' WHERE pid = %d", $path, $alias, $language, $pid);
}
else {
- db_query("INSERT INTO {url_alias} (src, dst) VALUES ('%s', '%s')", $path, $alias);
+ // No such alias yet in this language
+ db_query("INSERT INTO {url_alias} (src, dst, language) VALUES ('%s', '%s', '%s')", $path, $alias, $language);
}
}
// The alias exists.
else {
// This path has no alias yet, so we redirect the alias here.
if ($path_count == 0) {
- db_query("UPDATE {url_alias} SET src = '%s' WHERE dst = '%s'", $path, $alias);
+ db_query("UPDATE {url_alias} SET src = '%s' WHERE dst = '%s' AND language = '%s'", $path, $alias, $language);
}
else {
// This will delete the path that alias was originally pointing to.
- path_set_alias(NULL, $alias);
+ path_set_alias(NULL, $alias, NULL, $language);
// This will remove the current aliases of the path.
- path_set_alias($path);
- path_set_alias($path, $alias);
+ path_set_alias($path, NULL, NULL, $language);
+ path_set_alias($path, $alias, NULL, $language);
}
}
if ($alias_count == 0 || $path_count == 0) {
@@ -186,6 +188,7 @@ function path_form($edit = '') {
$form['#submit']['path_form_submit'] = array();
$form['#validate']['path_form_validate'] = array();
$form['#theme'] = 'path_form';
+ $form['#alias'] = $edit;
$form['src'] = array(
'#type' => 'textfield',
@@ -198,13 +201,13 @@ function path_form($edit = '') {
);
$form['dst'] = array(
'#type' => 'textfield',
+ '#title' => t('Path alias'),
'#default_value' => $edit['dst'],
'#maxlength' => 64,
'#size' => 45,
'#description' => t('Specify an alternative path by which this data can be accessed. For example, type "about" when writing an about page. Use a relative path and don\'t add a trailing slash or the URL alias won\'t work.'),
'#field_prefix' => url(NULL, array('absolute' => TRUE)) . (variable_get('clean_url', 0) ? '' : '?q=')
);
-
if ($edit['pid']) {
$form['pid'] = array('#type' => 'hidden', '#value' => $edit['pid']);
$form['submit'] = array('#type' => 'submit', '#value' => t('Update alias'));
@@ -227,7 +230,8 @@ function path_nodeapi(&$node, $op, $arg) {
switch ($op) {
case 'validate':
$node->path = trim($node->path);
- if (db_result(db_query("SELECT COUNT(dst) FROM {url_alias} WHERE dst = '%s' AND src != '%s'", $node->path, "node/$node->nid"))) {
+ $language = isset($node->language) ? $node->language : '';
+ if (db_result(db_query("SELECT COUNT(dst) FROM {url_alias} WHERE dst = '%s' AND src != '%s' AND language = '%s'", $node->path, "node/$node->nid", $language))) {
form_set_error('path', t('The path is already in use.'));
}
break;
@@ -307,23 +311,37 @@ function path_perm() {
* Return a listing of all defined URL aliases.
*/
function path_overview() {
+ // Enable language column if locale is enabled or if we have any alias with language
+ $count = db_result(db_query("SELECT COUNT(*) FROM {url_alias} WHERE language != ''"));
+ $multilanguage = (module_exists('locale') || $count);
+
$sql = 'SELECT * FROM {url_alias}';
$header = array(
array('data' => t('Alias'), 'field' => 'dst', 'sort' => 'asc'),
array('data' => t('System'), 'field' => 'src'),
array('data' => t('Operations'), 'colspan' => '2')
);
+ if ($multilanguage) {
+ $header[3] = $header[2];
+ $header[2] = array('data' => t('Language'), 'field' => 'language');
+ }
$sql .= tablesort_sql($header);
$result = pager_query($sql, 50);
$rows = array();
$destination = drupal_get_destination();
while ($data = db_fetch_object($result)) {
- $rows[] = array(check_plain($data->dst), check_plain($data->src), l(t('edit'), "admin/build/path/edit/$data->pid", array('query' => $destination)), l(t('delete'), "admin/build/path/delete/$data->pid", array('query' => $destination)));
+ $row = array(check_plain($data->dst), check_plain($data->src), l(t('edit'), "admin/build/path/edit/$data->pid", array('query' => $destination)), l(t('delete'), "admin/build/path/delete/$data->pid", array('query' => $destination)));
+ if ($multilanguage) {
+ $row[4] = $row[3];
+ $row[3] = $row[2];
+ $row[2] = module_invoke('locale', 'language_name', $data->language);
+ }
+ $rows[] = $row;
}
if (empty($rows)) {
- $rows[] = array(array('data' => t('No URL aliases available.'), 'colspan' => '4'));
+ $rows[] = array(array('data' => t('No URL aliases available.'), 'colspan' => ($multilanguage ? 5 : 4)));
}
$output = theme('table', $header, $rows);
@@ -345,9 +363,11 @@ function path_form_validate($form_id, $form_values) {
$src = $form_values['src'];
$dst = $form_values['dst'];
$pid = $form_values['pid'];
+ // Language is only set if locale module is enabled, otherwise save for all languages.
+ $language = isset($form_values['language']) ? $form_values['language'] : '';
- if (db_result(db_query("SELECT COUNT(dst) FROM {url_alias} WHERE pid != %d AND dst = '%s'", $pid, $dst))) {
- form_set_error('dst', t('The alias %alias is already in use.', array('%alias' => $dst)));
+ if (db_result(db_query("SELECT COUNT(dst) FROM {url_alias} WHERE pid != %d AND dst = '%s' AND language = '%s'", $pid, $dst, $language))) {
+ form_set_error('dst', t('The alias %alias is already in use in this language.', array('%alias' => $dst)));
}
}
@@ -355,7 +375,8 @@ function path_form_validate($form_id, $form_values) {
* Save a new URL alias to the database.
*/
function path_form_submit($form_id, $form_values) {
- path_set_alias($form_values['src'], $form_values['dst'], $form_values['pid']);
+ // Language is only set if locale module is enabled
+ path_set_alias($form_values['src'], $form_values['dst'], $form_values['pid'], isset($form_values['language']) ? $form_values['language'] : '');
drupal_set_message(t('The alias has been saved.'));
return 'admin/build/path';
diff --git a/modules/system/system.install b/modules/system/system.install
index d0ddeb929..d942b71d0 100644
--- a/modules/system/system.install
+++ b/modules/system/system.install
@@ -440,8 +440,9 @@ function system_install() {
pid int unsigned NOT NULL auto_increment,
src varchar(128) NOT NULL default '',
dst varchar(128) NOT NULL default '',
+ language varchar(12) NOT NULL default '',
PRIMARY KEY (pid),
- UNIQUE KEY dst (dst),
+ UNIQUE KEY dst_language (dst, language),
KEY src (src)
) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
@@ -585,7 +586,8 @@ function system_install() {
db_query("CREATE TABLE {variable} (
name varchar(128) NOT NULL default '',
value longtext NOT NULL,
- PRIMARY KEY (name)
+ language varchar(12) NOT NULL default '',
+ PRIMARY KEY (name, language)
) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
db_query("CREATE TABLE {vocabulary} (
@@ -926,10 +928,11 @@ function system_install() {
pid serial CHECK (pid >= 0),
src varchar(128) NOT NULL default '',
dst varchar(128) NOT NULL default '',
- PRIMARY KEY (pid),
- UNIQUE (dst)
+ language varchar(12) NOT NULL default '',
+ PRIMARY KEY (pid)
)");
db_query("CREATE INDEX {url_alias}_src_idx ON {url_alias} (src)");
+ db_query("CREATE UNIQUE INDEX {url_alias}_dst_language_idx ON {url_alias} (dst, language)");
db_query("CREATE TABLE {permission} (
rid int_unsigned NOT NULL default '0',
@@ -1072,7 +1075,8 @@ function system_install() {
db_query("CREATE TABLE {variable} (
name varchar(128) NOT NULL default '',
value text NOT NULL,
- PRIMARY KEY (name)
+ language varchar(12) NOT NULL default '',
+ PRIMARY KEY (name, language)
)");
db_query("CREATE TABLE {vocabulary} (
@@ -3689,6 +3693,27 @@ function system_update_2004() {
}
/**
+ * Add language to url_alias table and modify indexes.
+ */
+function system_update_2005() {
+ $ret = array();
+ switch ($GLOBALS['db_type']) {
+ case 'pgsql':
+ db_add_column($ret, 'url_alias', 'language', 'varchar(12)', array('default' => "''", 'not null' => TRUE));
+ $ret[] = update_sql('DROP INDEX {url_alias}_dst_idx');
+ $ret[] = update_sql('CREATE UNIQUE INDEX {url_alias}_dst_language_idx ON {url_alias}(dst, language)');
+ break;
+ case 'mysql':
+ case 'mysqli':
+ $ret[] = update_sql("ALTER TABLE {url_alias} ADD language varchar(12) NOT NULL default ''");
+ $ret[] = update_sql("ALTER TABLE {url_alias} DROP INDEX dst");
+ $ret[] = update_sql("ALTER TABLE {url_alias} ADD UNIQUE dst_language (dst, language)");
+ break;
+ }
+ return $ret;
+}
+
+/**
* @} End of "defgroup updates-5.0-to-x.x"
* The next series of updates should start at 3000.
*/