Attached are 2 patches against current SVN:

* I18N: Make java.util.Locale happy
* I18N: Make JOSM language configurable through Preferences

Cheers,

- Michel
>From 6471df894723c5c80e592022e7307a6f94ea5f28 Mon Sep 17 00:00:00 2001
From: Michel Marti <[EMAIL PROTECTED]>
Date: Sun, 2 Nov 2008 09:41:21 +0100
Subject: [PATCH] I18N: Make java.util.Locale happy.

The default Locale constructor does not grok a combined language_COUNTRY
string. We therefore have to split the string and pass language and
country as separate arguments.
---
 .../openstreetmap/josm/gui/MainApplication.java    |   17 ++++++++++-------
 1 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/org/openstreetmap/josm/gui/MainApplication.java b/src/org/openstreetmap/josm/gui/MainApplication.java
index c76d4f2..9597d18 100644
--- a/src/org/openstreetmap/josm/gui/MainApplication.java
+++ b/src/org/openstreetmap/josm/gui/MainApplication.java
@@ -172,13 +172,16 @@ public class MainApplication extends Main {
 		if(args.containsKey("language")) 
 		    localeName = (String)(args.get("language").toArray()[0]);
 		
-		//TODO: Check preferences for language
-        
-		//If override then set new default locale - otherwise, override
-        if (localeName != null) {
-            Locale.setDefault(new Locale(localeName));
-        }
-        
+		if (localeName != null) {
+			Locale l;
+			int i = localeName.indexOf('_');
+			if (i > 0) {
+				l = new Locale(localeName.substring(0, i), localeName.substring(i + 1));
+			} else {
+				l = new Locale(localeName);
+			}
+			Locale.setDefault(l);
+		}
         try {
             i18n = I18nFactory.getI18n(MainApplication.class);
         } catch (MissingResourceException ex) {
-- 
1.5.6.5

>From d120e5c2a30693b6f73617799b65d5c340ce9fcc Mon Sep 17 00:00:00 2001
From: Michel Marti <[EMAIL PROTECTED]>
Date: Sun, 2 Nov 2008 10:04:20 +0100
Subject: [PATCH] I18N: Make JOSM language configurable through Preferences.

---
 .../openstreetmap/josm/gui/MainApplication.java    |    4 +
 .../josm/gui/preferences/LanguagePreference.java   |   62 ++++++++++++++++++++
 .../josm/gui/preferences/PreferenceDialog.java     |    1 +
 src/org/openstreetmap/josm/tools/I18n.java         |   33 ++++++++++
 4 files changed, 100 insertions(+), 0 deletions(-)
 create mode 100644 src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java

diff --git a/src/org/openstreetmap/josm/gui/MainApplication.java b/src/org/openstreetmap/josm/gui/MainApplication.java
index 9597d18..b5c4c5d 100644
--- a/src/org/openstreetmap/josm/gui/MainApplication.java
+++ b/src/org/openstreetmap/josm/gui/MainApplication.java
@@ -172,6 +172,10 @@ public class MainApplication extends Main {
 		if(args.containsKey("language")) 
 		    localeName = (String)(args.get("language").toArray()[0]);
 		
+		if (localeName == null) {
+			localeName = Main.pref.get("language", null);
+		}
+
 		if (localeName != null) {
 			Locale l;
 			int i = localeName.indexOf('_');
diff --git a/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java b/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java
new file mode 100644
index 0000000..8394565
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java
@@ -0,0 +1,62 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Component;
+import java.util.Locale;
+
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.ListCellRenderer;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.I18n;
+
+public class LanguagePreference implements PreferenceSetting {
+	/**
+	 * ComboBox with all available Translations
+	 */
+	private JComboBox langCombo;
+
+	public void addGui(PreferenceDialog gui) {
+		langCombo = new JComboBox(I18n.getAvailableTranslations());
+		langCombo.insertItemAt(Locale.ENGLISH, 0); // Default (Built-in language)
+		String ln = Locale.getDefault().toString();
+		langCombo.setSelectedIndex(0);
+		
+		if (ln != null) {
+			for (int i = 0; i < langCombo.getItemCount(); ++i) {
+				if (((Locale) langCombo.getItemAt(i)).toString().equals(ln)) {
+					langCombo.setSelectedIndex(i);
+					break;
+				}
+			}
+		}
+
+		final ListCellRenderer oldRenderer = langCombo.getRenderer();
+		langCombo.setRenderer(new DefaultListCellRenderer() {
+			@Override
+			public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
+					boolean cellHasFocus) {
+				Locale l = (Locale) value;
+				return oldRenderer.getListCellRendererComponent(list,
+						l == Locale.ENGLISH ? "Default (English)" : l.getDisplayName(),
+						index, isSelected, cellHasFocus);
+			}
+		});
+		langCombo.addActionListener(gui.requireRestartAction);
+
+		gui.display.add(new JLabel(tr("Language")), GBC.std());
+		gui.display.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
+		gui.display.add(langCombo, GBC.eol().fill(GBC.HORIZONTAL));
+	}
+
+	public void ok() {
+		String l = ((Locale)langCombo.getSelectedItem()).toString();
+		Main.pref.put("language", l.equals("en") ? null : l);
+	}
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java b/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
index 80d1654..162ab79 100644
--- a/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
+++ b/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
@@ -122,6 +122,7 @@ public class PreferenceDialog extends JTabbedPane {
 	static {
 		// order is important!
 		settings.add(new LafPreference());
+		settings.add(new LanguagePreference());
 		settings.add(new DrawingPreference());
 		settings.add(new ColorPreference());
 		settings.add(new MapPaintPreference());
diff --git a/src/org/openstreetmap/josm/tools/I18n.java b/src/org/openstreetmap/josm/tools/I18n.java
index f639593..bc98909 100644
--- a/src/org/openstreetmap/josm/tools/I18n.java
+++ b/src/org/openstreetmap/josm/tools/I18n.java
@@ -2,6 +2,10 @@
 package org.openstreetmap.josm.tools;
 
 import java.text.MessageFormat;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Locale;
+import java.util.Vector;
 
 /**
  * Internationalisation support.
@@ -9,6 +13,10 @@ import java.text.MessageFormat;
  * @author Immanuel.Scholz
  */
 public class I18n {
+
+	/* Base name for translation data. Used for detecting available translations */
+	private static final String TR_BASE = "org.openstreetmap.josm.i18n.Translation_";
+
 	/**
 	 * Set by MainApplication. Changes here later will probably mess up everything, because
 	 * many strings are already loaded.
@@ -42,4 +50,29 @@ public class I18n {
 			return n == 1 ? tr(text) : tr(pluralText);
 		return i18n.trn(text, pluralText, n);
 	}
+
+	/**
+	 * Get a list of all available JOSM Translations.
+	 * @return an array of locale objects.
+	 */
+	public static final Locale[] getAvailableTranslations() {
+		Vector<Locale> v = new Vector<Locale>();
+		Locale[] l = Locale.getAvailableLocales();
+		for (int i = 0; i < l.length; i++) {
+			String cn = TR_BASE + l[i];
+			try {
+				Class.forName(cn);
+				v.add(l[i]);
+			} catch (ClassNotFoundException e) {
+			}
+		}
+		l = new Locale[v.size()];
+		l = v.toArray(l);
+		Arrays.sort(l, new Comparator<Locale>() {
+			public int compare(Locale o1, Locale o2) {
+				return o1.toString().compareTo(o2.toString());
+			}
+		});
+		return l;
+	}
 }
-- 
1.5.6.5

_______________________________________________
josm-dev mailing list
[email protected]
http://lists.openstreetmap.org/listinfo/josm-dev

Reply via email to