Skip to content

Commit

Permalink
#213 WIP: add i18n resolution, still need to support the parameters f…
Browse files Browse the repository at this point in the history
…ormat
  • Loading branch information
syjer committed Oct 18, 2016
1 parent 2b08a06 commit 7b9962e
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 46 deletions.
105 changes: 67 additions & 38 deletions src/main/java/alfio/util/TemplateManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.
* <p/>
* localization_key [param1] [param2] [param3]
*
* @param key
* @return List of extracted parameters
*/
private static List<String> extractParameters(String key) {
final Matcher matcher = ARGS_PATTERN.matcher(key);
final List<String> 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;

Expand All @@ -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.
* <p/>
* localization_key [param1] [param2] [param3]
*
* @param key
* @return List of extracted parameters
*/
private List<String> extractParameters(String key) {
final Matcher matcher = ARGS_PATTERN.matcher(key);
final List<String> args = new ArrayList<>();
while (matcher.find()) {
args.add(matcher.group(1));
}
return args;
}
}

private static final String START_TAG = "{{#i18n}}";
Expand Down Expand Up @@ -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<Node> children = new ArrayList<>();
List<Node> 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 {
Expand All @@ -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 {
Expand All @@ -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();
Expand All @@ -345,8 +373,9 @@ public static String translate(String template) {
break;
}
}
//FIXME evaluate ast...

return "";
ast.visit(sb, locale, messageSource);

return sb.toString();
}
}
34 changes: 26 additions & 8 deletions src/test/java/alfio/util/TemplateManagerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
}

0 comments on commit 7b9962e

Please sign in to comment.