00001 <?php
00011 class I18N
00012 {
00013 var $config_path;
00014 var $language_code;
00015 var $language_name;
00016 var $messages;
00017
00018 function I18N($lang='en')
00019 {
00020 $this->config_path = DIR_FS_APP.DS.'config'.DS.'i18n';
00021 $this->set_language($lang);
00022 }
00023
00024 function get_languages()
00025 {
00026 $cache =& Registry::get('pronto:cache');
00027 $langs =& $cache->get('pronto:i18n_languages');
00028 if(is_array($langs)) return $langs;
00029
00030 $langs = array();
00031 foreach(glob($this->config_path.DS.'*') as $d) {
00032 if(is_dir($d) && file_exists($d.DS.'messages.php')) {
00033 include($d.DS.'messages.php');
00034 $langs[$LANGUAGE_CODE] = $LANGUAGE_NAME;
00035 }
00036 }
00037 $cache->set('pronto:i18n_languages', $langs);
00038 return $langs;
00039 }
00040
00044 function set_language($lang)
00045 {
00046 $old = $this->get_language();
00047 $lang = strtolower($lang);
00048 $this->language_code = $lang;
00049 if(!$this->has_language($lang)) {
00050 $this->messages = array();
00051 return;
00052 }
00053
00054
00055 $cache =& Registry::get('pronto:cache');
00056 $msgs =& Registry::get('pronto:i18n_language_'.$lang);
00057 if(!is_array($msgs)) {
00058 $msgs =& $cache->get('pronto:i18n_language_'.$lang);
00059 }
00060 if(!is_array($msgs)) {
00061 include($this->config_path.DS.$lang.DS.'messages.php');
00062 if(strtolower($LANGUAGE_CODE) != $lang) {
00063 trigger_error("i18n: Language requested does not match i18n messages file.");
00064 }
00065 $msgs = compact('MESSAGES', 'LANGUAGE_NAME', 'LANGUAGE_CODE');
00066 unset($MESSAGES, $LANGUAGE_NAME, $LANGUAGE_CODE);
00067
00068
00069 foreach(explode(' ', MODULES) as $modname) {
00070 $modpath = DIR_FS_APP.DS.'modules'.DS.$modname.DS.'config'.DS.'i18n';
00071 if(file_exists($modpath.DS.$lang.DS.'messages.php')) {
00072 include($modpath.DS.$lang.DS.'messages.php');
00073 if(strtolower($LANGUAGE_CODE) != $lang) {
00074 trigger_error("i18n: Language requested does not match i18n messages file.");
00075 }
00076 $msgs['MESSAGES'] = array_merge($msgs['MESSAGES'], $MESSAGES);
00077 unset($MESSAGES, $LANGUAGE_NAME, $LANGUAGE_CODE);
00078 }
00079 }
00080
00081 Registry::set('pronto:i18n_language_'.$lang, $msgs);
00082 $cache->set('pronto:i18n_language_'.$lang, $msgs);
00083 }
00084
00085 $this->language_name = $msgs['LANGUAGE_NAME'];
00086 $this->messages = $msgs['MESSAGES'];
00087 return $old;
00088 }
00089
00090 function get_language()
00091 {
00092 return $this->language_code;
00093 }
00094
00095 function get_language_name()
00096 {
00097 return $this->language_name;
00098 }
00099
00100 function has_language($lang)
00101 {
00102 if(empty($lang)) return false;
00103 $lang = strtolower($lang);
00104 return file_exists($this->config_path.DS.$lang.DS.'messages.php');
00105 }
00106
00107
00108 function autoset_language($default='en')
00109 {
00110 $lang = $default;
00111 if(isset($_SESSION['LANGUAGE'])) {
00112 $lang = $_SESSION['LANGUAGE'];
00113 } else if(isset($_SESSION['USER']['language'])) {
00114 $lang = $_SESSION['USER']['language'];
00115 } else if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
00116 $langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
00117 foreach($langs as $l) {
00118 $code = str_replace('-', '_', array_shift(explode(';', $l)));
00119 $basecode = array_shift(explode('_', $code));
00120 if($this->has_language($code)) {
00121 $lang = $code;
00122 break;
00123 } else if($code != $basecode && $this->has_language($basecode)) {
00124 $lang = $basecode;
00125 break;
00126 }
00127 }
00128 }
00129 $this->set_language($lang);
00130 }
00131
00132 function msg($msg)
00133 {
00134 $args = func_get_args();
00135 if(isset($this->messages[$msg])) {
00136 $args[0] = $this->messages[$msg];
00137 } else {
00138 $args[0] = $msg;
00139 }
00140 $str = call_user_func_array('sprintf', $args);
00141 return $str;
00142 }
00143 }
00144
00151 function __($msg)
00152 {
00153 $i18n =& Registry::get('pronto:i18n');
00154 $args = func_get_args();
00155 if(is_object($i18n)) {
00156 return call_user_func_array(array(&$i18n,'msg'), $args);
00157 }
00158 return call_user_func_array('sprintf', $args);
00159 }
00160
00167 function _e($msg)
00168 {
00169 $args = func_get_args();
00170 echo call_user_func_array('__', $args);
00171 }
00172
00173 ?>