Index: /trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 1064)
+++ /trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 1065)
@@ -404,5 +404,5 @@
 	synchronized public Collection<String> getCollection(String key, Collection<String> def) {
 		String s = get(key);
-		if(s != null)
+		if(s != null && s.length() != 0)
 		{
 			/* handle old comma separated stuff - remove in future */
Index: /trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 1064)
+++ /trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 1065)
@@ -173,11 +173,18 @@
 		    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) {
+			localeName = Main.pref.get("language", null);
+		}
+
+		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);
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java	(revision 1065)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java	(revision 1065)
@@ -0,0 +1,71 @@
+// 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;
+	private final Locale AUTO_LANGUAGE = null;
+
+	public void addGui(PreferenceDialog gui) {
+		langCombo = new JComboBox(I18n.getAvailableTranslations());
+		langCombo.insertItemAt(AUTO_LANGUAGE, 0); // Default
+		langCombo.insertItemAt(Locale.ENGLISH, 1); // Built-in language
+		String ln = Main.pref.get("language");
+		langCombo.setSelectedIndex(0);
+		
+		if (ln != null) {
+			for (int i = 1; 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 == AUTO_LANGUAGE ? "Default (Auto determined)" : 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() {
+		if(langCombo.getSelectedItem() == null)
+		{
+			Main.pref.put("language", null);
+		}
+		else
+		{
+			String l = ((Locale)langCombo.getSelectedItem()).toString();
+			Main.pref.put("language", l);
+		}
+	}
+}
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java	(revision 1064)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java	(revision 1065)
@@ -123,4 +123,5 @@
 		// order is important!
 		settings.add(new LafPreference());
+		settings.add(new LanguagePreference());
 		settings.add(new DrawingPreference());
 		settings.add(new ColorPreference());
Index: /trunk/src/org/openstreetmap/josm/tools/I18n.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/I18n.java	(revision 1064)
+++ /trunk/src/org/openstreetmap/josm/tools/I18n.java	(revision 1065)
@@ -3,4 +3,8 @@
 
 import java.text.MessageFormat;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Locale;
+import java.util.Vector;
 
 /**
@@ -10,4 +14,8 @@
  */
 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
@@ -43,3 +51,28 @@
 		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;
+	}
 }
