You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by so...@apache.org on 2011/09/09 17:22:09 UTC

svn commit: r1167245 - in /myfaces/trinidad/trunk: trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/ trinidad-api/src/test/java/org/apache/myfaces/trinidad/util/ trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/

Author: sobryan
Date: Fri Sep  9 15:22:09 2011
New Revision: 1167245

URL: http://svn.apache.org/viewvc?rev=1167245&view=rev
Log:
TRINIDAD-2116 - ResourceBundles Strings containing doubled single quotes are not properly formatted by FastMessageFormat on display...

* Patch committed by Pavitra Subramaniam

Modified:
    myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/FastMessageFormat.java
    myfaces/trinidad/trunk/trinidad-api/src/test/java/org/apache/myfaces/trinidad/util/FastMessageFormatTest.java
    myfaces/trinidad/trunk/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Locale.js

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/FastMessageFormat.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/FastMessageFormat.java?rev=1167245&r1=1167244&r2=1167245&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/FastMessageFormat.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/FastMessageFormat.java Fri Sep  9 15:22:09 2011
@@ -86,7 +86,27 @@ public class FastMessageFormat
     for (int i = 0; i < formatLength; i++)
     {
       char ch = _formatText[i];
-      if (ch == '{')
+      
+      // Check for doubled-up quotes
+      if (ch == '\'' && (i+1 < formatLength) && (_formatText[i+1] == '\''))
+      {
+        /*
+        The tranlations tool uses special processing for single quotation marks that appear in 
+        resource strings. In ResourceBundle files, if a message contains an argument placeholder, 
+        e.g. {0} or {1}, it is assumed to be a format pattern for MessageFormat and the translation 
+        tool automatically doubles all single quotes inside such a message. If the message contains 
+        no arguments, it is expected to be used directly after loading from the bundle, without 
+        processing with MessageFormat. Therefore, no quotes are doubled automatically in such a 
+        message. This code change accounts for the presence of doubled quotes.
+        */
+        
+        buffer.append(_formatText, lastStart, i - lastStart);
+        
+        // skip one of the double quotes. 
+        i++;
+        lastStart = i;
+      }
+      else if (ch == '{')
       {
         // Only check for single digit patterns that have an associated token.
         if (i + 2 < formatLength && _formatText[i + 2] == '}')

Modified: myfaces/trinidad/trunk/trinidad-api/src/test/java/org/apache/myfaces/trinidad/util/FastMessageFormatTest.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/test/java/org/apache/myfaces/trinidad/util/FastMessageFormatTest.java?rev=1167245&r1=1167244&r2=1167245&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/test/java/org/apache/myfaces/trinidad/util/FastMessageFormatTest.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/test/java/org/apache/myfaces/trinidad/util/FastMessageFormatTest.java Fri Sep  9 15:22:09 2011
@@ -54,6 +54,16 @@ public class FastMessageFormatTest
     String[] params = { "beef", "kosher", null };
     String result = fmf.format(params);
     assertEquals(result, "beef {{3} isn't {} {a} {12a}kosher {");
+    
+    // tests doubled single quotes.
+    // Same as above, except doubled single quotes are replaced 
+    // with a single single quote.
+    // Expected result: "beef {{3} isn't {} {a} {12a}kosher {"
+    FastMessageFormat fmf2 =
+      new FastMessageFormat("{0} {{3} isn''t {} {a} {12a}{2}{1} {");
+    String[] params2 = { "beef", "kosher", null };
+    result = fmf2.format(params2);
+    assertEquals(result, "beef {{3} isn't {} {a} {12a}kosher {");    
   }
 }
 

Modified: myfaces/trinidad/trunk/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Locale.js
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Locale.js?rev=1167245&r1=1167244&r2=1167245&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Locale.js (original)
+++ myfaces/trinidad/trunk/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/Locale.js Fri Sep  9 15:22:09 2011
@@ -961,6 +961,7 @@ TrFastMessageFormatUtils.format = functi
   // arguments[1], ..., arguments[arguments.length-1]
   var formatLength = formatString.length;
   var tokenCount = arguments.length - 1;
+  var substr = null;
   
   // Use the javascript StringBuffer technique.
   var buffer = [];
@@ -970,7 +971,18 @@ TrFastMessageFormatUtils.format = functi
   {
     // IE7 does not support the string[index] syntax, so use string.charAt(index) instead.
     var ch = formatString.charAt(i);
-    if (ch == '{')
+    
+    // Check for a double quoted (escape) character
+    if (ch == '\'' && (i + 1 < formatLength) && (formatString.charAt(i+1) == '\''))
+     {
+      substr = formatString.substring(lastStart, i - lastStart);
+      buffer.push(substr);
+      
+      // skip one of the double quotes. 
+      i++;
+      lastStart = i;
+    }
+    else if (ch == '{')
     {
       // Only check for single digit patterns that have an associated token.
       if (i + 2 < formatLength && formatString.charAt(i+2) == '}')
@@ -979,7 +991,7 @@ TrFastMessageFormatUtils.format = functi
         if (tokenIndex >= 0 && tokenIndex < tokenCount)
         {            
           // Use the javascript StringBuffer technique for append(string)
-          var substr = formatString.substring(lastStart, i);
+          substr = formatString.substring(lastStart, i);
           buffer.push(substr);
           
           var token = arguments[tokenIndex+1];