Internationalization Demo - single sourcing.
authorBruno Sinou <bsinou@argeo.org>
Thu, 29 Sep 2011 15:01:46 +0000 (15:01 +0000)
committerBruno Sinou <bsinou@argeo.org>
Thu, 29 Sep 2011 15:01:46 +0000 (15:01 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@4762 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

35 files changed:
demo/argeo_demo_rcp.properties [new file with mode: 0644]
demo/argeo_demo_web.properties [new file with mode: 0644]
demo/demo/argeo_demo_web.properties [deleted file]
demo/demo/log4j.properties [deleted file]
demo/log4j-demo.properties [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n.rap/.classpath [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n.rap/.project [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n.rap/META-INF/MANIFEST.MF [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n.rap/build.properties [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n.rap/pom.xml [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n.rap/src/main/java/org/argeo/demo/i18n/specific/NLSHelperImpl.java [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n.rcp/.classpath [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n.rcp/.project [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n.rcp/META-INF/MANIFEST.MF [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n.rcp/build.properties [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n.rcp/pom.xml [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n.rcp/src/main/java/org/argeo/demo/i18n/specific/NLSHelperImpl.java [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n/.settings/org.eclipse.core.resources.prefs [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n/META-INF/MANIFEST.MF
demo/plugins/org.argeo.demo.i18n/build.properties
demo/plugins/org.argeo.demo.i18n/plugin.properties [deleted file]
demo/plugins/org.argeo.demo.i18n/plugin.xml
demo/plugins/org.argeo.demo.i18n/pom.xml
demo/plugins/org.argeo.demo.i18n/properties/plugin.properties [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n/properties/plugin_fr.properties [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/I18nDemoMessages.java [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/I18nDemoPlugin.java
demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/ImplementationLoader.java [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/NLSHelper.java [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/editors/MultiSectionPage.java
demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/editors/SimpleMultitabEditor.java
demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/preferences/LocaleSettingsPage.java [new file with mode: 0644]
demo/plugins/org.argeo.demo.i18n/src/main/resources/org/argeo/demo/i18n/messages.properties
demo/plugins/org.argeo.demo.i18n/src/main/resources/org/argeo/demo/i18n/messages_fr.properties [new file with mode: 0644]
demo/plugins/pom.xml

diff --git a/demo/argeo_demo_rcp.properties b/demo/argeo_demo_rcp.properties
new file mode 100644 (file)
index 0000000..583449a
--- /dev/null
@@ -0,0 +1,15 @@
+argeo.osgi.start=\
+org.springframework.osgi.extender,\
+org.argeo.node.repofactory.jackrabbit,\
+org.argeo.node.repo.jackrabbit,\
+org.argeo.security.dao.jackrabbit,\
+org.argeo.security.services,\
+org.argeo.security.equinox,\
+org.argeo.demo.i18n,\
+
+#org.argeo.security.ui.initialPerspective=org.argeo.osgi.ui.explorer.perspective
+org.argeo.security.ui.initialPerspective=org.argeo.demo.i18n.perspective
+
+log4j.configuration=file:../../log4j-demo.properties
+
+eclipse.application=org.argeo.security.ui.rcp.secureUi
diff --git a/demo/argeo_demo_web.properties b/demo/argeo_demo_web.properties
new file mode 100644 (file)
index 0000000..877eaf2
--- /dev/null
@@ -0,0 +1,29 @@
+argeo.osgi.start=\
+org.springframework.osgi.extender,\
+org.argeo.node.repofactory.jackrabbit,\
+org.argeo.node.repo.jackrabbit,\
+org.argeo.security.dao.ldap,\
+org.argeo.security.services,\
+org.argeo.security.equinox,\
+org.eclipse.core.runtime,\
+org.eclipse.equinox.common,\
+org.eclipse.equinox.http.registry,\
+org.eclipse.equinox.launcher,\
+org.argeo.dep.osgi.catalina.start,\
+org.argeo.jackrabbit.webapp,\
+org.argeo.server.rap.webapp,\
+org.argeo.server.ads.server,\
+org.argeo.demo.i18n,\
+org.springframework.osgi.web.extender,\
+
+
+#Choose initial perspective
+org.argeo.security.ui.initialPerspective=org.argeo.demo.i18n.perspective
+
+log4j.configuration=file:../../log4j-demo.properties
+
+## important to enable internationalization of plugin.xml labels. 
+eclipse.registry.MultiLanguage=true
+
+# Note default URL to access the webapp
+# http://localhost:7070/org.argeo.rap.webapp/node
\ No newline at end of file
diff --git a/demo/demo/argeo_demo_web.properties b/demo/demo/argeo_demo_web.properties
deleted file mode 100644 (file)
index 0623520..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-argeo.osgi.start=\
-org.springframework.osgi.extender,\
-org.argeo.node.repofactory.jackrabbit,\
-org.argeo.node.repo.jackrabbit,\
-org.argeo.security.dao.ldap,\
-org.argeo.security.services,\
-org.argeo.security.equinox,\
-org.eclipse.core.runtime,\
-org.eclipse.equinox.common,\
-org.eclipse.equinox.http.registry,\
-org.eclipse.equinox.launcher,\
-org.argeo.dep.osgi.catalina.start,\
-org.argeo.jackrabbit.webapp,\
-org.argeo.server.rap.webapp,\
-org.argeo.server.ads.server,\
-org.argeo.demo.i18n,\
-org.springframework.osgi.web.extender,\
-
-
-#Choose initial perspective
-org.argeo.security.ui.initialPerspective=org.argeo.demo.i18n.perspective
-
-log4j.configuration=file:../../log4j.properties
-
-# Note default URL to access the webapp
-# http://localhost:7070/org.argeo.rap.webapp/node
\ No newline at end of file
diff --git a/demo/demo/log4j.properties b/demo/demo/log4j.properties
deleted file mode 100644 (file)
index 9acc103..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-log4j.rootLogger=WARN, development
-
-## Levels
-log4j.logger.org.argeo=DEBUG
-
-log4j.logger.org.apache.catalina=INFO
-log4j.logger.org.apache.coyote=INFO
-log4j.logger.org.apache.directory.server=ERROR
-log4j.logger.org.apache.jackrabbit.core.query.lucene=ERROR
-
-## Appenders
-# console is set to be a ConsoleAppender.
-log4j.appender.console=org.apache.log4j.ConsoleAppender
-
-# console uses PatternLayout.
-log4j.appender.console.layout=org.apache.log4j.PatternLayout
-log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c - [%t]%n
-
-# development appender (slow!)
-log4j.appender.development=org.apache.log4j.ConsoleAppender
-log4j.appender.development.layout=org.apache.log4j.PatternLayout
-log4j.appender.development.layout.ConversionPattern=%d{HH:mm:ss} [%16.16t] %5p %m (%F:%L) %c%n
\ No newline at end of file
diff --git a/demo/log4j-demo.properties b/demo/log4j-demo.properties
new file mode 100644 (file)
index 0000000..9acc103
--- /dev/null
@@ -0,0 +1,22 @@
+log4j.rootLogger=WARN, development
+
+## Levels
+log4j.logger.org.argeo=DEBUG
+
+log4j.logger.org.apache.catalina=INFO
+log4j.logger.org.apache.coyote=INFO
+log4j.logger.org.apache.directory.server=ERROR
+log4j.logger.org.apache.jackrabbit.core.query.lucene=ERROR
+
+## Appenders
+# console is set to be a ConsoleAppender.
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+
+# console uses PatternLayout.
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c - [%t]%n
+
+# development appender (slow!)
+log4j.appender.development=org.apache.log4j.ConsoleAppender
+log4j.appender.development.layout=org.apache.log4j.PatternLayout
+log4j.appender.development.layout.ConversionPattern=%d{HH:mm:ss} [%16.16t] %5p %m (%F:%L) %c%n
\ No newline at end of file
diff --git a/demo/plugins/org.argeo.demo.i18n.rap/.classpath b/demo/plugins/org.argeo.demo.i18n.rap/.classpath
new file mode 100644 (file)
index 0000000..d255d98
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con"
+               path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5" />
+       <classpathentry kind="con"
+               path="org.eclipse.pde.core.requiredPlugins" />
+       <classpathentry kind="src" path="src/main/java" />
+       <classpathentry kind="output" path="target/classes" />
+</classpath>
diff --git a/demo/plugins/org.argeo.demo.i18n.rap/.project b/demo/plugins/org.argeo.demo.i18n.rap/.project
new file mode 100644 (file)
index 0000000..d89b85e
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.demo.i18n.rap</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
\ No newline at end of file
diff --git a/demo/plugins/org.argeo.demo.i18n.rap/META-INF/MANIFEST.MF b/demo/plugins/org.argeo.demo.i18n.rap/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..472e9a0
--- /dev/null
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Fragment-Host: org.argeo.demo.i18n
+Bundle-Version: 0.3.4.SNAPSHOT
+Bundle-SymbolicName: org.argeo.demo.i18n.rap
+Bundle-Vendor: Argeo
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.rap.ui;resolution:=optional,
+ org.eclipse.rap.ui.workbench;resolution:=optional
+Import-Package: org.apache.commons.io,
+ org.apache.commons.logging,
+ org.argeo,
+ org.argeo.eclipse.spring,
+ org.argeo.eclipse.ui,
+ org.argeo.demo.i18n
+Export-Package: org.argeo.demo.i18n.specific;uses:="org.eclipse.rwt"
+
diff --git a/demo/plugins/org.argeo.demo.i18n.rap/build.properties b/demo/plugins/org.argeo.demo.i18n.rap/build.properties
new file mode 100644 (file)
index 0000000..bbafbf8
--- /dev/null
@@ -0,0 +1,4 @@
+source.. =     src/main/java/,\
+output.. = target/classes/
+bin.includes =         META-INF/,\
+                       .
diff --git a/demo/plugins/org.argeo.demo.i18n.rap/pom.xml b/demo/plugins/org.argeo.demo.i18n.rap/pom.xml
new file mode 100644 (file)
index 0000000..a9d2f2f
--- /dev/null
@@ -0,0 +1,29 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.commons.demo</groupId>
+               <version>0.3.4-SNAPSHOT</version>
+               <artifactId>plugins</artifactId>
+               <relativePath>..</relativePath>
+       </parent>
+       <artifactId>org.argeo.demo.i18n.rap</artifactId>
+       <name>Commons Internationalization Demo RAP</name>
+       <dependencies>
+               <dependency>
+                       <groupId>org.argeo.commons.demo</groupId>
+                       <artifactId>org.argeo.demo.i18n</artifactId>
+                       <version>0.3.4-SNAPSHOT</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.commons.eclipse</groupId>
+                       <artifactId>org.argeo.eclipse.ui.rap</artifactId>
+                       <version>${version.argeo-commons}</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.commons.eclipse</groupId>
+                       <artifactId>org.argeo.eclipse.dep.rap</artifactId>
+                       <version>${version.argeo-commons}</version>
+               </dependency>
+       </dependencies>
+</project>
diff --git a/demo/plugins/org.argeo.demo.i18n.rap/src/main/java/org/argeo/demo/i18n/specific/NLSHelperImpl.java b/demo/plugins/org.argeo.demo.i18n.rap/src/main/java/org/argeo/demo/i18n/specific/NLSHelperImpl.java
new file mode 100644 (file)
index 0000000..ad73b90
--- /dev/null
@@ -0,0 +1,17 @@
+package org.argeo.demo.i18n.specific;
+
+import org.argeo.demo.i18n.NLSHelper;
+import org.eclipse.rwt.RWT;
+
+/**
+ * Implements access to internationalized property using the RAP specific
+ * implementation of NLS. Thanks to {@link http
+ * ://eclipsesource.com/en/info/rcp-rap-single-sourcing-guideline/}
+ */
+public class NLSHelperImpl extends NLSHelper {
+
+       protected Object internalGetMessages(String bundleName,
+                       @SuppressWarnings("rawtypes") Class clazz) {
+               return RWT.NLS.getUTF8Encoded(bundleName, clazz);
+       }
+}
diff --git a/demo/plugins/org.argeo.demo.i18n.rcp/.classpath b/demo/plugins/org.argeo.demo.i18n.rcp/.classpath
new file mode 100644 (file)
index 0000000..d255d98
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con"
+               path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5" />
+       <classpathentry kind="con"
+               path="org.eclipse.pde.core.requiredPlugins" />
+       <classpathentry kind="src" path="src/main/java" />
+       <classpathentry kind="output" path="target/classes" />
+</classpath>
diff --git a/demo/plugins/org.argeo.demo.i18n.rcp/.project b/demo/plugins/org.argeo.demo.i18n.rcp/.project
new file mode 100644 (file)
index 0000000..a9fb824
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.demo.i18n.rcp</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
\ No newline at end of file
diff --git a/demo/plugins/org.argeo.demo.i18n.rcp/META-INF/MANIFEST.MF b/demo/plugins/org.argeo.demo.i18n.rcp/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..21a4c6c
--- /dev/null
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Fragment-Host: org.argeo.demo.i18n
+Bundle-SymbolicName: org.argeo.demo.i18n.rcp
+Bundle-Version: 0.3.4.SNAPSHOT
+Bundle-Vendor: Argeo
+Require-Bundle: org.eclipse.ui;resolution:=optional,
+ org.eclipse.core.runtime;resolution:=optional
+Export-Package: org.argeo.demo.i18n.specific
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Import-Package: org.apache.commons.io,
+ org.apache.commons.logging,
+ org.argeo,
+ org.argeo.demo.i18n,
+ org.argeo.eclipse.spring,
+ org.argeo.eclipse.ui
diff --git a/demo/plugins/org.argeo.demo.i18n.rcp/build.properties b/demo/plugins/org.argeo.demo.i18n.rcp/build.properties
new file mode 100644 (file)
index 0000000..8033714
--- /dev/null
@@ -0,0 +1,4 @@
+source.. =     src/main/java/,\
+output.. = target/classes/
+bin.includes =         META-INF/,\
+                               .
\ No newline at end of file
diff --git a/demo/plugins/org.argeo.demo.i18n.rcp/pom.xml b/demo/plugins/org.argeo.demo.i18n.rcp/pom.xml
new file mode 100644 (file)
index 0000000..965c596
--- /dev/null
@@ -0,0 +1,29 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.commons.demo</groupId>
+               <version>0.3.4-SNAPSHOT</version>
+               <artifactId>plugins</artifactId>
+               <relativePath>..</relativePath>
+       </parent>
+       <artifactId>org.argeo.demo.i18n.rcp</artifactId>
+       <name>Commons Internationalization Demo RCP</name>
+       <dependencies>
+               <dependency>
+                       <groupId>org.argeo.commons.demo</groupId>
+                       <artifactId>org.argeo.demo.i18n</artifactId>
+                       <version>0.3.4-SNAPSHOT</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.commons.eclipse</groupId>
+                       <artifactId>org.argeo.eclipse.ui.rcp</artifactId>
+                       <version>${version.argeo-commons}</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.commons.eclipse</groupId>
+                       <artifactId>org.argeo.eclipse.dep.rcp</artifactId>
+                       <version>${version.argeo-commons}</version>
+               </dependency>
+       </dependencies>
+</project>
\ No newline at end of file
diff --git a/demo/plugins/org.argeo.demo.i18n.rcp/src/main/java/org/argeo/demo/i18n/specific/NLSHelperImpl.java b/demo/plugins/org.argeo.demo.i18n.rcp/src/main/java/org/argeo/demo/i18n/specific/NLSHelperImpl.java
new file mode 100644 (file)
index 0000000..81c5415
--- /dev/null
@@ -0,0 +1,65 @@
+package org.argeo.demo.i18n.specific;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.argeo.demo.i18n.NLSHelper;
+
+public class NLSHelperImpl extends NLSHelper {
+
+       protected Object internalGetMessages(String bundleName, Class clazz) {
+
+               ClassLoader loader = clazz.getClassLoader();
+               // test
+               Locale currentLocale = new Locale("fr");
+               ResourceBundle bundle = ResourceBundle.getBundle(bundleName,
+                               currentLocale, loader);
+               // test end
+               // ResourceBundle bundle = ResourceBundle.getBundle(bundleName,
+               // Locale.getDefault(), loader);
+               return internalGet(bundle, clazz);
+       }
+
+       private Object internalGet(ResourceBundle bundle, Class clazz) {
+
+               Object result;
+               try {
+                       Constructor constructor = clazz.getDeclaredConstructor(null);
+                       constructor.setAccessible(true);
+                       result = constructor.newInstance(null);
+               } catch (final Exception ex) {
+                       throw new IllegalStateException(ex.getMessage());
+               }
+               final Field[] fieldArray = clazz.getDeclaredFields();
+               for (int i = 0; i < fieldArray.length; i++) {
+                       try {
+                               int modifiers = fieldArray[i].getModifiers();
+                               if (String.class.isAssignableFrom(fieldArray[i].getType())
+                                               && Modifier.isPublic(modifiers)
+                                               && !Modifier.isStatic(modifiers)) {
+                                       try {
+                                               String value = bundle
+                                                               .getString(fieldArray[i].getName());
+                                               byte[] bytes = value.getBytes();
+                                               String forcedValue = new String(bytes, "UTF8");
+                                               if (value != null) {
+                                                       fieldArray[i].setAccessible(true);
+                                                       fieldArray[i].set(result, forcedValue);
+                                               }
+                                       } catch (final MissingResourceException mre) {
+                                               fieldArray[i].setAccessible(true);
+                                               fieldArray[i].set(result, "");
+                                               mre.printStackTrace();
+                                       }
+                               }
+                       } catch (final Exception ex) {
+                               ex.printStackTrace();
+                       }
+               }
+               return result;
+       }
+}
diff --git a/demo/plugins/org.argeo.demo.i18n/.settings/org.eclipse.core.resources.prefs b/demo/plugins/org.argeo.demo.i18n/.settings/org.eclipse.core.resources.prefs
new file mode 100644 (file)
index 0000000..c1ac5c5
--- /dev/null
@@ -0,0 +1,4 @@
+#Wed Sep 28 17:41:20 CEST 2011
+eclipse.preferences.version=1
+encoding//src/main/resources/org/argeo/demo/i18n/messages.properties=UTF-8
+encoding//src/main/resources/org/argeo/demo/i18n/messages_fr.properties=UTF-8
index d5822a82d96d3d2f68ecc4192653146a87a38575..6ba788ac8e1dc784622310ce1a3c4104f70cd7fe 100644 (file)
@@ -4,19 +4,21 @@ Bundle-Name: Internationalization Demo
 Bundle-SymbolicName: org.argeo.demo.i18n;singleton:=true
 Bundle-Version: 0.3.4.SNAPSHOT
 Bundle-Activator: org.argeo.demo.i18n.I18nDemoPlugin
-Bundle-Localization: org.argeo.demo.i18n.messages
+Bundle-Localization: properties/plugin
 Bundle-Vendor: Argeo
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ActivationPolicy: lazy
+Export-Package: org.argeo.demo.i18n
 Require-Bundle: org.eclipse.ui;resolution:=optional,
  org.eclipse.core.runtime;resolution:=optional,
  org.eclipse.rap.ui;resolution:=optional,
  org.eclipse.rap.ui.workbench;resolution:=optional
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-ActivationPolicy: lazy
 Import-Package: org.apache.commons.io,
  org.apache.commons.logging,
  org.argeo,
  org.argeo.eclipse.spring,
  org.argeo.eclipse.ui,
+ org.argeo.eclipse.ui.utils,
  org.eclipse.ui.forms,
  org.eclipse.ui.forms.editor,
  org.eclipse.ui.forms.widgets
index 1f316c6fa1769e68276d245bdf9d93be02bd54da..ac1c679740deed801f4f880b341c9000b21ea024 100644 (file)
@@ -1,6 +1,7 @@
 source.. =     src/main/java/,\
                        src/main/resources
 output.. = target/classes/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml
+bin.includes =         META-INF/,\
+                               properties/,\
+                       .,\
+                       plugin.xml
diff --git a/demo/plugins/org.argeo.demo.i18n/plugin.properties b/demo/plugins/org.argeo.demo.i18n/plugin.properties
deleted file mode 100644 (file)
index 40adfae..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-
-## commands label
-
-## View labels 
-
-## Editor labels
\ No newline at end of file
index 4ba2c49a6bfd3228925f5b3d06a27fe839d3a520..b7a16db6055e447750f5582f8f67c7ff8cb7f907 100644 (file)
@@ -8,7 +8,7 @@
             class="org.argeo.demo.i18n.I18nDemoPerspective"
             icon="icons/i18n.gif"
             id="org.argeo.demo.i18n.perspective"
-            name="Internationalization simple demo">
+            name="%I18nDemoPerspective_name">
       </perspective>
    </extension>
    <!-- Views --> 
@@ -18,7 +18,7 @@
           class="org.argeo.eclipse.spring.SpringExtensionFactory"
           icon="icons/browser.gif"
           id="org.argeo.demo.i18n.simpleTreeView"
-          name="Internationalized tree view">
+          name="%SimpleTreeView_name">
           </view>
    </extension>
    <!-- Editors --> 
@@ -27,7 +27,7 @@
             <editor
                  class="org.argeo.eclipse.spring.SpringExtensionFactory"
               id="org.argeo.demo.i18n.simpleMultitabEditor"
-              name="Simple multitab editor"
+              name="%SimpleMultitabEditor_name"
               icon="icons/i18n.gif"
               default="false">
         </editor>
          </with>
       </definition>
    </extension>
-
+       <!-- Preferences --> 
+       <extension
+       point="org.eclipse.ui.preferencePages">
+               <page 
+                       class="org.argeo.demo.i18n.preferences.LocaleSettingsPage"
+                       id="org.argeo.demo.i18n.localeSettingsPage"
+                       name="%LocaleSettingsPage_Title">
+               </page>
+       </extension>
        <!-- Activities -->     
        <extension
        point="org.eclipse.ui.activities">
@@ -82,7 +90,7 @@
                                </with>
                        </enabledWhen>
                </activity>
-        <!-- TODO: find a way to exclude evrything -->
+        <!-- TODO: find a way to exclude everything -->
         <activityPatternBinding
               activityId="org.argeo.jcr.ui.explorer.adminActivity"
               isEqualityPattern="true"
index 53f3fa5242c5a4890b05b6b5ca74e60f5e41932c..257ebf85612cde1e4ae3ada37e6835f6ba520ee9 100644 (file)
                        <artifactId>org.argeo.eclipse.ui</artifactId>
                        <version>0.3.4-SNAPSHOT</version>
                </dependency>
-               
-               <!-- RCP only dependency, needed at compile time -->
+
+               <!-- Eclipse - Only used at compile time. so that it is compatible with 
+                       RCP runtime -->
                <dependency>
                        <groupId>org.argeo.commons.eclipse</groupId>
-                       <artifactId>org.argeo.eclipse.dep.rcp</artifactId>
-                       <version>0.3.4-SNAPSHOT</version>
+                       <artifactId>org.argeo.eclipse.ui.rap</artifactId>
+                       <version>${version.argeo-commons}</version>
                        <scope>provided</scope>
                </dependency>
                <dependency>
                        <groupId>org.argeo.commons.eclipse</groupId>
-                       <artifactId>org.argeo.eclipse.ui.rcp</artifactId>
-                       <version>0.3.4-SNAPSHOT</version>
+                       <artifactId>org.argeo.eclipse.dep.rap</artifactId>
+                       <version>${version.argeo-commons}</version>
                        <scope>provided</scope>
                </dependency>
+
+               <!-- RCP only dependency, needed at compile time -->
+               <!-- <dependency> <groupId>org.argeo.commons.eclipse</groupId> <artifactId>org.argeo.eclipse.dep.rcp</artifactId> 
+                       <version>0.3.4-SNAPSHOT</version> <scope>provided</scope> </dependency> <dependency> 
+                       <groupId>org.argeo.commons.eclipse</groupId> <artifactId>org.argeo.eclipse.ui.rcp</artifactId> 
+                       <version>0.3.4-SNAPSHOT</version> <scope>provided</scope> </dependency> -->
        </dependencies>
 </project>
diff --git a/demo/plugins/org.argeo.demo.i18n/properties/plugin.properties b/demo/plugins/org.argeo.demo.i18n/properties/plugin.properties
new file mode 100644 (file)
index 0000000..d53d3ce
--- /dev/null
@@ -0,0 +1,8 @@
+
+## commands label
+
+## View, perspective and editor labels 
+I18nDemoPerspective_name=Demo Internationalization
+SimpleTreeView_name=Simple tree view
+SimpleMultitabEditor_name=Simple multi-tab editor
+LocaleSettingsPage_Title=Manage localization settings
\ No newline at end of file
diff --git a/demo/plugins/org.argeo.demo.i18n/properties/plugin_fr.properties b/demo/plugins/org.argeo.demo.i18n/properties/plugin_fr.properties
new file mode 100644 (file)
index 0000000..3ca9a12
--- /dev/null
@@ -0,0 +1,8 @@
+
+## commands label
+
+## View, perspective and editor labels 
+I18nDemoPerspective_name=Demo - Internationalisation
+SimpleTreeView_name=Simple vue en arbre
+SimpleMultitabEditor_name=Simple editeur à onglets multiples.
+LocaleSettingsPage_Title=Gérer les informations de localisation
\ No newline at end of file
diff --git a/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/I18nDemoMessages.java b/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/I18nDemoMessages.java
new file mode 100644 (file)
index 0000000..00001d5
--- /dev/null
@@ -0,0 +1,36 @@
+package org.argeo.demo.i18n;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Centralizes all internationalized labels accross current application.
+ * Supports both RAP and RCP thanks to the NLSHelper. NOTE that the
+ * corresponding NLSHelperImpl must be available.
+ * 
+ * thanks to {@link http
+ * ://eclipsesource.com/en/info/rcp-rap-single-sourcing-guideline/}
+ */
+public class I18nDemoMessages extends NLS {
+
+       private static final String BUNDLENAME = I18nDemoPlugin.ID + ".messages"; // $NON-NLS−1$
+
+       public String SimpleMultitabEditor_MultiSectionPageTitle;
+       public String SimpleMultitabEditor_SimplePageTitle;
+       public String MultiSelectionPage_DescriptionSectionTitle;
+       public String MultiSelectionPage_DetailsSectionTitle;
+       public String testLbl;
+
+       // Code that enable handling of concurrent multi sessions locales
+       static {
+               // initialize resource bundle
+               NLS.initializeMessages(BUNDLENAME, I18nDemoMessages.class);
+       }
+
+       private I18nDemoMessages() {
+       }
+
+       public static I18nDemoMessages get() {
+               return (I18nDemoMessages) NLSHelper.getMessages(BUNDLENAME,
+                               I18nDemoMessages.class);
+       }
+}
index a1e53a7cd1bdf7a938385d8ac53c56f85076e0e5..a1a338376448566b41f0719d62d0d2c33c33f713 100644 (file)
@@ -25,6 +25,8 @@ public class I18nDemoPlugin extends AbstractUIPlugin {
         * The constructor
         */
        public I18nDemoPlugin() {
+               // Locale currentLocale = new Locale("fr");
+               // Locale.setDefault(currentLocale);
        }
 
        /*
@@ -37,7 +39,8 @@ public class I18nDemoPlugin extends AbstractUIPlugin {
        public void start(BundleContext context) throws Exception {
                super.start(context);
                plugin = this;
-               messages = ResourceBundle.getBundle("org.argeo.demo.i18n.messages");
+               messages = ResourceBundle.getBundle(ID + ".messages");
+               // messages = ResourceBundle.getBundle(ID + ".messages", currentLocale);
        }
 
        /*
diff --git a/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/ImplementationLoader.java b/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/ImplementationLoader.java
new file mode 100644 (file)
index 0000000..041740b
--- /dev/null
@@ -0,0 +1,44 @@
+package org.argeo.demo.i18n;
+
+import java.text.MessageFormat;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * This class enable single sourcing between RAP and RCP. For this to run
+ * correctly, following conventions must be respected:
+ * <ul>
+ * <li>Given the fact that a common interface named Xxx is defined in package
+ * aa.bb.cc, corresponding implementation named XxxImpl must be found in package
+ * aa.bb.cc.specific of both RAP and RCP UI bundles.
+ * 
+ * thanks to {@link http
+ * ://eclipsesource.com/en/info/rcp-rap-single-sourcing-guideline/}, chapter 7
+ */
+
+public class ImplementationLoader {
+       private final static Log log = LogFactory
+                       .getLog(ImplementationLoader.class);
+
+       public static Object newInstance(
+                       @SuppressWarnings("rawtypes") final Class type) {
+               String name = type.getName();
+               // manually construct the implementation name for the given interface,
+               // assuming that convention have been respected.
+               String cName = type.getCanonicalName();
+               String pName = cName.substring(0, cName.lastIndexOf('.') + 1);
+               String sName = cName.substring(cName.lastIndexOf('.') + 1);
+               String implName = pName + "specific." + sName + "Impl";
+               // String implName = cName + "Impl";
+               Object result = null;
+               try {
+                       result = type.getClassLoader().loadClass(implName).newInstance();
+               } catch (Throwable throwable) {
+                       String txt = "Could not load implementation for {0}";
+                       String msg = MessageFormat.format(txt, new Object[] { name });
+                       throw new RuntimeException(msg, throwable);
+               }
+               return result;
+       }
+}
\ No newline at end of file
diff --git a/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/NLSHelper.java b/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/NLSHelper.java
new file mode 100644 (file)
index 0000000..5d20fb3
--- /dev/null
@@ -0,0 +1,23 @@
+package org.argeo.demo.i18n;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * thanks to {@link http
+ * ://eclipsesource.com/en/info/rcp-rap-single-sourcing-guideline/}
+ */
+public abstract class NLSHelper {
+       private final static NLSHelper IMPL;
+
+       static {
+               IMPL = (NLSHelper) ImplementationLoader.newInstance(NLSHelper.class);
+       }
+
+       public static NLS getMessages(String bundleName,
+                       @SuppressWarnings("rawtypes") Class clazz) {
+               return (NLS) IMPL.internalGetMessages(bundleName, clazz);
+       }
+
+       protected abstract Object internalGetMessages(String bundleName,
+                       @SuppressWarnings("rawtypes") Class clazz);
+}
index f641f87bbd6f77c0c45aa424690a31cebb54085b..1804b1d4ee2c8e9c30e1dd7559749c739fdc1e2a 100644 (file)
@@ -2,7 +2,7 @@ package org.argeo.demo.i18n.editors;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.argeo.demo.i18n.I18nDemoPlugin;
+import org.argeo.demo.i18n.I18nDemoMessages;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -24,8 +24,7 @@ import org.eclipse.ui.forms.widgets.TableWrapLayout;
  * enable browsing
  * */
 public class MultiSectionPage extends FormPage {
-        private final static Log log = LogFactory
-        .getLog(MultiSectionPage.class);
+       private final static Log log = LogFactory.getLog(MultiSectionPage.class);
 
        // this page UI components
        private FormToolkit tk;
@@ -42,16 +41,15 @@ public class MultiSectionPage extends FormPage {
                Composite body = form.getBody();
                body.setLayout(twt);
 
-
-                               createHistorySection(form.getBody());
-                               createTreeSection(form.getBody());
+               createHistorySection(form.getBody());
+               createTreeSection(form.getBody());
        }
 
        protected void createTreeSection(Composite parent) {
                // Section Layout & MetaData
                Section section = tk.createSection(parent, Section.TWISTIE);
                section.setLayoutData(new GridData(GridData.FILL_BOTH));
-               section.setText(I18nDemoPlugin.getMessage("MultiSelectionPage.DescriptionSectionTitle"));
+               section.setText(I18nDemoMessages.get().MultiSelectionPage_DescriptionSectionTitle);
 
                // Section Body
                Composite body = tk.createComposite(section, SWT.FILL);
@@ -64,7 +62,6 @@ public class MultiSectionPage extends FormPage {
                section.setExpanded(true);
        }
 
-
        protected void createHistorySection(Composite parent) {
 
                // Section Layout
@@ -74,8 +71,7 @@ public class MultiSectionPage extends FormPage {
                section.setLayout(twt);
 
                // Set title of the section
-               section.setText(I18nDemoPlugin
-                               .getMessage("MultiSelectionPage.DetailsSectionTitle"));
+               section.setText(I18nDemoMessages.get().MultiSelectionPage_DetailsSectionTitle);
 
                final Text styledText = tk.createText(section, "", SWT.FULL_SELECTION
                                | SWT.BORDER | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
index 41c3ea9936e1b79c1d18bc0226abf0063399d80a..967c75624c5d2ea86c541bc665c111da8abfa1b4 100644 (file)
@@ -3,6 +3,7 @@ package org.argeo.demo.i18n.editors;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.ArgeoException;
+import org.argeo.demo.i18n.I18nDemoMessages;
 import org.argeo.demo.i18n.I18nDemoPlugin;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.ui.IEditorInput;
@@ -28,21 +29,19 @@ public class SimpleMultitabEditor extends FormEditor {
        public void init(IEditorSite site, IEditorInput input)
                        throws PartInitException {
                super.init(site, input);
-               this.setPartName("Internationalize editor part name");
+               // this.setPartName("Internationalized editor part name");
        }
 
        @Override
        protected void addPages() {
                try {
                        simplePage = new SimplePage(this,
-                                       I18nDemoPlugin
-                                                       .getMessage("SimpleMultitabEditor.SimplePageTitle"));
+                                       I18nDemoMessages.get().SimpleMultitabEditor_SimplePageTitle);
                        addPage(simplePage);
 
                        multiSectionPage = new MultiSectionPage(
                                        this,
-                                       I18nDemoPlugin
-                                                       .getMessage("SimpleMultitabEditor.MultiSectionPageTitle"));
+                                       I18nDemoMessages.get().SimpleMultitabEditor_MultiSectionPageTitle);
                        addPage(multiSectionPage);
 
                } catch (PartInitException e) {
diff --git a/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/preferences/LocaleSettingsPage.java b/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/preferences/LocaleSettingsPage.java
new file mode 100644 (file)
index 0000000..50df00f
--- /dev/null
@@ -0,0 +1,37 @@
+package org.argeo.demo.i18n.preferences;
+
+import org.argeo.demo.i18n.I18nDemoPlugin;
+import org.eclipse.jface.preference.BooleanFieldEditor;
+import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.jface.preference.RadioGroupFieldEditor;
+import org.eclipse.jface.preference.StringFieldEditor;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+public class LocaleSettingsPage extends FieldEditorPreferencePage implements
+               IWorkbenchPreferencePage {
+
+       public LocaleSettingsPage() {
+               super(GRID);
+       }
+
+       public void createFieldEditors() {
+               addField(new BooleanFieldEditor("BOOLEAN_VALUE",
+                               "&An example of a boolean preference", getFieldEditorParent()));
+
+               addField(new RadioGroupFieldEditor("CHOICE",
+                               "An example of a multiple-choice preference", 1,
+                               new String[][] { { "&Choice 1", "choice1" },
+                                               { "C&hoice 2", "choice2" } }, getFieldEditorParent()));
+               addField(new StringFieldEditor("MySTRING1", "A &text preference:",
+                               getFieldEditorParent()));
+               addField(new StringFieldEditor("MySTRING2", "A &text preference:",
+                               getFieldEditorParent()));
+       }
+
+       @Override
+       public void init(IWorkbench workbench) {
+               setPreferenceStore(I18nDemoPlugin.getDefault().getPreferenceStore());
+               setDescription("A demonstration of a preference page implementation");
+       }
+}
index 3fe464aac3a7b67044798cff6d08268b5d353fdc..db7d254accc1ec2102eab532146b01b2725f51d1 100644 (file)
@@ -1,17 +1,18 @@
 ## English_US labels for Argeo Internationalization demo application 
 
-## Generic labels 
+## Generic labels
 
 ## Errors & warnings 
 
 ## Commands 
 
 ## Editor
-SimpleMultitabEditor.MultiSectionPageTitle=More information
-SimpleMultitabEditor.SimplePageTitle=Base information
+SimpleMultitabEditor_MultiSectionPageTitle=More information
+SimpleMultitabEditor_SimplePageTitle=Base information
+
 ## Pages 
-MultiSelectionPage.DescriptionSectionTitle=Description
-MultiSelectionPage.DetailsSectionTitle=Details
+MultiSelectionPage_DescriptionSectionTitle=Description
+MultiSelectionPage_DetailsSectionTitle=Details
 
  
 ## Dummy ones 
diff --git a/demo/plugins/org.argeo.demo.i18n/src/main/resources/org/argeo/demo/i18n/messages_fr.properties b/demo/plugins/org.argeo.demo.i18n/src/main/resources/org/argeo/demo/i18n/messages_fr.properties
new file mode 100644 (file)
index 0000000..67ff3e2
--- /dev/null
@@ -0,0 +1,19 @@
+## French_FR labels for Argeo Internationalization demo application 
+
+## Generic labels 
+
+
+## Errors & warnings 
+
+## Commands 
+
+## Editor
+SimpleMultitabEditor_MultiSectionPageTitle=Plus d'informations
+SimpleMultitabEditor_SimplePageTitle=Informations de base
+## Pages 
+MultiSelectionPage_DescriptionSectionTitle=Description
+MultiSelectionPage_DetailsSectionTitle=Détails
+
+## Dummy ones 
+testLbl=L'internationnalisation des messages semble fonctionner correctement.
index e50452668b6f290a72cc30a0b343c36513a74f84..2b6c9ba874c4f96029f4167b9d0e80c5e109d9bb 100644 (file)
@@ -1,4 +1,5 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
                <groupId>org.argeo.commons</groupId>
@@ -12,6 +13,8 @@
        <packaging>pom</packaging>
        <modules>
                <module>org.argeo.demo.i18n</module>
+               <module>org.argeo.demo.i18n.rap</module>
+               <module>org.argeo.demo.i18n.rcp</module>
        </modules>
        <build>
                <resources>