Internationalization is a very hot topic, especially on desktop applications. Java offers very nice, easy-to-use and comprehensive tools for this. And, unlike Microsoft, there are not undocumented features. On what I’ll go a little bit deeper in here is not an “undocumented” feature, but a little bit harder to find documentation for. As said, localizing a Java desktop application (developed on Swing) is pretty easy and straightforward. But what is a little bit harder is to localize the Swing standard components, like a file chooser dialog or a confirmation dialog.
For changing the localized texts on this components is fairly easy: simply set a key on the UIManager.
UIManager.put(name, value);
You must do this before creating the component or call SwingUtilities.updateComponentTreeUI(rootComponent) after.
What is more difficult is to know the right names for each component. Below I described some of the most important keys, the associated Swing components and their meaning. I also attached a screenshot with a file chooser dialog to easily identify its components (on the description you will also find a number to refer to the component on the given screenshot). Please keep in mind that these are LnF dependent.
| Key name | Associated component | Description | Default value |
|---|---|---|---|
| FileChooser.openDialogTitleText | JFileChooser | The text on the title bar (open dialog) | Open |
| FileChooser.saveDialogTitleText | JFileChooser | The text on the title bar (save dialog) | Save |
| FileChooser.lookInLabelText | JFileChooser | The text for the label in front of the folder selection box (open dialog) – 1 | Look In: |
| FileChooser.saveInLabelText | JFileChooser | The text for the label in front of the folder selection box (save dialog) – 1 | Save In: |
| FileChooser.upFolderToolTipText | JFileChooser | The tooltip of the button for navigating to the parent folder – 2 | Up One Level |
| FileChooser.homeFolderToolTipText | JFileChooser | The tooltip of the button for navigating to the home folder – 3 | Desktop |
| FileChooser.newFolderToolTipText | JFileChooser | The tooltip of the button used to create a new folder – 4 | Create New Folder |
| FileChooser.listViewButtonToolTipText | JFileChooser | The tooltip of the button for switching to list view – 5 | List |
| FileChooser.detailsViewButtonToolTipText | JFileChooser | The tooltip of the button for switching to detailed view – 6 | Details |
| FileChooser.fileNameHeaderText | JFileChooser | The text placed on the header column displaying the file name in the detailed view – 7 | Name |
| FileChooser.fileSizeHeaderText | JFileChooser | The text placed on the header column displaying the file size in the detailed view – 8 | Size |
| FileChooser.fileTypeHeaderText | JFileChooser | The text placed on the header column displaying the file type in the detailed view – 9 | Type |
| FileChooser.fileDateHeaderText | JFileChooser | The text placed on the header column displaying the last modified date of the file in the detailed view – 10 | Date Modified |
| FileChooser.fileAttrHeaderText | JFileChooser | The text placed on the header column displaying the file attributes in the detailed view | Attributes |
| FileChooser.fileNameLabelText | JFileChooser | The text of the label in front of the textfield containing the selected file name – 11 | File Name: |
| FileChooser.filesOfTypeLabelText | JFileChooser | The text for the label in front of the filter selection box – 12 | Files of Type: |
| FileChooser.openButtonText | JFileChooser | The text on the button used to select the file on an open type dialog – 13 | Open |
| FileChooser.openButtonToolTipText | JFileChooser | The tooltip text for the button used to select the file on an open type dialog – 13 | Open selected file |
| FileChooser.saveButtonText | JFileChooser | The text on the button used to select the file on a save type dialog – 13 | Save |
| FileChooser.saveButtonToolTipText | JFileChooser | The tooltip text for the button used to select the file on a save type dialog – 13 | Save selected file |
| FileChooser.directoryOpenButtonText | JFileChooser | The text on the button used to open a folder while browsing – 13 | Save |
| FileChooser.directoryOpenButtonToolTipText | JFileChooser | The tooltip text for the button used to open a folder while browsing – 13 | Save selected file |
| FileChooser.cancelButtonText | JFileChooser | The text on the button used to cancel the file selection dialog – 14 | Cancel |
| FileChooser.cancelButtonToolTipText | JFileChooser | The tooltip text for the button used to cancel the file selection dialog – 14 | Abort file chooser dialog |
| FileChooser.updateButtonText | JFileChooser | ||
| FileChooser.updateButtonToolTipText | JFileChooser | ||
| FileChooser.helpButtonText | JFileChooser | ||
| FileChooser.helpButtonToolTipText | JFileChooser | ||
| FileChooser.newFolderErrorText | JFileChooser | The error text to appear when an error occurs while creating a new folder | Error creating new folder |
| FileChooser.acceptAllFileFilterText | JFileChooser | The description, to appear in the filter combobox, for the filter used in the file chooser to accept all the files. | All Files |
| OptionPane.yesButtonText | JOptionPane | The button caption for confirmation in an option dialog | Yes |
| OptionPane.noButtonText | JOptionPane | The button caption for denying an option dialog | No |
| OptionPane.cancelButtonText | JOptionPane | The button caption for aborting an option dialog | Cancel |
| ProgressMonitor.progressText | ProgressMonitor | The text for the progress monitor | Please wait |
If you want to see all the keys defined in the UIManager that paste the code below that will output them.
UIDefaults defaults = UIManager.getDefaults(); System.out.println(defaults.size()+ " properties"); for (Enumeration e = defaults.keys(); e.hasMoreElements();) { Object key = e.nextElement(); System.out.println(key + " = " + defaults.get(key)); }
This code doesn’t display the properties in the above table. Those properties are subject to localization and they could be displayed using UIManager.get(propertyName) or UIManager.getString(propertyName, locale).
