From 6537deb8b76b7a4725c40a174a7c440385f88e51 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 05 Jun 2014 10:20:59 -0400
Subject: [PATCH] Revise language/locale preference handling

---
 src/main/java/com/gitblit/ConfigUserService.java          |    9 ++++++---
 src/main/java/com/gitblit/wicket/pages/UserPage.java      |   26 +++++++++++++++++---------
 src/main/java/com/gitblit/wicket/GitBlitWebApp.properties |    2 +-
 src/main/java/com/gitblit/models/UserPreferences.java     |    6 +++++-
 4 files changed, 29 insertions(+), 14 deletions(-)

diff --git a/src/main/java/com/gitblit/ConfigUserService.java b/src/main/java/com/gitblit/ConfigUserService.java
index 9b4dd7f..b5dfde3 100644
--- a/src/main/java/com/gitblit/ConfigUserService.java
+++ b/src/main/java/com/gitblit/ConfigUserService.java
@@ -707,8 +707,9 @@
 				config.setBoolean(USER, model.username, DISABLED, true);
 			}
 			if (model.getPreferences() != null) {
-				if (!StringUtils.isEmpty(model.getPreferences().locale)) {
-					config.setString(USER, model.username, LOCALE, model.getPreferences().locale);
+				if (model.getPreferences().getLocale() != null) {
+					String val = model.getPreferences().getLocale().getLanguage() + "_" + model.getPreferences().getLocale().getCountry();
+					config.setString(USER, model.username, LOCALE, val);
 				}
 			}
 
@@ -880,11 +881,13 @@
 					user.stateProvince = config.getString(USER, username, STATEPROVINCE);
 					user.countryCode = config.getString(USER, username, COUNTRYCODE);
 					user.cookie = config.getString(USER, username, COOKIE);
-					user.getPreferences().locale = config.getString(USER, username, LOCALE);
 					if (StringUtils.isEmpty(user.cookie) && !StringUtils.isEmpty(user.password)) {
 						user.cookie = StringUtils.getSHA1(user.username + user.password);
 					}
 
+					// preferences
+					user.getPreferences().setLocale(config.getString(USER, username, LOCALE));
+
 					// user roles
 					Set<String> roles = new HashSet<String>(Arrays.asList(config.getStringList(
 							USER, username, ROLE)));
diff --git a/src/main/java/com/gitblit/models/UserPreferences.java b/src/main/java/com/gitblit/models/UserPreferences.java
index 44e4493..61db353 100644
--- a/src/main/java/com/gitblit/models/UserPreferences.java
+++ b/src/main/java/com/gitblit/models/UserPreferences.java
@@ -37,7 +37,7 @@
 
 	public final String username;
 
-	public String locale;
+	private String locale;
 
 	private final Map<String, UserRepositoryPreferences> repositoryPreferences = new TreeMap<String, UserRepositoryPreferences>();
 
@@ -58,6 +58,10 @@
 		return new Locale(locale);
 	}
 
+	public void setLocale(String locale) {
+		this.locale = locale;
+	}
+
 	public UserRepositoryPreferences getRepositoryPreferences(String repositoryName) {
 		String key = repositoryName.toLowerCase();
 		if (!repositoryPreferences.containsKey(key)) {
diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties b/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
index 7dc0f9b..90d30f2 100644
--- a/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
+++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
@@ -727,7 +727,7 @@
 gb.accountPreferences = Account Preferences
 gb.accountPreferencesDescription = Specify your account preferences
 gb.languagePreference = Language Preference
-gb.languagePreferenceDescription = Select your preferred translation for the Gitblit UI
+gb.languagePreferenceDescription = Select your preferred translation for Gitblit
 gb.displayNameDescription = The preferred name for display
 gb.emailAddressDescription = The primary email address for receiving notifications
 gb.sshKeys = SSH Keys
diff --git a/src/main/java/com/gitblit/wicket/pages/UserPage.java b/src/main/java/com/gitblit/wicket/pages/UserPage.java
index 4a955c7..9404896 100644
--- a/src/main/java/com/gitblit/wicket/pages/UserPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/UserPage.java
@@ -181,28 +181,36 @@
 				new Language("Português", "pt_BR"),
 				new Language("中文", "zh_CN"));
 
-		String lc = user.getPreferences().locale;
-		if (StringUtils.isEmpty(lc)) {
+		Locale locale = user.getPreferences().getLocale();
+		if (locale == null) {
 			// user has not specified language preference
 			// try server default preference
-			lc = app().settings().getString(Keys.web.forceDefaultLocale, null);
+			String lc = app().settings().getString(Keys.web.forceDefaultLocale, null);
 			if (StringUtils.isEmpty(lc)) {
 				// server default language is not configured
 				// try browser preference
 				Locale sessionLocale = GitBlitWebSession.get().getLocale();
 				if (sessionLocale != null) {
-					lc = sessionLocale.getLanguage() + "_" + sessionLocale.getCountry();
+					locale = sessionLocale;
 				}
+			} else {
+
 			}
 		}
+
 		Language preferredLanguage = null;
-		if (!StringUtils.isEmpty(lc)) {
+		if (locale != null) {
+			String localeCode = locale.getLanguage();
+			if (!StringUtils.isEmpty(locale.getCountry())) {
+				localeCode += "_" + locale.getCountry();
+			}
+
 			for (Language language : languages) {
-				if (language.code.equals(lc)) {
+				if (language.code.equals(localeCode)) {
 					// language_COUNTRY match
 					preferredLanguage = language;
-				} else if (preferredLanguage != null && lc.startsWith(language.code)) {
-					// language match, but not COUNTRY match
+				} else if (preferredLanguage != null && language.code.startsWith(locale.getLanguage())) {
+					// language match
 					preferredLanguage = language;
 				}
 			}
@@ -242,7 +250,7 @@
 
 				Language lang = language.getObject();
 				if (lang != null) {
-					user.getPreferences().locale = lang.code;
+					user.getPreferences().setLocale(lang.code);
 				}
 
 				try {

--
Gitblit v1.9.1