1 <?php
2 /**
3  * pfci18n.class.php
4  *
5  * Copyright � 2006 Stephane Gully <stephane.gully@gmail.com>
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the
19  * Free Software Foundation, 51 Franklin St, Fifth Floor,
20  * Boston, MA  02110-1301  USA
21  */
22 
23 require_once(dirname(__FILE__)."/pfctools.php");
24 
25 function _pfc()
26 {
27   $args = func_get_args();
28   $serverid = isset($GLOBALS['serverid']) ? $GLOBALS['serverid'] : 0; // serverid is used to avoid conflicts with external code using same 'i18n' key
29   $args[0] = isset($GLOBALS[$serverid]["i18n"][$args[0]]) && $GLOBALS[$serverid]["i18n"][$args[0]] != "" ?
30     ($GLOBALS["output_encoding"] == "UTF-8" ?
31        $GLOBALS[$serverid]["i18n"][$args[0]] :
32        iconv("UTF-8", $GLOBALS["output_encoding"], $GLOBALS[$serverid]["i18n"][$args[0]])) :
33     "_".$args[0]."_";
34   return call_user_func_array('sprintf', $args);
35 }
36 /**
37  * Just like _pfc but just return the raw translated string, keeping the %s into it
38  * (used by the javascript resources (i18n) class)
39  */
40 function _pfc2()
41 {
42   $args = func_get_args();
43   $serverid = isset($GLOBALS['serverid']) ? $GLOBALS['serverid'] : 0; // serverid is used to avoid conflicts with external code using same 'i18n' key
44   $args[0] = isset($GLOBALS[$serverid]["i18n"][$args[0]]) && $GLOBALS[$serverid]["i18n"][$args[0]] != "" ?
45     ($GLOBALS["output_encoding"] == "UTF-8" ?
46        $GLOBALS[$serverid]["i18n"][$args[0]] :
47        iconv("UTF-8", $GLOBALS["output_encoding"], $GLOBALS[$serverid]["i18n"][$args[0]])) :
48     "_".$args[0]."_";
49   return $args[0];
50 }
51 
52 class pfcI18N
53 {
54   function Init($language,$type="main")
55   {
56     if ($type=="admin")
57       if (!in_array($language, pfcI18N::GetAcceptedLanguage("admin")))
58         $language = pfcI18N::GetDefaultLanguage();
59     if (!in_array($language, pfcI18N::GetAcceptedLanguage()))
60       $language = pfcI18N::GetDefaultLanguage();
61 
62     if ($type=="admin")
63       require_once(dirname(__FILE__)."/../i18n/".$language."/admin.php");
64     else
65       require_once(dirname(__FILE__)."/../i18n/".$language."/main.php");
66 
67     $serverid = isset($GLOBALS['serverid']) ? $GLOBALS['serverid'] : 0; // serverid is used to avoid conflicts with external code using same 'i18n' key
68     $GLOBALS[$serverid]['i18n'] = $GLOBALS['i18n']; // do not pass by reference because $GLOBALS['i18n'] is maybe used by unknown external code
69 
70     $GLOBALS["output_encoding"] = "UTF-8"; // by default client/server communication is utf8 encoded
71   }
72 
73   /**
74    * Switch output encoding in order to write the right characteres in the web page
75    */
76   function SwitchOutputEncoding($oe = "")
77   {
78     if ($oe == "")
79     {
80       $GLOBALS["output_encoding"]     = $GLOBALS["old_output_encoding"];
81       unset($GLOBALS["old_output_encoding"]);
82     }
83     else
84     {
85       if (isset($GLOBALS["old_output_encoding"]))
86         die("old_output_encoding must be empty (".$GLOBALS["old_output_encoding"].")");
87       $GLOBALS["old_output_encoding"] = $GLOBALS["output_encoding"];
88       $GLOBALS["output_encoding"]     = $oe;
89     }
90   }
91 
92   /**
93    * Return the default language : "en"
94    */
95   function GetDefaultLanguage()
96   {
97     return "en_US";
98   }
99 
100   /**
101    * Return the language list supported bye i18n system
102    * (content of the i18n directory)
103    */
104   function GetAcceptedLanguage($type="main")
105   {
106     return /*<GetAcceptedLanguage>*/array('nl_NL','ko_KR','nl_BE','tr_TR','pt_PT','en_US','eo','hr_HR','vi_VN','es_ES','zh_TW','nn_NO','ru_RU','id_ID','hu_HU','th_TH','hy_AM','oc_FR','da_DK','de_DE-formal','uk_RO','nb_NO','fr_FR','it_IT','sv_SE','uk_UA','sr_CS','ar_LB','bg_BG','pt_BR','ba_BA','bn_BD','el_GR','zh_CN','gl_ES','pl_PL','de_DE-informal','ja_JP');/*</GetAcceptedLanguage>*/
107   }
108 
109   /**
110    * Parse the source-code and update the i18n ressources files
111    */
112   function UpdateMessageRessources()
113   {
114     // first of all, update the GetAcceptedLanguage list
115     $i18n_basepath = dirname(__FILE__).'/../i18n';
116     $i18n_accepted_lang = array();
117     $dh = opendir($i18n_basepath);
118     while (false !== ($file = readdir($dh)))
119     {
120       // skip . and .. generic files, skip also .svn directory
121       if ($file == "." || $file == ".." || strpos($file,".")===0) continue;
122       if (file_exists($i18n_basepath.'/'.$file.'/main.php')) $i18n_accepted_lang[] = $file;
123     }
124     closedir($dh);
125     $i18n_accepted_lang_str = "array('" . implode("','", $i18n_accepted_lang) . "');";
126     $data = file_get_contents_flock(__FILE__);
127     $data = preg_replace("/(\/\*<GetAcceptedLanguage>\*\/)(.*)(\/\*<\/GetAcceptedLanguage>\*\/)/",
128                          "$1".$i18n_accepted_lang_str."$3",
129                          $data);
130     file_put_contents(__FILE__, $data, LOCK_EX);
131 
132     // Now scan the source code in order to find "_pfc" patterns
133     $files = array();
134     $files = array_merge($files, glob(dirname(__FILE__)."/*.php"));
135     $files = array_merge($files, glob(dirname(__FILE__)."/commands/*.php"));
136     $files = array_merge($files, glob(dirname(__FILE__)."/containers/*.php"));
137     $files = array_merge($files, glob(dirname(__FILE__)."/proxies/*.php"));
138     $files = array_merge($files, glob(dirname(__FILE__)."/client/*.php"));
139     $files = array_merge($files, glob(dirname(__FILE__)."/../themes/default/*.php"));
140     $res = array();
141     foreach ( $files as $src_filename )
142     {
143       $lines = file($src_filename);
144       $line_nb = 1;
145       foreach( $lines as $l)
146       {
147         // the labels server side
148         if( preg_match_all('/_pfc\("([^\"]+)"/', $l, $matches) )
149         {
150           foreach($matches[1] as $label)
151           {
152             echo "line: ".$line_nb."\t- ".$label."\n";
153             $res[$label] = "// line ".$line_nb." in ".basename($src_filename);
154           }
155         }
156         // the labels client side (JS)
157         if( preg_match_all('/"([^"]*)",\s\/\/\s_pfc/', $l, $matches) )
158         {
159           echo "line: ".$line_nb."\t- ".$matches[1][0]."\n";
160           $res[$matches[1][0]] = "// line ".$line_nb." in ".basename($src_filename);
161         }
162         $line_nb++;
163       }
164     }
165 
166     $dst_filenames = array();
167     foreach($i18n_accepted_lang as $lg)
168       $dst_filenames[] = dirname(__FILE__)."/../i18n/".$lg."/main.php";
169 
170     foreach( $dst_filenames as $dst_filename )
171     {
172       // filter lines to keep, line to add
173       $old_content = file_get_contents_flock($dst_filename);
174       // remove php tags to keep only real content
175       $old_content = preg_replace("/^\<\?php/", "", $old_content);
176       $old_content = preg_replace("/\?\>$/", "", $old_content);
177 
178       // save into the file
179       $new_content = "";
180       foreach($res as $str => $com)
181       {
182         //echo "com=".$com."\n";
183         //echo "str=".$str."\n";
184         if (preg_match("/".preg_quote($str,'/')."/", $old_content) == 0)
185           $new_content .= $com."\n\$GLOBALS[\"i18n\"][\"".$str."\"] = \"\";\n\n";
186       }
187       $content = "<?php" . $old_content . $new_content . "?>";
188       //echo $content;
189 
190       file_put_contents($dst_filename, $content, LOCK_EX);
191     }
192   }
193 }
194 
195 ?>
196