From: Mathieu Baudier
Date: Wed, 14 Oct 2015 11:06:16 +0000 (+0000)
Subject: Clean up before implementing i18n support
X-Git-Tag: argeo-commons-2.1.30~95
X-Git-Url: https://git.argeo.org/?a=commitdiff_plain;h=ad9eb24753d1486113cfbc19d8080f15ce5ff68a;p=lgpl%2Fargeo-commons.git
Clean up before implementing i18n support
git-svn-id: https://svn.argeo.org/commons/trunk@8482 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc
---
diff --git a/org.argeo.cms/src/org/argeo/cms/auth/AuthConstants.java b/org.argeo.cms/src/org/argeo/cms/auth/AuthConstants.java
index 932b847e3..26b96d43c 100644
--- a/org.argeo.cms/src/org/argeo/cms/auth/AuthConstants.java
+++ b/org.argeo.cms/src/org/argeo/cms/auth/AuthConstants.java
@@ -8,10 +8,6 @@ public interface AuthConstants {
final static String LOGIN_CONTEXT_SYSTEM = "SYSTEM";
final static String LOGIN_CONTEXT_SINGLE_USER = "SINGLE_USER";
- // HTTP
- @Deprecated
- final static String ACCESS_CONTROL_CONTEXT = "org.argeo.node.accessControlContext";
-
// RESERVED ROLES
public final static String ROLE_KERNEL = "OU=node";
public final static String ROLES_BASEDN = "ou=roles,ou=node";
@@ -23,8 +19,4 @@ public interface AuthConstants {
// user U anonymous = everyone
public final static String ROLE_USER = "cn=user," + ROLES_BASEDN;
public final static String ROLE_ANONYMOUS = "cn=anonymous," + ROLES_BASEDN;
-
- // SHARED STATE KEYS
- //public final static String BUNDLE_CONTEXT_KEY = "org.argeo.security.bundleContext";
- //public final static String AUTHORIZATION_KEY = "org.argeo.security.authorization";
}
diff --git a/org.argeo.cms/src/org/argeo/cms/auth/UserAdminLoginModule.java b/org.argeo.cms/src/org/argeo/cms/auth/UserAdminLoginModule.java
index ea8821185..53e48e8c1 100644
--- a/org.argeo.cms/src/org/argeo/cms/auth/UserAdminLoginModule.java
+++ b/org.argeo.cms/src/org/argeo/cms/auth/UserAdminLoginModule.java
@@ -2,12 +2,14 @@ package org.argeo.cms.auth;
import java.io.IOException;
import java.util.Iterator;
+import java.util.Locale;
import java.util.Map;
import java.util.Set;
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.LanguageCallback;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
@@ -19,6 +21,7 @@ import javax.servlet.http.HttpSession;
import org.argeo.ArgeoException;
import org.argeo.cms.internal.kernel.Activator;
+import org.argeo.eclipse.ui.specific.UiContext;
import org.osgi.framework.BundleContext;
import org.osgi.service.http.HttpContext;
import org.osgi.service.useradmin.Authorization;
@@ -60,9 +63,10 @@ public class UserAdminLoginModule implements LoginModule, AuthConstants {
NameCallback nameCallback = new NameCallback("User");
PasswordCallback passwordCallback = new PasswordCallback(
"Password", false);
+ LanguageCallback langCallback = new LanguageCallback();
try {
callbackHandler.handle(new Callback[] { httpCallback,
- nameCallback, passwordCallback });
+ nameCallback, passwordCallback, langCallback });
} catch (IOException e) {
throw new LoginException("Cannot handle http callback: "
+ e.getMessage());
@@ -77,20 +81,12 @@ public class UserAdminLoginModule implements LoginModule, AuthConstants {
authorization = (Authorization) request.getSession()
.getAttribute(HttpContext.AUTHORIZATION);
}
- // if (authorization == null || authorization.getName() == null)
- // if (!isAnonymous) {
- // // ask for username and password
- // NameCallback nameCallback = new NameCallback("User");
- // PasswordCallback passwordCallback = new PasswordCallback(
- // "Password", false);
- //
- // // handle callbacks
- // try {
- // callbackHandler.handle(new Callback[] { nameCallback,
- // passwordCallback });
- // } catch (Exception e) {
- // throw new ArgeoException("Cannot handle callbacks", e);
- // }
+
+ // i18n
+ Locale locale = langCallback.getLocale();
+ if (locale == null)
+ locale = Locale.getDefault();
+ UiContext.setLocale(locale);
if (authorization == null) {
// create credentials
diff --git a/org.argeo.cms/src/org/argeo/cms/i18n/Msg.java b/org.argeo.cms/src/org/argeo/cms/i18n/Msg.java
index b87b7b3d5..64982f6c7 100644
--- a/org.argeo.cms/src/org/argeo/cms/i18n/Msg.java
+++ b/org.argeo.cms/src/org/argeo/cms/i18n/Msg.java
@@ -6,7 +6,7 @@ import java.util.Locale;
import java.util.ResourceBundle;
import org.argeo.cms.CmsException;
-import org.eclipse.rap.rwt.RWT;
+import org.argeo.eclipse.ui.specific.UiContext;
/** A single message to be internationalised. */
public class Msg {
@@ -49,7 +49,7 @@ public class Msg {
/** When used as the first word of a sentence. */
public String lead() {
String raw = toString();
- return raw.substring(0, 1).toUpperCase(RWT.getLocale())
+ return raw.substring(0, 1).toUpperCase(UiContext.getLocale())
+ raw.substring(1);
}
@@ -67,7 +67,7 @@ public class Msg {
int lastDot = key.lastIndexOf('.');
String className = key.substring(0, lastDot);
String fieldName = key.substring(lastDot + 1);
- Locale locale = RWT.getLocale();
+ Locale locale = UiContext.getLocale();
ResourceBundle rb = ResourceBundle.getBundle(className, locale,
msg.getClassLoader());
return rb.getString(fieldName);
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/auth/ConsoleCallbackHandler.java b/org.argeo.cms/src/org/argeo/cms/internal/auth/ConsoleCallbackHandler.java
index 7ea9c0737..d5c6f0024 100644
--- a/org.argeo.cms/src/org/argeo/cms/internal/auth/ConsoleCallbackHandler.java
+++ b/org.argeo.cms/src/org/argeo/cms/internal/auth/ConsoleCallbackHandler.java
@@ -14,7 +14,7 @@ import javax.security.auth.callback.TextOutputCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.argeo.ArgeoException;
-import org.argeo.util.LocaleCallback;
+import org.argeo.util.LocaleChoice;
/** Callback handler to be used with a command line UI. */
public class ConsoleCallbackHandler implements CallbackHandler {
@@ -49,9 +49,9 @@ public class ConsoleCallbackHandler implements CallbackHandler {
char[] answer = console.readPassword();
callback.setPassword(answer);
Arrays.fill(answer, ' ');
- } else if (callbacks[i] instanceof LocaleCallback) {
- LocaleCallback callback = (LocaleCallback) callbacks[i];
- writer.write(callback.getPrompt());
+ } else if (callbacks[i] instanceof LocaleChoice) {
+ LocaleChoice callback = (LocaleChoice) callbacks[i];
+ writer.write("Language");
writer.write("\n");
for (int j = 0; j < callback.getAvailableLocales().size(); j++) {
Locale locale = callback.getAvailableLocales().get(j);
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java
index a942b4b18..1d40c9946 100644
--- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java
+++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java
@@ -22,7 +22,7 @@ public class Activator implements BundleActivator {
}
private static BundleContext bundleContext;
- private Kernel kernel;
+ private static Kernel kernel;
@Override
public void start(BundleContext context) throws Exception {
@@ -54,6 +54,10 @@ public class Activator implements BundleActivator {
return bundleContext;
}
+ public static KernelHeader getKernelHeader() {
+ return kernel;
+ }
+
/**
* @return a String which is guaranteed to be unique between and constant
* within a Java static context (typically a VM launch)
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java
index 68b3fa289..b95c19558 100644
--- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java
+++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java
@@ -54,7 +54,7 @@ import bitronix.tm.TransactionManagerServices;
* OS access
*
*/
-final class Kernel implements KernelConstants, ServiceListener {
+final class Kernel implements KernelHeader, KernelConstants, ServiceListener {
/*
* REGISTERED SERVICES
*/
@@ -100,12 +100,13 @@ final class Kernel implements KernelConstants, ServiceListener {
}
private void doInit() {
+ long begin = System.currentTimeMillis();
+
+ // Use CMS bundle classloader
ClassLoader currentContextCl = Thread.currentThread()
.getContextClassLoader();
Thread.currentThread().setContextClassLoader(
Kernel.class.getClassLoader());
- long begin = System.currentTimeMillis();
-
// KernelUtils.logFrameworkProperties(log);
try {
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java
index f528f6f70..9f45edb7f 100644
--- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java
+++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java
@@ -18,6 +18,8 @@ public interface KernelConstants {
final static String TRANSACTIONS_HOME = "argeo.node.transactions.home";
+ final static String I18N_AVAILABLE_LOCALES = "argeo.i18n.availableLocales";
+
// Node Security
final static String ROLES_URI = "argeo.node.roles.uri";
/** URI to an LDIF file or LDAP server used as initialization or backend */
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelHeader.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelHeader.java
new file mode 100644
index 000000000..f4d4d843a
--- /dev/null
+++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelHeader.java
@@ -0,0 +1,5 @@
+package org.argeo.cms.internal.kernel;
+
+public interface KernelHeader {
+
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java b/org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java
index 3f784407a..04e4f3c9f 100644
--- a/org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java
+++ b/org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java
@@ -8,6 +8,7 @@ import java.io.IOException;
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.LanguageCallback;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
@@ -21,6 +22,7 @@ import org.argeo.cms.CmsView;
import org.argeo.cms.auth.CurrentUser;
import org.argeo.cms.auth.HttpRequestCallback;
import org.argeo.cms.util.CmsUtils;
+import org.argeo.util.LocaleChoice;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
@@ -38,6 +40,7 @@ import org.eclipse.swt.widgets.Text;
public class CmsLogin implements CmsStyles, CallbackHandler {
private Text username, password;
private Composite credentialsBlock;
+ private LocaleChoice localeChoice = null;
private final CmsView cmsView;
@@ -177,6 +180,10 @@ public class CmsLogin implements CmsStyles, CallbackHandler {
.getTextChars());
else if (callback instanceof HttpRequestCallback)
((HttpRequestCallback) callback).setRequest(RWT.getRequest());
+ else if (callback instanceof LanguageCallback
+ && localeChoice != null)
+ ((LanguageCallback) callback).setLocale(localeChoice
+ .getSelectedLocale());
}
}
diff --git a/org.argeo.cms/src/org/argeo/cms/widgets/auth/CompositeCallbackHandler.java b/org.argeo.cms/src/org/argeo/cms/widgets/auth/CompositeCallbackHandler.java
index a87a1458c..bc99bc48b 100644
--- a/org.argeo.cms/src/org/argeo/cms/widgets/auth/CompositeCallbackHandler.java
+++ b/org.argeo.cms/src/org/argeo/cms/widgets/auth/CompositeCallbackHandler.java
@@ -10,7 +10,7 @@ import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.TextOutputCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
-import org.argeo.util.LocaleCallback;
+import org.argeo.util.LocaleChoice;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
@@ -40,7 +40,7 @@ import org.eclipse.swt.widgets.Text;
*
* Supported Argeo {@link Callback}s are:
*
- * - {@link LocaleCallback}
+ * - {@link LocaleChoice}
*
*
*/
@@ -98,7 +98,7 @@ public class CompositeCallbackHandler extends Composite implements
if (callback instanceof TextOutputCallback
|| callback instanceof NameCallback
|| callback instanceof PasswordCallback
- || callback instanceof LocaleCallback) {
+ || callback instanceof LocaleChoice) {
return;
} else {
throw new UnsupportedCallbackException(callback);
@@ -137,8 +137,8 @@ public class CompositeCallbackHandler extends Composite implements
createNameHandler(composite, (NameCallback) callback);
} else if (callback instanceof PasswordCallback) {
createPasswordHandler(composite, (PasswordCallback) callback);
- } else if (callback instanceof LocaleCallback) {
- createLocaleHandler(composite, (LocaleCallback) callback);
+ } else if (callback instanceof LocaleChoice) {
+ createLocaleHandler(composite, (LocaleChoice) callback);
}
}
}
@@ -220,12 +220,12 @@ public class CompositeCallbackHandler extends Composite implements
}
protected Combo createLocaleHandler(Composite composite,
- final LocaleCallback callback) {
+ final LocaleChoice callback) {
String[] labels = callback.getSupportedLocalesLabels();
if (labels.length == 0)
return null;
Label label = new Label(composite, SWT.NONE);
- label.setText(callback.getPrompt());
+ label.setText("Language");
final Combo combo = new Combo(composite, SWT.READ_ONLY);
combo.setItems(labels);
diff --git a/org.argeo.eclipse.ui.rap/src/org/argeo/eclipse/ui/specific/UiContext.java b/org.argeo.eclipse.ui.rap/src/org/argeo/eclipse/ui/specific/UiContext.java
index ce50873f8..82b606124 100644
--- a/org.argeo.eclipse.ui.rap/src/org/argeo/eclipse/ui/specific/UiContext.java
+++ b/org.argeo.eclipse.ui.rap/src/org/argeo/eclipse/ui/specific/UiContext.java
@@ -1,5 +1,7 @@
package org.argeo.eclipse.ui.specific;
+import java.util.Locale;
+
import javax.servlet.http.HttpServletRequest;
import org.eclipse.rap.rwt.RWT;
@@ -12,6 +14,14 @@ public class UiContext {
return RWT.getRequest();
}
+ public static Locale getLocale() {
+ return RWT.getUISession().getLocale();
+ }
+
+ public static void setLocale(Locale locale) {
+ RWT.getUISession().setLocale(locale);
+ }
+
/** Can always be null */
@SuppressWarnings("unchecked")
public static T getData(String key) {
diff --git a/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/SecureEntryPoint.java b/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/SecureEntryPoint.java
index 6a582f83f..c176ba62b 100644
--- a/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/SecureEntryPoint.java
+++ b/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/SecureEntryPoint.java
@@ -15,8 +15,6 @@
*/
package org.argeo.security.ui.rap;
-import static org.argeo.cms.auth.AuthConstants.ACCESS_CONTROL_CONTEXT;
-
import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.PrivilegedAction;
@@ -49,6 +47,7 @@ import org.eclipse.ui.PlatformUI;
* subject.
*/
public class SecureEntryPoint implements EntryPoint {
+ final static String ACCESS_CONTROL_CONTEXT = "org.argeo.node.accessControlContext";
private final static Log log = LogFactory.getLog(SecureEntryPoint.class);
/**
@@ -77,7 +76,7 @@ public class SecureEntryPoint implements EntryPoint {
HttpServletRequest httpRequest = RWT.getRequest();
final HttpSession httpSession = httpRequest.getSession();
AccessControlContext acc = (AccessControlContext) httpSession
- .getAttribute(AuthConstants.ACCESS_CONTROL_CONTEXT);
+ .getAttribute(ACCESS_CONTROL_CONTEXT);
final Subject subject;
if (acc != null
diff --git a/org.argeo.util/src/org/argeo/util/LocaleCallback.java b/org.argeo.util/src/org/argeo/util/LocaleCallback.java
deleted file mode 100644
index ac47e542a..000000000
--- a/org.argeo.util/src/org/argeo/util/LocaleCallback.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2007-2012 Argeo GmbH
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.argeo.util;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-
-import javax.security.auth.callback.Callback;
-import javax.security.auth.callback.LanguageCallback;
-
-/** Choose in a list of locales. TODO: replace with {@link LanguageCallback} */
-public class LocaleCallback implements Callback {
- private List availableLocales = new ArrayList();
-
- private Integer selectedIndex = null;
- private Integer defaultIndex = null;
- private String prompt = "Language";
-
- public LocaleCallback(Integer defaultIndex, List availableLocales) {
- this.availableLocales = Collections
- .unmodifiableList(new ArrayList(availableLocales));
- this.defaultIndex = defaultIndex;
- this.selectedIndex = defaultIndex;
- }
-
- /**
- * Convenience constructor based on a comma separated list of iso codes (en,
- * en_US, fr_CA, etc.). Default selection is default locale.
- */
- public LocaleCallback(String locales) {
- if (locales == null || locales.trim().equals(""))
- return;
- String[] codes = locales.split(",");
- for (int i = 0; i < codes.length; i++) {
- String code = codes[i];
- // variant not supported
- int indexUnd = code.indexOf("_");
- Locale locale;
- if (indexUnd > 0) {
- String language = code.substring(0, indexUnd);
- String country = code.substring(indexUnd + 1);
- locale = new Locale(language, country);
- } else {
- locale = new Locale(code);
- }
- availableLocales.add(locale);
- if (locale.equals(Locale.getDefault()))
- defaultIndex = i;
- }
-
- if (defaultIndex == null)
- defaultIndex = 0;
-
- this.selectedIndex = defaultIndex;
- }
-
- public String[] getSupportedLocalesLabels() {
- String[] labels = new String[availableLocales.size()];
- for (int i = 0; i < availableLocales.size(); i++) {
- Locale locale = availableLocales.get(i);
- if (locale.getCountry().equals(""))
- labels[i] = locale.getDisplayLanguage(locale) + " ["
- + locale.getLanguage() + "]";
- else
- labels[i] = locale.getDisplayLanguage(locale) + " ("
- + locale.getDisplayCountry(locale) + ") ["
- + locale.getLanguage() + "_" + locale.getCountry()
- + "]";
-
- }
- return labels;
- }
-
- public Locale getSelectedLocale() {
- if (selectedIndex == null)
- return null;
- return availableLocales.get(selectedIndex);
- }
-
- public void setSelectedIndex(Integer selectedIndex) {
- this.selectedIndex = selectedIndex;
- }
-
- public Integer getDefaultIndex() {
- return defaultIndex;
- }
-
- public String getPrompt() {
- // TODO localize it?
- return prompt;
- }
-
- public void setPrompt(String prompt) {
- this.prompt = prompt;
- }
-
- public List getAvailableLocales() {
- return availableLocales;
- }
-
- public static void main(String[] args) {
- for (String isoL : Locale.getISOLanguages()) {
- Locale locale = new Locale(isoL);
- System.out.println(isoL + "\t" + locale.getDisplayLanguage() + "\t"
- + locale.getDisplayLanguage(locale));
- }
- }
-
-}
diff --git a/org.argeo.util/src/org/argeo/util/LocaleChoice.java b/org.argeo.util/src/org/argeo/util/LocaleChoice.java
new file mode 100644
index 000000000..aaf719db4
--- /dev/null
+++ b/org.argeo.util/src/org/argeo/util/LocaleChoice.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2007-2012 Argeo GmbH
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.argeo.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import javax.security.auth.callback.LanguageCallback;
+
+/** Choose in a list of locales. TODO: replace with {@link LanguageCallback} */
+public class LocaleChoice {
+ private List availableLocales = new ArrayList();
+
+ private Integer selectedIndex = null;
+ private Integer defaultIndex = null;
+
+ // public LocaleCallback(Integer defaultIndex, List
+ // availableLocales) {
+ // this.availableLocales = Collections
+ // .unmodifiableList(new ArrayList(availableLocales));
+ // this.defaultIndex = defaultIndex;
+ // this.selectedIndex = defaultIndex;
+ // }
+
+ /**
+ * Convenience constructor based on a comma separated list of iso codes (en,
+ * en_US, fr_CA, etc.). Default selection is default locale.
+ */
+ public LocaleChoice(String locales, Locale defaultLocale) {
+ if (locales == null || locales.trim().equals(""))
+ return;
+ String[] codes = locales.split(",");
+ for (int i = 0; i < codes.length; i++) {
+ String code = codes[i];
+ // variant not supported
+ int indexUnd = code.indexOf("_");
+ Locale locale;
+ if (indexUnd > 0) {
+ String language = code.substring(0, indexUnd);
+ String country = code.substring(indexUnd + 1);
+ locale = new Locale(language, country);
+ } else {
+ locale = new Locale(code);
+ }
+ availableLocales.add(locale);
+ if (locale.equals(defaultLocale))
+ defaultIndex = i;
+ }
+
+ if (defaultIndex == null)
+ defaultIndex = 0;
+
+ this.selectedIndex = defaultIndex;
+ }
+
+ public String[] getSupportedLocalesLabels() {
+ String[] labels = new String[availableLocales.size()];
+ for (int i = 0; i < availableLocales.size(); i++) {
+ Locale locale = availableLocales.get(i);
+ if (locale.getCountry().equals(""))
+ labels[i] = locale.getDisplayLanguage(locale) + " ["
+ + locale.getLanguage() + "]";
+ else
+ labels[i] = locale.getDisplayLanguage(locale) + " ("
+ + locale.getDisplayCountry(locale) + ") ["
+ + locale.getLanguage() + "_" + locale.getCountry()
+ + "]";
+
+ }
+ return labels;
+ }
+
+ public Locale getSelectedLocale() {
+ if (selectedIndex == null)
+ return null;
+ return availableLocales.get(selectedIndex);
+ }
+
+ public void setSelectedIndex(Integer selectedIndex) {
+ this.selectedIndex = selectedIndex;
+ }
+
+ public Integer getDefaultIndex() {
+ return defaultIndex;
+ }
+
+ public List getAvailableLocales() {
+ return availableLocales;
+ }
+
+ public Locale getDefaultLocale() {
+ return availableLocales.get(getDefaultIndex());
+ }
+
+ public static void main(String[] args) {
+ for (String isoL : Locale.getISOLanguages()) {
+ Locale locale = new Locale(isoL);
+ System.out.println(isoL + "\t" + locale.getDisplayLanguage() + "\t"
+ + locale.getDisplayLanguage(locale));
+ }
+ }
+
+}