Browse Source

rtl i18n improvements

jrivard@gmail.com 6 years ago
parent
commit
4e6a3e3e1b

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

@@ -165,6 +165,7 @@ public enum AppProperty
     HTTP_SESSION_RECYCLE_AT_AUTH                    ( "http.session.recycleAtAuth" ),
     HTTP_SESSION_VALIDATION_KEY_LENGTH              ( "http.session.validationKeyLength" ),
     HTTP_SERVLET_ENABLE_POST_REDIRECT_GET           ( "http.servlet.enablePostRedirectGet" ),
+    L10N_RTL_REGEX                                  ( "l10n.rtl.regex" ),
     LOCALDB_AGGRESSIVE_COMPACT_ENABLED              ( "localdb.aggressiveCompact.enabled" ),
     LOCALDB_IMPLEMENTATION                          ( "localdb.implementation" ),
     LOCALDB_INIT_STRING                             ( "localdb.initParameters" ),

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

@@ -25,6 +25,7 @@ package password.pwm.http.tag.value;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import password.pwm.AppProperty;
 import password.pwm.Permission;
+import password.pwm.PwmApplication;
 import password.pwm.PwmApplicationMode;
 import password.pwm.PwmConstants;
 import password.pwm.config.PwmSetting;
@@ -39,7 +40,6 @@ import password.pwm.util.macro.MacroMachine;
 
 import javax.servlet.jsp.JspPage;
 import javax.servlet.jsp.PageContext;
-import java.awt.ComponentOrientation;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
@@ -238,7 +238,8 @@ public enum PwmValue
     static class ClientETag implements ValueOutput
     {
         @Override
-        public String valueOutput( final PwmRequest pwmRequest, final PageContext pageContext ) throws ChaiUnavailableException, PwmUnrecoverableException
+        public String valueOutput( final PwmRequest pwmRequest, final PageContext pageContext )
+                throws PwmUnrecoverableException
         {
             return ClientApiServlet.makeClientEtag( pwmRequest );
         }
@@ -247,7 +248,7 @@ public enum PwmValue
     static class LocaleCodeOutput implements ValueOutput
     {
         @Override
-        public String valueOutput( final PwmRequest pwmRequest, final PageContext pageContext ) throws ChaiUnavailableException, PwmUnrecoverableException
+        public String valueOutput( final PwmRequest pwmRequest, final PageContext pageContext )
         {
             return pwmRequest.getLocale().toLanguageTag();
         }
@@ -256,18 +257,19 @@ public enum PwmValue
     static class LocaleDirOutput implements ValueOutput
     {
         @Override
-        public String valueOutput( final PwmRequest pwmRequest, final PageContext pageContext ) throws ChaiUnavailableException, PwmUnrecoverableException
+        public String valueOutput( final PwmRequest pwmRequest, final PageContext pageContext )
         {
             final Locale locale = pwmRequest.getLocale();
-            final ComponentOrientation orient = ComponentOrientation.getOrientation( locale );
-            return orient != null && !orient.isLeftToRight() ? "rtl" : "ltr";
+            final PwmApplication pwmApplication = pwmRequest.getPwmApplication();
+            final LocaleHelper.TextDirection textDirection = LocaleHelper.textDirectionForLocale( pwmApplication, locale );
+            return textDirection.name();
         }
     }
 
     static class LocaleNameOutput implements ValueOutput
     {
         @Override
-        public String valueOutput( final PwmRequest pwmRequest, final PageContext pageContext ) throws ChaiUnavailableException, PwmUnrecoverableException
+        public String valueOutput( final PwmRequest pwmRequest, final PageContext pageContext )
         {
             final Locale locale = pwmRequest.getLocale();
             return locale.getDisplayName( locale );
@@ -277,7 +279,7 @@ public enum PwmValue
     static class LocaleFlagFileOutput implements ValueOutput
     {
         @Override
-        public String valueOutput( final PwmRequest pwmRequest, final PageContext pageContext ) throws ChaiUnavailableException, PwmUnrecoverableException
+        public String valueOutput( final PwmRequest pwmRequest, final PageContext pageContext )
         {
             final String flagFileName = pwmRequest.getConfig().getKnownLocaleFlagMap().get( pwmRequest.getLocale() );
             return flagFileName == null ? "" : flagFileName;
@@ -287,7 +289,8 @@ public enum PwmValue
     static class InactiveTimeRemainingOutput implements ValueOutput
     {
         @Override
-        public String valueOutput( final PwmRequest pwmRequest, final PageContext pageContext ) throws ChaiUnavailableException, PwmUnrecoverableException
+        public String valueOutput( final PwmRequest pwmRequest, final PageContext pageContext )
+                throws PwmUnrecoverableException
         {
             return IdleTimeoutCalculator.idleTimeoutForRequest( pwmRequest ).asLongString();
         }

+ 18 - 0
server/src/main/java/password/pwm/util/i18n/LocaleHelper.java

@@ -22,6 +22,7 @@
 
 package password.pwm.util.i18n;
 
+import password.pwm.AppProperty;
 import password.pwm.PwmApplication;
 import password.pwm.PwmConstants;
 import password.pwm.bean.pub.SessionStateInfoBean;
@@ -52,12 +53,19 @@ import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 import java.util.StringTokenizer;
 import java.util.TreeMap;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 public class LocaleHelper
 {
     private static final PwmLogger LOGGER = PwmLogger.forClass( LocaleHelper.class );
 
+    public enum TextDirection
+    {
+        rtl,
+        ltr,
+    }
+
     public static Class classForShortName( final String shortName )
     {
         if ( shortName == null || shortName.isEmpty() )
@@ -481,4 +489,14 @@ public class LocaleHelper
     {
         return getLocalizedMessage( locale, Display.Value_NotApplicable, null );
     }
+
+    public static TextDirection textDirectionForLocale( final PwmApplication pwmApplication, final Locale locale )
+    {
+        final String rtlRegex = pwmApplication.getConfig().readAppProperty( AppProperty.L10N_RTL_REGEX );
+        final Pattern rtlPattern = Pattern.compile( rtlRegex );
+        final String languageString = locale.getLanguage();
+        return languageString != null && rtlPattern.matcher( languageString ).find()
+                ? TextDirection.rtl
+                : TextDirection.ltr;
+    }
 }

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

@@ -176,6 +176,7 @@ intruder.minimumDelayPenaltyMS=300
 intruder.maximumDelayPenaltyMS=3000
 intruder.delayPerCountMS=200
 intruder.delayMaxJitterMS=2000
+l10n.rtl.regex=^(ar|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Arab|Hebr|Thaa|Nkoo|Tfng))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)
 ldap.resolveCanonicalDN=true
 ldap.cache.canonical.enable=true
 ldap.cache.canonical.seconds=600