setMenmonic und Mehrsprachigkeit ("Internationalization

Status
Nicht offen für weitere Antworten.

oliver1974

Aktives Mitglied
Hallo zusammen,

Es ist ja kein Problem, Menüeinträge und dergleichen mehrsprachig zu machen, nur dass
mit den Mnemonics bei Menüeinträgen und Buttons ist ja irgendwie.. doof.

Die werden ja mit einer separaten Methode (setMnemonic) gesetzt, sind also
im entsprechenden ResourceBundle der Sprache nicht gesetzt.

Nun könnte man sich zwar was bauen, indem man innerhalb des ResourceBundles
die HotKeys irgendwie "markiert" (z.B. mit dem "&" Zeichen, wie viele andere Gui-Libraries
das tun), nur endet das ja schon irgendwie mit nem Umbau des ganzen vorgesehenen
Systems..

Na ja, okay, nicht ganz.. Aber trotzdem ist es irgendwie unschön.

Man hat sich ja schon diverse Gedanken gemacht:


http://weblogs.java.net/blog/enicholas/archive/2006/06/mnemonic_magic.html

..wo man ja sehen kann, andere haben auch das Problem... aber irgendwie so richtig
hat keiner eine Lösung zur Hand?

Die Lösung hier aus dem Forum

http://www.java-forum.org/de/viewtopic.php?t=24996&highlight=mnemonic

ist zwar gut gedacht.. nur ist setMnemonic(char .. ) ja mittlerweile "deprecated"....
stattdessen sollen es ja mittlerweile ints sein, also sowas wie hier:

fileMenu.setMnemonic (java.awt.event.KeyEvent.VK_D);

Irgendwie mistig, das ganze.

Das Problem muss doch schon mal jemand gelöst haben?

Dank im voraus.

Gruß,

Oliver
 
R

Roar

Gast
also ich machs auch mit dem &
du hast glück und ich hab genau diese datei gerade geöffnet im editor, hier meine methode dafür ;)

Code:
	private void createMnemonic(Action action) {
		StringBuilder name = new StringBuilder((String) action.getValue(Action.NAME));
		int index = -1;
		while ((index = name.indexOf("&", index + 1)) != -1) {
			if (index + 1 < name.length()) {
				char ch = name.charAt(index + 1);
				if (Character.isLetterOrDigit(ch)) {
					action.putValue(Action.MNEMONIC_KEY, (int) ch);
					name.deleteCharAt(index);
					action.putValue(Action.NAME, name.toString());
				}
			}
		}
	}
???:L

edit: oj das steht ja im andern thread auch so ähnlich :cool:
 

oliver1974

Aktives Mitglied
Hallo,

Das ist ja witzig... just quasi gerade mein Problem vor Augen...

Noch raffe ich allerdings nicht, wie ich das bei mir einsetzen kann... bei mir sieht
die Definition eines Menüs z.B so aus.

Code:
JMenu fileMenu = new JMenu ( ResourceBundle.getBundle("data/language/languages").getString("FILE") );
fileMenu.setMnemonic (java.awt.event.KeyEvent.VK_D);

Wie setzt du da das mit deiner Methode? Dü übergibst ja eine Action.. explizit gibt es ja bei mir keine, ist ja "nur" quasi der Menü-Kopf?

Gruß,

Olli
 

oliver1974

Aktives Mitglied
Hmmmm, ich schau mir das mal an... sieht ja alles nicht schlecht aus..

Danke soweit, das könnte schon mal alles weiterhelfen!! :)
 

oliver1974

Aktives Mitglied
Hier nochmal eine Variante ohne explizite "Actions", falls man das
(aus welchem Grund auch immer) nicht verwenden will.

Code:
    public void createMnemonic (AbstractButton ab)
    {
        class DummyAction extends AbstractAction
        {
            public DummyAction ()
            {
                super ();
            }
        
    
            public void actionPerformed (ActionEvent e)
            {
                // Do nothing, but we need this because defined 
                // in AbstractAction
            }
        }
        
        StringBuilder name = new StringBuilder (ab.getText());
        DummyAction action = new DummyAction (ab.getText());
        int index = -1;
        
        while ((index = name.indexOf ("&", index + 1)) != -1)
        {
            if (index + 1 < name.length ())
            {
                char ch = name.charAt (index + 1);
                if (Character.isLetterOrDigit (ch))
                {
                    action.putValue (Action.MNEMONIC_KEY, (int) ch);
                    name.deleteCharAt (index);
                    action.putValue (Action.NAME, name.toString ());
                }
            }
        }
        
        ab.setAction (action);
    }

Wird anstelle von "setMnemonic" aufgerufen. "ab" ist einfach die Instanz
des entsprechenden JMenu, JMenuItem, JButton oder was auch immer..

Es gibt bestimmt eine bessere Möglichkeit, aber bei mir funktionierts erstmal...
 
G

Guest

Gast
Eine Alternative dazu ist die Verwendung von XML. Man kann einfach eine XML Datei mit allen Attributen verwenden wie z.B:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<language default = "ENG">
	<filemenutreeroot DEU="Datei" ENG="File"/>
	<filemenutreeprint DEU="Drucken" ENG="Print"/>
	<filemenutreeprintset DEU="Druckeinstellungen" ENG="Print Settings"/>
	<filemenutreeheadfoot DEU="Kopf- und Fußzeile" ENG="Header and Footer"/>
	<filemenutreeheadfootprint DEU="Ausdrucken mit Kopf- und Fußzeile" ENG="Print with Header and Footer"/>
	<filemenutreetray DEU="Ablage" ENG="Tray"/>
	<filemenutreetraymenunext DEU="nächste Ablage" ENG="Next Tray"/>
	<filemenutreetraymenuprev DEU="vorherige Ablage" ENG="Previous Tray"/>
	<filemenutreetraymenuarch DEU="Ablage archivieren" ENG="Archive the Tray"/>
	<filemenutreetraymenuclose DEU="Ablage schließen" ENG="Close the Tray"/>
</language>

Danach kannst du im Programm mit einem Attribut die aktuelle Sprache verwalten und z.B. mit einem Menüeintrag bzw. Button und der gleichen ändern.

Im Programm kannst du den Text wiefolgt auslesen:
Code:
getString("/language/viewmenutreeroot/@" + currentlanguage)
hierbei ist getString eine eigens erstellte Methode und currentlanguage eine Stringvariable welche die aktuelle Spracheinstellung enthält.

mfg Jozo
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben