Revision 1864
Added by darkviper over 12 years ago
| TranslationTable.php | ||
|---|---|---|
| 33 | 33 |
*/ |
| 34 | 34 |
class TranslationTable {
|
| 35 | 35 |
|
| 36 |
private $_aTranslations = array(); |
|
| 37 |
private $_sSystemLang = 'en'; |
|
| 38 |
private $_sDefaultLang = 'en'; |
|
| 39 |
private $_sUserLang = 'en'; |
|
| 40 |
private $_sAddon = ''; |
|
| 41 |
|
|
| 36 |
protected $aTranslations = array(); |
|
| 37 |
protected $aLanguages = array(); |
|
| 38 |
protected $sSystemLang = 'en'; |
|
| 39 |
protected $sDefaultLang = 'en'; |
|
| 40 |
protected $sUserLang = 'en'; |
|
| 41 |
protected $sAddon = ''; |
|
| 42 |
protected $oReg = null; |
|
| 43 |
protected $sTempPath = ''; |
|
| 44 |
protected $iDirMode = 0777; |
|
| 42 | 45 |
/** |
| 43 | 46 |
* Constructor |
| 44 | 47 |
* @param string relative pathname of the Addon (i.e. '' || 'modules/myAddon/') |
| 45 |
* @param string Default language code ( 2ALPHA[[_2ALPHA]_2*4ALNUM] ) |
|
| 46 |
* @param string User language code ( 2ALPHA[[_2ALPHA]_2*4ALNUM] ) |
|
| 48 |
* @param string System language code ( 2*3ALPHA[[_2ALPHA]_2*4ALNUM] ) |
|
| 49 |
* @param string Default language code ( 2*3ALPHA[[_2ALPHA]_2*4ALNUM] ) |
|
| 50 |
* @param string User language code ( 2*3ALPHA[[_2ALPHA]_2*4ALNUM] ) |
|
| 47 | 51 |
*/ |
| 48 |
public function __construct($sAddon, $sDefaultLanguage, $sUserLanguage = '') |
|
| 52 |
public function __construct($sAddon, |
|
| 53 |
$sSystemLanguage, $sDefaultLanguage, $sUserLanguage, |
|
| 54 |
$bUseCache = Translate::CACHE_ENABLED) |
|
| 49 | 55 |
{
|
| 50 |
$this->_sDefaultLang = $sDefaultLanguage; |
|
| 51 |
$this->_sUserLang = ($sUserLanguage == '' ? $sDefaultLanguage : $sUserLanguage); |
|
| 52 |
$this->_sAddon = $sAddon; |
|
| 56 |
$this->bUseCache = $bUseCache; |
|
| 57 |
$this->sSystemLang = $sSystemLanguage; |
|
| 58 |
$this->sDefaultLang = $sDefaultLanguage; |
|
| 59 |
$this->sUserLang = $sUserLanguage; |
|
| 60 |
$this->sAddon = $sAddon; |
|
| 61 |
if(class_exists('WbAdaptor')) {
|
|
| 62 |
$this->sTempPath = WbAdaptor::getInstance()->TempPath; |
|
| 63 |
$this->iDirMode = WbAdaptor::getInstance()->OctalDirMode; |
|
| 64 |
}else {
|
|
| 65 |
$this->sTempPath = dirname(dirname(__FILE__)).'/temp/'; |
|
| 66 |
} |
|
| 67 |
$this->aLanguages['system'] = array(); |
|
| 68 |
$this->aLanguages['default'] = array(); |
|
| 69 |
$this->aLanguages['user'] = array(); |
|
| 53 | 70 |
} |
| 54 | 71 |
/** |
| 55 | 72 |
* Load language definitions |
| ... | ... | |
| 58 | 75 |
*/ |
| 59 | 76 |
public function load($sAdaptor) |
| 60 | 77 |
{
|
| 61 |
$c = 'TranslateAdaptor'.$sAdaptor; |
|
| 62 |
$oTmp = new $c($this->_sAddon); |
|
| 63 |
// load default language first |
|
| 64 |
if( ($aResult = $oTmp->loadLanguage($this->_sDefaultLang)) !== false ) {
|
|
| 65 |
$this->_aTranslations = $aResult; |
|
| 66 |
} |
|
| 67 |
if($this->_sUserLang != $this->_sDefaultLang) {
|
|
| 68 |
// load user language if its not equal default language |
|
| 69 |
if( ($aResult = $oTmp->loadLanguage($this->_sUserLang)) !== false ) {
|
|
| 70 |
$this->_aTranslations = array_merge($this->_aTranslations, $aResult); |
|
| 78 |
$sCachePath = $this->getCachePath(); |
|
| 79 |
$sCacheFile = $sCachePath.md5($this->sAddon.$this->sSystemLang. |
|
| 80 |
$this->sDefaultLang.$this->sUserLang).'.php'; |
|
| 81 |
if($this->bUseCache && is_readable($sCacheFile)) {
|
|
| 82 |
$this->aTranslations = $this->loadCacheFile($sCacheFile); |
|
| 83 |
}else {
|
|
| 84 |
$bLanguageFound = false; |
|
| 85 |
$oAdaptor= new $sAdaptor($this->sAddon); |
|
| 86 |
if(!$oAdaptor instanceof TranslatorAdaptorInterface) {
|
|
| 87 |
$sMsg = 'Class ['.$sAdaptor.'] does not implement the ' |
|
| 88 |
. 'interface [TranslateAdaptorInterface]'; |
|
| 89 |
throw new TranslationException($sMsg); |
|
| 71 | 90 |
} |
| 72 |
} |
|
| 73 |
if(($this->_sSystemLang != $this->_sUserLang) && |
|
| 74 |
($this->_sSystemLang != $this->_sDefaultLang)) {
|
|
| 75 |
// load system language if its not already loaded |
|
| 76 |
if( ($aResult = $oTmp->loadLanguage($this->_sSystemLang)) !== false ) {
|
|
| 77 |
$this->_aTranslations = array_merge($this->_aTranslations, $aResult); |
|
| 91 |
// load system language first |
|
| 92 |
if(($aResult = $this->loadLanguageSegments($this->sSystemLang, $oAdaptor)) !== false) {
|
|
| 93 |
// load system language |
|
| 94 |
$this->aLanguages['system'] = $aResult; |
|
| 95 |
$bLanguageFound = true; |
|
| 78 | 96 |
} |
| 79 |
} |
|
| 80 |
if(sizeof($this->_aTranslations) == 0) {
|
|
| 81 |
// if absolutely no requested language found, simply get the first available |
|
| 82 |
$sFirstLanguage = $oTmp->findFirstLanguage(); |
|
| 83 |
// load first found language if its not already loaded |
|
| 84 |
if( ($aResult = $oTmp->loadLanguage($sFirstLanguage)) !== false ) {
|
|
| 85 |
$this->_aTranslations = array_merge($this->_aTranslations, $aResult); |
|
| 97 |
if($this->sDefaultLang != $this->sSystemLang) {
|
|
| 98 |
// load default language if it's not equal system language |
|
| 99 |
if(($aResult = $this->loadLanguageSegments($this->sDefaultLang, $oAdaptor)) !== false) {
|
|
| 100 |
$this->aLanguages['default'] = $aResult; |
|
| 101 |
$bLanguageFound = true; |
|
| 102 |
} |
|
| 103 |
}else {
|
|
| 104 |
// copy system language |
|
| 105 |
$this->aLanguages['default'] = $this->aLanguages['system']; |
|
| 86 | 106 |
} |
| 107 |
if($this->sUserLang != $this->sDefaultLang |
|
| 108 |
&& $this->sUserLang != $this->sSystemLang) {
|
|
| 109 |
// load user language if it's not equal default language or system language |
|
| 110 |
if(($aResult = $this->loadLanguageSegments($this->sUserLang, $oAdaptor)) !== false) {
|
|
| 111 |
$this->aLanguages['user'] = $aResult; |
|
| 112 |
$bLanguageFound = true; |
|
| 113 |
} |
|
| 114 |
}elseif($this->sUserLang == $this->sDefaultLang) {
|
|
| 115 |
// copy default language |
|
| 116 |
$this->aLanguages['user'] = $this->aLanguages['default']; |
|
| 117 |
}elseif($this->sUserLang == $this->sSystemLang) {
|
|
| 118 |
// copy system language |
|
| 119 |
$this->aLanguages['user'] = $this->aLanguages['system']; |
|
| 120 |
} |
|
| 121 |
if($bLanguageFound) {
|
|
| 122 |
// copy user into default if default is missing |
|
| 123 |
if(sizeof($this->aLanguages['user']) && !sizeof($this->aLanguages['default'])) {
|
|
| 124 |
$this->aLanguages['default'] = $this->aLanguages['user']; |
|
| 125 |
} |
|
| 126 |
// copy default into system if system is missing |
|
| 127 |
if(sizeof($this->aLanguages['default']) && !sizeof($this->aLanguages['system'])) {
|
|
| 128 |
$this->aLanguages['system'] = $this->aLanguages['default']; |
|
| 129 |
} |
|
| 130 |
} |
|
| 131 |
// if absolutely no requested language found, simply get the first available language |
|
| 132 |
if(!$bLanguageFound) {
|
|
| 133 |
$sFirstLanguage = $oAdaptor->findFirstLanguage(); |
|
| 134 |
// load first found language if its not already loaded |
|
| 135 |
if(($aResult = $this->loadLanguageSegments($sFirstLanguage, $oAdaptor)) !== false) {
|
|
| 136 |
$this->aLanguages['system'] = $aResult; |
|
| 137 |
$bLanguageFound = true; |
|
| 138 |
} |
|
| 139 |
} |
|
| 140 |
if($bLanguageFound) {
|
|
| 141 |
$this->aTranslations = array_merge($this->aTranslations, |
|
| 142 |
$this->aLanguages['system'], |
|
| 143 |
$this->aLanguages['default'], |
|
| 144 |
$this->aLanguages['user']); |
|
| 145 |
if($this->bUseCache) {
|
|
| 146 |
$this->writeCacheFile($sCacheFile); |
|
| 147 |
} |
|
| 148 |
} |
|
| 87 | 149 |
} |
| 88 | 150 |
return $this; |
| 89 | 151 |
} |
| ... | ... | |
| 94 | 156 |
*/ |
| 95 | 157 |
public function __isset($sKey) |
| 96 | 158 |
{
|
| 97 |
return isset($this->_aTranslations[$sKey]);
|
|
| 159 |
return isset($this->aTranslations[$sKey]); |
|
| 98 | 160 |
} |
| 99 | 161 |
/** |
| 100 | 162 |
* Get translation text |
| ... | ... | |
| 103 | 165 |
*/ |
| 104 | 166 |
public function __get($sKey) |
| 105 | 167 |
{
|
| 106 |
if(isset($this->_aTranslations[$sKey])) {
|
|
| 107 |
return $this->_aTranslations[$sKey];
|
|
| 168 |
if(isset($this->aTranslations[$sKey])) {
|
|
| 169 |
return $this->aTranslations[$sKey]; |
|
| 108 | 170 |
}else {
|
| 109 | 171 |
return ''; |
| 110 | 172 |
} |
| ... | ... | |
| 116 | 178 |
*/ |
| 117 | 179 |
public function getArray() |
| 118 | 180 |
{
|
| 119 |
return $this->_aTranslations; |
|
| 181 |
$aRetval = (is_array($this->aTranslations) ? $this->aTranslations : array()); |
|
| 182 |
return $aRetval; |
|
| 120 | 183 |
} |
| 184 |
/** |
|
| 185 |
* Load Language |
|
| 186 |
* @param string Language Code |
|
| 187 |
* @param object Adaptor object |
|
| 188 |
* @return bool|array |
|
| 189 |
*/ |
|
| 190 |
protected function loadLanguageSegments($sLangCode, $oAdaptor) |
|
| 191 |
{
|
|
| 192 |
$aTranslations = array(); |
|
| 193 |
// sanitize the language code |
|
| 194 |
$aLangCode = explode('_', preg_replace('/[^a-z0-9]/i', '_', strtolower($sLangCode)));
|
|
| 195 |
$sConcatedLang = ''; |
|
| 196 |
foreach($aLangCode as $sLang) |
|
| 197 |
{ // iterate all segments of the language code
|
|
| 198 |
if( ($aResult = $oAdaptor->loadLanguage($sConcatedLang.$sLang)) !== false ) {
|
|
| 199 |
$aTranslations = array_merge($aTranslations, $aResult); |
|
| 200 |
} |
|
| 201 |
} |
|
| 202 |
return (sizeof($aTranslations) > 0 ? $aTranslations : false); |
|
| 203 |
} |
|
| 204 |
/** |
|
| 205 |
* getCachePath |
|
| 206 |
* @return string a valid path for caching or null on error |
|
| 207 |
*/ |
|
| 208 |
protected function getCachePath() |
|
| 209 |
{
|
|
| 210 |
$sCachePath = $this->sTempPath.__CLASS__.'/cache/'; |
|
| 211 |
if(!file_exists($sCachePath) && is_writeable($this->sTempPath)) {
|
|
| 212 |
$iOldUmask = umask(0); |
|
| 213 |
mkdir($sCachePath, $this->iDirMode, true); |
|
| 214 |
umask($iOldUmask); |
|
| 215 |
} |
|
| 216 |
if(is_writable($sCachePath)) {
|
|
| 217 |
return $sCachePath; |
|
| 218 |
}else {
|
|
| 219 |
return null; |
|
| 220 |
} |
|
| 221 |
} |
|
| 222 |
/** |
|
| 223 |
* load cached translation table |
|
| 224 |
* @param string path/name of the cachefile |
|
| 225 |
* @return array list of translations |
|
| 226 |
*/ |
|
| 227 |
protected function loadCacheFile($sCacheFile) |
|
| 228 |
{
|
|
| 229 |
$aTranslation = array(); |
|
| 230 |
include($sCacheFile); |
|
| 231 |
return $aTranslation; |
|
| 232 |
} |
|
| 233 |
/** |
|
| 234 |
* Write cache from translation |
|
| 235 |
* @param string path/name of the cachefile |
|
| 236 |
*/ |
|
| 237 |
protected function writeCacheFile($sCacheFile) |
|
| 238 |
{
|
|
| 239 |
$sOutput = '<?php'."\n".'/* autogenerated cachefile */'."\n"; |
|
| 240 |
while (list($key, $value) = each($this->aTranslations)) {
|
|
| 241 |
$sOutput .= '$aTranslation[\''.$key.'\'] = \''.addslashes($value).'\';'."\n"; |
|
| 242 |
} |
|
| 243 |
file_put_contents($sCacheFile, $sOutput, LOCK_EX); |
|
| 244 |
} |
|
| 121 | 245 |
} // end of class TranslationTable |
Also available in: Unified diff
update classes Translate, TranslateTable, TranslateAdaptorWbOldStyle
added interface TranslateAdaptorInterface
added Klasse_Translate_de.pdf
update class WbAdaptor
update /framework/initialize.php