Admin Panel localization (#467)

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

View file

@ -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 () {

View file

@ -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);
});
};

View file

@ -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 + '/';
};
/**

View file

@ -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
})

View file

@ -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);
}
}
}

View file

@ -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);

View file

@ -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

View file

@ -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
};
});

View file

@ -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()
]);
};
/**

View file

@ -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;

View file

@ -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();

View file

@ -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;

View file

@ -67,7 +67,7 @@
{
if (oData.Result)
{
require('App/Admin').loginAndLogoutReload();
require('App/Admin').loginAndLogoutReload(true);
}
else if (oData.ErrorCode)
{

View file

@ -48,7 +48,7 @@
PaneSettingsAdminView.prototype.logoutClick = function ()
{
Remote.adminLogout(function () {
require('App/Admin').loginAndLogoutReload(true);
require('App/Admin').loginAndLogoutReload(true, true);
});
};

View file

@ -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);
}

View file

@ -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'));
}
};

View file

@ -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();
};

View file

@ -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();

View file

@ -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;