Repackaging: placed all the files under modules/i18n
authorJose Reyero
Mon, 5 Apr 2004 13:36:48 +0000 (13:36 +0000)
committerJose Reyero
Mon, 5 Apr 2004 13:36:48 +0000 (13:36 +0000)
Added *real* content translation

CREDITS
INSTALL
README
i18n.inc
i18n.module

diff --git a/CREDITS b/CREDITS
index 74098b7..41d60a5 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -4,4 +4,6 @@ Feel free to contact me about it!
 
 My website http://freelance.reyero.net
   
-Flag icons from http://www.clickfire.com/content/graphics/favicons/flags_icons.php (thanx)
+* Flag icons from http://www.clickfire.com/content/graphics/favicons/flags_icons.php (thanx)
+
+** Some code taken from Walkah's translate_node module, from the sandbox.
\ No newline at end of file
diff --git a/INSTALL b/INSTALL
index d63ed68..204c77b 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -7,11 +7,23 @@ Email: drupal at reyero dot net
 
 ********************************************************************
 INSTALLATION:
-1. Copy i18n.module to the modules folder
-2. Copy i18n.inc to the includes folder
-3. Copy the files in flags folder to misc/flags
-4. To use url rewriting, this line should be added to your configuration file:
+1. Create folder 'modules/i18n'
+2. Copy all the modules files, keeping directory structure, to the folder 'modules/i18n/'
+3. To use url rewriting, this line should be added to your configuration file:
 
-include 'includes/i18n.inc'
+include 'modules/i18n/i18n.inc'
+
+4. For content translation, this module can manage language dependent tables. Yo need to:
+<warning> This feature is experimental</warning>
+4.1. Modify $db_prefix in .conf file. This is a sample:
+       
+       $db_prefix=array{
+               'default' => 'prefix_', // The default prefix
+               'node' => 'prefix_**_'  // '**' will be replaced by language code at runtime.
+       }
+       
+4.2. Create table copys for each language: prefix_es_node, prefix_en_node, etc...
+
+*Any* table can be made language dependant. Just think about whether it makes sense. 
+Suggested tables to be made language dependant are node tables, taxonomy tables....
 
-No modification to the database is required
diff --git a/README b/README
index fe69516..f727563 100644 (file)
--- a/README
+++ b/README
@@ -5,7 +5,8 @@ Warning: This is a beta version and all the combinations of the module settings
 This module provides support for internationalization of Drupal sites in various ways:
 
     * Translation of the user interface for registered and anonymous users
-    * Multi-language for content, combined with url aliasing. For this feature to be used, you must enable it in the module configuration and then use url aliasing to keep pages in various languages. I.e. 'en/mypage', 'es/mypage' should be English and Spanish versions of the same page
+    * Basic multi-language using URL Aliasing, combined with url aliasing. See below.
+    * [EXPERIMENTAL, see INSTALL file] Advanced multi-language using duplicated tables. Selected tables will be made language dependent.
     * Detection of the brower language
     * Keeps the language settings accross consecutive requests, using a number of methods: URL rewriting, sessions, cookies
     * Provides a block for language selection and two theme functions: i18n_flags and i18n_links
@@ -21,6 +22,20 @@ To have a language selector on your page, you can use the block provided or thes
  theme("i18n_flags") -> Adds just a row with the flags
  theme("i18n_links",$flags,$names,$delim1,$delim2) -> Check documentation in the code for different options
 
+About Multi-Language:
+  There are currently two options to build multi-language sites:
+  
+  1. With URL aliasing - using path module's Custom URLs and i18n's URL rewriting feature
+  You have to create a Custom URL for each language version of a node:
+    I.e. 'en/mypage', 'es/mypage' should be English and Spanish versions of the same page
+       The link to display this page will be only 'mypage'. The language code will be added automatically.
+
+  2. With duplicated tables [Only in HEAD CVS version of the module]
+    You can keep separated tables -the ones you choose- for each language. You have to create the tables manually and add them to $db_prefix. See INSTALL file.
+    * This feature uses db prefixing (An idea taken from Walkah's translate_node module) to keep separated tables for each language.
+    ** When using language dependent tables other than 'node', some manual synchronization may be needed. 
+       *** Currently, the synchronization between languages is only automatic for the node table.
+
 
 Jose A. Reyero, drupal at reyero dot net
 
index fb08382..c244d0f 100644 (file)
--- a/i18n.inc
+++ b/i18n.inc
@@ -7,7 +7,7 @@
  */
 
 function conf_url_rewrite($path, $mode = 'incoming') {
-               if(variable_get('i18n_keep','')=='url'){
+               if(variable_get('i18n_keep','')=='url' || variable_get('i18n_content',0)){
                         return i18n_url_rewrite($path,$mode);
                } else {
                        return $path;
@@ -44,4 +44,22 @@ function i18n_get_lang_prefix($path){
                return $maybelang;
        }
 }
+
+// This is just an experiment to keep tables in sync. Needs some patching to core.
+function i18n_db_sync($query){
+       global $languages,$locale;
+       global $i18n_db_sync,$db_prefix_i18n_sync;
+       if (preg_match("/^(insert into|delete from)[ ]+\{([\w]+)\}.*/i",$query,$matches) && $db_prefix_i18n_sync[$matches[2]]){
+               debug("SYNC:".$sql);
+               $i18n_db_sync=false;
+               foreach($languages as $lang => $desc){
+                               i18n_set_db_prefix($lang);
+                               $result[$lang]=_db_query(db_prefix($args));
+               }
+               i18n_set_db_prefix($locale);
+               $i18n_db_sync=true;
+       } elseif(preg_match("/^REPLACE INTO \{sequences\}.*/i",$sql)){
+       
+       }
+}
 ?>
\ No newline at end of file
index f76f973..eabbdf3 100644 (file)
@@ -14,7 +14,7 @@
 
 function i18n_init(){
        global $i18n_langpath;
-       
+
        // Quick fix, check if called from bootstrap.inc
        if(!function_exists("drupal_get_path_map")) return 0;
        
@@ -23,21 +23,32 @@ function i18n_init(){
        }else{
        $lang= i18n_get_default_lang();
        }
-       
-  if(variable_get("i18n_interface",0)) i18n_set_default_lang($lang);
   
   if(variable_get("i18n_content",0)){
-       $original=i18n_get_original_path();
+       i18n_set_db_prefix($lang);
+               $original=i18n_get_original_path();
        if(!$i18n_langpath && $trpath=i18n_get_normal_path("$lang/$original")){
                $_GET["q"]=$trpath;
        }elseif(!$original || $i18n_langpath==$original){
                        $_GET["q"]=drupal_get_normal_path(i18n_front_page($lang));
        }
   }
+  
+  if(variable_get("i18n_interface",0)) i18n_set_default_lang($lang);
+
+}
+
+function i18n_set_db_prefix($lang){
+       global $db_prefix,$i18n_db_prefix;
+       if(!$i18n_db_prefix) $i18n_db_prefix=$db_prefix;
+       $db_prefix=str_replace('**',$lang,$db_prefix);
+       //var_dump($db_prefix);
 }
+
 function i18n_front_page($lang){
        return variable_get("i18n_front_page",0) ? $lang.'/'.variable_get('site_frontpage','node') : variable_get('site_frontpage','node');
 }
+
 function i18n_help($section = "admin/help#i18n") {
   switch ($section) {
        case "admin/help#i18n":
@@ -65,6 +76,11 @@ function i18n_help($section = "admin/help#i18n") {
 function i18n_settings(){
        $output .= form_radios(t("Interface translation"),"i18n_interface",variable_get("i18n_interface",0),array(t("Disabled"),t("Enabled")),t("If disabled, uses Drupal's default. If enabled, translates the interface to selected language"));
        $output .= form_radios(t("Content translation"),"i18n_content",variable_get("i18n_content",0),array(t("Disabled"),t("Enabled")),t("If enabled, prepends language code to url and searches for translated content"));
+       $output .= form_group(t("Synchronize content")." <strong>EXPERIMENTAL FEATURE</strong>"
+               ,form_checkbox(t("Nodes"),"i18n_sync_nodes",1,variable_get("i18n_sync_nodes",0))
+               .form_checkbox(t("Taxonomy"),"i18n_sync_taxonomy",1,variable_get("i18n_sync_taxonomy",0))
+               ,t("Synchronize tables for different languages. When some element is created/removed, it will be created/removed for all languages with the same id")
+               );
        $output .= form_select(t("Front page"),"i18n_front_page",variable_get("i18n_front_page",0),array(t("Default"),t("Language dependant")),t("If language dependant and <i>Content translation</i> is enabled, default front page will be prepended with language code, i.e. 'en/node'"));
        $output .=form_radios(t("Keep Language"),"i18n_keep",variable_get("i18n_keep",'url'),
        array(  ""=>t("Disabled"),
@@ -73,7 +89,7 @@ function i18n_settings(){
                                        "cookie" => t("Cookie")
        ),t("A language code independent of user's language will be kept accross requests using the selected method"));
        $output .= form_radios(t("Detect browser language"),"i18n_browser",variable_get("i18n_browser",0),array(t("Disabled"),t("Enabled")));
-       $output .= form_textfield(t("Flags directory"),"i18n_flags",variable_get("i18n_flags","misc/flags/*.gif"),70,180,t("Path for flags. Asterisk '*' is a placeholder for language code. This is only needed when you want a language selector block"));
+       $output .= form_textfield(t("Flags directory"),"i18n_flags",variable_get("i18n_flags","modules/i18n/flags/*.gif"),70,180,t("Path for flags. Asterisk '*' is a placeholder for language code. This is only needed when you want a language selector block"));
 
        return $output;
 }
@@ -243,7 +259,7 @@ function theme_i18n_flags(){
 }
 
 function _i18n_flag($lang,$attribs=array()){
-       if($path=variable_get("i18n_flags","misc/flags/*.gif")){
+       if($path=variable_get("i18n_flags","modules/i18n/flags/*.gif")){
                $flag=str_replace("*",$lang,$path);
                return "<img class=\"i18n\" src=\"$flag\"".drupal_attributes($attribs)." />";
        }
@@ -272,4 +288,62 @@ function i18n_l($text, $lang , $url="",$attributes=array(),$query=NULL) {
        return $result;
 }
 
+
+function i18n_nodeapi(&$node, $op, $arg = 0) {
+  global $languages, $i18n_lang;
+
+       if(variable_get('i18n_sync_nodes',0) && $db_prefix_i18n['node']){
+         switch ($op) {
+         case 'insert':
+           $fields = node_invoke_nodeapi($node, "fields");
+       
+           // Prepare the query:
+           foreach ($node as $key => $value) {
+             if (in_array($key, $fields)) {
+               $k[] = check_query($key);
+               $v[] = $value;
+               $s[] = "'%s'";
+             }
+           }
+       
+           $keysfmt = implode(", ", $s);
+           // need to quote the placeholders for the values
+           $valsfmt = "'". implode("', '", $s) ."'";
+           
+           // Insert copies for each language
+           foreach ($languages as $lang => $desc) {
+             if ($lang != $i18n_lang) {
+               // fake the next id to keep sequences in step
+               $node_table=i18n_get_table('node',$lang);
+               db_next_id($node_table.'_nid');
+               db_query("INSERT INTO $node_table (". implode(", ", $k) .") VALUES(". implode(", ", $s) .")", $v);
+             }
+           }
+           break;
+       
+         case 'delete':
+           foreach ($languages as $lang => $desc) {
+             if ($lang != $i18n_lang) {
+               $node_table=i18n_get_table('node',$lang);
+               db_query("DELETE FROM $node_table WHERE nid='%s'", $node->nid);
+             }
+           }
+         }
+       }
+}
+
+function i18n_get_table($table,$lang){
+       global $i18n_db_prefix;
+       if($db_prefix_i18n[$table]) {
+               return str_replace('**',$lang,$db_prefix_i18n[$table]).$table;
+       } elseif(is_array($db_prefix_i18n)){
+               return str_replace('**',$lang,$db_prefix_i18n['default']).$table;
+       } elseif(is_string($db_prefix_i18n)){
+               return str_replace('**',$lang,$db_prefix_i18n).$table;
+       } else {
+               return $table;
+       }
+}
+
+
 ?>
\ No newline at end of file