mirror of
https://github.com/the-djmaze/snappymail.git
synced 2024-09-20 07:35:55 +08:00
Admin Panel localization (#467)
This commit is contained in:
parent
470b3645e2
commit
3dac6809d1
|
@ -1,6 +1,7 @@
|
|||
<?php
|
||||
|
||||
define('LANGS_PATH', __DIR__.'/../rainloop/v/0.0.0/langs');
|
||||
\define('IS_ADMIN', isset($_GET['admin']) && '1' === (string) $_GET['admin']);
|
||||
\define('LANGS_PATH', __DIR__.'/../rainloop/v/0.0.0/langs'.(IS_ADMIN ? '/admin' : ''));
|
||||
|
||||
function getLangStructure($sLangFile)
|
||||
{
|
||||
|
|
|
@ -203,10 +203,11 @@
|
|||
};
|
||||
|
||||
/**
|
||||
* @param {boolean=} bAdmin = false
|
||||
* @param {boolean=} bLogout = false
|
||||
* @param {boolean=} bClose = false
|
||||
*/
|
||||
AbstractApp.prototype.loginAndLogoutReload = function (bLogout, bClose)
|
||||
AbstractApp.prototype.loginAndLogoutReload = function (bAdmin, bLogout, bClose)
|
||||
{
|
||||
var
|
||||
kn = require('Knoin/Knoin'),
|
||||
|
@ -227,7 +228,8 @@
|
|||
window.close();
|
||||
}
|
||||
|
||||
sCustomLogoutLink = sCustomLogoutLink || './';
|
||||
sCustomLogoutLink = sCustomLogoutLink || (bAdmin ? Links.rootAdmin() : Links.rootUser());
|
||||
|
||||
if (bLogout && window.location.href !== sCustomLogoutLink)
|
||||
{
|
||||
_.delay(function () {
|
||||
|
|
|
@ -1214,7 +1214,7 @@
|
|||
{
|
||||
var self = this;
|
||||
Remote.logout(function () {
|
||||
self.loginAndLogoutReload(true,
|
||||
self.loginAndLogoutReload(false, true,
|
||||
Settings.settingsGet('ParentEmail') && 0 < Settings.settingsGet('ParentEmail').length);
|
||||
});
|
||||
};
|
||||
|
|
|
@ -49,6 +49,14 @@
|
|||
return this.sServer + '/Admin/';
|
||||
};
|
||||
|
||||
/**
|
||||
* @return {string}
|
||||
*/
|
||||
Links.prototype.rootUser = function ()
|
||||
{
|
||||
return './';
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} sDownload
|
||||
* @return {string}
|
||||
|
@ -295,9 +303,9 @@
|
|||
* @param {string} sLang
|
||||
* @return {string}
|
||||
*/
|
||||
Links.prototype.langLink = function (sLang)
|
||||
Links.prototype.langLink = function (sLang, bAdmin)
|
||||
{
|
||||
return this.sServer + '/Lang/0/' + encodeURI(sLang) + '/' + this.sVersion + '/';
|
||||
return this.sServer + '/Lang/0/' + (bAdmin ? 'Admin' : 'App') + '/' + encodeURI(sLang) + '/' + this.sVersion + '/';
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -284,11 +284,12 @@
|
|||
};
|
||||
|
||||
/**
|
||||
* @param {boolean} bAdmin
|
||||
* @param {string} sLanguage
|
||||
* @param {Function=} fDone
|
||||
* @param {Function=} fFail
|
||||
*/
|
||||
Translator.prototype.reload = function (sLanguage, fDone, fFail)
|
||||
Translator.prototype.reload = function (bAdmin, sLanguage, fDone, fFail)
|
||||
{
|
||||
var
|
||||
self = this,
|
||||
|
@ -300,7 +301,7 @@
|
|||
$html.addClass('rl-changing-language');
|
||||
|
||||
$.ajax({
|
||||
'url': require('Common/Links').langLink(sLanguage),
|
||||
'url': require('Common/Links').langLink(sLanguage, bAdmin),
|
||||
'dataType': 'script',
|
||||
'cache': true
|
||||
})
|
||||
|
|
|
@ -65,7 +65,7 @@
|
|||
{
|
||||
if (Globals.__APP__ && Globals.__APP__.loginAndLogoutReload)
|
||||
{
|
||||
Globals.__APP__.loginAndLogoutReload(true);
|
||||
Globals.__APP__.loginAndLogoutReload(false, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -77,7 +77,7 @@
|
|||
|
||||
if (!oData.ClearAuth && Globals.__APP__.loginAndLogoutReload)
|
||||
{
|
||||
Globals.__APP__.loginAndLogoutReload(true);
|
||||
Globals.__APP__.loginAndLogoutReload(false, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -33,37 +33,37 @@
|
|||
SettingsAdminScreen.prototype.setupSettings = function (fCallback)
|
||||
{
|
||||
kn.addSettingsViewModel(require('Settings/Admin/General'),
|
||||
'AdminSettingsGeneral', 'General', 'general', true);
|
||||
'AdminSettingsGeneral', 'TABS_LABELS/LABEL_GENERAL_NAME', 'general', true);
|
||||
|
||||
kn.addSettingsViewModel(require('Settings/Admin/Login'),
|
||||
'AdminSettingsLogin', 'Login', 'login');
|
||||
'AdminSettingsLogin', 'TABS_LABELS/LABEL_LOGIN_NAME', 'login');
|
||||
|
||||
kn.addSettingsViewModel(require('Settings/Admin/Branding'),
|
||||
'AdminSettingsBranding', 'Branding', 'branding');
|
||||
'AdminSettingsBranding', 'TABS_LABELS/LABEL_BRANDING_NAME', 'branding');
|
||||
|
||||
kn.addSettingsViewModel(require('Settings/Admin/Contacts'),
|
||||
'AdminSettingsContacts', 'Contacts', 'contacts');
|
||||
'AdminSettingsContacts', 'TABS_LABELS/LABEL_CONTACTS_NAME', 'contacts');
|
||||
|
||||
kn.addSettingsViewModel(require('Settings/Admin/Domains'),
|
||||
'AdminSettingsDomains', 'Domains', 'domains');
|
||||
'AdminSettingsDomains', 'TABS_LABELS/LABEL_DOMAINS_NAME', 'domains');
|
||||
|
||||
kn.addSettingsViewModel(require('Settings/Admin/Security'),
|
||||
'AdminSettingsSecurity', 'Security', 'security');
|
||||
'AdminSettingsSecurity', 'TABS_LABELS/LABEL_SECURITY_NAME', 'security');
|
||||
|
||||
kn.addSettingsViewModel(require('Settings/Admin/Social'),
|
||||
'AdminSettingsSocial', 'Integrations', 'integrations');
|
||||
'AdminSettingsSocial', 'TABS_LABELS/LABEL_INTEGRATION_NAME', 'integrations');
|
||||
|
||||
kn.addSettingsViewModel(require('Settings/Admin/Plugins'),
|
||||
'AdminSettingsPlugins', 'Plugins', 'plugins');
|
||||
'AdminSettingsPlugins', 'TABS_LABELS/LABEL_PLUGINS_NAME', 'plugins');
|
||||
|
||||
kn.addSettingsViewModel(require('Settings/Admin/Packages'),
|
||||
'AdminSettingsPackages', 'Packages', 'packages');
|
||||
'AdminSettingsPackages', 'TABS_LABELS/LABEL_PACKAGES_NAME', 'packages');
|
||||
|
||||
kn.addSettingsViewModel(require('Settings/Admin/Licensing'),
|
||||
'AdminSettingsLicensing', 'Licensing', 'licensing');
|
||||
'AdminSettingsLicensing', 'TABS_LABELS/LABEL_LICENSING_NAME', 'licensing');
|
||||
|
||||
kn.addSettingsViewModel(require('Settings/Admin/About'),
|
||||
'AdminSettingsAbout', 'About', 'about');
|
||||
'AdminSettingsAbout', 'TABS_LABELS/LABEL_ABOUT_NAME', 'about');
|
||||
|
||||
Plugins.runSettingsViewModelHooks(true);
|
||||
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
var
|
||||
ko = require('ko'),
|
||||
|
||||
Translator = require('Common/Translator'),
|
||||
|
||||
Settings = require('Storage/Settings'),
|
||||
CoreStore = require('Stores/Admin/Core')
|
||||
;
|
||||
|
@ -32,6 +34,10 @@
|
|||
this.coreRemoteRelease = CoreStore.coreRemoteRelease;
|
||||
this.coreVersionCompare = CoreStore.coreVersionCompare;
|
||||
|
||||
this.coreRemoteVersionHtmlDesc = ko.computed(function () {
|
||||
return Translator.i18n('TAB_ABOUT/HTML_NEW_VERSION', {'VERSION': this.coreRemoteVersion()});
|
||||
}, this);
|
||||
|
||||
this.statusType = ko.computed(function () {
|
||||
|
||||
var
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
Enums = require('Common/Enums'),
|
||||
Utils = require('Common/Utils'),
|
||||
|
||||
Translator = require('Common/Translator'),
|
||||
|
||||
Settings = require('Storage/Settings')
|
||||
;
|
||||
|
||||
|
@ -68,7 +70,7 @@
|
|||
var bDisabled = -1 === Utils.inArray(sValue, aSupportedTypes);
|
||||
return {
|
||||
'id': sValue,
|
||||
'name': getTypeName(sValue) + (bDisabled ? ' (not supported)' : ''),
|
||||
'name': getTypeName(sValue) + (bDisabled ? ' (' + Translator.i18n('HINTS/NOT_SUPPORTED') + ')' : ''),
|
||||
'disabled': bDisabled
|
||||
};
|
||||
});
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
Enums = require('Common/Enums'),
|
||||
Utils = require('Common/Utils'),
|
||||
Links = require('Common/Links'),
|
||||
Translator = require('Common/Translator'),
|
||||
|
||||
ThemeStore = require('Stores/Theme'),
|
||||
LanguageStore = require('Stores/Language'),
|
||||
|
@ -26,6 +27,9 @@
|
|||
{
|
||||
this.language = LanguageStore.language;
|
||||
this.languages = LanguageStore.languages;
|
||||
this.languageAdmin = LanguageStore.languageAdmin;
|
||||
this.languagesAdmin = LanguageStore.languagesAdmin;
|
||||
|
||||
this.theme = ThemeStore.theme;
|
||||
this.themes = ThemeStore.themes;
|
||||
|
||||
|
@ -59,8 +63,13 @@
|
|||
return Utils.convertLangName(this.language());
|
||||
}, this);
|
||||
|
||||
this.languageAdminFullName = ko.computed(function () {
|
||||
return Utils.convertLangName(this.languageAdmin());
|
||||
}, this);
|
||||
|
||||
this.attachmentLimitTrigger = ko.observable(Enums.SaveSettingsStep.Idle);
|
||||
this.languageTrigger = ko.observable(Enums.SaveSettingsStep.Idle);
|
||||
this.languageAdminTrigger = ko.observable(Enums.SaveSettingsStep.Idle).extend({'throttle': 100});
|
||||
this.themeTrigger = ko.observable(Enums.SaveSettingsStep.Idle);
|
||||
}
|
||||
|
||||
|
@ -76,7 +85,15 @@
|
|||
var
|
||||
f1 = Utils.settingsSaveHelperSimpleFunction(self.attachmentLimitTrigger, self),
|
||||
f2 = Utils.settingsSaveHelperSimpleFunction(self.languageTrigger, self),
|
||||
f3 = Utils.settingsSaveHelperSimpleFunction(self.themeTrigger, self)
|
||||
f3 = Utils.settingsSaveHelperSimpleFunction(self.themeTrigger, self),
|
||||
fReloadLanguageHelper = function (iSaveSettingsStep) {
|
||||
return function() {
|
||||
self.languageAdminTrigger(iSaveSettingsStep);
|
||||
_.delay(function () {
|
||||
self.languageAdminTrigger(Enums.SaveSettingsStep.Idle);
|
||||
}, 1000);
|
||||
};
|
||||
}
|
||||
;
|
||||
|
||||
self.mainAttachmentLimit.subscribe(function (sValue) {
|
||||
|
@ -91,6 +108,19 @@
|
|||
});
|
||||
});
|
||||
|
||||
self.languageAdmin.subscribe(function (sValue) {
|
||||
|
||||
self.languageAdminTrigger(Enums.SaveSettingsStep.Animate);
|
||||
|
||||
Translator.reload(true, sValue,
|
||||
fReloadLanguageHelper(Enums.SaveSettingsStep.TrueResult),
|
||||
fReloadLanguageHelper(Enums.SaveSettingsStep.FalseResult));
|
||||
|
||||
Remote.saveAdminConfig(null, {
|
||||
'LanguageAdmin': Utils.trim(sValue)
|
||||
});
|
||||
});
|
||||
|
||||
self.theme.subscribe(function (sValue) {
|
||||
|
||||
Utils.changeTheme(sValue, self.themeTrigger);
|
||||
|
@ -147,7 +177,16 @@
|
|||
|
||||
GeneralAdminSettings.prototype.selectLanguage = function ()
|
||||
{
|
||||
require('Knoin/Knoin').showScreenPopup(require('View/Popup/Languages'));
|
||||
require('Knoin/Knoin').showScreenPopup(require('View/Popup/Languages'), [
|
||||
this.language, this.languages(), LanguageStore.userLanguage()
|
||||
]);
|
||||
};
|
||||
|
||||
GeneralAdminSettings.prototype.selectLanguageAdmin = function ()
|
||||
{
|
||||
require('Knoin/Knoin').showScreenPopup(require('View/Popup/Languages'), [
|
||||
this.languageAdmin, this.languagesAdmin(), LanguageStore.userLanguageAdmin()
|
||||
]);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
function GeneralUserSettings()
|
||||
{
|
||||
this.language = LanguageStore.language;
|
||||
this.languages = LanguageStore.languages;
|
||||
this.messagesPerPage = SettingsStore.messagesPerPage;
|
||||
this.messagesPerPageArray = Consts.Defaults.MessagesPerPageArray;
|
||||
|
||||
|
@ -110,7 +111,7 @@
|
|||
|
||||
self.languageTrigger(Enums.SaveSettingsStep.Animate);
|
||||
|
||||
Translator.reload(sValue,
|
||||
Translator.reload(false, sValue,
|
||||
fReloadLanguageHelper(Enums.SaveSettingsStep.TrueResult),
|
||||
fReloadLanguageHelper(Enums.SaveSettingsStep.FalseResult));
|
||||
|
||||
|
@ -195,7 +196,9 @@
|
|||
|
||||
GeneralUserSettings.prototype.selectLanguage = function ()
|
||||
{
|
||||
require('Knoin/Knoin').showScreenPopup(require('View/Popup/Languages'));
|
||||
require('Knoin/Knoin').showScreenPopup(require('View/Popup/Languages'), [
|
||||
this.language, this.languages(), LanguageStore.userLanguage()
|
||||
]);
|
||||
};
|
||||
|
||||
module.exports = GeneralUserSettings;
|
||||
|
|
|
@ -17,23 +17,36 @@
|
|||
function LanguageStore()
|
||||
{
|
||||
this.languages = ko.observableArray([]);
|
||||
this.languagesTop = ko.observableArray([]);
|
||||
this.languagesAdmin = ko.observableArray([]);
|
||||
|
||||
this.language = ko.observable('')
|
||||
.extend({'limitedList': this.languages});
|
||||
|
||||
this.userLanguage = ko.observable('')
|
||||
.extend({'limitedList': this.languages});
|
||||
|
||||
this.languageAdmin = ko.observable('')
|
||||
.extend({'limitedList': this.languagesAdmin});
|
||||
|
||||
this.userLanguageAdmin = ko.observable('')
|
||||
.extend({'limitedList': this.languagesAdmin});
|
||||
}
|
||||
|
||||
LanguageStore.prototype.populate = function ()
|
||||
{
|
||||
var
|
||||
aLanguages = Settings.settingsGet('Languages'),
|
||||
aLanguagesTop = Settings.settingsGet('LanguagesTop')
|
||||
aLanguagesAdmin = Settings.settingsGet('LanguagesAdmin')
|
||||
;
|
||||
|
||||
this.languages(Utils.isArray(aLanguages) ? aLanguages : []);
|
||||
this.languagesTop(Utils.isArray(aLanguagesTop) ? aLanguagesTop : []);
|
||||
this.languagesAdmin(Utils.isArray(aLanguagesAdmin) ? aLanguagesAdmin : []);
|
||||
|
||||
this.language(Settings.settingsGet('Language'));
|
||||
this.languageAdmin(Settings.settingsGet('LanguageAdmin'));
|
||||
|
||||
this.userLanguage(Settings.settingsGet('UserLanguage'));
|
||||
this.userLanguageAdmin(Settings.settingsGet('UserLanguageAdmin'));
|
||||
};
|
||||
|
||||
module.exports = new LanguageStore();
|
||||
|
|
|
@ -21,7 +21,11 @@
|
|||
background-color: #fff;
|
||||
text-align: left;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 2px;
|
||||
|
||||
&.user {
|
||||
background-color: #fffddd;
|
||||
}
|
||||
&.selected {
|
||||
background-color: #f5f5f5;
|
||||
border-color: #ccc;
|
||||
|
|
|
@ -67,7 +67,7 @@
|
|||
{
|
||||
if (oData.Result)
|
||||
{
|
||||
require('App/Admin').loginAndLogoutReload();
|
||||
require('App/Admin').loginAndLogoutReload(true);
|
||||
}
|
||||
else if (oData.ErrorCode)
|
||||
{
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
PaneSettingsAdminView.prototype.logoutClick = function ()
|
||||
{
|
||||
Remote.adminLogout(function () {
|
||||
require('App/Admin').loginAndLogoutReload(true);
|
||||
require('App/Admin').loginAndLogoutReload(true, true);
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
@ -42,6 +42,10 @@
|
|||
this.activateText = ko.observable('');
|
||||
this.activateText.isError = ko.observable(false);
|
||||
|
||||
this.htmlDescription = ko.computed(function () {
|
||||
return Translator.i18n('POPUPS_ACTIVATE/HTML_DESC', {'DOMAIN': this.domain()});
|
||||
}, this);
|
||||
|
||||
this.key.subscribe(function () {
|
||||
this.activateText('');
|
||||
this.activateText.isError(false);
|
||||
|
@ -67,7 +71,7 @@
|
|||
if (true === oData.Result)
|
||||
{
|
||||
self.activationSuccessed(true);
|
||||
self.activateText('Subscription Key Activated Successfully');
|
||||
self.activateText(Translator.i18n('POPUPS_ACTIVATE/SUBS_KEY_ACTIVATED'));
|
||||
self.activateText.isError(false);
|
||||
}
|
||||
else
|
||||
|
@ -95,7 +99,7 @@
|
|||
else
|
||||
{
|
||||
this.activateProcess(false);
|
||||
this.activateText('Invalid Subscription Key');
|
||||
this.activateText(Translator.i18n('POPUPS_ACTIVATE/ERROR_INVALID_SUBS_KEY'));
|
||||
this.activateText.isError(true);
|
||||
this.key.focus(true);
|
||||
}
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
Globals = require('Common/Globals'),
|
||||
Utils = require('Common/Utils'),
|
||||
|
||||
Translator = require('Common/Translator'),
|
||||
|
||||
CapaAdminStore = require('Stores/Admin/Capa'),
|
||||
|
||||
Remote = require('Remote/Admin/Ajax'),
|
||||
|
@ -96,8 +98,9 @@
|
|||
|
||||
this.headerText = ko.computed(function () {
|
||||
var sName = this.name();
|
||||
return this.edit() ? 'Edit Domain "' + sName + '"' :
|
||||
'Add Domain' + ('' === sName ? '' : ' "' + sName + '"');
|
||||
return this.edit() ? Translator.i18n('POPUPS_DOMAIN/TITLE_EDIT_DOMAIN', {'NAME': sName}) :
|
||||
('' === sName ? Translator.i18n('POPUPS_DOMAIN/TITLE_ADD_DOMAIN') :
|
||||
Translator.i18n('POPUPS_DOMAIN/TITLE_ADD_DOMAIN_WITH_NAME', {'NAME': sName}));
|
||||
}, this);
|
||||
|
||||
this.domainIsComputed = ko.computed(function () {
|
||||
|
@ -348,12 +351,12 @@
|
|||
}
|
||||
else if (Enums.Notification.DomainAlreadyExists === oData.ErrorCode)
|
||||
{
|
||||
this.savingError('Domain already exists');
|
||||
this.savingError(Translator.i18n('ERRORS/DOMAIN_ALREADY_EXISTS'));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
this.savingError('Unknown error');
|
||||
this.savingError(Translator.i18n('ERRORS/UNKNOWN_ERROR'));
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -21,54 +21,26 @@
|
|||
{
|
||||
AbstractView.call(this, 'Popups', 'PopupsLanguages');
|
||||
|
||||
this.LanguageStore = require('Stores/Language');
|
||||
var self = this;
|
||||
|
||||
this.exp = ko.observable(false);
|
||||
this.fLang = null;
|
||||
this.sUserLanguage = '';
|
||||
|
||||
this.langs = ko.observableArray([]);
|
||||
|
||||
this.languages = ko.computed(function () {
|
||||
return _.map(this.LanguageStore.languages(), function (sLanguage) {
|
||||
return _.map(self.langs(), function (sLanguage) {
|
||||
return {
|
||||
'key': sLanguage,
|
||||
'user': sLanguage === self.sUserLanguage,
|
||||
'selected': ko.observable(false),
|
||||
'fullName': Utils.convertLangName(sLanguage)
|
||||
};
|
||||
});
|
||||
}, 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.resetMainLanguage();
|
||||
this.langs.subscribe(function () {
|
||||
this.setLanguageSelection();
|
||||
}, this);
|
||||
|
||||
kn.constructorEnd(this);
|
||||
|
@ -77,35 +49,42 @@
|
|||
kn.extendAsViewModel(['View/Popup/Languages', 'PopupsLanguagesViewModel'], LanguagesPopupView);
|
||||
_.extend(LanguagesPopupView.prototype, AbstractView.prototype);
|
||||
|
||||
LanguagesPopupView.prototype.languageEnName = function (sLanguage)
|
||||
LanguagesPopupView.prototype.languageTooltipName = function (sLanguage)
|
||||
{
|
||||
var sResult = Utils.convertLangName(sLanguage, true);
|
||||
return 'English' === sResult ? '' : sResult;
|
||||
return Utils.convertLangName(sLanguage, false) === sResult ? '' : sResult;
|
||||
};
|
||||
|
||||
LanguagesPopupView.prototype.resetMainLanguage = function ()
|
||||
LanguagesPopupView.prototype.setLanguageSelection = function ()
|
||||
{
|
||||
var sCurrent = this.LanguageStore.language();
|
||||
var sCurrent = this.fLang ? ko.unwrap(this.fLang) : '';
|
||||
_.each(this.languages(), function (oItem) {
|
||||
oItem['selected'](oItem['key'] === sCurrent);
|
||||
});
|
||||
};
|
||||
|
||||
LanguagesPopupView.prototype.onShow = function ()
|
||||
LanguagesPopupView.prototype.onShow = function (fLanguage, aLangs, sUserLanguage)
|
||||
{
|
||||
this.exp(true);
|
||||
this.fLang = fLanguage;
|
||||
this.sUserLanguage = sUserLanguage || '';
|
||||
|
||||
this.resetMainLanguage();
|
||||
this.langs(aLangs);
|
||||
};
|
||||
|
||||
LanguagesPopupView.prototype.onHide = function ()
|
||||
{
|
||||
this.exp(false);
|
||||
this.fLang = null;
|
||||
this.sUserLanguage = '';
|
||||
this.langs([]);
|
||||
};
|
||||
|
||||
LanguagesPopupView.prototype.changeLanguage = function (sLang)
|
||||
{
|
||||
this.LanguageStore.language(sLang);
|
||||
if (this.fLang)
|
||||
{
|
||||
this.fLang(sLang);
|
||||
}
|
||||
|
||||
this.cancelCommand();
|
||||
};
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
this.readmePopoverConf = {
|
||||
'placement': 'top',
|
||||
'trigger': 'hover',
|
||||
'title': 'About',
|
||||
'title': Translator.i18n('POPUPS_PLUGIN/TOOLTIP_ABOUT_TITLE'),
|
||||
'container': 'body',
|
||||
'content': function () {
|
||||
return self.readme();
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
var
|
||||
window = require('window'),
|
||||
_ = require('_'),
|
||||
$ = require('$'),
|
||||
ko = require('ko'),
|
||||
|
||||
Enums = require('Common/Enums'),
|
||||
|
@ -94,6 +93,7 @@
|
|||
|
||||
this.langRequest = ko.observable(false);
|
||||
this.language = LanguageStore.language;
|
||||
this.languages = LanguageStore.languages;
|
||||
|
||||
this.bSendLanguage = false;
|
||||
|
||||
|
@ -176,7 +176,7 @@
|
|||
}
|
||||
else
|
||||
{
|
||||
require('App/User').loginAndLogoutReload();
|
||||
require('App/User').loginAndLogoutReload(false);
|
||||
}
|
||||
}
|
||||
else if (oData.ErrorCode)
|
||||
|
@ -318,11 +318,6 @@
|
|||
{
|
||||
this.emailFocus(true);
|
||||
}
|
||||
|
||||
if (Settings.settingsGet('UserLanguage'))
|
||||
{
|
||||
$.cookie('rllang', LanguageStore.language(), {'expires': 30});
|
||||
}
|
||||
};
|
||||
|
||||
LoginUserView.prototype.onHide = function ()
|
||||
|
@ -344,7 +339,7 @@
|
|||
if (0 === iErrorCode)
|
||||
{
|
||||
self.submitRequest(true);
|
||||
require('App/User').loginAndLogoutReload();
|
||||
require('App/User').loginAndLogoutReload(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -406,10 +401,9 @@
|
|||
|
||||
self.langRequest(true);
|
||||
|
||||
Translator.reload(sValue, function() {
|
||||
Translator.reload(false, sValue, function() {
|
||||
self.langRequest(false);
|
||||
self.bSendLanguage = true;
|
||||
$.cookie('rllang', sValue, {'expires': 30});
|
||||
}, function() {
|
||||
self.langRequest(false);
|
||||
});
|
||||
|
@ -427,7 +421,9 @@
|
|||
|
||||
LoginUserView.prototype.selectLanguage = function ()
|
||||
{
|
||||
kn.showScreenPopup(require('View/Popup/Languages'));
|
||||
kn.showScreenPopup(require('View/Popup/Languages'), [
|
||||
this.language, this.languages(), LanguageStore.userLanguage()
|
||||
]);
|
||||
};
|
||||
|
||||
module.exports = LoginUserView;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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(''),
|
||||
|
|
|
@ -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.'/';
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
<form class="wrapper loginForm thm-login" action="#/" data-bind="submit: submitForm">
|
||||
<div class="controls" data-bind="css: {'error': loginError}">
|
||||
<div class="input-append">
|
||||
<input type="text" class="input-block-level inputLogin checkAutocomplete" placeholder="Login" name="RainLoopAdminLogin" id="RainLoopAdminLogin"
|
||||
autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
<input type="text" class="input-block-level inputLogin checkAutocomplete" name="RainLoopAdminLogin" id="RainLoopAdminLogin"
|
||||
autocorrect="off" autocapitalize="off" spellcheck="false" data-i18n="[placeholder]LOGIN/LABEL_LOGIN"
|
||||
data-bind="textInput: login, hasFocus: loginFocus" />
|
||||
<span class="add-on">
|
||||
<i class="icon-user"></i>
|
||||
|
@ -19,7 +19,7 @@
|
|||
<div class="controls" data-bind="css: {'error': passwordError}">
|
||||
<div class="input-append">
|
||||
<input type="password" class="input-block-level inputPassword checkAutocomplete" placeholder="Password" name="RainLoopAdminPassword" id="RainLoopAdminPassword"
|
||||
autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
autocorrect="off" autocapitalize="off" spellcheck="false" data-i18n="[placeholder]LOGIN/LABEL_PASSWORD"
|
||||
data-bind="textInput: password" />
|
||||
<span class="add-on">
|
||||
<i class="icon-key"></i>
|
||||
|
@ -29,7 +29,7 @@
|
|||
<div class="controls">
|
||||
<button type="submit" class="btn btn-large btn-block buttonLogin" data-bind="command: submitCommand">
|
||||
<i class="icon-spinner animated" data-bind="visible: submitRequest"></i>
|
||||
<span data-bind="visible: !submitRequest()">Log into the admin panel</span>
|
||||
<span data-bind="visible: !submitRequest()" data-i18n="LOGIN/BUTTON_LOGIN"></span>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
|
|
@ -5,9 +5,9 @@
|
|||
<i class="icon-spinner animated" style="margin-top: 2px" data-bind="style: {'visibility': adminManLoadingVisibility }"></i>
|
||||
|
||||
RainLoop
|
||||
<span data-bind="visible: capa">(Premium)</span>
|
||||
<span data-bind="visible: capa">(<span data-i18n="TOP_PANEL/LABEL_PREMIUM"></span>)</span>
|
||||
—
|
||||
Admin Panel
|
||||
<span data-i18n="TOP_PANEL/LABEL_ADMIN_PANEL"></span>
|
||||
|
||||
(<span data-bind="text: adminDomain"></span>)
|
||||
</h4>
|
||||
|
|
|
@ -1,15 +1,13 @@
|
|||
<div class="b-admin-about">
|
||||
<div class="form-horizontal">
|
||||
<div class="legend">
|
||||
About
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_ABOUT/LEGEND_ABOUT"></div>
|
||||
<div class="row" style="min-width: 800px;">
|
||||
<div class="span4">
|
||||
<div class="rl-logo"></div>
|
||||
<div style="margin-left: 45px;">
|
||||
2014 © All Rights Reserved.
|
||||
2015 © <span data-i18n="TAB_ABOUT/LABEL_ALL_RIGHTS_RESERVED"></span>
|
||||
<br />
|
||||
<a class="g-ui-link" href="http://rainloop.net/" target="_blank">http://rainloop.net/</a>
|
||||
<a class="g-ui-link" href="http://www.rainloop.net/" target="_blank">http://rainloop.net/</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="span8 rl-desc">
|
||||
|
@ -20,7 +18,7 @@
|
|||
(<span data-bind="text: coreType"></span> channel)
|
||||
</span>
|
||||
</h4>
|
||||
<h4 style="color: #aaa; font-weight: normal;">Simple, modern & fast web-based email client</h4>
|
||||
<h4 style="color: #aaa; font-weight: normal;" data-i18n="TAB_ABOUT/LABEL_TAG_HINT"></h4>
|
||||
<h5 style="font-weight: normal; margin-top: 40px;">
|
||||
<div data-bind="visible: 'error' === statusType()">
|
||||
<i class="icon-warning" style="color: red"></i>
|
||||
|
@ -30,9 +28,7 @@
|
|||
<div data-bind="visible: 'available' === statusType()">
|
||||
<i class="icon-bolt" style="color: red"></i>
|
||||
|
||||
New
|
||||
<b data-bind="text: coreRemoteVersion"></b>
|
||||
version is available.
|
||||
<span data-bind="html: coreRemoteVersionHtmlDesc"></span>
|
||||
<span data-bind="visible: '' !== coreRemoteRelease()">
|
||||
(<span data-bind="text: coreRemoteRelease"></span>)
|
||||
</span>
|
||||
|
@ -41,9 +37,9 @@
|
|||
<br />
|
||||
<i class="icon-warning" style="color: red"></i>
|
||||
|
||||
<b>Warning!</b>
|
||||
<b data-i18n="HINTS/WARNING"></b>
|
||||
|
||||
Please read the change log before updating.
|
||||
<span data-i18n="TAB_ABOUT/HINT_READ_CHANGE_LOG"></span>
|
||||
<br />
|
||||
</span>
|
||||
<br />
|
||||
|
@ -51,38 +47,38 @@
|
|||
<a class="btn" data-bind="click: updateCoreData">
|
||||
<i class="icon-sync"></i>
|
||||
|
||||
Update
|
||||
<span data-i18n="TAB_ABOUT/BUTTON_UPDATE"></span>
|
||||
</a>
|
||||
|
||||
</span>
|
||||
<span data-bind="visible: coreAccess()">
|
||||
<a class="btn" href="http://rainloop.net/downloads/" target="_blank">
|
||||
<a class="btn" href="http://www.rainloop.net/downloads/" target="_blank">
|
||||
<i class="icon-download"></i>
|
||||
|
||||
Download
|
||||
<span data-i18n="TAB_ABOUT/BUTTON_DOWNLOAD"></span>
|
||||
</a>
|
||||
|
||||
<a class="btn" href="http://rainloop.net/changelog/" target="_blank">
|
||||
<a class="btn" href="http://www.rainloop.net/changelog/" target="_blank">
|
||||
<i class="icon-file-text"></i>
|
||||
|
||||
Changelog
|
||||
<span data-i18n="TAB_ABOUT/BUTTON_CHANGELOG"></span>
|
||||
</a>
|
||||
</span>
|
||||
</div>
|
||||
<div data-bind="visible: 'up-to-date' === statusType()">
|
||||
<i class="icon-ok" style="color: green"></i>
|
||||
|
||||
RainLoop is up to date.
|
||||
<span data-i18n="TAB_ABOUT/HINT_IS_UP_TO_DATE"></span>
|
||||
</div>
|
||||
<div data-bind="visible: 'updating' === statusType()">
|
||||
<i class="icon-spinner animated"></i>
|
||||
|
||||
Updating…
|
||||
<span data-i18n="TAB_ABOUT/LABEL_UPDATING"></span>…
|
||||
</div>
|
||||
<div data-bind="visible: 'checking' === statusType()">
|
||||
<i class="icon-spinner animated"></i>
|
||||
|
||||
Checking for updates…
|
||||
<span data-i18n="TAB_ABOUT/LABEL_CHECKING"></span>…
|
||||
</div>
|
||||
</h5>
|
||||
</div>
|
||||
|
|
|
@ -1,12 +1,8 @@
|
|||
<div class="b-admin-branding">
|
||||
<div class="form-horizontal">
|
||||
<div class="legend">
|
||||
Branding
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_BRANDING/LEGEND_BRANDING"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Page Title
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_BRANDING/LABEL_PAGE_TITLE"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Input',
|
||||
|
@ -19,9 +15,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Loading Description
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_BRANDING/LABEL_LOADING_DESCRIPTION"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Input',
|
||||
|
@ -36,13 +30,9 @@
|
|||
</div>
|
||||
<br />
|
||||
<div class="form-horizontal" data-bind="css: {'disabled-form': !capa()}">
|
||||
<div class="legend">
|
||||
Login
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_BRANDING/LEGEND_LOGIN"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Logo
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_BRANDING/LABEL_LOGIN_LOGO"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Input',
|
||||
|
@ -57,9 +47,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Description
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_BRANDING/LABEL_LOGIN_DESCRIPTION"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Input',
|
||||
|
@ -73,9 +61,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Background
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_BRANDING/LABEL_LOGIN_BACKGROUND"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Input',
|
||||
|
@ -90,9 +76,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Custom CSS
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_BRANDING/LABEL_LOGIN_CUSTOM_CSS"></label>
|
||||
<div class="controls">
|
||||
<div class="custom-css-wrapper" data-bind="component: {
|
||||
name: 'TextArea',
|
||||
|
@ -112,20 +96,16 @@
|
|||
name: 'Checkbox',
|
||||
params: {
|
||||
enable: capa,
|
||||
label: 'Show "Powered by RainLoop" link',
|
||||
label: 'TAB_BRANDING/LABEL_LOGIN_SHOW_POWERED_LINK',
|
||||
value: loginPowered
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="legend">
|
||||
User
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_BRANDING/LEGEND_USER"></div>
|
||||
<!--
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Logo
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_BRANDING/LABEL_USER_LOGO"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Input',
|
||||
|
@ -141,9 +121,7 @@
|
|||
</div>
|
||||
-->
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Custom CSS
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_BRANDING/LABEL_USER_CUSTOM_CSS"></label>
|
||||
<div class="controls">
|
||||
<div class="custom-css-wrapper" data-bind="component: {
|
||||
name: 'TextArea',
|
||||
|
@ -158,9 +136,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="row" data-bind="visible: !capa()">
|
||||
<div class="alert span8" style="margin-top: 10px;">
|
||||
This functionality is available for <strong><a href="#/licensing">Premium</a></strong> subscribers.
|
||||
</div>
|
||||
<div class="alert span8" style="margin-top: 10px;" data-i18n="[html]TAB_BRANDING/HTML_ALERT_PREMIUM"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,38 +1,30 @@
|
|||
<div class="b-admin-general">
|
||||
<div class="row" data-bind="visible: !contactsSupported">
|
||||
<div class="alert span8" style="margin-top: 10px;">
|
||||
<h4>Notice!</h4>
|
||||
<h4 data-i18n="TAB_CONTACTS/ALERT_NOTICE"></h4>
|
||||
<br />
|
||||
Your system doesn't support contacts.
|
||||
<br />
|
||||
You need to install or enable <strong>PDO (SQLite / MySQL / PostgreSQL)</strong> exstenstion on your server.
|
||||
<div data-i18n="[html]TAB_CONTACTS/HTML_ALERT_DOES_NOT_SUPPORTED"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-horizontal" data-bind="visible: contactsSupported">
|
||||
<div class="legend">
|
||||
Contacts
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_CONTACTS/LEGEND_CONTACTS"></div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: enableContacts, label: 'Enable contacts' }
|
||||
params: { value: enableContacts, label: 'TAB_CONTACTS/LABEL_ENABLE_CONTACTS' }
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: contactsSync, label: 'Allow contacts sync (with external CardDAV server)' }
|
||||
params: { value: contactsSync, label: 'TAB_CONTACTS/LABEL_ALLOW_SYNC' }
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-horizontal" data-bind="visible: contactsSupported">
|
||||
<div class="legend">
|
||||
Storage (PDO)
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_CONTACTS/LEGEND_STORAGE"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Type
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_CONTACTS/LABEL_STORAGE_TYPE"></label>
|
||||
<div class="controls">
|
||||
<select data-bind="options: contactsTypesOptions, value: mainContactsType,
|
||||
optionsText: 'name', optionsValue: 'id', optionsAfterRender: defautOptionsAfterRender, saveTrigger: contactsTypeTrigger"></select>
|
||||
|
@ -42,26 +34,21 @@
|
|||
<br />
|
||||
<div data-bind="visible: 'sqlite' !== contactsType()">
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Dsn
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_CONTACTS/LABEL_STORAGE_DSN"></label>
|
||||
<div class="controls">
|
||||
<input type="text" class="span6" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="value: pdoDsn, saveTrigger: pdoDsnTrigger" />
|
||||
<div data-bind="saveTrigger: pdoDsnTrigger"></div>
|
||||
<blockquote style="margin: 10px 0 0 0">
|
||||
<p class="muted">
|
||||
mysql:host=127.0.0.1;port=3306;dbname=rainloop
|
||||
<br />
|
||||
pgsql:host=127.0.0.1;port=5432;dbname=rainloop
|
||||
mysql:host=127.0.0.1;port=3306;dbname=rainloop<br />
|
||||
pgsql:host=127.0.0.1;port=5432;dbname=rainloop
|
||||
</p>
|
||||
</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
User
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_CONTACTS/LABEL_STORAGE_USER"></label>
|
||||
<div class="controls">
|
||||
<input type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="value: pdoUser, saveTrigger: pdoUserTrigger" />
|
||||
|
@ -69,9 +56,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Password
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_CONTACTS/LABEL_STORAGE_PASSWORD"></label>
|
||||
<div class="controls">
|
||||
<input type="password" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="value: pdoPassword, saveTrigger: pdoPasswordTrigger" />
|
||||
|
@ -83,7 +68,7 @@
|
|||
<a class="btn" data-bind="command: testContactsCommand, css: { 'btn-success': testContactsSuccess, 'btn-danger': testContactsError }">
|
||||
<i data-bind="css: {'icon-info': !testing(), 'icon-spinner animated': testing(), 'icon-white': testContactsSuccess() || testContactsError() }"></i>
|
||||
|
||||
Test
|
||||
<span data-i18n="TAB_CONTACTS/BUTTON_TEST"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -92,9 +77,9 @@
|
|||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div class="alert alert-null-left-margin span8">
|
||||
<h4>Notice!</h4>
|
||||
<h4 data-i18n="TAB_CONTACTS/ALERT_NOTICE"></h4>
|
||||
<br />
|
||||
Don't use this database type with a large number of active users.
|
||||
<div data-i18n="[html]TAB_CONTACTS/HTML_ALERT_DO_NOT_USE_THIS_DATABASE"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -103,7 +88,7 @@
|
|||
<a class="btn" data-bind="command: testContactsCommand, css: { 'btn-success': testContactsSuccess, 'btn-danger': testContactsError }">
|
||||
<i data-bind="css: {'icon-info': !testing(), 'icon-spinner animated': testing(), 'icon-white': testContactsSuccess() || testContactsError() }"></i>
|
||||
|
||||
Test
|
||||
<span data-i18n="TAB_CONTACTS/BUTTON_TEST"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
</td>
|
||||
<td>
|
||||
<a class="btn btn-small btn-small-small btn-danger pull-right button-delete button-delete-transitions" data-bind="css: {'delete-access': deleteAccess()}, click: function(oDomain) { $root.deleteDomain(oDomain); }">
|
||||
<span>Are you sure?</span>
|
||||
<span data-i18n="TAB_DOMAINS/DELETE_ARE_YOU_SURE"></span>
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
|
|
|
@ -1,21 +1,15 @@
|
|||
<div class="b-admin-domains g-ui-user-select-none">
|
||||
<div class="legend">
|
||||
Domains
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_DOMAINS/LEGEND_DOMAINS"></div>
|
||||
<div>
|
||||
<a class="btn" data-bind="click: createDomain">
|
||||
<i class="icon-plus"></i>
|
||||
|
||||
Add Domain
|
||||
<span data-i18n="TAB_DOMAINS/BUTTON_ADD_DOMAIN"></span>
|
||||
</a>
|
||||
<br />
|
||||
<br />
|
||||
<blockquote>
|
||||
<p class="muted">
|
||||
List of domains webmail is allowed to access.
|
||||
<br />
|
||||
Click on the name to configure the domain.
|
||||
</p>
|
||||
<p class="muted" data-i18n="[html]TAB_DOMAINS/HTML_DOMAINS_HELPER"></p>
|
||||
</blockquote>
|
||||
<table class="table table-hover b-admin-domains-list-table" data-bind="i18nUpdate: domains">
|
||||
<colgroup>
|
||||
|
|
|
@ -1,22 +1,15 @@
|
|||
<div class="b-admin-general">
|
||||
<div class="row" data-bind="visible: weakPassword">
|
||||
<div class="alert alert-error span8" style="margin-top: 10px;">
|
||||
<h4>Warning!</h4>
|
||||
<h4 data-i18n="TAB_GENERAL/ALERT_WARNING"></h4>
|
||||
<br />
|
||||
You are using the default admin password.
|
||||
<br />
|
||||
For security reasons please <strong><a href="#/security">change</a></strong>
|
||||
password to something else now.
|
||||
<div data-i18n="[html]TAB_GENERAL/HTML_ALERT_WEAK_PASSWORD"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-horizontal">
|
||||
<div class="legend">
|
||||
Interface
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Language
|
||||
</label>
|
||||
<div class="legend i18n i18n-animation" data-i18n="TAB_GENERAL/LEGEND_INTERFACE"></div>
|
||||
<div class="control-group" style="margin-bottom: 10px;">
|
||||
<label class="control-label" data-i18n="TAB_GENERAL/LABEL_LANGUAGE"></label>
|
||||
<div class="controls">
|
||||
<div class="flag-selector">
|
||||
<span class="flag-wrapper">
|
||||
|
@ -32,9 +25,23 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Theme
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_GENERAL/LABEL_LANGUAGE_ADMIN"></label>
|
||||
<div class="controls">
|
||||
<div class="flag-selector">
|
||||
<span class="flag-wrapper">
|
||||
<span data-bind="css: 'flag flag-' + languageAdmin()" style=""></span>
|
||||
</span>
|
||||
<span class="flag-name" data-bind="text: languageAdminFullName, click: selectLanguageAdmin"></span>
|
||||
|
||||
<div data-bind="component: {
|
||||
name: 'SaveTrigger',
|
||||
params: { value: languageAdminTrigger }
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_GENERAL/LABEL_THEME"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Select',
|
||||
|
@ -54,21 +61,21 @@
|
|||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'Allow language selection on settings screen',
|
||||
label: 'TAB_GENERAL/LABEL_ALLOW_LANGUAGES_ON_SETTINGS',
|
||||
value: allowLanguagesOnSettings
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'Allow theme selection on settings screen',
|
||||
label: 'TAB_GENERAL/LABEL_ALLOW_THEMES_ON_SETTINGS',
|
||||
value: capaThemes
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'Allow background selection on settings screen',
|
||||
label: 'TAB_GENERAL/LABEL_ALLOW_BACKGROUND_ON_SETTINGS',
|
||||
value: capaUserBackground
|
||||
}
|
||||
}"></div>
|
||||
|
@ -79,7 +86,7 @@
|
|||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'Show thumbnails (attachments)',
|
||||
label: 'TAB_GENERAL/LABEL_SHOW_THUMBNAILS',
|
||||
value: capaAttachmentThumbnails,
|
||||
inline: false
|
||||
}
|
||||
|
@ -87,7 +94,7 @@
|
|||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'Allow Gravatar',
|
||||
label: 'TAB_GENERAL/LABEL_ALLOW_GRAVATAR',
|
||||
value: capaGravatar,
|
||||
inline: true
|
||||
}
|
||||
|
@ -95,14 +102,9 @@
|
|||
(<a class="g-ui-link" href="http://en.gravatar.com/" target="_blank">http://en.gravatar.com/</a>)
|
||||
</div>
|
||||
</div>
|
||||
<div class="legend">
|
||||
Main
|
||||
</div>
|
||||
<div class="legend i18n i18n-animation" data-i18n="TAB_GENERAL/LEGEND_MAIN"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Attachment
|
||||
size limit
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_GENERAL/LABEL_ATTACHMENT_SIZE_LIMIT"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Input',
|
||||
|
@ -132,7 +134,7 @@
|
|||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'Allow additional accounts',
|
||||
label: 'TAB_GENERAL/LABEL_ALLOW_ADDITIONAL_ACCOUNTS',
|
||||
value: capaAdditionalAccounts
|
||||
}
|
||||
}"></div>
|
||||
|
@ -144,7 +146,7 @@
|
|||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'Allow templates',
|
||||
label: 'TAB_GENERAL/LABEL_ALLOW_TEMPLATES',
|
||||
value: capaTemplates
|
||||
}
|
||||
}"></div>
|
||||
|
|
|
@ -1,24 +1,21 @@
|
|||
<div class="b-admin-licensing" >
|
||||
<div class="row">
|
||||
<div class="alert alert-info span8" style="margin-top: 10px;">
|
||||
RainLoop Webmail is licensed under <strong>Creative Commons
|
||||
<span data-i18n="[html]TAB_LICENSING/HTML_ALERT_TOP_1"></span>
|
||||
<br />
|
||||
Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</strong> license.
|
||||
<b>Creative Commons Attribution-NonCommercial-ShareAlike 3.0 (CC BY-NC-SA)</b>.
|
||||
<br />
|
||||
<br />
|
||||
You are <strong>free</strong> to use it for your <strong>personal</strong> projects.
|
||||
<span data-i18n="[html]TAB_LICENSING/HTML_ALERT_TOP_2"></span>
|
||||
<br />
|
||||
<br />
|
||||
Commercial use (with additional features) of <strong>RainLoop Webmail</strong> requires getting a
|
||||
<a href="http://rainloop.net/purchase/" target="_blank">subscription</a>.
|
||||
<span data-i18n="[html]TAB_LICENSING/HTML_ALERT_TOP_3"></span>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<div class="form-horizontal">
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Your domain
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_LICENSING/LABEL_YOUR_DOMAIN"></label>
|
||||
<div class="controls">
|
||||
<span class="help-inline" style="padding-top: 5px;">
|
||||
<strong data-bind="text: adminDomain"></strong>
|
||||
|
@ -26,50 +23,40 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="control-group" data-bind="visible: !subscriptionEnabled()">
|
||||
<label class="control-label" style="padding-top: 20px">
|
||||
Version
|
||||
</label>
|
||||
<label class="control-label" style="padding-top: 14px" data-i18n="TAB_LICENSING/LABEL_VERSION"></label>
|
||||
<div class="controls">
|
||||
<div class="alert alert-block span6" style="margin-left: 0">
|
||||
<h4>
|
||||
Basic
|
||||
<span data-bind="visible: licenseIsUnlim()"> (Unlim)</span>
|
||||
</h4>
|
||||
<h4 data-i18n="TAB_LICENSING/TYPE_BASIC"></h4>
|
||||
<br />
|
||||
<p>
|
||||
This domain can't be licensed.
|
||||
</p>
|
||||
<p data-i18n="TAB_LICENSING/TYPE_BASIC_HINT_2"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" data-bind="visible: subscriptionEnabled">
|
||||
<label class="control-label" style="padding-top: 20px">
|
||||
Version
|
||||
</label>
|
||||
<label class="control-label" style="padding-top: 20px" data-i18n="TAB_LICENSING/LABEL_VERSION"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="visible: licensingProcess()" style="padding-top: 20px">
|
||||
<i class="icon-spinner animated"></i>
|
||||
|
||||
Checking…
|
||||
<span data-i18n="TAB_LICENSING/LABEL_CHECKING"></span>…
|
||||
</div>
|
||||
<div data-bind="visible: !licensingProcess()">
|
||||
<div class="alert alert-block span6" style="margin-left: 0; padding-top: 20px" data-bind="visible: !licensing()">
|
||||
<h4>
|
||||
Basic
|
||||
</h4>
|
||||
<h4 data-i18n="TAB_LICENSING/TYPE_BASIC"></h4>
|
||||
<br />
|
||||
<p>
|
||||
This domain isn't licensed for commercial use (with additional features).
|
||||
</p>
|
||||
<p data-i18n="TAB_LICENSING/TYPE_BASIC_HINT"></p>
|
||||
</div>
|
||||
<div data-bind="visible: licensing()">
|
||||
<div class="alert alert-success span6" style="margin-left: 0; margin-top: 10px; padding-top: 20px" data-bind="visible: licenseValid() && '' === licenseError()">
|
||||
<h4>
|
||||
Premium
|
||||
<span data-bind="visible: licenseIsUnlim()">(Lifetime)</span>
|
||||
<snan data-i18n="TAB_LICENSING/TYPE_PREMIUM"></snan>
|
||||
<span data-bind="visible: licenseIsUnlim()">
|
||||
|
||||
(<snan data-i18n="TAB_LICENSING/TYPE_PREMIUM_LIFETIME"></snan>)
|
||||
</span>
|
||||
</h4>
|
||||
<p data-bind="visible: 0 < licenseExpired()" style="padding-top: 10px">
|
||||
<b>Subscription expires:</b>
|
||||
<b data-i18n="TAB_LICENSING/LABEL_SUB_EXPIRES"></b>
|
||||
|
||||
<span data-bind="text: licenseExpiredMomentValue()"></span>
|
||||
</p>
|
||||
|
@ -84,19 +71,19 @@
|
|||
<a class="btn" data-bind="click: showActivationForm">
|
||||
<i class="icon-happy-smiley"></i>
|
||||
|
||||
Activate Subscription Key for this domain
|
||||
<span data-i18n="TAB_LICENSING/BUTTON_ACTIVATE"></span>
|
||||
</a>
|
||||
|
||||
<a class="btn" href="http://rainloop.net/purchase/" target="_black">
|
||||
<i class="icon-purchase"></i>
|
||||
|
||||
Purchase
|
||||
<span data-i18n="TAB_LICENSING/BUTTON_PURCHASE"></span>
|
||||
</a>
|
||||
|
||||
<a class="btn" data-bind="click: showTrialForm, visible: !licensing()">
|
||||
<i class="icon-eye"></i>
|
||||
|
||||
Trial
|
||||
<span data-i18n="TAB_LICENSING/BUTTON_TRIAL"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,12 +1,8 @@
|
|||
<div class="b-admin-general">
|
||||
<div class="form-horizontal">
|
||||
<div class="legend">
|
||||
Login Screen
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_LOGIN/LEGEND_LOGIN_SCREEN"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Default Domain
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_LOGIN/LABEL_DEFAULT_DOMAIN"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Input',
|
||||
|
@ -22,16 +18,16 @@
|
|||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: determineUserDomain, label: 'Try to determine user domain' }
|
||||
params: { value: determineUserDomain, label: 'TAB_LOGIN/LABEL_DETERMINE_USER_DOMAIN' }
|
||||
}"></div>
|
||||
<br />
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: allowLanguagesOnLogin, label: 'Allow language selection on login screen' }
|
||||
params: { value: allowLanguagesOnLogin, label: 'TAB_LOGIN/LABEL_ALLOW_LANGUAGES_ON_LOGIN' }
|
||||
}"></div>
|
||||
<div data-bind="visible: allowLanguagesOnLogin, component: {
|
||||
name: 'Checkbox',
|
||||
params: { enable: allowLanguagesOnLogin, value: determineUserLanguage, label: 'Try to determine user language' }
|
||||
params: { enable: allowLanguagesOnLogin, value: determineUserLanguage, label: 'TAB_LOGIN/LABEL_DETERMINE_USER_LANGUAGE' }
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
<div class="b-admin-packages">
|
||||
|
||||
<div class="alert" style="margin-top: 10px;" data-bind="visible: !packagesReal() && !packages.loading()">
|
||||
Cannot access the repository at the moment.
|
||||
</div>
|
||||
<div class="alert" style="margin-top: 10px;" data-bind="visible: !packagesReal() && !packages.loading()"
|
||||
data-i18n="TAB_PACKAGES/ALERT_CANNOT_ACCESS_REPOSITORY"></div>
|
||||
|
||||
<div class="alert" style="margin-top: 10px;" data-bind="visible: '' !== packagesError()">
|
||||
<button type="button" class="close" data-bind="click: function () { packagesError('') }">×</button>
|
||||
|
@ -11,24 +10,21 @@
|
|||
|
||||
<div data-bind="visible: 0 < packagesAvailableForUpdate().length">
|
||||
<div class="legend">
|
||||
Available for Update (<span data-bind="text: packagesAvailableForUpdate().length"></span>)
|
||||
<span data-i18n="TAB_PACKAGES/LEGEND_AVAILABLE_FOR_UPDATE"></span>
|
||||
(<span data-bind="text: packagesAvailableForUpdate().length"></span>)
|
||||
</div>
|
||||
<div data-bind="template: { name: 'AdminSettingsPackagesTable', data: {f: packagesAvailableForUpdate} }"></div>
|
||||
<br />
|
||||
</div>
|
||||
|
||||
<div data-bind="visible: 0 < packagesCurrent().length">
|
||||
<div class="legend">
|
||||
Installed Packages
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_PACKAGES/LEGEND_INSTALLED_PACKAGES"></div>
|
||||
<div data-bind="template: { name: 'AdminSettingsPackagesTable', data: {f: packagesCurrent} }"></div>
|
||||
<br />
|
||||
</div>
|
||||
|
||||
<div data-bind="visible: 0 < packagesAvailableForInstallation().length">
|
||||
<div class="legend">
|
||||
Available for Installation
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_PACKAGES/LEGEND_AVAILABLE_FOR_INSTALLATION"></div>
|
||||
<div data-bind="template: { name: 'AdminSettingsPackagesTable', data: {f: packagesAvailableForInstallation} }"></div>
|
||||
<br />
|
||||
</div>
|
||||
|
|
|
@ -7,11 +7,6 @@
|
|||
</td>
|
||||
<td class="package-version-parent">
|
||||
<span class="package-version" data-bind="text: version"></span>
|
||||
<div data-bind="if: release_notes">
|
||||
<nobr>
|
||||
<a data-bind="attr: {href: release_notes}" target="_blank">release notes</a>
|
||||
</nobr>
|
||||
</div>
|
||||
</td>
|
||||
<td class="package-release-parent">
|
||||
<span class="package-release" data-bind="text: release"></span>
|
||||
|
|
|
@ -7,30 +7,23 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="legend">
|
||||
Plugins
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_PLUGINS/LEGEND_PLUGINS"></div>
|
||||
|
||||
<div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: enabledPlugins, label: 'Enable plugins' }
|
||||
params: { value: enabledPlugins, label: 'TAB_PLUGINS/LABEL_ENABLE_PLUGINS' }
|
||||
}"></div>
|
||||
</div>
|
||||
<br />
|
||||
<div class="row">
|
||||
<div class="alert alert-info span8" data-bind="visible: 0 === plugins().length">
|
||||
No plugins have yet been installed.
|
||||
<br />
|
||||
<br />
|
||||
<strong><a href="#/packages">Click here to install new!</a></strong>
|
||||
<span data-i18n="TAB_PLUGINS/ALERT_NO_PLUGINS"></span>
|
||||
<br /><br />
|
||||
<strong><a href="#/packages" data-i18n="TAB_PLUGINS/LINK_INSTALL_NEW"></a></strong>
|
||||
</div>
|
||||
<div class="span8" data-bind="visible: 0 < plugins().length">
|
||||
<blockquote>
|
||||
<p class="muted">
|
||||
Click on the name to configure the plugin.
|
||||
</p>
|
||||
</blockquote>
|
||||
<blockquote><p class="muted" data-i18n="TAB_PLUGINS/HINT_CLICK_NAME"></p></blockquote>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
|
|
|
@ -1,40 +1,36 @@
|
|||
<div class="adminSecurity g-ui-user-select-none">
|
||||
<div class="form-horizontal">
|
||||
<div class="legend">
|
||||
Security
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_SECURITY/LEGEND_SECURITY"></div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: capaTwoFactorAuth, label: 'Allow 2-Step Verification' }
|
||||
params: { value: capaTwoFactorAuth, label: 'TAB_SECURITY/LABEL_ALLOW_TWO_STEP' }
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: useLocalProxyForExternalImages, label: 'Use local proxy for external images' }
|
||||
params: { value: useLocalProxyForExternalImages, label: 'TAB_SECURITY/LABEL_USE_IMAGE_PROXY' }
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: capaOpenPGP, label: 'Allow OpenPGP', inline: true }
|
||||
params: { value: capaOpenPGP, label: 'TAB_SECURITY/LABEL_ALLOW_OPEN_PGP', inline: true }
|
||||
}"></div>
|
||||
|
||||
<span style="color:red">(beta)</span>
|
||||
<span style="color:red">(<span data-i18n="HINTS/BETA"></span>)</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<a href="#" target="_blank" class="g-ui-link" data-bind="link: phpInfoLink()">Show PHP information</a>
|
||||
<a href="#" target="_blank" class="g-ui-link" data-bind="link: phpInfoLink()"
|
||||
data-i18n="TAB_SECURITY/LABEL_SHOW_PHP_INFO"></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<div class="form-horizontal">
|
||||
<div class="legend">
|
||||
Admin Panel Access Credentials
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_SECURITY/LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Current password
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_SECURITY/LABEL_CURRENT_PASSWORD"></label>
|
||||
<div class="controls">
|
||||
<input type="password" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: adminPassword" />
|
||||
|
@ -42,27 +38,21 @@
|
|||
</div>
|
||||
<br />
|
||||
<div class="control-group" data-bind="css: {'error': adminLoginError}">
|
||||
<label class="control-label">
|
||||
New login
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_SECURITY/LABEL_NEW_LOGIN"></label>
|
||||
<div class="controls">
|
||||
<input type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: adminLogin" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" data-bind="css: {'error': adminPasswordNewError}">
|
||||
<label class="control-label">
|
||||
New password
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_SECURITY/LABEL_NEW_PASSWORD"></label>
|
||||
<div class="controls">
|
||||
<input type="password" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: adminPasswordNew" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" data-bind="css: {'error': adminPasswordNewError}">
|
||||
<label class="control-label">
|
||||
Repeat
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_SECURITY/LABEL_REPEAT_PASSWORD"></label>
|
||||
<div class="controls">
|
||||
<input type="password" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: adminPasswordNew2" />
|
||||
|
@ -73,37 +63,34 @@
|
|||
<a class="btn" data-bind="command: saveNewAdminPasswordCommand, css: { 'btn-success': adminPasswordUpdateSuccess, 'btn-danger': adminPasswordUpdateError }">
|
||||
<i class="icon-key" data-bind="css: {'icon-white': adminPasswordUpdateSuccess() || adminPasswordUpdateError() }"></i>
|
||||
|
||||
Update Password
|
||||
<span data-i18n="TAB_SECURITY/BUTTON_UPDATE_PASSWORD"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-horizontal">
|
||||
<div class="legend">
|
||||
SSL
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_SECURITY/LEGEND_SSL"></div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
value: verifySslCertificate,
|
||||
label: 'Require verification of SSL certificate used (IMAP/SMTP)',
|
||||
label: 'TAB_SECURITY/LABEL_REQUIRE_VERIFICATION',
|
||||
inline: true
|
||||
}
|
||||
}"></div>
|
||||
|
||||
<span style="color:red">(unstable)</span>
|
||||
<span style="color:red">(<span data-i18n="HINTS/UNSTABLE"></span>)</span>
|
||||
<br />
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
enable: verifySslCertificate,
|
||||
value: allowSelfSigned,
|
||||
label: 'Allow self signed certificates'
|
||||
label: 'TAB_SECURITY/LABEL_ALLOW_SELF_SIGNED'
|
||||
}
|
||||
}"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,19 +1,18 @@
|
|||
<div class="adminSecurity">
|
||||
<div class="row">
|
||||
<div class="alert alert-info span8" style="margin-top: 10px;">
|
||||
Detailed information on social integration is found at
|
||||
<span data-i18n="TAB_INTEGRATIONS/TOP_ALERT"></span>
|
||||
|
||||
<a href="http://rainloop.net/docs/social/" target="_blank">http://rainloop.net/docs/social/</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-horizontal g-ui-user-select-none">
|
||||
<div class="legend">
|
||||
Google
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_INTEGRATIONS/LEGEND_GOOGLE"></div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: googleEnable, label: 'Enable Google Integration' }
|
||||
params: { value: googleEnable, label: 'TAB_INTEGRATIONS/LABEL_ENABLE_GOOGLE' }
|
||||
}"></div>
|
||||
<div data-bind="visible: googleEnable">
|
||||
<br />
|
||||
|
@ -22,21 +21,21 @@
|
|||
name: 'Checkbox',
|
||||
params: {
|
||||
value: googleEnableAuth,
|
||||
label: 'Authentication'
|
||||
label: 'TAB_INTEGRATIONS/LABEL_GOOGLE_AUTH'
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
value: googleEnableDrive,
|
||||
label: 'Google Drive Integration (Compose view)'
|
||||
label: 'TAB_INTEGRATIONS/LABEL_GOOGLE_DRIVE'
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
value: googleEnablePreview,
|
||||
label: 'Google Viewer Integration (Preview for Microsoft Word, Excel and PowerPoint files)'
|
||||
label: 'TAB_INTEGRATIONS/LABEL_GOOGLE_PREVIEW'
|
||||
}
|
||||
}"></div>
|
||||
</blockquote>
|
||||
|
@ -44,14 +43,11 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Client ID
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_INTEGRATIONS/LABEL_GOOGLE_CLIENT_ID"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Input',
|
||||
params: {
|
||||
name: 'xx',
|
||||
value: googleClientID,
|
||||
trigger: googleTrigger1,
|
||||
enable: googleEnableRequireClientSettings,
|
||||
|
@ -61,9 +57,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Client Secret
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_INTEGRATIONS/LABEL_GOOGLE_CLIENT_SECRET"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Input',
|
||||
|
@ -78,9 +72,7 @@
|
|||
</div>
|
||||
<br />
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Api Key
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_INTEGRATIONS/LABEL_GOOGLE_API_KEY"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Input',
|
||||
|
@ -92,29 +84,25 @@
|
|||
}
|
||||
}"></div>
|
||||
<blockquote style="margin-top: 10px; margin-bottom: 0">
|
||||
<p class="muted">
|
||||
Required for Google Drive File Picker
|
||||
</p>
|
||||
<p class="muted" data-i18n="TAB_INTEGRATIONS/HINT_GOOGLE_API_KEY"></p>
|
||||
</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
<div class="legend">
|
||||
Facebook
|
||||
<span style="color: #ccc; font-size: 14px;" data-bind="visible: !facebookSupported()">(requires PHP 5.4 or greater)</span>
|
||||
<span data-i18n="TAB_INTEGRATIONS/LEGEND_FACEBOOK"></span>
|
||||
<span style="color: #ccc; font-size: 14px;" data-bind="visible: !facebookSupported()">(<span data-i18n="HINTS/REQUIRES_PHP_54"></span>)</span>
|
||||
</div>
|
||||
<div data-bind="if: facebookSupported">
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: facebookEnable, label: 'Enable Facebook Integration (Authentication)' }
|
||||
params: { value: facebookEnable, label: 'TAB_INTEGRATIONS/LABEL_ENABLE_FACEBOOK' }
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
App ID
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_INTEGRATIONS/LABEL_FACEBOOK_APP_ID"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Input',
|
||||
|
@ -128,9 +116,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
App Secret
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_INTEGRATIONS/LABEL_FACEBOOK_APP_SECRET"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Input',
|
||||
|
@ -144,21 +130,17 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="legend">
|
||||
Twitter
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_INTEGRATIONS/LEGEND_TWITTER"></div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: twitterEnable, label: 'Enable Twitter Integration (Authentication)' }
|
||||
params: { value: twitterEnable, label: 'TAB_INTEGRATIONS/LABEL_ENABLE_TWITTER' }
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Consumer Key
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_INTEGRATIONS/LABEL_TWITTER_CONSUMER_KEY"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Input',
|
||||
|
@ -172,9 +154,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Consumer Secret
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_INTEGRATIONS/LABEL_TWITTER_CONSUMER_SECRET"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Input',
|
||||
|
@ -187,21 +167,17 @@
|
|||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="legend">
|
||||
Dropbox
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_INTEGRATIONS/LEGEND_DROPBOX"></div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: dropboxEnable, label: 'Enable Dropbox Integration (Compose view)' }
|
||||
params: { value: dropboxEnable, label: 'TAB_INTEGRATIONS/LABEL_ENABLE_DROPBOX' }
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Api Key
|
||||
</label>
|
||||
<label class="control-label" data-i18n="TAB_INTEGRATIONS/LABEL_DROPBOX_API_KEY"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Input',
|
||||
|
|
|
@ -4,24 +4,20 @@
|
|||
<div class="modal-header">
|
||||
<button type="button" class="close" data-bind="command: cancelCommand">×</button>
|
||||
<h3>
|
||||
<span data-bind="visible: !activateProcess()">Activate Subscription Key?</span>
|
||||
<span data-bind="visible: activateProcess">Activation...</span>
|
||||
<span data-bind="visible: !activateProcess()" data-i18n="POPUPS_ACTIVATE/TITLE_ACTIVATE"></span>
|
||||
<span data-bind="visible: activateProcess" data-i18n="POPUPS_ACTIVATE/TITLE_ACTIVATION"></span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="form-horizontal">
|
||||
<div class="control-group">
|
||||
<label class="control-label">
|
||||
Domain
|
||||
</label>
|
||||
<label class="control-label" data-i18n="POPUPS_ACTIVATE/LABEL_DOMAIN"></label>
|
||||
<div class="controls">
|
||||
<h4 class="help-inline" data-bind="text: domain" style="margin-top: 5px;"></h4>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" data-bind="css: {'error': '' !== activateText() && activateText.isError(), 'success': '' !== activateText() && !activateText.isError() }">
|
||||
<label class="control-label">
|
||||
Subscription Key
|
||||
</label>
|
||||
<label class="control-label" data-i18n="POPUPS_ACTIVATE/LABEL_SUB_KEY"></label>
|
||||
<div class="controls ">
|
||||
<input type="text" class="span5" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="visible: !activateProcess() && !activationSuccessed(), textInput: key, hasFocus: key.focus"></input>
|
||||
|
@ -33,27 +29,20 @@
|
|||
</div>
|
||||
<br />
|
||||
<div class="alert">
|
||||
<p>
|
||||
After activation, premium subscription for <strong data-bind="text: domain"></strong> will be extended.
|
||||
<br />
|
||||
Note that subscription key can be activated for a single domain only.
|
||||
</p>
|
||||
<p>
|
||||
Once started, the process of activation cannot be aborted or cancelled.
|
||||
</p>
|
||||
<p data-bind="html: htmlDescription" style="margin-bottom: 0"></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<a class="btn buttonActivate" data-bind="visible: !activationSuccessed(), command: activateCommand">
|
||||
<i class="icon-key" data-bind="css: {'icon-key': !activateProcess(), 'icon-spinner animated': activateProcess()}" ></i>
|
||||
|
||||
Activate
|
||||
<span data-i18n="POPUPS_ACTIVATE/BUTTON_ACTIVATE"></span>
|
||||
</a>
|
||||
<span style="color: green" data-bind="visible: activationSuccessed">
|
||||
|
||||
<i class="icon-ok"></i>
|
||||
|
||||
Activated
|
||||
<span data-i18n="POPUPS_ACTIVATE/LABEL_ACTIVATED"></span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -9,7 +9,9 @@
|
|||
<form class="form-horizontal domain-form" action="#/" onsubmit="return false;">
|
||||
<div class="row" data-bind="visible: !edit()" style="margin-bottom: 20px;">
|
||||
<div class="span10">
|
||||
Name <span style="color: #aaa">(wildcard supported)</span>
|
||||
<span data-i18n="POPUPS_DOMAIN/LABEL_NAME"></span>
|
||||
|
||||
<span style="color: #aaa">(<span data-i18n="POPUPS_DOMAIN/NAME_HELPER"></span>)</span>
|
||||
<br />
|
||||
<input type="text" class="span4" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: name, hasfocus: name.focused" />
|
||||
|
@ -21,24 +23,24 @@
|
|||
<div class="span5">
|
||||
<div class="legend imap-header" data-bind="visible: !sieveSettings(), css: { 'testing-done': testingDone, 'testing-error': testingImapError }">
|
||||
<span data-placement="bottom" data-bind="tooltipForTest: testingImapErrorDesc">
|
||||
IMAP
|
||||
<span data-i18n="POPUPS_DOMAIN/LABEL_IMAP"></span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="legend sieve-header" data-bind="visible: sieveSettings(), css: { 'testing-done': testingDone, 'testing-error': testingSieveError }">
|
||||
<span data-placement="bottom" data-bind="tooltipForTest: testingSieveErrorDesc">
|
||||
SIEVE
|
||||
<span data-i18n="POPUPS_DOMAIN/LABEL_SIEVE"></span>
|
||||
</span>
|
||||
</div>
|
||||
<div data-bind="visible: !sieveSettings()">
|
||||
<div class="row">
|
||||
<div class="span3">
|
||||
Server
|
||||
<span data-i18n="POPUPS_DOMAIN/LABEL_SERVER"></span>
|
||||
<br />
|
||||
<input type="text" class="span3" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: imapServer, hasfocus: imapServerFocus" />
|
||||
</div>
|
||||
<div class="span1">
|
||||
Port
|
||||
<span data-i18n="POPUPS_DOMAIN/LABEL_PORT"></span>
|
||||
<br />
|
||||
<input type="text" class="span1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: imapPort" />
|
||||
|
@ -47,12 +49,12 @@
|
|||
<br />
|
||||
<div class="row">
|
||||
<div class="span4">
|
||||
Secure
|
||||
<span data-i18n="POPUPS_DOMAIN/LABEL_SECURE"></span>
|
||||
<br />
|
||||
<select class="span2" data-bind="value: imapSecure">
|
||||
<option value="0">None</option>
|
||||
<option value="1">SSL/TLS</option>
|
||||
<option value="2">STARTTLS</option>
|
||||
<option value="0" data-i18n="POPUPS_DOMAIN/SECURE_OPTION_NONE"></option>
|
||||
<option value="1" data-i18n="POPUPS_DOMAIN/SECURE_OPTION_SSL"></option>
|
||||
<option value="2" data-i18n="POPUPS_DOMAIN/SECURE_OPTION_STARTTLS"></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -62,7 +64,7 @@
|
|||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'Use short login',
|
||||
label: 'POPUPS_DOMAIN/LABEL_USE_SHORT_LOGIN',
|
||||
value: imapShortLogin,
|
||||
inline: true
|
||||
}
|
||||
|
@ -78,9 +80,9 @@
|
|||
<span data-bind="command: sieveCommand">
|
||||
<i class="icon-filter"></i>
|
||||
|
||||
<a href="#" class="g-ui-link">Sieve configuration</a>
|
||||
<a href="#" class="g-ui-link" data-i18n="POPUPS_DOMAIN/BUTTON_SIEVE_CONFIGURATION"></a>
|
||||
|
||||
<span style="color:red">(beta)</span>
|
||||
<span style="color:red">(<span data-i18n="HINTS/BETA"></span>)</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -91,7 +93,7 @@
|
|||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'Allow sieve scripts',
|
||||
label: 'POPUPS_DOMAIN/LABEL_ALLOW_SIEVE_SCRIPTS',
|
||||
value: useSieve
|
||||
}
|
||||
}"></div>
|
||||
|
@ -103,7 +105,7 @@
|
|||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'Allow custom user script',
|
||||
label: 'POPUPS_DOMAIN/LABEL_ALLOW_USER_SCRIPT',
|
||||
value: sieveAllowRaw
|
||||
}
|
||||
}"></div>
|
||||
|
@ -112,13 +114,13 @@
|
|||
<br />
|
||||
<div class="row">
|
||||
<div class="span3">
|
||||
Server
|
||||
<span data-i18n="POPUPS_DOMAIN/LABEL_SERVER"></span>
|
||||
<br />
|
||||
<input type="text" class="span3" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: sieveServer, hasfocus: sieveServerFocus" />
|
||||
</div>
|
||||
<div class="span1">
|
||||
Port
|
||||
<span data-i18n="POPUPS_DOMAIN/LABEL_PORT"></span>
|
||||
<br />
|
||||
<input type="text" class="span1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: sievePort" />
|
||||
|
@ -127,12 +129,12 @@
|
|||
<br />
|
||||
<div class="row">
|
||||
<div class="span4">
|
||||
Secure
|
||||
<span data-i18n="POPUPS_DOMAIN/LABEL_SECURE"></span>
|
||||
<br />
|
||||
<select class="span2" data-bind="value: sieveSecure">
|
||||
<option value="0">None</option>
|
||||
<option value="1">SSL/TLS</option>
|
||||
<option value="2">STARTTLS</option>
|
||||
<option value="0" data-i18n="POPUPS_DOMAIN/SECURE_OPTION_NONE"></option>
|
||||
<option value="1" data-i18n="POPUPS_DOMAIN/SECURE_OPTION_SSL"></option>
|
||||
<option value="2" data-i18n="POPUPS_DOMAIN/SECURE_OPTION_STARTTLS"></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -143,7 +145,7 @@
|
|||
<span data-bind="command: sieveCommand">
|
||||
<i class="icon-left"></i>
|
||||
|
||||
<a href="#" class="g-ui-link">Back to IMAP settings</a>
|
||||
<a href="#" class="g-ui-link" data-i18n="POPUPS_DOMAIN/BUTTON_BACK_TO_IMAP"></a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -152,19 +154,19 @@
|
|||
<div class="span5">
|
||||
<div class="legend smtp-header" data-bind="css: { 'testing-done': testingDone, 'testing-error': testingSmtpError }">
|
||||
<span data-placement="bottom" data-bind="tooltipForTest: testingSmtpErrorDesc">
|
||||
SMTP
|
||||
<span data-i18n="POPUPS_DOMAIN/LABEL_SMTP"></span>
|
||||
</span>
|
||||
</div>
|
||||
<div data-bind="visible: !smtpPhpMail()">
|
||||
<div class="row">
|
||||
<div class="span3">
|
||||
Server
|
||||
<span data-i18n="POPUPS_DOMAIN/LABEL_SERVER"></span>
|
||||
<br />
|
||||
<input type="text" class="span3" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: smtpServer, hasfocus: smtpServerFocus" />
|
||||
</div>
|
||||
<div class="span1">
|
||||
Port
|
||||
<span data-i18n="POPUPS_DOMAIN/LABEL_PORT"></span>
|
||||
<br />
|
||||
<input type="text" class="span1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: smtpPort" />
|
||||
|
@ -173,12 +175,12 @@
|
|||
<br />
|
||||
<div class="row">
|
||||
<div class="span4">
|
||||
Secure
|
||||
<span data-i18n="POPUPS_DOMAIN/LABEL_SECURE"></span>
|
||||
<br />
|
||||
<select class="span2" data-bind="value: smtpSecure">
|
||||
<option value="0">None</option>
|
||||
<option value="1">SSL/TLS</option>
|
||||
<option value="2">STARTTLS</option>
|
||||
<option value="0" data-i18n="POPUPS_DOMAIN/SECURE_OPTION_NONE"></option>
|
||||
<option value="1" data-i18n="POPUPS_DOMAIN/SECURE_OPTION_SSL"></option>
|
||||
<option value="2" data-i18n="POPUPS_DOMAIN/SECURE_OPTION_STARTTLS"></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -188,7 +190,7 @@
|
|||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'Use short login',
|
||||
label: 'POPUPS_DOMAIN/LABEL_USE_SHORT_LOGIN',
|
||||
value: smtpShortLogin,
|
||||
inline: true
|
||||
}
|
||||
|
@ -199,7 +201,7 @@
|
|||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'Use authentication',
|
||||
label: 'POPUPS_DOMAIN/LABEL_USE_AUTH',
|
||||
value: smtpAuth
|
||||
}
|
||||
}"></div>
|
||||
|
@ -212,24 +214,19 @@
|
|||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'Use php mail() function',
|
||||
label: 'POPUPS_DOMAIN/LABEL_USE_PHP_MAIL',
|
||||
value: smtpPhpMail,
|
||||
inline: true
|
||||
}
|
||||
}"></div>
|
||||
|
||||
<span style="color: red">(beta)</span>
|
||||
<span style="color:red">(<span data-i18n="HINTS/BETA"></span>)</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="span10" data-bind="visible: 'white-list' === page()">
|
||||
<div class="legend white-list-header">
|
||||
White List
|
||||
</div>
|
||||
<div class="alert alert-block span6 alert-null-left-margin" style="width: 562px;">
|
||||
List of domain users webmail is allowed to access.
|
||||
Use a space as delimiter.
|
||||
</div>
|
||||
<div class="legend white-list-header" data-i18n="POPUPS_DOMAIN/LABEL_WHITE_LIST"></div>
|
||||
<div class="alert alert-block span6 alert-null-left-margin" style="width: 562px;" data-i18n="POPUPS_DOMAIN/WHITE_LIST_ALERT"></div>
|
||||
<textarea class="input-xxlarge" style="width: 600px" rows="8" data-bind="value: whiteList" tabindex="-1"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -241,28 +238,29 @@
|
|||
'btn-danger': testingDone() && (testingImapError() || testingSmtpError()) }">
|
||||
<i data-bind="css: {'icon-info': !testing(), 'icon-spinner animated': testing(), 'icon-white': testingDone()}"></i>
|
||||
|
||||
Test
|
||||
<span data-i18n="POPUPS_DOMAIN/BUTTON_TEST"></span>
|
||||
</a>
|
||||
<a class="btn button-white-list pull-left" data-bind="command: whiteListCommand, visible: 'main' === page()">
|
||||
<i class="icon-users"></i>
|
||||
|
||||
White List
|
||||
<span data-i18n="POPUPS_DOMAIN/BUTTON_WHITE_LIST"></span>
|
||||
</a>
|
||||
<a class="btn button-white-list pull-left" data-bind="command: backCommand, visible: 'main' !== page()">
|
||||
<i class="icon-left"></i>
|
||||
|
||||
Back
|
||||
<span data-i18n="POPUPS_DOMAIN/BUTTON_BACK"></span>
|
||||
</a>
|
||||
<a class="btn buttonClose" data-bind="command: cancelCommand">
|
||||
<i class="icon-remove"></i>
|
||||
|
||||
Close
|
||||
<span data-i18n="POPUPS_DOMAIN/BUTTON_CLOSE"></span>
|
||||
</a>
|
||||
<a class="btn buttonClear" data-bind="command: createOrAddCommand">
|
||||
<i data-bind="css: edit() ? 'icon-ok' : 'icon-plus', visible: !saving()"></i>
|
||||
<i class="icon-spinner animated" data-bind="visible: saving"></i>
|
||||
|
||||
<span data-bind="text: edit() ? 'Update' : 'Add'"></span>
|
||||
<span data-bind="visible: !edit()" data-i18n="POPUPS_DOMAIN/BUTTON_ADD"></span>
|
||||
<span data-bind="visible: edit()" data-i18n="POPUPS_DOMAIN/BUTTON_UPDATE"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -3,13 +3,15 @@
|
|||
<div class="modal-header">
|
||||
<button type="button" class="close" data-bind="command: cancelCommand">×</button>
|
||||
<h4>
|
||||
Plugin "<span data-bind="text: name"></span>"
|
||||
<span data-i18n="POPUPS_PLUGIN/TITLE_PLUGIN"></span>
|
||||
|
||||
"<span data-bind="text: name"></span>"
|
||||
</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form class="form-horizontal plugin-form" action="#/" onsubmit="return false;">
|
||||
<div class="well" data-bind="visible: !hasConfiguration()">
|
||||
Nothing to configure
|
||||
<span data-i18n="POPUPS_PLUGIN/DESC_NOTHING_TO_CONFIGURE"></span>
|
||||
</div>
|
||||
<div class="alert" data-bind="visible: '' !== saveError()">
|
||||
<button type="button" class="close" data-bind="click: function () { saveError('') }">×</button>
|
||||
|
@ -27,12 +29,12 @@
|
|||
<a class="btn buttonClose" data-bind="command: cancelCommand">
|
||||
<i class="icon-remove"></i>
|
||||
|
||||
Close
|
||||
<span data-i18n="POPUPS_PLUGIN/BUTTON_CLOSE"></span>
|
||||
</a>
|
||||
<a class="btn buttonClear" data-bind="command: saveCommand, visible: hasConfiguration">
|
||||
<i class="icon-ok"></i>
|
||||
|
||||
Save
|
||||
<span data-i18n="POPUPS_PLUGIN/BUTTON_SAVE"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
<div class="popups">
|
||||
<div class="modal hide b-languages-content g-ui-user-select-none" data-bind="modal: modalVisibility, css: {'exp': exp}">
|
||||
<div class="modal hide b-languages-content g-ui-user-select-none" data-bind="modal: modalVisibility">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-bind="command: cancelCommand">×</button>
|
||||
<h3>
|
||||
<span class="i18n" data-i18n="POPUPS_LANGUAGES/TITLE_LANGUAGES"></span>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<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); }">
|
||||
<div class="modal-body" style="min-height: 150px;">
|
||||
<div data-bind="foreach: languages">
|
||||
<label class="lang-item" data-tooltip-i18n="off" data-tooltip-placement="left" data-bind="click: function () { $root.changeLanguage(key); }, css: {'selected': selected, 'user': user},
|
||||
tooltip: function () { return $root.languageTooltipName(key); }">
|
||||
<span class="flag-wrapper">
|
||||
<span data-bind="css: 'flag flag-' + key" style=""></span>
|
||||
</span>
|
||||
|
@ -18,17 +18,6 @@
|
|||
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},
|
||||
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>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
313
rainloop/v/0.0.0/langs/admin/en.ini
Normal file
313
rainloop/v/0.0.0/langs/admin/en.ini
Normal file
|
@ -0,0 +1,313 @@
|
|||
|
||||
[LOGIN]
|
||||
LABEL_LOGIN = "Login"
|
||||
LABEL_PASSWORD = "Password"
|
||||
BUTTON_LOGIN = "Log into the admin panel"
|
||||
|
||||
[TOP_PANEL]
|
||||
LABEL_PREMIUM = "Premium"
|
||||
LABEL_ADMIN_PANEL = "Admin Panel"
|
||||
|
||||
[TABS_LABELS]
|
||||
LABEL_GENERAL_NAME = "General"
|
||||
LABEL_LOGIN_NAME = "Login"
|
||||
LABEL_BRANDING_NAME = "Branding"
|
||||
LABEL_CONTACTS_NAME = "Contacts"
|
||||
LABEL_DOMAINS_NAME = "Domains"
|
||||
LABEL_SECURITY_NAME = "Security"
|
||||
LABEL_INTEGRATION_NAME = "Integrations"
|
||||
LABEL_PLUGINS_NAME = "Plugins"
|
||||
LABEL_PACKAGES_NAME = "Packages"
|
||||
LABEL_LICENSING_NAME = "Licensing"
|
||||
LABEL_ABOUT_NAME = "About"
|
||||
|
||||
[TAB_GENERAL]
|
||||
LEGEND_INTERFACE = "Interface"
|
||||
LABEL_LANGUAGE = "Language"
|
||||
LABEL_LANGUAGE_ADMIN = "Language (admin)"
|
||||
LABEL_THEME = "Theme"
|
||||
LABEL_ALLOW_LANGUAGES_ON_SETTINGS = "Allow language selection on settings screen"
|
||||
LABEL_ALLOW_THEMES_ON_SETTINGS = "Allow theme selection on settings screen"
|
||||
LABEL_ALLOW_BACKGROUND_ON_SETTINGS = "Allow background selection on settings screen"
|
||||
LABEL_SHOW_THUMBNAILS = "Show thumbnails (attachments)"
|
||||
LABEL_ALLOW_GRAVATAR = "Allow Gravatar"
|
||||
LEGEND_MAIN = "Main"
|
||||
LABEL_ATTACHMENT_SIZE_LIMIT = "Attachment size limit"
|
||||
LABEL_ALLOW_ADDITIONAL_ACCOUNTS = "Allow additional accounts"
|
||||
LABEL_ALLOW_TEMPLATES = "Allow templates"
|
||||
ALERT_WARNING = "Warning!"
|
||||
HTML_ALERT_WEAK_PASSWORD = "You are using the default admin password.
|
||||
<br />
|
||||
For security reasons please
|
||||
<strong><a href=\"#/security\">change</a></strong>
|
||||
password to something else now."
|
||||
|
||||
[TAB_LOGIN]
|
||||
LEGEND_LOGIN_SCREEN = "Login Screen"
|
||||
LABEL_DEFAULT_DOMAIN = "Default Domain"
|
||||
LABEL_DETERMINE_USER_DOMAIN = "Try to determine user domain"
|
||||
LABEL_ALLOW_LANGUAGES_ON_LOGIN = "Allow language selection on login screen"
|
||||
LABEL_DETERMINE_USER_LANGUAGE = "Try to determine user language"
|
||||
|
||||
[TAB_BRANDING]
|
||||
LEGEND_BRANDING = "Branding"
|
||||
LABEL_PAGE_TITLE = "Page Title"
|
||||
LABEL_LOADING_DESCRIPTION = "Loading Description"
|
||||
LEGEND_LOGIN = "Login"
|
||||
LABEL_LOGIN_LOGO = "Logo"
|
||||
LABEL_LOGIN_DESCRIPTION = "Description"
|
||||
LABEL_LOGIN_BACKGROUND = "Background"
|
||||
LABEL_LOGIN_CUSTOM_CSS = "Custom CSS"
|
||||
LABEL_LOGIN_SHOW_POWERED_LINK = "Show \"Powered by RainLoop\" link"
|
||||
LEGEND_USER = "User"
|
||||
LABEL_USER_LOGO = "Logo"
|
||||
LABEL_USER_CUSTOM_CSS = "Custom CSS"
|
||||
HTML_ALERT_PREMIUM = "This functionality is available for <strong><a href=\"#/licensing\">Premium</a></strong> subscribers."
|
||||
|
||||
[TAB_CONTACTS]
|
||||
LEGEND_CONTACTS = "Contacts"
|
||||
LEGEND_STORAGE = "Storage (PDO)"
|
||||
LABEL_ENABLE_CONTACTS = "Enable contacts"
|
||||
LABEL_ALLOW_SYNC = "Allow contacts sync (with external CardDAV server)"
|
||||
LABEL_STORAGE_TYPE = "Type"
|
||||
LABEL_STORAGE_DSN = "Dsn"
|
||||
LABEL_STORAGE_USER = "User"
|
||||
LABEL_STORAGE_PASSWORD = "Password"
|
||||
BUTTON_TEST = "Test"
|
||||
ALERT_NOTICE = "Notice!"
|
||||
HTML_ALERT_DO_NOT_USE_THIS_DATABASE = "Don't use this database type with a large number of active users."
|
||||
HTML_ALERT_DOES_NOT_SUPPORTED = "Your system doesn't support contacts.
|
||||
<br />
|
||||
You need to install or enable <strong>PDO (SQLite / MySQL / PostgreSQL)</strong> extension on your server."
|
||||
|
||||
[TAB_DOMAINS]
|
||||
LEGEND_DOMAINS = "Domains"
|
||||
BUTTON_ADD_DOMAIN = "Add Domain"
|
||||
DELETE_ARE_YOU_SURE = "Are you sure?"
|
||||
HTML_DOMAINS_HELPER = "List of domains webmail is allowed to access.
|
||||
<br />Click on the name to configure the domain."
|
||||
|
||||
[TAB_SECURITY]
|
||||
LEGEND_SECURITY = "Security"
|
||||
LABEL_ALLOW_TWO_STEP = "Allow 2-Step Verification"
|
||||
LABEL_USE_IMAGE_PROXY = "Use local proxy for external images"
|
||||
LABEL_ALLOW_OPEN_PGP = "Allow OpenPGP"
|
||||
LABEL_SHOW_PHP_INFO = "Show PHP information"
|
||||
LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS = "Admin Panel Access Credentials"
|
||||
LABEL_CURRENT_PASSWORD = "Current password"
|
||||
LABEL_NEW_LOGIN = "New login"
|
||||
LABEL_NEW_PASSWORD = "New password"
|
||||
LABEL_REPEAT_PASSWORD = "Repeat"
|
||||
BUTTON_UPDATE_PASSWORD = "Update Password"
|
||||
LEGEND_SSL = "SSL"
|
||||
LABEL_REQUIRE_VERIFICATION = "Require verification of SSL certificate used (IMAP/SMTP)"
|
||||
LABEL_ALLOW_SELF_SIGNED = "Allow self signed certificates"
|
||||
|
||||
[TAB_INTEGRATIONS]
|
||||
LEGEND_GOOGLE = "Google"
|
||||
LABEL_ENABLE_GOOGLE = "Enable Google Integration"
|
||||
LABEL_GOOGLE_AUTH = "Authorization"
|
||||
LABEL_GOOGLE_DRIVE = "Google Drive Integration (Compose view)"
|
||||
LABEL_GOOGLE_PREVIEW = "Google Viewer Integration (Preview for Microsoft Word, Excel and PowerPoint files)"
|
||||
LABEL_GOOGLE_CLIENT_ID = "Client ID"
|
||||
LABEL_GOOGLE_CLIENT_SECRET = "Client Secret"
|
||||
LABEL_GOOGLE_API_KEY = "Api Key"
|
||||
HINT_GOOGLE_API_KEY = "Required for Google Drive File Picker"
|
||||
LEGEND_FACEBOOK = "Facebook"
|
||||
LABEL_ENABLE_FACEBOOK = "Enable Facebook Integration (Authorization)"
|
||||
LABEL_FACEBOOK_APP_ID = "App ID"
|
||||
LABEL_FACEBOOK_APP_SECRET = "App Secret"
|
||||
LEGEND_TWITTER = "Twitter"
|
||||
LABEL_ENABLE_TWITTER = "Enable Twitter Integration (Authorization)"
|
||||
LABEL_TWITTER_CONSUMER_KEY = "Consumer Key"
|
||||
LABEL_TWITTER_CONSUMER_SECRET = "Consumer Secret"
|
||||
LEGEND_DROPBOX = "Dropbox"
|
||||
LABEL_ENABLE_DROPBOX = "Enable Dropbox Integration (Compose view)"
|
||||
LABEL_DROPBOX_API_KEY = "Api Key"
|
||||
TOP_ALERT = "Detailed information on social integration is found at"
|
||||
|
||||
[TAB_PLUGINS]
|
||||
LEGEND_PLUGINS = "Plugins"
|
||||
LABEL_ENABLE_PLUGINS = "Enable plugins"
|
||||
ALERT_NO_PLUGINS = "No plugins have yet been installed."
|
||||
LINK_INSTALL_NEW = "Click here to install new!"
|
||||
HINT_CLICK_NAME = "Click on the name to configure the plugin."
|
||||
|
||||
[TAB_PACKAGES]
|
||||
LEGEND_AVAILABLE_FOR_UPDATE = "Available for Update"
|
||||
LEGEND_AVAILABLE_FOR_INSTALLATION = "Available for Installation"
|
||||
LEGEND_INSTALLED_PACKAGES = "Installed Packages"
|
||||
ALERT_CANNOT_ACCESS_REPOSITORY = "Cannot access the repository at the moment."
|
||||
|
||||
[TAB_LICENSING]
|
||||
LABEL_YOUR_DOMAIN = "Your domain"
|
||||
LABEL_VERSION = "Version"
|
||||
LABEL_CHECKING = "Checking"
|
||||
TYPE_BASIC = "Basic"
|
||||
TYPE_BASIC_HINT = "This domain isn't licensed for commercial use (with additional features)."
|
||||
TYPE_BASIC_HINT_2 = "This domain can't be licensed."
|
||||
HTML_ALERT_TOP_1 = "RainLoop Webmail is licensed under"
|
||||
HTML_ALERT_TOP_2 = "You are <b>free</b> to use it for your <b>personal</b> projects."
|
||||
HTML_ALERT_TOP_3 = "Commercial use (with additional features) of <b>RainLoop Webmail</b> requires getting a
|
||||
<a href=http://www.rainloop.net/purchase/ target=_blank>subscription</a>."
|
||||
TYPE_PREMIUM = "Premium"
|
||||
TYPE_PREMIUM_LIFETIME = "Lifetime"
|
||||
TYPE_PREMIUM_HINT = "This domain isn't licensed for commercial use (with additional features)."
|
||||
LABEL_SUB_EXPIRES = "Subscription expires:"
|
||||
BUTTON_ACTIVATE = "Activate Subscription Key for this domain"
|
||||
BUTTON_PURCHASE = "Purchase"
|
||||
BUTTON_TRIAL = "Trial"
|
||||
|
||||
[TAB_ABOUT]
|
||||
LEGEND_ABOUT = "About"
|
||||
LABEL_TAG_HINT = "Simple, modern & fast web-based email client"
|
||||
LABEL_ALL_RIGHTS_RESERVED = "All Rights Reserved."
|
||||
HINT_READ_CHANGE_LOG = "Please read the change log before updating."
|
||||
HINT_IS_UP_TO_DATE = "RainLoop is up to date."
|
||||
HTML_NEW_VERSION = "New <b>%VERSION%</b> version is available."
|
||||
LABEL_UPDATING = "Updating"
|
||||
LABEL_CHECKING = "Checking for updates"
|
||||
BUTTON_UPDATE = "Update"
|
||||
BUTTON_DOWNLOAD = "Download"
|
||||
BUTTON_CHANGELOG = "Changelog"
|
||||
|
||||
[POPUPS_ACTIVATE]
|
||||
TITLE_ACTIVATE = "Activate Subscription Key?"
|
||||
TITLE_ACTIVATION = "Activation..."
|
||||
LABEL_DOMAIN = "Domain"
|
||||
LABEL_SUB_KEY = "Subscription Key"
|
||||
BUTTON_ACTIVATE = "Activate"
|
||||
LABEL_ACTIVATED = "Activated"
|
||||
ERROR_INVALID_SUBS_KEY = "Invalid Subscription Key"
|
||||
SUBS_KEY_ACTIVATED = "Subscription Key Activated Successfully"
|
||||
HTML_DESC = "After activation, premium subscription for <b>%DOMAIN%</b> will be extended.
|
||||
<br />
|
||||
Note that subscription key can be activated for a single domain only.
|
||||
<br /><br />
|
||||
Once started, the process of activation cannot be aborted or cancelled."
|
||||
|
||||
[POPUPS_DOMAIN]
|
||||
TITLE_ADD_DOMAIN = "Add Domain"
|
||||
TITLE_ADD_DOMAIN_WITH_NAME = "Add Domain \"%NAME%\""
|
||||
TITLE_EDIT_DOMAIN = "Edit Domain \"%NAME%\""
|
||||
LABEL_NAME = "Name"
|
||||
NAME_HELPER = "wildcard supported"
|
||||
LABEL_IMAP = "IMAP"
|
||||
LABEL_SMTP = "SMTP"
|
||||
LABEL_SIEVE = "SIEVE"
|
||||
LABEL_SERVER = "Server"
|
||||
LABEL_PORT = "Port"
|
||||
LABEL_SECURE = "Secure"
|
||||
LABEL_WHITE_LIST = "White List"
|
||||
SECURE_OPTION_NONE = "None"
|
||||
SECURE_OPTION_SSL = "SSL/TLS"
|
||||
SECURE_OPTION_STARTTLS = "STARTTLS"
|
||||
LABEL_ALLOW_SIEVE_SCRIPTS = "Allow sieve scripts"
|
||||
LABEL_ALLOW_USER_SCRIPT = "Allow custom user script"
|
||||
LABEL_USE_SHORT_LOGIN = "Use short login"
|
||||
LABEL_USE_AUTH = "Use authentication"
|
||||
LABEL_USE_PHP_MAIL = "Use php mail() function"
|
||||
BUTTON_TEST = "Test"
|
||||
BUTTON_WHITE_LIST = "White List"
|
||||
BUTTON_SIEVE_CONFIGURATION = "Sieve configuration"
|
||||
BUTTON_BACK_TO_IMAP = "Back to IMAP settings"
|
||||
BUTTON_BACK = "Back"
|
||||
BUTTON_CLOSE = "Close"
|
||||
BUTTON_ADD = "Add"
|
||||
BUTTON_UPDATE = "Update"
|
||||
WHITE_LIST_ALERT = "List of domain users webmail is allowed to access.
|
||||
Use a space as delimiter."
|
||||
|
||||
[POPUPS_PLUGIN]
|
||||
TITLE_PLUGIN = "Plugin"
|
||||
DESC_NOTHING_TO_CONFIGURE = "Nothing to configure"
|
||||
BUTTON_CLOSE = "Close"
|
||||
BUTTON_SAVE = "Save"
|
||||
TOOLTIP_ABOUT_TITLE = "About"
|
||||
|
||||
[POPUPS_ASK]
|
||||
BUTTON_YES = "Yes"
|
||||
BUTTON_NO = "No"
|
||||
DESC_WANT_CLOSE_THIS_WINDOW = "Are you sure you want to close this window?"
|
||||
DESC_WANT_DELETE_MESSAGES = "Are you sure you want to delete the message(s)?"
|
||||
|
||||
[POPUPS_LANGUAGES]
|
||||
TITLE_LANGUAGES = "Choose your language"
|
||||
|
||||
[HINTS]
|
||||
BETA = "beta"
|
||||
UNSTABLE = "unstable"
|
||||
WARNING = "Warning!"
|
||||
NOT_SUPPORTED = "not supported"
|
||||
REQUIRES_PHP_54 = "requires PHP 5.4 or greater"
|
||||
|
||||
[ERRORS]
|
||||
DOMAIN_ALREADY_EXISTS = "Domain already exists"
|
||||
UNKNOWN_ERROR = "Unknown error"
|
||||
|
||||
[NOTIFICATIONS]
|
||||
INVALID_TOKEN = "Invalid token"
|
||||
AUTH_ERROR = "Authentication failed"
|
||||
ACCESS_ERROR = "Access error"
|
||||
CONNECTION_ERROR = "Can't connect to server"
|
||||
CAPTCHA_ERROR = "Incorrect CAPTCHA."
|
||||
SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE = "This social ID is not assigned for any email account yet. Log in using email credentials and 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 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 enable this feature in account settings."
|
||||
DOMAIN_NOT_ALLOWED = "Domain is not allowed"
|
||||
ACCOUNT_NOT_ALLOWED = "Account is not allowed"
|
||||
ACCOUNT_TWO_FACTOR_AUTH_REQUIRED = "Two factor verification required"
|
||||
ACCOUNT_TWO_FACTOR_AUTH_ERROR = "Two factor verification error"
|
||||
COULD_NOT_SAVE_NEW_PASSWORD = "Could not save new password"
|
||||
CURRENT_PASSWORD_INCORRECT = "Current password incorrect"
|
||||
NEW_PASSWORD_SHORT = "Password is too short"
|
||||
NEW_PASSWORD_WEAK = "Password is too easy"
|
||||
NEW_PASSWORD_FORBIDDENT = "Password contains forbidden characters"
|
||||
CONTACTS_SYNC_ERROR = "Contacts synchronization error"
|
||||
CANT_GET_MESSAGE_LIST = "Can't get message list"
|
||||
CANT_GET_MESSAGE = "Can't get message"
|
||||
CANT_DELETE_MESSAGE = "Can't delete message"
|
||||
CANT_MOVE_MESSAGE = "Can't move message"
|
||||
CANT_SAVE_MESSAGE = "Can't save message"
|
||||
CANT_SEND_MESSAGE = "Can't send message"
|
||||
INVALID_RECIPIENTS = "Invalid recipients"
|
||||
CANT_SAVE_FILTERS = "Can't save filters"
|
||||
CANT_GET_FILTERS = "Can't get filters"
|
||||
FILTERS_ARE_NOT_CORRECT = "Filters are not correct"
|
||||
CANT_CREATE_FOLDER = "Can't create folder"
|
||||
CANT_RENAME_FOLDER = "Can't rename folder"
|
||||
CANT_DELETE_FOLDER = "Can't delete folder"
|
||||
CANT_DELETE_NON_EMPTY_FOLDER = "Can't delete non-empty directory"
|
||||
CANT_SUBSCRIBE_FOLDER = "Can't subscribe folder"
|
||||
CANT_UNSUBSCRIBE_FOLDER = "Can't unsubscribe folder"
|
||||
CANT_SAVE_SETTINGS = "Can't save settings"
|
||||
CANT_SAVE_PLUGIN_SETTINGS = "Can't save settings"
|
||||
DOMAIN_ALREADY_EXISTS = "Domain already exists"
|
||||
CANT_INSTALL_PACKAGE = "Failed to install package"
|
||||
CANT_DELETE_PACKAGE = "Failed to remove package"
|
||||
INVALID_PLUGIN_PACKAGE = "Invalid plugin package"
|
||||
UNSUPPORTED_PLUGIN_PACKAGE = "Unsupported plugin package"
|
||||
LICENSING_SERVER_IS_UNAVAILABLE = "Subscription server is unvailable"
|
||||
LICENSING_DOMAIN_EXPIRED = "Subscription for this domain has expired."
|
||||
LICENSING_DOMAIN_BANNED = "Subscription for this domain is banned."
|
||||
DEMO_SEND_MESSAGE_ERROR = "For security purposes, this account is not allowed to send messages to external e-mail addresses!"
|
||||
DEMO_ACCOUNT_ERROR = "For security purposes, this account is not allowed for this action!"
|
||||
ACCOUNT_ALREADY_EXISTS = "Account already exists"
|
||||
MAIL_SERVER_ERROR = "An error has occured while accessing mail server"
|
||||
INVALID_INPUT_ARGUMENT = "Invalid input argument"
|
||||
UNKNOWN_ERROR = "Unknown error"
|
||||
|
||||
[STATIC]
|
||||
BACK_LINK = "Reload"
|
||||
DOMAIN_LIST_DESC = "List of domains webmail is allowed to access."
|
||||
PHP_EXSTENSIONS_ERROR_DESC = "Required PHP extension are not available in your PHP configuration!"
|
||||
PHP_VERSION_ERROR_DESC = "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!"
|
||||
NO_SCRIPT_TITLE = "JavaScript is required for this application."
|
||||
NO_SCRIPT_DESC = "JavaScript support is not available in your browser.
|
||||
Please enable JavaScript support in your browser settings and retry."
|
||||
NO_COOKIE_TITLE = "Cookies support is required for this application."
|
||||
NO_COOKIE_DESC = "Cookies support is not available in your browser.
|
||||
Please enable Cookie support in your browser settings and retry."
|
||||
BAD_BROWSER_TITLE = "Your browser is outdated."
|
||||
BAD_BROWSER_DESC = "To use all the features of the application,
|
||||
download and install one of these browsers:"
|
311
rainloop/v/0.0.0/langs/admin/ru.ini
Normal file
311
rainloop/v/0.0.0/langs/admin/ru.ini
Normal file
|
@ -0,0 +1,311 @@
|
|||
|
||||
[LOGIN]
|
||||
LABEL_LOGIN = "Логин"
|
||||
LABEL_PASSWORD = "Пароль"
|
||||
BUTTON_LOGIN = "Войти в админ панель"
|
||||
|
||||
[TOP_PANEL]
|
||||
LABEL_PREMIUM = "Премиум"
|
||||
LABEL_ADMIN_PANEL = "Админка"
|
||||
|
||||
[TABS_LABELS]
|
||||
LABEL_GENERAL_NAME = "Основные"
|
||||
LABEL_LOGIN_NAME = "Логин"
|
||||
LABEL_BRANDING_NAME = "Брендинг"
|
||||
LABEL_CONTACTS_NAME = "Контакты"
|
||||
LABEL_DOMAINS_NAME = "Домены"
|
||||
LABEL_SECURITY_NAME = "Безопасность"
|
||||
LABEL_INTEGRATION_NAME = "Инеграция"
|
||||
LABEL_PLUGINS_NAME = "Плагины"
|
||||
LABEL_PACKAGES_NAME = "Пакеты"
|
||||
LABEL_LICENSING_NAME = "Лицензия"
|
||||
LABEL_ABOUT_NAME = "О Программе"
|
||||
|
||||
[TAB_GENERAL]
|
||||
LEGEND_INTERFACE = "Интерфейс"
|
||||
LABEL_LANGUAGE = "Язык"
|
||||
LABEL_LANGUAGE_ADMIN = "Язык (Админ)"
|
||||
LABEL_THEME = "Тема"
|
||||
LABEL_ALLOW_LANGUAGES_ON_SETTINGS = "Разрешить выбор языка на экране настроек"
|
||||
LABEL_ALLOW_THEMES_ON_SETTINGS = "Разрешить выбор темы на экране настроек"
|
||||
LABEL_ALLOW_BACKGROUND_ON_SETTINGS = "Allow background selection on settings screen"
|
||||
LABEL_SHOW_THUMBNAILS = "Показывать миниатюры (для вложений)"
|
||||
LABEL_ALLOW_GRAVATAR = "Разрешить граватары"
|
||||
LEGEND_MAIN = "Основное"
|
||||
LABEL_ATTACHMENT_SIZE_LIMIT = "Предельный размер вложений"
|
||||
LABEL_ALLOW_ADDITIONAL_ACCOUNTS = "Разрешить дополнительные аккаунты"
|
||||
LABEL_ALLOW_TEMPLATES = "Разрешить шаблоны"
|
||||
ALERT_WARNING = "Внимание!"
|
||||
HTML_ALERT_WEAK_PASSWORD = "Вы используете пароль администратора по умолчанию.
|
||||
<br />
|
||||
По соображениям безопасности, пожалуйста,
|
||||
<strong><a href=\"#/security\">измените пароль</a></strong> прямо сейчас."
|
||||
|
||||
[TAB_LOGIN]
|
||||
LEGEND_LOGIN_SCREEN = "Cтраница Входа"
|
||||
LABEL_DEFAULT_DOMAIN = "Основной домен"
|
||||
LABEL_DETERMINE_USER_DOMAIN = "Пытаться определить домен пользователя"
|
||||
LABEL_ALLOW_LANGUAGES_ON_LOGIN = "Разрешить выбор языка на странице входа"
|
||||
LABEL_DETERMINE_USER_LANGUAGE = "Пытаться определить язык пользователя"
|
||||
|
||||
[TAB_BRANDING]
|
||||
LEGEND_BRANDING = "Брендинг"
|
||||
LABEL_PAGE_TITLE = "Название страницы"
|
||||
LABEL_LOADING_DESCRIPTION = "Описание при загрузке"
|
||||
LEGEND_LOGIN = "Экран входа"
|
||||
LABEL_LOGIN_LOGO = "Логотип"
|
||||
LABEL_LOGIN_DESCRIPTION = "Описание"
|
||||
LABEL_LOGIN_BACKGROUND = "Фоновая картинка"
|
||||
LABEL_LOGIN_CUSTOM_CSS = "Кастомный CSS"
|
||||
LABEL_LOGIN_SHOW_POWERED_LINK = "Показывать ссылку \"Powered by RainLoop\""
|
||||
LEGEND_USER = "Экран пользователя"
|
||||
LABEL_USER_LOGO = "Логотип"
|
||||
LABEL_USER_CUSTOM_CSS = "Кастомный CSS"
|
||||
HTML_ALERT_PREMIUM = "Эти функции доступны для <strong><a href=\"#/licensing\">премиум</a></strong> подписчиков."
|
||||
|
||||
[TAB_CONTACTS]
|
||||
LEGEND_CONTACTS = "Контакты"
|
||||
LEGEND_STORAGE = "Хранилище (PDO)"
|
||||
LABEL_ENABLE_CONTACTS = "Включить контакты"
|
||||
LABEL_ALLOW_SYNC = "Разрешить синхронизацию контактов (с внешним CardDAV сервером)"
|
||||
LABEL_STORAGE_TYPE = "Тип"
|
||||
LABEL_STORAGE_DSN = "Dsn"
|
||||
LABEL_STORAGE_USER = "Пользователь"
|
||||
LABEL_STORAGE_PASSWORD = "Пароль"
|
||||
BUTTON_TEST = "Тест"
|
||||
ALERT_NOTICE = "Внимание!"
|
||||
HTML_ALERT_DO_NOT_USE_THIS_DATABASE = "Не используйте этот тип базы данных с большим числом активных пользователей."
|
||||
HTML_ALERT_DOES_NOT_SUPPORTED = "Ваша система не поддерживает контакты.
|
||||
<br />
|
||||
Вам необходимо установить или включить <strong>PDO (SQLite / MySQL / PostgreSQL)</strong> расширения на вашем сервере."
|
||||
|
||||
[TAB_DOMAINS]
|
||||
LEGEND_DOMAINS = "Домены"
|
||||
BUTTON_ADD_DOMAIN = "Добавить домен"
|
||||
DELETE_ARE_YOU_SURE = "Вы уверены?"
|
||||
HTML_DOMAINS_HELPER = "Список доменов к которым разрешен доступ.
|
||||
<br />Нажмите на имя, чтобы настроить домен."
|
||||
|
||||
[TAB_SECURITY]
|
||||
LEGEND_SECURITY = "Безопасность"
|
||||
LABEL_ALLOW_TWO_STEP = "Разрешить 2-шаговую проверку"
|
||||
LABEL_USE_IMAGE_PROXY = "Использовать локальный прокси для внешних изображений"
|
||||
LABEL_ALLOW_OPEN_PGP = "Разрешить OpenPGP"
|
||||
LABEL_SHOW_PHP_INFO = "Показать PHP информацию"
|
||||
LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS = "Admin Panel Access Credentials"
|
||||
LABEL_CURRENT_PASSWORD = "Текущий пароль"
|
||||
LABEL_NEW_LOGIN = "Новый логин"
|
||||
LABEL_NEW_PASSWORD = "Новый пароль"
|
||||
LABEL_REPEAT_PASSWORD = "Повторить пароль"
|
||||
BUTTON_UPDATE_PASSWORD = "Обновить пароль"
|
||||
LEGEND_SSL = "SSL"
|
||||
LABEL_REQUIRE_VERIFICATION = "Требовать проверку SSL сертификата для IMAP и SMTP"
|
||||
LABEL_ALLOW_SELF_SIGNED = "Разрешить cамоподписанные сертификаты"
|
||||
|
||||
[TAB_INTEGRATIONS]
|
||||
LEGEND_GOOGLE = "Google"
|
||||
LABEL_ENABLE_GOOGLE = "Включить Google интеграцию"
|
||||
LABEL_GOOGLE_AUTH = "Авторизация"
|
||||
LABEL_GOOGLE_DRIVE = "Google диск интеграция (Экран нового сообщения)"
|
||||
LABEL_GOOGLE_PREVIEW = "Google просмотрщик интеграция (Превью для Microsoft Word, Excel и PowerPoint файлов)"
|
||||
LABEL_GOOGLE_CLIENT_ID = "Client ID"
|
||||
LABEL_GOOGLE_CLIENT_SECRET = "Client Secret"
|
||||
LABEL_GOOGLE_API_KEY = "Api Key"
|
||||
HINT_GOOGLE_API_KEY = "Требуется для Google Drive File Picker"
|
||||
LEGEND_FACEBOOK = "Facebook"
|
||||
LABEL_ENABLE_FACEBOOK = "Включить Facebook интеграцию (Авторизация)"
|
||||
LABEL_FACEBOOK_APP_ID = "App ID"
|
||||
LABEL_FACEBOOK_APP_SECRET = "App Secret"
|
||||
LEGEND_TWITTER = "Twitter"
|
||||
LABEL_ENABLE_TWITTER = "Включить Twitter интеграцию (Авторизация)"
|
||||
LABEL_TWITTER_CONSUMER_KEY = "Consumer Key"
|
||||
LABEL_TWITTER_CONSUMER_SECRET = "Consumer Secret"
|
||||
LEGEND_DROPBOX = "Dropbox"
|
||||
LABEL_ENABLE_DROPBOX = "Включить Dropbox интеграцию (Экран нового сообщения)"
|
||||
LABEL_DROPBOX_API_KEY = "Api Key"
|
||||
TOP_ALERT = "Подробная информация о социальной интеграции находится на"
|
||||
|
||||
[TAB_PLUGINS]
|
||||
LEGEND_PLUGINS = "Плагины"
|
||||
LABEL_ENABLE_PLUGINS = "Включить плагины"
|
||||
ALERT_NO_PLUGINS = "Плагины пока не установлены."
|
||||
LINK_INSTALL_NEW = "Нажмите здесь, чтобы установить плагин"
|
||||
HINT_CLICK_NAME = "Нажмите на имя, чтобы настроить плагин."
|
||||
|
||||
[TAB_PACKAGES]
|
||||
LEGEND_AVAILABLE_FOR_UPDATE = "Доступно для обновления"
|
||||
LEGEND_AVAILABLE_FOR_INSTALLATION = "Доступно для установки"
|
||||
LEGEND_INSTALLED_PACKAGES = "Установленные пакеты"
|
||||
ALERT_CANNOT_ACCESS_REPOSITORY = "Не удается получить доступ к хранилищу пакетов в данный момент."
|
||||
|
||||
[TAB_LICENSING]
|
||||
LABEL_YOUR_DOMAIN = "Ваш домен"
|
||||
LABEL_VERSION = "Версия"
|
||||
LABEL_CHECKING = "Проверка"
|
||||
TYPE_BASIC = "Базовая"
|
||||
TYPE_BASIC_HINT = "Этот домен не имеет лицензию для коммерческого использования (с дополнительными функциями)."
|
||||
TYPE_BASIC_HINT_2 = "Этот домен не может быть лицензирован."
|
||||
HTML_ALERT_TOP_1 = "Код RainLoop Webmail лицензирован под"
|
||||
HTML_ALERT_TOP_2 = "Вы можете <b>свободно</b> использовать его в своих <b>личных</b> проектах."
|
||||
HTML_ALERT_TOP_3 = "Коммерческое использование (с дополнительными функциями) <b>RainLoop Webmail</b> требует получение
|
||||
<a href=http://www.rainloop.net/purchase/ target=_blank>лицензии</a>."
|
||||
TYPE_PREMIUM = "Премиум"
|
||||
TYPE_PREMIUM_LIFETIME = "бесконечная"
|
||||
TYPE_PREMIUM_HINT = "Этот домен не имеет лицензию для коммерческого использования (с дополнительными функциями)."
|
||||
LABEL_SUB_EXPIRES = "Подписка истекает:"
|
||||
BUTTON_ACTIVATE = "Активировать ключ для этого домена"
|
||||
BUTTON_PURCHASE = "Купить"
|
||||
BUTTON_TRIAL = "Пробная лицензия"
|
||||
|
||||
[TAB_ABOUT]
|
||||
LEGEND_ABOUT = "О программе"
|
||||
LABEL_TAG_HINT = "Простой, современный и быстрый веб-клиент электронной почты"
|
||||
LABEL_ALL_RIGHTS_RESERVED = "Все права защищены."
|
||||
HINT_READ_CHANGE_LOG = "Пожалуйста, ознакомьтесь с изменениями перед обновлением."
|
||||
HINT_IS_UP_TO_DATE = "Версия RainLoop актуальна."
|
||||
HTML_NEW_VERSION = "Новая <b>%VERSION%</b> версия доступна."
|
||||
LABEL_UPDATING = "Обновление"
|
||||
LABEL_CHECKING = "Проверка"
|
||||
BUTTON_UPDATE = "Обновить"
|
||||
BUTTON_DOWNLOAD = "Скачать"
|
||||
BUTTON_CHANGELOG = "Изменения"
|
||||
|
||||
[POPUPS_ACTIVATE]
|
||||
TITLE_ACTIVATE = "Активировать ключ подписки?"
|
||||
TITLE_ACTIVATION = "Активация..."
|
||||
LABEL_DOMAIN = "Домен"
|
||||
LABEL_SUB_KEY = "Ключ подписки"
|
||||
BUTTON_ACTIVATE = "Активировать"
|
||||
LABEL_ACTIVATED = "Активировано"
|
||||
ERROR_INVALID_SUBS_KEY = "Неверный ключ подписки"
|
||||
SUBS_KEY_ACTIVATED = "Ключ подписки активирован удачно"
|
||||
HTML_DESC = "После активации премиум подписка для <b>%DOMAIN%</b> будет продлена.
|
||||
<br />
|
||||
Обратите внимание, что ключ может быть активирован только один раз.
|
||||
<br /><br />
|
||||
После запуска процесс активации не может быть прерван или отменен."
|
||||
|
||||
[POPUPS_DOMAIN]
|
||||
TITLE_ADD_DOMAIN = "Добавить домен"
|
||||
TITLE_ADD_DOMAIN_WITH_NAME = "Добавить домен \"%NAME%\""
|
||||
TITLE_EDIT_DOMAIN = "Редактировать домен \"%NAME%\""
|
||||
LABEL_NAME = "Имя"
|
||||
NAME_HELPER = "wildcard supported"
|
||||
LABEL_IMAP = "IMAP"
|
||||
LABEL_SMTP = "SMTP"
|
||||
LABEL_SIEVE = "SIEVE"
|
||||
LABEL_SERVER = "Сервер"
|
||||
LABEL_PORT = "Порт"
|
||||
LABEL_SECURE = "Безопасность"
|
||||
LABEL_WHITE_LIST = "Белый список"
|
||||
SECURE_OPTION_NONE = "Нет"
|
||||
SECURE_OPTION_SSL = "SSL/TLS"
|
||||
SECURE_OPTION_STARTTLS = "STARTTLS"
|
||||
LABEL_ALLOW_SIEVE_SCRIPTS = "Разрешить sieve скрипты"
|
||||
LABEL_ALLOW_USER_SCRIPT = "Разрешить использовать пользовательский sieve скрипт"
|
||||
LABEL_USE_SHORT_LOGIN = "Использовать короткий логин"
|
||||
LABEL_USE_AUTH = "Использовать аутентификацию"
|
||||
LABEL_USE_PHP_MAIL = "Использовать mail() функцию"
|
||||
BUTTON_TEST = "Тест"
|
||||
BUTTON_WHITE_LIST = "Белый список"
|
||||
BUTTON_SIEVE_CONFIGURATION = "настройки Sieve"
|
||||
BUTTON_BACK_TO_IMAP = "Назад к IMAP настройкам"
|
||||
BUTTON_BACK = "Назад"
|
||||
BUTTON_CLOSE = "Закрыть"
|
||||
BUTTON_ADD = "Добавить"
|
||||
BUTTON_UPDATE = "Обновить"
|
||||
WHITE_LIST_ALERT = "Список пользователей домена к которым разрешен доступ.
|
||||
Используйте пробел в качестве разделителя."
|
||||
|
||||
[POPUPS_PLUGIN]
|
||||
TITLE_PLUGIN = "Плагин"
|
||||
DESC_NOTHING_TO_CONFIGURE = "Без настроек"
|
||||
BUTTON_CLOSE = "Закрыть"
|
||||
BUTTON_SAVE = "Сохранить"
|
||||
TOOLTIP_ABOUT_TITLE = "О плагине"
|
||||
|
||||
[POPUPS_ASK]
|
||||
BUTTON_YES = "Да"
|
||||
BUTTON_NO = "Нет"
|
||||
DESC_WANT_CLOSE_THIS_WINDOW = "Вы уверены, что хотите закрыть это окно?"
|
||||
|
||||
[POPUPS_LANGUAGES]
|
||||
TITLE_LANGUAGES = "Выберите язык"
|
||||
|
||||
[HINTS]
|
||||
BETA = "beta"
|
||||
UNSTABLE = "unstable"
|
||||
WARNING = "Внимание!"
|
||||
NOT_SUPPORTED = "не поддерживается"
|
||||
REQUIRES_PHP_54 = "требует PHP 5.4 или выше"
|
||||
|
||||
[ERRORS]
|
||||
DOMAIN_ALREADY_EXISTS = "Домен уже существует"
|
||||
UNKNOWN_ERROR = "Неизвестная ошибка"
|
||||
|
||||
[NOTIFICATIONS]
|
||||
INVALID_TOKEN = "Неверный токен запроса"
|
||||
AUTH_ERROR = "Не удалось авторизоваться"
|
||||
ACCESS_ERROR = "Ошибка доступа"
|
||||
CONNECTION_ERROR = "Ошибка соединения с сервером."
|
||||
CAPTCHA_ERROR = "Неправильное проверочное слово."
|
||||
SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE = "К данному социальному пользователю еще не прикреплен почтовый аккаунт. Войдите в систему под своим почтовым аккаунтом и включите эту возможность в настройках."
|
||||
SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE = "К данному социальному пользователю еще не прикреплен почтовый аккаунт. Войдите в систему под своим почтовым аккаунтом и включите эту возможность в настройках."
|
||||
SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE = "К данному социальному пользователю еще не прикреплен почтовый аккаунт. Войдите в систему под своим почтовым аккаунтом и включите эту возможность в настройках."
|
||||
DOMAIN_NOT_ALLOWED = "Данный домен не разрешен"
|
||||
ACCOUNT_NOT_ALLOWED = "Данный аккаунт не разрешен"
|
||||
ACCOUNT_TWO_FACTOR_AUTH_REQUIRED = "Необходима двухфакторная верификация"
|
||||
ACCOUNT_TWO_FACTOR_AUTH_ERROR = "Ошибка двухфакторной верификации"
|
||||
COULD_NOT_SAVE_NEW_PASSWORD = "Не удалось сохранить новый пароль"
|
||||
CURRENT_PASSWORD_INCORRECT = "Текущий пароль неверный"
|
||||
NEW_PASSWORD_SHORT = "Пароль слишком короткий"
|
||||
NEW_PASSWORD_WEAK = "Пароль слишком простой"
|
||||
NEW_PASSWORD_FORBIDDENT = "Пароль содержит запрещенные символы"
|
||||
CONTACTS_SYNC_ERROR = "Ошибка синхронизации контактов"
|
||||
CANT_GET_MESSAGE_LIST = "Не могу получить список писем"
|
||||
CANT_GET_MESSAGE = "Не могу получить письмо"
|
||||
CANT_DELETE_MESSAGE = "Не могу удалить письмо"
|
||||
CANT_MOVE_MESSAGE = "Не могу переместить письмо"
|
||||
CANT_SAVE_MESSAGE = "Не могу сохранить письмо"
|
||||
CANT_SEND_MESSAGE = "Не могу отправить письмо"
|
||||
INVALID_RECIPIENTS = "Проверьте правильность ввода всех адресов."
|
||||
CANT_SAVE_FILTERS = "Не могу сохранить фильтры"
|
||||
CANT_GET_FILTERS = "Не могу загрузить фильтры"
|
||||
FILTERS_ARE_NOT_CORRECT = "Фильтры неправильны"
|
||||
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 = "Демо аккаунту отправка писем на внешние почтовые адреса запрещена!"
|
||||
DEMO_ACCOUNT_ERROR = "По соображениям безопасности данный аккаунт не может выполнить это действие."
|
||||
ACCOUNT_ALREADY_EXISTS = "Аккаунт уже добавлен"
|
||||
MAIL_SERVER_ERROR = "Ошибка доступа к почтовому серверу"
|
||||
INVALID_INPUT_ARGUMENT = "Неверный параметр"
|
||||
UNKNOWN_ERROR = "Неизвестная ошибка"
|
||||
|
||||
[STATIC]
|
||||
BACK_LINK = "Обновить"
|
||||
DOMAIN_LIST_DESC = "Список доменов, к которым разрешен доступ через веб почту."
|
||||
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 = "Для работы приложения необходимы Cookie."
|
||||
NO_COOKIE_DESC = "По-видимому, Cookie либо не поддерживаются вашим браузером, либо отключены.
|
||||
Включите Cookie, изменив настройки браузера, затем повторите попытку."
|
||||
BAD_BROWSER_TITLE = "Ваш браузер устарел."
|
||||
BAD_BROWSER_DESC = "Чтобы использовать все возможности приложения,
|
||||
загрузите и установите один из этих браузеров:"
|
Loading…
Reference in a new issue