Hi Michael Le 05/11/2013 06:56, Michael Fang a écrit :
That's right, the French grammatical rule is to put a space before and after a colon. But this hold for official French texts, novel litterature and journalistic papers and others where grammatical rules are controlled by French grammar specialist. But here, we are not in this kind of world. it is just an "adaptation" of an US/English message so that a non reader of english prose could understand the message. So no one would blame for not put having a space in front of a colon...Hi Francis,I am the one coordinating the translation of resource files. I have asked the translators about the extra space in the past for another file and they replied:Please note that this is not an error but a French standard. In French, we use a space before a colon.
Moreover, if you really want to "follow the rules", then rmid :strictly speaking is not a correct french phrase because the word "rmid" has no meaning in French... So please, relax the french localization and remove the space in front of the colon.
I am fine with whatever solution that will make the all tests of the jdk pass, would it be to remove the test or use the exclude list for non US locale. What I do not want at all is to check every time a test fails, verify if it fails for using the US locale instead of the default French one. In that case, I suggest you to reconsider the localisation of the test so it pass on a non US platform.Typically, we do not add jtreg tests to test the translation because the translation is not "code". Translation is tested with separate in-house test suites.
Francis
thanks, -michael On 13年10月31日 09:44 下午, Francis ANDRE wrote:Hi Stuart Please see my comments through the mail Le 31/10/2013 22:27, Stuart Marks a écrit :If the lines emitted by rmid are localized, then your test "s.indexOf("rmid: debugExec") != -1" should be also localized or did I miss something?Hi Francis,Alan Bateman directed me to this patch since it includes changes to the RMI tests, which I maintain. I have a few comments on the changes to these tests.From: Francis ANDRE <francis.andre.kampb...@orange.fr> Following are a list of patch for making the jdk jtreg test suite happy with aWXP/Cygwin/VS2010 Franch platform. For most of them, the fix consists in addingLocale.setDefault(Locale.US); as the first statement in main. diff --git a/test/java/rmi/activation/CommandEnvironment/SetChildEnv.java b/test/java/rmi/activation/CommandEnvironment/SetChildEnv.java --- a/test/java/rmi/activation/CommandEnvironment/SetChildEnv.java +++ b/test/java/rmi/activation/CommandEnvironment/SetChildEnv.java @@ -238,7 +238,7 @@ public synchronized void notifyLine(String s) { - if (s != null && s.indexOf("rmid: debugExec") != -1) + if (s != null && s.indexOf("rmid : debugExec") != -1) found = s; }This is somewhat odd. This section of the test is capturing the output of rmid and is scanning it for a particular string. Why would adding a space be necessary? It turns out that the debugExec lines emitted by rmid are localized:From my French perspective -- ie, my mother's language -- , I would not add a space between rmid and the colon...$ cd jdk/src/share/classes/sun/rmi/server/resources $ grep rmid.exec.command *_*.propertiesrmid_de.properties:rmid.exec.command=rmid: debugExec: "{0}" wird ausgef\u00FChrtrmid_es.properties:rmid.exec.command=rmid: debugExec: en ejecuci\u00F3n "{0}" rmid_fr.properties:rmid.exec.command=rmid : debugExec : ex\u00E9cution de "{0}"rmid_it.properties:rmid.exec.command=rmid: debugExec: esecuzione di "{0}" in corso rmid_ja.properties:rmid.exec.command=rmid: debugExec: "{0}"\u3092\u5B9F\u884C\u4E2Drmid_ko.properties:rmid.exec.command=rmid: debugExec: "{0}" \uC2E4\uD589 \uC911 rmid_pt_BR.properties:rmid.exec.command=rmid: debugExec: executando "{0}" rmid_sv.properties:rmid.exec.command=rmid: debugExec: k\u00F6r "{0}"rmid_zh_CN.properties:rmid.exec.command=rmid: debugExec: \u6B63\u5728\u8FD0\u884C "{0}"rmid_zh_TW.properties:rmid.exec.command=rmid: debugExec: \u57F7\u884C "{0}" $ grep -B 0 -A 1 rmid.exec.command rmid.properties rmid.exec.command=\ rmid: debugExec: running "{0}"All locales except the French have no space between "rmid" and the trailing colon (":"). It appears that having the space before the colon is proper French usage (at least, the other French localizations all appear similar). But adding the space to the search string will fix the French locale but will break all the other locales.I think that the best thing to do is removing the space " " before the colon ":" so that your code will work in any localisation. If it is not possible to remove this space, then you have to fix the test, taking care the localisation you mention in the rmid_fr.properties. Here the report of the testForcing the test to run in the US locale seems preferable to adding logic to deal with different localizations. Since these tests fork JVMs in subprocesses, it's probably necessary to do something special to make sure the sub-JVMs are in the US locale. This probably involves setting an environment variable or a system property. I'm sure others on this list can provide advice.RMID: starting rmid on port #3882... ACTIVATION_LIBRARY: Activation System available after 0 milliseconds RMID: finished starting rmid.rmid : debugExec : exécution de "Z:\JDK\jdk8\build\WINDOW~1\images\J2SDK-~1\jre\bin\java -Djava.security.manager=default -Djava.security.policy=Z:\JDK\jdk8\jdk\test\java\rmi\activation\CommandEnvironment\group.security.policy -Dtest.src=Z:\JDK\jdk8\jdk\test\java\rmi\activation\CommandEnvironment -Dtest.classes=Z:\JDK\jdk8\build\windows-x86-normal-server-release\testoutput\jdk_rmi\JTwork\classes\0\java\rmi\activation\CommandEnvironment -Djava.rmi.server.useCodebaseOnly=false sun.rmi.server.ActivationGroupInit"Tue Oct 29 08:15:08 CET 2013:ExecGroup-0:out:Doctor constructed and exported Tue Oct 29 08:15:08 CET 2013:ExecGroup-0:out:Doctor will see you now TEST FAILED: rmid subprocess produced no recognizable debugExec lineYour test is about the usage message in a localized language, so IMHO, it should take care of the localization message otherwise I do not understand this code: TestLibrary.bomb("rmid has incorrect usage message");diff --git a/test/java/rmi/activation/checkusage/CheckUsage.java b/test/java/rmi/activation/checkusage/CheckUsage.java --- a/test/java/rmi/activation/checkusage/CheckUsage.java +++ b/test/java/rmi/activation/checkusage/CheckUsage.java @@ -31,12 +31,20 @@ */ import java.io.ByteArrayOutputStream; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; /** * Make sure that rmid prints out a correct usage statement when run with an * incorrect command line. */ public class CheckUsage {+ private static final Map<String, String> maps = new HashMap<String, String>();+ static { + maps.put(Locale.ENGLISH.getDisplayLanguage(), "runtime flag"); + maps.put(Locale.FRENCH.getDisplayLanguage(), "indicateur d'exécution"); + } public static void main(String[] args) { try { ByteArrayOutputStream berr = new ByteArrayOutputStream(); @@ -54,8 +62,9 @@ String usage = new String(berr.toByteArray()); System.err.println("rmid usage: " + usage); - - if (usage.indexOf("-J<runtime flag>") < 0) { + + String jflag = "-J<" + maps.get(Locale.getDefault().getDisplayLanguage()) + ">"; + if (usage.indexOf(jflag) < 0) { TestLibrary.bomb("rmid has incorrect usage message"); } else { System.err.println("test passed");This change looks like the start of a map that includes localized usage messages from various locales. If we were to expand this to other locales, eventually we'd end up duplicating all the localized usage messages into the test code. That seems pretty fragile.As above, this is capturing the output of a subprocess, so it would seem better if the subprocess were forced into the US locale.(In fact, this is kind of a stupid test anyway; all it does is make sure that a usage message gets emitted if an erroneous command-line option is provided. I've been thinking of removing it. It's certainly not worth adding extra logic to handle multiple locales.)--Do we even support running the test suite in different locales?We test on several platforms as it is; I don't think we'll want to have separate test runs for all eleven (or however many) different localizations.If purpose of the test is to check the localization message, you would have no other choice to use properties like the previous rmid test.I can see adding code (or test configuration properties or environment variables) to ensure that tests are run in the US locale, unless this is specifically overridden by the test. It doesn't seem appropriate to add locale-specific logic or data structures to the tests, though.Franciss'marksdiff --git a/test/java/util/Formattable/StockName.java b/test/java/util/Formattable/StockName.java --- a/test/java/util/Formattable/StockName.java +++ b/test/java/util/Formattable/StockName.java @@ -33,83 +33,90 @@ import static java.util.FormattableFlags.*; public class StockName implements Formattable { - private String symbol, companyName, frenchCompanyName; + private String symbol, companyName, frenchCompanyName; - public StockName(String symbol, String companyName, - String frenchCompanyName) - { - this.symbol = symbol; - this.companyName = companyName; - this.frenchCompanyName = frenchCompanyName; - }+ public StockName(String symbol, String companyName, String frenchCompanyName) {+ this.symbol = symbol; + this.companyName = companyName; + this.frenchCompanyName = frenchCompanyName; + } - public void formatTo(Formatter fmt, int f, int width, int precision){ - StringBuilder sb = new StringBuilder(); + public void formatTo(Formatter fmt, int f, int width, int precision){ + StringBuilder sb = new StringBuilder(); - // decide form of name - String name = companyName; - if (fmt.locale().equals(Locale.FRANCE)) - name = frenchCompanyName; - boolean alternate = (f & ALTERNATE) == ALTERNATE; - boolean usesymbol = alternate || (precision != -1 && precision < 10); - String out = (usesymbol ? symbol : name); + // decide form of name + String name = companyName; + if (fmt.locale().equals(Locale.FRANCE)) + name = frenchCompanyName; + boolean alternate = (f & ALTERNATE) == ALTERNATE; + boolean usesymbol = alternate || (precision != -1 && precision < 10); + String out = (usesymbol ? symbol : name); - // apply precision - if (precision == -1 || out.length() < precision) { - // write it all - sb.append(out); - } else { - sb.append(out.substring(0, precision - 1)).append('*'); - } + // apply precision + if (precision == -1 || out.length() < precision) { + // write it all + sb.append(out); + } else { + sb.append(out.substring(0, precision - 1)).append('*'); + } - // apply width and justification - int len = sb.length(); - if (len < width) - for (int i = 0; i < width - len; i++) - if ((f & LEFT_JUSTIFY) == LEFT_JUSTIFY) - sb.append(' '); - else - sb.insert(0, ' '); + // apply width and justification + int len = sb.length(); + if (len < width) + for (int i = 0; i < width - len; i++) + if ((f & LEFT_JUSTIFY) == LEFT_JUSTIFY) + sb.append(' '); + else + sb.insert(0, ' '); - fmt.format(sb.toString()); - } + fmt.format(sb.toString()); + } - public String toString() { - return String.format("%s - %s", symbol, companyName); - } + public String toString() { + return String.format("%s - %s", symbol, companyName); + } - public static void main(String [] args) { - StockName sn = new StockName("HUGE", "Huge Fruit, Inc.", - "Fruit Titanesque, Inc."); - CharBuffer cb = CharBuffer.allocate(128); - Formatter fmt = new Formatter(cb); + public static void main(String[] args) { + StockName sn = new StockName("HUGE", "Huge Fruit, Inc.", + "Fruit Titanesque, Inc."); + CharBuffer cb = CharBuffer.allocate(128); + Formatter fmt = new Formatter(cb); - fmt.format("%s", sn); // -> "Huge Fruit, Inc." - test(cb, "Huge Fruit, Inc."); + if (fmt.locale().equals(Locale.FRANCE)) { + fmt.format("%s", sn); // -> "Fruit Titanesque, Inc." + test(cb, "Fruit Titanesque, Inc."); + } else { + fmt.format("%s", sn); // -> "Huge Fruit, Inc." + test(cb, "Huge Fruit, Inc."); + } + fmt.format("%s", sn.toString()); // -> "HUGE - Huge Fruit, Inc." + test(cb, "HUGE - Huge Fruit, Inc."); - fmt.format("%s", sn.toString()); // -> "HUGE - Huge Fruit, Inc." - test(cb, "HUGE - Huge Fruit, Inc."); + fmt.format("%#s", sn); // -> "HUGE" + test(cb, "HUGE"); - fmt.format("%#s", sn); // -> "HUGE" - test(cb, "HUGE"); + fmt.format("%-10.8s", sn); // -> "HUGE " + test(cb, "HUGE "); - fmt.format("%-10.8s", sn); // -> "HUGE " - test(cb, "HUGE "); + if (fmt.locale().equals(Locale.FRANCE)) { + fmt.format("%.12s", sn); // -> "Fruit Titan*" + test(cb, "Fruit Titan*"); + } else { + fmt.format("%.12s", sn); // -> "Huge Fruit,*" + test(cb, "Huge Fruit,*"); + } - fmt.format("%.12s", sn); // -> "Huge Fruit,*" - test(cb, "Huge Fruit,*"); + fmt.format(Locale.FRANCE, "%25s", sn); + // -> " Fruit Titanesque, Inc." + test(cb, " Fruit Titanesque, Inc."); + } - fmt.format(Locale.FRANCE, "%25s", sn); - // -> " Fruit Titanesque, Inc." - test(cb, " Fruit Titanesque, Inc."); - } - - private static void test(CharBuffer cb, String exp) { - cb.limit(cb.position()); - cb.rewind(); - if (!cb.toString().equals(exp)) - throw new RuntimeException("expect: '" + exp + "'; got: '" - + cb.toString() + "'"); - cb.clear(); - } + private static void test(CharBuffer cb, String exp) { + cb.limit(cb.position()); + cb.rewind(); + if (!cb.toString().equals(exp)) + throw new RuntimeException("expect: '" + exp + "'; got: '" + + cb.toString() + "'"); + cb.clear(); + } } diff --git a/test/java/util/ResourceBundle/ResourceBundleTest.java b/test/java/util/ResourceBundle/ResourceBundleTest.java --- a/test/java/util/ResourceBundle/ResourceBundleTest.java +++ b/test/java/util/ResourceBundle/ResourceBundleTest.java @@ -67,6 +67,7 @@ public class ResourceBundleTest extends RBTestFmwk { public static void main(String[] args) throws Exception { + Locale.setDefault(Locale.US); new ResourceBundleTest().run(args); } diff --git a/test/java/util/ResourceBundle/getBaseBundleName/TestGetBaseBundleName.java b/test/java/util/ResourceBundle/getBaseBundleName/TestGetBaseBundleName.java--- a/test/java/util/ResourceBundle/getBaseBundleName/TestGetBaseBundleName.java +++ b/test/java/util/ResourceBundle/getBaseBundleName/TestGetBaseBundleName.java@@ -45,6 +45,7 @@ } public static void main(String... args) throws Exception { + Locale.setDefault(Locale.US); Locale defaultLocale = Locale.getDefault(); System.out.println("Default locale is: " + defaultLocale); diff --git a/test/java/util/logging/LocalizedLevelName.java b/test/java/util/logging/LocalizedLevelName.java --- a/test/java/util/logging/LocalizedLevelName.java +++ b/test/java/util/logging/LocalizedLevelName.java @@ -49,6 +49,7 @@ }; public static void main(String args[]) throws Exception { + Locale.setDefault(Locale.US); Locale defaultLocale = Locale.getDefault(); for (int i=0; i<namesMap.length; i += 4) { final String key = (String) namesMap[i]; diff --git a/test/java/util/logging/SimpleFormatterFormat.java b/test/java/util/logging/SimpleFormatterFormat.java --- a/test/java/util/logging/SimpleFormatterFormat.java +++ b/test/java/util/logging/SimpleFormatterFormat.java @@ -30,6 +30,7 @@ */ import java.io.*; +import java.util.Locale; import java.util.logging.*; import java.util.regex.*; @@ -38,7 +39,8 @@ private static final String origFormat = System.getProperty(key); private static final PrintStream err = System.err; public static void main(String[] args) throws Exception { - try { + Locale.setDefault(Locale.US); + try { File dir = new File(System.getProperty("user.dir", ".")); File log = new File(dir, "simpleformat.txt"); java.nio.file.Files.deleteIfExists(log.toPath()); diff --git a/test/sun/util/logging/SourceClassName.java b/test/sun/util/logging/SourceClassName.java --- a/test/sun/util/logging/SourceClassName.java +++ b/test/sun/util/logging/SourceClassName.java @@ -31,12 +31,14 @@ * @run main/othervm SourceClassName */ +import java.util.Locale; import java.util.logging.*; import java.io.*; import sun.util.logging.PlatformLogger; public class SourceClassName { public static void main(String[] args) throws Exception { + Locale.setDefault(Locale.US); File dir = new File(System.getProperty("user.dir", ".")); File log = new File(dir, "testlog.txt"); PrintStream logps = new PrintStream(log);