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
00030
00031 include_once( 'kernel/classes/ezpersistentobject.php' );
00032 include_once( 'lib/ezlocale/classes/ezlocale.php' );
00033
00034 define( 'CONTENT_LANGUAGES_MAX_COUNT', 30 );
00035
00036 class eZContentLanguage extends eZPersistentObject
00037 {
00038
00039
00040
00041
00042
00043 function eZContentLanguage( $row = array() )
00044 {
00045 $this->eZPersistentObject( $row );
00046 }
00047
00048
00049
00050
00051 function definition()
00052 {
00053 return array( 'fields' => array( 'id' => array( 'name' => 'ID',
00054 'datatype' => 'integer',
00055 'required' => true ),
00056 'name' => array( 'name' => 'Name',
00057 'datatype' => 'string',
00058 'required' => true ),
00059 'locale' => array( 'name' => 'Locale',
00060 'datatype' => 'string',
00061 'required' => true ),
00062 'disabled' => array( 'name' => 'Disabled',
00063 'datatype' => 'integer',
00064 'default' => 0,
00065 'required' => false ) ),
00066 'keys' => array( 'id' ),
00067 'function_attributes' => array( 'translation' => 'translation',
00068 'locale_object' => 'localeObject',
00069 'class_count' => 'classCount',
00070 'object_count' => 'objectCount' ),
00071 'sort' => array( 'name' => 'asc' ),
00072 'class_name' => 'eZContentLanguage',
00073 'name' => 'ezcontent_language' );
00074 }
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 function addLanguage( $locale, $name = null )
00087 {
00088 $localeObject = eZLocale::instance( $locale );
00089 if ( !$localeObject )
00090 {
00091 eZDebug::writeError( "No such locale $locale!", 'eZContentLanguage::addLanguage' );
00092 return false;
00093 }
00094
00095 if ( $name === null )
00096 {
00097 $name = $localeObject->attribute( 'intl_language_name' );
00098 }
00099
00100 $db =& eZDB::instance();
00101
00102 $languages = eZContentLanguage::fetchList( true );
00103
00104 if ( ( $existingLanguage = eZContentLanguage::fetchByLocale( $locale ) ) )
00105 {
00106 eZDebug::writeWarning( "Language '$locale' already exists!", 'eZContentLanguage::addLanguage' );
00107 return $existingLanguage;
00108 }
00109
00110 if ( count( $languages ) >= CONTENT_LANGUAGES_MAX_COUNT )
00111 {
00112 eZDebug::writeError( 'Too many languages, cannot add more!', 'eZContentLanguage::addLanguage' );
00113 return false;
00114 }
00115
00116 $db->lock( 'ezcontent_language' );
00117
00118 $idSum = 0;
00119 foreach( $languages as $language )
00120 {
00121 $idSum += $language->attribute( 'id' );
00122 }
00123
00124
00125 $candidateId = 2;
00126 while ( $idSum & $candidateId )
00127 {
00128 $candidateId *= 2;
00129 }
00130
00131 $newLanguage = new eZContentLanguage( array(
00132 'id' => $candidateId,
00133 'locale' => $locale,
00134 'name' => $name,
00135 'disabled' => 0 ) );
00136 $newLanguage->store();
00137
00138 $db->unlock();
00139
00140 eZContentLanguage::fetchList( true );
00141
00142
00143 include_once( 'kernel/classes/ezcontentcachemanager.php' );
00144 eZContentCacheManager::clearAllContentCache();
00145
00146 return $newLanguage;
00147 }
00148
00149
00150
00151
00152
00153
00154
00155
00156 function removeLanguage( $id )
00157 {
00158 $language = eZContentLanguage::fetch( $id );
00159 if ( $language )
00160 {
00161 return $language->remove();
00162 }
00163 else
00164 {
00165 return false;
00166 }
00167 }
00168
00169
00170
00171
00172
00173
00174 function remove()
00175 {
00176 if ( ($this->objectCount() > 0) or ($this->classCount() > 0) )
00177 {
00178 return false;
00179 }
00180
00181 eZPersistentObject::remove();
00182
00183 include_once( 'kernel/classes/ezcontentcachemanager.php' );
00184 eZContentCacheManager::clearAllContentCache();
00185
00186 eZContentLanguage::fetchList( true );
00187
00188 return true;
00189 }
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199 function fetchList( $forceReloading = false )
00200 {
00201 if ( !isset( $GLOBALS['eZContentLanguageList'] ) || $forceReloading )
00202 {
00203 $mask = 1;
00204 $languages = eZPersistentObject::fetchObjectList( eZContentLanguage::definition() );
00205
00206 unset( $GLOBALS['eZContentLanguageList'] );
00207 unset( $GLOBALS['eZContentLanguageMask'] );
00208 $GLOBALS['eZContentLanguageList'] = array();
00209 foreach ( $languages as $language )
00210 {
00211 $GLOBALS['eZContentLanguageList'][$language->attribute( 'id' )] = $language;
00212 $mask += $language->attribute( 'id' );
00213 }
00214
00215 $GLOBALS['eZContentLanguageMask'] = $mask;
00216 }
00217
00218 return $GLOBALS['eZContentLanguageList'];
00219 }
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229 function fetchLimitationList( $forceReloading = false )
00230 {
00231 $languages = array();
00232 foreach ( eZContentLanguage::fetchList( $forceReloading ) as $language )
00233 {
00234 $languages[] = array( 'name' => $language->attribute( 'name' ),
00235 'id' => $language->attribute( 'locale' ) );
00236 }
00237 return $languages;
00238 }
00239
00240
00241
00242
00243
00244
00245
00246 function fetchLocaleList()
00247 {
00248 $languages = eZContentLanguage::fetchList();
00249 $localeList = array();
00250
00251 foreach ( $languages as $language )
00252 {
00253 $localeList[] = $language->attribute( 'locale' );
00254 }
00255
00256 return $localeList;
00257 }
00258
00259
00260
00261
00262
00263
00264
00265
00266 function fetch( $id )
00267 {
00268 $languages = eZContentLanguage::fetchList();
00269
00270 return isset( $languages[$id] )? $languages[$id]: false;
00271 }
00272
00273
00274
00275
00276
00277
00278
00279 function fetchByLocale( $locale, $createIfNotExist = false )
00280 {
00281 $languages = eZContentLanguage::fetchList();
00282
00283 foreach ( $languages as $language )
00284 {
00285 if ( $language->attribute( 'locale' ) == $locale )
00286 {
00287 return $language;
00288 }
00289 }
00290
00291 $language = false;
00292 if ( $createIfNotExist )
00293 {
00294 $language = eZContentLanguage::addLanguage( $locale );
00295 }
00296
00297 return $language;
00298 }
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309 function prioritizedLanguages( $languageList = false )
00310 {
00311 if ( !isset( $GLOBALS['eZContentLanguagePrioritizedLanguages'] ) )
00312 {
00313 $GLOBALS['eZContentLanguagePrioritizedLanguages'] = array();
00314
00315 $ini =& eZINI::instance();
00316
00317 $languageListAsParameter = false;
00318 if ( $languageList )
00319 {
00320 $languageListAsParameter = true;
00321 }
00322
00323 if ( !$languageList && $ini->hasVariable( 'RegionalSettings', 'SiteLanguageList' ) )
00324 {
00325 $languageList = $ini->variable( 'RegionalSettings', 'SiteLanguageList' );
00326 }
00327
00328 if ( !$languageList )
00329 {
00330 $languageList = array( $ini->variable( 'RegionalSettings', 'ContentObjectLocale' ) );
00331 }
00332
00333 $processedLocaleCodes = array();
00334 foreach ( $languageList as $localeCode )
00335 {
00336 if ( in_array( $localeCode, $processedLocaleCodes ) )
00337 {
00338 continue;
00339 }
00340 $processedLocaleCodes[] = $localeCode;
00341 $language = eZContentLanguage::fetchByLocale( $localeCode );
00342 if ( $language )
00343 {
00344 $GLOBALS['eZContentLanguagePrioritizedLanguages'][] = $language;
00345 }
00346 else
00347 {
00348 eZDebug::writeWarning( "Language '$localeCode' does not exist or is not used!", 'eZContentLanguage::prioritizedLanguages' );
00349 }
00350 }
00351
00352 if ( ( !$languageListAsParameter && $ini->variable( 'RegionalSettings', 'ShowUntranslatedObjects' ) == 'enabled' ) ||
00353 ( isset( $GLOBALS['eZContentLanguageCronjobMode'] ) && $GLOBALS['eZContentLanguageCronjobMode'] ) )
00354 {
00355 $completeList = eZContentLanguage::fetchList();
00356 foreach ( $completeList as $language )
00357 {
00358 if ( !in_array( $language->attribute( 'locale' ), $languageList ) )
00359 {
00360 $GLOBALS['eZContentLanguagePrioritizedLanguages'][] = $language;
00361 }
00362 }
00363 }
00364 }
00365
00366 return $GLOBALS['eZContentLanguagePrioritizedLanguages'];
00367 }
00368
00369
00370
00371
00372
00373
00374
00375
00376 function prioritizedLanguageCodes()
00377 {
00378 $languages = eZContentLanguage::prioritizedLanguages();
00379 $localeList = array();
00380
00381 foreach ( $languages as $language )
00382 {
00383 $localeList[] = $language->attribute( 'locale' );
00384 }
00385
00386 return $localeList;
00387 }
00388
00389
00390
00391
00392
00393
00394
00395
00396 function setPrioritizedLanguages( $languages )
00397 {
00398 unset( $GLOBALS['eZContentLanguagePrioritizedLanguages'] );
00399 eZContentLanguage::prioritizedLanguages( $languages );
00400 }
00401
00402
00403
00404
00405
00406
00407
00408 function clearPrioritizedLanguages()
00409 {
00410 eZContentLanguage::setPrioritizedLanguages( false );
00411 }
00412
00413
00414
00415
00416
00417
00418
00419 function topPriorityLanguage()
00420 {
00421 $prioritizedLanguages = eZContentLanguage::prioritizedLanguages();
00422 if ( $prioritizedLanguages )
00423 {
00424 return $prioritizedLanguages[0];
00425 }
00426 else
00427 {
00428 return false;
00429 }
00430 }
00431
00432
00433
00434
00435 function &localeObject()
00436 {
00437 include_once( 'lib/ezlocale/classes/ezlocale.php' );
00438
00439 $locale =& eZLocale::instance( $this->Locale );
00440 return $locale;
00441 }
00442
00443
00444
00445
00446
00447
00448
00449 function languagesByMask( $mask )
00450 {
00451 $result = array();
00452
00453 $languages = eZContentLanguage::fetchList();
00454 foreach ( $languages as $key => $language )
00455 {
00456 if ( (int) $key & (int) $mask )
00457 {
00458 $result[$language->attribute( 'locale' )] = $language;
00459 }
00460 }
00461
00462 return $result;
00463 }
00464
00465
00466
00467
00468
00469
00470
00471 function prioritizedLanguagesByMask( $mask )
00472 {
00473 $result = array();
00474
00475 $languages = eZContentLanguage::prioritizedLanguages();
00476 foreach ( $languages as $language )
00477 {
00478 if ( ( (int) $language->attribute( 'id' ) & (int) $mask ) > 0 )
00479 {
00480 $result[$language->attribute( 'locale' )] = $language;
00481 }
00482 }
00483
00484 return $result;
00485 }
00486
00487
00488
00489
00490
00491
00492
00493
00494 function prioritizedLanguagesByLocaleList( $languageLocaleList )
00495 {
00496 $result = array();
00497
00498 if ( is_array( $languageLocaleList ) && count( $languageLocaleList ) > 0 )
00499 {
00500 $languages = eZContentLanguage::prioritizedLanguages();
00501 foreach ( $languages as $language )
00502 {
00503 if ( in_array( $language->attribute( 'locale' ), $languageLocaleList ) )
00504 {
00505 $result[$language->attribute( 'locale' )] = $language;
00506 }
00507 }
00508 }
00509
00510 return $result;
00511 }
00512
00513
00514
00515
00516
00517
00518
00519 function topPriorityLanguageByMask( $mask )
00520 {
00521 $languages = eZContentLanguage::prioritizedLanguages();
00522 foreach ( $languages as $language )
00523 {
00524 if ( ( (int) $language->attribute( 'id' ) & (int) $mask ) > 0 )
00525 {
00526 return $language;
00527 }
00528 }
00529 return false;
00530 }
00531
00532
00533
00534
00535
00536
00537
00538
00539 function topPriorityLanguageByLocaleList( $languageLocaleList )
00540 {
00541 if ( is_array( $languageLocaleList ) && count( $languageLocaleList ) > 0 )
00542 {
00543 $languages = eZContentLanguage::prioritizedLanguages();
00544 foreach ( $languages as $language )
00545 {
00546 if ( in_array( $language->attribute( 'locale' ), $languageLocaleList ) )
00547 {
00548 return $language;
00549 }
00550 }
00551 }
00552
00553 return false;
00554 }
00555
00556
00557
00558
00559
00560
00561
00562
00563 function maskByLocale( $locales, $setZerothBit = false )
00564 {
00565 if ( !$locales )
00566 {
00567 return 0;
00568 }
00569
00570 if ( !is_array( $locales ) )
00571 {
00572 $locales = array( $locales );
00573 }
00574
00575 $mask = 0;
00576 if ( $setZerothBit )
00577 {
00578 $mask = 1;
00579 }
00580
00581 foreach( $locales as $locale )
00582 {
00583 $language = eZContentLanguage::fetchByLocale( $locale );
00584 if ( $language )
00585 {
00586 $mask += $language->attribute( 'id' );
00587 }
00588 }
00589
00590 return (int) $mask;
00591 }
00592
00593
00594
00595
00596
00597
00598
00599
00600 function idByLocale( $locale )
00601 {
00602 $language = eZContentLanguage::fetchByLocale( $locale );
00603 if ( $language )
00604 {
00605 return (int)$language->attribute( 'id' );
00606 }
00607 else
00608 {
00609 return false;
00610 }
00611 }
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622 function languagesSQLFilter( $languageListTable, $languageListAttributeName = 'language_mask' )
00623 {
00624 $prioritizedLanguages = eZContentLanguage::prioritizedLanguages();
00625 $mask = 1;
00626 foreach( $prioritizedLanguages as $language )
00627 {
00628 $mask += $language->attribute( 'id' );
00629 }
00630
00631 $db =& eZDB::instance();
00632 if ( $db->databaseName() == 'oracle' )
00633 {
00634 return "\n bitand( $languageListTable.$languageListAttributeName, $mask ) > 0 \n";
00635 }
00636 else
00637 {
00638 return "\n $languageListTable.$languageListAttributeName & $mask > 0 \n";
00639 }
00640 }
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654 function sqlFilter( $languageTable, $languageListTable = null, $languageAttributeName = 'language_id', $languageListAttributeName = 'language_mask' )
00655 {
00656 $db =& eZDB::instance();
00657
00658 if ( $languageListTable === null )
00659 {
00660 $languageListTable = $languageTable;
00661 }
00662
00663 $prioritizedLanguages = eZContentLanguage::prioritizedLanguages();
00664 if ( $db->databaseName() == 'oracle' )
00665 {
00666 $leftSide = "bitand( $languageListTable.$languageListAttributeName - bitand( $languageListTable.$languageListAttributeName, $languageTable.$languageAttributeName ), 1 )\n";
00667 $rightSide = "bitand( $languageTable.$languageAttributeName, 1 )\n";
00668 }
00669 else
00670 {
00671 $leftSide = " ( ( $languageListTable.$languageListAttributeName - ( $languageListTable.$languageListAttributeName & $languageTable.$languageAttributeName ) ) & 1 )\n";
00672 $rightSide = " ( $languageTable.$languageAttributeName & 1 )\n";
00673 }
00674
00675 for ( $index = count( $prioritizedLanguages ) - 1, $multiplier = 2; $index >= 0; $index--, $multiplier *= 2 )
00676 {
00677 $id = $prioritizedLanguages[$index]->attribute( 'id' );
00678
00679 if ( $db->databaseName() == 'oracle' )
00680 {
00681 $leftSide .= " + bitand( $languageListTable.$languageListAttributeName - bitand( $languageListTable.$languageListAttributeName, $languageTable.$languageAttributeName ), $id )";
00682 $rightSide .= " + bitand( $languageTable.$languageAttributeName, $id )";
00683 }
00684 else
00685 {
00686 $leftSide .= " + ( ( ( $languageListTable.$languageListAttributeName - ( $languageListTable.$languageListAttributeName & $languageTable.$languageAttributeName ) ) & $id )";
00687 $rightSide .= " + ( ( $languageTable.$languageAttributeName & $id )";
00688 }
00689
00690 if ( $multiplier > $id )
00691 {
00692 $factor = $multiplier / $id;
00693 if ( $db->databaseName() == 'oracle' )
00694 {
00695 $factorTerm = ' * ' . $factor;
00696 }
00697 else
00698 {
00699 for ( $shift = 0; $factor > 1; $factor = $factor / 2, $shift++ ) ;
00700 $factorTerm = ' << '. $shift;
00701 }
00702 $leftSide .= $factorTerm;
00703 $rightSide .= $factorTerm;
00704 }
00705 else if ( $multiplier < $id )
00706 {
00707 $factor = $id / $multiplier;
00708 if ( $db->databaseName() == 'oracle' )
00709 {
00710 $factorTerm = ' / ' . $factor;
00711 }
00712 else
00713 {
00714 for ( $shift = 0; $factor > 1; $factor = $factor / 2, $shift++ ) ;
00715 $factorTerm = ' >> '. $shift;
00716 }
00717 $leftSide .= $factorTerm;
00718 $rightSide .= $factorTerm;
00719 }
00720 if ( $db->databaseName() != 'oracle' )
00721 {
00722 $leftSide .= " )\n";
00723 $rightSide .= " )\n";
00724 }
00725 }
00726
00727 if ( $db->databaseName() == 'oracle' )
00728 {
00729 $sql = "bitand( $languageTable.$languageAttributeName, $languageListTable.$languageListAttributeName ) > 0";
00730 }
00731 else
00732 {
00733 $sql = "$languageTable.$languageAttributeName & $languageListTable.$languageListAttributeName > 0";
00734 }
00735
00736 return "\n ( $sql AND\n $leftSide <\n $rightSide ) \n";
00737 }
00738
00739
00740
00741
00742 function &objectCount()
00743 {
00744 $db =& eZDB::instance();
00745
00746 $languageID = $this->ID;
00747 if ( $db->databaseName() == 'oracle' )
00748 {
00749 $whereSQL = "bitand( language_mask, $languageID ) > 0";
00750 }
00751 else
00752 {
00753 $whereSQL = "language_mask & $languageID > 0";
00754 }
00755
00756 $count = $db->arrayQuery( "SELECT COUNT(*) AS count FROM ezcontentobject WHERE $whereSQL" );
00757 $count = $count[0]['count'];
00758
00759 return $count;
00760 }
00761
00762
00763
00764
00765 function &classCount()
00766 {
00767 $db =& eZDB::instance();
00768
00769 $languageID = $this->ID;
00770 if ( $db->databaseName() == 'oracle' )
00771 {
00772 $whereSQL = "bitand( language_mask, $languageID ) > 0";
00773 }
00774 else
00775 {
00776 $whereSQL = "language_mask & $languageID > 0";
00777 }
00778
00779 $count = $db->arrayQuery( "SELECT COUNT(*) AS count FROM ezcontentclass WHERE $whereSQL" );
00780 $count = $count[0]['count'];
00781
00782 return $count;
00783 }
00784
00785
00786
00787
00788
00789 function objectInitialCount()
00790 {
00791 $db =& eZDB::instance();
00792
00793 $languageID = $this->ID;
00794 $count = $db->arrayQuery( "SELECT COUNT(*) AS count FROM ezcontentobject WHERE initial_language_id = '$languageID'" );
00795 $count = $count[0]['count'];
00796
00797 return $count;
00798 }
00799
00800
00801
00802
00803 function &translation()
00804 {
00805 return $this;
00806 }
00807
00808
00809
00810
00811 function updateObjectNames()
00812 {
00813 }
00814
00815
00816
00817
00818
00819
00820
00821 function setCronjobMode( $enable = true )
00822 {
00823 $GLOBALS['eZContentLanguageCronjobMode'] = true;
00824 unset( $GLOBALS['eZContentLanguagePrioritizedLanguages'] );
00825 }
00826
00827
00828
00829
00830
00831
00832 function clearCronjobMode()
00833 {
00834 eZContentLanguage::setCronjobMode( false );
00835 }
00836
00837
00838
00839
00840
00841
00842
00843
00844 function jsArrayByMask( $mask )
00845 {
00846 $jsArray = array();
00847 $languages = eZContentLanguage::prioritizedLanguagesByMask( $mask );
00848 foreach ( $languages as $key => $language )
00849 {
00850 $jsArray[] = "{ locale: '".$language->attribute( 'locale' ).
00851 "', name: '".$language->attribute( 'name' )."' }";
00852 }
00853
00854 if ( $jsArray )
00855 {
00856 return '[ '.implode( ', ', $jsArray ).' ]';
00857 }
00858 else
00859 {
00860 return false;
00861 }
00862 }
00863
00864
00865
00866
00867 function maskForRealLanguages()
00868 {
00869 if ( !isset( $GLOBALS['eZContentLanguageMask'] ) )
00870 {
00871 eZContentLanguage::fetchList( true );
00872 }
00873 return $GLOBALS['eZContentLanguageMask'];
00874 }
00875
00876
00877
00878
00879
00880
00881 function expireCache()
00882 {
00883 unset( $GLOBALS['eZContentLanguageList'],
00884 $GLOBALS['eZContentLanguagePrioritizedLanguages'],
00885 $GLOBALS['eZContentLanguageMask'],
00886 $GLOBALS['eZContentLanguageCronjobMode'] );
00887 }
00888 }
00889
00890 ?>