language is selectable in the settings

This commit is contained in:
hneemann 2016-06-10 14:18:00 +02:00
parent fb4172fbf0
commit 6ad0dd6d99
10 changed files with 216 additions and 2 deletions

View File

@ -2,6 +2,8 @@ package de.neemann.digital.core.element;
import de.neemann.digital.core.io.IntFormat;
import de.neemann.digital.core.memory.DataField;
import de.neemann.digital.lang.Language;
import de.neemann.digital.lang.Languages;
import java.util.Locale;
@ -201,6 +203,13 @@ public final class Keys {
public static final Key<Boolean> SETTINGS_IEEE_SHAPES
= new Key<>("IEEEShapes", Locale.getDefault().getLanguage().equals(Locale.US.getLanguage()));
/**
* The Gui Language
*/
public static final Key<Language> SETTINGS_LANGUAGE
= new Key<>("Language", Languages.getInstance().getDefault());
/**
* output format for numbers
*/

View File

@ -18,6 +18,7 @@ import de.neemann.digital.draw.shapes.Drawable;
import de.neemann.digital.draw.shapes.ShapeFactory;
import de.neemann.digital.gui.components.AttributeDialog;
import de.neemann.digital.lang.Lang;
import de.neemann.digital.lang.Language;
import java.awt.*;
import java.io.*;
@ -60,6 +61,8 @@ public class Circuit {
xStream.alias("intFormat", IntFormat.class);
xStream.alias("rotation", Rotation.class);
xStream.aliasAttribute(Rotation.class, "rotation", "rotation");
xStream.alias("language", Language.class);
xStream.aliasAttribute(Language.class, "name", "name");
xStream.alias("vector", Vector.class);
xStream.aliasAttribute(Vector.class, "x", "x");
xStream.aliasAttribute(Vector.class, "y", "y");

View File

@ -386,8 +386,10 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E
ToolTipAction editSettings = new ToolTipAction(Lang.get("menu_editSettings")) {
@Override
public void actionPerformed(ActionEvent e) {
if (new AttributeDialog(Main.this, Settings.SETTINGS_KEYS, Settings.getInstance().getAttributes()).showDialog())
if (new AttributeDialog(Main.this, Settings.SETTINGS_KEYS, Settings.getInstance().getAttributes()).showDialog()) {
Lang.setLanguage(Settings.getInstance().getAttributes().get(Keys.SETTINGS_LANGUAGE));
JOptionPane.showMessageDialog(Main.this, Lang.get("msg_restartNeeded"));
}
}
}.setToolTip(Lang.get("menu_editSettings_tt"));

View File

@ -30,6 +30,7 @@ public final class Settings implements AttributeListener {
static {
INT_LIST.add(Keys.SETTINGS_IEEE_SHAPES);
INT_LIST.add(Keys.SETTINGS_LANGUAGE);
}
private static final class SettingsHolder {

View File

@ -7,6 +7,8 @@ import de.neemann.digital.core.io.IntFormat;
import de.neemann.digital.core.memory.DataField;
import de.neemann.digital.core.memory.ROM;
import de.neemann.digital.lang.Lang;
import de.neemann.digital.lang.Language;
import de.neemann.digital.lang.Languages;
import de.neemann.gui.ErrorMessage;
import de.neemann.gui.ToolTipAction;
@ -36,6 +38,7 @@ public final class EditorFactory {
add(DataField.class, DataFieldEditor.class);
add(Rotation.class, RotationEditor.class);
add(IntFormat.class, IntFormatsEditor.class);
add(Language.class, LanguageEditor.class);
}
private <T> void add(Class<T> clazz, Class<? extends Editor<T>> editor) {
@ -305,4 +308,22 @@ public final class EditorFactory {
}
}
private static class LanguageEditor extends LabelEditor<Language> {
private JComboBox comb;
public LanguageEditor(Language language, Key<Rotation> key) {
comb = new JComboBox<>(Languages.getInstance().getSupportedLanguages());
comb.setSelectedIndex(Languages.getInstance().getIndexOf(language));
}
@Override
protected JComponent getComponent(ElementAttributes elementAttributes) {
return comb;
}
@Override
public Language getValue() {
return Languages.getInstance().getByIndex(comb.getSelectedIndex());
}
}
}

View File

@ -4,11 +4,14 @@ import java.text.MessageFormat;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.prefs.Preferences;
/**
* @author hneemann
*/
public final class Lang {
private static final Preferences PREFS = Preferences.userRoot().node("dig");
private static final String LANGUAGE = "lang";
private static class InstanceHolder {
static final Lang INSTANCE = new Lang();
@ -25,6 +28,16 @@ public final class Lang {
return InstanceHolder.INSTANCE.getKey(key, params);
}
/**
* Sets the GUI language
*
* @param language the language
*/
public static void setLanguage(Language language) {
PREFS.put(LANGUAGE, language.getName());
}
/**
* gets an internationalized string
*
@ -40,9 +53,10 @@ public final class Lang {
private ResourceBundle localeBundle;
private Lang() {
Locale currentLocale = Locale.getDefault();
defaultBundle = ResourceBundle.getBundle("lang/lang", Locale.ENGLISH);
try {
String lang = PREFS.get(LANGUAGE, null);
Locale currentLocale = Languages.getInstance().getLocaleByName(lang);
localeBundle = ResourceBundle.getBundle("lang/lang", currentLocale);
} catch (MissingResourceException e) {
}

View File

@ -0,0 +1,54 @@
package de.neemann.digital.lang;
import java.util.Locale;
/**
* @author hneemann
*/
public final class Language {
private final String name;
private transient Locale locale;
/**
* Creates a new instance
*
* @param name the languages name
*/
public Language(String name) {
this.name = name;
}
/**
* Creates a new instance
*
* @param locale the locale
*/
public Language(Locale locale) {
this(locale.getLanguage());
this.locale = locale;
}
@Override
public String toString() {
return name;
}
/**
* Returns the locale
*
* @return the locale
*/
Locale getLocale() {
return locale;
}
/**
* returns the name
*
* @return the name
*/
public String getName() {
return name;
}
}

View File

@ -0,0 +1,106 @@
package de.neemann.digital.lang;
import java.util.ArrayList;
import java.util.Locale;
/**
* @author hneemann
*/
public final class Languages {
private static final class InstanceHolder {
private static final Languages INSTANCE = new Languages();
}
/**
* @return the languages instance
*/
public static Languages getInstance() {
return InstanceHolder.INSTANCE;
}
private final ArrayList<Language> list = new ArrayList<>();
private String[] strArray;
private Languages() {
add(Locale.US);
add(Locale.GERMANY);
}
private void add(Locale locale) {
list.add(new Language(locale));
}
/**
* Returns a list of all supported languages
*
* @return the languages list
*/
public String[] getSupportedLanguages() {
if (strArray == null) {
strArray = new String[list.size()];
for (int i = 0; i < strArray.length; i++)
strArray[i] = list.get(i).getLocale().getDisplayName();
}
return strArray;
}
/**
* Returns the index of the given language
*
* @param language the language
* @return the index
*/
public int getIndexOf(Language language) {
for (int i = 0; i < list.size(); i++)
if (list.get(i).getName().equals(language.getName()))
return i;
return 0;
}
/**
* Returns the language by the languages index
*
* @param index the index
* @return the language
*/
public Language getByIndex(int index) {
return list.get(index);
}
/**
* Returns the default language
*
* @return the systems language, if there is a translation, US otherwise
*/
public Language getDefault() {
String lang = Locale.getDefault().getLanguage();
for (Language l : list) {
if (l.getLocale().getLanguage().equals(lang))
return l;
}
return list.get(0);
}
/**
* Returns a locale by the given name
*
* @param lang the language name
* @return the locale matching the language
*/
public Locale getLocaleByName(String lang) {
return getLanguageByName(lang).getLocale();
}
private Language getLanguageByName(String lang) {
if (lang == null)
return getDefault();
for (Language l : list)
if (l.getName().equals(lang))
return l;
return getDefault();
}
}

View File

@ -57,6 +57,8 @@ key_intFormat_dec=Dezimal
key_intFormat_hex=Hexadezimal
key_intFormat_bin=Bin\u00E4r
key_intFormat_ascii=ASCII
key_Language=Sprache
attr_openCircuitLabel=Enthaltene Schaltung:
attr_openCircuit=Anzeigen
attr_openCircuit_tt=\u00D6ffnet die Schaltung in einem neuen Fenster.

View File

@ -51,6 +51,8 @@ key_intFormat_dec=decimal
key_intFormat_hex=hex
key_intFormat_bin=bin
key_intFormat_ascii=ascii
key_Language=Language
attr_openCircuitLabel=Included circuit:
attr_openCircuit=Show
attr_openCircuit_tt=Opens the circuit in a new window.