mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-07-13 03:27:39 +03:00
Language popup otimizations
This commit is contained in:
parent
d0efae7d35
commit
9bec1d0a8f
6 changed files with 109 additions and 23 deletions
|
|
@ -4,6 +4,7 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var
|
var
|
||||||
|
_ = require('_'),
|
||||||
ko = require('ko'),
|
ko = require('ko'),
|
||||||
|
|
||||||
Utils = require('Common/Utils'),
|
Utils = require('Common/Utils'),
|
||||||
|
|
@ -17,6 +18,7 @@
|
||||||
function LanguageStore()
|
function LanguageStore()
|
||||||
{
|
{
|
||||||
this.languages = ko.observableArray([]);
|
this.languages = ko.observableArray([]);
|
||||||
|
this.languagesTop = ko.observableArray([]);
|
||||||
|
|
||||||
this.language = ko.observable('')
|
this.language = ko.observable('')
|
||||||
.extend({'limitedList': this.languages});
|
.extend({'limitedList': this.languages});
|
||||||
|
|
@ -24,9 +26,14 @@
|
||||||
|
|
||||||
LanguageStore.prototype.populate = function ()
|
LanguageStore.prototype.populate = function ()
|
||||||
{
|
{
|
||||||
var aLanguages = Settings.settingsGet('Languages');
|
var
|
||||||
|
aLanguages = Settings.settingsGet('Languages'),
|
||||||
|
aLanguagesTop = Settings.settingsGet('LanguagesTop')
|
||||||
|
;
|
||||||
|
|
||||||
this.languages(Utils.isArray(aLanguages) ? aLanguages : []);
|
this.languages(Utils.isArray(aLanguages) ? aLanguages : []);
|
||||||
|
this.languagesTop(Utils.isArray(aLanguagesTop) ? aLanguagesTop : []);
|
||||||
|
|
||||||
this.language(Settings.settingsGet('Language'));
|
this.language(Settings.settingsGet('Language'));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,38 @@
|
||||||
});
|
});
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
|
this.languagesTop = ko.computed(function () {
|
||||||
|
|
||||||
|
var
|
||||||
|
aTop = this.LanguageStore.languagesTop(),
|
||||||
|
aLangs = this.languages()
|
||||||
|
;
|
||||||
|
|
||||||
|
return 0 < aTop.length ? _.compact(_.map(aTop, function (sLang) {
|
||||||
|
return _.find(aLangs, function (aItem) {
|
||||||
|
return aItem && sLang === aItem.key;
|
||||||
|
});
|
||||||
|
})) : [];
|
||||||
|
}, this);
|
||||||
|
|
||||||
|
this.languagesBottom = ko.computed(function () {
|
||||||
|
|
||||||
|
var
|
||||||
|
aTop = this.languagesTop(),
|
||||||
|
aLangs = this.languages()
|
||||||
|
;
|
||||||
|
|
||||||
|
if (0 < aTop.length)
|
||||||
|
{
|
||||||
|
return _.filter(aLangs, function (aItem) {
|
||||||
|
return -1 === Utils.inArray(aItem, aTop);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return aLangs;
|
||||||
|
|
||||||
|
}, this);
|
||||||
|
|
||||||
this.LanguageStore.language.subscribe(function () {
|
this.LanguageStore.language.subscribe(function () {
|
||||||
this.resetMainLanguage();
|
this.resetMainLanguage();
|
||||||
}, this);
|
}, this);
|
||||||
|
|
|
||||||
|
|
@ -1550,6 +1550,7 @@ class Actions
|
||||||
|
|
||||||
$aResult['Themes'] = $this->GetThemes();
|
$aResult['Themes'] = $this->GetThemes();
|
||||||
$aResult['Languages'] = $this->GetLanguages();
|
$aResult['Languages'] = $this->GetLanguages();
|
||||||
|
$aResult['LanguagesTop'] = $this->GetLanguagesTop();
|
||||||
$aResult['AllowLanguagesOnSettings'] = (bool) $oConfig->Get('webmail', 'allow_languages_on_settings', true);
|
$aResult['AllowLanguagesOnSettings'] = (bool) $oConfig->Get('webmail', 'allow_languages_on_settings', true);
|
||||||
$aResult['AllowLanguagesOnLogin'] = (bool) $oConfig->Get('login', 'allow_languages_on_login', true);
|
$aResult['AllowLanguagesOnLogin'] = (bool) $oConfig->Get('login', 'allow_languages_on_login', true);
|
||||||
$aResult['AttachmentLimit'] = ((int) $oConfig->Get('webmail', 'attachment_size_limit', 10)) * 1024 * 1024;
|
$aResult['AttachmentLimit'] = ((int) $oConfig->Get('webmail', 'attachment_size_limit', 10)) * 1024 * 1024;
|
||||||
|
|
@ -1693,16 +1694,29 @@ class Actions
|
||||||
return $aResult;
|
return $aResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function detectUserLanguage()
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function getUserLanguageFromHeader()
|
||||||
{
|
{
|
||||||
$sLang = '';
|
$sLang = '';
|
||||||
$sAcceptLang = $this->Http()->GetServer('HTTP_ACCEPT_LANGUAGE', 'en');
|
$sAcceptLang = $this->Http()->GetServer('HTTP_ACCEPT_LANGUAGE', 'en');
|
||||||
if (false !== \strpos($sAcceptLang, ','))
|
if (false !== \strpos($sAcceptLang, ','))
|
||||||
{
|
{
|
||||||
$aParts = \explode(',', $sAcceptLang, 2);
|
$aParts = \explode(',', $sAcceptLang, 2);
|
||||||
$sLang = !empty($aParts[0]) ? \strtolower($aParts[0]) : '';
|
$sLang = !empty($aParts[0]) ? \trim(\strtolower($aParts[0])) : '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return $sLang;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function detectUserLanguage()
|
||||||
|
{
|
||||||
|
$sLang = $this->getUserLanguageFromHeader();
|
||||||
|
|
||||||
if (!empty($sLang))
|
if (!empty($sLang))
|
||||||
{
|
{
|
||||||
$sLang = \preg_replace('/[^a-zA-Z0-9]+/', '-', $sLang);
|
$sLang = \preg_replace('/[^a-zA-Z0-9]+/', '-', $sLang);
|
||||||
|
|
@ -8384,8 +8398,8 @@ class Actions
|
||||||
return $aCache;
|
return $aCache;
|
||||||
}
|
}
|
||||||
|
|
||||||
$bEn = false;
|
$aList = array();
|
||||||
$sList = array();
|
|
||||||
$sDir = APP_VERSION_ROOT_PATH.'langs/';
|
$sDir = APP_VERSION_ROOT_PATH.'langs/';
|
||||||
if (@\is_dir($sDir))
|
if (@\is_dir($sDir))
|
||||||
{
|
{
|
||||||
|
|
@ -8399,14 +8413,7 @@ class Actions
|
||||||
$sLang = \strtolower(\substr($sFile, 0, -4));
|
$sLang = \strtolower(\substr($sFile, 0, -4));
|
||||||
if (0 < \strlen($sLang) && 'always' !== $sLang)
|
if (0 < \strlen($sLang) && 'always' !== $sLang)
|
||||||
{
|
{
|
||||||
if (\in_array($sLang, array('en')))
|
\array_push($aList, $sLang);
|
||||||
{
|
|
||||||
$bEn = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
\array_push($sList, $sLang);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -8415,14 +8422,41 @@ class Actions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
\sort($sList);
|
\sort($aList);
|
||||||
if ($bEn)
|
|
||||||
|
$aCache = $aList;
|
||||||
|
return $aCache;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function GetLanguagesTop()
|
||||||
|
{
|
||||||
|
$sUserLang = $this->getUserLanguageFromHeader();
|
||||||
|
if (2 < \strlen($sUserLang))
|
||||||
{
|
{
|
||||||
\array_unshift($sList, 'en');
|
$sUserLang = \substr($sUserLang, 0, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
$aCache = $sList;
|
$self = $this;
|
||||||
return $sList;
|
$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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -299,6 +299,7 @@ Enables caching in the system'),
|
||||||
'sieve_utf8_folder_name' => array(true),
|
'sieve_utf8_folder_name' => array(true),
|
||||||
'curl_proxy' => array(''),
|
'curl_proxy' => array(''),
|
||||||
'curl_proxy_auth' => array(''),
|
'curl_proxy_auth' => array(''),
|
||||||
|
'top_langs' => array('en'),
|
||||||
'in_iframe' => array(false),
|
'in_iframe' => array(false),
|
||||||
'force_https' => array(false),
|
'force_https' => array(false),
|
||||||
'custom_login_link' => array(''),
|
'custom_login_link' => array(''),
|
||||||
|
|
|
||||||
|
|
@ -366,10 +366,10 @@ class Utils
|
||||||
*/
|
*/
|
||||||
public static function CustomParseIniFile($sFileName, $bProcessSections = false)
|
public static function CustomParseIniFile($sFileName, $bProcessSections = false)
|
||||||
{
|
{
|
||||||
if (\MailSo\Base\Utils::FunctionExistsAndEnabled('parse_ini_file'))
|
// if (\MailSo\Base\Utils::FunctionExistsAndEnabled('parse_ini_file'))
|
||||||
{
|
// {
|
||||||
return @\parse_ini_file($sFileName, !!$bProcessSections);
|
// return @\parse_ini_file($sFileName, !!$bProcessSections);
|
||||||
}
|
// }
|
||||||
|
|
||||||
$sData = @\file_get_contents($sFileName);
|
$sData = @\file_get_contents($sFileName);
|
||||||
return \is_string($sData) ? @\parse_ini_string($sData, !!$bProcessSections) : null;
|
return \is_string($sData) ? @\parse_ini_string($sData, !!$bProcessSections) : null;
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,19 @@
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<div data-bind="foreach: languages">
|
<div data-bind="foreach: languagesTop, visible: 0 < languagesTop().length">
|
||||||
|
<label class="lang-item" data-tooltip-i18n="off" data-tooltip-placement="left" data-bind="click: function () { $root.changeLanguage(key); }, css: {'selected': selected},
|
||||||
|
tooltip: function () { return $root.languageEnName(key); }">
|
||||||
|
<span class="flag-wrapper">
|
||||||
|
<span data-bind="css: 'flag flag-' + key" style=""></span>
|
||||||
|
</span>
|
||||||
|
<span class="lang-name" data-bind="text: fullName"></span>
|
||||||
|
<i class="icon-ok pull-right" style="color: green; margin-top: 3px;"
|
||||||
|
data-bind="visible: selected"></i>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<hr data-bind="visible: 0 < languagesTop().length" />
|
||||||
|
<div data-bind="foreach: languagesBottom">
|
||||||
<label class="lang-item" data-tooltip-i18n="off" data-tooltip-placement="left" data-bind="click: function () { $root.changeLanguage(key); }, css: {'selected': selected},
|
<label class="lang-item" data-tooltip-i18n="off" data-tooltip-placement="left" data-bind="click: function () { $root.changeLanguage(key); }, css: {'selected': selected},
|
||||||
tooltip: function () { return $root.languageEnName(key); }">
|
tooltip: function () { return $root.languageEnName(key); }">
|
||||||
<span class="flag-wrapper">
|
<span class="flag-wrapper">
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue