S
scooterJava
Gast
Ich versuche seit Tagen, Java davon zu überzeugen, auf Knopfdruck die Sprache des Frames umzustellen.
Dazu habe ich folgendes Testprogramm:
Die Properties-Dateien liegen korrekt vor; syntaktisch ist auch alles in Ordnung. Tatsächlich setzt Java die neue Locale bei "... getLocale()" am Codeende. "getBundle()" wird dann offenbar auch ausgeführt, zeigt aber keine Wirkung. Aus Verweiflung habe ich noch ein "updateUI()" angefügt; aber auch "repaint()" zeigt keine Wirkung.
Ich kann mir kaum vorstellen, dass eine so weit verbreitete Entwicklerplattform wie Java keine vernünftige kurze Sprachumstellung bietet. Im Netz finde ich nur Aussagen wie "So müsste es gehen" bis "Geht nicht, wenn du Java nicht neu startest oder jeder Komponente selber einen neuen Text zuweist". Komme ich wirklich bei einer Anwendung wie Java nicht umhin, etwas zu schreiben wie:
Dazu habe ich folgendes Testprogramm:
Code:
package test;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class Test
extends JFrame
implements ActionListener
{
private static final long serialVersionUID = 1L;
private static ResourceBundle messages;
private static String language = "en";
private static String country = "US";
private static JPanel panel = new JPanel();
private static Locale currentLocale = new Locale( language, country );
static public void main( String[] args )
{
Test window = new Test();
window.setLocationRelativeTo( null );
window.setDefaultCloseOperation( EXIT_ON_CLOSE );
window.pack();
window.setVisible( true );
}
public Test()
{
messages = ResourceBundle.getBundle( "Test.Test", currentLocale );
panel.setLayout( new FlowLayout( FlowLayout.RIGHT ) );
JPanel panelForm = new JPanel();
JButton btnDE = new JButton( messages.getString( "Deutsch" ) );
JButton btnEN = new JButton( messages.getString( "Englisch" ) );
btnDE.addActionListener( this );
btnEN.addActionListener( this );
panelForm.add( btnDE );
panelForm.add( btnEN );
panel.add( panelForm );
add( panel );
System.out.println( messages.getString( "Deutsch" ) );
System.out.println( messages.getString( "Englisch" ) );
}
public void actionPerformed( ActionEvent ae )
{
String action = ae.getActionCommand();
String[] actions = { messages.getString( "Deutsch" ),
messages.getString( "Englisch" ) };
LinkedList<String> actionslist = new LinkedList<String>( Arrays
.asList( actions ) );
int langIndex = 1 + actionslist.indexOf( action );
switch( langIndex )
{
case 1: // Deutsch
switchLanguage( "de", "DE" );
break;
case 2: // Englisch
switchLanguage( "en", "US" );
break;
}
}
private void switchLanguage( String language, String country )
{
panel.setLocale( new Locale( language, country ) );
System.out.println( panel.getLocale() );
messages = ResourceBundle.getBundle( "Test.Test", currentLocale );
panel.updateUI();
}
}
Die Properties-Dateien liegen korrekt vor; syntaktisch ist auch alles in Ordnung. Tatsächlich setzt Java die neue Locale bei "... getLocale()" am Codeende. "getBundle()" wird dann offenbar auch ausgeführt, zeigt aber keine Wirkung. Aus Verweiflung habe ich noch ein "updateUI()" angefügt; aber auch "repaint()" zeigt keine Wirkung.
Ich kann mir kaum vorstellen, dass eine so weit verbreitete Entwicklerplattform wie Java keine vernünftige kurze Sprachumstellung bietet. Im Netz finde ich nur Aussagen wie "So müsste es gehen" bis "Geht nicht, wenn du Java nicht neu startest oder jeder Komponente selber einen neuen Text zuweist". Komme ich wirklich bei einer Anwendung wie Java nicht umhin, etwas zu schreiben wie:
Code:
void switchLanguage( ...)
{
// ...
btnDE.setText( messages.getString("Deutsch"));
// usw.
}
Das haben ja andere Entwicklungsumgebungen wie Trolltechs Qt viel besser gelöst!