mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-07-13 03:27:39 +03:00
Add Simplified Chinese language.
Update language popup. + Merge conflict origin/master
This commit is contained in:
commit
101f956fa8
25 changed files with 1055 additions and 458 deletions
|
|
@ -31,11 +31,20 @@ function AdminGeneral()
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.mainLanguageFullName = ko.computed(function () {
|
||||||
|
return Utils.convertLangName(this.mainLanguage());
|
||||||
|
}, this);
|
||||||
|
|
||||||
this.languagesOptions = ko.computed(function () {
|
this.languagesOptions = ko.computed(function () {
|
||||||
return _.map(oData.languages(), function (sLanguage) {
|
return _.map(oData.languages(), function (sLanguage) {
|
||||||
|
var
|
||||||
|
sName = Utils.convertLangName(sLanguage),
|
||||||
|
sEn = Utils.convertLangName(sLanguage, true)
|
||||||
|
;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'optValue': sLanguage,
|
'optValue': sLanguage,
|
||||||
'optText': Utils.convertLangName(sLanguage)
|
'optText': sName + (sEn !== sName ? ' (' + sEn + ')' : '')
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
@ -120,3 +129,8 @@ AdminGeneral.prototype.onBuild = function ()
|
||||||
|
|
||||||
}, 50);
|
}, 50);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
AdminGeneral.prototype.selectLanguage = function ()
|
||||||
|
{
|
||||||
|
kn.showScreenPopup(PopupsLanguagesViewModel);
|
||||||
|
};
|
||||||
|
|
|
||||||
|
|
@ -570,7 +570,7 @@ RainLoopApp.prototype.bootstart = function ()
|
||||||
bTwitter = this.settingsGet('AllowTwitterSocial')
|
bTwitter = this.settingsGet('AllowTwitterSocial')
|
||||||
;
|
;
|
||||||
|
|
||||||
if (!this.settingsGet('RemoteChangePassword'))
|
if (!this.settingsGet('AllowChangePassword'))
|
||||||
{
|
{
|
||||||
Utils.removeSettingsViewModel(SettingsChangePasswordScreen);
|
Utils.removeSettingsViewModel(SettingsChangePasswordScreen);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1187,11 +1187,13 @@ Utils.microtime = function ()
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {string} sLanguage
|
* @param {string} sLanguage
|
||||||
|
* @param {boolean=} bEng = false
|
||||||
* @return {string}
|
* @return {string}
|
||||||
*/
|
*/
|
||||||
Utils.convertLangName = function (sLanguage)
|
Utils.convertLangName = function (sLanguage, bEng)
|
||||||
{
|
{
|
||||||
return Utils.i18n('LANGS_NAMES/LANG_' + sLanguage.toUpperCase().replace(/[^a-zA-Z0-9]+/, '_'), null, sLanguage);
|
return Utils.i18n('LANGS_NAMES' + (true === bEng ? '_EN' : '') + '/LANG_' +
|
||||||
|
sLanguage.toUpperCase().replace(/[^a-zA-Z0-9]+/, '_'), null, sLanguage);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -34,14 +34,14 @@ function WebMailDataStorage()
|
||||||
this.devPassword = '';
|
this.devPassword = '';
|
||||||
|
|
||||||
this.accountEmail = ko.observable('');
|
this.accountEmail = ko.observable('');
|
||||||
this.accountLogin = ko.observable('');
|
this.accountIncLogin = ko.observable('');
|
||||||
|
this.accountOutLogin = ko.observable('');
|
||||||
this.projectHash = ko.observable('');
|
this.projectHash = ko.observable('');
|
||||||
|
|
||||||
this.threading = ko.observable(false);
|
this.threading = ko.observable(false);
|
||||||
this.lastFoldersHash = '';
|
this.lastFoldersHash = '';
|
||||||
|
|
||||||
this.remoteSuggestions = false;
|
this.remoteSuggestions = false;
|
||||||
this.remoteChangePassword = false;
|
|
||||||
|
|
||||||
// system folders
|
// system folders
|
||||||
this.sentFolder = ko.observable('');
|
this.sentFolder = ko.observable('');
|
||||||
|
|
@ -389,7 +389,8 @@ WebMailDataStorage.prototype.populateDataOnStart = function()
|
||||||
AbstractData.prototype.populateDataOnStart.call(this);
|
AbstractData.prototype.populateDataOnStart.call(this);
|
||||||
|
|
||||||
this.accountEmail(RL.settingsGet('Email'));
|
this.accountEmail(RL.settingsGet('Email'));
|
||||||
this.accountLogin(RL.settingsGet('Login'));
|
this.accountIncLogin(RL.settingsGet('IncLogin'));
|
||||||
|
this.accountOutLogin(RL.settingsGet('OutLogin'));
|
||||||
this.projectHash(RL.settingsGet('ProjectHash'));
|
this.projectHash(RL.settingsGet('ProjectHash'));
|
||||||
|
|
||||||
this.displayName(RL.settingsGet('DisplayName'));
|
this.displayName(RL.settingsGet('DisplayName'));
|
||||||
|
|
@ -399,7 +400,6 @@ WebMailDataStorage.prototype.populateDataOnStart = function()
|
||||||
this.lastFoldersHash = RL.local().get(Enums.ClientSideKeyName.FoldersLashHash) || '';
|
this.lastFoldersHash = RL.local().get(Enums.ClientSideKeyName.FoldersLashHash) || '';
|
||||||
|
|
||||||
this.remoteSuggestions = !!RL.settingsGet('RemoteSuggestions');
|
this.remoteSuggestions = !!RL.settingsGet('RemoteSuggestions');
|
||||||
this.remoteChangePassword = !!RL.settingsGet('RemoteChangePassword');
|
|
||||||
|
|
||||||
this.devEmail = RL.settingsGet('DevEmail');
|
this.devEmail = RL.settingsGet('DevEmail');
|
||||||
this.devLogin = RL.settingsGet('DevLogin');
|
this.devLogin = RL.settingsGet('DevLogin');
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,11 @@
|
||||||
|
|
||||||
.b-admin-general {
|
.b-admin-general {
|
||||||
|
.flag-selector {
|
||||||
|
padding-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flag-name {
|
||||||
|
border-bottom: 1px dashed #555;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,11 @@
|
||||||
|
|
||||||
&.modal {
|
&.modal {
|
||||||
z-index: 1103;
|
z-index: 1103;
|
||||||
width: 520px;
|
width: 500px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.exp {
|
&.exp {
|
||||||
width: 521px;
|
width: 501px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal-header {
|
.modal-header {
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
padding: 5px 15px;
|
padding: 5px 15px;
|
||||||
margin: 2px 5px;
|
margin: 2px 5px;
|
||||||
width: 200px;
|
width: 180px;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,26 +11,40 @@ function PopupsLanguagesViewModel()
|
||||||
this.exp = ko.observable(false);
|
this.exp = ko.observable(false);
|
||||||
|
|
||||||
this.languages = ko.computed(function () {
|
this.languages = ko.computed(function () {
|
||||||
var sCurrent = RL.data().mainLanguage();
|
|
||||||
return _.map(RL.data().languages(), function (sLanguage) {
|
return _.map(RL.data().languages(), function (sLanguage) {
|
||||||
return {
|
return {
|
||||||
'key': sLanguage,
|
'key': sLanguage,
|
||||||
'selected': sLanguage === sCurrent,
|
'selected': ko.observable(false),
|
||||||
'fullName': Utils.convertLangName(sLanguage)
|
'fullName': Utils.convertLangName(sLanguage)
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
RL.data().mainLanguage.subscribe(function () {
|
||||||
|
this.resetMainLanguage();
|
||||||
|
}, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Utils.extendAsViewModel('PopupsLanguagesViewModel', PopupsLanguagesViewModel);
|
Utils.extendAsViewModel('PopupsLanguagesViewModel', PopupsLanguagesViewModel);
|
||||||
|
|
||||||
|
PopupsLanguagesViewModel.prototype.languageEnName = function (sLanguage)
|
||||||
|
{
|
||||||
|
return Utils.convertLangName(sLanguage, true);
|
||||||
|
};
|
||||||
|
|
||||||
|
PopupsLanguagesViewModel.prototype.resetMainLanguage = function ()
|
||||||
|
{
|
||||||
|
var sCurrent = RL.data().mainLanguage();
|
||||||
|
_.each(this.languages(), function (oItem) {
|
||||||
|
oItem['selected'](oItem['key'] === sCurrent);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
PopupsLanguagesViewModel.prototype.onShow = function ()
|
PopupsLanguagesViewModel.prototype.onShow = function ()
|
||||||
{
|
{
|
||||||
// var self = this;
|
|
||||||
// _.defer(function () {
|
|
||||||
// self.exp(true);
|
|
||||||
// });
|
|
||||||
this.exp(true);
|
this.exp(true);
|
||||||
|
|
||||||
|
this.resetMainLanguage();
|
||||||
};
|
};
|
||||||
|
|
||||||
PopupsLanguagesViewModel.prototype.onHide = function ()
|
PopupsLanguagesViewModel.prototype.onHide = function ()
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
{
|
{
|
||||||
"name": "RainLoop",
|
"name": "RainLoop",
|
||||||
"title": "RainLoop Webmail",
|
"title": "RainLoop Webmail",
|
||||||
"version": "1.4.0",
|
"version": "1.4.1",
|
||||||
"release": "511",
|
"release": "512",
|
||||||
"description": "Simple, modern & fast web-based email client",
|
"description": "Simple, modern & fast web-based email client",
|
||||||
"homepage": "http://rainloop.net",
|
"homepage": "http://rainloop.net",
|
||||||
"main": "Gruntfile.js",
|
"main": "Gruntfile.js",
|
||||||
|
|
|
||||||
|
|
@ -4,36 +4,85 @@ LANG_EN_US = "English (US)"
|
||||||
LANG_EN_GB = "English (UK)"
|
LANG_EN_GB = "English (UK)"
|
||||||
LANG_EN_CA = "English (Canadian)"
|
LANG_EN_CA = "English (Canadian)"
|
||||||
|
|
||||||
LANG_NL = "Nederlands (Dutch)"
|
LANG_NL = "Nederlands"
|
||||||
LANG_NL_NL = "Nederlands (Dutch)"
|
LANG_NL_NL = "Nederlands"
|
||||||
|
|
||||||
LANG_RU = "Русский (Russian)"
|
LANG_RU = "Русский"
|
||||||
LANG_RU_RU = "Русский (Russian)"
|
LANG_RU_RU = "Русский"
|
||||||
|
|
||||||
LANG_DE = "Deutsch (German)"
|
LANG_DE = "Deutsch"
|
||||||
LANG_DE_DE = "Deutsch (German)"
|
LANG_DE_DE = "Deutsch"
|
||||||
|
|
||||||
LANG_FR = "Français (French)"
|
LANG_FR = "Français"
|
||||||
LANG_FR_FR = "Français (France)"
|
LANG_FR_FR = "Français (France)"
|
||||||
LANG_FR_CA = "Français (Canada)"
|
LANG_FR_CA = "Français (Canada)"
|
||||||
|
|
||||||
LANG_PT = "Português (Portugal)"
|
LANG_PT = "Português"
|
||||||
LANG_PT_PT = "Português (Portugal)"
|
LANG_PT_PT = "Português (Portugal)"
|
||||||
LANG_PT_BR = "Português (Brasil)"
|
LANG_PT_BR = "Português (Brasil)"
|
||||||
|
|
||||||
LANG_ES = "Español (Spanish)"
|
LANG_ES = "Español"
|
||||||
LANG_ES_ES = "Español (España)"
|
LANG_ES_ES = "Español (España)"
|
||||||
LANG_ES_LA = "Español (Spanish)"
|
LANG_ES_LA = "Español"
|
||||||
|
|
||||||
LANG_IT = "Italiano (Italian)"
|
LANG_IT = "Italiano"
|
||||||
LANG_IT_IT = "Italiano (Italian)"
|
LANG_IT_IT = "Italiano"
|
||||||
|
|
||||||
LANG_LV = "Latviešu (Latvian)"
|
LANG_LV = "Latviešu"
|
||||||
LANG_LV_LV = "Latviešu (Latvian)"
|
LANG_LV_LV = "Latviešu"
|
||||||
|
|
||||||
LANG_IS = "Íslenska (Icelandic)"
|
LANG_IS = "Íslenska"
|
||||||
LANG_IS_IS = "Íslenska (Icelandic)"
|
LANG_IS_IS = "Íslenska"
|
||||||
|
|
||||||
LANG_JA = "日本語 (Japanese)"
|
LANG_JA = "日本語"
|
||||||
LANG_JP = "日本語 (Japanese)"
|
LANG_JP = "日本語"
|
||||||
LANG_JA_JP = "日本語 (Japanese)"
|
LANG_JA_JP = "日本語"
|
||||||
|
|
||||||
|
LANG_ZH_TW = "中文(台灣)"
|
||||||
|
LANG_ZH_CN = "中文(简体)"
|
||||||
|
LANG_ZH_HK = "中文(香港)"
|
||||||
|
|
||||||
|
[LANGS_NAMES_EN]
|
||||||
|
LANG_EN = "English"
|
||||||
|
LANG_EN_US = "English (US)"
|
||||||
|
LANG_EN_GB = "English (UK)"
|
||||||
|
LANG_EN_CA = "English (Canadian)"
|
||||||
|
|
||||||
|
LANG_NL = "Dutch"
|
||||||
|
LANG_NL_NL = "Dutch"
|
||||||
|
|
||||||
|
LANG_RU = "Russian"
|
||||||
|
LANG_RU_RU = "Russian"
|
||||||
|
|
||||||
|
LANG_DE = "German"
|
||||||
|
LANG_DE_DE = "German"
|
||||||
|
|
||||||
|
LANG_FR = "French"
|
||||||
|
LANG_FR_FR = "French (France)"
|
||||||
|
LANG_FR_CA = "France (Canada)"
|
||||||
|
|
||||||
|
LANG_PT = "Portuguese"
|
||||||
|
LANG_PT_PT = "Portuguese (Portugal)"
|
||||||
|
LANG_PT_BR = "Portuguese (Brazil)"
|
||||||
|
|
||||||
|
LANG_ES = "Spanish"
|
||||||
|
LANG_ES_ES = "Spanish"
|
||||||
|
LANG_ES_LA = "Spanish"
|
||||||
|
|
||||||
|
LANG_IT = "Italian"
|
||||||
|
LANG_IT_IT = "Italian"
|
||||||
|
|
||||||
|
LANG_LV = "Latvian"
|
||||||
|
LANG_LV_LV = "Latvian"
|
||||||
|
|
||||||
|
LANG_IS = "Icelandic"
|
||||||
|
LANG_IS_IS = "Icelandic"
|
||||||
|
|
||||||
|
LANG_JA = "Japanese"
|
||||||
|
LANG_JP = "Japanese"
|
||||||
|
LANG_JA_JP = "Japanese"
|
||||||
|
|
||||||
|
LANG_CN = "Chinese"
|
||||||
|
LANG_ZH_TW = "Traditional Chinese (Taiwan)"
|
||||||
|
LANG_ZH_CN = "Simplified Chinese (China)"
|
||||||
|
LANG_ZH_HK = "Traditional Chinese (Hong Kong)"
|
||||||
|
|
@ -23,17 +23,17 @@ class FetchResponse
|
||||||
*
|
*
|
||||||
* @param \MailSo\Imap\Response $oImapResponse
|
* @param \MailSo\Imap\Response $oImapResponse
|
||||||
*/
|
*/
|
||||||
private function __construct(&$oImapResponse)
|
private function __construct($oImapResponse)
|
||||||
{
|
{
|
||||||
$this->oImapResponse =& $oImapResponse;
|
$this->oImapResponse = $oImapResponse;
|
||||||
$this->aEnvelopeCache = null;
|
$this->aEnvelopeCache = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param \MailSo\Imap\Response &$oImapResponse
|
* @param \MailSo\Imap\Response $oImapResponse
|
||||||
* @return \MailSo\Imap\FetchResponse
|
* @return \MailSo\Imap\FetchResponse
|
||||||
*/
|
*/
|
||||||
public static function NewInstance(&$oImapResponse)
|
public static function NewInstance($oImapResponse)
|
||||||
{
|
{
|
||||||
return new self($oImapResponse);
|
return new self($oImapResponse);
|
||||||
}
|
}
|
||||||
|
|
@ -133,22 +133,22 @@ class FetchResponse
|
||||||
*
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public function &GetFetchValue($sFetchItemName)
|
public function GetFetchValue($sFetchItemName)
|
||||||
{
|
{
|
||||||
$mReturn = null;
|
$mReturn = null;
|
||||||
$bNextIsValue = false;
|
$bNextIsValue = false;
|
||||||
|
|
||||||
if (Enumerations\FetchType::INDEX === $sFetchItemName)
|
if (Enumerations\FetchType::INDEX === $sFetchItemName)
|
||||||
{
|
{
|
||||||
$mReturn =& $this->oImapResponse->ResponseList[1];
|
$mReturn = $this->oImapResponse->ResponseList[1];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
foreach ($this->oImapResponse->ResponseList[3] as &$mItem)
|
foreach ($this->oImapResponse->ResponseList[3] as $mItem)
|
||||||
{
|
{
|
||||||
if ($bNextIsValue)
|
if ($bNextIsValue)
|
||||||
{
|
{
|
||||||
$mReturn =& $mItem;
|
$mReturn = $mItem;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -176,7 +176,7 @@ class FetchResponse
|
||||||
|
|
||||||
if (isset($this->oImapResponse->ResponseList[3]) && \is_array($this->oImapResponse->ResponseList[3]))
|
if (isset($this->oImapResponse->ResponseList[3]) && \is_array($this->oImapResponse->ResponseList[3]))
|
||||||
{
|
{
|
||||||
foreach ($this->oImapResponse->ResponseList[3] as &$mItem)
|
foreach ($this->oImapResponse->ResponseList[3] as $mItem)
|
||||||
{
|
{
|
||||||
if ($bNextIsValue)
|
if ($bNextIsValue)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -898,7 +898,7 @@ class ImapClient extends \MailSo\Net\NetClient
|
||||||
|
|
||||||
$aReturn = array();
|
$aReturn = array();
|
||||||
$oImapResponse = null;
|
$oImapResponse = null;
|
||||||
foreach ($aResult as &$oImapResponse)
|
foreach ($aResult as $oImapResponse)
|
||||||
{
|
{
|
||||||
if (FetchResponse::IsValidFetchImapResponse($oImapResponse))
|
if (FetchResponse::IsValidFetchImapResponse($oImapResponse))
|
||||||
{
|
{
|
||||||
|
|
@ -1089,13 +1089,13 @@ class ImapClient extends \MailSo\Net\NetClient
|
||||||
private function validateThreadItem($aValue)
|
private function validateThreadItem($aValue)
|
||||||
{
|
{
|
||||||
$mResult = false;
|
$mResult = false;
|
||||||
if (is_numeric($aValue))
|
if (\is_numeric($aValue))
|
||||||
{
|
{
|
||||||
$mResult = (int) $aValue;
|
$mResult = (int) $aValue;
|
||||||
}
|
}
|
||||||
else if (is_array($aValue))
|
else if (\is_array($aValue))
|
||||||
{
|
{
|
||||||
if (1 === count($aValue) && is_numeric($aValue[0]))
|
if (1 === count($aValue) && \is_numeric($aValue[0]))
|
||||||
{
|
{
|
||||||
$mResult = (int) $aValue[0];
|
$mResult = (int) $aValue[0];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -93,12 +93,40 @@ class Account
|
||||||
return 0 < \strlen($this->sParentEmail) ? $this->sParentEmail : $this->sEmail;
|
return 0 < \strlen($this->sParentEmail) ? $this->sParentEmail : $this->sEmail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function IncLogin()
|
||||||
|
{
|
||||||
|
$sLogin = $this->sLogin;
|
||||||
|
if ($this->oDomain->IncShortLogin())
|
||||||
|
{
|
||||||
|
$sLogin = \MailSo\Base\Utils::GetAccountNameFromEmail($this->sLogin);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sLogin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function OutLogin()
|
||||||
|
{
|
||||||
|
$sLogin = $this->sLogin;
|
||||||
|
if ($this->oDomain->OutShortLogin())
|
||||||
|
{
|
||||||
|
$sLogin = \MailSo\Base\Utils::GetAccountNameFromEmail($this->sLogin);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sLogin;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function Login()
|
public function Login()
|
||||||
{
|
{
|
||||||
return $this->sLogin;
|
return $this->IncLogin();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -291,7 +291,7 @@ class Actions
|
||||||
if ($oAccount)
|
if ($oAccount)
|
||||||
{
|
{
|
||||||
$sFileName = \str_replace('{user:email}', \strtolower($oAccount->Email()), $sFileName);
|
$sFileName = \str_replace('{user:email}', \strtolower($oAccount->Email()), $sFileName);
|
||||||
$sFileName = \str_replace('{user:login}', $oAccount->Login(), $sFileName);
|
$sFileName = \str_replace('{user:login}', $oAccount->IncLogin(), $sFileName);
|
||||||
$sFileName = \str_replace('{user:domain}', \strtolower($oAccount->Domain()->Name()), $sFileName);
|
$sFileName = \str_replace('{user:domain}', \strtolower($oAccount->Domain()->Name()), $sFileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -876,7 +876,7 @@ class Actions
|
||||||
'AllowThemes' => (bool) $oConfig->Get('webmail', 'allow_themes', true),
|
'AllowThemes' => (bool) $oConfig->Get('webmail', 'allow_themes', true),
|
||||||
'AllowCustomTheme' => (bool) $oConfig->Get('webmail', 'allow_custom_theme', true),
|
'AllowCustomTheme' => (bool) $oConfig->Get('webmail', 'allow_custom_theme', true),
|
||||||
'SuggestionsLimit' => (int) $oConfig->Get('labs', 'suggestions_limit', 50),
|
'SuggestionsLimit' => (int) $oConfig->Get('labs', 'suggestions_limit', 50),
|
||||||
'RemoteChangePassword' => false,
|
'AllowChangePassword' => false,
|
||||||
'ContactsIsSupported' => (bool) $this->ContactsProvider()->IsSupported(),
|
'ContactsIsSupported' => (bool) $this->ContactsProvider()->IsSupported(),
|
||||||
'ContactsIsAllowed' => (bool) $this->ContactsProvider()->IsActive(),
|
'ContactsIsAllowed' => (bool) $this->ContactsProvider()->IsActive(),
|
||||||
'JsHash' => \md5(\RainLoop\Utils::GetConnectionToken()),
|
'JsHash' => \md5(\RainLoop\Utils::GetConnectionToken()),
|
||||||
|
|
@ -898,11 +898,12 @@ class Actions
|
||||||
$oAccount = $this->getAccountFromToken(false);
|
$oAccount = $this->getAccountFromToken(false);
|
||||||
if ($oAccount instanceof \RainLoop\Account)
|
if ($oAccount instanceof \RainLoop\Account)
|
||||||
{
|
{
|
||||||
$aResult['Email'] = $oAccount->Email();
|
|
||||||
$aResult['Login'] = $oAccount->Login();
|
|
||||||
$aResult['Auth'] = true;
|
$aResult['Auth'] = true;
|
||||||
|
$aResult['Email'] = $oAccount->Email();
|
||||||
|
$aResult['IncLogin'] = $oAccount->IncLogin();
|
||||||
|
$aResult['OutLogin'] = $oAccount->OutLogin();
|
||||||
$aResult['AccountHash'] = $oAccount->Hash();
|
$aResult['AccountHash'] = $oAccount->Hash();
|
||||||
$aResult['RemoteChangePassword'] = $this->ChangePasswordProvider()->PasswordChangePossibility($oAccount);
|
$aResult['AllowChangePassword'] = $this->ChangePasswordProvider()->PasswordChangePossibility($oAccount);
|
||||||
|
|
||||||
$oSettings = $this->SettingsProvider()->Load($oAccount);
|
$oSettings = $this->SettingsProvider()->Load($oAccount);
|
||||||
}
|
}
|
||||||
|
|
@ -1198,15 +1199,9 @@ class Actions
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
$sLogin = $oAccount->Login();
|
|
||||||
if ($oAccount->Domain()->IncShortLogin())
|
|
||||||
{
|
|
||||||
$sLogin = \MailSo\Base\Utils::GetAccountNameFromEmail($sLogin);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->MailClient()
|
$this->MailClient()
|
||||||
->Connect($oAccount->Domain()->IncHost(), $oAccount->Domain()->IncPort(), $oAccount->Domain()->IncSecure())
|
->Connect($oAccount->Domain()->IncHost(), $oAccount->Domain()->IncPort(), $oAccount->Domain()->IncSecure())
|
||||||
->Login($sLogin, $oAccount->Password())
|
->Login($oAccount->IncLogin(), $oAccount->Password())
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
catch (\RainLoop\Exceptions\ClientException $oException)
|
catch (\RainLoop\Exceptions\ClientException $oException)
|
||||||
|
|
@ -1631,15 +1626,19 @@ class Actions
|
||||||
*/
|
*/
|
||||||
public function DoAppDelayStart()
|
public function DoAppDelayStart()
|
||||||
{
|
{
|
||||||
|
$this->Plugins()->RunHook('service.app-delay-start-begin');
|
||||||
|
|
||||||
\RainLoop\Utils::UpdateConnectionToken();
|
\RainLoop\Utils::UpdateConnectionToken();
|
||||||
|
|
||||||
$bMainCache = false;
|
$bMainCache = false;
|
||||||
$bFilesCache = false;
|
$bFilesCache = false;
|
||||||
$bActivity = false;
|
$bActivity = false;
|
||||||
$bPing = false;
|
$bPing = false;
|
||||||
|
$bReHash = false;
|
||||||
|
|
||||||
$iOneDay1 = 60 * 60 * 23;
|
$iOneDay1 = 60 * 60 * 23;
|
||||||
$iOneDay2 = 60 * 60 * 25;
|
$iOneDay2 = 60 * 60 * 25;
|
||||||
|
$iOneDay3 = $iOneDay2 * 2;
|
||||||
|
|
||||||
$sTimers = $this->StorageProvider()->Get(null,
|
$sTimers = $this->StorageProvider()->Get(null,
|
||||||
\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, 'Cache/Timers', '');
|
\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, 'Cache/Timers', '');
|
||||||
|
|
@ -1650,6 +1649,7 @@ class Actions
|
||||||
$iFilesCacheTime = !empty($aTimers[1]) && \is_numeric($aTimers[1]) ? (int) $aTimers[1] : 0;
|
$iFilesCacheTime = !empty($aTimers[1]) && \is_numeric($aTimers[1]) ? (int) $aTimers[1] : 0;
|
||||||
$iActivityTime = !empty($aTimers[2]) && \is_numeric($aTimers[2]) ? (int) $aTimers[2] : 0;
|
$iActivityTime = !empty($aTimers[2]) && \is_numeric($aTimers[2]) ? (int) $aTimers[2] : 0;
|
||||||
$iPingTime = !empty($aTimers[3]) && \is_numeric($aTimers[3]) ? (int) $aTimers[3] : 0;
|
$iPingTime = !empty($aTimers[3]) && \is_numeric($aTimers[3]) ? (int) $aTimers[3] : 0;
|
||||||
|
$iReHashTime = !empty($aTimers[4]) && \is_numeric($aTimers[4]) ? (int) $aTimers[4] : 0;
|
||||||
|
|
||||||
if (0 === $iMainCacheTime || $iMainCacheTime + $iOneDay1 < \time())
|
if (0 === $iMainCacheTime || $iMainCacheTime + $iOneDay1 < \time())
|
||||||
{
|
{
|
||||||
|
|
@ -1675,13 +1675,19 @@ class Actions
|
||||||
$iPingTime = \time();
|
$iPingTime = \time();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($bMainCache || $bFilesCache || $bActivity || $bPing)
|
if (0 === $iReHashTime || $iReHashTime + $iOneDay3 < \time())
|
||||||
|
{
|
||||||
|
$bReHash = true;
|
||||||
|
$iReHashTime = \time();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($bMainCache || $bFilesCache || $bActivity || $bPing || $bReHash)
|
||||||
{
|
{
|
||||||
if (!$this->StorageProvider()->Put(null,
|
if (!$this->StorageProvider()->Put(null,
|
||||||
\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, 'Cache/Timers',
|
\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, 'Cache/Timers',
|
||||||
\implode(',', array($iMainCacheTime, $iFilesCacheTime, $iActivityTime, $iPingTime))))
|
\implode(',', array($iMainCacheTime, $iFilesCacheTime, $iActivityTime, $iPingTime))))
|
||||||
{
|
{
|
||||||
$bMainCache = $bFilesCache = $bActivity = $bPing = false;
|
$bMainCache = $bFilesCache = $bActivity = $bPing = $bReHash = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1711,6 +1717,15 @@ class Actions
|
||||||
$this->KeenIO('Ping');
|
$this->KeenIO('Ping');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($bReHash)
|
||||||
|
{
|
||||||
|
$sHash = \RainLoop\Utils::PathMD5(APP_VERSION_ROOT_PATH);
|
||||||
|
$this->Logger()->Write('App Hash: '.$sHash);
|
||||||
|
@\file_put_contents(APP_DATA_FOLDER_PATH.'HASH', $sHash);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->Plugins()->RunHook('service.app-delay-start-end');
|
||||||
|
|
||||||
return $this->TrueResponse(__FUNCTION__);
|
return $this->TrueResponse(__FUNCTION__);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3704,9 +3719,8 @@ class Actions
|
||||||
'Secure' => $oAccount->Domain()->OutSecure(),
|
'Secure' => $oAccount->Domain()->OutSecure(),
|
||||||
'UseAuth' => $oAccount->Domain()->OutAuth(),
|
'UseAuth' => $oAccount->Domain()->OutAuth(),
|
||||||
'From' => empty($sFrom) ? $oAccount->Email() : $sFrom,
|
'From' => empty($sFrom) ? $oAccount->Email() : $sFrom,
|
||||||
'Login' => $oAccount->Login(),
|
'Login' => $oAccount->OutLogin(),
|
||||||
'Password' => $oAccount->Password(),
|
'Password' => $oAccount->Password(),
|
||||||
'UseShortLogin' => $oAccount->Domain()->OutShortLogin(),
|
|
||||||
'HiddenRcpt' => array()
|
'HiddenRcpt' => array()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -3727,13 +3741,7 @@ class Actions
|
||||||
{
|
{
|
||||||
if ($aSmtpCredentials['UseAuth'])
|
if ($aSmtpCredentials['UseAuth'])
|
||||||
{
|
{
|
||||||
$sLogin = $aSmtpCredentials['Login'];
|
$oSmtpClient->Login($aSmtpCredentials['Login'], $aSmtpCredentials['Password']);
|
||||||
if ($aSmtpCredentials['UseShortLogin'])
|
|
||||||
{
|
|
||||||
$sLogin = \MailSo\Base\Utils::GetAccountNameFromEmail($sLogin);
|
|
||||||
}
|
|
||||||
|
|
||||||
$oSmtpClient->Login($sLogin, $aSmtpCredentials['Password']);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4953,7 +4961,7 @@ class Actions
|
||||||
{
|
{
|
||||||
$this->MailClient()
|
$this->MailClient()
|
||||||
->Connect($oAccount->Domain()->IncHost(), $oAccount->Domain()->IncPort(), $oAccount->Domain()->IncSecure())
|
->Connect($oAccount->Domain()->IncHost(), $oAccount->Domain()->IncPort(), $oAccount->Domain()->IncSecure())
|
||||||
->Login($oAccount->Login(), $oAccount->Password(), !!$this->Config()->Get('labs', 'use_imap_auth_plain'))
|
->Login($oAccount->IncLogin(), $oAccount->Password(), !!$this->Config()->Get('labs', 'use_imap_auth_plain'))
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
catch (\MailSo\Net\Exceptions\ConnectionException $oException)
|
catch (\MailSo\Net\Exceptions\ConnectionException $oException)
|
||||||
|
|
@ -5175,6 +5183,7 @@ class Actions
|
||||||
private function setupInformation()
|
private function setupInformation()
|
||||||
{
|
{
|
||||||
$aResult = array(
|
$aResult = array(
|
||||||
|
'hash' => \file_exists(APP_DATA_FOLDER_PATH.'HASH') ? @\file_get_contents(APP_DATA_FOLDER_PATH.'HASH') : '',
|
||||||
'version-full' => APP_VERSION,
|
'version-full' => APP_VERSION,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -178,11 +178,18 @@ class Service
|
||||||
$bCached = true;
|
$bCached = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$sAppHash = '';
|
||||||
|
if (\file_exists(APP_DATA_FOLDER_PATH.'HASH'))
|
||||||
|
{
|
||||||
|
$sAppHash = @\file_get_contents(APP_DATA_FOLDER_PATH.'HASH');
|
||||||
|
}
|
||||||
|
|
||||||
$sResult .= '<!--';
|
$sResult .= '<!--';
|
||||||
$sResult .= ' [version:'.APP_VERSION;
|
$sResult .= ' [version:'.APP_VERSION;
|
||||||
$sResult .= '][time:'.substr(\microtime(true) - APP_START, 0, 6);
|
$sResult .= '][time:'.substr(\microtime(true) - APP_START, 0, 6);
|
||||||
$sResult .= '][cached:'.($bCached ? 'true' : 'false');
|
$sResult .= '][cached:'.($bCached ? 'true' : 'false');
|
||||||
$sResult .= '][session:'.md5(\RainLoop\Utils::GetShortToken());
|
$sResult .= '][session:'.md5(\RainLoop\Utils::GetShortToken());
|
||||||
|
$sResult .= '][hash:'.$sAppHash;
|
||||||
$sResult .= '] -->';
|
$sResult .= '] -->';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -377,7 +377,7 @@ class Social
|
||||||
{
|
{
|
||||||
$aUserData = array(
|
$aUserData = array(
|
||||||
'Email' => $oAccount->Email(),
|
'Email' => $oAccount->Email(),
|
||||||
'Login' => $oAccount->Login(),
|
'Login' => $oAccount->IncLogin(),
|
||||||
'Password' => $oAccount->Password()
|
'Password' => $oAccount->Password()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -489,7 +489,7 @@ class Social
|
||||||
{
|
{
|
||||||
$aUserData = array(
|
$aUserData = array(
|
||||||
'Email' => $oAccount->Email(),
|
'Email' => $oAccount->Email(),
|
||||||
'Login' => $oAccount->Login(),
|
'Login' => $oAccount->IncLogin(),
|
||||||
'Password' => $oAccount->Password()
|
'Password' => $oAccount->Password()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -652,7 +652,7 @@ class Social
|
||||||
|
|
||||||
$aUserData = array(
|
$aUserData = array(
|
||||||
'Email' => $oAccount->Email(),
|
'Email' => $oAccount->Email(),
|
||||||
'Login' => $oAccount->Login(),
|
'Login' => $oAccount->IncLogin(),
|
||||||
'Password' => $oAccount->Password()
|
'Password' => $oAccount->Password()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,29 @@
|
||||||
<div class="legend">
|
<div class="legend">
|
||||||
General
|
General
|
||||||
</div>
|
</div>
|
||||||
|
<div class="control-group">
|
||||||
|
<label class="control-label">
|
||||||
|
Language
|
||||||
|
</label>
|
||||||
|
<div class="controls">
|
||||||
|
<label class="flag-selector">
|
||||||
|
<span class="flag-wrapper">
|
||||||
|
<span data-bind="css: 'flag flag-' + mainLanguage()" style=""></span>
|
||||||
|
</span>
|
||||||
|
<span class="flag-name" data-bind="text: mainLanguageFullName, click: selectLanguage"></span>
|
||||||
|
<div data-bind="saveTrigger: languageTrigger"></div>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="control-group">
|
||||||
|
<label class="control-label">
|
||||||
|
Theme
|
||||||
|
</label>
|
||||||
|
<div class="controls">
|
||||||
|
<select data-bind="options: themesOptions, value: mainTheme, optionsText: 'optText', optionsValue: 'optValue', saveTrigger: themeTrigger"></select>
|
||||||
|
<div data-bind="saveTrigger: themeTrigger"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label class="control-label">
|
<label class="control-label">
|
||||||
Title
|
Title
|
||||||
|
|
@ -41,31 +64,11 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label class="control-label">
|
|
||||||
Language
|
|
||||||
</label>
|
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<select data-bind="options: languagesOptions, value: mainLanguage, optionsText: 'optText', optionsValue: 'optValue', saveTrigger: languageTrigger"></select>
|
|
||||||
<div data-bind="saveTrigger: languageTrigger"></div>
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
<label data-bind="click: function () { allowLanguagesOnSettings(!allowLanguagesOnSettings()); }">
|
<label data-bind="click: function () { allowLanguagesOnSettings(!allowLanguagesOnSettings()); }">
|
||||||
<i data-bind="css: allowLanguagesOnSettings() ? 'icon-checkbox-checked' : 'icon-checkbox-unchecked'"></i>
|
<i data-bind="css: allowLanguagesOnSettings() ? 'icon-checkbox-checked' : 'icon-checkbox-unchecked'"></i>
|
||||||
Allow language selection on settings screen
|
Allow language selection on settings screen
|
||||||
</label>
|
</label>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="control-group">
|
|
||||||
<label class="control-label">
|
|
||||||
Theme
|
|
||||||
</label>
|
|
||||||
<div class="controls">
|
|
||||||
<select data-bind="options: themesOptions, value: mainTheme, optionsText: 'optText', optionsValue: 'optValue', saveTrigger: themeTrigger"></select>
|
|
||||||
<div data-bind="saveTrigger: themeTrigger"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="control-group">
|
|
||||||
<div class="controls">
|
|
||||||
<label data-bind="click: function () { allowThemes(!allowThemes()); }">
|
<label data-bind="click: function () { allowThemes(!allowThemes()); }">
|
||||||
<i data-bind="css: allowThemes() ? 'icon-checkbox-checked' : 'icon-checkbox-unchecked'"></i>
|
<i data-bind="css: allowThemes() ? 'icon-checkbox-checked' : 'icon-checkbox-unchecked'"></i>
|
||||||
Allow theme selection on settings screen
|
Allow theme selection on settings screen
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,8 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<div data-bind="foreach: languages">
|
<div data-bind="foreach: languages">
|
||||||
<label class="lang-item" data-bind="click: function () { $root.changeLanguage(key); }, css: {'selected': selected}">
|
<label class="lang-item" data-tooltip-placement="left" data-bind="click: function () { $root.changeLanguage(key); }, css: {'selected': selected},
|
||||||
|
tooltip2: function () { return $root.languageEnName(key); }">
|
||||||
<span class="flag-wrapper">
|
<span class="flag-wrapper">
|
||||||
<span data-bind="css: 'flag flag-' + key" style=""></span>
|
<span data-bind="css: 'flag flag-' + key" style=""></span>
|
||||||
</span>
|
</span>
|
||||||
|
|
|
||||||
407
rainloop/v/0.0.0/langs/zh-cn.ini
Normal file
407
rainloop/v/0.0.0/langs/zh-cn.ini
Normal file
|
|
@ -0,0 +1,407 @@
|
||||||
|
[LOGIN]
|
||||||
|
LABEL_EMAIL = "邮件"
|
||||||
|
LABEL_LOGIN = "登陆"
|
||||||
|
LABEL_PASSWORD = "密码"
|
||||||
|
LABEL_SIGN_ME = "记住我"
|
||||||
|
BUTTON_SIGN_IN = "登入"
|
||||||
|
TITLE_SIGN_IN_GOOGLE = "Sign In using Google"
|
||||||
|
TITLE_SIGN_IN_FACEBOOK = "Sign In using Facebook"
|
||||||
|
TITLE_SIGN_IN_TWITTER = "Sign In using Twitter"
|
||||||
|
|
||||||
|
[TOP_TOOLBAR]
|
||||||
|
BUTTON_ADD_ACCOUNT = "添加账户"
|
||||||
|
BUTTON_SETTINGS = "设置"
|
||||||
|
BUTTON_LOGOUT = "注销"
|
||||||
|
|
||||||
|
[SEARCH]
|
||||||
|
MAIN_INPUT_PLACEHOLDER = "搜索"
|
||||||
|
TITLE_ADV = "高级搜索"
|
||||||
|
LABEL_ADV_FROM = "发送自"
|
||||||
|
LABEL_ADV_TO = "发送到"
|
||||||
|
LABEL_ADV_SUBJECT = "主题"
|
||||||
|
LABEL_ADV_TEXT = "内容"
|
||||||
|
LABEL_ADV_HAS_ATTACHMENTS = "有附件"
|
||||||
|
LABEL_ADV_DATE = "日期"
|
||||||
|
LABEL_ADV_DATE_ALL = "所有邮件"
|
||||||
|
LABEL_ADV_DATE_3_DAYS = "3天以内"
|
||||||
|
LABEL_ADV_DATE_7_DAYS = "1周以内"
|
||||||
|
LABEL_ADV_DATE_MONTH = "1月以内"
|
||||||
|
LABEL_ADV_DATE_3_MONTHS = "3月以内"
|
||||||
|
LABEL_ADV_DATE_6_MONTHS = "半年以内"
|
||||||
|
LABEL_ADV_DATE_YEAR = "1年以内"
|
||||||
|
BUTTON_ADV_SEARCH = "搜索"
|
||||||
|
|
||||||
|
[MAGNIFIC_POPUP]
|
||||||
|
CLOSE = "关闭 (Esc)"
|
||||||
|
LOADING = "加载..."
|
||||||
|
GALLERY_PREV = "向前 (Left arrow key)"
|
||||||
|
GALLERY_NEXT = "向后 (Right arrow key)"
|
||||||
|
GALLERY_COUNTER = "%curr% / %total%"
|
||||||
|
IMAGE_ERROR = "<a href="%url%" target=\"_blank\">图片</a> 无法加载。"
|
||||||
|
AJAX_ERROR = "<a href="%url%" target=\"_blank\">内容</a> 无法加载。"
|
||||||
|
|
||||||
|
[FOLDER_LIST]
|
||||||
|
BUTTON_COMPOSE = "写邮件"
|
||||||
|
BUTTON_CONTACTS = "联系人"
|
||||||
|
INBOX_NAME = "收件箱"
|
||||||
|
SENT_NAME = "已发邮件"
|
||||||
|
DRAFTS_NAME = "草稿"
|
||||||
|
SPAM_NAME = "垃圾邮件"
|
||||||
|
TRASH_NAME = "已删除邮件"
|
||||||
|
|
||||||
|
[QUOTA]
|
||||||
|
TITLE = "存储空间使用量"
|
||||||
|
|
||||||
|
[MESSAGE_LIST]
|
||||||
|
BUTTON_RELOAD = "重新加载邮件列表"
|
||||||
|
BUTTON_MOVE_TO = "移至"
|
||||||
|
BUTTON_DELETE = "已删除邮件"
|
||||||
|
BUTTON_SPAM = "垃圾邮件"
|
||||||
|
BUTTON_EMPTY_FOLDER = "清空文件夹"
|
||||||
|
BUTTON_MULTY_FORWARD = "转发邮件"
|
||||||
|
BUTTON_DELETE_WITHOUT_MOVE = "永久删除"
|
||||||
|
BUTTON_MORE = "更多"
|
||||||
|
MENU_SET_SEEN = "标记为已读"
|
||||||
|
MENU_SET_ALL_SEEN = "标记全部为已读"
|
||||||
|
MENU_UNSET_SEEN = "标记为未读"
|
||||||
|
MENU_SET_FLAG = "加注星标"
|
||||||
|
MENU_UNSET_FLAG = "移除星标"
|
||||||
|
MENU_SELECT_ALL = "全部"
|
||||||
|
MENU_SELECT_NONE = "无"
|
||||||
|
MENU_SELECT_INVERT = "选择"
|
||||||
|
MENU_SELECT_UNSEEN = "未读"
|
||||||
|
MENU_SELECT_SEEN = "已读"
|
||||||
|
MENU_SELECT_FLAGGED = "已加星标"
|
||||||
|
MENU_SELECT_UNFLAGGED = "未加星标"
|
||||||
|
EMPTY_LIST = "空列表。"
|
||||||
|
EMPTY_SEARCH_LIST = "未找到您想要的。"
|
||||||
|
SEARCH_RESULT_FOR = "搜索 \"%SEARCH%\" 的结果"
|
||||||
|
LIST_LOADING = "加载中"
|
||||||
|
EMPTY_SUBJECT_TEXT = "(无主题)"
|
||||||
|
PUT_MESSAGE_HERE = "在这里查看邮件"
|
||||||
|
TODAY_AT = "今日于 %TIME%"
|
||||||
|
YESTERDAY_IN = "昨天 %TIME%"
|
||||||
|
SEARCH_PLACEHOLDER = "搜索"
|
||||||
|
NEW_MESSAGE_NOTIFICATION = "您有 %COUNT% 封新邮件!"
|
||||||
|
QUOTA_SIZE = "使用了<strong>%LIMIT%</strong> 存储空间中的<strong>%SIZE% (%PROC%%)</strong>"
|
||||||
|
|
||||||
|
[MESSAGE]
|
||||||
|
BUTTON_EDIT = "编辑"
|
||||||
|
BUTTON_BACK = "返回"
|
||||||
|
BUTTON_CLOSE = "关闭"
|
||||||
|
BUTTON_DELETE = "删除"
|
||||||
|
BUTTON_MOVE_TO = "移至"
|
||||||
|
BUTTON_MORE = "更多"
|
||||||
|
BUTTON_REPLY = "回复"
|
||||||
|
BUTTON_REPLY_ALL = "全部回复"
|
||||||
|
BUTTON_FORWARD = "转发"
|
||||||
|
BUTTON_FORWARD_AS_ATTACHMENT = "带附件转发"
|
||||||
|
BUTTON_SHOW_IMAGES = "显示外部图片"
|
||||||
|
BUTTON_IN_NEW_WINDOW = "在新窗口中查看"
|
||||||
|
MENU_HEADERS = "显示详细信息"
|
||||||
|
MENU_VIEW_ORIGINAL = "显示原始内容"
|
||||||
|
MENU_DOWNLOAD_ORIGINAL = "作为 .eml 文件下载"
|
||||||
|
MENU_FILTER_SIMILAR = "过滤邮件如此"
|
||||||
|
MENU_PRINT = "打印邮件"
|
||||||
|
EMPTY_SUBJECT_TEXT = "(无主题)"
|
||||||
|
LABEL_SUBJECT = "主题"
|
||||||
|
LABEL_DATE = "日期"
|
||||||
|
LABEL_FROM = "发送自"
|
||||||
|
LABEL_FROM_SHORT = "from"
|
||||||
|
LABEL_TO = "发送到"
|
||||||
|
LABEL_TO_SHORT = "to"
|
||||||
|
LABEL_CC = "抄送"
|
||||||
|
LABEL_BCC = "密送"
|
||||||
|
PRINT_LABEL_FROM = "发送自"
|
||||||
|
PRINT_LABEL_TO = "发送到"
|
||||||
|
PRINT_LABEL_CC = "抄送"
|
||||||
|
PRINT_LABEL_BCC = "密送"
|
||||||
|
PRINT_LABEL_DATE = "日期"
|
||||||
|
PRINT_LABEL_SUBJECT = "主题"
|
||||||
|
PRINT_LABEL_ATTACHMENTS = "附件"
|
||||||
|
MESSAGE_LOADING = "加载中"
|
||||||
|
MESSAGE_VIEW_DESC = "在此查看列表中选中的邮件。"
|
||||||
|
|
||||||
|
[SUGGESTIONS]
|
||||||
|
SEARCHING_DESC = "搜索中..."
|
||||||
|
|
||||||
|
[CONTACTS]
|
||||||
|
LEGEND_CONTACTS = "联系人"
|
||||||
|
SEARCH_INPUT_PLACEHOLDER = "搜索"
|
||||||
|
BUTTON_ADD_CONTACT = "添加联系人"
|
||||||
|
BUTTON_CREATE_CONTACT = "新增联系人"
|
||||||
|
BUTTON_UPDATE_CONTACT = "更新联系人"
|
||||||
|
LIST_LOADING = "加载中"
|
||||||
|
EMPTY_LIST = "暂无联系人"
|
||||||
|
EMPTY_SEARCH = "没找到联系人"
|
||||||
|
CLEAR_SEARCH = "清除搜索"
|
||||||
|
CONTACT_VIEW_DESC = "在此查看在列表中选中的联系人。"
|
||||||
|
|
||||||
|
[COMPOSE]
|
||||||
|
TITLE_FROM = "发送自"
|
||||||
|
TITLE_TO = "发送到"
|
||||||
|
TITLE_CC = "抄送"
|
||||||
|
TITLE_BCC = "密送"
|
||||||
|
TITLE_REPLY_TO = "回复"
|
||||||
|
TITLE_SUBJECT = "主题"
|
||||||
|
LINK_SHOW_INPUTS = "显示所有信息"
|
||||||
|
BUTTON_SEND = "发送"
|
||||||
|
BUTTON_SAVE = "保存"
|
||||||
|
BUTTON_DELETE = "删除"
|
||||||
|
BUTTON_CANCEL = "取消"
|
||||||
|
SAVED_TIME = "保存于 %TIME%"
|
||||||
|
SAVED_ERROR_ON_SEND = "邮件已发送但并未保存在已发邮件列表中。"
|
||||||
|
ATTACH_FILES = "添加附件"
|
||||||
|
ATTACH_DROP_FILES_DESC = "拖动文件至此"
|
||||||
|
ATTACH_ITEM_CANCEL = "取消"
|
||||||
|
DROPBOX = "Dropbox"
|
||||||
|
GOOGLE_DRIVE = "Google Drive"
|
||||||
|
REPLY_MESSAGE_TITLE = "%DATETIME%, %EMAIL% 写到"
|
||||||
|
FORWARD_MESSAGE_TOP_TITLE = "-------- 转发邮件 -------"
|
||||||
|
FORWARD_MESSAGE_TOP_FROM = "发送自"
|
||||||
|
FORWARD_MESSAGE_TOP_TO = "发送到"
|
||||||
|
FORWARD_MESSAGE_TOP_CC = "抄送"
|
||||||
|
FORWARD_MESSAGE_TOP_SENT = "发送"
|
||||||
|
FORWARD_MESSAGE_TOP_SUBJECT = "主题"
|
||||||
|
EMPTY_TO_ERROR_DESC = "请至少选择一位接收人"
|
||||||
|
|
||||||
|
[POPUPS_LANGUAGES]
|
||||||
|
TITLE_LANGUAGES = "选择语言"
|
||||||
|
|
||||||
|
[POPUPS_ADD_ACCOUNT]
|
||||||
|
TITLE_ADD_ACCOUNT = "添加账户?"
|
||||||
|
BUTTON_ADD_ACCOUNT = "添加"
|
||||||
|
|
||||||
|
[POPUPS_IDENTITIES]
|
||||||
|
TITLE_ADD_IDENTITY = "添加签名?"
|
||||||
|
TITLE_UPDATE_IDENTITY = "更新签名?"
|
||||||
|
BUTTON_ADD_IDENTITY = "添加"
|
||||||
|
BUTTON_UPDATE_IDENTITY = "更新"
|
||||||
|
LABEL_EMAIL = "Email"
|
||||||
|
LABEL_NAME = "姓名"
|
||||||
|
LABEL_REPLY_TO = "回复"
|
||||||
|
LABEL_BCC = "密送"
|
||||||
|
|
||||||
|
[POPUPS_CREATE_FOLDER]
|
||||||
|
TITLE_CREATE_FOLDER = "创建文件夹?"
|
||||||
|
SELECT_NO_PARENT = ""
|
||||||
|
LABEL_NAME = "文件夹名称"
|
||||||
|
LABEL_PARENT = "父文件夹"
|
||||||
|
BUTTON_CREATE = "创建"
|
||||||
|
BUTTON_CANCEL = "取消"
|
||||||
|
BUTTON_CLOSE = "关闭"
|
||||||
|
TITLE_CREATING_PROCESS = "文件夹创建中"
|
||||||
|
|
||||||
|
[POPUPS_CLEAR_FOLDER]
|
||||||
|
TITLE_CLEAR_FOLDER = "清理文件夹中所有邮件?"
|
||||||
|
BUTTON_CLEAR = "清理"
|
||||||
|
BUTTON_CANCEL = "取消"
|
||||||
|
BUTTON_CLOSE = "关闭"
|
||||||
|
DANGER_DESC_WARNING = "警告!"
|
||||||
|
DANGER_DESC_HTML_1 = "此操作将完全删除文件夹 <strong>%FOLDER%</strong> 中的所有邮件!"
|
||||||
|
DANGER_DESC_HTML_2 = "一旦操作执行,不可中断和撤销!"
|
||||||
|
TITLE_CLEARING_PROCESS = "文件夹清理中..."
|
||||||
|
|
||||||
|
[POPUPS_SYSTEM_FOLDERS]
|
||||||
|
TITLE_SYSTEM_FOLDERS = "选择系统文件夹"
|
||||||
|
SELECT_CHOOSE_ONE = "选择一个"
|
||||||
|
SELECT_UNUSE_NAME = "不使用"
|
||||||
|
LABEL_SENT = "已发邮件"
|
||||||
|
LABEL_DRAFTS = "草稿"
|
||||||
|
LABEL_SPAM = "垃圾邮件"
|
||||||
|
LABEL_TRASH = "已删除邮件"
|
||||||
|
BUTTON_CANCEL = "取消"
|
||||||
|
BUTTON_CLOSE = "关闭"
|
||||||
|
|
||||||
|
NOTIFICATION_SENT = "您没有选择 已发邮件 文件夹来存储已发送邮件。
|
||||||
|
如果您不希望保存已发邮件,请选择 不使用 选项。"
|
||||||
|
|
||||||
|
NOTIFICATION_DRAFTS = "您没有选择 草稿 文件夹来存储邮件草稿。"
|
||||||
|
|
||||||
|
NOTIFICATION_SPAM = "您没有选择 垃圾邮件 文件夹来存储垃圾邮件。
|
||||||
|
如果您希望永久删除邮件,请选择 不使用 选项。"
|
||||||
|
|
||||||
|
NOTIFICATION_TRASH = "您没有选择 已删除邮件 文件夹来存储垃圾邮件。
|
||||||
|
如果您希望永久删除邮件,请选择 不使用 选项。"
|
||||||
|
|
||||||
|
[TITLES]
|
||||||
|
LOADING = "加载中"
|
||||||
|
LOGIN = "登陆"
|
||||||
|
MAILBOX = "邮箱"
|
||||||
|
SETTINGS = "设置"
|
||||||
|
COMPOSE = "写邮件"
|
||||||
|
|
||||||
|
[UPLOAD]
|
||||||
|
ERROR_FILE_IS_TOO_BIG = "文件太大"
|
||||||
|
ERROR_FILE_PARTIALLY_UPLOADED = "遭遇未知错误,文件部分上传"
|
||||||
|
ERROR_NO_FILE_UPLOADED = "没有文件上传"
|
||||||
|
ERROR_MISSING_TEMP_FOLDER = "临时文件丢失"
|
||||||
|
ERROR_ON_SAVING_FILE = "遭遇未知错误"
|
||||||
|
ERROR_FILE_TYPE = "无效文件类型"
|
||||||
|
ERROR_UNKNOWN = "未知文件上传错误"
|
||||||
|
|
||||||
|
[EDITOR]
|
||||||
|
TEXT_SWITCHER_PLAINT_TEXT = "简单文本"
|
||||||
|
TEXT_SWITCHER_RICH_FORMATTING = "富文本"
|
||||||
|
TEXT_SWITCHER_CONFIRM = "文件格式及图片将丢失,您确定继续这么做?"
|
||||||
|
|
||||||
|
[SETTINGS_LABELS]
|
||||||
|
LABEL_PERSONAL_NAME = "个人"
|
||||||
|
LABEL_GENERAL_NAME = "一般设置"
|
||||||
|
LABEL_FOLDERS_NAME = "文件夹"
|
||||||
|
LABEL_ACCOUNTS_NAME = "账户"
|
||||||
|
LABEL_IDENTITY_NAME = "签名"
|
||||||
|
LABEL_IDENTITIES_NAME = "签名"
|
||||||
|
LABEL_SOCIAL_NAME = "Social"
|
||||||
|
LABEL_THEMES_NAME = "主题"
|
||||||
|
LABEL_CHANGE_PASSWORD_NAME = "密码"
|
||||||
|
BUTTON_BACK = "返回"
|
||||||
|
|
||||||
|
[SETTINGS_IDENTITY]
|
||||||
|
LEGEND_IDENTITY = "签名"
|
||||||
|
LABEL_DISPLAY_NAME = "名称"
|
||||||
|
LABEL_REPLY_TO = "回复"
|
||||||
|
LABEL_SIGNATURE = "签名"
|
||||||
|
|
||||||
|
[SETTINGS_GENERAL]
|
||||||
|
LEGEND_GENERAL = "一般设置"
|
||||||
|
LABEL_LANGUAGE = "语言"
|
||||||
|
LABEL_EDITOR = "默认格式"
|
||||||
|
LABEL_EDITOR_HTML_AS_DEFAULT = "Html"
|
||||||
|
LABEL_EDITOR_PLAIN_AS_DEFAULT = "Plain"
|
||||||
|
LABEL_ANIMATION = "界面动画"
|
||||||
|
LABEL_ANIMATION_FULL = "Full"
|
||||||
|
LABEL_ANIMATION_NORMAL = "Normal"
|
||||||
|
LABEL_ANIMATION_NONE = "None"
|
||||||
|
LABEL_VIEW_OPTIONS = "视图选项"
|
||||||
|
LABEL_USE_PREVIEW_PANE = "使用预览"
|
||||||
|
LABEL_USE_CHECKBOXES_IN_LIST = "列表中显示多选框"
|
||||||
|
LABEL_USE_THREADS = "使用对话"
|
||||||
|
LABEL_REPLY_SAME_FOLDER = "将回复的邮件放置到其回复的邮件所在文件夹"
|
||||||
|
LABEL_SHOW_IMAGES = "总是显示外部图片信息"
|
||||||
|
LABEL_SHOW_ANIMATION = "显示动画"
|
||||||
|
LABEL_MESSAGE_PER_PAGE = "封邮件每页"
|
||||||
|
LABEL_CHROME_NOTIFICATION = "通知"
|
||||||
|
LABEL_CHROME_NOTIFICATION_DESC = "显示新邮件弹窗"
|
||||||
|
LABEL_CHROME_NOTIFICATION_DESC_DENIED = "(被浏览器阻止)"
|
||||||
|
|
||||||
|
[SETTINGS_THEMES]
|
||||||
|
LEGEND_THEMES = "主题"
|
||||||
|
LEGEND_THEMES_CUSTOM = "自定义主题设置"
|
||||||
|
LABEL_CUSTOM_TYPE = "类型"
|
||||||
|
LABEL_CUSTOM_TYPE_LIGHT = "明亮"
|
||||||
|
LABEL_CUSTOM_TYPE_DARK = "暗沉"
|
||||||
|
LABEL_CUSTOM_BACKGROUND_IMAGE = "背景"
|
||||||
|
BUTTON_UPLOAD_BACKGROUND_IMAGE = "上传背景 (JPG, PNG)"
|
||||||
|
ERROR_FILE_IS_TOO_BIG = "文件太大 (1MB+)"
|
||||||
|
ERROR_FILE_TYPE_ERROR = "无效类型 (JPG and PNG only)"
|
||||||
|
ERROR_UNKNOWN = "上传时发生未知错误"
|
||||||
|
|
||||||
|
[SETTINGS_SOCIAL]
|
||||||
|
LEGEND_GOOGLE = "Google"
|
||||||
|
BUTTON_GOOGLE_CONNECT = "Connect Google"
|
||||||
|
BUTTON_GOOGLE_DISCONNECT = "Disconnect Google"
|
||||||
|
MAIN_GOOGLE_DESC = "After enabling login via Google, you can log into this account using Google button on the login screen."
|
||||||
|
LEGEND_FACEBOOK = "Facebook"
|
||||||
|
BUTTON_FACEBOOK_CONNECT = "Connect Facebook"
|
||||||
|
BUTTON_FACEBOOK_DISCONNECT = "Disconnect Facebook"
|
||||||
|
MAIN_FACEBOOK_DESC = "After enabling login via Facebook, you can log into this account using Facebook button on the login screen."
|
||||||
|
LEGEND_TWITTER = "Twitter"
|
||||||
|
BUTTON_TWITTER_CONNECT = "Connect Twitter"
|
||||||
|
BUTTON_TWITTER_DISCONNECT = "Disconnect Twitter"
|
||||||
|
MAIN_TWITTER_DESC = "After enabling login via Twitter, you can log into this account using Twitter button on the login screen."
|
||||||
|
|
||||||
|
[SETTINGS_FOLDERS]
|
||||||
|
LEGEND_FOLDERS = "文件夹"
|
||||||
|
BUTTON_CREATE = "新建文件夹"
|
||||||
|
BUTTON_SYSTEM = "系统文件夹设置"
|
||||||
|
BUTTON_DELETE = "删除"
|
||||||
|
BUTTON_SUBSCRIBE = "订阅"
|
||||||
|
BUTTON_UNSUBSCRIBE = "取消订阅"
|
||||||
|
LOADING_PROCESS = "文件夹列表更新"
|
||||||
|
CREATING_PROCESS = "文件夹创建中"
|
||||||
|
DELETING_PROCESS = "文件夹删除中"
|
||||||
|
RENAMING_PROCESS = "文件夹重命名"
|
||||||
|
DELETING_ASK = "确定?"
|
||||||
|
|
||||||
|
[SETTINGS_ACCOUNTS]
|
||||||
|
LEGEND_ACCOUNTS = "账户列表"
|
||||||
|
BUTTON_ADD_ACCOUNT = "添加一个账户"
|
||||||
|
BUTTON_DELETE = "删除"
|
||||||
|
LOADING_PROCESS = "更新账户列表中"
|
||||||
|
DELETING_ASK = "确定?"
|
||||||
|
|
||||||
|
[SETTINGS_IDENTITIES]
|
||||||
|
LEGEND_IDENTITY = "签名"
|
||||||
|
LEGEND_IDENTITIES = "附加签名"
|
||||||
|
LABEL_DISPLAY_NAME = "名称"
|
||||||
|
LABEL_REPLY_TO = "回复"
|
||||||
|
LABEL_SIGNATURE = "签名"
|
||||||
|
BUTTON_ADD_IDENTITY = "添加签名"
|
||||||
|
BUTTON_DELETE = "删除"
|
||||||
|
LOADING_PROCESS = "更新签名中"
|
||||||
|
DELETING_ASK = "确定?"
|
||||||
|
|
||||||
|
[SETTINGS_CHANGE_PASSWORD]
|
||||||
|
LEGEND_CHANGE_PASSWORD = "修改密码"
|
||||||
|
LABEL_CURRENT_PASSWORD = "当前密码"
|
||||||
|
LABEL_NEW_PASSWORD = "新密码"
|
||||||
|
LABEL_REPEAT_PASSWORD = "再次新密码"
|
||||||
|
BUTTON_UPDATE_PASSWORD = "设置新密码"
|
||||||
|
|
||||||
|
[NOTIFICATIONS]
|
||||||
|
INVALID_TOKEN = "无效标记"
|
||||||
|
AUTH_ERROR = "认证失败"
|
||||||
|
ACCESS_ERROR = "访问错误"
|
||||||
|
CONNECTION_ERROR = "无法连接服务器"
|
||||||
|
CAPTCHA_ERROR = "验证码不正确。"
|
||||||
|
SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE = "This social ID is not assigned for any email account yet. Log in using email credentials and add enable this feature in account settings."
|
||||||
|
SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE = "This social ID is not assigned for any email account yet. Log in using email credentials and add enable this feature in account settings."
|
||||||
|
SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE = "This social ID is not assigned for any email account yet. Log in using email credentials and add enable this feature in account settings."
|
||||||
|
DOMAIN_NOT_ALLOWED = "域不允许"
|
||||||
|
ACCOUNT_NOT_ALLOWED = "账户不允许"
|
||||||
|
CANT_GET_MESSAGE_LIST = "无法获取邮件列表"
|
||||||
|
CANT_GET_MESSAGE = "无法获取邮件"
|
||||||
|
CANT_DELETE_MESSAGE = "无法删除邮件"
|
||||||
|
CANT_MOVE_MESSAGE = "无法移动邮件"
|
||||||
|
CANT_SAVE_MESSAGE = "无法保存邮件"
|
||||||
|
CANT_SEND_MESSAGE = "无法发送邮件"
|
||||||
|
INVALID_RECIPIENTS = "无效接收人"
|
||||||
|
CANT_CREATE_FOLDER = "无法创建文件夹"
|
||||||
|
CANT_RENAME_FOLDER = "无法重命名文件夹"
|
||||||
|
CANT_DELETE_FOLDER = "无法删除文件夹"
|
||||||
|
CANT_DELETE_NON_EMPTY_FOLDER = "无法删除非空文件夹"
|
||||||
|
CANT_SUBSCRIBE_FOLDER = "无法订阅文件夹"
|
||||||
|
CANT_UNSUBSCRIBE_FOLDER = "无法取消订阅文件夹"
|
||||||
|
CANT_SAVE_SETTINGS = "无法保存设置"
|
||||||
|
CANT_SAVE_PLUGIN_SETTINGS = "无法保存设置"
|
||||||
|
DOMAIN_ALREADY_EXISTS = "域已经存在"
|
||||||
|
CANT_INSTALL_PACKAGE = "安装包失败"
|
||||||
|
CANT_DELETE_PACKAGE = "移除包失败"
|
||||||
|
INVALID_PLUGIN_PACKAGE = "无效插件"
|
||||||
|
UNSUPPORTED_PLUGIN_PACKAGE = "不支持的插件"
|
||||||
|
LICENSING_SERVER_IS_UNAVAILABLE = "订阅服务器无效"
|
||||||
|
LICENSING_DOMAIN_EXPIRED = "此域订阅服务已失效。"
|
||||||
|
LICENSING_DOMAIN_BANNED = "此域订阅服务已禁止。"
|
||||||
|
DEMO_SEND_MESSAGE_ERROR = "出于安全考虑,测试账号无法发送外部邮件。"
|
||||||
|
ACCOUNT_ALREADY_EXISTS = "账户已存在"
|
||||||
|
MAIL_SERVER_ERROR = "访问邮件服务器遇到错误。"
|
||||||
|
UNKNOWN_ERROR = "未知错误"
|
||||||
|
|
||||||
|
[STATIC]
|
||||||
|
BACK_LINK = "重新加载"
|
||||||
|
DOMAIN_LIST_DESC = "可以通过webmail访问的域列表"
|
||||||
|
PHP_EXSTENSIONS_ERROR_DESC = "需要的PHP扩展未配置!"
|
||||||
|
PHP_VERSION_ERROR_DESC = "您的PHP版本 (%VERSION%) 低于所需的 5.3.0!"
|
||||||
|
|
||||||
|
NO_SCRIPT_TITLE = "JavaScript 需要启用!"
|
||||||
|
NO_SCRIPT_DESC = "您的浏览器不支持JavaScript。
|
||||||
|
请启用浏览器的JavaScript支持并重试。"
|
||||||
|
|
||||||
|
NO_COOKIE_TITLE = "Cookies 需要启用!"
|
||||||
|
NO_COOKIE_DESC = "您的浏览器不支持Cookies。
|
||||||
|
请启用浏览器的Cookies支持并重试。"
|
||||||
|
|
||||||
|
BAD_BROWSER_TITLE = "您的浏览器过时了"
|
||||||
|
BAD_BROWSER_DESC = "为了使用所有特性,
|
||||||
|
下载并安装其中一款浏览器:"
|
||||||
|
|
@ -2299,6 +2299,8 @@ img.mfp-img {
|
||||||
.flag.flag-pt, .flag.flag-pt-pt {background-position: -112px -121px}
|
.flag.flag-pt, .flag.flag-pt-pt {background-position: -112px -121px}
|
||||||
.flag.flag-pt-br {background-position: -192px -11px}
|
.flag.flag-pt-br {background-position: -192px -11px}
|
||||||
|
|
||||||
|
.flag.flag-cn, .flag.flag-zh-tw, .flag.flag-zh-cn, .flag.flag-zh-hk {background-position: -208px -22px}
|
||||||
|
|
||||||
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
|
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
|
||||||
.clearfix {
|
.clearfix {
|
||||||
*zoom: 1;
|
*zoom: 1;
|
||||||
|
|
@ -6384,10 +6386,10 @@ html.rl-no-preview-pane #rl-right .ui-resizable-handle {
|
||||||
}
|
}
|
||||||
.popups .b-languages-content.modal {
|
.popups .b-languages-content.modal {
|
||||||
z-index: 1103;
|
z-index: 1103;
|
||||||
width: 520px;
|
width: 500px;
|
||||||
}
|
}
|
||||||
.popups .b-languages-content.exp {
|
.popups .b-languages-content.exp {
|
||||||
width: 521px;
|
width: 501px;
|
||||||
}
|
}
|
||||||
.popups .b-languages-content .modal-header {
|
.popups .b-languages-content .modal-header {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
|
|
@ -6396,7 +6398,7 @@ html.rl-no-preview-pane #rl-right .ui-resizable-handle {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
padding: 5px 15px;
|
padding: 5px 15px;
|
||||||
margin: 2px 5px;
|
margin: 2px 5px;
|
||||||
width: 200px;
|
width: 180px;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
@ -7678,6 +7680,12 @@ html.rl-message-fullscreen .messageView .b-content .buttonFull {
|
||||||
.b-admin-right .b-settings-content {
|
.b-admin-right .b-settings-content {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
}
|
}
|
||||||
|
.b-admin-general .flag-selector {
|
||||||
|
padding-top: 5px;
|
||||||
|
}
|
||||||
|
.b-admin-general .flag-name {
|
||||||
|
border-bottom: 1px dashed #555;
|
||||||
|
}
|
||||||
.b-admin-domains .process-place {
|
.b-admin-domains .process-place {
|
||||||
width: 600px;
|
width: 600px;
|
||||||
padding: 14px 0;
|
padding: 14px 0;
|
||||||
|
|
|
||||||
2
rainloop/v/0.0.0/static/css/app.min.css
vendored
2
rainloop/v/0.0.0/static/css/app.min.css
vendored
File diff suppressed because one or more lines are too long
|
|
@ -1716,11 +1716,13 @@ Utils.microtime = function ()
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {string} sLanguage
|
* @param {string} sLanguage
|
||||||
|
* @param {boolean=} bEng = false
|
||||||
* @return {string}
|
* @return {string}
|
||||||
*/
|
*/
|
||||||
Utils.convertLangName = function (sLanguage)
|
Utils.convertLangName = function (sLanguage, bEng)
|
||||||
{
|
{
|
||||||
return Utils.i18n('LANGS_NAMES/LANG_' + sLanguage.toUpperCase().replace(/[^a-zA-Z0-9]+/, '_'), null, sLanguage);
|
return Utils.i18n('LANGS_NAMES' + (true === bEng ? '_EN' : '') + '/LANG_' +
|
||||||
|
sLanguage.toUpperCase().replace(/[^a-zA-Z0-9]+/, '_'), null, sLanguage);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -4578,26 +4580,40 @@ function PopupsLanguagesViewModel()
|
||||||
this.exp = ko.observable(false);
|
this.exp = ko.observable(false);
|
||||||
|
|
||||||
this.languages = ko.computed(function () {
|
this.languages = ko.computed(function () {
|
||||||
var sCurrent = RL.data().mainLanguage();
|
|
||||||
return _.map(RL.data().languages(), function (sLanguage) {
|
return _.map(RL.data().languages(), function (sLanguage) {
|
||||||
return {
|
return {
|
||||||
'key': sLanguage,
|
'key': sLanguage,
|
||||||
'selected': sLanguage === sCurrent,
|
'selected': ko.observable(false),
|
||||||
'fullName': Utils.convertLangName(sLanguage)
|
'fullName': Utils.convertLangName(sLanguage)
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
RL.data().mainLanguage.subscribe(function () {
|
||||||
|
this.resetMainLanguage();
|
||||||
|
}, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Utils.extendAsViewModel('PopupsLanguagesViewModel', PopupsLanguagesViewModel);
|
Utils.extendAsViewModel('PopupsLanguagesViewModel', PopupsLanguagesViewModel);
|
||||||
|
|
||||||
|
PopupsLanguagesViewModel.prototype.languageEnName = function (sLanguage)
|
||||||
|
{
|
||||||
|
return Utils.convertLangName(sLanguage, true);
|
||||||
|
};
|
||||||
|
|
||||||
|
PopupsLanguagesViewModel.prototype.resetMainLanguage = function ()
|
||||||
|
{
|
||||||
|
var sCurrent = RL.data().mainLanguage();
|
||||||
|
_.each(this.languages(), function (oItem) {
|
||||||
|
oItem['selected'](oItem['key'] === sCurrent);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
PopupsLanguagesViewModel.prototype.onShow = function ()
|
PopupsLanguagesViewModel.prototype.onShow = function ()
|
||||||
{
|
{
|
||||||
// var self = this;
|
|
||||||
// _.defer(function () {
|
|
||||||
// self.exp(true);
|
|
||||||
// });
|
|
||||||
this.exp(true);
|
this.exp(true);
|
||||||
|
|
||||||
|
this.resetMainLanguage();
|
||||||
};
|
};
|
||||||
|
|
||||||
PopupsLanguagesViewModel.prototype.onHide = function ()
|
PopupsLanguagesViewModel.prototype.onHide = function ()
|
||||||
|
|
@ -4767,11 +4783,20 @@ function AdminGeneral()
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.mainLanguageFullName = ko.computed(function () {
|
||||||
|
return Utils.convertLangName(this.mainLanguage());
|
||||||
|
}, this);
|
||||||
|
|
||||||
this.languagesOptions = ko.computed(function () {
|
this.languagesOptions = ko.computed(function () {
|
||||||
return _.map(oData.languages(), function (sLanguage) {
|
return _.map(oData.languages(), function (sLanguage) {
|
||||||
|
var
|
||||||
|
sName = Utils.convertLangName(sLanguage),
|
||||||
|
sEn = Utils.convertLangName(sLanguage, true)
|
||||||
|
;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'optValue': sLanguage,
|
'optValue': sLanguage,
|
||||||
'optText': Utils.convertLangName(sLanguage)
|
'optText': sName + (sEn !== sName ? ' (' + sEn + ')' : '')
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
@ -4857,6 +4882,11 @@ AdminGeneral.prototype.onBuild = function ()
|
||||||
}, 50);
|
}, 50);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
AdminGeneral.prototype.selectLanguage = function ()
|
||||||
|
{
|
||||||
|
kn.showScreenPopup(PopupsLanguagesViewModel);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -1716,11 +1716,13 @@ Utils.microtime = function ()
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {string} sLanguage
|
* @param {string} sLanguage
|
||||||
|
* @param {boolean=} bEng = false
|
||||||
* @return {string}
|
* @return {string}
|
||||||
*/
|
*/
|
||||||
Utils.convertLangName = function (sLanguage)
|
Utils.convertLangName = function (sLanguage, bEng)
|
||||||
{
|
{
|
||||||
return Utils.i18n('LANGS_NAMES/LANG_' + sLanguage.toUpperCase().replace(/[^a-zA-Z0-9]+/, '_'), null, sLanguage);
|
return Utils.i18n('LANGS_NAMES' + (true === bEng ? '_EN' : '') + '/LANG_' +
|
||||||
|
sLanguage.toUpperCase().replace(/[^a-zA-Z0-9]+/, '_'), null, sLanguage);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -9613,26 +9615,40 @@ function PopupsLanguagesViewModel()
|
||||||
this.exp = ko.observable(false);
|
this.exp = ko.observable(false);
|
||||||
|
|
||||||
this.languages = ko.computed(function () {
|
this.languages = ko.computed(function () {
|
||||||
var sCurrent = RL.data().mainLanguage();
|
|
||||||
return _.map(RL.data().languages(), function (sLanguage) {
|
return _.map(RL.data().languages(), function (sLanguage) {
|
||||||
return {
|
return {
|
||||||
'key': sLanguage,
|
'key': sLanguage,
|
||||||
'selected': sLanguage === sCurrent,
|
'selected': ko.observable(false),
|
||||||
'fullName': Utils.convertLangName(sLanguage)
|
'fullName': Utils.convertLangName(sLanguage)
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
RL.data().mainLanguage.subscribe(function () {
|
||||||
|
this.resetMainLanguage();
|
||||||
|
}, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Utils.extendAsViewModel('PopupsLanguagesViewModel', PopupsLanguagesViewModel);
|
Utils.extendAsViewModel('PopupsLanguagesViewModel', PopupsLanguagesViewModel);
|
||||||
|
|
||||||
|
PopupsLanguagesViewModel.prototype.languageEnName = function (sLanguage)
|
||||||
|
{
|
||||||
|
return Utils.convertLangName(sLanguage, true);
|
||||||
|
};
|
||||||
|
|
||||||
|
PopupsLanguagesViewModel.prototype.resetMainLanguage = function ()
|
||||||
|
{
|
||||||
|
var sCurrent = RL.data().mainLanguage();
|
||||||
|
_.each(this.languages(), function (oItem) {
|
||||||
|
oItem['selected'](oItem['key'] === sCurrent);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
PopupsLanguagesViewModel.prototype.onShow = function ()
|
PopupsLanguagesViewModel.prototype.onShow = function ()
|
||||||
{
|
{
|
||||||
// var self = this;
|
|
||||||
// _.defer(function () {
|
|
||||||
// self.exp(true);
|
|
||||||
// });
|
|
||||||
this.exp(true);
|
this.exp(true);
|
||||||
|
|
||||||
|
this.resetMainLanguage();
|
||||||
};
|
};
|
||||||
|
|
||||||
PopupsLanguagesViewModel.prototype.onHide = function ()
|
PopupsLanguagesViewModel.prototype.onHide = function ()
|
||||||
|
|
@ -12449,14 +12465,14 @@ function WebMailDataStorage()
|
||||||
this.devPassword = '';
|
this.devPassword = '';
|
||||||
|
|
||||||
this.accountEmail = ko.observable('');
|
this.accountEmail = ko.observable('');
|
||||||
this.accountLogin = ko.observable('');
|
this.accountIncLogin = ko.observable('');
|
||||||
|
this.accountOutLogin = ko.observable('');
|
||||||
this.projectHash = ko.observable('');
|
this.projectHash = ko.observable('');
|
||||||
|
|
||||||
this.threading = ko.observable(false);
|
this.threading = ko.observable(false);
|
||||||
this.lastFoldersHash = '';
|
this.lastFoldersHash = '';
|
||||||
|
|
||||||
this.remoteSuggestions = false;
|
this.remoteSuggestions = false;
|
||||||
this.remoteChangePassword = false;
|
|
||||||
|
|
||||||
// system folders
|
// system folders
|
||||||
this.sentFolder = ko.observable('');
|
this.sentFolder = ko.observable('');
|
||||||
|
|
@ -12804,7 +12820,8 @@ WebMailDataStorage.prototype.populateDataOnStart = function()
|
||||||
AbstractData.prototype.populateDataOnStart.call(this);
|
AbstractData.prototype.populateDataOnStart.call(this);
|
||||||
|
|
||||||
this.accountEmail(RL.settingsGet('Email'));
|
this.accountEmail(RL.settingsGet('Email'));
|
||||||
this.accountLogin(RL.settingsGet('Login'));
|
this.accountIncLogin(RL.settingsGet('IncLogin'));
|
||||||
|
this.accountOutLogin(RL.settingsGet('OutLogin'));
|
||||||
this.projectHash(RL.settingsGet('ProjectHash'));
|
this.projectHash(RL.settingsGet('ProjectHash'));
|
||||||
|
|
||||||
this.displayName(RL.settingsGet('DisplayName'));
|
this.displayName(RL.settingsGet('DisplayName'));
|
||||||
|
|
@ -12814,7 +12831,6 @@ WebMailDataStorage.prototype.populateDataOnStart = function()
|
||||||
this.lastFoldersHash = RL.local().get(Enums.ClientSideKeyName.FoldersLashHash) || '';
|
this.lastFoldersHash = RL.local().get(Enums.ClientSideKeyName.FoldersLashHash) || '';
|
||||||
|
|
||||||
this.remoteSuggestions = !!RL.settingsGet('RemoteSuggestions');
|
this.remoteSuggestions = !!RL.settingsGet('RemoteSuggestions');
|
||||||
this.remoteChangePassword = !!RL.settingsGet('RemoteChangePassword');
|
|
||||||
|
|
||||||
this.devEmail = RL.settingsGet('DevEmail');
|
this.devEmail = RL.settingsGet('DevEmail');
|
||||||
this.devLogin = RL.settingsGet('DevLogin');
|
this.devLogin = RL.settingsGet('DevLogin');
|
||||||
|
|
@ -15795,7 +15811,7 @@ RainLoopApp.prototype.bootstart = function ()
|
||||||
bTwitter = this.settingsGet('AllowTwitterSocial')
|
bTwitter = this.settingsGet('AllowTwitterSocial')
|
||||||
;
|
;
|
||||||
|
|
||||||
if (!this.settingsGet('RemoteChangePassword'))
|
if (!this.settingsGet('AllowChangePassword'))
|
||||||
{
|
{
|
||||||
Utils.removeSettingsViewModel(SettingsChangePasswordScreen);
|
Utils.removeSettingsViewModel(SettingsChangePasswordScreen);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
14
rainloop/v/0.0.0/static/js/app.min.js
vendored
14
rainloop/v/0.0.0/static/js/app.min.js
vendored
File diff suppressed because one or more lines are too long
2
vendors/flags/flags-fixed.css
vendored
2
vendors/flags/flags-fixed.css
vendored
|
|
@ -30,3 +30,5 @@
|
||||||
|
|
||||||
.flag.flag-pt, .flag.flag-pt-pt {background-position: -112px -121px}
|
.flag.flag-pt, .flag.flag-pt-pt {background-position: -112px -121px}
|
||||||
.flag.flag-pt-br {background-position: -192px -11px}
|
.flag.flag-pt-br {background-position: -192px -11px}
|
||||||
|
|
||||||
|
.flag.flag-cn, .flag.flag-zh-tw, .flag.flag-zh-cn, .flag.flag-zh-hk {background-position: -208px -22px}
|
||||||
|
|
|
||||||
2
vendors/flags/flags.css
vendored
2
vendors/flags/flags.css
vendored
|
|
@ -1,7 +1,7 @@
|
||||||
.flag {
|
.flag {
|
||||||
width: 16px;
|
width: 16px;
|
||||||
height: 11px;
|
height: 11px;
|
||||||
background:url(flags.png) no-repeat
|
background:url(flags.png) no-repeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
.flag.flag-ad {background-position: -16px 0}
|
.flag.flag-ad {background-position: -16px 0}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue