Index: trunk/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java	(revision 2552)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java	(revision 2553)
@@ -14,4 +14,5 @@
 
 import javax.swing.Box;
+import javax.swing.DefaultComboBoxModel;
 import javax.swing.DefaultListCellRenderer;
 import javax.swing.JComboBox;
@@ -40,25 +41,15 @@
     }
 
-    /**
-     * ComboBox with all available Translations
-     */
+    /** the combo box with the available locales */
     private JComboBox langCombo;
+    /** the model for the combo box */
+    private LanguageComboBoxModel model;
+    /** true, if the available translations have been loaded; false otherwise */
     private boolean translationsLoaded = false;
 
     public void addGui(final PreferenceDialog gui) {
-        //langCombo = new JComboBox(I18n.getAvailableTranslations());
-        langCombo = new JComboBox(new Locale[0]);
-
-        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 == null ? tr("Default (Auto determined)") : l.getDisplayName(),
-                                index, isSelected, cellHasFocus);
-            }
-        });
+        model = new LanguageComboBoxModel();
+        langCombo = new JComboBox(model);
+        langCombo.setRenderer(new LanguageCellRenderer(langCombo.getRenderer()));
 
         LafPreference lafPreference = gui.getSetting(LafPreference.class);
@@ -86,4 +77,7 @@
 
     public boolean ok() {
+        if (!translationsLoaded)
+            // keep the current language, don't update preferences
+            return true;
         if(langCombo.getSelectedItem() == null)
             return Main.pref.put("language", null);
@@ -93,4 +87,7 @@
     }
 
+    /**
+     * Load available translations if not loaded yet.
+     */
     public void initiallyLoadAvailableTranslations() {
         if (!translationsLoaded) {
@@ -100,4 +97,8 @@
     }
 
+    /**
+     * Asynchronously loads available translations
+     * 
+     */
     protected void reloadAvailableTranslations() {
         Main.worker.submit(new AvailableTranslationsLoader());
@@ -126,19 +127,6 @@
             Runnable r = new Runnable() {
                 public void run() {
-                    langCombo.removeAll();
-                    langCombo.addItem(null); // the default enry
-                    for (Locale locale : locales) {
-                        langCombo.addItem(locale);
-                    }
-                    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;
-                            }
-                        }
-                    }
+                    model.setAvailableLocales(locales);
+                    model.selectLanguage(Main.pref.get("language"));
                 }
             };
@@ -155,3 +143,58 @@
         protected void finish() {}
     }
+
+    private static class LanguageComboBoxModel extends DefaultComboBoxModel {
+        private final List<Locale> data = new ArrayList<Locale>();
+
+        public LanguageComboBoxModel() {}
+
+        public void setAvailableLocales(List<Locale> locales) {
+            data.clear();
+            if (locales != null) {
+                data.add(null); // the default locale
+                data.addAll(locales);
+            }
+            fireContentsChanged(this, 0, getSize());
+        }
+
+        public void selectLanguage(String language) {
+            setSelectedItem(null);
+            if (language != null) {
+                for (Locale locale: data) {
+                    if (locale == null) {
+                        continue;
+                    }
+                    if (locale.toString().equals(language)) {
+                        setSelectedItem(locale);
+                        return;
+                    }
+                }
+            }
+        }
+
+        @Override
+        public Object getElementAt(int index) {
+            return data.get(index);
+        }
+
+        @Override
+        public int getSize() {
+            return data.size();
+        }
+    }
+
+    static private class LanguageCellRenderer extends DefaultListCellRenderer {
+        private ListCellRenderer dispatch;
+        public LanguageCellRenderer(ListCellRenderer dispatch) {
+            this.dispatch = dispatch;
+        }
+        @Override
+        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
+                boolean cellHasFocus) {
+            Locale l = (Locale) value;
+            return dispatch.getListCellRendererComponent(list,
+                    l == null ? tr("Default (Auto determined)") : l.getDisplayName(),
+                            index, isSelected, cellHasFocus);
+        }
+    }
 }
