Make locale utils more generic.
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 3 Oct 2020 15:35:26 +0000 (17:35 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 3 Oct 2020 15:35:26 +0000 (17:35 +0200)
org.argeo.cms/src/org/argeo/cms/LocaleUtils.java

index c6c932bf8c08c3cb7d0665f2dd2f6e53aff944ba..24ca3558c7dcc57ae657cd445b2de509669de6ce 100644 (file)
@@ -1,29 +1,54 @@
 package org.argeo.cms;
 
+import java.security.AccessController;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 import java.util.ResourceBundle;
 
+import javax.security.auth.Subject;
+
 import org.argeo.cms.auth.CurrentUser;
 
 /** Utilities simplifying the development of localization enums. */
 public class LocaleUtils {
-       public static Object local(Enum<?> en) {
+       public static String local(Enum<?> en) {
                return local(en, getCurrentLocale(), "/OSGI-INF/l10n/bundle");
        }
 
-       public static Object local(Enum<?> en, Locale locale) {
+       public static String local(Enum<?> en, Locale locale) {
                return local(en, locale, "/OSGI-INF/l10n/bundle");
        }
 
-       public static Object local(Enum<?> en, Locale locale, String resource) {
+       public static String local(Enum<?> en, Locale locale, String resource) {
                return local(en, locale, resource, en.getClass().getClassLoader());
        }
 
-       public static Object local(Enum<?> en, Locale locale, String resource, ClassLoader classLoader) {
+       public static String local(Enum<?> en, Locale locale, String resource, ClassLoader classLoader) {
+               return local(en.name(), locale, resource, classLoader);
+       }
+
+       public static String local(String key, ClassLoader classLoader) {
+               return local(key, getCurrentLocale(), "/OSGI-INF/l10n/bundle", classLoader);
+       }
+
+       public static String local(String key, Locale locale, ClassLoader classLoader) {
+               return local(key, locale, "/OSGI-INF/l10n/bundle", classLoader);
+       }
+
+       public static String local(String key, Locale locale, String resource, ClassLoader classLoader) {
                ResourceBundle rb = ResourceBundle.getBundle(resource, locale, classLoader);
-               return rb.getString(en.name());
+               assert key.length() > 2;
+               if (isLocaleKey(key))
+                       key = key.substring(1);
+               return rb.getString(key);
+       }
+
+       public static boolean isLocaleKey(String str) {
+               if (str.length() > 2 && ('%' == str.charAt(0)))
+                       return true;
+               else
+                       return false;
        }
 
        public static String lead(String raw, Locale locale) {
@@ -39,7 +64,10 @@ public class LocaleUtils {
        }
 
        static Locale getCurrentLocale() {
-               return CurrentUser.locale();
+               if (Subject.getSubject(AccessController.getContext()) != null)
+                       return CurrentUser.locale();
+               else
+                       return Locale.getDefault();
                // return UiContext.getLocale();
                // FIXME look into Subject or settings
                // return Locale.getDefault();