+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;
+
+/** Choose in a list of locales */
+public class LocaleCallback implements Callback {
+ private List<Locale> availableLocales = new ArrayList<Locale>();
+
+ private Integer selectedIndex = null;
+ private Integer defaultIndex = null;
+ private String prompt = "Language";
+
+ public LocaleCallback(Integer defaultIndex, List<Locale> availableLocales) {
+ this.availableLocales = Collections
+ .unmodifiableList(new ArrayList<Locale>(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() {
+ 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<Locale> 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));
+ }
+ }
+
+}