Admin Panel localization (#467)

This commit is contained in:
RainLoop Team 2015-03-28 02:06:56 +04:00
parent 470b3645e2
commit 3dac6809d1
46 changed files with 1111 additions and 561 deletions

View file

@ -1553,11 +1553,12 @@ class Actions
$aResult['ProjectHash'] = \md5($aResult['AccountHash'].APP_VERSION.$this->Plugins()->Hash());
$sLanguage = $oConfig->Get('webmail', 'language', 'en');
$sLanguageAdmin = $oConfig->Get('webmail', 'language_admin', 'en');
$sTheme = $oConfig->Get('webmail', 'theme', 'Default');
$aResult['Themes'] = $this->GetThemes();
$aResult['Languages'] = $this->GetLanguages();
$aResult['LanguagesTop'] = $this->GetLanguagesTop();
$aResult['Languages'] = $this->GetLanguages(false);
$aResult['LanguagesAdmin'] = $this->GetLanguages(true);
$aResult['AllowLanguagesOnSettings'] = (bool) $oConfig->Get('webmail', 'allow_languages_on_settings', true);
$aResult['AllowLanguagesOnLogin'] = (bool) $oConfig->Get('login', 'allow_languages_on_login', true);
$aResult['AttachmentLimit'] = ((int) $oConfig->Get('webmail', 'attachment_size_limit', 10)) * 1024 * 1024;
@ -1641,27 +1642,21 @@ class Actions
$sTheme = $this->ValidateTheme($sTheme);
$sNewThemeLink = './?/Css/0/'.($bAdmin ? 'Admin' : 'User').'/-/'.$sTheme.'/-/'.$sStaticCache.'/Hash/-/';
$bUserLanguage = false;
if (!$bAdmin && !$aResult['Auth'] && !empty($_COOKIE['rllang']) &&
$oConfig->Get('login', 'allow_languages_on_login', true))
if (!$aResult['Auth'])
{
$sLanguage = $_COOKIE['rllang'];
}
else if (!$bAdmin && !$aResult['Auth'])
{
$sUserLanguage = '';
if (!$bAdmin && !$aResult['Auth'] &&
$oConfig->Get('login', 'allow_languages_on_login', true) &&
$oConfig->Get('login', 'determine_user_language', true))
if (!$bAdmin)
{
$sUserLanguage = $this->detectUserLanguage();
}
if ($oConfig->Get('login', 'allow_languages_on_login', true) &&
$oConfig->Get('login', 'determine_user_language', true))
{
$sLanguage = $this->ValidateLanguage($sLanguage, false);
$sLanguage = $this->ValidateLanguage($sLanguage);
if (0 < \strlen($sUserLanguage) && $sLanguage !== $sUserLanguage)
{
$sLanguage = $sUserLanguage;
$bUserLanguage = true;
$sUserLanguage = $this->detectUserLanguage();
if (0 < \strlen($sUserLanguage) && $sLanguage !== $sUserLanguage)
{
$sLanguage = $sUserLanguage;
}
}
}
}
@ -1673,9 +1668,17 @@ class Actions
$aResult['Theme'] = $sTheme;
$aResult['NewThemeLink'] = $sNewThemeLink;
$aResult['Language'] = $this->ValidateLanguage($sLanguage);
$aResult['UserLanguage'] = $bUserLanguage;
$aResult['LangLink'] = './?/Lang/0/'.($bAdmin ? 'en' : $aResult['Language']).'/'.$sStaticCache.'/';
$aResult['Language'] = $this->ValidateLanguage($sLanguage, false);
$aResult['LanguageAdmin'] = $this->ValidateLanguage($sLanguageAdmin, true);
$sUserLanguage = $this->detectUserLanguage();
$aResult['UserLanguage'] = $sUserLanguage === $this->ValidateLanguage($sUserLanguage, false) ? $sUserLanguage : '';
$aResult['UserLanguageAdmin'] = $sUserLanguage === $this->ValidateLanguage($sUserLanguage, true) ? $sUserLanguage : '';
$aResult['LangLink'] = './?/Lang/0/'.($bAdmin ? 'Admin' : 'App').'/'.
($bAdmin ? $aResult['LanguageAdmin'] : $aResult['Language']).'/'.$sStaticCache.'/';
$aResult['TemplatesLink'] = './?/Templates/0/'.($bAdmin ? 'Admin' : 'App').'/'.$sStaticCache.'/';
$aResult['PluginsLink'] = $sPluginsLink;
$aResult['EditorDefaultType'] = \in_array($aResult['EditorDefaultType'], array('Plain', 'Html', 'HtmlForced', 'PlainForced')) ?
@ -3196,7 +3199,11 @@ class Actions
$self = $this;
$this->setConfigFromParams($oConfig, 'Language', 'webmail', 'language', 'string', function ($sLanguage) use ($self) {
return $self->ValidateLanguage($sLanguage);
return $self->ValidateLanguage($sLanguage, false);
});
$this->setConfigFromParams($oConfig, 'LanguageAdmin', 'webmail', 'language_admin', 'string', function ($sLanguage) use ($self) {
return $self->ValidateLanguage($sLanguage, true);
});
$this->setConfigFromParams($oConfig, 'Theme', 'webmail', 'theme', 'string', function ($sTheme) use ($self) {
@ -3965,7 +3972,6 @@ class Actions
'version' => $oItem->version,
'file' => $oItem->file,
'release' => $oItem->release,
'release_notes' => isset($oItem->{'release_notes'}) ? $oItem->{'release_notes'} : '',
'desc' => $oItem->description
);
}
@ -4091,7 +4097,6 @@ class Actions
'version' => '',
'file' => '',
'release' => '',
'release_notes' => '',
'desc' => ''
));
}
@ -4715,7 +4720,7 @@ class Actions
}
else
{
$oSettingsLocal->SetConf('Theme', $this->ValidateLanguage($oConfig->Get('webmail', 'theme', 'Default')));
$oSettingsLocal->SetConf('Theme', $this->ValidateTheme($oConfig->Get('webmail', 'theme', 'Default')));
}
$this->setSettingsFromParams($oSettings, 'MPP', 'int', function ($iValue) {
@ -8292,13 +8297,14 @@ class Actions
/**
* @param string $sLanguage
* @param bool $bAdmin = false
*
* @return string
*/
public function ValidateLanguage($sLanguage)
public function ValidateLanguage($sLanguage, $bAdmin = false)
{
return \in_array($sLanguage, $this->GetLanguages()) ?
$sLanguage : $this->Config()->Get('i18n', 'default', 'en');
return \in_array($sLanguage, $this->GetLanguages($bAdmin)) ?
$sLanguage : $this->Config()->Get('webmail', $bAdmin ? 'language_admin' : 'language', 'en');
}
/**
@ -8395,23 +8401,33 @@ class Actions
/**
* @staticvar array $aCache
* @param bool $bAdmin = false
*
* @return array
*/
public function GetLanguages()
public function GetLanguages($bAdmin = false)
{
static $aCache = null;
if (\is_array($aCache))
static $aCache = array();
$sDir = APP_VERSION_ROOT_PATH.'langs/'.($bAdmin ? 'admin/' : '');
if (isset($aCache[$sDir]))
{
return $aCache;
return $aCache[$sDir];
}
// $aTopper = array('en');
// $sUserLanguage = $this->detectUserLanguage();
// if (!empty($sUserLanguage) && 'en' !== $sUserLanguage)
// {
// $aTopper[] = $sUserLanguage;
// }
$aTop = array();
$aList = array();
$sDir = APP_VERSION_ROOT_PATH.'langs/';
if (@\is_dir($sDir))
{
$rDirH = opendir($sDir);
$rDirH = \opendir($sDir);
if ($rDirH)
{
while (($sFile = \readdir($rDirH)) !== false)
@ -8421,7 +8437,14 @@ class Actions
$sLang = \strtolower(\substr($sFile, 0, -4));
if (0 < \strlen($sLang) && 'always' !== $sLang)
{
\array_push($aList, $sLang);
// if (\in_array(\substr($sLang, 0, 2), $aTopper))
// {
// \array_push($aTop, $sLang);
// }
// else
// {
\array_push($aList, $sLang);
// }
}
}
}
@ -8430,41 +8453,11 @@ class Actions
}
}
\sort($aTop);
\sort($aList);
$aCache = $aList;
return $aCache;
}
public function GetLanguagesTop()
{
$sUserLang = $this->getUserLanguageFromHeader();
if (2 < \strlen($sUserLang))
{
$sUserLang = \substr($sUserLang, 0, 2);
}
$self = $this;
$aResult = array();
foreach ($this->GetLanguages() as $sLang)
{
if ($sUserLang === \substr($sLang, 0, 2))
{
$aResult[] = $sLang;
}
}
$aTopLangs = \array_map('trim', \explode(',', $this->Config()->Get('labs', 'top_langs', 'en')));
$aResult = \array_merge($aResult, $aTopLangs);
$aResult = \array_unique($aResult);
$aResult = \array_values(\array_filter($aResult, function ($sLang) use ($self) {
return $sLang === $self->ValidateLanguage($sLang);
}));
return $aResult;
$aCache[$sDir] = \array_merge($aTop, $aList);
return $aCache[$sDir];
}
/**
@ -8805,31 +8798,41 @@ class Actions
}
/**
* @param bool $bAdmin = false
*
* @return array
*/
public function GetLanguageAndTheme()
public function GetLanguageAndTheme($bAdmin = false)
{
$oAccount = $this->GetAccount();
$sLanguage = $this->Config()->Get('webmail', 'language', 'en');
$sTheme = $this->Config()->Get('webmail', 'theme', 'Default');
if ($oAccount instanceof \RainLoop\Model\Account)
if ($bAdmin)
{
$oSettings = $this->SettingsProvider()->Load($oAccount);
if ($oSettings instanceof \RainLoop\Settings)
{
$sLanguage = $oSettings->GetConf('Language', $sLanguage);
}
$sLanguage = $this->Config()->Get('webmail', 'language_admin', 'en');
}
else
{
$oAccount = $this->GetAccount();
$oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount);
if ($oSettingsLocal instanceof \RainLoop\Settings)
$sLanguage = $this->Config()->Get('webmail', 'language', 'en');
if ($oAccount instanceof \RainLoop\Model\Account)
{
$sTheme = $oSettingsLocal->GetConf('Theme', $sTheme);
$oSettings = $this->SettingsProvider()->Load($oAccount);
if ($oSettings instanceof \RainLoop\Settings)
{
$sLanguage = $oSettings->GetConf('Language', $sLanguage);
}
$oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount);
if ($oSettingsLocal instanceof \RainLoop\Settings)
{
$sTheme = $oSettingsLocal->GetConf('Theme', $sTheme);
}
}
}
$sLanguage = $this->ValidateLanguage($sLanguage);
$sLanguage = $this->ValidateLanguage($sLanguage, $bAdmin);
$sTheme = $this->ValidateTheme($sTheme);
return array($sLanguage, $sTheme);

View file

@ -66,6 +66,7 @@ class Application extends \RainLoop\Config\AbstractConfig
'allow_user_background' => array(false),
'language' => array('en', 'Language used by default'),
'language_admin' => array('en', 'Admin Panel interface language'),
'allow_languages_on_settings' => array(true, 'Allow language selection on settings screen'),
'allow_additional_accounts' => array(true, ''),
@ -299,7 +300,6 @@ Enables caching in the system'),
'sieve_utf8_folder_name' => array(true),
'curl_proxy' => array(''),
'curl_proxy_auth' => array(''),
'top_langs' => array('en'),
'in_iframe' => array(false),
'force_https' => array(false),
'custom_login_link' => array(''),

View file

@ -89,13 +89,14 @@ class KeyPathHelper
/**
* @param string $sLanguage
* @param bool $bAdmim
* @param string $sPluginsHash
*
* @return string
*/
static public function LangCache($sLanguage, $sPluginsHash)
static public function LangCache($sLanguage, $bAdmim, $sPluginsHash)
{
return '/LangCache/'.$sPluginsHash.'/'.$sLanguage.'/'.APP_VERSION.'/';
return '/LangCache/'.$sPluginsHash.'/'.$sLanguage.'/'.($bAdmim ? 'Admin' : 'App').'/'.APP_VERSION.'/';
}
/**

View file

@ -215,22 +215,16 @@ class Service
}
/**
* @param bool $bAdmin
* @param bool $bAdmin = false
*
* @return array
*/
private function indexTemplateParameters($bAdmin)
private function indexTemplateParameters($bAdmin = false)
{
$sLanguage = 'en';
$sTheme = 'Default';
if (!$bAdmin)
{
list($sLanguage, $sTheme) = $this->oActions->GetLanguageAndTheme();
}
$sLanguage = $this->oActions->ValidateLanguage($sLanguage);
$sTheme = $this->oActions->ValidateTheme($sTheme);
list($sLanguage, $sTheme) = $this->oActions->GetLanguageAndTheme($bAdmin);
$bAppJsDebug = !!$this->oActions->Config()->Get('labs', 'use_app_debug_js', false);
$bAppCssDebug = !!$this->oActions->Config()->Get('labs', 'use_app_debug_css', false);
@ -271,6 +265,7 @@ class Service
$aTemplateParameters['{{BaseHash}}'] = \md5(
\implode('~', array(
$bAdmin ? '1' : '0',
\md5($this->oActions->Config()->Get('cache', 'index', '')),
$this->oActions->Plugins()->Hash(),
\RainLoop\Utils::WebVersionPath(), APP_VERSION

View file

@ -538,9 +538,10 @@ class ServiceActions
$sResult = '';
@\header('Content-Type: application/javascript; charset=utf-8');
if (!empty($this->aPaths[2]))
if (!empty($this->aPaths[3]))
{
$sLanguage = $this->oActions->ValidateLanguage($this->aPaths[2]);
$bAdmim = 'Admin' === (isset($this->aPaths[2]) ? (string) $this->aPaths[2] : 'App');
$sLanguage = $this->oActions->ValidateLanguage($this->aPaths[3], $bAdmim);
$bCacheEnabled = $this->Config()->Get('labs', 'cache_system_data', true);
if (!empty($sLanguage) && $bCacheEnabled)
@ -551,13 +552,15 @@ class ServiceActions
$sCacheFileName = '';
if ($bCacheEnabled)
{
$sCacheFileName = \RainLoop\KeyPathHelper::LangCache($sLanguage, $this->oActions->Plugins()->Hash());
$sCacheFileName = \RainLoop\KeyPathHelper::LangCache(
$sLanguage, $bAdmim, $this->oActions->Plugins()->Hash());
$sResult = $this->Cacher()->Get($sCacheFileName);
}
if (0 === \strlen($sResult))
{
$sResult = $this->compileLanguage($sLanguage, false);
$sResult = $this->compileLanguage($sLanguage, $bAdmim, false);
if ($bCacheEnabled && 0 < \strlen($sCacheFileName))
{
$this->Cacher()->Set($sCacheFileName, $sResult);
@ -1250,11 +1253,12 @@ class ServiceActions
/**
* @param string $sLanguage
* @param bool $bAdmin = false
* @param bool $bWrapByScriptTag = true
*
* @return string
*/
private function compileLanguage($sLanguage, $bWrapByScriptTag = true)
private function compileLanguage($sLanguage, $bAdmin = false, $bWrapByScriptTag = true)
{
$aResultLang = array();
@ -1269,7 +1273,8 @@ class ServiceActions
}
\RainLoop\Utils::ReadAndAddLang(APP_VERSION_ROOT_PATH.'app/i18n/langs.ini', $aResultLang);
\RainLoop\Utils::ReadAndAddLang(APP_VERSION_ROOT_PATH.'langs/'.$sLanguage.'.ini', $aResultLang);
\RainLoop\Utils::ReadAndAddLang(APP_VERSION_ROOT_PATH.'langs/'.
($bAdmin ? 'admin/' : '').$sLanguage.'.ini', $aResultLang);
$this->Plugins()->ReadLang($sLanguage, $aResultLang);