Index: trunk/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java	(revision 2534)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java	(revision 2535)
@@ -5,5 +5,11 @@
 
 import java.awt.Component;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Locale;
+import java.util.logging.Logger;
 
 import javax.swing.Box;
@@ -14,10 +20,17 @@
 import javax.swing.JPanel;
 import javax.swing.ListCellRenderer;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.PleaseWaitRunnable;
+import org.openstreetmap.josm.io.OsmTransferException;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.I18n;
+import org.xml.sax.SAXException;
 
 public class LanguagePreference implements PreferenceSetting {
+    static private final Logger logger = Logger.getLogger(LanguagePreference.class.getName());
 
     public static class Factory implements PreferenceSettingFactory {
@@ -31,21 +44,9 @@
      */
     private JComboBox langCombo;
-    private final Locale AUTO_LANGUAGE = null;
+    private boolean translationsLoaded = false;
 
-    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;
-                }
-            }
-        }
+    public void addGui(final PreferenceDialog gui) {
+        //langCombo = new JComboBox(I18n.getAvailableTranslations());
+        langCombo = new JComboBox(new Locale[0]);
 
         final ListCellRenderer oldRenderer = langCombo.getRenderer();
@@ -56,15 +57,30 @@
                 Locale l = (Locale) value;
                 return oldRenderer.getListCellRendererComponent(list,
-                        l == AUTO_LANGUAGE ? tr("Default (Auto determined)") : l.getDisplayName(),
-                        index, isSelected, cellHasFocus);
+                        l == null ? tr("Default (Auto determined)") : l.getDisplayName(),
+                                index, isSelected, cellHasFocus);
             }
         });
 
         LafPreference lafPreference = gui.getSetting(LafPreference.class);
-        JPanel panel = lafPreference.panel;
+        final JPanel panel = lafPreference.panel;
         panel.add(new JLabel(tr("Language")), GBC.std().insets(20, 0, 0, 0));
         panel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
         panel.add(langCombo, GBC.eol().fill(GBC.HORIZONTAL));
         panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
+
+        // this defers loading of available translations to the first time the tab
+        // with the available translations is selected by the user
+        //
+        gui.displaycontent.addChangeListener(
+                new ChangeListener() {
+                    public void stateChanged(ChangeEvent e) {
+                        int i = gui.displaycontent.getSelectedIndex();
+                        String title = gui.displaycontent.getTitleAt(i);
+                        if (title.equals(tr("Look and Feel"))) {
+                            initiallyLoadAvailableTranslations();
+                        }
+                    }
+                }
+        );
     }
 
@@ -74,5 +90,68 @@
         else
             return Main.pref.put("language",
-            ((Locale)langCombo.getSelectedItem()).toString());
+                    ((Locale)langCombo.getSelectedItem()).toString());
+    }
+
+    public void initiallyLoadAvailableTranslations() {
+        if (!translationsLoaded) {
+            reloadAvailableTranslations();
+        }
+        translationsLoaded = true;
+    }
+
+    protected void reloadAvailableTranslations() {
+        Main.worker.submit(new AvailableTranslationsLoader());
+    }
+
+    /**
+     * Asynchronous task to lookup the available translations.
+     * 
+     */
+    private class AvailableTranslationsLoader extends PleaseWaitRunnable {
+        public AvailableTranslationsLoader() {
+            super(tr("Looking up available translations..."));
+        }
+
+        @Override
+        protected void cancel() {
+            // can't cancel
+        }
+
+        @Override
+        protected void realRun() throws SAXException, IOException, OsmTransferException {
+            final List<Locale> locales = new ArrayList<Locale>(
+                    Arrays.asList(I18n.getAvailableTranslations(getProgressMonitor()))
+            );
+            locales.add(0,Locale.ENGLISH);
+            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;
+                            }
+                        }
+                    }
+                }
+            };
+            try {
+                SwingUtilities.invokeAndWait(r);
+            } catch(InvocationTargetException e) {
+                throw new RuntimeException(e.getCause());
+            } catch(InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        @Override
+        protected void finish() {}
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java	(revision 2534)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java	(revision 2535)
@@ -14,4 +14,5 @@
 import java.util.LinkedList;
 import java.util.List;
+import java.util.logging.Logger;
 
 import javax.swing.BorderFactory;
@@ -36,4 +37,5 @@
  */
 public class PreferenceDialog extends JTabbedPane implements MouseWheelListener {
+    static private final Logger logger = Logger.getLogger(PreferenceDialog.class.getName());
 
     private final static Collection<PreferenceSettingFactory> settingsFactory = new LinkedList<PreferenceSettingFactory>();
@@ -122,5 +124,5 @@
 
         for (PreferenceSettingFactory factory:settingsFactory) {
-
+            // logger.info("creating settings: " + factory);
             PreferenceSetting setting = factory.createPreferenceSetting();
             if (setting != null) {
@@ -133,5 +135,7 @@
         for (Iterator<PreferenceSetting> it = settings.iterator(); it.hasNext();) {
             try {
-                it.next().addGui(this);
+                PreferenceSetting settings = it.next();
+                //logger.info("adding gui: " + settings);
+                settings.addGui(this);
             } catch (SecurityException e) {
                 it.remove();
