From d7c1552f4c28dc4acc25fb6214fb70d4fe67389d Mon Sep 17 00:00:00 2001 From: Bruno Sinou Date: Thu, 29 Sep 2011 15:01:46 +0000 Subject: [PATCH] Internationalization Demo - single sourcing. git-svn-id: https://svn.argeo.org/commons/trunk@4762 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- demo/argeo_demo_rcp.properties | 15 +++++ demo/{demo => }/argeo_demo_web.properties | 5 +- ...log4j.properties => log4j-demo.properties} | 0 .../org.argeo.demo.i18n.rap/.classpath | 9 +++ demo/plugins/org.argeo.demo.i18n.rap/.project | 28 ++++++++ .../META-INF/MANIFEST.MF | 17 +++++ .../org.argeo.demo.i18n.rap/build.properties | 4 ++ demo/plugins/org.argeo.demo.i18n.rap/pom.xml | 29 +++++++++ .../demo/i18n/specific/NLSHelperImpl.java | 17 +++++ .../org.argeo.demo.i18n.rcp/.classpath | 9 +++ demo/plugins/org.argeo.demo.i18n.rcp/.project | 28 ++++++++ .../META-INF/MANIFEST.MF | 16 +++++ .../org.argeo.demo.i18n.rcp/build.properties | 4 ++ demo/plugins/org.argeo.demo.i18n.rcp/pom.xml | 29 +++++++++ .../demo/i18n/specific/NLSHelperImpl.java | 65 +++++++++++++++++++ .../org.eclipse.core.resources.prefs | 4 ++ .../org.argeo.demo.i18n/META-INF/MANIFEST.MF | 8 ++- .../org.argeo.demo.i18n/build.properties | 7 +- .../org.argeo.demo.i18n/plugin.properties | 6 -- demo/plugins/org.argeo.demo.i18n/plugin.xml | 18 +++-- demo/plugins/org.argeo.demo.i18n/pom.xml | 19 ++++-- .../properties/plugin.properties | 8 +++ .../properties/plugin_fr.properties | 8 +++ .../org/argeo/demo/i18n/I18nDemoMessages.java | 36 ++++++++++ .../org/argeo/demo/i18n/I18nDemoPlugin.java | 5 +- .../argeo/demo/i18n/ImplementationLoader.java | 44 +++++++++++++ .../java/org/argeo/demo/i18n/NLSHelper.java | 23 +++++++ .../demo/i18n/editors/MultiSectionPage.java | 16 ++--- .../i18n/editors/SimpleMultitabEditor.java | 9 ++- .../i18n/preferences/LocaleSettingsPage.java | 37 +++++++++++ .../org/argeo/demo/i18n/messages.properties | 11 ++-- .../argeo/demo/i18n/messages_fr.properties | 19 ++++++ demo/plugins/pom.xml | 5 +- 33 files changed, 512 insertions(+), 46 deletions(-) create mode 100644 demo/argeo_demo_rcp.properties rename demo/{demo => }/argeo_demo_web.properties (76%) rename demo/{demo/log4j.properties => log4j-demo.properties} (100%) create mode 100644 demo/plugins/org.argeo.demo.i18n.rap/.classpath create mode 100644 demo/plugins/org.argeo.demo.i18n.rap/.project create mode 100644 demo/plugins/org.argeo.demo.i18n.rap/META-INF/MANIFEST.MF create mode 100644 demo/plugins/org.argeo.demo.i18n.rap/build.properties create mode 100644 demo/plugins/org.argeo.demo.i18n.rap/pom.xml create mode 100644 demo/plugins/org.argeo.demo.i18n.rap/src/main/java/org/argeo/demo/i18n/specific/NLSHelperImpl.java create mode 100644 demo/plugins/org.argeo.demo.i18n.rcp/.classpath create mode 100644 demo/plugins/org.argeo.demo.i18n.rcp/.project create mode 100644 demo/plugins/org.argeo.demo.i18n.rcp/META-INF/MANIFEST.MF create mode 100644 demo/plugins/org.argeo.demo.i18n.rcp/build.properties create mode 100644 demo/plugins/org.argeo.demo.i18n.rcp/pom.xml create mode 100644 demo/plugins/org.argeo.demo.i18n.rcp/src/main/java/org/argeo/demo/i18n/specific/NLSHelperImpl.java create mode 100644 demo/plugins/org.argeo.demo.i18n/.settings/org.eclipse.core.resources.prefs delete mode 100644 demo/plugins/org.argeo.demo.i18n/plugin.properties create mode 100644 demo/plugins/org.argeo.demo.i18n/properties/plugin.properties create mode 100644 demo/plugins/org.argeo.demo.i18n/properties/plugin_fr.properties create mode 100644 demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/I18nDemoMessages.java create mode 100644 demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/ImplementationLoader.java create mode 100644 demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/NLSHelper.java create mode 100644 demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/preferences/LocaleSettingsPage.java create mode 100644 demo/plugins/org.argeo.demo.i18n/src/main/resources/org/argeo/demo/i18n/messages_fr.properties diff --git a/demo/argeo_demo_rcp.properties b/demo/argeo_demo_rcp.properties new file mode 100644 index 000000000..583449a1f --- /dev/null +++ b/demo/argeo_demo_rcp.properties @@ -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/demo/argeo_demo_web.properties b/demo/argeo_demo_web.properties similarity index 76% rename from demo/demo/argeo_demo_web.properties rename to demo/argeo_demo_web.properties index 062352099..877eaf26e 100644 --- a/demo/demo/argeo_demo_web.properties +++ b/demo/argeo_demo_web.properties @@ -20,7 +20,10 @@ org.springframework.osgi.web.extender,\ #Choose initial perspective org.argeo.security.ui.initialPerspective=org.argeo.demo.i18n.perspective -log4j.configuration=file:../../log4j.properties +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/log4j.properties b/demo/log4j-demo.properties similarity index 100% rename from demo/demo/log4j.properties rename to demo/log4j-demo.properties diff --git a/demo/plugins/org.argeo.demo.i18n.rap/.classpath b/demo/plugins/org.argeo.demo.i18n.rap/.classpath new file mode 100644 index 000000000..d255d98ff --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n.rap/.classpath @@ -0,0 +1,9 @@ + + + + + + + diff --git a/demo/plugins/org.argeo.demo.i18n.rap/.project b/demo/plugins/org.argeo.demo.i18n.rap/.project new file mode 100644 index 000000000..d89b85e06 --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n.rap/.project @@ -0,0 +1,28 @@ + + + org.argeo.demo.i18n.rap + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + \ 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 index 000000000..472e9a041 --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n.rap/META-INF/MANIFEST.MF @@ -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 index 000000000..bbafbf84c --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n.rap/build.properties @@ -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 index 000000000..a9d2f2f8d --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n.rap/pom.xml @@ -0,0 +1,29 @@ + + 4.0.0 + + org.argeo.commons.demo + 0.3.4-SNAPSHOT + plugins + .. + + org.argeo.demo.i18n.rap + Commons Internationalization Demo RAP + + + org.argeo.commons.demo + org.argeo.demo.i18n + 0.3.4-SNAPSHOT + + + org.argeo.commons.eclipse + org.argeo.eclipse.ui.rap + ${version.argeo-commons} + + + org.argeo.commons.eclipse + org.argeo.eclipse.dep.rap + ${version.argeo-commons} + + + 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 index 000000000..ad73b903b --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n.rap/src/main/java/org/argeo/demo/i18n/specific/NLSHelperImpl.java @@ -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 index 000000000..d255d98ff --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n.rcp/.classpath @@ -0,0 +1,9 @@ + + + + + + + diff --git a/demo/plugins/org.argeo.demo.i18n.rcp/.project b/demo/plugins/org.argeo.demo.i18n.rcp/.project new file mode 100644 index 000000000..a9fb824f7 --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n.rcp/.project @@ -0,0 +1,28 @@ + + + org.argeo.demo.i18n.rcp + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + \ 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 index 000000000..21a4c6cb0 --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n.rcp/META-INF/MANIFEST.MF @@ -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 index 000000000..803371402 --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n.rcp/build.properties @@ -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 index 000000000..965c596a6 --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n.rcp/pom.xml @@ -0,0 +1,29 @@ + + 4.0.0 + + org.argeo.commons.demo + 0.3.4-SNAPSHOT + plugins + .. + + org.argeo.demo.i18n.rcp + Commons Internationalization Demo RCP + + + org.argeo.commons.demo + org.argeo.demo.i18n + 0.3.4-SNAPSHOT + + + org.argeo.commons.eclipse + org.argeo.eclipse.ui.rcp + ${version.argeo-commons} + + + org.argeo.commons.eclipse + org.argeo.eclipse.dep.rcp + ${version.argeo-commons} + + + \ 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 index 000000000..81c54156f --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n.rcp/src/main/java/org/argeo/demo/i18n/specific/NLSHelperImpl.java @@ -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 index 000000000..c1ac5c5fc --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n/.settings/org.eclipse.core.resources.prefs @@ -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 diff --git a/demo/plugins/org.argeo.demo.i18n/META-INF/MANIFEST.MF b/demo/plugins/org.argeo.demo.i18n/META-INF/MANIFEST.MF index d5822a82d..6ba788ac8 100644 --- a/demo/plugins/org.argeo.demo.i18n/META-INF/MANIFEST.MF +++ b/demo/plugins/org.argeo.demo.i18n/META-INF/MANIFEST.MF @@ -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 diff --git a/demo/plugins/org.argeo.demo.i18n/build.properties b/demo/plugins/org.argeo.demo.i18n/build.properties index 1f316c6fa..ac1c67974 100644 --- a/demo/plugins/org.argeo.demo.i18n/build.properties +++ b/demo/plugins/org.argeo.demo.i18n/build.properties @@ -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 index 40adfae76..000000000 --- a/demo/plugins/org.argeo.demo.i18n/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ - -## commands label - -## View labels - -## Editor labels \ No newline at end of file diff --git a/demo/plugins/org.argeo.demo.i18n/plugin.xml b/demo/plugins/org.argeo.demo.i18n/plugin.xml index 4ba2c49a6..b7a16db60 100644 --- a/demo/plugins/org.argeo.demo.i18n/plugin.xml +++ b/demo/plugins/org.argeo.demo.i18n/plugin.xml @@ -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"> @@ -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"> @@ -27,7 +27,7 @@ @@ -66,7 +66,15 @@ - + + + + + @@ -82,7 +90,7 @@ - + org.argeo.eclipse.ui 0.3.4-SNAPSHOT - - + + org.argeo.commons.eclipse - org.argeo.eclipse.dep.rcp - 0.3.4-SNAPSHOT + org.argeo.eclipse.ui.rap + ${version.argeo-commons} provided org.argeo.commons.eclipse - org.argeo.eclipse.ui.rcp - 0.3.4-SNAPSHOT + org.argeo.eclipse.dep.rap + ${version.argeo-commons} provided + + + 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 index 000000000..d53d3ceb8 --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n/properties/plugin.properties @@ -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 index 000000000..3ca9a12be --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n/properties/plugin_fr.properties @@ -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 index 000000000..00001d5c7 --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/I18nDemoMessages.java @@ -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); + } +} diff --git a/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/I18nDemoPlugin.java b/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/I18nDemoPlugin.java index a1e53a7cd..a1a338376 100644 --- a/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/I18nDemoPlugin.java +++ b/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/I18nDemoPlugin.java @@ -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 index 000000000..041740b6d --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/ImplementationLoader.java @@ -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: + *
    + *
  • 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 index 000000000..5d20fb361 --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/NLSHelper.java @@ -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); +} diff --git a/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/editors/MultiSectionPage.java b/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/editors/MultiSectionPage.java index f641f87bb..1804b1d4e 100644 --- a/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/editors/MultiSectionPage.java +++ b/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/editors/MultiSectionPage.java @@ -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); diff --git a/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/editors/SimpleMultitabEditor.java b/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/editors/SimpleMultitabEditor.java index 41c3ea993..967c75624 100644 --- a/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/editors/SimpleMultitabEditor.java +++ b/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/editors/SimpleMultitabEditor.java @@ -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 index 000000000..50df00f5a --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n/src/main/java/org/argeo/demo/i18n/preferences/LocaleSettingsPage.java @@ -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"); + } +} diff --git a/demo/plugins/org.argeo.demo.i18n/src/main/resources/org/argeo/demo/i18n/messages.properties b/demo/plugins/org.argeo.demo.i18n/src/main/resources/org/argeo/demo/i18n/messages.properties index 3fe464aac..db7d254ac 100644 --- a/demo/plugins/org.argeo.demo.i18n/src/main/resources/org/argeo/demo/i18n/messages.properties +++ b/demo/plugins/org.argeo.demo.i18n/src/main/resources/org/argeo/demo/i18n/messages.properties @@ -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 index 000000000..67ff3e2e2 --- /dev/null +++ b/demo/plugins/org.argeo.demo.i18n/src/main/resources/org/argeo/demo/i18n/messages_fr.properties @@ -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. diff --git a/demo/plugins/pom.xml b/demo/plugins/pom.xml index e50452668..2b6c9ba87 100644 --- a/demo/plugins/pom.xml +++ b/demo/plugins/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 org.argeo.commons @@ -12,6 +13,8 @@ pom org.argeo.demo.i18n + org.argeo.demo.i18n.rap + org.argeo.demo.i18n.rcp -- 2.39.2