Providing a Multilingual GUI
|
When generating code SpeedJG strictly follows the MVC approach
by separating the GUI (view) code from the controller code and
the model code, which is up to you as the developer.
To take advantage of this separation, we will show how to easily implement
a multilingual application by passing an entire GUI to a translator
class that adjusts all text properties according to the language
the user prefers.
|
|
To achieve our goals we will develop a GuiTranslator class that
reads all text properties to be assigned from an XML file, stores
them locally, and translates our GUI on demand.
The structure of this file corresponds to the task the translator
has to accomplish. On the top level we define the elements for the
GUIs to be translated. This may be the name of the top-level
element / container (e.g. JFrame, JDialog, etc.) hosted by the
GUIObject (view) to be translated, or a name you internally assign
to the GUIObject. On the next level we define the items of the
GUIObject to be translated and on the lowest level the properties
of the items that are to be affected.
The names of these property elements signalize to the translator
to accomplish a particular task and are defined as:
- accelerator
to set the keyboard accelerator of a JMenuItem;
- items
to set the items of a JComboBox;
- mnemonic
to set the mnemonic (a single underline below the character that represents
the shortcut) of an AbstractButton (JButton, JToggleButton,
JCheckBox, JRadioButton, JMenuItem, JMenu, JCheckBoxMenuItem, JRadioButtonMenuItem);
- tabtitle
to set the name of a component layed out on a JTabbedPane;
- text
to set the text of a JLabel or an AbstractButton (JButton, JToggleButton,
JCheckBox, JRadioButton, JMenuItem, JMenu, JCheckBoxMenuItem, JRadioButtonMenuItem);
- title
to set the title of a JDialog or JFrame;
- tooltip
to set the tooltip (the small window of text that pops up when the user moves
the mouse over the target component) of a JComponent;
and the attribute values of these property elements hold the specific language
texts (see below for the fraction of the
XML translation file
used in this example).
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<GuiTranslationRepository>
<guiTranslationExample>
<cbState>
<items de="Frankreich|Deutschland|USA|..." en="France|Germany|USA|..." />
</cbState>
<emCopy>
<accelerator de="C" en="C" />
<mnemonic de="k" en="c" />
<text de="Kopieren" en="Copy" />
</emCopy>
<guiTranslationExample>
<title de="Mehrsprachige Anwendung" en="Multilingual Application" />
</guiTranslationExample>
<tbCopy>
<tooltip de="Kopieren" en="Copy" />
</tbCopy>
</guiTranslationExample>
</GuiTranslationRepository>
|
As a GUIObject generated by SpeedJG provides access to all contained
components by their name it's an easy task for the
translator class
to scan the translation repository file and set the properties
according to the defined entries.
If you want to see how all this blends in and wish to experiment
with an example program, store the following files into a
directory of your choice and subsequently compile them:
| Multilingual GUI Example Application Files |
|
GUIObject.java
|
Superclass of all view classes generated by SpeedJG.
|
|
GuiTranslationExample.java
|
Main class generated by SpeedJG and modified for this example.
|
|
GuiTranslationExampleController.java
|
Generated by SpeedJG.
|
|
GuiTranslator.java
|
Translator class for setting translated text properties of a view.
|
|
GuiTranslationRepository.xml
|
XML file containing all text properties to be set by the translator.
|
|
jlfgr-1_0.jar
|
Java look and feel Graphics Repository provided by Sun Microsystems. The buttons of
this example application display images contained in this .jar file.
Download and un-zip the jlfgr-1_0.zip
file and place the jlfgr-1_0.jar file on your
CLASSPATH.
|