From 7b9962e9d7bb7c9e8d3247eaf8ac4f6590f96b65 Mon Sep 17 00:00:00 2001 From: Sylvain Jermini Date: Tue, 18 Oct 2016 12:14:35 +0200 Subject: [PATCH] #213 WIP: add i18n resolution, still need to support the parameters format --- src/main/java/alfio/util/TemplateManager.java | 105 +++++++++++------- .../java/alfio/util/TemplateManagerTest.java | 34 ++++-- 2 files changed, 93 insertions(+), 46 deletions(-) diff --git a/src/main/java/alfio/util/TemplateManager.java b/src/main/java/alfio/util/TemplateManager.java index db73bca773..386a6873db 100644 --- a/src/main/java/alfio/util/TemplateManager.java +++ b/src/main/java/alfio/util/TemplateManager.java @@ -159,10 +159,43 @@ private Template compile(AbstractResource resource, TemplateOutput templateOutpu } } + private static final Pattern KEY_PATTERN = Pattern.compile("(.*?)[\\s\\[]"); + private static final Pattern ARGS_PATTERN = Pattern.compile("\\[(.*?)\\]"); + + /** + * Split key from (optional) arguments. + * + * @param key + * @return localization key + */ + private static String extractKey(String key) { + Matcher matcher = KEY_PATTERN.matcher(key); + if (matcher.find()) { + return matcher.group(1); + } + + return key; + } + + /** + * Split args from input string. + *

+ * localization_key [param1] [param2] [param3] + * + * @param key + * @return List of extracted parameters + */ + private static List extractParameters(String key) { + final Matcher matcher = ARGS_PATTERN.matcher(key); + final List args = new ArrayList<>(); + while (matcher.find()) { + args.add(matcher.group(1)); + } + return args; + } + private static class CustomLocalizationMessageInterceptor { - private static final Pattern KEY_PATTERN = Pattern.compile("(.*?)[\\s\\[]"); - private static final Pattern ARGS_PATTERN = Pattern.compile("\\[(.*?)\\]"); private final Locale locale; private final MessageSource messageSource; @@ -180,38 +213,6 @@ protected Mustache.Lambda createTranslator() { out.write(text); }; } - - /** - * Split key from (optional) arguments. - * - * @param key - * @return localization key - */ - private String extractKey(String key) { - Matcher matcher = KEY_PATTERN.matcher(key); - if (matcher.find()) { - return matcher.group(1); - } - - return key; - } - - /** - * Split args from input string. - *

- * localization_key [param1] [param2] [param3] - * - * @param key - * @return List of extracted parameters - */ - private List extractParameters(String key) { - final Matcher matcher = ARGS_PATTERN.matcher(key); - final List args = new ArrayList<>(); - while (matcher.find()) { - args.add(matcher.group(1)); - } - return args; - } } private static final String START_TAG = "{{#i18n}}"; @@ -301,16 +302,26 @@ void addI18NNode(int startIdx) { void focusToParent() { currentLevel = currentLevel.parent; } + + public void visit(StringBuilder sb, Locale locale, MessageSource messageSource) { + root.visit(sb, locale, messageSource); + } } static class Node { Node parent; - List children = new ArrayList<>(); + List children = new ArrayList<>(1); void addChild(Node node) { children.add(node); } + + public void visit(StringBuilder sb, Locale locale, MessageSource messageSource) { + for(Node node : children) { + node.visit(sb, locale, messageSource); + } + } } static class TextNode extends Node { @@ -319,6 +330,11 @@ static class TextNode extends Node { TextNode(String text) { this.text = text; } + + @Override + public void visit(StringBuilder sb, Locale locale, MessageSource messageSource) { + sb.append(text); + } } static class I18NNode extends Node { @@ -328,9 +344,21 @@ static class I18NNode extends Node { I18NNode(int startIdx) { this.startIdx = startIdx; } + + @Override + public void visit(StringBuilder sb, Locale locale, MessageSource messageSource) { + StringBuilder internal = new StringBuilder(); + for(Node node : children) { + node.visit(internal, locale, messageSource); + } + // + //FIXME add support for parameters :) + sb.append(messageSource.getMessage(internal.toString(), null, locale)); + // + } } - public static String translate(String template) { + public static String translate(String template, Locale locale, MessageSource messageSource) { StringBuilder sb = new StringBuilder(template.length()); AST ast = new AST(); @@ -345,8 +373,9 @@ public static String translate(String template) { break; } } - //FIXME evaluate ast... - return ""; + ast.visit(sb, locale, messageSource); + + return sb.toString(); } } diff --git a/src/test/java/alfio/util/TemplateManagerTest.java b/src/test/java/alfio/util/TemplateManagerTest.java index f827169a1a..e9ef16d6cf 100644 --- a/src/test/java/alfio/util/TemplateManagerTest.java +++ b/src/test/java/alfio/util/TemplateManagerTest.java @@ -17,43 +17,61 @@ package alfio.util; +import org.junit.Assert; import org.junit.Test; +import org.springframework.context.support.StaticMessageSource; + +import java.util.Locale; public class TemplateManagerTest { + private static StaticMessageSource messageSource = new StaticMessageSource(); + static { + messageSource.addMessage("locale", Locale.ENGLISH, "en"); + messageSource.addMessage("middle", Locale.ENGLISH, "middle-en"); + + messageSource.addMessage("middle1", Locale.ENGLISH, "middle-1-resolved"); + messageSource.addMessage("middle2", Locale.ENGLISH, "middle-2-resolved"); + + messageSource.addMessage("nested", Locale.ENGLISH, "nested-1"); + messageSource.addMessage("nested-1", Locale.ENGLISH, "nested-resolved"); + messageSource.addMessage("a", Locale.ENGLISH, "a-resolved"); + messageSource.addMessage("b", Locale.ENGLISH, "b-resolved"); + messageSource.addMessage("1a-resolved-middle-b-resolved2", Locale.ENGLISH, "complete-resolved"); + } + @Test public void parseEmptyString() { - TemplateManager.translate(""); + Assert.assertEquals("", TemplateManager.translate("", Locale.ENGLISH, messageSource)); } @Test public void parseString() { - TemplateManager.translate("test"); + Assert.assertEquals("test", TemplateManager.translate("test", Locale.ENGLISH, messageSource)); } @Test public void parseOnlyI18N() { - TemplateManager.translate("{{#i18n}}{{/i18n}}"); + Assert.assertEquals("en", TemplateManager.translate("{{#i18n}}locale{{/i18n}}", Locale.ENGLISH, messageSource)); } @Test public void parseMixedI18N() { - TemplateManager.translate("before{{#i18n}}middle{{/i18n}}after"); + Assert.assertEquals("before middle-en after", TemplateManager.translate("before {{#i18n}}middle{{/i18n}} after", Locale.ENGLISH, messageSource)); } @Test public void parseMultipleMixedI18N() { - TemplateManager.translate("before1{{#i18n}}middle1{{/i18n}}after1 before2{{#i18n}}middle2{{/i18n}}after2"); + Assert.assertEquals("before1middle-1-resolvedafter1before2middle-2-resolvedafter2", TemplateManager.translate("before1{{#i18n}}middle1{{/i18n}}after1before2{{#i18n}}middle2{{/i18n}}after2", Locale.ENGLISH, messageSource)); } - @Test public void parseNestedI18N() { - TemplateManager.translate("{{#i18n}}{{#i18n}}{{/i18n}}{{/i18n}}"); + Assert.assertEquals("nested-resolved", TemplateManager.translate("{{#i18n}}{{#i18n}}nested{{/i18n}}{{/i18n}}", Locale.ENGLISH, messageSource)); } @Test public void parseNested2I18N() { - TemplateManager.translate("0{{#i18n}}1{{#i18n}}a{{/i18n}}-middle-{{#i18n}}b{{/i18n}}2{{/i18n}}3"); + Assert.assertEquals("0complete-resolved3", TemplateManager.translate("0{{#i18n}}1{{#i18n}}a{{/i18n}}-middle-{{#i18n}}b{{/i18n}}2{{/i18n}}3", Locale.ENGLISH, messageSource)); } } \ No newline at end of file