Index: branches/2.8.x/CHANGELOG
===================================================================
--- branches/2.8.x/CHANGELOG	(revision 1872)
+++ branches/2.8.x/CHANGELOG	(revision 1873)
@@ -11,7 +11,8 @@
 ! = Update/Change
 ===============================================================================
 
-
+27 Feb-2013 Build 1873 Werner v.d.Decken(DarkViper)
+# some small fixes in packet Translate
 25 Feb-2013 Build 1872 Dietmar Woellbrink (Luisehahne)
 # bugfix preferences timezone, date_format, time_format settings, backend and frontend
 23 Feb-2013 Build 1871 Dietmar Woellbrink (Luisehahne)
Index: branches/2.8.x/wb/admin/interface/version.php
===================================================================
--- branches/2.8.x/wb/admin/interface/version.php	(revision 1872)
+++ branches/2.8.x/wb/admin/interface/version.php	(revision 1873)
@@ -51,5 +51,5 @@
 
 // check if defined to avoid errors during installation (redirect to admin panel fails if PHP error/warnings are enabled)
 if(!defined('VERSION')) define('VERSION', '2.8.3');
-if(!defined('REVISION')) define('REVISION', '1872');
+if(!defined('REVISION')) define('REVISION', '1873');
 if(!defined('SP')) define('SP', '');
Index: branches/2.8.x/wb/framework/TranslateAdaptorInterface.php
===================================================================
--- branches/2.8.x/wb/framework/TranslateAdaptorInterface.php	(revision 1872)
+++ branches/2.8.x/wb/framework/TranslateAdaptorInterface.php	(revision 1873)
@@ -22,8 +22,8 @@
  *
  * @category     Core
  * @package      Core_Translation
+ * @copyright    Werner v.d.Decken <wkl@isteam.de>
  * @author       Werner v.d.Decken <wkl@isteam.de>
- * @copyright    Werner v.d.Decken <wkl@isteam.de>
  * @license      http://www.gnu.org/licenses/gpl.html   GPL License
  * @version      0.0.1
  * @revision     $Revision$
Index: branches/2.8.x/wb/framework/Translate.php
===================================================================
--- branches/2.8.x/wb/framework/Translate.php	(revision 1872)
+++ branches/2.8.x/wb/framework/Translate.php	(revision 1873)
@@ -22,8 +22,8 @@
  *
  * @category     Core
  * @package      Core_Translation
+ * @copyright    Werner v.d.Decken <wkl@isteam.de>
  * @author       Werner v.d.Decken <wkl@isteam.de>
- * @copyright    Werner v.d.Decken <wkl@isteam.de>
  * @license      http://www.gnu.org/licenses/gpl.html   GPL License
  * @version      0.0.1
  * @revision     $Revision$
@@ -30,26 +30,34 @@
  * @link         $HeadURL$
  * @lastmodified $Date$
  * @since        File available since 12.01.2013
- * @description
+ * @description  basic class of the Translate package
  */
 class Translate {
 	
-//  @object hold the Singleton instance 
+/** holds the active singleton instance */
 	private static $_oInstance     = null;
-	
+/** name of the default adaptor */	
 	protected $sAdaptor            = 'WbOldStyle';
+/** setting for the system language (default: en) */
 	protected $sSystemLanguage     = 'en';
+/** setting for the default runtime language (default: en) */
 	protected $sDefaultLanguage    = 'en';
+/** setting for the user defined language (default: en) */
 	protected $sUserLanguage       = 'en';
+/** switch cache on/off */
 	protected $bUseCache           = true;
-/** TranslationTable objects of all loaded addons */
+/** defines if the keys of undefines translation should be preserved */
+	protected $bRemoveMissing      = false;
+/** can hold up to 31 boolean option settings */
+	protected $iOptions            = 0;
+/** List of loaded translation tables */
 	protected $aLoadedAddons       = array();
 /** TranslationTable object of the core and additional one activated addon */	
 	protected $aActiveTranslations = array();
+/** possible option flags */	
+	const CACHE_DISABLED = 1; // ( 2^0 )
+	const KEEP_MISSING   = 2; // ( 2^1 )
 	
-	const CACHE_ENABLED = true;
-	const CACHE_DISABLED = false;
-
 /** prevent class from public instancing and get an object to hold extensions */
 	protected function  __construct() {}
 /** prevent from cloning existing instance */
@@ -67,18 +75,25 @@
 	}
 /**
  * Initialize the Translations
+ * @param string SystemLanguage code ('de' || 'de_CH' || 'de_CH_uri')
  * @param string DefaultLanguage code ('de' || 'de_CH' || 'de_CH_uri')
  * @param string UserLanguage code ('de' || 'de_CH' || 'de_CH_uri')
+ * @param string Name of the adaptor to use
+ * @param integer possible options (DISABLE_CACHE | KEEP_MISSING)
  * @throws TranslationException
  */
-	public function initialize($sSystemLanguage, $sDefaultLanguage, $sUserLanguage = '', 
-	                           $sAdaptor = 'WbOldStyle', $bUseCache = self::CACHE_ENABLED) 
+	public function initialize($sSystemLanguage, 
+	                           $sDefaultLanguage, 
+	                           $sUserLanguage = '', 
+	                           $sAdaptor = 'WbOldStyle', 
+	                           $iOptions = 0)
 	{
 		if(!class_exists('TranslateAdaptor'.$sAdaptor)) {
 			throw new TranslationException('unable to load adaptor: '.$sAdaptor);
 		}
-		$this->bUseCache = $bUseCache;
-		$this->sAdaptor = 'TranslateAdaptor'.$sAdaptor;
+		$this->sAdaptor       = 'TranslateAdaptor'.$sAdaptor;
+		$this->bUseCache      = (($iOptions & self::CACHE_DISABLED) == 0);
+		$this->bRemoveMissing = (($iOptions & self::KEEP_MISSING) == 0);
 		// if no system language is set then use language 'en'
 		$this->sSystemLanguage = (trim($sSystemLanguage) == '' ? 'en' : $sSystemLanguage);
 		// if no default language is set then use system language
@@ -87,9 +102,9 @@
 		                            : $sDefaultLanguage);
 		// if no user language is set then use default language
 		$this->sUserLanguage = (trim($sUserLanguage) == '' 
-		                         ? $this->sDefaultLanguage 
+		                         ? $this->sDefaultLanguage
 		                         : $sUserLanguage);
-		$sPattern = '/^[a-z]{2,3}(?:(?:\_[a-z]{2})?(?:\_[a-z0-9]{2,4})?)$/siU';
+		$sPattern = '/^[a-z]{2,3}(?:(?:[_-][a-z]{2})?(?:[_-][a-z0-9]{2,4})?)$/siU';
 		// validate language codes
 		if(preg_match($sPattern, $this->sSystemLanguage) &&
 		   preg_match($sPattern, $this->sDefaultLanguage) &&
@@ -177,7 +192,7 @@
  */	
 	public function __get($sKey)
 	{
-		$sRetval = '';
+		$sRetval = ($this->bRemoveMissing ? '' : '#'.$sKey.'#');
 		foreach($this->aActiveTranslations as $oAddon) {
 			if(isset($oAddon->$sKey)) {
 			// search the last matching translation (Core -> Addon)
Index: branches/2.8.x/wb/framework/initialize.php
===================================================================
--- branches/2.8.x/wb/framework/initialize.php	(revision 1872)
+++ branches/2.8.x/wb/framework/initialize.php	(revision 1873)
@@ -154,14 +154,19 @@
 // define constant systemenvironment settings ---
 	date_default_timezone_set('UTC');
 	if(!defined('MAX_TIME')) { define('MAX_TIME', (pow(2, 31)-1)); } // 32-Bit Timestamp of 19 Jan 2038 03:14:07 GMT
-	if(!defined('DO_NOT_TRACK')) { define('DO_NOT_TRACK', (isset($_SERVER['HTTP_DNT']))); }
+	$sTmp = (isset($_SERVER['HTTP_DNT']) && $_SERVER['HTTP_DNT'] != '') ? $_SERVER['HTTP_DNT'] : '0';
+	if(!defined('DO_NOT_TRACK')) { define('DO_NOT_TRACK', ($sTmp[0] == '1')); }
 // register WB basic autoloader ---
 	$sTmp = dirname(__FILE__).'/WbAutoloader.php';
-	if(!class_exists('WbAutoloader', false)){ include($sTmp); }
+	if(!class_exists('WbAutoloader')){ 
+		include($sTmp);
+	}
 	WbAutoloader::doRegister(array(ADMIN_DIRECTORY=>'a', 'modules'=>'m'));
 // register TWIG autoloader ---
 	$sTmp = dirname(dirname(__FILE__)).'/include/Sensio/Twig/lib/Twig/Autoloader.php';
-	if(!class_exists('Twig_Autoloader', false)){ include($sTmp); }
+	if(!class_exists('Twig_Autoloader')) { 
+		include($sTmp); 
+	}
 	Twig_Autoloader::register();
 // aktivate exceptionhandler ---
 	if(!function_exists('globalExceptionHandler')) {
@@ -188,19 +193,27 @@
 									 ? false 
 									 : $aSetting['value'])
 								 );
-			$aSetting['name'] = strtoupper($aSetting['name']);
-			if($aSetting['name'] == 'STRING_FILE_MODE') {
-				$iTmp = ((intval(octdec($aSetting['value'])) & ~0111)|0600);
-				define('OCTAL_FILE_MODE', $iTmp);
-				define('STRING_FILE_MODE', sprintf('0%03o', $iTmp));
-			}elseif($aSetting['name'] == 'STRING_DIR_MODE') {
-				$iTmp = (intval(octdec($aSetting['value'])) |0711);
-				define('OCTAL_DIR_MODE', $iTmp);
-				define('STRING_DIR_MODE', sprintf('0%03o', $iTmp));
-			}else {
-			// make global const from setting
-				@define($aSetting['name'], $aSetting['value']);
-			}
+			$sSettingName = strtoupper($aSetting['name']);
+			switch($sSettingName):
+				case 'STRING_FILE_MODE':
+					$iTmp = ((intval(octdec($aSetting['value'])) & ~0111)|0600);
+					define('OCTAL_FILE_MODE', $iTmp);
+					define('STRING_FILE_MODE', sprintf('0%03o', $iTmp));
+					break;
+				case 'STRING_DIR_MODE':
+					$iTmp = (intval(octdec($aSetting['value'])) |0711);
+					define('OCTAL_DIR_MODE', $iTmp);
+					define('STRING_DIR_MODE', sprintf('0%03o', $iTmp));
+				case 'PAGES_DIRECTORY':
+					// sanitize pages_directory
+					$sTmp = trim($aSetting['value'], '/');
+					$sTmp = ($sTmp == '' ? '' : '/'.$sTmp);
+					define('PAGES_DIRECTORY', $sTmp);
+					break;
+				default: // make global const from setting
+					@define($aSetting['name'], $aSetting['value']);
+					break;
+			endswitch;
 		}
 	}else { throw new AppException($database->get_error()); }
 // set error-reporting from loaded settings ---
@@ -286,9 +299,8 @@
 	}
 // load and activate new global translation table
 	Translate::getInstance()->initialize('en',
-	                                     (defined('DEFAULT_LANGUAGE') ? DEFAULT_LANGUAGE : ''), 
-	                                     (defined('LANGUAGE') ? LANGUAGE : ''), 
-	                                     'WbOldStyle',
-	                                     Translate::CACHE_ENABLED);
+										 (defined('DEFAULT_LANGUAGE') ? DEFAULT_LANGUAGE : ''), 
+										 (defined('LANGUAGE') ? LANGUAGE : '') 
+										);
 // *** END OF FILE ***********************************************************************
 	
\ No newline at end of file
Index: branches/2.8.x/wb/framework/TranslationTable.php
===================================================================
--- branches/2.8.x/wb/framework/TranslationTable.php	(revision 1872)
+++ branches/2.8.x/wb/framework/TranslationTable.php	(revision 1873)
@@ -22,8 +22,8 @@
  *
  * @category     Core
  * @package      Core_Translation
+ * @copyright    Werner v.d.Decken <wkl@isteam.de>
  * @author       Werner v.d.Decken <wkl@isteam.de>
- * @copyright    Werner v.d.Decken <wkl@isteam.de>
  * @license      http://www.gnu.org/licenses/gpl.html   GPL License
  * @version      0.0.1
  * @revision     $Revision$
@@ -42,16 +42,21 @@
 	protected $oReg          = null;
 	protected $sTempPath     = '';
 	protected $iDirMode      = 0777;
-/**
+	protected $bUseCache     = true;
+
+	/**
  * Constructor
  * @param string relative pathname of the Addon (i.e. '' || 'modules/myAddon/')
  * @param string System language code ( 2*3ALPHA[[_2ALPHA]_2*4ALNUM] )
  * @param string Default language code ( 2*3ALPHA[[_2ALPHA]_2*4ALNUM] )
  * @param string User language code ( 2*3ALPHA[[_2ALPHA]_2*4ALNUM] )
+ * @param boolean true if caching is enabled
  */	
 	public function __construct($sAddon, 
-	                            $sSystemLanguage, $sDefaultLanguage, $sUserLanguage,
-	                            $bUseCache = Translate::CACHE_ENABLED)
+	                            $sSystemLanguage, 
+	                            $sDefaultLanguage, 
+	                            $sUserLanguage,
+	                            $bUseCache = true)
 	{
 		$this->bUseCache             = $bUseCache;
 		$this->sSystemLang           = $sSystemLanguage;
@@ -195,7 +200,8 @@
 		$sConcatedLang = '';
 		foreach($aLangCode as $sLang)
 		{ // iterate all segments of the language code
-			if( ($aResult = $oAdaptor->loadLanguage($sConcatedLang.$sLang)) !== false ) {
+			$sConcatedLang .= ($sConcatedLang == '' ? '' :  '_').$sLang;
+			if( ($aResult = $oAdaptor->loadLanguage($sConcatedLang)) !== false ) {
 				$aTranslations = array_merge($aTranslations, $aResult);
 			}
 		}
Index: branches/2.8.x/wb/framework/TranslateAdaptorWbOldStyle.php
===================================================================
--- branches/2.8.x/wb/framework/TranslateAdaptorWbOldStyle.php	(revision 1872)
+++ branches/2.8.x/wb/framework/TranslateAdaptorWbOldStyle.php	(revision 1873)
@@ -22,8 +22,8 @@
  *
  * @category     Core
  * @package      Core_Translation
+ * @copyright    Werner v.d.Decken <wkl@isteam.de>
  * @author       Werner v.d.Decken <wkl@isteam.de>
- * @copyright    Werner v.d.Decken <wkl@isteam.de>
  * @license      http://www.gnu.org/licenses/gpl.html   GPL License
  * @version      0.0.1
  * @revision     $Revision$
@@ -44,8 +44,8 @@
 	public function __construct($sAddon = '')
 	{
 		$this->sAddon = $sAddon;
-		$this->sFilePath = str_replace('\\', '/', dirname(dirname(__FILE__))).'/'.$sAddon;
-		$this->sFilePath = rtrim(str_replace('\\', '/', $this->sFilePath), '/').'/languages/';
+		$this->sFilePath = str_replace('\\', '/', dirname(dirname(__FILE__)).'/'.$sAddon);
+		$this->sFilePath = rtrim($this->sFilePath, '/').'/languages/';
 	}
 /**
  * Load languagefile
@@ -72,7 +72,7 @@
 	}
 /**
  * Find first existing language
- * @return string Code of first found language
+ * @return string Code of first found basic language
  */
 	public function findFirstLanguage()
 	{
@@ -81,7 +81,7 @@
 		if(is_readable($this->sFilePath)) {
 			$iterator = new DirectoryIterator($this->sFilePath);
 			foreach ($iterator as $oFileInfo) {
-				$sPattern = '/^[a-z0-9]{2}(?:(?:\_[a-z0-9]{2})?(?:\_[a-z0-9]{2,4})?)\.php/siU';
+				$sPattern = '/^[a-z]{2,3}\.php/siU';
 				if(!preg_match($sPattern, $oFileInfo->getBasename())) { continue; }
 				if($oFileInfo->isReadable()) {
 					$sRetval = $oFileInfo->getBasename('.php');
