ISIS-903: working towards parsing plural form (not there yet)
Project: http://git-wip-us.apache.org/repos/asf/isis/repo Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/e0830080 Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/e0830080 Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/e0830080 Branch: refs/heads/master Commit: e08300805d7bbbebbf58dcd010342779b2e9fb0d Parents: b0470ba Author: Dan Haywood <[email protected]> Authored: Tue Feb 17 11:57:33 2015 +0000 Committer: Dan Haywood <[email protected]> Committed: Wed Feb 18 14:07:39 2015 +0000 ---------------------------------------------------------------------- .../core/metamodel/services/i18n/po/Block.java | 83 +++++++++++++++----- .../services/i18n/po/PoReaderTest.java | 39 +++++++++ 2 files changed, 103 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/isis/blob/e0830080/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/Block.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/Block.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/Block.java index d4543ad..45af493 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/Block.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/Block.java @@ -9,43 +9,88 @@ import com.google.common.collect.Lists; class Block { private enum State { - CONTEXT, - MSGID, - MSGSTR - } + CONTEXT("^#: (?<value>.+)$"), + MSGID("^msgid \"(?<value>.+)\"$"), + MSGID_PLURAL("^msgid_plural \"(?<value>.+)\"$"), + MSGSTR("^msgstr \"(?<value>.+)\"$"), + MSGSTR0("^msgstr\\[0\\] \"(?<value>.+)\"$"), + MSGSTR1("^msgstr\\[1\\] \"(?<value>.+)\"$"); - private static final Pattern contextPattern = Pattern.compile("^#: (?<context>.+)$"); - private static final Pattern msgidPattern = Pattern.compile("^msgid \"(?<msgid>.+)\"$"); - private static final Pattern msgstrPattern = Pattern.compile("^msgstr \"(?<msgstr>.+)\"$"); + private final Pattern pattern; + + private State(final String regex) { + pattern = Pattern.compile(regex); + } + } State state = State.CONTEXT; List<String> contextList = Lists.newArrayList(); String msgid = null; - String msgstr = null; + String msgid_plural = null; + String msgstr = null; // either from msgstr or msgstr[0] if there is a plural + String msgstr_plural = null; // from msgstr[1] Block parseLine(final String line, final Map<MsgIdAndContext, String> translationsByKey) { if (state == State.CONTEXT) { - final Matcher matcher = contextPattern.matcher(line); - if (matcher.matches()) { - final String context = matcher.group("context"); + final Matcher contextMatcher = state.pattern.matcher(line); + if (contextMatcher.matches()) { + final String context = contextMatcher.group("value"); contextList.add(context); + return this; } else { state = State.MSGID; + // fallthrough (there may not have been any more context) } } + if (state == State.MSGID) { - final Matcher matcher = msgidPattern.matcher(line); - if (matcher.matches()) { - msgid = matcher.group("msgid"); + final Matcher msgidMatcher = state.pattern.matcher(line); + if (msgidMatcher.matches()) { + msgid = msgidMatcher.group("value"); + state = State.MSGID_PLURAL; // found, next time look for plurals } else { - state = State.MSGSTR; + return new Block(); } + return this; } + + if (state == State.MSGID_PLURAL) { + final Matcher msgIdPluralMatcher = state.pattern.matcher(line); + if (msgIdPluralMatcher.matches()) { + msgid_plural = msgIdPluralMatcher.group("value"); + state = State.MSGSTR0; // next time look for msgstr[0] + return this; + } else { + state = State.MSGSTR; // fall through (there may not have been any plural form) + } + } + if (state == State.MSGSTR) { - final Matcher matcher = msgstrPattern.matcher(line); - if (matcher.matches()) { - msgstr = matcher.group("msgstr"); + final Matcher msgStrMatcher = state.pattern.matcher(line); + if (msgStrMatcher.matches()) { + msgstr = msgStrMatcher.group("value"); + } + append(translationsByKey); + return new Block(); + } + + if (state == State.MSGSTR0) { + final Matcher msgStr0Matcher = state.pattern.matcher(line); + if (msgStr0Matcher.matches()) { + msgstr = msgStr0Matcher.group("value"); + state = State.MSGSTR1; // next time, look for plural + } else { + append(translationsByKey); + return new Block(); + } + return this; + } + + if (state == State.MSGSTR1) { + final Matcher msgStr1Matcher = state.pattern.matcher(line); + if (msgStr1Matcher.matches()) { + msgstr_plural = msgStr1Matcher.group("value"); } append(translationsByKey); return new Block(); @@ -53,7 +98,7 @@ class Block { return this; } - private void append(final Map<MsgIdAndContext, String> translationsByKey) { + void append(final Map<MsgIdAndContext, String> translationsByKey) { if(msgid != null && msgstr != null) { for (String context : contextList) { final MsgIdAndContext mc = new MsgIdAndContext(msgid, context); http://git-wip-us.apache.org/repos/asf/isis/blob/e0830080/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/i18n/po/PoReaderTest.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/i18n/po/PoReaderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/i18n/po/PoReaderTest.java index 6b516f2..a0a00c5 100644 --- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/i18n/po/PoReaderTest.java +++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/i18n/po/PoReaderTest.java @@ -125,6 +125,45 @@ public class PoReaderTest { } @Test + public void withPlurals() throws Exception { + + // given + final String context = + "org.apache.isis.applib.services.bookmark.BookmarkHolderAssociationContributions#object()"; + final String msgid = "Work of art"; + final String msgid_plural = "Works of art"; + final String msgstr$0 = "Åuvre d'art"; + final String msgstr$1 = "Les Åuvres d'art"; + + poReader = new PoReader(null) { + @Override + protected List<String> readPo(final Locale locale) { + final List<String> lines = Lists.newArrayList(); + lines.add(String.format("#: %s", context)); + lines.add(String.format("msgid \"%s\"", msgid)); + lines.add(String.format("msgid_plural \"%s\"", msgid_plural)); + lines.add(String.format("msgstr[0] \"%s\"", msgstr$0)); + lines.add(String.format("msgstr[1] \"%s\"", msgstr$1)); + return lines; + } + }; + + // when + final String translated1 = poReader.translate(context, msgid, Locale.FRENCH); + + // then + assertThat(translated1, is(equalTo(msgstr$0))); + + // when + final String translated2 = poReader.translate(context, msgid_plural, Locale.FRENCH); + + // then + assertThat(translated2, is(equalTo(msgstr$1))); + } + + + + @Test public void noTranslation() throws Exception { // given
