浏览代码

locale util refactoring

jrivard@gmail.com 6 年之前
父节点
当前提交
2d42dd9e70
共有 76 个文件被更改,包括 489 次插入375 次删除
  1. 1 1
      server/src/main/java/password/pwm/PwmAboutProperty.java
  2. 1 1
      server/src/main/java/password/pwm/PwmConstants.java
  3. 1 1
      server/src/main/java/password/pwm/config/Configuration.java
  4. 1 1
      server/src/main/java/password/pwm/config/CustomLinkConfiguration.java
  5. 1 1
      server/src/main/java/password/pwm/config/LDAPPermissionInfo.java
  6. 1 1
      server/src/main/java/password/pwm/config/PwmSetting.java
  7. 1 1
      server/src/main/java/password/pwm/config/PwmSettingCategory.java
  8. 1 1
      server/src/main/java/password/pwm/config/function/UserMatchViewerFunction.java
  9. 1 1
      server/src/main/java/password/pwm/config/profile/ChallengeProfile.java
  10. 1 1
      server/src/main/java/password/pwm/config/profile/PwmPasswordRule.java
  11. 1 1
      server/src/main/java/password/pwm/config/stored/StoredConfigurationImpl.java
  12. 1 1
      server/src/main/java/password/pwm/config/value/ChallengeValue.java
  13. 1 1
      server/src/main/java/password/pwm/config/value/EmailValue.java
  14. 1 1
      server/src/main/java/password/pwm/config/value/LocalizedStringArrayValue.java
  15. 1 1
      server/src/main/java/password/pwm/config/value/LocalizedStringValue.java
  16. 1 1
      server/src/main/java/password/pwm/config/value/VerificationMethodValue.java
  17. 1 1
      server/src/main/java/password/pwm/config/value/data/FormConfiguration.java
  18. 1 1
      server/src/main/java/password/pwm/error/PwmError.java
  19. 1 1
      server/src/main/java/password/pwm/health/ConfigurationChecker.java
  20. 1 1
      server/src/main/java/password/pwm/health/HealthMessage.java
  21. 1 1
      server/src/main/java/password/pwm/health/HealthStatus.java
  22. 1 1
      server/src/main/java/password/pwm/health/HealthTopic.java
  23. 1 1
      server/src/main/java/password/pwm/http/JspUtility.java
  24. 1 1
      server/src/main/java/password/pwm/http/PwmSession.java
  25. 1 1
      server/src/main/java/password/pwm/http/filter/AuthenticationFilter.java
  26. 1 1
      server/src/main/java/password/pwm/http/filter/RequestInitializationFilter.java
  27. 1 1
      server/src/main/java/password/pwm/http/servlet/ClientApiServlet.java
  28. 1 1
      server/src/main/java/password/pwm/http/servlet/admin/AdminServlet.java
  29. 1 1
      server/src/main/java/password/pwm/http/servlet/admin/AppDashboardData.java
  30. 1 1
      server/src/main/java/password/pwm/http/servlet/configeditor/NavTreeHelper.java
  31. 1 1
      server/src/main/java/password/pwm/http/servlet/configmanager/ConfigManagerServlet.java
  32. 1 1
      server/src/main/java/password/pwm/http/servlet/configmanager/ConfigManagerWordlistServlet.java
  33. 1 1
      server/src/main/java/password/pwm/http/servlet/helpdesk/HelpdeskDetailInfoBean.java
  34. 1 1
      server/src/main/java/password/pwm/http/servlet/peoplesearch/PeopleSearchDataReader.java
  35. 1 1
      server/src/main/java/password/pwm/http/tag/DisplayTag.java
  36. 1 1
      server/src/main/java/password/pwm/http/tag/JspThrowableHandlerTag.java
  37. 1 1
      server/src/main/java/password/pwm/http/tag/PasswordRequirementsTag.java
  38. 1 1
      server/src/main/java/password/pwm/http/tag/value/PwmValue.java
  39. 1 1
      server/src/main/java/password/pwm/i18n/Config.java
  40. 1 1
      server/src/main/java/password/pwm/i18n/Display.java
  41. 1 1
      server/src/main/java/password/pwm/i18n/Message.java
  42. 1 1
      server/src/main/java/password/pwm/ldap/LdapOperationsHelper.java
  43. 1 1
      server/src/main/java/password/pwm/ldap/PasswordChangeProgressChecker.java
  44. 1 1
      server/src/main/java/password/pwm/ldap/UserInfoReader.java
  45. 1 1
      server/src/main/java/password/pwm/ldap/ViewableUserInfoDisplayReader.java
  46. 1 1
      server/src/main/java/password/pwm/svc/event/AuditRecordFactory.java
  47. 1 1
      server/src/main/java/password/pwm/svc/event/AuditService.java
  48. 1 1
      server/src/main/java/password/pwm/svc/event/SyslogAuditService.java
  49. 1 1
      server/src/main/java/password/pwm/svc/intruder/IntruderManager.java
  50. 1 1
      server/src/main/java/password/pwm/svc/pwnotify/PwNotifyEngine.java
  51. 1 1
      server/src/main/java/password/pwm/svc/report/ReportCsvUtility.java
  52. 1 1
      server/src/main/java/password/pwm/svc/report/ReportSummaryData.java
  53. 1 1
      server/src/main/java/password/pwm/svc/sessiontrack/SessionTrackService.java
  54. 1 1
      server/src/main/java/password/pwm/svc/stats/EpsStatistic.java
  55. 1 1
      server/src/main/java/password/pwm/svc/stats/Statistic.java
  56. 1 0
      server/src/main/java/password/pwm/util/LDAPPermissionCalculator.java
  57. 122 0
      server/src/main/java/password/pwm/util/i18n/ConfigLocaleStats.java
  58. 31 252
      server/src/main/java/password/pwm/util/i18n/LocaleHelper.java
  59. 241 0
      server/src/main/java/password/pwm/util/i18n/LocaleStats.java
  60. 1 1
      server/src/main/java/password/pwm/util/java/TimeDuration.java
  61. 1 1
      server/src/main/java/password/pwm/ws/server/RestRequest.java
  62. 1 1
      server/src/main/java/password/pwm/ws/server/RestServlet.java
  63. 1 1
      server/src/main/resources/password/pwm/PwmConstants.properties
  64. 1 1
      webapp/src/main/webapp/WEB-INF/jsp/admin-activity.jsp
  65. 1 1
      webapp/src/main/webapp/WEB-INF/jsp/admin-user-debug.jsp
  66. 1 1
      webapp/src/main/webapp/WEB-INF/jsp/configmanager-certificates.jsp
  67. 1 1
      webapp/src/main/webapp/WEB-INF/jsp/configmanager-localdb.jsp
  68. 1 1
      webapp/src/main/webapp/WEB-INF/jsp/configmanager-login.jsp
  69. 1 1
      webapp/src/main/webapp/WEB-INF/jsp/configmanager-summary.jsp
  70. 1 1
      webapp/src/main/webapp/WEB-INF/jsp/configmanager-wordlists.jsp
  71. 1 1
      webapp/src/main/webapp/WEB-INF/jsp/configmanager.jsp
  72. 1 1
      webapp/src/main/webapp/WEB-INF/jsp/fragment/ldap-permissions.jsp
  73. 1 1
      webapp/src/main/webapp/WEB-INF/jsp/setupotpsecret-test.jsp
  74. 1 1
      webapp/src/main/webapp/public/reference/displaystrings.jsp
  75. 23 52
      webapp/src/main/webapp/public/reference/localeinfo.jsp
  76. 1 1
      webapp/src/main/webapp/public/reference/settings.jsp

+ 1 - 1
server/src/main/java/password/pwm/PwmAboutProperty.java

@@ -24,7 +24,7 @@ package password.pwm;
 
 
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.Display;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.db.DatabaseService;
 import password.pwm.util.db.DatabaseService;
 import password.pwm.util.java.FileSystemUtility;
 import password.pwm.util.java.FileSystemUtility;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;

+ 1 - 1
server/src/main/java/password/pwm/PwmConstants.java

@@ -77,7 +77,6 @@ public abstract class PwmConstants
 
 
     public static final String PWM_APP_NAME = readPwmConstantsBundle( "pwm.appName" );
     public static final String PWM_APP_NAME = readPwmConstantsBundle( "pwm.appName" );
     public static final String PWM_URL_HOME = readPwmConstantsBundle( "url.pwm-home" );
     public static final String PWM_URL_HOME = readPwmConstantsBundle( "url.pwm-home" );
-    public static final String PWM_URL_CLOUD = readPwmConstantsBundle( "url.pwm-cloud" );
 
 
     public static final String PWM_APP_NAME_VERSION = PWM_APP_NAME + " " + SERVLET_VERSION;
     public static final String PWM_APP_NAME_VERSION = PWM_APP_NAME + " " + SERVLET_VERSION;
 
 
@@ -85,6 +84,7 @@ public abstract class PwmConstants
 
 
     public static final Locale DEFAULT_LOCALE = new Locale( readPwmConstantsBundle( "locale.defaultLocale" ) );
     public static final Locale DEFAULT_LOCALE = new Locale( readPwmConstantsBundle( "locale.defaultLocale" ) );
     public static final Charset DEFAULT_CHARSET = Charset.forName( "UTF8" );
     public static final Charset DEFAULT_CHARSET = Charset.forName( "UTF8" );
+    public static final List<String> HIGHLIGHT_LOCALES = StringUtil.splitAndTrim( readPwmConstantsBundle( "locale.highlightList" ), "," );
 
 
     public static final CSVFormat DEFAULT_CSV_FORMAT = CSVFormat.DEFAULT;
     public static final CSVFormat DEFAULT_CSV_FORMAT = CSVFormat.DEFAULT;
 
 

+ 1 - 1
server/src/main/java/password/pwm/config/Configuration.java

@@ -70,7 +70,7 @@ import password.pwm.config.value.data.UserPermission;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PasswordData;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogLevel;
 import password.pwm.util.logging.PwmLogLevel;

+ 1 - 1
server/src/main/java/password/pwm/config/CustomLinkConfiguration.java

@@ -23,7 +23,7 @@
 package password.pwm.config;
 package password.pwm.config;
 
 
 import lombok.Getter;
 import lombok.Getter;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;
 
 
 import java.io.Serializable;
 import java.io.Serializable;

+ 1 - 1
server/src/main/java/password/pwm/config/LDAPPermissionInfo.java

@@ -23,7 +23,7 @@
 package password.pwm.config;
 package password.pwm.config;
 
 
 import password.pwm.i18n.Config;
 import password.pwm.i18n.Config;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.macro.MacroMachine;
 import password.pwm.util.macro.MacroMachine;
 
 
 import java.io.Serializable;
 import java.io.Serializable;

+ 1 - 1
server/src/main/java/password/pwm/config/PwmSetting.java

@@ -27,7 +27,7 @@ import org.jdom2.Element;
 import password.pwm.config.value.PasswordValue;
 import password.pwm.config.value.PasswordValue;
 import password.pwm.config.value.ValueFactory;
 import password.pwm.config.value.ValueFactory;
 import password.pwm.i18n.Config;
 import password.pwm.i18n.Config;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;

+ 1 - 1
server/src/main/java/password/pwm/config/PwmSettingCategory.java

@@ -25,7 +25,7 @@ package password.pwm.config;
 import org.jdom2.Attribute;
 import org.jdom2.Attribute;
 import org.jdom2.Element;
 import org.jdom2.Element;
 import password.pwm.i18n.Config;
 import password.pwm.i18n.Config;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collection;

+ 1 - 1
server/src/main/java/password/pwm/config/function/UserMatchViewerFunction.java

@@ -42,7 +42,7 @@ import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequest;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.Display;
 import password.pwm.ldap.LdapPermissionTester;
 import password.pwm.ldap.LdapPermissionTester;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 
 

+ 1 - 1
server/src/main/java/password/pwm/config/profile/ChallengeProfile.java

@@ -38,7 +38,7 @@ import password.pwm.config.value.data.UserPermission;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.ErrorInformation;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmOperationalException;
 import password.pwm.error.PwmOperationalException;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 
 
 import java.io.Serializable;
 import java.io.Serializable;

+ 1 - 1
server/src/main/java/password/pwm/config/profile/PwmPasswordRule.java

@@ -27,7 +27,7 @@ import password.pwm.AppProperty;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.i18n.Message;
 import password.pwm.i18n.Message;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 
 
 import java.util.HashSet;
 import java.util.HashSet;

+ 1 - 1
server/src/main/java/password/pwm/config/stored/StoredConfigurationImpl.java

@@ -56,7 +56,7 @@ import password.pwm.error.PwmOperationalException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.i18n.Config;
 import password.pwm.i18n.Config;
 import password.pwm.i18n.PwmLocaleBundle;
 import password.pwm.i18n.PwmLocaleBundle;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PasswordData;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;

+ 1 - 1
server/src/main/java/password/pwm/config/value/ChallengeValue.java

@@ -28,7 +28,7 @@ import org.jdom2.Element;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.StoredValue;
 import password.pwm.config.StoredValue;
 import password.pwm.config.value.data.ChallengeItemConfiguration;
 import password.pwm.config.value.data.ChallengeItemConfiguration;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.secure.PwmSecurityKey;
 import password.pwm.util.secure.PwmSecurityKey;

+ 1 - 1
server/src/main/java/password/pwm/config/value/EmailValue.java

@@ -28,7 +28,7 @@ import password.pwm.bean.EmailItemBean;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.StoredValue;
 import password.pwm.config.StoredValue;
 import password.pwm.error.PwmOperationalException;
 import password.pwm.error.PwmOperationalException;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.secure.PwmSecurityKey;
 import password.pwm.util.secure.PwmSecurityKey;
 
 

+ 1 - 1
server/src/main/java/password/pwm/config/value/LocalizedStringArrayValue.java

@@ -27,7 +27,7 @@ import org.jdom2.CDATA;
 import org.jdom2.Element;
 import org.jdom2.Element;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.StoredValue;
 import password.pwm.config.StoredValue;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.secure.PwmSecurityKey;
 import password.pwm.util.secure.PwmSecurityKey;
 
 

+ 1 - 1
server/src/main/java/password/pwm/config/value/LocalizedStringValue.java

@@ -27,7 +27,7 @@ import org.jdom2.CDATA;
 import org.jdom2.Element;
 import org.jdom2.Element;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.StoredValue;
 import password.pwm.config.StoredValue;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.secure.PwmSecurityKey;
 import password.pwm.util.secure.PwmSecurityKey;
 
 

+ 1 - 1
server/src/main/java/password/pwm/config/value/VerificationMethodValue.java

@@ -30,7 +30,7 @@ import password.pwm.config.StoredValue;
 import password.pwm.config.option.IdentityVerificationMethod;
 import password.pwm.config.option.IdentityVerificationMethod;
 import password.pwm.error.PwmOperationalException;
 import password.pwm.error.PwmOperationalException;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.Display;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.secure.PwmSecurityKey;
 import password.pwm.util.secure.PwmSecurityKey;

+ 1 - 1
server/src/main/java/password/pwm/config/value/data/FormConfiguration.java

@@ -35,7 +35,7 @@ import password.pwm.error.PwmError;
 import password.pwm.error.PwmOperationalException;
 import password.pwm.error.PwmOperationalException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.Display;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 
 

+ 1 - 1
server/src/main/java/password/pwm/error/PwmError.java

@@ -24,7 +24,7 @@ package password.pwm.error;
 
 
 import com.novell.ldapchai.exception.ChaiError;
 import com.novell.ldapchai.exception.ChaiError;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 
 
 import java.util.Collections;
 import java.util.Collections;

+ 1 - 1
server/src/main/java/password/pwm/health/ConfigurationChecker.java

@@ -42,7 +42,7 @@ import password.pwm.config.value.data.FormConfiguration;
 import password.pwm.error.PwmException;
 import password.pwm.error.PwmException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.i18n.Config;
 import password.pwm.i18n.Config;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PasswordData;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;

+ 1 - 1
server/src/main/java/password/pwm/health/HealthMessage.java

@@ -23,7 +23,7 @@
 package password.pwm.health;
 package password.pwm.health;
 
 
 import password.pwm.i18n.Health;
 import password.pwm.i18n.Health;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 
 
 import java.util.Locale;
 import java.util.Locale;
 
 

+ 1 - 1
server/src/main/java/password/pwm/health/HealthStatus.java

@@ -23,7 +23,7 @@
 package password.pwm.health;
 package password.pwm.health;
 
 
 import password.pwm.i18n.Health;
 import password.pwm.i18n.Health;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 
 
 import java.util.Locale;
 import java.util.Locale;
 
 

+ 1 - 1
server/src/main/java/password/pwm/health/HealthTopic.java

@@ -23,7 +23,7 @@
 package password.pwm.health;
 package password.pwm.health;
 
 
 import password.pwm.i18n.Health;
 import password.pwm.i18n.Health;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 
 
 import java.util.Locale;
 import java.util.Locale;
 
 

+ 1 - 1
server/src/main/java/password/pwm/http/JspUtility.java

@@ -28,7 +28,7 @@ import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.bean.PwmSessionBean;
 import password.pwm.http.bean.PwmSessionBean;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.PwmDisplayBundle;
 import password.pwm.i18n.PwmDisplayBundle;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 
 

+ 1 - 1
server/src/main/java/password/pwm/http/PwmSession.java

@@ -39,7 +39,7 @@ import password.pwm.ldap.UserInfoFactory;
 import password.pwm.ldap.auth.AuthenticationType;
 import password.pwm.ldap.auth.AuthenticationType;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.StatisticsManager;
 import password.pwm.svc.stats.StatisticsManager;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;

+ 1 - 1
server/src/main/java/password/pwm/http/filter/AuthenticationFilter.java

@@ -56,7 +56,7 @@ import password.pwm.ldap.search.UserSearchEngine;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.StatisticsManager;
 import password.pwm.svc.stats.StatisticsManager;
 import password.pwm.util.BasicAuthInfo;
 import password.pwm.util.BasicAuthInfo;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 
 
 import javax.servlet.ServletException;
 import javax.servlet.ServletException;

+ 1 - 1
server/src/main/java/password/pwm/http/filter/RequestInitializationFilter.java

@@ -48,7 +48,7 @@ import password.pwm.svc.stats.EpsStatistic;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.StatisticsManager;
 import password.pwm.svc.stats.StatisticsManager;
 import password.pwm.util.IPMatcher;
 import password.pwm.util.IPMatcher;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;

+ 1 - 1
server/src/main/java/password/pwm/http/servlet/ClientApiServlet.java

@@ -47,7 +47,7 @@ import password.pwm.http.PwmURL;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.Display;
 import password.pwm.svc.stats.EpsStatistic;
 import password.pwm.svc.stats.EpsStatistic;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.Statistic;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.macro.MacroMachine;
 import password.pwm.util.macro.MacroMachine;

+ 1 - 1
server/src/main/java/password/pwm/http/servlet/admin/AdminServlet.java

@@ -61,7 +61,7 @@ import password.pwm.svc.report.ReportCsvUtility;
 import password.pwm.svc.report.ReportService;
 import password.pwm.svc.report.ReportService;
 import password.pwm.svc.report.UserCacheRecord;
 import password.pwm.svc.report.UserCacheRecord;
 import password.pwm.svc.stats.StatisticsManager;
 import password.pwm.svc.stats.StatisticsManager;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.db.DatabaseException;
 import password.pwm.util.db.DatabaseException;
 import password.pwm.util.java.ClosableIterator;
 import password.pwm.util.java.ClosableIterator;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;

+ 1 - 1
server/src/main/java/password/pwm/http/servlet/admin/AppDashboardData.java

@@ -38,7 +38,7 @@ import password.pwm.i18n.Display;
 import password.pwm.svc.PwmService;
 import password.pwm.svc.PwmService;
 import password.pwm.svc.cluster.NodeInfo;
 import password.pwm.svc.cluster.NodeInfo;
 import password.pwm.svc.sessiontrack.SessionTrackService;
 import password.pwm.svc.sessiontrack.SessionTrackService;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.FileSystemUtility;
 import password.pwm.util.java.FileSystemUtility;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.PwmNumberFormat;
 import password.pwm.util.java.PwmNumberFormat;

+ 1 - 1
server/src/main/java/password/pwm/http/servlet/configeditor/NavTreeHelper.java

@@ -33,7 +33,7 @@ import password.pwm.config.stored.StoredConfigurationImpl;
 import password.pwm.config.stored.StoredConfigurationUtil;
 import password.pwm.config.stored.StoredConfigurationUtil;
 import password.pwm.i18n.Config;
 import password.pwm.i18n.Config;
 import password.pwm.i18n.PwmLocaleBundle;
 import password.pwm.i18n.PwmLocaleBundle;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;

+ 1 - 1
server/src/main/java/password/pwm/http/servlet/configmanager/ConfigManagerServlet.java

@@ -57,7 +57,7 @@ import password.pwm.svc.event.AuditEvent;
 import password.pwm.svc.event.AuditRecord;
 import password.pwm.svc.event.AuditRecord;
 import password.pwm.svc.event.AuditRecordFactory;
 import password.pwm.svc.event.AuditRecordFactory;
 import password.pwm.util.LDAPPermissionCalculator;
 import password.pwm.util.LDAPPermissionCalculator;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.ws.server.RestResultBean;
 import password.pwm.ws.server.RestResultBean;

+ 1 - 1
server/src/main/java/password/pwm/http/servlet/configmanager/ConfigManagerWordlistServlet.java

@@ -43,7 +43,7 @@ import password.pwm.svc.wordlist.WordlistConfiguration;
 import password.pwm.svc.wordlist.WordlistSourceType;
 import password.pwm.svc.wordlist.WordlistSourceType;
 import password.pwm.svc.wordlist.WordlistStatus;
 import password.pwm.svc.wordlist.WordlistStatus;
 import password.pwm.svc.wordlist.WordlistType;
 import password.pwm.svc.wordlist.WordlistType;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;

+ 1 - 1
server/src/main/java/password/pwm/http/servlet/helpdesk/HelpdeskDetailInfoBean.java

@@ -47,7 +47,7 @@ import password.pwm.i18n.Display;
 import password.pwm.ldap.UserInfo;
 import password.pwm.ldap.UserInfo;
 import password.pwm.ldap.UserInfoFactory;
 import password.pwm.ldap.UserInfoFactory;
 import password.pwm.ldap.ViewableUserInfoDisplayReader;
 import password.pwm.ldap.ViewableUserInfoDisplayReader;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;

+ 1 - 1
server/src/main/java/password/pwm/http/servlet/peoplesearch/PeopleSearchDataReader.java

@@ -56,7 +56,7 @@ import password.pwm.svc.cache.CacheLoader;
 import password.pwm.svc.cache.CachePolicy;
 import password.pwm.svc.cache.CachePolicy;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.StatisticsManager;
 import password.pwm.svc.stats.StatisticsManager;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;

+ 1 - 1
server/src/main/java/password/pwm/http/tag/DisplayTag.java

@@ -28,7 +28,7 @@ import password.pwm.error.PwmException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequest;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.Display;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.macro.MacroMachine;
 import password.pwm.util.macro.MacroMachine;
 
 

+ 1 - 1
server/src/main/java/password/pwm/http/tag/JspThrowableHandlerTag.java

@@ -26,7 +26,7 @@ import password.pwm.PwmConstants;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequest;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.Display;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.secure.PwmHashAlgorithm;
 import password.pwm.util.secure.PwmHashAlgorithm;

+ 1 - 1
server/src/main/java/password/pwm/http/tag/PasswordRequirementsTag.java

@@ -34,7 +34,7 @@ import password.pwm.http.PwmSession;
 import password.pwm.http.servlet.newuser.NewUserServlet;
 import password.pwm.http.servlet.newuser.NewUserServlet;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.Message;
 import password.pwm.i18n.Message;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.macro.MacroMachine;
 import password.pwm.util.macro.MacroMachine;

+ 1 - 1
server/src/main/java/password/pwm/http/tag/value/PwmValue.java

@@ -33,7 +33,7 @@ import password.pwm.http.IdleTimeoutCalculator;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.servlet.ClientApiServlet;
 import password.pwm.http.servlet.ClientApiServlet;
 import password.pwm.i18n.Admin;
 import password.pwm.i18n.Admin;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.macro.MacroMachine;
 import password.pwm.util.macro.MacroMachine;
 
 

+ 1 - 1
server/src/main/java/password/pwm/i18n/Config.java

@@ -23,7 +23,7 @@
 package password.pwm.i18n;
 package password.pwm.i18n;
 
 
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 
 
 import java.util.Locale;
 import java.util.Locale;
 
 

+ 1 - 1
server/src/main/java/password/pwm/i18n/Display.java

@@ -23,7 +23,7 @@
 package password.pwm.i18n;
 package password.pwm.i18n;
 
 
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 
 
 import java.util.Locale;
 import java.util.Locale;
 
 

+ 1 - 1
server/src/main/java/password/pwm/i18n/Message.java

@@ -23,7 +23,7 @@
 package password.pwm.i18n;
 package password.pwm.i18n;
 
 
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 
 
 import java.util.Locale;
 import java.util.Locale;
 
 

+ 1 - 1
server/src/main/java/password/pwm/ldap/LdapOperationsHelper.java

@@ -57,7 +57,7 @@ import password.pwm.svc.cache.CacheKey;
 import password.pwm.svc.cache.CachePolicy;
 import password.pwm.svc.cache.CachePolicy;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.StatisticsManager;
 import password.pwm.svc.stats.StatisticsManager;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PasswordData;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;

+ 1 - 1
server/src/main/java/password/pwm/ldap/PasswordChangeProgressChecker.java

@@ -31,7 +31,7 @@ import password.pwm.config.PwmSetting;
 import password.pwm.config.option.PasswordSyncCheckMode;
 import password.pwm.config.option.PasswordSyncCheckMode;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.Display;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.ProgressInfo;
 import password.pwm.util.ProgressInfo;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.Percent;
 import password.pwm.util.java.Percent;

+ 1 - 1
server/src/main/java/password/pwm/ldap/UserInfoReader.java

@@ -52,7 +52,7 @@ import password.pwm.error.PwmDataValidationException;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.svc.PwmService;
 import password.pwm.svc.PwmService;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PasswordData;
 import password.pwm.util.PwmPasswordRuleValidator;
 import password.pwm.util.PwmPasswordRuleValidator;
 import password.pwm.util.form.FormUtility;
 import password.pwm.util.form.FormUtility;

+ 1 - 1
server/src/main/java/password/pwm/ldap/ViewableUserInfoDisplayReader.java

@@ -30,7 +30,7 @@ import password.pwm.config.option.ViewStatusFields;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.bean.DisplayElement;
 import password.pwm.http.bean.DisplayElement;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.Display;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;

+ 1 - 1
server/src/main/java/password/pwm/svc/event/AuditRecordFactory.java

@@ -32,7 +32,7 @@ import password.pwm.http.PwmSession;
 import password.pwm.i18n.PwmDisplayBundle;
 import password.pwm.i18n.PwmDisplayBundle;
 import password.pwm.ldap.UserInfo;
 import password.pwm.ldap.UserInfo;
 import password.pwm.ldap.UserInfoFactory;
 import password.pwm.ldap.UserInfoFactory;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.macro.MacroMachine;
 import password.pwm.util.macro.MacroMachine;

+ 1 - 1
server/src/main/java/password/pwm/svc/event/AuditService.java

@@ -47,7 +47,7 @@ import password.pwm.ldap.UserInfo;
 import password.pwm.svc.PwmService;
 import password.pwm.svc.PwmService;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.StatisticsManager;
 import password.pwm.svc.stats.StatisticsManager;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;

+ 1 - 1
server/src/main/java/password/pwm/svc/event/SyslogAuditService.java

@@ -53,7 +53,7 @@ import password.pwm.health.HealthStatus;
 import password.pwm.health.HealthTopic;
 import password.pwm.health.HealthTopic;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.StatisticsManager;
 import password.pwm.svc.stats.StatisticsManager;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;

+ 1 - 1
server/src/main/java/password/pwm/svc/intruder/IntruderManager.java

@@ -53,7 +53,7 @@ import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.StatisticsManager;
 import password.pwm.svc.stats.StatisticsManager;
 import password.pwm.util.DataStore;
 import password.pwm.util.DataStore;
 import password.pwm.util.DataStoreFactory;
 import password.pwm.util.DataStoreFactory;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.db.DatabaseDataStore;
 import password.pwm.util.db.DatabaseDataStore;
 import password.pwm.util.db.DatabaseTable;
 import password.pwm.util.db.DatabaseTable;
 import password.pwm.util.java.ClosableIterator;
 import password.pwm.util.java.ClosableIterator;

+ 1 - 1
server/src/main/java/password/pwm/svc/pwnotify/PwNotifyEngine.java

@@ -37,7 +37,7 @@ import password.pwm.ldap.UserInfo;
 import password.pwm.ldap.UserInfoFactory;
 import password.pwm.ldap.UserInfoFactory;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.Statistic;
 import password.pwm.svc.stats.StatisticsManager;
 import password.pwm.svc.stats.StatisticsManager;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.ConditionalTaskExecutor;
 import password.pwm.util.java.ConditionalTaskExecutor;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;

+ 1 - 1
server/src/main/java/password/pwm/svc/report/ReportCsvUtility.java

@@ -30,7 +30,7 @@ import password.pwm.config.Configuration;
 import password.pwm.error.PwmOperationalException;
 import password.pwm.error.PwmOperationalException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.Display;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.ClosableIterator;
 import password.pwm.util.java.ClosableIterator;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 
 

+ 1 - 1
server/src/main/java/password/pwm/svc/report/ReportSummaryData.java

@@ -26,7 +26,7 @@ import com.novell.ldapchai.cr.Answer;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
 import password.pwm.config.option.DataStorageMethod;
 import password.pwm.config.option.DataStorageMethod;
 import password.pwm.i18n.Admin;
 import password.pwm.i18n.Admin;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.Percent;
 import password.pwm.util.java.Percent;
 import password.pwm.util.java.PwmNumberFormat;
 import password.pwm.util.java.PwmNumberFormat;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;

+ 1 - 1
server/src/main/java/password/pwm/svc/sessiontrack/SessionTrackService.java

@@ -38,7 +38,7 @@ import password.pwm.http.PwmSession;
 import password.pwm.i18n.Admin;
 import password.pwm.i18n.Admin;
 import password.pwm.ldap.UserInfo;
 import password.pwm.ldap.UserInfo;
 import password.pwm.svc.PwmService;
 import password.pwm.svc.PwmService;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;

+ 1 - 1
server/src/main/java/password/pwm/svc/stats/EpsStatistic.java

@@ -23,7 +23,7 @@
 package password.pwm.svc.stats;
 package password.pwm.svc.stats;
 
 
 import password.pwm.i18n.Admin;
 import password.pwm.i18n.Admin;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 
 
 import java.util.Locale;
 import java.util.Locale;
 
 

+ 1 - 1
server/src/main/java/password/pwm/svc/stats/Statistic.java

@@ -25,7 +25,7 @@ package password.pwm.svc.stats;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.i18n.Admin;
 import password.pwm.i18n.Admin;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.java.TimeDuration;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 
 

+ 1 - 0
server/src/main/java/password/pwm/util/LDAPPermissionCalculator.java

@@ -41,6 +41,7 @@ import password.pwm.error.ErrorInformation;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmError;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.i18n.Config;
 import password.pwm.i18n.Config;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.queue.SmsQueueManager;
 import password.pwm.util.queue.SmsQueueManager;
 
 

+ 122 - 0
server/src/main/java/password/pwm/util/i18n/ConfigLocaleStats.java

@@ -0,0 +1,122 @@
+/*
+ * Password Management Servlets (PWM)
+ * http://www.pwm-project.org
+ *
+ * Copyright (c) 2006-2009 Novell, Inc.
+ * Copyright (c) 2009-2018 The PWM Project
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+package password.pwm.util.i18n;
+
+import lombok.Builder;
+import lombok.Value;
+import password.pwm.PwmConstants;
+import password.pwm.config.PwmSetting;
+import password.pwm.config.PwmSettingTemplateSet;
+import password.pwm.config.StoredValue;
+import password.pwm.config.value.ChallengeValue;
+import password.pwm.config.value.data.ChallengeItemConfiguration;
+import password.pwm.error.PwmOperationalException;
+import password.pwm.error.PwmUnrecoverableException;
+import password.pwm.util.java.Percent;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+@Value
+@Builder
+public class ConfigLocaleStats
+{
+    private List<Locale> defaultChallenges;
+    private Map<Locale, String> descriptionPercentLocalizations;
+    private Map<Locale, Integer> descriptionPresentLocalizations;
+    private Map<Locale, Integer> descriptionMissingLocalizations;
+
+    public static ConfigLocaleStats getConfigLocaleStats( )
+            throws PwmUnrecoverableException, PwmOperationalException
+    {
+
+        final List<Locale> knownLocales = LocaleHelper.knownBuiltInLocales();
+
+        final List<Locale> defaultChallenges = new ArrayList<>();
+        final Map<Locale, String> descriptionPercentLocalizations = new LinkedHashMap<>();
+        final Map<Locale, Integer> descriptionPresentLocalizations = new LinkedHashMap<>();
+        final Map<Locale, Integer> descriptionMissingLocalizations = new LinkedHashMap<>();
+
+        {
+            final StoredValue storedValue = PwmSetting.CHALLENGE_RANDOM_CHALLENGES.getDefaultValue( PwmSettingTemplateSet.getDefault() );
+            final Map<String, List<ChallengeItemConfiguration>> value = ( ( ChallengeValue ) storedValue ).toNativeObject();
+
+            for ( final String localeStr : value.keySet() )
+            {
+                final Locale loopLocale = LocaleHelper.parseLocaleString( localeStr );
+                defaultChallenges.add( loopLocale );
+            }
+        }
+
+        for ( final Locale locale : knownLocales  )
+        {
+            descriptionPresentLocalizations.put( locale, 0 );
+            descriptionMissingLocalizations.put( locale, 0 );
+        }
+
+        for ( final PwmSetting pwmSetting : PwmSetting.values() )
+        {
+            final String defaultValue = pwmSetting.getDescription( PwmConstants.DEFAULT_LOCALE );
+            descriptionPresentLocalizations.put(
+                    PwmConstants.DEFAULT_LOCALE,
+                    descriptionPresentLocalizations.get( PwmConstants.DEFAULT_LOCALE ) + 1 );
+
+            for ( final Locale locale : knownLocales )
+            {
+                if ( !PwmConstants.DEFAULT_LOCALE.equals( locale ) )
+                {
+                    final String localeValue = pwmSetting.getDescription( locale );
+                    if ( defaultValue.equals( localeValue ) )
+                    {
+                        descriptionMissingLocalizations.put( PwmConstants.DEFAULT_LOCALE, descriptionMissingLocalizations.get( locale ) + 1 );
+                    }
+                    else
+                    {
+                        descriptionPresentLocalizations.put( PwmConstants.DEFAULT_LOCALE, descriptionPresentLocalizations.get( locale ) + 1 );
+                    }
+                }
+            }
+        }
+
+        for ( final Locale locale : knownLocales )
+        {
+            final int totalCount = PwmSetting.values().length;
+            final int presentCount = descriptionPresentLocalizations.get( locale );
+            final Percent percent = new Percent( presentCount, totalCount );
+            descriptionPercentLocalizations.put( locale, percent.pretty() );
+        }
+
+        return ConfigLocaleStats.builder()
+                .defaultChallenges( Collections.unmodifiableList( defaultChallenges ) )
+                .descriptionPercentLocalizations( Collections.unmodifiableMap( descriptionPercentLocalizations ) )
+                .descriptionPresentLocalizations( Collections.unmodifiableMap( descriptionPresentLocalizations ) )
+                .descriptionMissingLocalizations( Collections.unmodifiableMap( descriptionMissingLocalizations ) )
+                .build();
+
+    }
+
+}

+ 31 - 252
server/src/main/java/password/pwm/util/LocaleHelper.java → server/src/main/java/password/pwm/util/i18n/LocaleHelper.java

@@ -20,34 +20,24 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
  */
 
 
-package password.pwm.util;
+package password.pwm.util.i18n;
 
 
-import lombok.Getter;
-import org.apache.commons.lang3.StringUtils;
 import password.pwm.PwmApplication;
 import password.pwm.PwmApplication;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.bean.pub.SessionStateInfoBean;
 import password.pwm.bean.pub.SessionStateInfoBean;
 import password.pwm.config.Configuration;
 import password.pwm.config.Configuration;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSetting;
 import password.pwm.config.PwmSettingTemplateSet;
 import password.pwm.config.PwmSettingTemplateSet;
-import password.pwm.config.StoredValue;
-import password.pwm.config.value.ChallengeValue;
 import password.pwm.config.value.StringArrayValue;
 import password.pwm.config.value.StringArrayValue;
-import password.pwm.config.value.data.ChallengeItemConfiguration;
-import password.pwm.error.PwmOperationalException;
-import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.PwmRequest;
 import password.pwm.http.PwmRequest;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.PwmDisplayBundle;
 import password.pwm.i18n.PwmDisplayBundle;
 import password.pwm.i18n.PwmLocaleBundle;
 import password.pwm.i18n.PwmLocaleBundle;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
-import password.pwm.util.java.Percent;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.java.StringUtil;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.macro.MacroMachine;
 import password.pwm.util.macro.MacroMachine;
 
 
-import java.io.IOException;
-import java.io.InputStream;
 import java.time.Instant;
 import java.time.Instant;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collection;
@@ -59,14 +49,13 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Map;
 import java.util.MissingResourceException;
 import java.util.MissingResourceException;
-import java.util.Properties;
 import java.util.ResourceBundle;
 import java.util.ResourceBundle;
 import java.util.StringTokenizer;
 import java.util.StringTokenizer;
 import java.util.TreeMap;
 import java.util.TreeMap;
+import java.util.stream.Collectors;
 
 
 public class LocaleHelper
 public class LocaleHelper
 {
 {
-
     private static final PwmLogger LOGGER = PwmLogger.forClass( LocaleHelper.class );
     private static final PwmLogger LOGGER = PwmLogger.forClass( LocaleHelper.class );
 
 
     public static Class classForShortName( final String shortName )
     public static Class classForShortName( final String shortName )
@@ -385,241 +374,6 @@ public class LocaleHelper
         return JavaHelper.toIsoDate( input );
         return JavaHelper.toIsoDate( input );
     }
     }
 
 
-
-    @Getter
-    public static class LocaleStats
-    {
-        List<Locale> localesExamined = new ArrayList<>();
-        int totalKeys;
-        int presentSlots;
-        int missingSlots;
-        int totalSlots;
-        String totalPercentage;
-        Map<Locale, String> perLocalePercentLocalizations = new LinkedHashMap<>();
-        Map<Locale, Integer> perLocalePresentLocalizations = new LinkedHashMap<>();
-        Map<Locale, Integer> perLocaleMissingLocalizations = new LinkedHashMap<>();
-        Map<PwmLocaleBundle, Map<Locale, List<String>>> missingKeys = new LinkedHashMap<>();
-    }
-
-    @Getter
-    public static class ConfigLocaleStats
-    {
-        List<Locale> defaultChallenges = new ArrayList<>();
-        Map<Locale, String> descriptionPercentLocalizations = new LinkedHashMap<>();
-        Map<Locale, Integer> descriptionPresentLocalizations = new LinkedHashMap<>();
-        Map<Locale, Integer> descriptionMissingLocalizations = new LinkedHashMap<>();
-    }
-
-    public static ConfigLocaleStats getConfigLocaleStats( )
-            throws PwmUnrecoverableException, PwmOperationalException
-    {
-
-        final ConfigLocaleStats configLocaleStats = new ConfigLocaleStats();
-        {
-            final StoredValue storedValue = PwmSetting.CHALLENGE_RANDOM_CHALLENGES.getDefaultValue( PwmSettingTemplateSet.getDefault() );
-            final Map<String, List<ChallengeItemConfiguration>> value = ( ( ChallengeValue ) storedValue ).toNativeObject();
-
-            for ( final String localeStr : value.keySet() )
-            {
-                final Locale loopLocale = LocaleHelper.parseLocaleString( localeStr );
-                configLocaleStats.getDefaultChallenges().add( loopLocale );
-            }
-        }
-
-        for ( final Locale locale : LocaleInfoGenerator.knownLocales() )
-        {
-            configLocaleStats.descriptionPresentLocalizations.put( locale, 0 );
-            configLocaleStats.descriptionMissingLocalizations.put( locale, 0 );
-        }
-
-        for ( final PwmSetting pwmSetting : PwmSetting.values() )
-        {
-            final String defaultValue = pwmSetting.getDescription( PwmConstants.DEFAULT_LOCALE );
-            configLocaleStats.descriptionPresentLocalizations.put(
-                    PwmConstants.DEFAULT_LOCALE,
-                    configLocaleStats.descriptionPresentLocalizations.get( PwmConstants.DEFAULT_LOCALE ) + 1
-            );
-
-            for ( final Locale locale : LocaleInfoGenerator.knownLocales() )
-            {
-                if ( !PwmConstants.DEFAULT_LOCALE.equals( locale ) )
-                {
-                    final String localeValue = pwmSetting.getDescription( locale );
-                    if ( defaultValue.equals( localeValue ) )
-                    {
-                        configLocaleStats.descriptionMissingLocalizations.put( PwmConstants.DEFAULT_LOCALE, configLocaleStats.descriptionMissingLocalizations.get( locale ) + 1 );
-                    }
-                    else
-                    {
-                        configLocaleStats.descriptionPresentLocalizations.put( PwmConstants.DEFAULT_LOCALE, configLocaleStats.descriptionPresentLocalizations.get( locale ) + 1 );
-                    }
-                }
-            }
-        }
-
-        for ( final Locale locale : LocaleInfoGenerator.knownLocales() )
-        {
-            final int totalCount = PwmSetting.values().length;
-            final int presentCount = configLocaleStats.getDescriptionPresentLocalizations().get( locale );
-            final Percent percent = new Percent( presentCount, totalCount );
-            configLocaleStats.getDescriptionPercentLocalizations().put( locale, percent.pretty() );
-        }
-        return configLocaleStats;
-    }
-
-    public static LocaleStats getStatsForBundles( final Collection<PwmLocaleBundle> bundles )
-    {
-        final LocaleStats stats = new LocaleStats();
-        LocaleInfoGenerator.checkLocalesOnBundle( stats, bundles );
-        return stats;
-    }
-
-    private static class LocaleInfoGenerator
-    {
-        private static final boolean DEBUG_FLAG = false;
-
-        private static void checkLocalesOnBundle(
-                final LocaleStats stats,
-                final Collection<PwmLocaleBundle> bundles
-        )
-        {
-            for ( final PwmLocaleBundle pwmLocaleBundle : bundles )
-            {
-                final Map<Locale, List<String>> missingKeys = checkLocalesOnBundle( pwmLocaleBundle, stats );
-                stats.missingKeys.put( pwmLocaleBundle, missingKeys );
-            }
-
-            stats.getLocalesExamined().addAll( knownLocales() );
-
-            if ( stats.getTotalSlots() > 0 )
-            {
-                final Percent percent = new Percent( stats.getPresentSlots(), stats.getTotalSlots() );
-                stats.totalPercentage = percent.pretty();
-            }
-            else
-            {
-                stats.totalPercentage = Percent.ZERO.pretty();
-            }
-        }
-
-
-        private static Map<Locale, List<String>> checkLocalesOnBundle(
-                final PwmLocaleBundle pwmLocaleBundle,
-                final LocaleStats stats
-        )
-        {
-            final Map<Locale, List<String>> returnMap = new LinkedHashMap<>();
-            final int keyCount = pwmLocaleBundle.getKeys().size();
-            stats.totalKeys += keyCount;
-
-            for ( final Locale locale : knownLocales() )
-            {
-                final List<String> missingKeys = missingKeysForBundleAndLocale( pwmLocaleBundle, locale );
-                final int missingKeyCount = missingKeys.size();
-                final int presentKeyCount = keyCount - missingKeyCount;
-
-                stats.totalSlots += keyCount;
-                stats.missingSlots += missingKeyCount;
-                stats.presentSlots += presentKeyCount;
-                if ( !stats.perLocaleMissingLocalizations.containsKey( locale ) )
-                {
-                    stats.perLocaleMissingLocalizations.put( locale, 0 );
-                }
-                stats.perLocaleMissingLocalizations.put( locale, stats.getPerLocaleMissingLocalizations().get( locale ) + missingKeyCount );
-                if ( !stats.perLocalePresentLocalizations.containsKey( locale ) )
-                {
-                    stats.perLocalePresentLocalizations.put( locale, 0 );
-                }
-                stats.perLocalePresentLocalizations.put( locale, stats.perLocalePresentLocalizations.get( locale ) + presentKeyCount );
-
-                if ( keyCount > 0 )
-                {
-                    final Percent percent = new Percent( presentKeyCount, keyCount );
-                    stats.perLocalePercentLocalizations.put( locale, percent.pretty( 0 ) );
-                }
-                else
-                {
-                    stats.perLocalePercentLocalizations.put( locale, Percent.ZERO.pretty() );
-                }
-
-                returnMap.put( locale, missingKeys );
-            }
-            return returnMap;
-        }
-
-        private static List<String> missingKeysForBundleAndLocale(
-                final PwmLocaleBundle pwmLocaleBundle,
-                final Locale locale
-        )
-        {
-            final List<String> returnList = new ArrayList<>();
-
-            final String bundleFilename = PwmConstants.DEFAULT_LOCALE.equals( locale )
-                    ? pwmLocaleBundle.getTheClass().getSimpleName() + ".properties"
-                    : pwmLocaleBundle.getTheClass().getSimpleName() + "_" + locale.toString() + ".properties";
-            final Properties checkProperties = new Properties();
-
-            try ( InputStream stream = pwmLocaleBundle.getTheClass().getResourceAsStream( bundleFilename ) )
-            {
-                if ( stream == null )
-                {
-                    if ( DEBUG_FLAG )
-                    {
-                        LOGGER.trace( () -> "missing resource bundle: bundle=" + pwmLocaleBundle.getTheClass().getName() + ", locale=" + locale.toString() );
-                    }
-                    returnList.addAll( pwmLocaleBundle.getKeys() );
-                }
-                else
-                {
-                    LOGGER.trace( () -> "checking file " + bundleFilename );
-                    checkProperties.load( stream );
-                    for ( final String key : pwmLocaleBundle.getKeys() )
-                    {
-                        if ( !checkProperties.containsKey( key ) )
-                        {
-                            if ( DEBUG_FLAG )
-                            {
-                                LOGGER.trace( () -> "missing resource: bundle=" + pwmLocaleBundle.getTheClass().toString() + ", locale=" + locale.toString() + "' key=" + key );
-                            }
-                            returnList.add( key );
-                        }
-                    }
-                }
-            }
-            catch ( IOException e )
-            {
-                if ( DEBUG_FLAG )
-                {
-                    LOGGER.trace( () -> "error loading resource bundle for class='" + pwmLocaleBundle.getTheClass().toString()
-                            + ", locale=" + locale.toString() + "', error: " + e.getMessage() );
-                }
-            }
-            Collections.sort( returnList );
-            return returnList;
-        }
-
-        private static List<Locale> knownLocales( )
-        {
-            final List<Locale> knownLocales = new ArrayList<>();
-
-            final StringArrayValue stringArrayValue = ( StringArrayValue ) PwmSetting.KNOWN_LOCALES.getDefaultValue( PwmSettingTemplateSet.getDefault() );
-            final List<String> rawValues = stringArrayValue.toNativeObject();
-            final Map<String, String> localeFlagMap = StringUtil.convertStringListToNameValuePair( rawValues, "::" );
-            for ( final String rawValue : localeFlagMap.keySet() )
-            {
-                knownLocales.add( LocaleHelper.parseLocaleString( rawValue ) );
-            }
-
-            final Map<String, Locale> returnMap = new TreeMap<>();
-
-            for ( final Locale locale : knownLocales )
-            {
-                returnMap.put( locale.getDisplayName(), locale );
-            }
-            return new ArrayList<>( returnMap.values() );
-        }
-    }
-
     public static Map<PwmLocaleBundle, Map<String, List<Locale>>> getModifiedKeysInConfig( final Configuration configuration )
     public static Map<PwmLocaleBundle, Map<String, List<Locale>>> getModifiedKeysInConfig( final Configuration configuration )
     {
     {
         final Map<PwmLocaleBundle, Map<String, List<Locale>>> returnObj = new LinkedHashMap<>();
         final Map<PwmLocaleBundle, Map<String, List<Locale>>> returnObj = new LinkedHashMap<>();
@@ -652,13 +406,13 @@ public class LocaleHelper
 
 
     public static Locale getLocaleForSessionID( final PwmApplication pwmApplication, final String sessionID )
     public static Locale getLocaleForSessionID( final PwmApplication pwmApplication, final String sessionID )
     {
     {
-        if ( pwmApplication != null && StringUtils.isNotBlank( sessionID ) )
+        if ( pwmApplication != null && !StringUtil.isEmpty( sessionID ) )
         {
         {
             final Iterator<SessionStateInfoBean> sessionInfoIterator = pwmApplication.getSessionTrackService().getSessionInfoIterator();
             final Iterator<SessionStateInfoBean> sessionInfoIterator = pwmApplication.getSessionTrackService().getSessionInfoIterator();
             while ( sessionInfoIterator.hasNext() )
             while ( sessionInfoIterator.hasNext() )
             {
             {
                 final SessionStateInfoBean sessionStateInfoBean = sessionInfoIterator.next();
                 final SessionStateInfoBean sessionStateInfoBean = sessionInfoIterator.next();
-                if ( StringUtils.equals( sessionStateInfoBean.getLabel(), sessionID ) )
+                if ( StringUtil.nullSafeEquals( sessionStateInfoBean.getLabel(), sessionID ) )
                 {
                 {
                     if ( sessionStateInfoBean.getLocale() != null )
                     if ( sessionStateInfoBean.getLocale() != null )
                     {
                     {
@@ -688,8 +442,33 @@ public class LocaleHelper
         };
         };
     }
     }
 
 
-    public static String toLongDebug( final Locale locale, final Locale perspectiveLocale )
+    public static List<Locale> highLightedLocales()
     {
     {
-        return locale.getDisplayName( perspectiveLocale ) + " (" + LocaleHelper.getBrowserLocaleString( locale ) + ")";
+        final List<String> strValues = PwmConstants.HIGHLIGHT_LOCALES;
+        final List<Locale> returnList = strValues.stream().map( LocaleHelper::parseLocaleString ).collect( Collectors.toList() );
+        return Collections.unmodifiableList( returnList );
+
+    }
+
+    static List<Locale> knownBuiltInLocales( )
+    {
+        final List<Locale> knownLocales = new ArrayList<>();
+
+        final StringArrayValue stringArrayValue = ( StringArrayValue ) PwmSetting.KNOWN_LOCALES.getDefaultValue( PwmSettingTemplateSet.getDefault() );
+        final List<String> rawValues = stringArrayValue.toNativeObject();
+        final Map<String, String> localeFlagMap = StringUtil.convertStringListToNameValuePair( rawValues, "::" );
+        for ( final String rawValue : localeFlagMap.keySet() )
+        {
+            knownLocales.add( LocaleHelper.parseLocaleString( rawValue ) );
+        }
+
+        final Map<String, Locale> returnMap = new TreeMap<>();
+
+        for ( final Locale locale : knownLocales )
+        {
+            returnMap.put( locale.getDisplayName(), locale );
+        }
+        return new ArrayList<>( returnMap.values() );
     }
     }
+
 }
 }

+ 241 - 0
server/src/main/java/password/pwm/util/i18n/LocaleStats.java

@@ -0,0 +1,241 @@
+/*
+ * Password Management Servlets (PWM)
+ * http://www.pwm-project.org
+ *
+ * Copyright (c) 2006-2009 Novell, Inc.
+ * Copyright (c) 2009-2018 The PWM Project
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+package password.pwm.util.i18n;
+
+import lombok.Builder;
+import lombok.Value;
+import password.pwm.PwmConstants;
+import password.pwm.i18n.PwmLocaleBundle;
+import password.pwm.util.java.Percent;
+import password.pwm.util.logging.PwmLogger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+
+@Value
+@Builder
+public class LocaleStats
+{
+    private static final PwmLogger LOGGER = PwmLogger.forClass( LocaleStats.class );
+    private static final boolean DEBUG_FLAG = false;
+
+    List<Locale> localesExamined;
+    int totalKeys;
+    int presentSlots;
+    int missingSlots;
+    int totalSlots;
+    String totalPercentage;
+    Map<Locale, String> perLocalePercentLocalizations;
+    Map<Locale, Integer> perLocalePresentLocalizations;
+    Map<Locale, Integer> perLocaleMissingLocalizations;
+
+    public static Map<PwmLocaleBundle, LocaleStats> getAllLocaleStats()
+    {
+        final Map<PwmLocaleBundle, LocaleStats> returnMap = new LinkedHashMap<>(  );
+        for ( final PwmLocaleBundle pwmLocaleBundle : PwmLocaleBundle.allValues() )
+        {
+            returnMap.put( pwmLocaleBundle, createLocaleStatsForBundle( pwmLocaleBundle ) );
+        }
+        return Collections.unmodifiableMap( returnMap );
+    }
+
+
+    public static LocaleStats getAllStats()
+    {
+        final Map<PwmLocaleBundle, LocaleStats> workingMap = getAllLocaleStats();
+        return mergeLocaleStats( workingMap.values() );
+    }
+
+    public static LocaleStats getUserFacingStats()
+    {
+        final Map<PwmLocaleBundle, LocaleStats> workingMap = new LinkedHashMap<>( getAllLocaleStats() );
+        workingMap.keySet().removeIf( PwmLocaleBundle::isAdminOnly );
+        return mergeLocaleStats( workingMap.values() );
+    }
+
+    public static LocaleStats getAdminFacingStats()
+    {
+        final Map<PwmLocaleBundle, LocaleStats> workingMap = new LinkedHashMap<>( getAllLocaleStats() );
+        workingMap.keySet().removeIf( pwmLocaleBundle -> !pwmLocaleBundle.isAdminOnly() );
+        return mergeLocaleStats( workingMap.values() );
+    }
+
+    private static LocaleStats mergeLocaleStats(
+            final Collection<LocaleStats> localeStats
+    )
+    {
+        int totalKeys = 0;
+        int totalSlots = 0;
+        int missingSlots = 0;
+        int presentSlots = 0;
+
+        final Map<Locale, Integer> perLocaleMissingLocalizations = new LinkedHashMap<>( );
+        final Map<Locale, Integer> perLocalePresentLocalizations = new LinkedHashMap<>( );
+        final Map<Locale, String> perLocalePercentLocalizations = new LinkedHashMap<>();
+
+        for ( final LocaleStats loopStats : localeStats )
+        {
+            totalKeys += loopStats.getTotalKeys();
+            totalSlots += loopStats.getTotalSlots();
+            missingSlots += loopStats.getMissingSlots();
+            presentSlots += loopStats.getPresentSlots();
+
+            for ( final Locale locale : loopStats.getLocalesExamined() )
+            {
+                final int combinedMissing = perLocaleMissingLocalizations.getOrDefault( locale, 0 )
+                        + loopStats.getPerLocaleMissingLocalizations().getOrDefault( locale, 0 );
+                perLocaleMissingLocalizations.put( locale, combinedMissing );
+
+
+                final int combinedPresent = perLocalePresentLocalizations.getOrDefault( locale, 0 )
+                        + loopStats.getPerLocalePresentLocalizations().getOrDefault( locale, 0 );
+                perLocalePresentLocalizations.put( locale, combinedPresent );
+
+                final Percent percent = new Percent( combinedPresent, totalKeys );
+                perLocalePercentLocalizations.put( locale, percent.pretty( 0 ) );
+            }
+
+        }
+
+        final Percent totalPercentage = new Percent( presentSlots, totalSlots );
+
+        return LocaleStats.builder()
+                .localesExamined( LocaleHelper.knownBuiltInLocales() )
+                .totalKeys( totalKeys )
+                .totalSlots( totalSlots )
+                .presentSlots( presentSlots )
+                .missingSlots( missingSlots )
+                .perLocaleMissingLocalizations( perLocaleMissingLocalizations )
+                .perLocalePresentLocalizations( perLocalePresentLocalizations )
+                .perLocalePercentLocalizations( perLocalePercentLocalizations )
+                .totalPercentage( totalPercentage.pretty( 0 ) )
+                .build();
+    }
+
+
+    private static LocaleStats createLocaleStatsForBundle(
+            final PwmLocaleBundle pwmLocaleBundle
+    )
+    {
+        final List<Locale> knownLocales = LocaleHelper.knownBuiltInLocales();
+        final int totalKeysInBundle = pwmLocaleBundle.getKeys().size();
+
+        int totalSlots = 0;
+        int missingSlots = 0;
+        int presentSlots = 0;
+
+        final Map<Locale, Integer> perLocaleMissingLocalizations = new LinkedHashMap<>( );
+        final Map<Locale, Integer> perLocalePresentLocalizations = new LinkedHashMap<>( );
+        final Map<Locale, String> perLocalePercentLocalizations = new LinkedHashMap<>();
+
+        for ( final Locale locale : knownLocales )
+        {
+            final List<String> missingKeys = missingKeysForBundleAndLocale( pwmLocaleBundle, locale );
+            final int presentKeys = totalKeysInBundle - missingKeys.size();
+
+            totalSlots += totalKeysInBundle;
+            missingSlots += missingKeys.size();
+            presentSlots += presentKeys;
+            perLocaleMissingLocalizations.put( locale, missingKeys.size() );
+            perLocalePresentLocalizations.put( locale, totalKeysInBundle - missingKeys.size() );
+
+            final Percent percent = new Percent( presentKeys, totalKeysInBundle );
+            perLocalePercentLocalizations.put( locale, percent.pretty( 0 ) );
+        }
+
+        final Percent totalPercentage = new Percent( presentSlots, totalSlots );
+
+        return LocaleStats.builder()
+                .localesExamined( knownLocales )
+                .totalKeys( totalKeysInBundle )
+                .totalSlots( totalSlots )
+                .presentSlots( presentSlots )
+                .missingSlots( missingSlots )
+                .perLocaleMissingLocalizations( perLocaleMissingLocalizations )
+                .perLocalePresentLocalizations( perLocalePresentLocalizations )
+                .perLocalePercentLocalizations( perLocalePercentLocalizations )
+                .totalPercentage( totalPercentage.pretty( 0 ) )
+                .build();
+    }
+
+    public static List<String> missingKeysForBundleAndLocale(
+            final PwmLocaleBundle pwmLocaleBundle,
+            final Locale locale
+    )
+    {
+        final List<String> returnList = new ArrayList<>();
+
+        final String bundleFilename = PwmConstants.DEFAULT_LOCALE.equals( locale )
+                ? pwmLocaleBundle.getTheClass().getSimpleName() + ".properties"
+                : pwmLocaleBundle.getTheClass().getSimpleName() + "_" + locale.toString() + ".properties";
+        final Properties checkProperties = new Properties();
+
+        try ( InputStream stream = pwmLocaleBundle.getTheClass().getResourceAsStream( bundleFilename ) )
+        {
+            if ( stream == null )
+            {
+                if ( DEBUG_FLAG )
+                {
+                    LOGGER.trace( () -> "missing resource bundle: bundle=" + pwmLocaleBundle.getTheClass().getName() + ", locale=" + locale.toString() );
+                }
+                returnList.addAll( pwmLocaleBundle.getKeys() );
+            }
+            else
+            {
+                LOGGER.trace( () -> "checking file " + bundleFilename );
+                checkProperties.load( stream );
+                for ( final String key : pwmLocaleBundle.getKeys() )
+                {
+                    if ( !checkProperties.containsKey( key ) )
+                    {
+                        if ( DEBUG_FLAG )
+                        {
+                            LOGGER.trace( () -> "missing resource: bundle=" + pwmLocaleBundle.getTheClass().toString() + ", locale=" + locale.toString() + "' key=" + key );
+                        }
+                        returnList.add( key );
+                    }
+                }
+            }
+        }
+        catch ( IOException e )
+        {
+            if ( DEBUG_FLAG )
+            {
+                LOGGER.trace( () -> "error loading resource bundle for class='" + pwmLocaleBundle.getTheClass().toString()
+                        + ", locale=" + locale.toString() + "', error: " + e.getMessage() );
+            }
+        }
+        Collections.sort( returnList );
+        return returnList;
+    }
+
+
+}

+ 1 - 1
server/src/main/java/password/pwm/util/java/TimeDuration.java

@@ -26,7 +26,7 @@ import com.novell.ldapchai.util.StringHelper;
 import lombok.Value;
 import lombok.Value;
 import password.pwm.PwmConstants;
 import password.pwm.PwmConstants;
 import password.pwm.i18n.Display;
 import password.pwm.i18n.Display;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 
 
 import javax.annotation.CheckReturnValue;
 import javax.annotation.CheckReturnValue;
 import javax.annotation.meta.When;
 import javax.annotation.meta.When;

+ 1 - 1
server/src/main/java/password/pwm/ws/server/RestRequest.java

@@ -30,7 +30,7 @@ import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.HttpContentType;
 import password.pwm.http.HttpContentType;
 import password.pwm.http.HttpHeader;
 import password.pwm.http.HttpHeader;
 import password.pwm.http.PwmHttpRequestWrapper;
 import password.pwm.http.PwmHttpRequestWrapper;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.logging.PwmLogger;
 import password.pwm.util.logging.PwmLogger;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;

+ 1 - 1
server/src/main/java/password/pwm/ws/server/RestServlet.java

@@ -42,7 +42,7 @@ import password.pwm.http.HttpHeader;
 import password.pwm.http.HttpMethod;
 import password.pwm.http.HttpMethod;
 import password.pwm.http.PwmHttpRequestWrapper;
 import password.pwm.http.PwmHttpRequestWrapper;
 import password.pwm.http.filter.RequestInitializationFilter;
 import password.pwm.http.filter.RequestInitializationFilter;
-import password.pwm.util.LocaleHelper;
+import password.pwm.util.i18n.LocaleHelper;
 import password.pwm.util.java.AtomicLoopIntIncrementer;
 import password.pwm.util.java.AtomicLoopIntIncrementer;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JavaHelper;
 import password.pwm.util.java.JsonUtil;
 import password.pwm.util.java.JsonUtil;

+ 1 - 1
server/src/main/resources/password/pwm/PwmConstants.properties

@@ -27,13 +27,13 @@
 locale.defaultLocale=en
 locale.defaultLocale=en
 locale.defaultDateTimeFormat=yyyy-MM-dd'T'HH:mm:ss'Z'
 locale.defaultDateTimeFormat=yyyy-MM-dd'T'HH:mm:ss'Z'
 locale.defaultTimeZone=Zulu
 locale.defaultTimeZone=Zulu
+locale.highlightList=en,ca,da,de,es,fr,it,ja,nl,pl,pt_BR,ru,sv,zh_CN,zh_TW,en_CA,fr_CA,he
 httpHeaderAuthorizationBasic=Basic
 httpHeaderAuthorizationBasic=Basic
 defaultBadPasswordAttempt=BADPASSWORDATTEMPT
 defaultBadPasswordAttempt=BADPASSWORDATTEMPT
 log.removedValue=*hidden*
 log.removedValue=*hidden*
 pwm.appName=PWM
 pwm.appName=PWM
 trial=false
 trial=false
 url.pwm-home=https://github.com/pwm-project/pwm
 url.pwm-home=https://github.com/pwm-project/pwm
-url.pwm-cloud=https://pwm-cloud.appspot.com
 paramName.token=token
 paramName.token=token
 defaultConfigFilename=PwmConfiguration.xml
 defaultConfigFilename=PwmConfiguration.xml
 enableEulaDisplay=false
 enableEulaDisplay=false

+ 1 - 1
webapp/src/main/webapp/WEB-INF/jsp/admin-activity.jsp

@@ -24,7 +24,7 @@
 <%@ page import="password.pwm.http.tag.value.PwmValue" %>
 <%@ page import="password.pwm.http.tag.value.PwmValue" %>
 <%@ page import="password.pwm.i18n.Admin" %>
 <%@ page import="password.pwm.i18n.Admin" %>
 <%@ page import="password.pwm.svc.intruder.RecordType" %>
 <%@ page import="password.pwm.svc.intruder.RecordType" %>
-<%@ page import="password.pwm.util.LocaleHelper" %>
+<%@ page import="password.pwm.util.i18n.LocaleHelper" %>
 <%@ page import="password.pwm.http.tag.conditional.PwmIfTest" %>
 <%@ page import="password.pwm.http.tag.conditional.PwmIfTest" %>
 
 
 <!DOCTYPE html>
 <!DOCTYPE html>

+ 1 - 1
webapp/src/main/webapp/WEB-INF/jsp/admin-user-debug.jsp

@@ -32,7 +32,7 @@
 <%@ page import="password.pwm.i18n.Display" %>
 <%@ page import="password.pwm.i18n.Display" %>
 <%@ page import="java.util.Map" %>
 <%@ page import="java.util.Map" %>
 <%@ page import="password.pwm.util.java.TimeDuration" %>
 <%@ page import="password.pwm.util.java.TimeDuration" %>
-<%@ page import="password.pwm.util.LocaleHelper" %>
+<%@ page import="password.pwm.util.i18n.LocaleHelper" %>
 <!DOCTYPE html>
 <!DOCTYPE html>
 <%@ page language="java" session="true" isThreadSafe="true" contentType="text/html" %>
 <%@ page language="java" session="true" isThreadSafe="true" contentType="text/html" %>
 <%@ taglib uri="pwm" prefix="pwm" %>
 <%@ taglib uri="pwm" prefix="pwm" %>

+ 1 - 1
webapp/src/main/webapp/WEB-INF/jsp/configmanager-certificates.jsp

@@ -23,7 +23,7 @@
 <%@ page import="password.pwm.http.JspUtility" %>
 <%@ page import="password.pwm.http.JspUtility" %>
 <%@ page import="password.pwm.http.servlet.configmanager.ConfigManagerCertificatesServlet" %>
 <%@ page import="password.pwm.http.servlet.configmanager.ConfigManagerCertificatesServlet" %>
 <%@ page import="password.pwm.i18n.Config" %>
 <%@ page import="password.pwm.i18n.Config" %>
-<%@ page import="password.pwm.util.LocaleHelper" %>
+<%@ page import="password.pwm.util.i18n.LocaleHelper" %>
 <%@ page import="java.util.List" %>
 <%@ page import="java.util.List" %>
 <%@ page import="password.pwm.http.PwmRequestAttribute" %>
 <%@ page import="password.pwm.http.PwmRequestAttribute" %>
 
 

+ 1 - 1
webapp/src/main/webapp/WEB-INF/jsp/configmanager-localdb.jsp

@@ -26,7 +26,7 @@
 <%@ page import="password.pwm.i18n.Config" %>
 <%@ page import="password.pwm.i18n.Config" %>
 <%@ page import="password.pwm.i18n.Display" %>
 <%@ page import="password.pwm.i18n.Display" %>
 <%@ page import="password.pwm.util.java.FileSystemUtility" %>
 <%@ page import="password.pwm.util.java.FileSystemUtility" %>
-<%@ page import="password.pwm.util.LocaleHelper" %>
+<%@ page import="password.pwm.util.i18n.LocaleHelper" %>
 <%@ page import="password.pwm.util.java.StringUtil" %>
 <%@ page import="password.pwm.util.java.StringUtil" %>
 
 
 <!DOCTYPE html>
 <!DOCTYPE html>

+ 1 - 1
webapp/src/main/webapp/WEB-INF/jsp/configmanager-login.jsp

@@ -22,7 +22,7 @@
 
 
 <%@ page import="password.pwm.http.filter.ConfigAccessFilter" %>
 <%@ page import="password.pwm.http.filter.ConfigAccessFilter" %>
 <%@ page import="password.pwm.i18n.Config" %>
 <%@ page import="password.pwm.i18n.Config" %>
-<%@ page import="password.pwm.util.LocaleHelper" %>
+<%@ page import="password.pwm.util.i18n.LocaleHelper" %>
 <%@ page import="password.pwm.util.java.JavaHelper" %>
 <%@ page import="password.pwm.util.java.JavaHelper" %>
 <%@ page import="password.pwm.http.PwmRequestAttribute" %>
 <%@ page import="password.pwm.http.PwmRequestAttribute" %>
 
 

+ 1 - 1
webapp/src/main/webapp/WEB-INF/jsp/configmanager-summary.jsp

@@ -24,7 +24,7 @@
 <%@ page import="password.pwm.error.PwmException" %>
 <%@ page import="password.pwm.error.PwmException" %>
 <%@ page import="password.pwm.http.JspUtility" %>
 <%@ page import="password.pwm.http.JspUtility" %>
 <%@ page import="password.pwm.i18n.PwmLocaleBundle" %>
 <%@ page import="password.pwm.i18n.PwmLocaleBundle" %>
-<%@ page import="password.pwm.util.LocaleHelper" %>
+<%@ page import="password.pwm.util.i18n.LocaleHelper" %>
 <%@ page import="password.pwm.util.java.JavaHelper" %>
 <%@ page import="password.pwm.util.java.JavaHelper" %>
 <%@ page import="password.pwm.util.java.StringUtil" %>
 <%@ page import="password.pwm.util.java.StringUtil" %>
 <%@ page import="java.util.ArrayList" %>
 <%@ page import="java.util.ArrayList" %>

+ 1 - 1
webapp/src/main/webapp/WEB-INF/jsp/configmanager-wordlists.jsp

@@ -23,7 +23,7 @@
 <%@ page import="password.pwm.http.JspUtility" %>
 <%@ page import="password.pwm.http.JspUtility" %>
 <%@ page import="password.pwm.http.tag.conditional.PwmIfTest" %>
 <%@ page import="password.pwm.http.tag.conditional.PwmIfTest" %>
 <%@ page import="password.pwm.i18n.Config" %>
 <%@ page import="password.pwm.i18n.Config" %>
-<%@ page import="password.pwm.util.LocaleHelper" %>
+<%@ page import="password.pwm.util.i18n.LocaleHelper" %>
 
 
 <!DOCTYPE html>
 <!DOCTYPE html>
 <%@ page language="java" session="true" isThreadSafe="true" contentType="text/html" %>
 <%@ page language="java" session="true" isThreadSafe="true" contentType="text/html" %>

+ 1 - 1
webapp/src/main/webapp/WEB-INF/jsp/configmanager.jsp

@@ -23,7 +23,7 @@
 <%@ page import="password.pwm.PwmEnvironment" %>
 <%@ page import="password.pwm.PwmEnvironment" %>
 <%@ page import="password.pwm.http.JspUtility" %>
 <%@ page import="password.pwm.http.JspUtility" %>
 <%@ page import="password.pwm.i18n.Config" %>
 <%@ page import="password.pwm.i18n.Config" %>
-<%@ page import="password.pwm.util.LocaleHelper" %>
+<%@ page import="password.pwm.util.i18n.LocaleHelper" %>
 <%@ page import="password.pwm.util.java.StringUtil" %>
 <%@ page import="password.pwm.util.java.StringUtil" %>
 <%@ page import="password.pwm.http.tag.conditional.PwmIfTest" %>
 <%@ page import="password.pwm.http.tag.conditional.PwmIfTest" %>
 <%@ page import="password.pwm.http.tag.value.PwmValue" %>
 <%@ page import="password.pwm.http.tag.value.PwmValue" %>

+ 1 - 1
webapp/src/main/webapp/WEB-INF/jsp/fragment/ldap-permissions.jsp

@@ -28,7 +28,7 @@
 <%@ page import="java.util.Map" %>
 <%@ page import="java.util.Map" %>
 <%@ page import="java.util.Set" %>
 <%@ page import="java.util.Set" %>
 <%@ page import="java.util.TreeSet" %>
 <%@ page import="java.util.TreeSet" %>
-<%@ page import="password.pwm.util.LocaleHelper" %>
+<%@ page import="password.pwm.util.i18n.LocaleHelper" %>
 <%@ page import="password.pwm.i18n.Display" %>
 <%@ page import="password.pwm.i18n.Display" %>
 <%@ page import="password.pwm.http.PwmRequestAttribute" %>
 <%@ page import="password.pwm.http.PwmRequestAttribute" %>
 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <%@ page contentType="text/html;charset=UTF-8" language="java" %>

+ 1 - 1
webapp/src/main/webapp/WEB-INF/jsp/setupotpsecret-test.jsp

@@ -23,7 +23,7 @@
 <%@ page import="password.pwm.http.bean.SetupOtpBean" %>
 <%@ page import="password.pwm.http.bean.SetupOtpBean" %>
 <%@ page import="password.pwm.http.tag.conditional.PwmIfTest" %>
 <%@ page import="password.pwm.http.tag.conditional.PwmIfTest" %>
 <%@ page import="password.pwm.i18n.Display" %>
 <%@ page import="password.pwm.i18n.Display" %>
-<%@ page import="password.pwm.util.LocaleHelper" %>
+<%@ page import="password.pwm.util.i18n.LocaleHelper" %>
 <%@ page import="org.apache.commons.lang3.StringEscapeUtils" %>
 <%@ page import="org.apache.commons.lang3.StringEscapeUtils" %>
 <!DOCTYPE html>
 <!DOCTYPE html>
 <%@ page language="java" session="true" isThreadSafe="true"
 <%@ page language="java" session="true" isThreadSafe="true"

+ 1 - 1
webapp/src/main/webapp/public/reference/displaystrings.jsp

@@ -22,7 +22,7 @@
 
 
 <%@ page import="password.pwm.http.JspUtility" %>
 <%@ page import="password.pwm.http.JspUtility" %>
 <%@ page import="password.pwm.i18n.PwmLocaleBundle" %>
 <%@ page import="password.pwm.i18n.PwmLocaleBundle" %>
-<%@ page import="password.pwm.util.LocaleHelper" %>
+<%@ page import="password.pwm.util.i18n.LocaleHelper" %>
 <%@ page import="password.pwm.util.java.StringUtil" %>
 <%@ page import="password.pwm.util.java.StringUtil" %>
 <%@ page import="java.util.*" %>
 <%@ page import="java.util.*" %>
 
 

+ 23 - 52
webapp/src/main/webapp/public/reference/localeinfo.jsp

@@ -20,15 +20,14 @@
  ~ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  ~ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 --%>
 --%>
 
 
-<%@ page import="password.pwm.error.PwmException" %>
-<%@ page import="password.pwm.http.JspUtility" %>
 <%@ page import="password.pwm.i18n.PwmLocaleBundle" %>
 <%@ page import="password.pwm.i18n.PwmLocaleBundle" %>
-<%@ page import="password.pwm.util.LocaleHelper" %>
+<%@ page import="password.pwm.util.i18n.ConfigLocaleStats" %>
+<%@ page import="password.pwm.util.i18n.LocaleHelper" %>
+<%@ page import="password.pwm.util.i18n.LocaleStats" %>
 <%@ page import="java.text.NumberFormat" %>
 <%@ page import="java.text.NumberFormat" %>
-<%@ page import="java.util.ArrayList" %>
-<%@ page import="java.util.Arrays" %>
 <%@ page import="java.util.List" %>
 <%@ page import="java.util.List" %>
 <%@ page import="java.util.Locale" %>
 <%@ page import="java.util.Locale" %>
+<%@ page import="java.util.Map" %>
 
 
 <!DOCTYPE html>
 <!DOCTYPE html>
 <% JspUtility.setFlag(pageContext, PwmRequestFlag.HIDE_HEADER_WARNINGS); %>
 <% JspUtility.setFlag(pageContext, PwmRequestFlag.HIDE_HEADER_WARNINGS); %>
@@ -40,42 +39,13 @@
 <%@ page language="java" session="true" isThreadSafe="true" contentType="text/html" %>
 <%@ page language="java" session="true" isThreadSafe="true" contentType="text/html" %>
 <%@ taglib uri="pwm" prefix="pwm" %>
 <%@ taglib uri="pwm" prefix="pwm" %>
 <%
 <%
-    final List<Locale> HIGHLIGHTED_LOCALES = Arrays.asList(new Locale[] {
-            LocaleHelper.parseLocaleString("en"),
-            LocaleHelper.parseLocaleString("ca"),
-            LocaleHelper.parseLocaleString("da"),
-            LocaleHelper.parseLocaleString("de"),
-            LocaleHelper.parseLocaleString("es"),
-            LocaleHelper.parseLocaleString("fr"),
-            LocaleHelper.parseLocaleString("it"),
-            LocaleHelper.parseLocaleString("ja"),
-            LocaleHelper.parseLocaleString("nl"),
-            LocaleHelper.parseLocaleString("pl"),
-            LocaleHelper.parseLocaleString("pt_BR"),
-            LocaleHelper.parseLocaleString("ru"),
-            LocaleHelper.parseLocaleString("sv"),
-            LocaleHelper.parseLocaleString("zh_CN"),
-            LocaleHelper.parseLocaleString("zh_TW")
-    });
-
-    PwmRequest pwmRequest = null;
-    LocaleHelper.LocaleStats allStats = null;
-    LocaleHelper.LocaleStats userFacingStats = null;
-    LocaleHelper.LocaleStats adminFacingStats = null;
-    LocaleHelper.ConfigLocaleStats configLocaleStats = null;
-    try {
-        pwmRequest = PwmRequest.forRequest(request, response);
-        allStats = LocaleHelper.getStatsForBundles(PwmLocaleBundle.allValues());
-        userFacingStats = LocaleHelper.getStatsForBundles(PwmLocaleBundle.userFacingValues());
-        {
-            final List<PwmLocaleBundle> adminBundles = new ArrayList<PwmLocaleBundle>(PwmLocaleBundle.allValues());
-            adminBundles.removeAll(PwmLocaleBundle.userFacingValues());
-            adminFacingStats = LocaleHelper.getStatsForBundles(adminBundles);
-        }
-        configLocaleStats = LocaleHelper.getConfigLocaleStats();
-    } catch (PwmException e) {
-        JspUtility.logError(pageContext, "error during page setup: " + e.getMessage());
-    }
+    final List<Locale> highlightedLocales = LocaleHelper.highLightedLocales();
+    final PwmRequest pwmRequest = JspUtility.getPwmRequest( pageContext );
+    final Map<PwmLocaleBundle, LocaleStats> localeStats = LocaleStats.getAllLocaleStats();
+    final LocaleStats allStats = LocaleStats.getAllStats();
+    final LocaleStats userFacingStats = LocaleStats.getUserFacingStats();
+    final LocaleStats adminFacingStats = LocaleStats.getAdminFacingStats();
+    final ConfigLocaleStats configLocaleStats = ConfigLocaleStats.getConfigLocaleStats();
 %>
 %>
 <html lang="<pwm:value name="<%=PwmValue.localeCode%>"/>" dir="<pwm:value name="<%=PwmValue.localeDir%>"/>">
 <html lang="<pwm:value name="<%=PwmValue.localeCode%>"/>" dir="<pwm:value name="<%=PwmValue.localeDir%>"/>">
 <%@ include file="/WEB-INF/jsp/fragment/header.jsp" %>
 <%@ include file="/WEB-INF/jsp/fragment/header.jsp" %>
@@ -108,6 +78,7 @@
                 </td>
                 </td>
             </tr>
             </tr>
             <% for (final PwmLocaleBundle pwmLocaleBundle : PwmLocaleBundle.values()) { %>
             <% for (final PwmLocaleBundle pwmLocaleBundle : PwmLocaleBundle.values()) { %>
+            <% LocaleStats bundleStats = localeStats.get( pwmLocaleBundle ); %>
             <tr>
             <tr>
                 <td>
                 <td>
                     <%=pwmLocaleBundle.getTheClass().getSimpleName()%>
                     <%=pwmLocaleBundle.getTheClass().getSimpleName()%>
@@ -116,10 +87,10 @@
                     <%=LocaleHelper.booleanString(!pwmLocaleBundle.isAdminOnly(), pwmRequest.getLocale(), pwmRequest.getConfig())%>
                     <%=LocaleHelper.booleanString(!pwmLocaleBundle.isAdminOnly(), pwmRequest.getLocale(), pwmRequest.getConfig())%>
                 </td>
                 </td>
                 <td>
                 <td>
-                    <%=numberFormat.format(pwmLocaleBundle.getKeys().size())%>
+                    <%=numberFormat.format(bundleStats.getTotalKeys())%>
                 </td>
                 </td>
                 <td>
                 <td>
-                    <%=numberFormat.format(pwmLocaleBundle.getKeys().size() * allStats.getMissingKeys().values().iterator().next().size())%>
+                    <%=numberFormat.format(bundleStats.getTotalSlots())%>
                 </td>
                 </td>
             </tr>
             </tr>
             <% } %>
             <% } %>
@@ -159,7 +130,7 @@
                 </td>
                 </td>
             </tr>
             </tr>
             <% for (final Locale loopLocale: pwmRequest.getConfig().getKnownLocales()) { %>
             <% for (final Locale loopLocale: pwmRequest.getConfig().getKnownLocales()) { %>
-            <% final boolean highLight =  (HIGHLIGHTED_LOCALES.contains(loopLocale)); %>
+            <% final boolean highLight =  ( highlightedLocales.contains(loopLocale)); %>
             <tr<%=highLight ? " class=\"highlight\"" : ""%>>
             <tr<%=highLight ? " class=\"highlight\"" : ""%>>
                 <td>
                 <td>
                     <%=loopLocale.getDisplayName()%>
                     <%=loopLocale.getDisplayName()%>
@@ -216,7 +187,7 @@
                 </td>
                 </td>
             </tr>
             </tr>
             <% for (final Locale loopLocale: pwmRequest.getConfig().getKnownLocales()) { %>
             <% for (final Locale loopLocale: pwmRequest.getConfig().getKnownLocales()) { %>
-            <% final boolean highLight =  (HIGHLIGHTED_LOCALES.contains(loopLocale)); %>
+            <% final boolean highLight =  ( highlightedLocales.contains(loopLocale)); %>
             <tr<%=highLight ? " class=\"highlight\"" : ""%>>
             <tr<%=highLight ? " class=\"highlight\"" : ""%>>
                 <td>
                 <td>
                     <%=loopLocale.getDisplayName()%>
                     <%=loopLocale.getDisplayName()%>
@@ -274,7 +245,7 @@
                 </td>
                 </td>
             </tr>
             </tr>
             <% for (final Locale loopLocale: pwmRequest.getConfig().getKnownLocales()) { %>
             <% for (final Locale loopLocale: pwmRequest.getConfig().getKnownLocales()) { %>
-            <% final boolean highLight =  (HIGHLIGHTED_LOCALES.contains(loopLocale)); %>
+            <% final boolean highLight =  ( highlightedLocales.contains(loopLocale)); %>
             <tr<%=highLight ? " class=\"highlight\"" : ""%>>
             <tr<%=highLight ? " class=\"highlight\"" : ""%>>
                 <td>
                 <td>
                     <%=loopLocale.getDisplayName()%>
                     <%=loopLocale.getDisplayName()%>
@@ -331,7 +302,7 @@
                 </td>
                 </td>
             </tr>
             </tr>
             <% for (final Locale loopLocale: pwmRequest.getConfig().getKnownLocales()) { %>
             <% for (final Locale loopLocale: pwmRequest.getConfig().getKnownLocales()) { %>
-            <% final boolean highLight =  (HIGHLIGHTED_LOCALES.contains(loopLocale)); %>
+            <% final boolean highLight =  ( highlightedLocales.contains(loopLocale)); %>
             <tr<%=highLight ? " class=\"highlight\"" : ""%>>
             <tr<%=highLight ? " class=\"highlight\"" : ""%>>
                 <td>
                 <td>
                     <%= loopLocale.getDisplayName() %>
                     <%= loopLocale.getDisplayName() %>
@@ -363,7 +334,7 @@
                 </td>
                 </td>
             </tr>
             </tr>
             <% for (final Locale loopLocale: pwmRequest.getConfig().getKnownLocales()) { %>
             <% for (final Locale loopLocale: pwmRequest.getConfig().getKnownLocales()) { %>
-            <% final boolean highLight =  (HIGHLIGHTED_LOCALES.contains(loopLocale)); %>
+            <% final boolean highLight =  ( highlightedLocales.contains(loopLocale)); %>
             <tr<%=highLight ? " class=\"highlight\"" : ""%>>
             <tr<%=highLight ? " class=\"highlight\"" : ""%>>
                 <td>
                 <td>
                     <%= loopLocale.getDisplayName() %>
                     <%= loopLocale.getDisplayName() %>
@@ -388,11 +359,11 @@
                 Key
                 Key
             </td>
             </td>
         </tr>
         </tr>
-        <% for (final PwmLocaleBundle pwmLocaleBundle : allStats.getMissingKeys().keySet()) { %>
+        <% for (final PwmLocaleBundle pwmLocaleBundle : PwmLocaleBundle.allValues()) { %>
         <% if (!pwmLocaleBundle.isAdminOnly()) { %>
         <% if (!pwmLocaleBundle.isAdminOnly()) { %>
-        <% for (final Locale locale : allStats.getMissingKeys().get(pwmLocaleBundle).keySet()) { %>
-        <% if (HIGHLIGHTED_LOCALES.contains(locale)) { %>
-        <% for (final String key : allStats.getMissingKeys().get(pwmLocaleBundle).get(locale)) { %>
+        <% for (final Locale locale : pwmRequest.getConfig().getKnownLocales()) { %>
+        <% if ( highlightedLocales.contains(locale)) { %>
+        <% for (final String key : LocaleStats.missingKeysForBundleAndLocale( pwmLocaleBundle, locale )) { %>
         <tr>
         <tr>
             <td>
             <td>
                 <%=pwmLocaleBundle.getTheClass().getSimpleName()%>
                 <%=pwmLocaleBundle.getTheClass().getSimpleName()%>

+ 1 - 1
webapp/src/main/webapp/public/reference/settings.jsp

@@ -25,7 +25,7 @@
 <%@ page import="password.pwm.config.PwmSettingSyntax" %>
 <%@ page import="password.pwm.config.PwmSettingSyntax" %>
 <%@ page import="password.pwm.error.PwmException" %>
 <%@ page import="password.pwm.error.PwmException" %>
 <%@ page import="password.pwm.http.JspUtility" %>
 <%@ page import="password.pwm.http.JspUtility" %>
-<%@ page import="password.pwm.util.LocaleHelper" %>
+<%@ page import="password.pwm.util.i18n.LocaleHelper" %>
 <%@ page import="password.pwm.util.java.StringUtil" %>
 <%@ page import="password.pwm.util.java.StringUtil" %>
 <%@ page import="java.util.*" %>
 <%@ page import="java.util.*" %>
 <%@ page import="password.pwm.util.macro.MacroMachine" %>
 <%@ page import="password.pwm.util.macro.MacroMachine" %>