Respect languages preferences on login page

Fixes #4169
pull/236/head
Francis Lachapelle 2017-05-18 22:28:05 -04:00
parent aee42f76f0
commit 41967d3eec
6 changed files with 57 additions and 21 deletions

2
NEWS
View File

@ -8,7 +8,7 @@ Enhancements
- [core] now possible to {un}subscribe to folders using sogo-tool - [core] now possible to {un}subscribe to folders using sogo-tool
Bug fixes Bug fixes
- - [web] respect SOGoLanguage and SOGoSupportedLanguages (#4169)
3.2.9 (2017-05-09) 3.2.9 (2017-05-09)
------------------ ------------------

View File

@ -39,6 +39,7 @@
SOGoEnableDomainBasedUID = NO; SOGoEnableDomainBasedUID = NO;
SOGoLoginModule = "Mail"; SOGoLoginModule = "Mail";
WODefaultLanguages = ();
SOGoLanguage = "English"; SOGoLanguage = "English";
SOGoSupportedLanguages = ( SOGoSupportedLanguages = (
"Arabic", "Arabic",

View File

@ -22,6 +22,7 @@
#import <NGObjWeb/WORequest.h> #import <NGObjWeb/WORequest.h>
#import "SOGoDomainDefaults.h" #import "SOGoDomainDefaults.h"
#import "SOGoSystemDefaults.h"
#import "SOGoUser.h" #import "SOGoUser.h"
#import "WOContext+SOGo.h" #import "WOContext+SOGo.h"
@ -31,14 +32,21 @@
- (NSArray *) resourceLookupLanguages - (NSArray *) resourceLookupLanguages
{ {
NSMutableArray *languages; NSMutableArray *languages;
NSArray *browserLanguages; NSArray *browserLanguages, *supportedLanguages;
SOGoSystemDefaults *sd;
SOGoUser *user; SOGoUser *user;
NSString *language, *theme; NSString *language, *theme;
languages = [NSMutableArray array]; languages = [NSMutableArray array];
user = [self activeUser]; user = [self activeUser];
theme = [[self request] formValueForKey: @"theme"];
// Retrieve language parameter
language = [[self request] formValueForKey: @"language"];
if ([language length] > 0)
[languages addObject: language];
// Retrieve theme argument
theme = [[self request] formValueForKey: @"theme"];
if ([theme length] > 0) if ([theme length] > 0)
{ {
if ([theme hasSuffix: @"/"]) if ([theme hasSuffix: @"/"])
@ -52,18 +60,28 @@
if (!user || [[user login] isEqualToString: @"anonymous"]) if (!user || [[user login] isEqualToString: @"anonymous"])
{ {
// Use browser's languages
browserLanguages = [[self request] browserLanguages]; browserLanguages = [[self request] browserLanguages];
[languages addObjectsFromArray: browserLanguages]; [languages addObjectsFromArray: browserLanguages];
} }
else else
{ {
// Use user's language or domain's language
language = [[user userDefaults] language]; language = [[user userDefaults] language];
[languages addObject: language]; [languages addObject: language];
language = [[user domainDefaults] language]; language = [[user domainDefaults] language];
[languages addObject: language]; [languages addObject: language];
} }
return languages; // Return the first language matching a supported language or the SOGoLanguage
// default if none is matching.
sd = [SOGoSystemDefaults sharedSystemDefaults];
supportedLanguages = [sd supportedLanguages];
language = [languages firstObjectCommonWithArray: supportedLanguages];
if (!(language && [language isKindOfClass: [NSString class]]))
language = [sd stringForKey: @"SOGoLanguage"];
return [NSArray arrayWithObject: language];
} }
@end @end

View File

@ -72,6 +72,11 @@
/* accessors */ /* accessors */
- (NSString *) modulePath
{
return @"";
}
//- (NSString *) connectURL //- (NSString *) connectURL
//{ //{
// return [NSString stringWithFormat: @"%@/connect", [self applicationPath]]; // return [NSString stringWithFormat: @"%@/connect", [self applicationPath]];
@ -525,6 +530,11 @@
return item; return item;
} }
- (NSString *) language
{
return [[context resourceLookupLanguages] objectAtIndex: 0];
}
- (NSArray *) languages - (NSArray *) languages
{ {
return [[SOGoSystemDefaults sharedSystemDefaults] supportedLanguages]; return [[SOGoSystemDefaults sharedSystemDefaults] supportedLanguages];

View File

@ -11,6 +11,7 @@
> >
<script type="text/javascript"> <script type="text/javascript">
var cookieUsername = '<var:string var:value="cookieUsername" const:escapeHTML="NO"/>'; var cookieUsername = '<var:string var:value="cookieUsername" const:escapeHTML="NO"/>';
var language = '<var:string var:value="language" const:escapeHTML="NO"/>';
</script> </script>
<!-- <!--
@ -56,7 +57,7 @@
<md-icon>language</md-icon> <md-icon>language</md-icon>
<md-input-container class="md-flex"> <md-input-container class="md-flex">
<label><var:string label:value="choose"/></label> <label><var:string label:value="choose"/></label>
<md-select ng-model="app.creds.language"> <md-select ng-model="app.creds.language" ng-change="app.changeLanguage($event)">
<var:foreach list="languages" item="item"> <var:foreach list="languages" item="item">
<md-option var:value="item"> <md-option var:value="item">
<var:string value="languageText"/> <var:string value="languageText"/>

View File

@ -13,20 +13,21 @@
function LoginController($scope, $window, $timeout, Dialog, $mdDialog, Authentication) { function LoginController($scope, $window, $timeout, Dialog, $mdDialog, Authentication) {
var vm = this; var vm = this;
vm.creds = { this.$onInit = function() {
username: $window.cookieUsername, this.creds = {
password: null, username: $window.cookieUsername,
rememberLogin: angular.isDefined($window.cookieUsername) && $window.cookieUsername.length > 0 password: null,
language: $window.language,
rememberLogin: angular.isDefined($window.cookieUsername) && $window.cookieUsername.length > 0
};
this.loginState = false;
// Show login once everything is initialized
this.showLogin = false;
$timeout(function() { vm.showLogin = true; }, 100);
}; };
vm.login = login;
vm.loginState = false;
vm.showAbout = showAbout;
// Show login once everything is initialized this.login = function() {
vm.showLogin = false;
$timeout(function() { vm.showLogin = true; }, 100);
function login() {
vm.loginState = 'authenticating'; vm.loginState = 'authenticating';
Authentication.login(vm.creds) Authentication.login(vm.creds)
.then(function(data) { .then(function(data) {
@ -45,9 +46,9 @@
vm.errorMessage = msg.error; vm.errorMessage = msg.error;
}); });
return false; return false;
} };
function showAbout($event) { this.showAbout = function($event) {
$mdDialog.show({ $mdDialog.show({
targetEvent: $event, targetEvent: $event,
templateUrl: 'aboutBox.html', templateUrl: 'aboutBox.html',
@ -60,7 +61,12 @@
$mdDialog.hide(); $mdDialog.hide();
}; };
} }
} };
this.changeLanguage = function($event) {
// Reload page
$window.location.href = ApplicationBaseURL + 'login?language=' + this.creds.language;
};
} }
angular angular