mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-16 16:34:47 -04:00
language is selectable in the settings
This commit is contained in:
parent
fb4172fbf0
commit
6ad0dd6d99
@ -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
|
||||
*/
|
||||
|
@ -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");
|
||||
|
@ -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"));
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
}
|
||||
|
54
src/main/java/de/neemann/digital/lang/Language.java
Normal file
54
src/main/java/de/neemann/digital/lang/Language.java
Normal 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;
|
||||
}
|
||||
}
|
106
src/main/java/de/neemann/digital/lang/Languages.java
Normal file
106
src/main/java/de/neemann/digital/lang/Languages.java
Normal 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();
|
||||
}
|
||||
|
||||
}
|
@ -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.
|
||||
|
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user