Author: radu
Date: Tue Jul  5 12:19:16 2016
New Revision: 1751458

URL: http://svn.apache.org/viewvc?rev=1751458&view=rev
Log:
SLING-5314 - Support setting the basename for the resource bundle backing the 
Sightly i18n Extension

* added support for non-standard (not in the language specification) 'basename' 
option in expressions using 'i18n'

Added:
    
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/locales/de_finance_basename.json
    
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/scripts/i18n/
    
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/scripts/i18n/basename.html
Modified:
    
sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/compiler/RuntimeFunction.java
    
sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/impl/filter/I18nFilter.java
    
sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/I18nRuntimeExtension.java
    
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/locales/de.json
    
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/sightly.json
    
sling/trunk/bundles/scripting/sightly/testing/src/test/java/org/apache/sling/scripting/sightly/it/SlingSpecificsSightlyIT.java

Modified: 
sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/compiler/RuntimeFunction.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/compiler/RuntimeFunction.java?rev=1751458&r1=1751457&r2=1751458&view=diff
==============================================================================
--- 
sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/compiler/RuntimeFunction.java
 (original)
+++ 
sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/compiler/RuntimeFunction.java
 Tue Jul  5 12:19:16 2016
@@ -16,6 +16,8 @@
  
******************************************************************************/
 package org.apache.sling.scripting.sightly.compiler;
 
+import java.util.Locale;
+
 /**
  * <p>
  *     This class documents what runtime functions (abstracted by
@@ -55,6 +57,8 @@ public final class RuntimeFunction {
      *         <li>the String to translate</li>
      *         <li>optional: locale information</li>
      *         <li>optional: hint information</li>
+     *         <li>optional (not part of the specification): basename 
information; for more details see
+     *         {@link java.util.ResourceBundle#getBundle(String, Locale)}</li>
      *     </ol>
      * </p>
      * <p>

Modified: 
sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/impl/filter/I18nFilter.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/impl/filter/I18nFilter.java?rev=1751458&r1=1751457&r2=1751458&view=diff
==============================================================================
--- 
sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/impl/filter/I18nFilter.java
 (original)
+++ 
sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/impl/filter/I18nFilter.java
 Tue Jul  5 12:19:16 2016
@@ -32,6 +32,7 @@ public final class I18nFilter extends Ab
     public static final String I18N_OPTION = "i18n";
     public static final String HINT_OPTION = "hint";
     public static final String LOCALE_OPTION = "locale";
+    public static final String BASENAME_OPTION = "basename";
 
     private static final class I18nFilterLoader {
         private static final I18nFilter INSTANCE = new I18nFilter();
@@ -55,7 +56,7 @@ public final class I18nFilter extends Ab
             return expression;
         }
         ExpressionNode translation = new RuntimeCall(RuntimeFunction.I18N, 
expression.getRoot(), new MapLiteral
-                (getFilterOptions(expression, HINT_OPTION, LOCALE_OPTION)));
+                (getFilterOptions(expression, HINT_OPTION, LOCALE_OPTION, 
BASENAME_OPTION)));
         expression.removeOption(I18N_OPTION);
         return expression.withNode(translation);
     }

Modified: 
sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/I18nRuntimeExtension.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/I18nRuntimeExtension.java?rev=1751458&r1=1751457&r2=1751458&view=diff
==============================================================================
--- 
sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/I18nRuntimeExtension.java
 (original)
+++ 
sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/I18nRuntimeExtension.java
 Tue Jul  5 12:19:16 2016
@@ -58,11 +58,12 @@ public class I18nRuntimeExtension implem
         Map<String, Object> options = (Map<String, Object>) arguments[1];
         String locale = runtimeObjectModel.toString(options.get("locale"));
         String hint = runtimeObjectModel.toString(options.get("hint"));
+        String basename = runtimeObjectModel.toString(options.get("basename"));
         final Bindings bindings = renderContext.getBindings();
-        return get(bindings, text, locale, hint);
+        return get(bindings, text, locale, basename, hint);
     }
 
-    private String get(final Bindings bindings, String text, String locale, 
String hint) {
+    private String get(final Bindings bindings, String text, String locale, 
String basename, String hint) {
 
         final SlingScriptHelper slingScriptHelper = 
BindingsUtils.getHelper(bindings);
         final SlingHttpServletRequest request = 
BindingsUtils.getRequest(bindings);
@@ -76,17 +77,17 @@ public class I18nRuntimeExtension implem
                 Enumeration<Locale> requestLocales = request.getLocales();
                 while (requestLocales.hasMoreElements()) {
                     Locale l = requestLocales.nextElement();
-                    ResourceBundle resourceBundle = 
resourceBundleProvider.getResourceBundle(l);
-                    if (resourceBundle != null && 
resourceBundle.containsKey(key)) {
-                        return resourceBundle.getString(key);
+                    String translation = 
getTranslation(resourceBundleProvider, basename, key, l);
+                    if (translation != null) {
+                        return translation;
                     }
                 }
             } else {
                 try {
                     Locale l = LocaleUtils.toLocale(locale);
-                    ResourceBundle resourceBundle = 
resourceBundleProvider.getResourceBundle(l);
-                    if (resourceBundle != null && 
resourceBundle.containsKey(key)) {
-                        return resourceBundle.getString(key);
+                    String translation = 
getTranslation(resourceBundleProvider, basename, key, l);
+                    if (translation != null) {
+                        return translation;
                     }
                 } catch (IllegalArgumentException e) {
                     LOG.warn("Invalid locale detected: {}.", locale);
@@ -99,4 +100,17 @@ public class I18nRuntimeExtension implem
                 new String[] {text, locale, 
request.getLocale().getLanguage()});
         return text;
     }
+
+    private String getTranslation(ResourceBundleProvider 
resourceBundleProvider, String basename, String key, Locale locale) {
+        ResourceBundle resourceBundle;
+        if (StringUtils.isNotEmpty(basename)) {
+            resourceBundle = 
resourceBundleProvider.getResourceBundle(basename, locale);
+        } else {
+            resourceBundle = resourceBundleProvider.getResourceBundle(locale);
+        }
+        if (resourceBundle != null && resourceBundle.containsKey(key)) {
+            return resourceBundle.getString(key);
+        }
+        return null;
+    }
 }

Modified: 
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/locales/de.json
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/locales/de.json?rev=1751458&r1=1751457&r2=1751458&view=diff
==============================================================================
--- 
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/locales/de.json
 (original)
+++ 
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/locales/de.json
 Tue Jul  5 12:19:16 2016
@@ -21,6 +21,10 @@
         "jcr:primaryType" : "sling:MessageEntry",
         "sling:key" : "bun",
         "sling:message" : "Brötchen"
+    },
+    "bank"          : {
+        "jcr:primaryType": "sling:MessageEntry",
+        "sling:key"      : "the bank",
+        "sling:message"  : "das Ufer"
     }
-
 }

Added: 
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/locales/de_finance_basename.json
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/locales/de_finance_basename.json?rev=1751458&view=auto
==============================================================================
--- 
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/locales/de_finance_basename.json
 (added)
+++ 
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/locales/de_finance_basename.json
 Tue Jul  5 12:19:16 2016
@@ -0,0 +1,15 @@
+{
+    "jcr:primaryType": "nt:unstructured",
+    "jcr:mixinTypes" : [
+        "mix:language"
+    ],
+    "jcr:language"   : "de",
+    "sling:basename" : [
+        "finance"
+    ],
+    "bank"          : {
+        "jcr:primaryType": "sling:MessageEntry",
+        "sling:key"      : "the bank",
+        "sling:message"  : "die Bank"
+    }
+}

Added: 
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/scripts/i18n/basename.html
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/scripts/i18n/basename.html?rev=1751458&view=auto
==============================================================================
--- 
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/scripts/i18n/basename.html
 (added)
+++ 
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/scripts/i18n/basename.html
 Tue Jul  5 12:19:16 2016
@@ -0,0 +1,18 @@
+<!--/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/-->
+<div id="i18n-basename-finance">${'the bank' @ i18n, locale='de', 
basename='finance'}</div>
+<div id="i18n-nobasename">${'the bank' @ i18n, locale='de'}</div>

Modified: 
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/sightly.json
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/sightly.json?rev=1751458&r1=1751457&r2=1751458&view=diff
==============================================================================
--- 
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/sightly.json
 (original)
+++ 
sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/sightly.json
 Tue Jul  5 12:19:16 2016
@@ -56,5 +56,9 @@
     "use-somefolder": {
         "jcr:primaryType": "sling:Folder",
         "data": "foobar-somefolder"
+    },
+    "i18n": {
+        "jcr:primaryType": "nt:unstructured",
+        "sling:resourceType" : "/apps/sightly/scripts/i18n"
     }
 }

Modified: 
sling/trunk/bundles/scripting/sightly/testing/src/test/java/org/apache/sling/scripting/sightly/it/SlingSpecificsSightlyIT.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing/src/test/java/org/apache/sling/scripting/sightly/it/SlingSpecificsSightlyIT.java?rev=1751458&r1=1751457&r2=1751458&view=diff
==============================================================================
--- 
sling/trunk/bundles/scripting/sightly/testing/src/test/java/org/apache/sling/scripting/sightly/it/SlingSpecificsSightlyIT.java
 (original)
+++ 
sling/trunk/bundles/scripting/sightly/testing/src/test/java/org/apache/sling/scripting/sightly/it/SlingSpecificsSightlyIT.java
 Tue Jul  5 12:19:16 2016
@@ -60,6 +60,7 @@ public class SlingSpecificsSightlyIT {
     private static final String SLING_REQUEST_ATTRIBUTES = 
"/sightly/requestattributes.html";
     private static final String SLING_REQUEST_ATTRIBUTES_INCLUDE = 
"/sightly/requestattributes.include.html";
     private static final String SLING_RESOURCE_USE = 
"/sightly/use.resource.html";
+    private static final String SLING_I18N = "/sightly/i18n";
 
     @BeforeClass
     public static void init() {
@@ -271,6 +272,14 @@ public class SlingSpecificsSightlyIT {
         assertEquals("foobar-someecma", HTMLExtractor.innerHTML(url, 
pageContent, "#someecma .data"));
     }
 
+    @Test
+    public void testI18nBasename() {
+        String url = launchpadURL + SLING_I18N + ".basename.html";
+        String pageContent = client.getStringContent(url, 200);
+        assertEquals("die Bank", HTMLExtractor.innerHTML(url, pageContent, 
"#i18n-basename-finance"));
+        assertEquals("das Ufer", HTMLExtractor.innerHTML(url, pageContent, 
"#i18n-nobasename"));
+    }
+
     private void uploadFile(String fileName, String serverFileName, String 
url) throws IOException {
         HttpClient httpClient = HttpClientBuilder.create().build();
         HttpPost post = new HttpPost(launchpadURL + url);


Reply via email to