package com.limegroup.gnutella.gui.init;
import java.io.File;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Map;
import java.util.HashMap;
import java.awt.Font;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.Box;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import com.limegroup.gnutella.settings.ApplicationSettings;
import com.limegroup.gnutella.gui.LanguageInfo;
import com.limegroup.gnutella.gui.ResourceManager;
/**
* This class displays a window to the user allowing them to specify
* the language LimeWire will use.
*/
//2345678|012345678|012345678|012345678|012345678|012345678|012345678|012345678|
final class LanguageWindow extends SetupWindow {
/**
* The combobox that lists the languages available.
*/
private JComboBox _languages;
/**
* Creates the window and its components.
*/
LanguageWindow(SetupManager manager) {
super(manager, "SETUP_LANGUAGE_TITLE", "SETUP_LANGUAGE_LABEL");
_languages = new JComboBox();
_languages.setFont(new Font("Dialog", Font.PLAIN, 11));
LanguageInfo[] langs = LanguageInfo.getLanguages(_languages.getFont());
_languages.setModel(new DefaultComboBoxModel(langs));
int langIdx = 0;
String[] wanted = guessLanguage();
for(int i = 0; i < langs.length; i++) {
if(langs[i].matches(wanted)) {
langIdx = i;
break;
}
}
_languages.setSelectedIndex(langIdx);
applySettings();
// It is important that the listener is added after the index
// is set. Otherwise the listener will call methods that
// are not ready to be called at this point.
_languages.addItemListener(new StateListener());
}
/**
* Overriden to also add the language options.
*/
protected void createWindow() {
super.createWindow();
JPanel mainPanel = new JPanel();
mainPanel.add(_languages);
mainPanel.add(Box.createHorizontalGlue());
addSetupComponent(mainPanel);
}
/**
* Overrides applySettings in SetupWindow superclass.
* Applies the settings handled in this window.
*/
public void applySettings() {
LanguageInfo chosen = (LanguageInfo)_languages.getSelectedItem();
chosen.apply();
ResourceManager.instance().validateLocaleAndFonts();
}
private class StateListener implements ItemListener {
public void itemStateChanged(ItemEvent e) {
applySettings();
_manager.remakeButtons();
handleWindowOpeningEvent();
_languages.requestFocus();
}
}
private String[] guessLanguage() {
String ln = ApplicationSettings.LANGUAGE.getValue();
String cn = ApplicationSettings.COUNTRY.getValue();
String vn = ApplicationSettings.LOCALE_VARIANT.getValue();
File file = new File("language.prop");
if(!file.exists())
return new String[] { ln, cn, vn };
InputStream in = null;
BufferedReader reader = null;
String code = "";
try {
in = new FileInputStream(file);
reader = new BufferedReader(new InputStreamReader(in));
code = reader.readLine();
} catch(IOException ignored) {
} finally {
if(in != null) {
try {
in.close();
} catch(IOException ignored) {}
}
if(reader != null) {
try {
reader.close();
} catch(IOException ignored) {}
}
}
String[] mapped = getLCID(code);
if(mapped != null)
return mapped;
else
return new String[] { ln, cn, vn };
}
/**
* Returns the String[] { languageCode, countryCode, variantCode }
* for the Windows LCID.
*/
private String[] getLCID(String code) {
Map map = new HashMap();
map.put("1078", new String[] { "af", null, null } );
map.put("1052", new String[] { "sq", null, null } );
map.put("5121", new String[] { "ar", null, null } );
map.put("15361", new String[] { "ar", null, null } );
map.put("3073", new String[] { "ar", null, null } );
map.put("2049", new String[] { "ar", null, null } );
map.put("11265", new String[] { "ar", null, null } );
map.put("13313", new String[] { "ar", null, null } );
map.put("12289", new String[] { "ar", null, null } );
map.put("4097", new String[] { "ar", null, null } );
map.put("6145", new String[] { "ar", null, null } );
map.put("8193", new String[] { "ar", null, null } );
map.put("16385", new String[] { "ar", null, null } );
map.put("1025", new String[] { "ar", null, null } );
map.put("10241", new String[] { "ar", null, null } );
map.put("7169", new String[] { "ar", null, null } );
map.put("14337", new String[] { "ar", null, null } );
map.put("9217", new String[] { "ar", null, null } );
map.put("1069", new String[] { "eu", null, null } );
map.put("1059", new String[] { "be", null, null } );
map.put("1093", new String[] { "bn", null, null } );
map.put("1027", new String[] { "ca", null, null } );
map.put("3076", new String[] { "zh", null, null } );
map.put("5124", new String[] { "zh", null, null } );
map.put("2052", new String[] { "zh", null, null } );
map.put("4100", new String[] { "zh", null, null } );
map.put("1028", new String[] { "zh", "TW", null } );
map.put("1050", new String[] { "hr", null, null } );
map.put("1029", new String[] { "cs", null, null } );
map.put("1030", new String[] { "da", null, null } );
map.put("2067", new String[] { "nl", null, null } );
map.put("1043", new String[] { "nl", null, null } );
map.put("3081", new String[] { "en", null, null } );
map.put("10249", new String[] { "en", null, null } );
map.put("4105", new String[] { "en", null, null } );
map.put("9225", new String[] { "en", null, null } );
map.put("6153", new String[] { "en", null, null } );
map.put("8201", new String[] { "en", null, null } );
map.put("5129", new String[] { "en", null, null } );
map.put("13321", new String[] { "en", null, null } );
map.put("7177", new String[] { "en", null, null } );
map.put("11273", new String[] { "en", null, null } );
map.put("2057", new String[] { "en", null, null } );
map.put("1033", new String[] { "en", null, null } );
map.put("12297", new String[] { "en", null, null } );
map.put("1061", new String[] { "et", null, null } );
map.put("1035", new String[] { "fi", null, null } );
map.put("2060", new String[] { "fr", null, null } );
map.put("11276", new String[] { "fr", null, null } );
map.put("3084", new String[] { "fr", null, null } );
map.put("9228", new String[] { "fr", null, null } );
map.put("12300", new String[] { "fr", null, null } );
map.put("1036", new String[] { "fr", null, null } );
map.put("5132", new String[] { "fr", null, null } );
map.put("13324", new String[] { "fr", null, null } );
map.put("6156", new String[] { "fr", null, null } );
map.put("10252", new String[] { "fr", null, null } );
map.put("4108", new String[] { "fr", null, null } );
map.put("7180", new String[] { "fr", null, null } );
map.put("3079", new String[] { "de", null, null } );
map.put("1031", new String[] { "de", null, null } );
map.put("5127", new String[] { "de", null, null } );
map.put("4103", new String[] { "de", null, null } );
map.put("2055", new String[] { "de", null, null } );
map.put("1032", new String[] { "el", null, null } );
map.put("1037", new String[] { "iw", null, null } );
map.put("1081", new String[] { "hi", null, null } );
map.put("1038", new String[] { "hu", null, null } );
map.put("1039", new String[] { "is", null, null } );
map.put("1057", new String[] { "id", null, null } );
map.put("1040", new String[] { "it", null, null } );
map.put("2064", new String[] { "it", null, null } );
map.put("1041", new String[] { "ja", null, null } );
map.put("1042", new String[] { "ko", null, null } );
map.put("1062", new String[] { "lv", null, null } );
map.put("2110", new String[] { "ms", null, null } );
map.put("1086", new String[] { "ms", null, null } );
map.put("1082", new String[] { "mt", null, null } );
map.put("1044", new String[] { "no", null, null } );
map.put("2068", new String[] { "nn", null, null } );
map.put("1045", new String[] { "pl", null, null } );
map.put("1046", new String[] { "pt", "BR", null } );
map.put("2070", new String[] { "pt", null, null } );
map.put("1048", new String[] { "ro", null, null } );
map.put("2072", new String[] { "ro", null, null } );
map.put("1049", new String[] { "ru", null, null } );
map.put("2073", new String[] { "ru", null, null } );
map.put("3098", new String[] { "sr", null, null } );
map.put("2074", new String[] { "sr", null, null } );
map.put("1051", new String[] { "sk", null, null } );
map.put("1060", new String[] { "sl", null, null } );
map.put("11274", new String[] { "es", null, null } );
map.put("16394", new String[] { "es", null, null } );
map.put("13322", new String[] { "es", null, null } );
map.put("9226", new String[] { "es", null, null } );
map.put("5130", new String[] { "es", null, null } );
map.put("7178", new String[] { "es", null, null } );
map.put("12298", new String[] { "es", null, null } );
map.put("17418", new String[] { "es", null, null } );
map.put("4106", new String[] { "es", null, null } );
map.put("18442", new String[] { "es", null, null } );
map.put("3082", new String[] { "es", null, null } );
map.put("2058", new String[] { "es", null, null } );
map.put("19466", new String[] { "es", null, null } );
map.put("6154", new String[] { "es", null, null } );
map.put("15370", new String[] { "es", null, null } );
map.put("10250", new String[] { "es", null, null } );
map.put("20490", new String[] { "es", null, null } );
map.put("1034", new String[] { "es", null, null } );
map.put("14346", new String[] { "es", null, null } );
map.put("8202", new String[] { "es", null, null } );
map.put("1053", new String[] { "sv", null, null } );
map.put("2077", new String[] { "sv", null, null } );
map.put("1097", new String[] { "ta", null, null } );
map.put("1054", new String[] { "th", null, null } );
map.put("1055", new String[] { "tr", null, null } );
map.put("1058", new String[] { "uk", null, null } );
map.put("1056", new String[] { "ur", null, null } );
map.put("2115", new String[] { "uz", null, null } );
map.put("1091", new String[] { "uz", null, null } );
map.put("1066", new String[] { "vi", null, null } );
return (String[])map.get(code);
}
}