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

Reply via email to