]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/LocaleUtils.java
Merge remote-tracking branch 'origin/master' into v2.x
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / LocaleUtils.java
1 package org.argeo.cms;
2
3 import java.security.AccessController;
4 import java.util.ArrayList;
5 import java.util.List;
6 import java.util.Locale;
7 import java.util.ResourceBundle;
8
9 import javax.security.auth.Subject;
10
11 import org.apache.commons.logging.Log;
12 import org.apache.commons.logging.LogFactory;
13 import org.argeo.cms.auth.CurrentUser;
14
15 /** Utilities simplifying the development of localization enums. */
16 public class LocaleUtils {
17 private final static Log log = LogFactory.getLog(LocaleUtils.class);
18
19 private final static ThreadLocal<Locale> threadLocale = new ThreadLocal<>();
20
21 public static void setThreadLocale(Locale locale) {
22 threadLocale.set(locale);
23 }
24
25 public static String local(Enum<?> en) {
26 return local(en, getCurrentLocale(), "/OSGI-INF/l10n/bundle");
27 }
28
29 public static String local(Enum<?> en, Locale locale) {
30 return local(en, locale, "/OSGI-INF/l10n/bundle");
31 }
32
33 public static String local(Enum<?> en, Locale locale, String resource) {
34 return local(en, locale, resource, en.getClass().getClassLoader());
35 }
36
37 public static String local(Enum<?> en, Locale locale, String resource, ClassLoader classLoader) {
38 return local(en.name(), locale, resource, classLoader);
39 }
40
41 public static String local(String key, ClassLoader classLoader) {
42 return local(key, getCurrentLocale(), "/OSGI-INF/l10n/bundle", classLoader);
43 }
44
45 public static String local(String key, Locale locale, ClassLoader classLoader) {
46 return local(key, locale, "/OSGI-INF/l10n/bundle", classLoader);
47 }
48
49 public static String local(String key, Locale locale, String resource, ClassLoader classLoader) {
50 ResourceBundle rb = ResourceBundle.getBundle(resource, locale, classLoader);
51 assert key.length() > 2;
52 if (isLocaleKey(key))
53 key = key.substring(1);
54 return rb.getString(key);
55 }
56
57 public static boolean isLocaleKey(String str) {
58 if (str.length() > 2 && ('%' == str.charAt(0)))
59 return true;
60 else
61 return false;
62 }
63
64 public static String lead(String raw, Locale locale) {
65 return raw.substring(0, 1).toUpperCase(locale) + raw.substring(1);
66 }
67
68 public static String lead(Localized localized) {
69 return lead(localized, getCurrentLocale());
70 }
71
72 public static String lead(Localized localized, Locale locale) {
73 return lead(localized.local(locale).toString(), locale);
74 }
75
76 static Locale getCurrentLocale() {
77 Locale currentLocale = null;
78 if (Subject.getSubject(AccessController.getContext()) != null)
79 currentLocale = CurrentUser.locale();
80 else if (threadLocale.get() != null) {
81 currentLocale = threadLocale.get();
82 }
83 if (log.isTraceEnabled())
84 log.trace("Thread #" + Thread.currentThread().getId() + " " + Thread.currentThread().getName() + " locale: "
85 + currentLocale);
86 if (currentLocale == null)
87 throw new IllegalStateException("No locale found");
88 return currentLocale;
89 // return UiContext.getLocale();
90 // FIXME look into Subject or settings
91 // return Locale.getDefault();
92 }
93
94 /** Returns null if argument is null. */
95 public static List<Locale> asLocaleList(Object locales) {
96 if (locales == null)
97 return null;
98 ArrayList<Locale> availableLocales = new ArrayList<Locale>();
99 String[] codes = locales.toString().split(",");
100 for (int i = 0; i < codes.length; i++) {
101 String code = codes[i];
102 // variant not supported
103 int indexUnd = code.indexOf("_");
104 Locale locale;
105 if (indexUnd > 0) {
106 String language = code.substring(0, indexUnd);
107 String country = code.substring(indexUnd + 1);
108 locale = new Locale(language, country);
109 } else {
110 locale = new Locale(code);
111 }
112 availableLocales.add(locale);
113 }
114 return availableLocales;
115 }
116 }