ISIS-903: can now write to .pot and read from .po file
Project: http://git-wip-us.apache.org/repos/asf/isis/repo Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/54b39c70 Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/54b39c70 Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/54b39c70 Branch: refs/heads/master Commit: 54b39c7019716c21704f12f62aee11636fe0995c Parents: ac66f1e Author: Dan Haywood <[email protected]> Authored: Tue Feb 17 22:57:56 2015 +0000 Committer: Dan Haywood <[email protected]> Committed: Wed Feb 18 14:07:47 2015 +0000 ---------------------------------------------------------------------- .../viewer/services/UrlResolverWicket.java | 5 +- .../services/i18n/TranslatableString.java | 8 ++- .../services/i18n/TranslationService.java | 15 +++--- .../services/i18n/TranslatableStringTest.java | 12 ++--- .../all/i18n/DescribedAsFacetTranslated.java | 33 ++++++++----- .../facets/all/i18n/I18nFacetFactory.java | 4 +- .../facets/all/i18n/NamedFacetTranslated.java | 32 +++++++----- .../facets/all/i18n/PluralFacetTranslated.java | 6 +-- .../cssclassfa/CssClassFaFacetAbstract.java | 2 +- .../services/i18n/TranslationServicePoMenu.java | 2 +- .../metamodel/services/i18n/po/PoAbstract.java | 5 +- .../metamodel/services/i18n/po/PoReader.java | 13 ++--- .../metamodel/services/i18n/po/PoWriter.java | 14 +++--- .../services/i18n/po/TranslationServicePo.java | 25 ++++++++-- .../ActionLayoutAnnotationFacetFactoryTest.java | 4 +- .../cssclassfa/CssClassFaFacetAbstractTest.java | 6 +-- .../services/i18n/po/PoReaderTest.java | 52 +++++++++++++++----- ...otationFacetFactoryTest_refineMetaModel.java | 12 ++--- .../src/main/webapp/WEB-INF/isis.properties | 4 +- .../src/main/webapp/WEB-INF/translations.po | 4 +- 20 files changed, 156 insertions(+), 102 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/UrlResolverWicket.java ---------------------------------------------------------------------- diff --git a/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/UrlResolverWicket.java b/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/UrlResolverWicket.java index d98093f..e735573 100644 --- a/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/UrlResolverWicket.java +++ b/component/viewer/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/UrlResolverWicket.java @@ -48,12 +48,15 @@ public class UrlResolverWicket implements UrlResolver { final ServletContext servletContext = getIsisWicketApplication().getServletContext(); final URL url = servletContext.getResource("/WEB-INF/" + file); return readLines(url); - } catch (final IOException ignored) { + } catch (final RuntimeException | IOException ignored) { return null; } } private static List<String> readLines(final URL url) throws IOException { + if(url == null) { + return null; + } final CharSource charSource = Resources.asCharSource(url, Charsets.UTF_8); return charSource.readLines(); } http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslatableString.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslatableString.java b/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslatableString.java index 09d24b3..5ab8eb5 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslatableString.java +++ b/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslatableString.java @@ -20,7 +20,6 @@ package org.apache.isis.applib.services.i18n; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -173,14 +172,13 @@ public final class TranslatableString { * either the single or plural form as per {@link #getPattern()}. * @param translationService * @param context - * @param locale * @return */ - public String translate(final TranslationService translationService, final String context, final Locale locale) { + public String translate(final TranslationService translationService, final String context) { final String translatedText = !isPluralForm() - ? translationService.translate(context, getSingularText(), locale) - : translationService.translate(context, getSingularText(), getPluralText(), number, locale); + ? translationService.translate(context, getSingularText()) + : translationService.translate(context, getSingularText(), getPluralText(), number); return translated(translatedText); } http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationService.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationService.java b/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationService.java index e143ef0..fc6eb1c 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationService.java +++ b/core/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationService.java @@ -18,7 +18,6 @@ */ package org.apache.isis.applib.services.i18n; -import java.util.Locale; import org.apache.isis.applib.annotation.Programmatic; public interface TranslationService { @@ -28,11 +27,10 @@ public interface TranslationService { * * @param context * @param text - * @param targetLocale * @return */ @Programmatic - public String translate(final String context, final String text, final Locale targetLocale); + public String translate(final String context, final String text); /** * Return a translation of either the singular or the plural text, dependent on the <tt>num</tt> parameter, for the specified locale. @@ -41,11 +39,10 @@ public interface TranslationService { * @param singularText * @param pluralText * @param num - whether to return the translation of the singular (if =1) or of the plural (if != 1) - * @param targetLocale * @return */ @Programmatic - public String translate(final String context, final String singularText, final String pluralText, int num, final Locale targetLocale); + public String translate(final String context, final String singularText, final String pluralText, int num); public enum Mode { @@ -65,16 +62,16 @@ public interface TranslationService { * * <p> * If in read mode, then the translations are expected to be present. In such cases, the - * {@link #translate(String, String, java.util.Locale) translate} - * {@link #translate(String, String, String, int, java.util.Locale) method}s should be <i>lazily</i> called, + * {@link #translate(String, String) translate} + * {@link #translate(String, String, String, int) method}s should be <i>lazily</i> called, * if only because there will (most likely) need to be a session in progress (such that the locale of the * current user can be determined). * </p> * * <p> * If in write mode, then the implementation is saving translation keys, and will - * always return the untranslated translation. In such cases, the {@link #translate(String, String, java.util.Locale) translate} - * {@link #translate(String, String, String, int, java.util.Locale) method}s should be <i>eagerly</i> called + * always return the untranslated translation. In such cases, the {@link #translate(String, String) translate} + * {@link #translate(String, String, String, int) method}s should be <i>eagerly</i> called * such that all pathways are exercised.. * </p> */ http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/core/applib/src/test/java/org/apache/isis/applib/services/i18n/TranslatableStringTest.java ---------------------------------------------------------------------- diff --git a/core/applib/src/test/java/org/apache/isis/applib/services/i18n/TranslatableStringTest.java b/core/applib/src/test/java/org/apache/isis/applib/services/i18n/TranslatableStringTest.java index 1e0f0fd..08bd137 100644 --- a/core/applib/src/test/java/org/apache/isis/applib/services/i18n/TranslatableStringTest.java +++ b/core/applib/src/test/java/org/apache/isis/applib/services/i18n/TranslatableStringTest.java @@ -78,12 +78,12 @@ public class TranslatableStringTest { // expect context.checking(new Expectations() {{ - oneOf(mockTranslationService).translate(someContext, simpleText, someLocale); + oneOf(mockTranslationService).translate(someContext, simpleText); will(returnValue(translation)); }}); // when - assertThat(ts.translate(mockTranslationService, someContext, someLocale), is(translation)); + assertThat(ts.translate(mockTranslationService, someContext), is(translation)); } @Test @@ -100,12 +100,12 @@ public class TranslatableStringTest { // expect context.checking(new Expectations() {{ - oneOf(mockTranslationService).translate(someContext, singularText, someLocale); + oneOf(mockTranslationService).translate(someContext, singularText, pluralText, 1); will(returnValue(translation)); }}); // when - assertThat(ts.translate(mockTranslationService, someContext, someLocale), is(translation)); + assertThat(ts.translate(mockTranslationService, someContext), is(translation)); } @Test @@ -123,12 +123,12 @@ public class TranslatableStringTest { // expect context.checking(new Expectations() {{ - oneOf(mockTranslationService).translate(someContext, singularText, pluralText, number, someLocale); + oneOf(mockTranslationService).translate(someContext, singularText, pluralText, number); will(returnValue(translation)); }}); // when - assertThat(ts.translate(mockTranslationService, someContext, someLocale), is(translation)); + assertThat(ts.translate(mockTranslationService, someContext), is(translation)); } } http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/DescribedAsFacetTranslated.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/DescribedAsFacetTranslated.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/DescribedAsFacetTranslated.java index 9dbc5cc..0d432a4 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/DescribedAsFacetTranslated.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/DescribedAsFacetTranslated.java @@ -19,7 +19,6 @@ package org.apache.isis.core.metamodel.facets.all.i18n; -import org.apache.isis.applib.services.i18n.LocaleProvider; import org.apache.isis.applib.services.i18n.TranslationService; import org.apache.isis.core.metamodel.facetapi.FacetAbstract; import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder; @@ -30,32 +29,42 @@ public class DescribedAsFacetTranslated extends FacetAbstract implements Describ private final String context; private final String originalText; private final TranslationService translationService; - private final LocaleProvider localeProvider; private String value; public DescribedAsFacetTranslated( final String context, final String originalText, - final TranslationService translationService, final LocaleProvider localeProvider, + final TranslationService translationService, final IdentifiedHolder holder) { super(DescribedAsFacet.class, holder, Derivation.NOT_DERIVED); this.context = context; this.originalText = originalText; this.translationService = translationService; - this.localeProvider = localeProvider; - - - if(translationService.getMode().isWrite()) { - // force evaluation - value(); - } } @Override public String value() { - if (value == null) { - value = translationService.translate(context, originalText, localeProvider.getLocale()); + // this strange algorithm is because the translationService's mode changes + // between the time the metamodel is first built and when it is subsequently + // used. We can't distinguish (when in write mode) as to whether it is + // because we are in startup (prior to init'ing the services) or whether in + // prototype mode. We therefore never cache if in write mode (this ensures that + // the PoWriter gets to see the translation request) but do then start caching + // if we find that we're in read mode (after init of the TranslationServicePo). + switch (translationService.getMode()) { + case WRITE: + return translated(); + case READ: + // don't cache + if(value == null) { + value = translated(); + } + break; } return value; } + + private String translated() { + return translationService.translate(context, originalText); + } } http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/I18nFacetFactory.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/I18nFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/I18nFacetFactory.java index 0b6e689..dfa3d5e 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/I18nFacetFactory.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/I18nFacetFactory.java @@ -100,7 +100,7 @@ public class I18nFacetFactory extends FacetFactoryAbstract implements Contribute final LocaleProvider localeProvider = lookupLocaleProvider(); if(translationService != null && localeProvider != null) { - FacetUtil.addFacet(new NamedFacetTranslated(context, originalText, translationService, localeProvider, facetHolder)); + FacetUtil.addFacet(new NamedFacetTranslated(context, originalText, translationService, facetHolder)); } } @@ -120,7 +120,7 @@ public class I18nFacetFactory extends FacetFactoryAbstract implements Contribute final LocaleProvider localeProvider = lookupLocaleProvider(); if(translationService != null && localeProvider != null) { - FacetUtil.addFacet(new DescribedAsFacetTranslated(context, originalText, translationService, localeProvider, holder)); + FacetUtil.addFacet(new DescribedAsFacetTranslated(context, originalText, translationService, holder)); } } http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/NamedFacetTranslated.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/NamedFacetTranslated.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/NamedFacetTranslated.java index 03caada..3f3359a 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/NamedFacetTranslated.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/NamedFacetTranslated.java @@ -19,7 +19,6 @@ package org.apache.isis.core.metamodel.facets.all.i18n; -import org.apache.isis.applib.services.i18n.LocaleProvider; import org.apache.isis.applib.services.i18n.TranslationService; import org.apache.isis.core.metamodel.facetapi.FacetAbstract; import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder; @@ -28,7 +27,6 @@ import org.apache.isis.core.metamodel.facets.all.named.NamedFacet; public class NamedFacetTranslated extends FacetAbstract implements NamedFacet { final TranslationService translationService; - final LocaleProvider localeProvider; String context; String originalText; @@ -36,28 +34,40 @@ public class NamedFacetTranslated extends FacetAbstract implements NamedFacet { public NamedFacetTranslated( final String context, final String originalText, - final TranslationService translationService, final LocaleProvider localeProvider, + final TranslationService translationService, final IdentifiedHolder facetHolder) { super(NamedFacet.class, facetHolder, Derivation.NOT_DERIVED); this.context = context; this.originalText = originalText; this.translationService = translationService; - this.localeProvider = localeProvider; - - if(translationService.getMode().isWrite()) { - // force evaluation - value(); - } } @Override public String value() { - if (value == null) { - value = translationService.translate(context, originalText, localeProvider.getLocale()); + // this strange algorithm is because the translationService's mode changes + // between the time the metamodel is first built and when it is subsequently + // used. We can't distinguish (when in write mode) as to whether it is + // because we are in startup (prior to init'ing the services) or whether in + // prototype mode. We therefore never cache if in write mode (this ensures that + // the PoWriter gets to see the translation request) but do then start caching + // if we find that we're in read mode (after init of the TranslationServicePo). + switch (translationService.getMode()) { + case WRITE: + return translated(); + case READ: + // don't cache + if(value == null) { + value = translated(); + } + break; } return value; } + private String translated() { + return translationService.translate(context, originalText); + } + @Override public boolean escaped() { final NamedFacet underlyingFacet = (NamedFacet) getUnderlyingFacet(); http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/PluralFacetTranslated.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/PluralFacetTranslated.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/PluralFacetTranslated.java index 89ece86..210156e 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/PluralFacetTranslated.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i18n/PluralFacetTranslated.java @@ -19,7 +19,6 @@ package org.apache.isis.core.metamodel.facets.all.i18n; -import org.apache.isis.applib.services.i18n.LocaleProvider; import org.apache.isis.applib.services.i18n.TranslationService; import org.apache.isis.core.commons.lang.StringExtensions; import org.apache.isis.core.metamodel.facetapi.FacetAbstract; @@ -29,21 +28,20 @@ import org.apache.isis.core.metamodel.facets.object.plural.PluralFacet; public class PluralFacetTranslated extends FacetAbstract implements PluralFacet { private final TranslationService translationService; - private final LocaleProvider localeProvider; private String context; private String originalText; public PluralFacetTranslated(final NamedFacetTranslated facet, final FacetHolder facetHolder) { super(PluralFacet.class, facetHolder, Derivation.DERIVED); this.translationService = facet.translationService; - this.localeProvider = facet.localeProvider; this.context = facet.context; this.originalText = facet.originalText; } @Override public String value() { - final String singularName = translationService.translate(context, originalText, localeProvider.getLocale()); + final String singularName = translationService.translate(context, originalText); + // TODO: sure this could be improved somehow using the other overload of translationService#translate(...) return StringExtensions.asPluralName(singularName); } http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstract.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstract.java index e381e65..44081f8 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstract.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstract.java @@ -52,7 +52,7 @@ public class CssClassFaFacetAbstract extends SingleStringValueFacetAbstract impl * @return The original CSS classes plus <em>fa</em> and <em>fa-fw</em> if not already provided */ static String sanitize(final String value) { - final Iterable<String> classes = Splitter.on(WHITESPACE).split(value); + final Iterable<String> classes = Splitter.on(WHITESPACE).split(value.trim()); final Set<String> cssClassesSet = Sets.newLinkedHashSet(); cssClassesSet.add("fa"); cssClassesSet.add("fa-fw"); http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/TranslationServicePoMenu.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/TranslationServicePoMenu.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/TranslationServicePoMenu.java index 1e38bc5..239e79b 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/TranslationServicePoMenu.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/TranslationServicePoMenu.java @@ -59,7 +59,7 @@ public class TranslationServicePoMenu { return "myapp.pot"; } public boolean hideDownloadPotFile() { - return translationService == null; + return translationService == null || translationService.getMode().isRead(); } // ////////////////////////////////////// http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/PoAbstract.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/PoAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/PoAbstract.java index cfe3cd3..e732d46 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/PoAbstract.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/PoAbstract.java @@ -18,7 +18,6 @@ */ package org.apache.isis.core.metamodel.services.i18n.po; -import java.util.Locale; import org.apache.isis.applib.services.i18n.TranslationService; abstract class PoAbstract { @@ -34,9 +33,9 @@ abstract class PoAbstract { abstract void shutdown(); - abstract String translate(final String context, final String msgId, final Locale targetLocale); + abstract String translate(final String context, final String msgId); - abstract String translate(final String context, final String msgId, final String msgIdPlural, int num, final Locale targetLocale); + abstract String translate(final String context, final String msgId, final String msgIdPlural, int num); public TranslationService.Mode getMode() { return mode; http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/PoReader.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/PoReader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/PoReader.java index ade935a..702d0b6 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/PoReader.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/PoReader.java @@ -68,14 +68,15 @@ class PoReader extends PoAbstract { } //endregion - public String translate(final String context, final String msgId, final Locale targetLocale) { - - return translate(context, msgId, ContextAndMsgId.Type.REGULAR, targetLocale); + public String translate(final String context, final String msgId) { + final Locale locale = translationServicePo.getLocaleProvider().getLocale(); + return translate(context, msgId, ContextAndMsgId.Type.REGULAR, locale); } @Override - String translate(final String context, final String msgId, final String msgIdPlural, final int num, final Locale targetLocale) { + String translate(final String context, final String msgId, final String msgIdPlural, final int num) { + final Locale locale = translationServicePo.getLocaleProvider().getLocale(); final String msgIdToUse; final ContextAndMsgId.Type type; if (num == 1) { @@ -86,7 +87,7 @@ class PoReader extends PoAbstract { type = ContextAndMsgId.Type.PLURAL_ONLY; } - return translate(context, msgIdToUse, type, targetLocale); + return translate(context, msgIdToUse, type, locale); } private String translate( @@ -173,7 +174,7 @@ class PoReader extends PoAbstract { } private List<String> readUrl(final String candidate) { - final UrlResolver urlResolver = translationServicePo.urlResolver; + final UrlResolver urlResolver = translationServicePo.getUrlResolver(); if(urlResolver == null) { return null; } http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/PoWriter.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/PoWriter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/PoWriter.java index 86574bf..b8d76df 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/PoWriter.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/PoWriter.java @@ -18,7 +18,6 @@ */ package org.apache.isis.core.metamodel.services.i18n.po; -import java.util.Locale; import java.util.SortedMap; import java.util.SortedSet; import com.google.common.collect.Maps; @@ -54,7 +53,6 @@ class PoWriter extends PoAbstract { void shutdown() { final StringBuilder buf = new StringBuilder(); buf.append("\n"); - buf.append("\n"); buf.append("\n##############################################################################"); buf.append("\n#"); buf.append("\n# .pot file"); @@ -70,6 +68,11 @@ class PoWriter extends PoAbstract { buf.append("\n# /WEB-INF/translations_fr.po"); buf.append("\n# /WEB-INF/translations.po"); buf.append("\n#"); + buf.append("\n# If the app uses TranslatableString (eg for internationalized validation"); + buf.append("\n# messages), or if the app calls the TranslationService directly, then ensure"); + buf.append("\n# that all text to be translated has been captured by running a full"); + buf.append("\n# integration test suite that fully exercises all behaviour"); + buf.append("\n#"); buf.append("\n##############################################################################"); buf.append("\n"); buf.append("\n"); @@ -77,18 +80,15 @@ class PoWriter extends PoAbstract { buf.append("\n"); buf.append("\n"); buf.append("\n##############################################################################"); - buf.append("\n#"); buf.append("\n# end of .pot file"); - buf.append("\n#"); buf.append("\n##############################################################################"); buf.append("\n"); - buf.append("\n"); LOG.info(buf.toString()); } //endregion - public String translate(final String context, final String msgId, final Locale targetLocale) { + public String translate(final String context, final String msgId) { final Block block = blockFor(msgId); block.contexts.add(context); @@ -97,7 +97,7 @@ class PoWriter extends PoAbstract { } @Override - String translate(final String context, final String msgId, final String msgIdPlural, final int num, final Locale targetLocale) { + String translate(final String context, final String msgId, final String msgIdPlural, final int num) { final Block block = blockFor(msgId); block.contexts.add(context); http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/TranslationServicePo.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/TranslationServicePo.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/TranslationServicePo.java index afb6bb7..d1f1630 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/TranslationServicePo.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/i18n/po/TranslationServicePo.java @@ -18,7 +18,6 @@ */ package org.apache.isis.core.metamodel.services.i18n.po; -import java.util.Locale; import java.util.Map; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; @@ -26,6 +25,7 @@ import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.isis.applib.annotation.Programmatic; +import org.apache.isis.applib.services.i18n.LocaleProvider; import org.apache.isis.applib.services.i18n.TranslationService; import org.apache.isis.applib.services.i18n.UrlResolver; @@ -89,13 +89,13 @@ public class TranslationServicePo implements TranslationService { @Override @Programmatic - public String translate(final String context, final String text, final Locale targetLocale) { - return po.translate(context, text, targetLocale); + public String translate(final String context, final String text) { + return po.translate(context, text); } @Override - public String translate(final String context, final String singularText, final String pluralText, final int num, final Locale targetLocale) { - return po.translate(context, singularText, pluralText, num, targetLocale); + public String translate(final String context, final String singularText, final String pluralText, final int num) { + return po.translate(context, singularText, pluralText, num); } @Override @@ -114,6 +114,21 @@ public class TranslationServicePo implements TranslationService { } @Inject + private UrlResolver urlResolver; + @Inject + private + LocaleProvider localeProvider; + + + @Programmatic + public UrlResolver getUrlResolver() { + return urlResolver; + } + + @Programmatic + public LocaleProvider getLocaleProvider() { + return localeProvider; + } } http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryTest.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryTest.java index d500b9b..6efc231 100644 --- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryTest.java @@ -134,7 +134,7 @@ public class ActionLayoutAnnotationFacetFactoryTest extends AbstractFacetFactory assertThat(facet, is(notNullValue())); assertThat(facet, is(instanceOf(CssClassFaFacetForActionLayoutAnnotation.class))); CssClassFaFacetForActionLayoutAnnotation classFaFacetForActionLayoutAnnotation = (CssClassFaFacetForActionLayoutAnnotation) facet; - assertThat(classFaFacetForActionLayoutAnnotation.value(), is(equalTo("fa fa-fw font-awesome"))); + assertThat(classFaFacetForActionLayoutAnnotation.value(), is(equalTo("fa fa-fw fa-font-awesome"))); assertThat(classFaFacetForActionLayoutAnnotation.getPosition(), is(ActionLayout.CssClassFaPosition.LEFT)); } @@ -164,7 +164,7 @@ public class ActionLayoutAnnotationFacetFactoryTest extends AbstractFacetFactory assertThat(facet, is(notNullValue())); assertThat(facet, is(instanceOf(CssClassFaFacetForActionLayoutAnnotation.class))); CssClassFaFacetForActionLayoutAnnotation classFaFacetForActionLayoutAnnotation = (CssClassFaFacetForActionLayoutAnnotation) facet; - assertThat(classFaFacetForActionLayoutAnnotation.value(), is(equalTo("fa fa-fw font-awesome"))); + assertThat(classFaFacetForActionLayoutAnnotation.value(), is(equalTo("fa fa-fw fa-font-awesome"))); assertThat(classFaFacetForActionLayoutAnnotation.getPosition(), is(ActionLayout.CssClassFaPosition.RIGHT)); } http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstractTest.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstractTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstractTest.java index 23d5083..8344e96 100644 --- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstractTest.java +++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstractTest.java @@ -11,17 +11,17 @@ public class CssClassFaFacetAbstractTest { @Test public void present() throws Exception { - assertThat(CssClassFaFacetAbstract.sanitize("fa foo"), is("fa fa-fw foo")); + assertThat(CssClassFaFacetAbstract.sanitize("fa foo"), is("fa fa-fw fa-foo")); } @Test public void presentAtEnd() throws Exception { - assertThat(CssClassFaFacetAbstract.sanitize("foo fa "), is("fa fa-fw foo")); + assertThat(CssClassFaFacetAbstract.sanitize("foo fa "), is("fa fa-fw fa-foo")); } @Test public void missing() throws Exception { - assertThat(CssClassFaFacetAbstract.sanitize("foo"), is("fa fa-fw foo")); + assertThat(CssClassFaFacetAbstract.sanitize("foo"), is("fa fa-fw fa-foo")); } } } http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/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 a0a00c5..1889394 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 @@ -3,7 +3,13 @@ package org.apache.isis.core.metamodel.services.i18n.po; import java.util.List; import java.util.Locale; import com.google.common.collect.Lists; +import org.jmock.Expectations; +import org.jmock.auto.Mock; +import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.apache.isis.applib.services.i18n.LocaleProvider; +import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; @@ -11,8 +17,28 @@ import static org.junit.Assert.assertThat; public class PoReaderTest { + @Rule + public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES); + + @Mock + TranslationServicePo mockTranslationServicePo; + + @Mock + LocaleProvider mockLocaleProvider; + PoReader poReader; + @Before + public void setUp() throws Exception { + context.checking(new Expectations() {{ + allowing(mockTranslationServicePo).getLocaleProvider(); + will(returnValue(mockLocaleProvider)); + + allowing(mockLocaleProvider).getLocale(); + will(returnValue(Locale.UK)); + }}); + } + public static class Translate extends PoReaderTest { @Test @@ -24,7 +50,7 @@ public class PoReaderTest { final String msgId = "Work of art"; final String msgStr = "Objet d'art"; - poReader = new PoReader(null) { + poReader = new PoReader(mockTranslationServicePo) { @Override protected List<String> readPo(final Locale locale) { final List<String> lines = Lists.newArrayList(); @@ -36,7 +62,7 @@ public class PoReaderTest { }; // when - final String translated = poReader.translate(context, msgId, Locale.FRENCH); + final String translated = poReader.translate(context, msgId); // then assertThat(translated, is(equalTo(msgStr))); @@ -53,7 +79,7 @@ public class PoReaderTest { final String msgId = "Parameters"; final String msgStr = "Paramètres"; - poReader = new PoReader(null) { + poReader = new PoReader(mockTranslationServicePo) { @Override protected List<String> readPo(final Locale locale) { final List<String> lines = Lists.newArrayList(); @@ -65,13 +91,13 @@ public class PoReaderTest { } }; // when - final String translated = poReader.translate(context1, msgId, Locale.FRENCH); + final String translated = poReader.translate(context1, msgId); // then assertThat(translated, is(equalTo(msgStr))); // when - final String translated2 = poReader.translate(context2, msgId, Locale.FRENCH); + final String translated2 = poReader.translate(context2, msgId); // then assertThat(translated2, is(equalTo(msgStr))); @@ -91,7 +117,7 @@ public class PoReaderTest { final String msgid2 = "Lookup"; final String msgstr2 = "Look up"; - poReader = new PoReader(null) { + poReader = new PoReader(mockTranslationServicePo) { @Override protected List<String> readPo(final Locale locale) { final List<String> lines = Lists.newArrayList(); @@ -112,13 +138,13 @@ public class PoReaderTest { }; // when - final String translated1 = poReader.translate(context1, msgid1, Locale.FRENCH); + final String translated1 = poReader.translate(context1, msgid1); // then assertThat(translated1, is(equalTo(msgstr1))); // when - final String translated2 = poReader.translate(context2, msgid2, Locale.FRENCH); + final String translated2 = poReader.translate(context2, msgid2); // then assertThat(translated2, is(equalTo(msgstr2))); @@ -135,7 +161,7 @@ public class PoReaderTest { final String msgstr$0 = "Åuvre d'art"; final String msgstr$1 = "Les Åuvres d'art"; - poReader = new PoReader(null) { + poReader = new PoReader(mockTranslationServicePo) { @Override protected List<String> readPo(final Locale locale) { final List<String> lines = Lists.newArrayList(); @@ -149,13 +175,13 @@ public class PoReaderTest { }; // when - final String translated1 = poReader.translate(context, msgid, Locale.FRENCH); + final String translated1 = poReader.translate(context, msgid); // then assertThat(translated1, is(equalTo(msgstr$0))); // when - final String translated2 = poReader.translate(context, msgid_plural, Locale.FRENCH); + final String translated2 = poReader.translate(context, msgid_plural); // then assertThat(translated2, is(equalTo(msgstr$1))); @@ -168,7 +194,7 @@ public class PoReaderTest { // given - poReader = new PoReader(null) { + poReader = new PoReader(mockTranslationServicePo) { @Override protected List<String> readPo(final Locale locale) { return Lists.newArrayList(); @@ -176,7 +202,7 @@ public class PoReaderTest { }; // when - final String translated = poReader.translate("someContext", "Something to translate", Locale.FRENCH); + final String translated = poReader.translate("someContext", "Something to translate"); // then assertThat(translated, is(equalTo("Something to translate"))); http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java index 9fc8f48..1f63c13 100644 --- a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java +++ b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java @@ -18,23 +18,21 @@ */ package org.apache.isis.objectstore.jdo.metamodel.facets.object.version; -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - import javax.jdo.annotations.Version; - import org.jmock.Expectations; import org.jmock.Sequence; import org.junit.Before; import org.junit.Rule; import org.junit.Test; - import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting.Visitor; import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures; import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2; import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + public class JdoVersionAnnotationFacetFactoryTest_refineMetaModel { @Rule @@ -172,7 +170,7 @@ public class JdoVersionAnnotationFacetFactoryTest_refineMetaModel { newValidatorVisitor.visit(mockChildType, validationFailures); assertThat(validationFailures.getNumberOfMessages(), is(1)); - assertThat(validationFailures.getMessages().iterator().next(), is("Cannot have @Version annotated on subclass and any of its supertypes; subclass: mockChildType, superclass: mockParentType")); + assertThat(validationFailures.getMessages().iterator().next(), is("mockChildType: cannot have @Version annotated on this subclass and any of its supertypes; superclass: mockParentType")); } @@ -224,7 +222,7 @@ public class JdoVersionAnnotationFacetFactoryTest_refineMetaModel { newValidatorVisitor.visit(mockChildType, validationFailures); assertThat(validationFailures.getNumberOfMessages(), is(1)); - assertThat(validationFailures.getMessages().iterator().next(), is("Cannot have @Version annotated on subclass and any of its supertypes; subclass: mockChildType, superclass: mockGrandParentType")); + assertThat(validationFailures.getMessages().iterator().next(), is("mockChildType: cannot have @Version annotated on this subclass and any of its supertypes; superclass: mockGrandParentType")); } } http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties ---------------------------------------------------------------------- diff --git a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties index 3151bab..c37c570 100644 --- a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties +++ b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties @@ -270,9 +270,9 @@ isis.fixtures=fixture.simple.scenario.SimpleObjectsFixture ################################################################################# # -#force read translations, even if running in prototype mode +# force read translations, even if running in prototype mode # -isis.services.translation.po.mode=read +#isis.services.translation.po.mode=read http://git-wip-us.apache.org/repos/asf/isis/blob/54b39c70/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/translations.po ---------------------------------------------------------------------- diff --git a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/translations.po b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/translations.po index 1bf7919..e1a1d7d 100644 --- a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/translations.po +++ b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/translations.po @@ -22,7 +22,7 @@ msgstr "" #: dom.simple.SimpleObjects#create() msgid "Create" -msgstr "" +msgstr "Create simple object" #: org.apache.isis.core.metamodel.services.i18n.TranslationServicePoMenu#downloadPotFile() @@ -42,7 +42,7 @@ msgstr "" #: dom.simple.SimpleObjects#listAll() msgid "List All" -msgstr "" +msgstr "List all objects" #: fixture.simple.scenario.SimpleObjectsFixture#lookup()
