00001 <?php
00002
00015
00016
00017
00018 class LocaleFile {
00020 var $cache;
00021
00023 var $locale;
00024
00026 var $filename;
00027
00033 function LocaleFile($locale, $filename) {
00034 $this->locale = $locale;
00035 $this->filename = $filename;
00036 }
00037
00041 function &_getCache($locale) {
00042 if (!isset($this->cache)) {
00043 import('cache.CacheManager');
00044 $cacheManager =& CacheManager::getManager();
00045 $this->cache = $cacheManager->getCache(
00046 'locale', md5($this->filename),
00047 array(&$this, '_cacheMiss')
00048 );
00049
00050
00051
00052
00053
00054 $cacheTime = $this->cache->getCacheTime();
00055 if ($cacheTime === null || $cacheTime < filemtime($this->filename)) {
00056
00057 $this->cache->setEntireCache(LocaleFile::load($this->filename));
00058 }
00059 }
00060 return $this->cache;
00061 }
00062
00066 function _cacheMiss(&$cache, $id) {
00067 $cacheType = Config::getVar('cache','cache');
00068
00069 if ($cacheType == 'none') {
00070 $localeData = $this->load($this->filename);
00071 return $localeData[$id];
00072 } else {
00073 return null;
00074 }
00075 }
00076
00080 function getFilename() {
00081 return $this->filename;
00082 }
00083
00093 function translate($key, $params = array(), $locale = null) {
00094 $key = trim($key);
00095 if (empty($key)) {
00096 return '';
00097 }
00098
00099 $cache =& $this->_getCache($this->locale);
00100 $message = $cache->get($key);
00101 if (!isset($message)) {
00102
00103 $message = $this->_cacheMiss($cache, $key);
00104 }
00105
00106 if (isset($message)) {
00107 if (!empty($params)) {
00108
00109 foreach ($params as $key => $value) {
00110 $message = str_replace("{\$$key}", $value, $message);
00111 }
00112 }
00113
00114
00115 if (LOCALE_ENCODING == "iso-8859-1") $message = utf8_decode($message);
00116
00117 return $message;
00118 }
00119 return null;
00120 }
00121
00127 function &load($filename) {
00128 $localeData = array();
00129
00130
00131 $xmlDao = &new XMLDAO();
00132 $data = $xmlDao->parseStruct($filename, array('message'));
00133
00134
00135 if (isset($data['message'])) {
00136 foreach ($data['message'] as $messageData) {
00137 $localeData[$messageData['attributes']['key']] = $messageData['value'];
00138 }
00139 }
00140
00141 return $localeData;
00142 }
00143
00149 function isValid() {
00150 return isset($this->locale) && file_exists($this->filename);
00151 }
00152
00159 function testLocale(&$referenceLocaleFile) {
00160 $errors = array(
00161 LOCALE_ERROR_MISSING_KEY => array(),
00162 LOCALE_ERROR_EXTRA_KEY => array(),
00163 LOCALE_ERROR_SUSPICIOUS_LENGTH => array(),
00164 LOCALE_ERROR_DIFFERING_PARAMS => array(),
00165 LOCALE_ERROR_MISSING_FILE => array()
00166 );
00167
00168 if (!$this->isValid()) {
00169 $errors[LOCALE_ERROR_MISSING_FILE][] = array(
00170 'locale' => $this->locale,
00171 'filename' => $this->filename
00172 );
00173 return $errors;
00174 }
00175
00176 $localeContents = LocaleFile::load($this->filename);
00177 $referenceContents = LocaleFile::load($referenceLocaleFile->filename);
00178
00179 foreach ($referenceContents as $key => $referenceValue) {
00180 if (!isset($localeContents[$key])) {
00181 $errors[LOCALE_ERROR_MISSING_KEY][] = array(
00182 'key' => $key,
00183 'locale' => $this->locale,
00184 'filename' => $this->filename,
00185 'reference' => $referenceValue
00186 );
00187 continue;
00188 }
00189 $value = $localeContents[$key];
00190
00191
00192 if (!Locale::checkLengths($referenceValue, $value)) {
00193 $errors[LOCALE_ERROR_SUSPICIOUS_LENGTH][] = array(
00194 'key' => $key,
00195 'locale' => $this->locale,
00196 'referenceLocale' => $referenceLocaleFile->locale,
00197 'reference' => $referenceValue,
00198 'value' => $value,
00199 'filename' => $this->filename
00200 );
00201 }
00202
00203 $referenceParams = Locale::getParameterNames($referenceValue);
00204 $params = Locale::getParameterNames($value);
00205 if (count(array_diff($referenceParams, $params)) > 0) {
00206 $errors[LOCALE_ERROR_DIFFERING_PARAMS][] = array(
00207 'key' => $key,
00208 'locale' => $this->locale,
00209 'mismatch' => array_diff($referenceParams, $params),
00210 'filename' => $this->filename,
00211 'reference' => $referenceValue,
00212 'value' => $value
00213 );
00214 }
00215
00216
00217
00218 unset($localeContents[$key]);
00219 }
00220
00221
00222 foreach ($localeContents as $key => $value) {
00223 $errors[LOCALE_ERROR_EXTRA_KEY][] = array(
00224 'key' => $key,
00225 'locale' => $this->locale,
00226 'filename' => $this->filename
00227 );
00228 }
00229
00230 return $errors;
00231 }
00232 }
00233
00234 ?>