DataObjects/I18n.php
[Pman.Core] / DataObjects / I18n.php
1 <?php
2 /**
3  * Table Definition for i18n
4  *
5  * This is heavily related to the Pman_I18n implementation..
6  *
7  * It should eventually replace most of that..
8  * 
9  */
10 require_once 'DB/DataObject.php';
11
12 class Pman_Core_DataObjects_I18n extends DB_DataObject 
13 {
14     ###START_AUTOCODE
15     /* the code below is auto generated do not remove the above tag */
16
17     public $__table = 'i18n';                            // table name
18     public $id;                              // int(11)  not_null primary_key auto_increment
19     public $ltype;                           // string(1)  not_null multiple_key
20     public $lkey;                            // string(8)  not_null
21     public $inlang;                          // string(8)  not_null
22     public $lval;                            // string(64)  not_null
23
24     
25     /* the code above is auto generated do not remove the tag below */
26     ###END_AUTOCODE
27     
28     // we have a small default set of languages available..
29     // you can modify this by making this setting in the index.php loader.
30     // Pman_Core_i18n = array( 'c' => *, 'l' => '*', 'm' => '*')
31     
32     static $cfg = array(
33         // translated versions availalable
34         
35         't' => array(
36             'en', 'zh_CN',   'zh_HK', 
37         ),
38         // languages available
39         'l' => array(
40             
41             'en', 'zh_CN',   'zh_HK',  'zh_TW', //'th', 'ko', 'ja', 'ms', 
42             //'id', // indonesian
43            // 'tl', // tagalog
44            // 'vi', //vietnamise
45           //  'hi', // hindi
46           //  'ta', // tamil
47           //  '**', // other
48         ),
49         'c' => '*', // array(
50              //'AU', 'CN', 'HK', 'IN', 'ID', 'JP', 'MY', 'NZ', 'TW', 'SG', 'TH', 'KR', 'US', 'PH', 'VN','**'
51         //),
52         'm' => array(
53             'USD', 'HKD', 'GBP', 'CNY', 'SGD', 'JPY'
54         ),
55         'add_l'=> array(), // key -> value additional languages... 
56         'add_c'=> array(), // additional countries...(eg. '-R' => 'Regional' )
57         'add_m'=> array(), // additional currencies...
58
59         
60     );
61     /**
62      * initalizie the cfg aray
63      *
64      */
65     function cfg()
66     {
67         static $loaded  = false;
68         if ($loaded) {
69             return self::$cfg;
70         }
71         $loaded =true;
72         $ff= HTML_FlexyFramework::get();
73          
74         // since our opts array changed alot..
75         $opts = empty($ff->Pman_Core_I18N) ? (empty($ff->Pman_I18N) ? array() : $ff->Pman_I18N)  : $ff->Pman_Core_I18N;
76         
77          
78        //  var_dump($opts);exit;
79         
80         $i = DB_DataObject::Factory('I18n');
81         // load the cofiguration
82         foreach($opts as $k=>$v) {
83             
84             if ($v == '*') { // everything..
85                 self::$cfg[$k] = $i->availableCodes($k, false);
86                 continue;
87             }
88             self::$cfg[$k] = is_array($v) ? $v  : explode(',', $v);
89         }
90         return self::$cfg;
91         
92         
93     }
94     
95     
96       // the default configuration.
97     
98     function applyFilters($q, $au)
99     {
100         $this->buildDB();
101         //DB_DataObject::debugLevel(1);
102         if (!empty($q['query']['_with_en'])) {
103             
104             $this->buildDB(); // ensure we have the full database...
105             
106             $this->selectAdd("
107                 i18n_translate(ltype, lkey, 'en') as lval_en
108                 
109             ");
110         }
111         if (!empty($q['query']['name'])) {
112             //DB_DAtaObject::debugLevel(1);
113             $v = strtoupper($this->escape($q['query']['name']));
114             $this->whereAdd("upper(lval) LIKE '%{$v}%'");
115         }
116         
117         if (!empty($q['_filtered']) && !empty($this->ltype)) {
118             $cfg = $this->cfg();
119             $filter = $cfg[$this->ltype];
120             $this->whereAddIn('lkey', $filter, 'string'); 
121             
122             
123         }
124     }
125     
126     function translate($inlang,$ltype,$kval)
127     {
128         
129         $x = DB_DataObject::factory('i18n');
130         $x->ltype = $ltype;
131         $x->lkey = $kval;
132         $x->inlang= $inlang;
133         $fallback = clone($x);
134         
135         $x->limit(1);
136         if ($x->find(true) && !empty($x->lval)) {
137             return $x->lval;
138         }
139         $fallback->inlang = 'en';
140         if ($fallback->find(true) && !empty($fallback->lval)) {
141            return $fallback->lval;
142         }
143         return $kval;
144     }
145     
146     
147     
148     function toTransList($ltype, $inlang)
149     {
150         
151         
152         $this->ltype = $ltype;
153         $this->inlang= $inlang;
154         $this->selectAdd();
155         $this->selectAdd('lkey as code, lval as title');
156         
157         $this->find();
158         $ret = array();
159         while ($this->fetch()) {
160             $ret[] = array(
161                 'code'  => $this->code,
162                 'title' => $this->title
163             );
164         }
165         return $ret;
166     }
167      
168     
169     
170     
171     // -------------- code to handle importing into database..
172     
173     
174     
175     
176     // returns a list of all countries/languages etc.. (with '*')
177     function availableCodes($t, $filtered = true)
178     {
179         $ret = array();
180         $cfg = $this->cfg();
181
182         switch ($t) {
183             case 'c':
184                 require_once 'I18Nv2/Country.php';
185                 
186                 $c = new I18Nv2_Country('en');
187                 $ret =  array_keys($c->codes);
188                 if (!empty($cfg['add_c'])) {
189                     $ret = array_merge($ret, array_keys($cfg['add_c']));
190                 }
191                 
192                  
193                 
194                 $ret[] = '**';
195                 break;
196             
197             case 'l':
198                 require_once 'I18Nv2/Language.php';
199                 $c = new I18Nv2_Language('en');
200                 $ret =  array_keys($c->codes); // we need to make sure these are lowercase!!!
201                 
202                 
203                 foreach ($cfg['add_l'] as $k=>$v){
204                     // make sure that add_l is formated correctly.. (lower_UPPER?)
205                     $tolang = explode('_', $k);
206                     $tolang[0] = strtolower($tolang[0]);
207                     $tolang = implode('_', $tolang);
208                     
209                     unset($cfg['add_l'][$k]); // if they match..unset first.. then set
210                     
211                     $cfg['add_l'][$tolang] = $v;
212                 }
213                 if (!empty($cfg['add_l'])) {
214                     $ret = array_merge($ret, array_keys($cfg['add_l']));
215                 }
216
217                 $ret[] = '**';
218                 break;
219             case 'm':
220                 require_once 'I18Nv2/Currency.php';
221                 $c = new I18Nv2_Currency('en');
222                 $ret =  array_keys($c->codes);
223                 if (!empty($cfg['add_m'])) {
224                     $ret = array_merge($ret, array_keys($cfg['add_m']));
225                 }
226                 $ret[] = '**';
227                 break;
228         }
229         
230         
231         
232         if ($filtered  && !empty($cfg[$t]) && is_array($cfg[$t])) {
233             // then there is a filter. - we should include all of them, even if they are not relivatn??
234             return $cfg[$t]; //array_intersect($cfg[$t], $ret);
235             
236         }
237         
238         // why upper case everyting?!?!?
239         
240         //foreach ($ret as $k=>$v) {
241         //    $ret[$k] = ($t=='l') ? $ret[$k] : strtoupper($v);
242         //}
243
244         return $ret;
245     }
246     
247     
248     function buildDB($ltype= false, $inlang= false )
249     {
250         $cfg = $this->cfg();
251         
252         //print_r($cfg);
253         if ($ltype === false) {
254             // trigger all builds.
255             //DB_DataObject::debugLevel(1);
256             $this->buildDB('c');
257             $this->buildDB('l');
258             $this->buildDB('m');
259             return;
260         }
261         
262         if ($inlang == '**') {
263             return; // dont bother building generic..
264         }
265         
266         
267         if ($inlang === false) {
268             // do we want to add our 'configured ones..'
269             // We only build translatiosn for our configured ones..
270             //foreach( $this->availableCodes('l') as $l) {
271                 
272             foreach( $cfg['t'] as $l) {
273                 $this->buildDB($ltype, $l);
274             }
275             return;
276         }
277         
278         
279         //DB_DataObject::debugLevel(1);
280         $x = DB_DataObject::factory('I18n');
281         $x->inlang= $inlang;
282         $x->ltype = $ltype;
283         
284         $complete = $x->fetchAll('lkey');
285         
286         $list =  $this->availableCodes($ltype);
287        echo '<PRE>'; print_r($list); 
288         
289         foreach($list as $lkey) {
290             // skip ones we know we have done...
291             if (in_array($lkey, $complete)) {
292                 continue;
293             }
294             if (empty($lkey)) { // not sure why we get empty values here.
295                 continue;
296             }
297             $x = DB_DataObject::factory('I18n');
298             $x->ltype = $ltype;
299             $x->lkey = $lkey;  
300             $x->inlang= $inlang;
301             if ($x->find(true)) {
302                 $xx= clone($x);
303                 $x->lval = $this->defaultTranslate($inlang, $ltype, $lkey);
304                 $x->update($xx);
305                 continue;
306             }
307             $x->lval = $this->defaultTranslate($inlang, $ltype, $lkey);
308             $x->insert();
309             
310         }
311          
312         
313     }
314     
315     /**
316      * default translate  - use i18n classes to provide a value.
317      *
318      * 
319      */
320      
321     function defaultTranslate($lang, $type, $k) 
322     {
323       
324         static $cache;
325         
326         
327         $cfg = $this->cfg();
328         if (empty($k)) {
329             return '??';
330         }
331         
332         //$lbits = explode('_', strtoupper($lang));
333         $lbits = explode('_', $lang);
334         $orig_lang = $lang;
335         $lang = $lbits[0];
336         
337         if (!isset($cache[$lang])) {
338             require_once 'I18Nv2/Country.php';
339             require_once 'I18Nv2/Language.php';
340             require_once 'I18Nv2/Currency.php';
341             $cache[$lang] = array(
342                 'l' =>  new I18Nv2_Language($lang, 'UTF-8'),
343                 'c' => new I18Nv2_Country($lang, 'UTF-8'),
344                 'm' => new I18Nv2_Currency($lang, 'UTF-8')
345             );
346             //echo '<PRE>';print_r(array($lang, $cache[$lang]['c']));
347         }
348         
349         if ($k == '**') {
350             return 'Other / Unknown';
351         }
352         
353         
354         // for languages if we get zh_HK then we write out Chinese ( HK )
355         
356         
357         if ($type == 'l' && strpos($k, '_') > -1) {
358             $tolang = explode('_', $k);
359             $ret = $cache[$lang][$type]->getName(strtolower($tolang[0])) .  '('.$tolang[1].')'; 
360             
361         } else {
362             $ret = $cache[$lang][$type]->getName($k);
363         }
364         
365         if ($orig_lang == 'zh_HK' || $orig_lang == 'zh_TW' ) {
366             // then translation is by default in simplified.
367             //print_r($ret);
368             $ret = @iconv("UTF-8", "GB2312//IGNORE", $ret);
369             //print_r($ret);
370             $ret = @iconv("GB2312", "BIG5//IGNORE", $ret);
371             //print_r($ret);
372             
373             $ret = @iconv("BIG5", "UTF-8//IGNORE", $ret);
374             //print_r($ret);
375          }
376         
377         
378         
379         // our wierd countries/langs etc..
380         if (isset($cfg['add_' . $type][$k])) {
381             return $cfg['add_' . $type][$k];
382             
383         }
384         
385         return $ret;
386         
387         
388     }
389     
390     
391 }