00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 include_once( 'kernel/classes/ezcontentlanguage.php' );
00030
00031 define( 'EZ_ALWAYS_AVAILABLE_STR', 'always-available' );
00032
00033 class eZSerializedObjectNameList
00034 {
00035 function eZSerializedObjectNameList( $serializedNamesString = false )
00036 {
00037 $this->DefaultLanguage = null;
00038
00039 if ( $serializedNamesString )
00040 $this->initFromSerializedList( $serializedNamesString );
00041 }
00042
00043 function initFromSerializedList( $serializedNamesString )
00044 {
00045 $this->HasDirtyData = false;
00046 $this->unserializeNames( $serializedNamesString );
00047 }
00048
00049 function initFromString( $nameString, $languageLocale = false )
00050 {
00051 if ( !$languageLocale )
00052 $languageLocale = $this->defaultLanguageLocale();
00053
00054 $serializedNameList = serialize( array( $languageLocale => $nameString,
00055 EZ_ALWAYS_AVAILABLE_STR => $languageLocale ) );
00056 $this->initFromSerializedList( $serializedNameList );
00057 }
00058
00059 function initDefault()
00060 {
00061 $this->initFromString( '' );
00062 }
00063
00064 function create( $serializedNamesString = false )
00065 {
00066 $object = new eZSerializedObjectNameList( $serializedNamesString );
00067 return $object;
00068 }
00069
00070 function clone()
00071 {
00072 $clone = $this->create();
00073 $clone->copy( $this );
00074 return $clone;
00075 }
00076
00077 function copy( $serializedObjectNameListObject )
00078 {
00079 $serializedObjectNameListObject->setNameList( $this->nameList() );
00080 $serializedObjectNameListObject->setHasDirtyData( $this->hasDirtyData() );
00081 $serializedObjectNameListObject->setDefaultLanguage( $this->defaultLanguage() );
00082 }
00083
00084 function mergeNameList( $inNameList )
00085 {
00086 foreach ( $inNameList as $languageLocale => $name )
00087 $this->setNameByLanguageLocale( $name, $languageLocale );
00088
00089 $this->setHasDirtyData();
00090 }
00091
00092 function serializeNames()
00093 {
00094 return serialize( $this->NameList );
00095 }
00096
00097 function isEmpty()
00098 {
00099 return ( count( $this->NameList ) == 0 );
00100 }
00101
00102 function unserializeNames( $serializedNamesString )
00103 {
00104 $this->NameList = array();
00105 if ( $serializedNamesString )
00106 {
00107 $this->NameList = @unserialize( $serializedNamesString );
00108 if ( $this->NameList === false || !is_array( $this->NameList ) )
00109 $this->NameList = array();
00110 }
00111
00112 $this->setHasDirtyData( false );
00113 }
00114
00115 function alwaysAvailableLanguageID()
00116 {
00117 $languageLocale = $this->alwaysAvailableLanguageLocale();
00118 $languageID = $languageLocale ? eZContentLanguage::idByLocale( $languageLocale ) : false;
00119
00120 return $languageID;
00121 }
00122
00123 function alwaysAvailableLanguageLocale()
00124 {
00125 $languageLocale = isset( $this->NameList[EZ_ALWAYS_AVAILABLE_STR] ) ? $this->NameList[EZ_ALWAYS_AVAILABLE_STR] : false;
00126 return $languageLocale;
00127 }
00128
00129 function alwaysAvailableLanguage()
00130 {
00131 $language = false;
00132 if ( isset( $this->NameList[EZ_ALWAYS_AVAILABLE_STR] ) )
00133 $language = eZContentLanguage::fetchByLocale( $this->NameList[EZ_ALWAYS_AVAILABLE_STR] );
00134
00135 return $language;
00136 }
00137
00138 function languageMask()
00139 {
00140 $mask = 0;
00141 foreach ( $this->NameList as $languageLocale => $name )
00142 {
00143 if ( $languageLocale == EZ_ALWAYS_AVAILABLE_STR )
00144 {
00145 $mask += 1;
00146 }
00147 else
00148 {
00149 $languageID = eZContentLanguage::idByLocale( $languageLocale );
00150 $mask += $languageID;
00151 }
00152 }
00153
00154 return $mask;
00155 }
00156
00157 function name( $languageLocale = false )
00158 {
00159 return ( ( $languageLocale === false ) ? $this->nameByPrioritizedLanguages() : $this->nameByLanguageLocale( $languageLocale ) );
00160 }
00161
00162 function nameByPrioritizedLanguages()
00163 {
00164 $name = $this->alwaysAvailableName();
00165 $languageList = eZContentLanguage::prioritizedLanguages();
00166 foreach ( $languageList as $language )
00167 {
00168 if ( $this->hasNameInLocale( $language->attribute( 'locale' ) ) )
00169 {
00170 $name = $this->nameByLanguageLocale( $language->attribute( 'locale' ) );
00171 break;
00172 }
00173 }
00174
00175 return $name;
00176 }
00177
00178 function nameByLanguageLocale( $languageLocale )
00179 {
00180 $name = '';
00181 if ( $this->hasNameInLocale( $languageLocale ) )
00182 $name = $this->NameList[$languageLocale];
00183
00184 return $name;
00185 }
00186
00187 function alwaysAvailableName()
00188 {
00189 $name = '';
00190 if ( isset( $this->NameList[EZ_ALWAYS_AVAILABLE_STR] ) )
00191 {
00192 $name = $this->nameByLanguageLocale( $this->NameList[EZ_ALWAYS_AVAILABLE_STR] );
00193 }
00194
00195 return $name;
00196 }
00197
00198 function setAlwaysAvailableLanguage( $languageLocale )
00199 {
00200 if ( $languageLocale )
00201 {
00202 $this->NameList[EZ_ALWAYS_AVAILABLE_STR] = $languageLocale;
00203 }
00204 else
00205 {
00206 unset( $this->NameList[EZ_ALWAYS_AVAILABLE_STR] );
00207 }
00208
00209 $this->setHasDirtyData();
00210 }
00211
00212 function updateAlwaysAvailable( $alwaysAvailableLocale = false )
00213 {
00214 if ( !$alwaysAvailableLocale )
00215 $alwaysAvailableLocale = $this->alwaysAvailableLanguageLocale();
00216
00217 if ( !$this->hasNameInLocale( $alwaysAvailableLocale ) )
00218 {
00219 $languageLocaleList = array_keys( $this->nameList() );
00220 $alwaysAvailableLocale = $languageLocaleList[0];
00221 }
00222
00223 $this->setAlwaysAvailableLanguage( $alwaysAvailableLocale );
00224 }
00225
00226 function hasNameInLocale( $languageLocale )
00227 {
00228 $hasName = false;
00229 if ( is_array ( $this->NameList ) )
00230 {
00231 if ( $languageLocale && isset( $this->NameList[$languageLocale] ) )
00232 {
00233 $hasName = true;
00234 }
00235 }
00236 else
00237 {
00238 eZDebug::writeWarning( "Trying to get name for language '$languageLocale' without initialized name list.", 'eZSerializedObjectNameList::hasNameInLocale' );
00239 }
00240
00241 return $hasName;
00242 }
00243
00244 function setName( $name, $languageLocale = false )
00245 {
00246 if ( !$languageLocale )
00247 $languageLocale = $this->topPriorityLanguageLocale();
00248
00249 $this->setNameByLanguageLocale( $name, $languageLocale );
00250 }
00251
00252 function setNameByLanguageLocale( $name, $languageLocale )
00253 {
00254 if ( is_array( $this->NameList ) )
00255 {
00256 if ( $languageLocale )
00257 {
00258 $this->NameList[$languageLocale] = $name;
00259 $this->setHasDirtyData();
00260 }
00261 else
00262 {
00263 eZDebug::writeWarning( "Language locale is not specified while setting name '$name'", 'eZSerializedObjectNameList::setNameByLanguageLocale' );
00264 }
00265 }
00266 else
00267 {
00268 eZDebug::writeWarning( "Trying to set name '$name' for language '$languageLocale' without initialized name list.", 'eZSerializedObjectNameList::setNameByLanguageLocale' );
00269 }
00270 }
00271
00272
00273
00274
00275 function appendGroupName( $appendString )
00276 {
00277 foreach ( array_keys( $this->NameList ) as $languageLocale )
00278 {
00279 if ( $languageLocale != EZ_ALWAYS_AVAILABLE_STR )
00280 $this->NameList[$languageLocale] .= $appendString;
00281 }
00282 }
00283
00284
00285
00286
00287 function nameFromSerializedString( $serializedNames, $languageLocale = false )
00288 {
00289 $nameList = new eZSerializedObjectNameList( $serializedNames );
00290 return $nameList->name( $languageLocale );
00291 }
00292
00293
00294
00295
00296
00297 function hasDirtyData()
00298 {
00299 return $this->HasDirtyData;
00300 }
00301
00302
00303
00304
00305
00306 function setHasDirtyData( $hasDirtyData = true )
00307 {
00308 $this->HasDirtyData = $hasDirtyData;
00309 }
00310
00311 function nameList()
00312 {
00313 return $this->NameList;
00314 }
00315
00316 function nameListCount()
00317 {
00318 return count( $this->nameList );
00319 }
00320
00321 function setNameList( $nameListArray )
00322 {
00323 $this->NameList = $nameListArray;
00324 }
00325
00326 function resetNameList()
00327 {
00328 $this->setNameList( array() );
00329 }
00330
00331 function removeName( $languageLocale )
00332 {
00333 if ( isset( $this->NameList[$languageLocale] ) )
00334 {
00335 unset( $this->NameList[$languageLocale] );
00336 $this->setHasDirtyData();
00337 }
00338 }
00339
00340
00341
00342 function defaultLanguageLocale()
00343 {
00344 $languageLocale = false;
00345 $language = $this->defaultLanguage();
00346
00347 if ( is_object( $language ) )
00348 $languageLocale = $language->attribute( 'locale' );
00349
00350 return $languageLocale;
00351 }
00352
00353
00354
00355 function defaultLanguage()
00356 {
00357 if ( !is_object( $this->DefaultLanguage ) )
00358 {
00359 $this->DefaultLanguage = eZContentLanguage::topPriorityLanguage();
00360 }
00361
00362 return $this->DefaultLanguage;
00363 }
00364
00365 function setDefaultLanguage( $language )
00366 {
00367 $this->DefualtLanguage = $language;
00368 }
00369
00370 function setDefaultLanguageByLocale( $languageLocale, $createIfNotExist = true )
00371 {
00372 $language = eZContentLanguage::fetchByLocale( $languageLocale, $createIfNotExist );
00373
00374 if ( is_object( $language ) )
00375 {
00376 $this->setDefaultLanguage( $language );
00377 }
00378 else
00379 {
00380 eZDebug::writeWarning( "Can't set '$languageLocale' as default language. '$languageLocale' language doesn't exist in system", "eZSerializedObjectNameList::setDefaultLanguageByLocale" );
00381 }
00382
00383 return $language;
00384 }
00385
00386
00387
00388
00389
00390
00391 function topPriorityLanguageLocale()
00392 {
00393 $languageLocale = false;
00394
00395 $language = $this->topPriorityLanguage();
00396 if ( $language )
00397 $languageLocale = $language->attribute( 'locale' );
00398
00399 return $languageLocale;
00400 }
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410 function topPriorityLanguage()
00411 {
00412 $language = false;
00413
00414 $languageLocaleList = $this->languageLocaleList();
00415
00416 $language = eZContentLanguage::topPriorityLanguageByLocaleList( $languageLocaleList );
00417
00418 if ( !$language )
00419 $language = $this->alwaysAvailableLanguage();
00420
00421 return $language;
00422 }
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432 function prioritizedLanguages()
00433 {
00434 $languageLocaleList = $this->languageLocaleList();
00435 $languages = eZContentLanguage::prioritizedLanguagesByLocaleList( $languageLocaleList );
00436
00437 $alwaysAvailableLanguage = $this->alwaysAvailableLanguage();
00438 if ( $alwaysAvailableLanguage )
00439 {
00440 $alwaysAvailableLanguageLocale = $alwaysAvailableLanguage->attribute( 'locale' );
00441 if ( !isset( $languages[$alwaysAvailableLanguageLocale] ) )
00442 {
00443 $languages[$alwaysAvailableLanguageLocale] = $alwaysAvailableLanguage;
00444 }
00445 }
00446
00447 return $languages;
00448 }
00449
00450 function prioritizedLanguagesJsArray()
00451 {
00452 $languages = $this->prioritizedLanguages();
00453
00454 $jsArray = array();
00455
00456 foreach ( $languages as $key => $language )
00457 {
00458 $jsArray[] = "{ locale: '".$language->attribute( 'locale' ).
00459 "', name: '".$language->attribute( 'name' )."' }";
00460 }
00461
00462 if ( count( $jsArray ) > 0 )
00463 {
00464 $jsArray = '[ '.implode( ', ', $jsArray ).' ]';
00465 }
00466
00467 return $jsArray;
00468 }
00469
00470 function languageLocaleList()
00471 {
00472 $languageLocaleList = array();
00473
00474 if ( is_array( $this->NameList ) && count( $this->NameList ) > 0 )
00475 {
00476 foreach ( array_keys( $this->NameList ) as $languageLocale )
00477 {
00478 if ( $languageLocale != EZ_ALWAYS_AVAILABLE_STR )
00479 $languageLocaleList[] = $languageLocale;
00480 }
00481 }
00482
00483 return $languageLocaleList;
00484 }
00485
00486
00487
00488
00489
00490
00491 function languages()
00492 {
00493 $languages = array();
00494
00495 $languageLocaleList = $this->languageLocaleList();
00496 foreach( $languageLocaleList as $languageLocale )
00497 $languages[$languageLocale] = eZContentLanguage::fetchByLocale( $languageLocale );
00498
00499 return $languages;
00500 }
00501
00502
00503
00504
00505
00506
00507 function untranslatedLanguages()
00508 {
00509 $availableLanguages = $this->prioritizedLanguages();
00510 $availableLanguagesCodes = array_keys( $availableLanguages );
00511
00512 $languages = array();
00513 foreach ( eZContentLanguage::prioritizedLanguages() as $language )
00514 {
00515 $languageCode = $language->attribute( 'locale' );
00516 if ( !in_array( $languageCode, $availableLanguagesCodes ) )
00517 {
00518 $languages[$languageCode] = $language;
00519 }
00520 }
00521
00522 return $languages;
00523 }
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534 function normalize( $languageInfo )
00535 {
00536 if ( is_array( $languageInfo ) && isset( $languageInfo['map_table'] ) )
00537 {
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547 $nameList = $this->clone();
00548 $this->resetNameList();
00549
00550 foreach ( $languageInfo['map_table'] as $fromLanguageLocale => $toLanguageLocale )
00551 {
00552 $name = $nameList->nameByLanguageLocale( $fromLanguageLocale );
00553
00554 if ( $tolanguageLocale == 'skip_language' )
00555 {
00556
00557 }
00558 else
00559 {
00560 $this->setNameByLanguageLocale( $name, $toLanguageLocale );
00561 }
00562
00563
00564 $nameList->removeName( $fromLanguageLocale );
00565 }
00566
00567
00568 $this->mergeNameList( $nameList );
00569
00570
00571 $this->updateAlwaysAvailable();
00572 }
00573 }
00574
00575
00576
00577
00578 function validate( $createLanguageIfNotExist = true )
00579 {
00580 $nameList = $this->nameList();
00581 foreach ( $nameList as $languageLocale => $name )
00582 {
00583 if ( $languageLocale != EZ_ALWAYS_AVAILABLE_STR )
00584 {
00585 $language = eZContentLanguage::fetchByLocale( $languageLocale, $createLanguageIfNotExist );
00586 if ( !is_object( $language ) )
00587 {
00588 $this->removeName( $languageLocale );
00589 }
00590 }
00591 }
00592
00593
00594 $this->updateAlwaysAvailable();
00595 }
00596
00597 var $NameList;
00598 var $HasDirtyData;
00599 var $DefaultLanguage;
00600 }
00601
00602 ?>