Please review this patch, relative to trunk at r3808.  Consider the
following:

public interface A extends Messages {
  public interface B extends Messages {
     @DefaultMessage("foo")
     String foo();
  }
}

Currently, the translations for the foo method are looked up in files named
A$B_locale.properties.  The problem is that some build tools don't like
filenames with $ in them, and while you might be able to work around it with
quoting an easier solution is to also allow the files to be named
A_B_locale.properties.

Note that this could be a breaking change, since if you had a different
interface named A_B there could be confusion about which properties
correspond to which class.  Hopefully this will be rare.  If this approach
is accepted, I will create an issue to revisit this solution when
AbstractResource/etc are rewritten for XLIFF/etc support.

-- 
John A. Tamplin
Software Engineer (GWT), Google

--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---

Index: user/test/com/google/gwt/i18n/client/TestAnnotatedMessages.java
===================================================================
--- user/test/com/google/gwt/i18n/client/TestAnnotatedMessages.java	(revision 3808)
+++ user/test/com/google/gwt/i18n/client/TestAnnotatedMessages.java	(working copy)
@@ -31,6 +31,15 @@
 @Generate(format = "com.google.gwt.i18n.rebind.format.PropertiesFormat")
 public interface TestAnnotatedMessages extends Messages {
 
+  public interface Nested extends Messages {
+
+    @DefaultMessage("nested dollar")
+    String nestedDollar();
+
+    @DefaultMessage("nested underscore")
+    String nestedUnderscore();
+}
+
   @DefaultMessage("Test me")
   String basicText();
   
Index: user/test/com/google/gwt/i18n/client/TestAnnotatedMessages_Nested_piglatin.properties
===================================================================
--- user/test/com/google/gwt/i18n/client/TestAnnotatedMessages_Nested_piglatin.properties	(revision 0)
+++ user/test/com/google/gwt/i18n/client/TestAnnotatedMessages_Nested_piglatin.properties	(revision 0)
@@ -0,0 +1 @@
+nestedUnderscore = estednay underscoray

Property changes on: user/test/com/google/gwt/i18n/client/TestAnnotatedMessages_Nested_piglatin.properties
___________________________________________________________________
Name: svn:eol-style
   + native

Index: user/test/com/google/gwt/i18n/client/TestAnnotatedMessages_Nested_b.properties
===================================================================
--- user/test/com/google/gwt/i18n/client/TestAnnotatedMessages_Nested_b.properties	(revision 0)
+++ user/test/com/google/gwt/i18n/client/TestAnnotatedMessages_Nested_b.properties	(revision 0)
@@ -0,0 +1 @@
+nestedUnderscore = nested underscore b

Property changes on: user/test/com/google/gwt/i18n/client/TestAnnotatedMessages_Nested_b.properties
___________________________________________________________________
Name: svn:eol-style
   + native

Index: user/test/com/google/gwt/i18n/client/I18N2Test.java
===================================================================
--- user/test/com/google/gwt/i18n/client/I18N2Test.java	(revision 3808)
+++ user/test/com/google/gwt/i18n/client/I18N2Test.java	(working copy)
@@ -16,6 +16,7 @@
 package com.google.gwt.i18n.client;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.i18n.client.TestAnnotatedMessages.Nested;
 import com.google.gwt.i18n.client.gen.Colors;
 import com.google.gwt.i18n.client.gen.TestBadKeys;
 import com.google.gwt.junit.client.GWTTestCase;
@@ -32,6 +33,7 @@
     return "com.google.gwt.i18n.I18N2Test";
   }
 
+  @SuppressWarnings("deprecation")
   public void testAnnotatedMessages() {
     TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
     assertEquals("Test me", m.basicText());
@@ -125,6 +127,18 @@
     assertEquals("a circle", s.circle());
   }
 
+  /**
+   * Verify that nested annotations are looked up with both A$B names
+   * and A_B names.  Note that $ takes precedence and only one file for a
+   * given level in the inheritance tree will be used, so A$B_locale will
+   * be used and A_B_locale ignored.
+   */
+  public void testNestedAnnotations() {
+    Nested m = GWT.create(Nested.class);
+    assertEquals("nested dollar b_C", m.nestedDollar());
+    assertEquals("nested underscore b", m.nestedUnderscore());
+  }
+
   public void testWalkUpColorTree() {
     Colors colors = (Colors) GWT.create(Colors.class);
     assertEquals("red_b_C_d", colors.red());
Index: user/test/com/google/gwt/i18n/client/I18NTest.java
===================================================================
--- user/test/com/google/gwt/i18n/client/I18NTest.java	(revision 3808)
+++ user/test/com/google/gwt/i18n/client/I18NTest.java	(working copy)
@@ -16,6 +16,7 @@
 package com.google.gwt.i18n.client;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.i18n.client.TestAnnotatedMessages.Nested;
 import com.google.gwt.i18n.client.gen.Colors;
 import com.google.gwt.i18n.client.gen.Shapes;
 import com.google.gwt.i18n.client.gen.TestMessages;
@@ -51,6 +52,7 @@
     return "com.google.gwt.i18n.I18NTest";
   }
 
+  @SuppressWarnings("unchecked") // intentional test of raw map
   public void testAnnotatedConstants() {
     TestAnnotatedConstants c = GWT.create(TestAnnotatedConstants.class);
     assertEquals(14, c.fourteen());
@@ -115,8 +117,10 @@
     assertEquals("PL: Total is US$11,305.01", m.currencyFormat(11305.01));
     assertEquals("PL: Default number format is 1,017.1",
         m.defaultNumberFormat(1017.1));
+    @SuppressWarnings("deprecation")
+    Date date = new Date(107, 11, 1, 12, 1, 2);
     assertEquals("PL: It is 12:01 PM on Saturday, December 1, 2007",
-        m.getTimeDate(new Date(107, 11, 1, 12, 1, 2)));
+        m.getTimeDate(date));
     assertEquals("PL: 13 widgets", m.pluralWidgetsOther(13));
     assertEquals("Too many widgets to count (150) in pig-latin",
         m.pluralWidgetsOther(150));
@@ -519,6 +523,13 @@
     assertEquals("Extend Protected Inner", extendProtectedInner);
   }
 
+  public void testNestedAnnotations() {
+    Nested m = GWT.create(Nested.class);
+    // no translation exists in piglatin for nested dollar
+    assertEquals("nested dollar", m.nestedDollar());
+    assertEquals("estednay underscoray", m.nestedUnderscore());
+  }
+
   public void testShapesFamily() {
     Shapes shapes = (Shapes) GWT.create(Shapes.class);
     // test overload
Index: user/test/com/google/gwt/i18n/client/TestAnnotatedMessages$Nested_b_C.properties
===================================================================
--- user/test/com/google/gwt/i18n/client/TestAnnotatedMessages$Nested_b_C.properties	(revision 0)
+++ user/test/com/google/gwt/i18n/client/TestAnnotatedMessages$Nested_b_C.properties	(revision 0)
@@ -0,0 +1 @@
+nestedDollar = nested dollar b_C

Property changes on: user/test/com/google/gwt/i18n/client/TestAnnotatedMessages$Nested_b_C.properties
___________________________________________________________________
Name: svn:eol-style
   + native

Index: user/src/com/google/gwt/i18n/rebind/ResourceFactory.java
===================================================================
--- user/src/com/google/gwt/i18n/rebind/ResourceFactory.java	(revision 3808)
+++ user/src/com/google/gwt/i18n/rebind/ResourceFactory.java	(working copy)
@@ -304,8 +304,15 @@
     String partialPath = localizedPath.replace('.', '/');
     for (int i = 0; i < loaders.size(); i++) {
       ResourceFactory element = loaders.get(i);
-      String path = partialPath + "." + element.getExt();
+      String ext = "." + element.getExt();
+      String path = partialPath + ext;
       InputStream m = loader.getResourceAsStream(path);
+      if (m == null && partialPath.contains("$")) {
+        // Also look for A_B for inner classes, as $ in path names
+        // can cause issues for some build tools.
+        path = partialPath.replace('$', '_') + ext;
+        m = loader.getResourceAsStream(path);
+      }
       if (m != null) {
         AbstractResource found = element.load(m);
         found.setPath(path);

Reply via email to