? domain_i18n.patch
Index: domain.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/domain/domain.admin.inc,v
retrieving revision 1.5
diff -u -p -r1.5 domain.admin.inc
--- domain.admin.inc	6 Jul 2008 21:16:39 -0000	1.5
+++ domain.admin.inc	29 Jul 2008 23:22:07 -0000
@@ -853,10 +853,11 @@ function domain_batch_form($form_state, 
       $default[$domain['domain_id']] = $domain[$action];
     }
     if ($batch['#domain_action'] == 'domain_conf') {
+      global $language;
       // Set the default value to the main settings.
       $default[$domain['domain_id']] = variable_get($action, $batch['#system_default']);
       // Check for domain-specific settings.
-      $result = db_result(db_query("SELECT settings FROM {domain_conf} WHERE domain_id = %d", $domain['domain_id']));
+      $result = db_result(db_query("SELECT settings FROM {domain_conf} WHERE domain_id = %d AND language = '%s'", $domain['domain_id'], $language->language));
       $settings = unserialize($result);
       if (isset($settings[$action])) {
         $default[$domain['domain_id']] = $settings[$action];
@@ -902,7 +903,14 @@ function domain_batch_form($form_state, 
  */
 function theme_domain_batch_form($form) {
   $output = '';
-  $output = drupal_render($form['message']);
+
+  // Language handling notice.
+  if ($form['handler']['#value'] == 'domain_conf' && variable_get('language_count', 1) > 1) {
+    $output .= theme('domain_conf_languages');
+  }  
+
+  $output .= drupal_render($form['message']);
+
   $header = array(t('Id'), t('Domain'), t('Setting'));
   $rows = array();
   foreach (element_children($form['domain_batch']) as $key) {
@@ -939,7 +947,7 @@ function theme_domain_batch_title($batch
 function domain_batch_form_validate($form, &$form_state) {
   // Define the validation function and call it.
   if (isset($form_state['values']['validate_handler']) && function_exists($form_state['values']['validate_handler'])) {
-    $validate($form_state['values']);
+    $form_state['values']['validate_handler']($form_state['values']);
   }
 }
 
@@ -961,18 +969,19 @@ function domain_batch_form_submit($form,
       }
       break;
     case 'domain_conf':
+      global $language;
       foreach ($form_state['values']['domain_batch'] as $key => $value) {
         $settings = array();
         if ($key > 0 || empty($form_state['values']['variable'])) {
-          $data = db_fetch_array(db_query("SELECT settings FROM {domain_conf} WHERE domain_id = %d", $key));
+          $data = db_fetch_array(db_query("SELECT settings FROM {domain_conf} WHERE domain_id = %d AND language = '%s'", $key, $language->language));
           if (isset($data['settings'])) {
             $settings = unserialize($data['settings']);
             $settings[$item] = $value;
-            db_query("UPDATE {domain_conf} SET settings = %b WHERE domain_id = %d", serialize($settings), $key);
+            db_query("UPDATE {domain_conf} SET settings = %b WHERE domain_id = %d AND language = '%s'", serialize($settings), $key, $language->language);
           }
           else {
             $settings[$item] = $value;
-            db_query("INSERT INTO {domain_conf} (domain_id, settings) VALUES (%d, %b)", $key, serialize($settings));
+            db_query("INSERT INTO {domain_conf} (domain_id, language, settings) VALUES (%d, '%s', %b)", $key, $language->language, serialize($settings));
           }
         }
         else if (!empty($form_state['values']['variable'])) {
Index: domain.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/domain/domain.module,v
retrieving revision 1.61
diff -u -p -r1.61 domain.module
--- domain.module	25 Jul 2008 14:22:01 -0000	1.61
+++ domain.module	29 Jul 2008 23:22:07 -0000
@@ -40,6 +40,7 @@ define('DOMAIN_SITE_GRANT', TRUE);
 function domain_init() {
   global $_domain, $conf;
   $_domain = array();
+  $default = domain_default();
   // We lower case this, since EXAMPLE.com == example.com.
   $_subdomain = strtolower(rtrim($_SERVER['HTTP_HOST']));
 
@@ -55,7 +56,7 @@ function domain_init() {
 
   // If return is -1, then the DNS didn't match anything, so use defaults.
   if ($_domain == -1) {
-    $_domain = domain_default();
+    $_domain = $default;
   }
 
   // If we stripped the www. send the user to the proper domain.  This should only
@@ -67,11 +68,13 @@ function domain_init() {
   // For Domain User, we check the validity of accounts, so the 'valid' flag must be TRUE.
   // If this check fails, we send users to the default site homepage.
   if (!$_domain['valid'] && !user_access('administer domains')) {
-    $_domain = domain_default();
-    drupal_goto($_domain['path']);
+    drupal_goto($default['path']);
+  }
+  // With translatable site names, we have to check to be sure that the translation is in effect.
+  // If not, just use the site name provided by the main module.
+  if ($conf['site_name'] == $default['sitename'] && $_domain['domain_id'] > 0) {
+    $conf['site_name'] = $_domain['sitename'];
   }
-  // Set the site name to the domain-specific name.
-  $conf['site_name'] = $_domain['sitename'];
 }
 
 /**
@@ -1034,7 +1037,7 @@ function domain_form_alter(&$form, &$for
         '#title' => t('Send to all affiliates'),
         '#required' => FALSE,
         '#description' => t('Select if this content can be shown to all affiliates.  This setting will override the options below.'),
-        '#default_value' => ($form['#node']->nid) ? $form['#node']->domain_site : variable_get('domain_node_'. $form['#node']->type, $behavior),
+        '#default_value' => (isset($form['#node']->nid)) ? $form['#node']->domain_site : variable_get('domain_node_'. $form['#node']->type, $behavior),
       );
       $form['domain']['domains'] = array(
         '#type' => 'checkboxes',
@@ -1042,7 +1045,7 @@ function domain_form_alter(&$form, &$for
         '#options' => $options,
         '#required' => TRUE,
         '#description' => t('Select which affiliates can access this content.'),
-        '#default_value' => ($form['#node']->nid) ? $form['#node']->domains : $default,
+        '#default_value' => (isset($form['#node']->nid)) ? $form['#node']->domains : $default,
       );
     }
     // If the user has limited permissions, show that form or obey the settings.
Index: domain_conf/domain_conf.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/domain/domain_conf/domain_conf.admin.inc,v
retrieving revision 1.2
diff -u -p -r1.2 domain_conf.admin.inc
--- domain_conf/domain_conf.admin.inc	6 Jul 2008 21:16:39 -0000	1.2
+++ domain_conf/domain_conf.admin.inc	29 Jul 2008 23:22:07 -0000
@@ -18,14 +18,23 @@
  * The appropriate form or an error message.
  */
 function domain_conf_page($domain) {
+  global $language;
   if ($domain == -1) {
     return t('Invalid page requested.');
   }
 
+  $output = '';
+
+  // Language handling.
+  $languages = variable_get('language_count', 1);
+  if ($languages > 1) {
+    $output .= theme('domain_conf_languages', $language, language_list('enabled'));
+  }
+
   // Load the system form file.
   include_once drupal_get_path('module', 'system') .'/system.admin.inc';
 
-  $output = theme_domain_conf_reset($domain);
+  $output .= theme_domain_conf_reset($domain);
   if ($domain['domain_id'] > 0) {
     // Ensure we are on the proper domain.
     domain_goto($domain);
@@ -79,11 +88,12 @@ function domain_conf_default($domain) {
  * The bulk of our hook_form_alter implementation.
  */
 function domain_conf_system(&$form, &$form_state, $form_id) {
+  global $language;
   // We use the system_site_information_settings form as a base, and add the elements we need
   // from other forms.  The default values are altered based on stored settings.
   $domain_id = arg(4);
   $domain = domain_lookup($domain_id);
-  $data = db_result(db_query("SELECT settings FROM {domain_conf} WHERE domain_id = %d", $domain['domain_id']));
+  $data = db_result(db_query("SELECT settings FROM {domain_conf} WHERE domain_id = %d AND language = '%s'", $domain['domain_id'], $language->language));
   if (!empty($data)) {
     $settings = unserialize($data);
   }
@@ -165,12 +175,12 @@ function domain_conf_system(&$form, &$fo
     '#description' => t('Message to show visitors when the site is in off-line mode.')
   );
 
-  // Site name must be edited at the domain creation screen.
+  /* Site name must be edited at the domain creation screen.
   $form['main']['site_name']['#disabled'] = TRUE;
   $form['main']['site_name']['#description'] = t('The name of this web site, as entered in the <a href="!url">domain-specific settings</a>.', array('!url' => url('admin/build/domain/edit/'. $domain['domain_id'])));
-
+  */
   // Reset the provided form defaults, if needed
-  $form['main']['site_name']['#value'] = $domain['sitename'];
+  $form['main']['site_name']['#default_value'] = isset($settings['site_name']) ? $settings['site_name'] : $domain['sitename'];
   $form['main']['site_mail']['#default_value'] = isset($settings['site_mail']) ? $settings['site_mail'] : variable_get('site_mail', ini_get('sendmail_from'));
   $form['main']['site_slogan']['#default_value'] = isset($settings['site_slogan']) ? $settings['site_slogan'] : variable_get('site_slogan', '');
   $form['main']['site_mission']['#default_value'] = isset($settings['site_mission']) ? $settings['site_mission'] : variable_get('site_mission', '');
@@ -199,6 +209,7 @@ function domain_conf_system(&$form, &$fo
  * FormsAPI for domain_conf_form().
  */
 function domain_conf_form_submit($form, &$form_state) {
+  global $language;
   // Throw away what we don't need.
   $settings = $form_state['values'];
   $unset = array('form_token', 'form_id', 'form_build_id', 'op', 'submit');
@@ -207,14 +218,14 @@ function domain_conf_form_submit($form, 
   }
   // INSERT or UPDATE?
   $check = 0;
-  $check = db_result(db_query("SELECT COUNT(domain_id) FROM {domain_conf} WHERE domain_id = %d", $form_state['values']['domain_id']));
+  $check = db_result(db_query("SELECT COUNT(domain_id) FROM {domain_conf} WHERE domain_id = %d AND language = '%s'", $form_state['values']['domain_id'], $language->language));
   if ($check > 0) {
-    $sql = "UPDATE {domain_conf} SET settings = %b WHERE domain_id = %d";
-    db_query($sql, serialize($settings), $form_state['values']['domain_id']);
+    $sql = "UPDATE {domain_conf} SET settings = %b WHERE domain_id = %d AND language = '%s'";
+    db_query($sql, serialize($settings), $form_state['values']['domain_id'], $language->language);
   }
   else {
-    $sql = "INSERT INTO {domain_conf} (domain_id, settings) VALUES (%d, %b)";
-    db_query($sql, $form_state['values']['domain_id'], serialize($settings));
+    $sql = "INSERT INTO {domain_conf} (domain_id, language, settings) VALUES (%d, '%s', %b)";
+    db_query($sql, $form_state['values']['domain_id'], $language->language, serialize($settings));
   }
   drupal_set_message(t('Domain options saved successfully.'));
 }
@@ -254,7 +265,8 @@ function domain_conf_reset_form($form_st
  * FormsAPI for domain_conf_reset_form().
  */
 function domain_conf_reset_form_submit($form, &$form_state) {
-  db_query("DELETE FROM {domain_conf} WHERE domain_id = %d", $form_state['values']['domain_id']);
+  global $language;
+  db_query("DELETE FROM {domain_conf} WHERE domain_id = %d AND language = '%s'", $form_state['values']['domain_id'], $language->language);
   drupal_set_message(t('Domain configuration settings have been reset.'));
   $form_state['redirect'] = 'admin/build/domain/conf/'. $form_state['values']['domain_id'];
 }
Index: domain_conf/domain_conf.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/domain/domain_conf/domain_conf.install,v
retrieving revision 1.4
diff -u -p -r1.4 domain_conf.install
--- domain_conf/domain_conf.install	26 Mar 2008 02:47:31 -0000	1.4
+++ domain_conf/domain_conf.install	29 Jul 2008 23:22:07 -0000
@@ -20,8 +20,12 @@ function domain_conf_schema() {
   $schema['domain_conf'] = array(
     'fields' => array(
       'domain_id' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      'language' => array('type' => 'varchar', 'length' => 12, 'not null' => TRUE, 'default' => 'en'),
       'settings' => array('type' => 'blob', 'not null' => FALSE)),
-    'primary key' => array('domain_id'),
+    'primary key' => array('domain_id', 'language'),
+/*    'indexes' => array(
+      'domain_id' => array('domain_id'),
+      'language' => array('language'))*/
   );
   return $schema;
 }
@@ -32,3 +36,14 @@ function domain_conf_schema() {
 function domain_conf_uninstall() {
   drupal_uninstall_schema('domain_conf');
 }
+
+/**
+ * Adds language support.
+ */
+function domain_conf_update_6001() {
+  $ret = array();
+  db_drop_primary_key($ret, 'domain_conf');
+  db_add_field($ret, 'domain_conf', 'language', array('type' => 'varchar', 'length' => 12, 'not null' => TRUE, 'default' => 'en'));
+  db_add_primary_key($ret, 'domain_conf', array('domain_id', 'language'));
+  return $ret;
+}
Index: domain_conf/domain_conf.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/domain/domain_conf/domain_conf.module,v
retrieving revision 1.25
diff -u -p -r1.25 domain_conf.module
--- domain_conf/domain_conf.module	6 Jul 2008 21:16:39 -0000	1.25
+++ domain_conf/domain_conf.module	29 Jul 2008 23:22:07 -0000
@@ -58,10 +58,14 @@ function domain_conf_menu() {
  * Implements hook_theme()
  */
 function domain_conf_theme() {
+  global $language;
   $themes = array(
     'domain_conf_reset' => array(
       'arguments' => array('domain' => array()),
     ),
+    'domain_conf_languages' => array(
+      'arguments' => array(),
+    ),
   );
   return $themes;
 }
@@ -153,6 +157,22 @@ function domain_conf_domainbatch() {
     '#data_type' => 'string',
     '#weight' => -8,
   );
+  // Change site name strings.
+  $batch['site_name'] = array(
+    '#form' => array(
+      '#title' => t('Site name string'),
+      '#type' => 'textfield',
+      '#size' => 60,
+      '#maxlength' => 255,
+      '#description' => t('The name to display when this site is active.  Will override the setting for the domain record.'),
+    ),
+    '#domain_action' => 'domain_conf',
+    '#system_default' => '',
+    '#variable' => 'site_name',
+    '#meta_description' => t('Set the translatable site name for all domains.'),
+    '#data_type' => 'string',
+    '#weight' => -8,
+  );  
   // Change the site slogan.
   $batch['site_slogan'] = array(
     '#form' => array(
@@ -332,3 +352,52 @@ function domain_conf_api($all = FALSE) {
   }
   return $options;
 }
+
+/**
+ * Implements hook_domainload()
+ */
+function domain_conf_domainload(&$domain) {
+  global $language;
+  static $count;
+  if (!isset($count)) {
+   $count = variable_get('language_count', 1);
+  }
+  if ($count > 1) {
+    $data = array();
+    $data = db_fetch_array(db_query("SELECT settings FROM {domain_conf} WHERE domain_id = %d AND language = '%s'", $domain['domain_id'], $language->language));
+    if (!empty($data)) {
+      $settings = unserialize($data['settings']);
+      if (!empty($settings['site_name'])) {
+        $domain['sitename'] = $settings['site_name'];
+      }
+    }
+  }
+}
+
+/**
+ * Theme function for warning users about language-sensitive settings.
+ */
+function theme_domain_conf_languages() {
+  global $language;
+  $active_language = $language;
+  $languages = language_list('enabled');
+  $output = '';
+  $native = "($active_language->native)";
+  if ($active_language->native == $active_language->name) {
+    $native = '';
+  }
+  $output .= t('You are editing the %language %native settings.  You may choose another language below.', array('%language' => $active_language->name, '%native' => $native));
+  foreach ($languages[1] as $language) {
+    if ($active_language->language != $language->language) {
+      $links[$language->language] = array(
+        'href'       => $_GET['q'],
+        'title'      => $language->native,
+        'language'   => $language,
+        'attributes' => array('class' => 'language-link'),
+      );
+    }
+  }
+  drupal_alter('translation_link', $links, $_GET['q']);
+  $output .= theme('links', $links, array());
+  return $output;
+}
Index: domain_conf/settings_domain_conf.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/domain/domain_conf/settings_domain_conf.inc,v
retrieving revision 1.9
diff -u -p -r1.9 settings_domain_conf.inc
--- domain_conf/settings_domain_conf.inc	4 Jul 2008 19:48:48 -0000	1.9
+++ domain_conf/settings_domain_conf.inc	29 Jul 2008 23:22:07 -0000
@@ -40,8 +40,11 @@ function _domain_conf_load($domain = NUL
     if (!isset($domain['domain_id'])) {
       $domain['domain_id'] = 0;
     }
+    // Language handling: drupal_init_language() will return English by default.
+    // We have to set the language variables manually, since not all functions are ready yet.
+    $_language = _domain_conf_language();
     $data = array();
-    $data = db_fetch_array(db_query("SELECT settings FROM {domain_conf} WHERE domain_id = %d", $domain['domain_id']));
+    $data = db_fetch_array(db_query("SELECT settings FROM {domain_conf} WHERE domain_id = %d AND language = '%s'", $domain['domain_id'], $_language));
     if (!empty($data)) {
       global $conf;
       $settings = unserialize($data['settings']);
@@ -52,3 +55,68 @@ function _domain_conf_load($domain = NUL
     }
   }
 }
+
+/**
+ * If we try to run the language initialization, we throw all kinds of errors.
+ * This is because language_initialize() resets $_GET['q'] in some cases.
+ * So we have to run some lookups ourselves.
+ *
+ * @return
+ * The language identifier string to be used in the lookup query.  Defaults to 'en'.
+ */
+function _domain_conf_language() {
+  // Get the variables that we need to run this lookup properly.
+  $info = db_query("SELECT name, value FROM {variable} WHERE name = 'language_count' OR name = 'language_negotiation'");
+  while ($variable = db_fetch_array($info)) {
+    $variables[$variable['name']] = unserialize($variable['value']);
+  }
+  // Initialize a temporary $_language variable.
+  // This is _deliberately_ not the $language global.
+  $_language = NULL;
+  $default_language = unserialize(db_result(db_query("SELECT name, value FROM {variable} WHERE name = 'language_default'")));
+  if (!empty($default_language->language)) {
+    $_language = $default_language->language;
+  }
+  if ($variables['language_count'] > 1) {
+    include_once('./includes/language.inc');
+    // Get a list of enabled languages.
+    $languages = array();
+    $result = db_query('SELECT * FROM {languages} WHERE enabled > 0');
+    while ($row = db_fetch_object($result)) {
+      $languages[$row->language] = $row;
+    }
+    switch ($variables['language_negotiation']) {
+      case LANGUAGE_NEGOTIATION_NONE:
+        // Already set above as the default.
+        break;
+      case LANGUAGE_NEGOTIATION_DOMAIN:
+        foreach ($languages as $option) {
+          $parts = parse_url($option->domain);
+          if (!empty($parts['host']) && ($_SERVER['SERVER_NAME'] == $parts['host'])) {
+            $_language = $option->language;
+            break;
+          }
+        }
+        break;
+    case LANGUAGE_NEGOTIATION_PATH_DEFAULT:
+    case LANGUAGE_NEGOTIATION_PATH:
+      // $_GET['q'] might not be available at this time, because
+      // path initialization runs after the language bootstrap phase.
+      $args = isset($_GET['q']) ? explode('/', $_GET['q']) : array();
+      $prefix = $args[0];
+      // Search prefix within enabled languages.
+      foreach ($languages as $option) {
+        if (!empty($option->prefix) && $option->prefix == $prefix) {
+          $_language = $option->language;
+          break;
+        }
+      }
+      break;
+    }
+  }
+  // If any of the above values returned nothing, just assume English.
+  if (empty($_language)) {
+    $_language = 'en';
+  }
+  return $_language;
+}
Index: domain_source/domain_source.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/domain/domain_source/domain_source.module,v
retrieving revision 1.9
diff -u -p -r1.9 domain_source.module
--- domain_source/domain_source.module	25 Jul 2008 17:51:22 -0000	1.9
+++ domain_source/domain_source.module	29 Jul 2008 23:22:08 -0000
@@ -60,7 +60,7 @@ function domain_source_form_alter(&$form
         '#type' => 'select',
         '#title' => t('Source domain'),
         '#options' => $options,
-        '#default_value' => ($form['#node']->domain_source) ? $form['#node']->domain_source : $_domain['domain_id'],
+        '#default_value' => (isset($form['#node']->domain_source)) ? $form['#node']->domain_source : $_domain['domain_id'],
         '#description' => t('This affiliate will be used to write links to this content from other affiliates, as needed.')
       );
     }
