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);