Index: i18n.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/i18n/i18n.module,v
retrieving revision 1.36.2.16
diff -u -p -r1.36.2.16 i18n.module
--- i18n.module	30 Oct 2007 17:12:35 -0000	1.36.2.16
+++ i18n.module	1 Jan 2008 19:50:51 -0000
@@ -609,6 +609,7 @@ function _i18n_goto($lang){
  * 	off = No language conditions inserted
  * 	simple = Only current language and no language
  * 	mixed = Only current and default languages
+ *      preferred = Current language or else (if available) default language, and no language
  *  strict = Only current language
  *  default = Only default language
  *  user = User defined, in the module's settings page
@@ -639,6 +640,7 @@ function _i18n_selection_mode(){
   return array(
     'simple' => t('Only current language and no language'),
     'mixed' => t('Only current and default languages and no language'),
+    'preferred' => t('Current language or else (if available) default language, and no language'),
     'default' => t('Only default language and no language'),    
     'strict' => t('Only current language'),
     'off' => t('All content. No language conditions apply'),    
@@ -740,8 +742,12 @@ function i18n_db_rewrite_sql($query, $pr
       if (preg_match("/WHERE.*\s$primary_table.nid\s*=\s*(\d|%d)/", $query)) return;
       // If language conditions already there, get out
       if (preg_match("/i18n/", $query)) return;
-      
-      $result['join'] = "LEFT JOIN {i18n_node} i18n ON $primary_table.nid = i18n.nid";
+      if ($mode == 'preferred') {
+        $result['join'] = "LEFT JOIN {i18n_node} i18n ON $primary_table.nid = i18n.nid LEFT JOIN {i18n_node} i18n2 ON i18n.trid = i18n2.trid and i18n2.language = '".i18n_get_lang()."'";
+      }
+      else {
+        $result['join'] = "LEFT JOIN {i18n_node} i18n ON $primary_table.nid = i18n.nid";
+      }
       $result['where'] = i18n_db_rewrite_where('i18n', $mode);
       return $result;
     case 't':
@@ -771,6 +777,13 @@ function i18n_db_rewrite_where($alias, $
       return "$alias.language ='".i18n_get_lang()."' OR $alias.language ='' OR $alias.language IS NULL" ;
     case 'mixed':
       return "$alias.language ='".i18n_get_lang()."' OR $alias.language ='".i18n_default_language()."' OR $alias.language ='' OR $alias.language IS NULL" ;
+    case 'preferred':
+      if ($alias == "i18n"){
+        return "$alias.nid IS NULL OR $alias.language ='".i18n_get_lang()."' OR ($alias.language ='".i18n_default_language()."' AND $alias"."2.nid IS NULL)" ;
+      }
+      else {
+        return "$alias.language ='".i18n_get_lang()."' OR $alias.language ='".i18n_default_language()."' OR $alias.language ='' OR $alias.language IS NULL" ;
+      }
     case 'strict':
       return "$alias.language ='".i18n_get_lang()."'" ;
     case 'node':
