[vassalengine-svn-trunk] [vassalengine-svn] SF.net SVN: vassalengine: [2079] VASSAL-src/trunk/VASSA
Brought to you by:
rodneykinney,
uckelman
From: <rod...@us...> - 2007-05-21 03:58:55
|
Revision: 2079 http://svn.sourceforge.net/vassalengine/?rev=2079&view=rev Author: rodneykinney Date: 2007-05-20 20:58:54 -0700 (Sun, 20 May 2007) Log Message: ----------- VASSAL UI i18n fixes Modified Paths: -------------- VASSAL-src/trunk/VASSAL/Info.java VASSAL-src/trunk/VASSAL/configure/CreateInstallerAction.java VASSAL-src/trunk/VASSAL/i18n/Resources.java VASSAL-src/trunk/VASSAL/i18n/TranslateVassalWindow.java VASSAL-src/trunk/VASSAL/i18n/TranslateWindow.java VASSAL-src/trunk/VASSAL/i18n/Translation.java VASSAL-src/trunk/VASSAL/launch/Main.java Modified: VASSAL-src/trunk/VASSAL/Info.java =================================================================== --- VASSAL-src/trunk/VASSAL/Info.java 2007-05-20 09:16:12 UTC (rev 2078) +++ VASSAL-src/trunk/VASSAL/Info.java 2007-05-21 03:58:54 UTC (rev 2079) @@ -5,6 +5,7 @@ import java.awt.Insets; import java.awt.Rectangle; import java.awt.Toolkit; +import java.io.File; import java.util.StringTokenizer; /* @@ -30,129 +31,144 @@ * Class for storing release-related information */ public final class Info { - private static final String VERSION = "3.0b1"; //$NON-NLS-1$ - private static Boolean is2dEnabled; - private static Boolean isDndEnabled; - /** This class should not be instantiated */ - private Info() { - } + private static final String VERSION = "3.0b1"; //$NON-NLS-1$ - /** - * - * @return the version of the VASSAL engine - */ - public static String getVersion() { - return VERSION; - } + private static File homeDir; - /** - * - * @return true if this platform supports Swing Drag and Drop - * @deprecated Check is no longer necessary since Java 1.4+ is required - */ - public static boolean isDndEnabled() { - if (isDndEnabled == null) { - try { - Class.forName("java.awt.dnd.DropTarget"); //$NON-NLS-1$ - isDndEnabled = Boolean.TRUE; - } - catch (ClassNotFoundException e) { - isDndEnabled = Boolean.FALSE; - } - } - return isDndEnabled.booleanValue(); - } + private static Boolean is2dEnabled; - /** - * Get size of screen accounting for the screen insets (i.e. Windows taskbar) - * @return - */ - public static Rectangle getScreenBounds(Component c) { - Rectangle bounds = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); - GraphicsConfiguration config = c.getGraphicsConfiguration(); - Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(config); - bounds.translate(insets.left,insets.top); - bounds.setSize(bounds.width-insets.left-insets.right,bounds.height-insets.top-insets.bottom); - return bounds; - } + private static Boolean isDndEnabled; - /** - * @deprecated since Java 1.4 is now required - * @return true if this platform supports Java2D - */ - public static boolean is2dEnabled() { - if (is2dEnabled == null) { - try { - Class.forName("java.awt.Graphics2D"); //$NON-NLS-1$ - is2dEnabled = Boolean.TRUE; - } - catch (ClassNotFoundException e) { - is2dEnabled = Boolean.FALSE; - } - } - return is2dEnabled.booleanValue(); - } + /** This class should not be instantiated */ + private Info() { + } - public static boolean isMacOsX() { - String os = System.getProperty("os.name"); //$NON-NLS-1$ - return os.toLowerCase().indexOf("mac") >= 0 //$NON-NLS-1$ - && os.toLowerCase().indexOf("x") > 0; //$NON-NLS-1$ - } + /** + * + * @return the version of the VASSAL engine + */ + public static String getVersion() { + return VERSION; + } - /** - * - * A valid verson format is "w.x.y[bz]", where - * 'w','x','y', and 'z' are integers. - * @return a negative number if <code>v2</code> is a later version - * the <code>v1</code>, a positive number if an earlier version, - * or zero if the versions are the same. - * - */ - public static int compareVersions(String v1, String v2) { - try { - int beta1 = v1.indexOf("b"); //$NON-NLS-1$ - int beta2 = v2.indexOf("b"); //$NON-NLS-1$ - if (beta1 > 0) { - if (beta2 > 0) { - return compareVersions(v1.substring(0, beta1), v2.substring(0, beta2)) < 0 ? - -1 : Integer.parseInt(v1.substring(beta1 + 1)) - - Integer.parseInt(v2.substring(beta2 + 1)); - } - else { - return compareVersions(v1.substring(0, beta1), v2) - > 0 ? 1 : -1; - } - } - else if (beta2 > 0) { - return compareVersions(v1, v2.substring(0, beta2)) - < 0 ? -1 : 1; - } - else { - StringTokenizer s1 = new StringTokenizer(v1, "."); //$NON-NLS-1$ - StringTokenizer s2 = new StringTokenizer(v2, "."); //$NON-NLS-1$ - while (s1.hasMoreTokens() - && s2.hasMoreTokens()) { - int comp = Integer.parseInt(s1.nextToken()) - - Integer.parseInt(s2.nextToken()); - if (comp != 0) { - return comp; - } - } - if (s1.hasMoreTokens()) { - return 1; - } - else if (s2.hasMoreTokens()) { - return -1; - } - else { - return 0; - } - } - } - catch (NumberFormatException ex) { - System.err.println("Invalid version format :" + v1 + ", " + v2); //$NON-NLS-1$ //$NON-NLS-2$ - return 0; - } - } + /** + * + * @return true if this platform supports Swing Drag and Drop + * @deprecated Check is no longer necessary since Java 1.4+ is required + */ + public static boolean isDndEnabled() { + if (isDndEnabled == null) { + try { + Class.forName("java.awt.dnd.DropTarget"); //$NON-NLS-1$ + isDndEnabled = Boolean.TRUE; + } catch (ClassNotFoundException e) { + isDndEnabled = Boolean.FALSE; + } + } + return isDndEnabled.booleanValue(); + } + /** + * Get size of screen accounting for the screen insets (i.e. Windows + * taskbar) + * + * @return + */ + public static Rectangle getScreenBounds(Component c) { + Rectangle bounds = new Rectangle(Toolkit.getDefaultToolkit() + .getScreenSize()); + GraphicsConfiguration config = c.getGraphicsConfiguration(); + Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(config); + bounds.translate(insets.left, insets.top); + bounds.setSize(bounds.width - insets.left - insets.right, bounds.height + - insets.top - insets.bottom); + return bounds; + } + + /** + * @deprecated since Java 1.4 is now required + * @return true if this platform supports Java2D + */ + public static boolean is2dEnabled() { + if (is2dEnabled == null) { + try { + Class.forName("java.awt.Graphics2D"); //$NON-NLS-1$ + is2dEnabled = Boolean.TRUE; + } catch (ClassNotFoundException e) { + is2dEnabled = Boolean.FALSE; + } + } + return is2dEnabled.booleanValue(); + } + + public static boolean isMacOsX() { + String os = System.getProperty("os.name"); //$NON-NLS-1$ + return os.toLowerCase().indexOf("mac") >= 0 //$NON-NLS-1$ + && os.toLowerCase().indexOf("x") > 0; //$NON-NLS-1$ + } + + /** + * + * A valid verson format is "w.x.y[bz]", where 'w','x','y', and 'z' are + * integers. + * + * @return a negative number if <code>v2</code> is a later version the + * <code>v1</code>, a positive number if an earlier version, or + * zero if the versions are the same. + * + */ + public static int compareVersions(String v1, String v2) { + try { + int beta1 = v1.indexOf("b"); //$NON-NLS-1$ + int beta2 = v2.indexOf("b"); //$NON-NLS-1$ + if (beta1 > 0) { + if (beta2 > 0) { + return compareVersions(v1.substring(0, beta1), v2 + .substring(0, beta2)) < 0 ? -1 : Integer + .parseInt(v1.substring(beta1 + 1)) + - Integer.parseInt(v2.substring(beta2 + 1)); + } else { + return compareVersions(v1.substring(0, beta1), v2) > 0 ? 1 + : -1; + } + } else if (beta2 > 0) { + return compareVersions(v1, v2.substring(0, beta2)) < 0 ? -1 : 1; + } else { + StringTokenizer s1 = new StringTokenizer(v1, "."); //$NON-NLS-1$ + StringTokenizer s2 = new StringTokenizer(v2, "."); //$NON-NLS-1$ + while (s1.hasMoreTokens() && s2.hasMoreTokens()) { + int comp = Integer.parseInt(s1.nextToken()) + - Integer.parseInt(s2.nextToken()); + if (comp != 0) { + return comp; + } + } + if (s1.hasMoreTokens()) { + return 1; + } else if (s2.hasMoreTokens()) { + return -1; + } else { + return 0; + } + } + } catch (NumberFormatException ex) { + System.err.println("Invalid version format :" + v1 + ", " + v2); //$NON-NLS-1$ //$NON-NLS-2$ + return 0; + } + } + + public static File getHomeDir() { + if (homeDir == null) { + homeDir = new File(System.getProperty("user.home"), "VASSAL"); //$NON-NLS-1$ //$NON-NLS-2$ + if (!homeDir.exists()) { + homeDir.mkdir(); + } else if (!homeDir.isDirectory()) { + homeDir.delete(); + homeDir.mkdir(); + } + } + return homeDir; + + } + } Modified: VASSAL-src/trunk/VASSAL/configure/CreateInstallerAction.java =================================================================== --- VASSAL-src/trunk/VASSAL/configure/CreateInstallerAction.java 2007-05-20 09:16:12 UTC (rev 2078) +++ VASSAL-src/trunk/VASSAL/configure/CreateInstallerAction.java 2007-05-21 03:58:54 UTC (rev 2079) @@ -201,7 +201,6 @@ } public static void main(String[] args) throws Exception { - Resources.init(new File(System.getProperty("user.dir"))); //$NON-NLS-1$ Prefs globalPrefs = new Prefs(new PrefsEditor(new ArchiveWriter("pref")), "VASSAL"); //$NON-NLS-1$ //$NON-NLS-2$ GameModule.init(new BasicModule(new ArchiveWriter(args[0]), globalPrefs)); new CreateInstallerAction(null).actionPerformed(null); Modified: VASSAL-src/trunk/VASSAL/i18n/Resources.java =================================================================== --- VASSAL-src/trunk/VASSAL/i18n/Resources.java 2007-05-20 09:16:12 UTC (rev 2078) +++ VASSAL-src/trunk/VASSAL/i18n/Resources.java 2007-05-21 03:58:54 UTC (rev 2079) @@ -19,241 +19,265 @@ package VASSAL.i18n; import java.io.File; -import java.io.FileInputStream; +import java.net.MalformedURLException; import java.net.URL; import java.text.MessageFormat; import java.util.Date; import java.util.Enumeration; import java.util.Locale; import java.util.ResourceBundle; + import javax.swing.UIManager; +import VASSAL.Info; + public class Resources { - /* - * Translation of VASSAL is handled by standard Java I18N tools. - * - * vassalBundle - Resource Bundle for the VASSAL player interface - * editorBundle - Resource Bundle for the Module Editor - * - * These are implemented as PropertyResourceBundles, normally to be - * found in the VASSAL jar file. VASSAL will search first in the VASSAL - * install directory for bundles, then follow the standard Java Class Path - */ - protected static ResourceBundle vassalBundle; - protected static ResourceBundle editorBundle; - - protected static String VASSAL_BUNDLE = "VASSAL.i18n.VASSAL"; //$NON-NLS-1$ - protected static String EDITOR_BUNDLE = "VASSAL.i18n.Editor"; //$NON-NLS-1$ + /* + * Translation of VASSAL is handled by standard Java I18N tools. + * + * vassalBundle - Resource Bundle for the VASSAL player interface + * editorBundle - Resource Bundle for the Module Editor + * + * These are implemented as PropertyResourceBundles, normally to be found in + * the VASSAL jar file. VASSAL will search first in the VASSAL install + * directory for bundles, then follow the standard Java Class Path + */ + protected static ResourceBundle vassalBundle; - public static Enumeration getVassalKeys() { - return vassalBundle.getKeys(); - } - - public static Enumeration getEditorKeys() { - return editorBundle.getKeys(); - } - /* - * Translation of individual modules is handled differently. There may be - * multiple Module.properties file active - Potentially one in the module - * plus one in each Extension loaded. These will be read into UberProperties - * structures with each file loaded supplying defaults for subsequent files. - */ - protected static String MODULE_BUNDLE = "Module"; //$NON-NLS-1$ - - /* - * Commonly used i18n keys used in multiple components. By defining them - * centrally, they will only have to be translated once. Reference to these - * string should be made as follows: - * - * Resources.getString(Resources.VASSAL) - */ - public static final String VASSAL = "General.VASSAL"; //$NON-NLS-1$ - public static final String ADD = "General.add"; //$NON-NLS-1$ - public static final String REMOVE = "General.remove"; //$NON-NLS-1$ - public static final String INSERT = "General.insert"; //$NON-NLS-1$ - public static final String YES = "General.yes"; //$NON-NLS-1$ - public static final String NO = "General.no"; //$NON-NLS-1$ - public static final String CANCEL = "General.cancel"; //$NON-NLS-1$ - public static final String SAVE = "General.save"; //$NON-NLS-1$ - public static final String OK = "General.ok"; //$NON-NLS-1$ - public static final String MENU = "General.menu"; //$NON-NLS-1$ - public static final String LOAD = "General.load"; //$NON-NLS-1$ - public static final String QUIT = "General.quit"; //$NON-NLS-1$ - public static final String EDIT = "General.edit"; //$NON-NLS-1$ - public static final String NEW = "General.new"; //$NON-NLS-1$ - public static final String FILE = "General.file"; //$NON-NLS-1$ - public static final String HELP = "General.help"; //$NON-NLS-1$ - public static final String CLOSE = "General.close"; //$NON-NLS-1$ - public static final String DATE_DISPLAY = "General.date_display"; //$NON-NLS-1$ - public static final String NEXT = "General.next"; //$NON-NLS-1$ - public static final String REFRESH = "General.refresh"; //$NON-NLS-1$ - - /* - * All i18n keys for the Module Editor must commence with "Editor.", This - * allows us to use a single Resources.getString() call for both resource - * bundles. - */ - public static final String EDITOR_PREFIX = "Editor."; //$NON-NLS-1$ - - /* - * Common Editor labels that appear in many components. - */ - public static final String BUTTON_TEXT = "Editor.button_text_label"; //$NON-NLS-1$ - public static final String TOOLTIP_TEXT = "Editor.tooltip_text_label"; //$NON-NLS-1$ - public static final String BUTTON_ICON = "Editor.button_icon_label"; //$NON-NLS-1$ - public static final String HOTKEY_LABEL = "Editor.hotkey_label"; //$NON-NLS-1$ - public static final String COLOR_LABEL = "Editor.color_label"; //$NON-NLS-1$ - public static final String NAME_LABEL = "Editor.name_label"; //$NON-NLS-1$ + protected static ResourceBundle editorBundle; - /* - * init() is called by Main() very early in the VASSAL initialization sequence - * to supply the name of the VASSAL install directory before any strings have - * been translated. This allows us to find a possible over-riding properties - * file in the home directory. - * - * Also update the UIManagaer with translations of Yes/No/Cancel/Ok for the - * JOptionPane buttons. - */ - public static File homeDir; - public static void init(File dir) { - homeDir = dir; - } - - static { - UIManager.put("OptionPane.yesButtonText", getString(YES)); //$NON-NLS-1$ - UIManager.put("OptionPane.cancelButtonText", getString(CANCEL)); //$NON-NLS-1$ - UIManager.put("OptionPane.noButtonText", getString(NO)); //$NON-NLS-1$ - UIManager.put("OptionPane.okButtonText", getString(OK)); //$NON-NLS-1$ - } - - /** - * Localize a user interface String. - * - * @param id String Id - * @return Localized result - */ - public static String getString(String id) { - if (id.startsWith(EDITOR_PREFIX)) { - return getEditorString(id); - } - else { - return getVassalString(id); - } - } - - /** - * Localize a VASSAL user interface string - * @param id String id - * @return Localized result - */ - public static String getVassalString(String id) { - if (vassalBundle == null) { - vassalBundle = ResourceBundle.getBundle(VASSAL_BUNDLE, Locale.getDefault(), homeDir == null ? Resources.class.getClassLoader() : new VassalPropertyClassLoader()); - } - return getString(vassalBundle, id); - } - - /** - * Localize a VASSAL Module Editor String - * @param id String Id - * @return Localized Result - */ - public static String getEditorString(String id) { - if (editorBundle == null) { - editorBundle = ResourceBundle.getBundle(EDITOR_BUNDLE, Locale.getDefault(), homeDir == null ? Resources.class.getClassLoader() : new VassalPropertyClassLoader()); - } - return getString(editorBundle, id); - } - - /** - * Localize a string using the supplied resource bundle - * - * @param bundle Resource bundle - * @param id String Id - * @return Localized result - */ - public static String getString(ResourceBundle bundle, String id) { - - String s = null; - - try { - s = bundle.getString(id); - } - catch (Exception ex) { - System.err.println("No Translation: " + id); - } - - // 2. Worst case, return the key - if (s == null) { - s = id; - } - - return s; - } + protected static String EDITOR_BUNDLE = "VASSAL.i18n.Editor"; //$NON-NLS-1$ - /* - * Format a string with options. - * Convenience methods for most common case of one or two parameters. - * Will be heavily used, so try and minimise the number of Object arrays being created - */ - public static MessageFormat formatter = new MessageFormat(""); //$NON-NLS-1$ - public static Object[] object1 = new Object[1]; - public static Object[] object2 = new Object[2]; + protected static String VASSAL_BUNDLE = "VASSAL.i18n.VASSAL"; //$NON-NLS-1$ - public static String getString(String id, Date date) { - formatter.applyPattern(getString(id)); - object1[0] = date; - return formatter.format(object1); - } - - public static String getString(String id, String option) { - formatter.applyPattern(getString(id)); - object1[0] = option; - return formatter.format(object1); - } + public static Enumeration getVassalKeys() { + return vassalBundle.getKeys(); + } - public static String getString(String id, String option0, String option1) { - formatter.applyPattern(getString(id)); - object2[0] = option0; - object2[1] = option1; - return formatter.format(object2); - } - - public static String getString (String id, String[] options) { - formatter.applyPattern(getString(id)); - return formatter.format(options); - } - - /** - * Custom Class Loader for loading VASSAL property files. - * Check first for files in the VASSAL home directory - * - * @author Brent Easton - * - */ - public static class VassalPropertyClassLoader extends ClassLoader { - public URL getResource(String name) { - URL url = null; - String propFileName = name.substring(name.lastIndexOf('/')+1); - File propFile = new File(homeDir, propFileName); - - try { - FileInputStream in = new FileInputStream(propFile); - in.close(); - url = new URL("file", "", propFile.getCanonicalPath()); //$NON-NLS-1$ //$NON-NLS-2$ - } - catch (Exception e) { - } - - /* - * No openable file in Doc dir, so let Java find one for us in the standard classpath. - */ - if (url == null) { - url = Resources.class.getClassLoader().getResource(name); - } - return url; - } - } + public static Enumeration getEditorKeys() { + return editorBundle.getKeys(); + } + /* + * Translation of individual modules is handled differently. There may be + * multiple Module.properties file active - Potentially one in the module + * plus one in each Extension loaded. These will be read into UberProperties + * structures with each file loaded supplying defaults for subsequent files. + */ + protected static String MODULE_BUNDLE = "Module"; //$NON-NLS-1$ + + /* + * Commonly used i18n keys used in multiple components. By defining them + * centrally, they will only have to be translated once. Reference to these + * string should be made as follows: + * + * Resources.getString(Resources.VASSAL) + */ + public static final String VASSAL = "General.VASSAL"; //$NON-NLS-1$ + + public static final String ADD = "General.add"; //$NON-NLS-1$ + + public static final String REMOVE = "General.remove"; //$NON-NLS-1$ + + public static final String INSERT = "General.insert"; //$NON-NLS-1$ + + public static final String YES = "General.yes"; //$NON-NLS-1$ + + public static final String NO = "General.no"; //$NON-NLS-1$ + + public static final String CANCEL = "General.cancel"; //$NON-NLS-1$ + + public static final String SAVE = "General.save"; //$NON-NLS-1$ + + public static final String OK = "General.ok"; //$NON-NLS-1$ + + public static final String MENU = "General.menu"; //$NON-NLS-1$ + + public static final String LOAD = "General.load"; //$NON-NLS-1$ + + public static final String QUIT = "General.quit"; //$NON-NLS-1$ + + public static final String EDIT = "General.edit"; //$NON-NLS-1$ + + public static final String NEW = "General.new"; //$NON-NLS-1$ + + public static final String FILE = "General.file"; //$NON-NLS-1$ + + public static final String HELP = "General.help"; //$NON-NLS-1$ + + public static final String CLOSE = "General.close"; //$NON-NLS-1$ + + public static final String DATE_DISPLAY = "General.date_display"; //$NON-NLS-1$ + + public static final String NEXT = "General.next"; //$NON-NLS-1$ + + public static final String REFRESH = "General.refresh"; //$NON-NLS-1$ + + /* + * All i18n keys for the Module Editor must commence with "Editor.", This + * allows us to use a single Resources.getString() call for both resource + * bundles. + */ + public static final String EDITOR_PREFIX = "Editor."; //$NON-NLS-1$ + + /* + * Common Editor labels that appear in many components. + */ + public static final String BUTTON_TEXT = "Editor.button_text_label"; //$NON-NLS-1$ + + public static final String TOOLTIP_TEXT = "Editor.tooltip_text_label"; //$NON-NLS-1$ + + public static final String BUTTON_ICON = "Editor.button_icon_label"; //$NON-NLS-1$ + + public static final String HOTKEY_LABEL = "Editor.hotkey_label"; //$NON-NLS-1$ + + public static final String COLOR_LABEL = "Editor.color_label"; //$NON-NLS-1$ + + public static final String NAME_LABEL = "Editor.name_label"; //$NON-NLS-1$ + + static { + UIManager.put("OptionPane.yesButtonText", getString(YES)); //$NON-NLS-1$ + UIManager.put("OptionPane.cancelButtonText", getString(CANCEL)); //$NON-NLS-1$ + UIManager.put("OptionPane.noButtonText", getString(NO)); //$NON-NLS-1$ + UIManager.put("OptionPane.okButtonText", getString(OK)); //$NON-NLS-1$ + } + + /** + * Localize a user interface String. + * + * @param id + * String Id + * @return Localized result + */ + public static String getString(String id) { + if (id.startsWith(EDITOR_PREFIX)) { + return getEditorString(id); + } else { + return getVassalString(id); + } + } + + /** + * Localize a VASSAL user interface string + * + * @param id + * String id + * @return Localized result + */ + public static String getVassalString(String id) { + if (vassalBundle == null) { + vassalBundle = ResourceBundle.getBundle(VASSAL_BUNDLE, Locale + .getDefault(), new VassalPropertyClassLoader()); + } + return getString(vassalBundle, id); + } + + /** + * Localize a VASSAL Module Editor String + * + * @param id + * String Id + * @return Localized Result + */ + public static String getEditorString(String id) { + if (editorBundle == null) { + editorBundle = ResourceBundle.getBundle(EDITOR_BUNDLE, Locale + .getDefault(), new VassalPropertyClassLoader()); + } + return getString(editorBundle, id); + } + + /** + * Localize a string using the supplied resource bundle + * + * @param bundle + * Resource bundle + * @param id + * String Id + * @return Localized result + */ + public static String getString(ResourceBundle bundle, String id) { + + String s = null; + + try { + s = bundle.getString(id); + } catch (Exception ex) { + System.err.println("No Translation: " + id); + } + + // 2. Worst case, return the key + if (s == null) { + s = id; + } + + return s; + } + + /* + * Format a string with options. Convenience methods for most common case of + * one or two parameters. Will be heavily used, so try and minimise the + * number of Object arrays being created + */ + public static MessageFormat formatter = new MessageFormat(""); //$NON-NLS-1$ + + public static Object[] object1 = new Object[1]; + + public static Object[] object2 = new Object[2]; + + public static String getString(String id, Date date) { + formatter.applyPattern(getString(id)); + object1[0] = date; + return formatter.format(object1); + } + + public static String getString(String id, String option) { + formatter.applyPattern(getString(id)); + object1[0] = option; + return formatter.format(object1); + } + + public static String getString(String id, String option0, String option1) { + formatter.applyPattern(getString(id)); + object2[0] = option0; + object2[1] = option1; + return formatter.format(object2); + } + + public static String getString(String id, String[] options) { + formatter.applyPattern(getString(id)); + return formatter.format(options); + } + + /** + * Custom Class Loader for loading VASSAL property files. Check first for + * files in the VASSAL home directory + * + * @author Brent Easton + * + */ + public static class VassalPropertyClassLoader extends ClassLoader { + public URL getResource(String name) { + URL url = null; + String propFileName = name.substring(name.lastIndexOf('/') + 1); + File propFile = new File(Info.getHomeDir(), propFileName); + if (propFile.exists()) { + try { + url = propFile.toURL(); + } catch (MalformedURLException e) { + } + } + + /* + * No openable file in home dir, so let Java find one for us in the + * standard classpath. + */ + if (url == null) { + url = this.getClass().getClassLoader().getResource(name); + } + return url; + } + } + } \ No newline at end of file Modified: VASSAL-src/trunk/VASSAL/i18n/TranslateVassalWindow.java =================================================================== --- VASSAL-src/trunk/VASSAL/i18n/TranslateVassalWindow.java 2007-05-20 09:16:12 UTC (rev 2078) +++ VASSAL-src/trunk/VASSAL/i18n/TranslateVassalWindow.java 2007-05-21 03:58:54 UTC (rev 2079) @@ -15,6 +15,7 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; +import VASSAL.Info; import VASSAL.build.GameModule; import VASSAL.build.module.documentation.HelpWindow; import VASSAL.configure.ConfigureTree; @@ -33,6 +34,7 @@ public TranslateVassalWindow(Frame owner) { super(owner, false, new VassalTranslation(), null, null); currentTranslation = (Translation) target; + keyTable.setEnabled(true); newTranslation(); } @@ -108,11 +110,7 @@ if (fc.showOpenDialog(this) != FileChooser.APPROVE_OPTION) return; File file = fc.getSelectedFile(); - if (! file.getName().startsWith(Resources.MODULE_BUNDLE)) { - loadError("Module Properties files must start with 'Module_'."); - return; - } - else if (! file.getName().endsWith(".properties")) { + if (! file.getName().endsWith(".properties")) { loadError("Module Properties files must end in '.properties'."); return; } @@ -147,25 +145,17 @@ protected boolean saveTranslation() { FileChooser fc = GameModule.getGameModule().getFileChooser(); Locale l = localeConfig.getValueLocale(); - String bundle = Resources.MODULE_BUNDLE + "_" + l.getLanguage(); + String bundle = "VASSAL_" + l.getLanguage(); if (l.getCountry() != null && l.getCountry().length() > 0) { bundle += "_" + l.getCountry(); } bundle += ".properties"; - fc.setSelectedFile(new File(bundle)); + fc.setSelectedFile(new File(Info.getHomeDir(),bundle)); if (fc.showSaveDialog(this) != FileChooser.APPROVE_OPTION) return false; File outputFile = fc.getSelectedFile(); - if (outputFile != null && - outputFile.exists() && - JOptionPane.NO_OPTION == - JOptionPane.showConfirmDialog(GameModule.getGameModule().getFrame(), - outputFile.getName() + " already exists. OK to overwrite?", "File Exists", - JOptionPane.YES_NO_OPTION)) { - return false; - } try { ((VassalTranslation) target).saveProperties(outputFile, localeConfig.getValueLocale()); } Modified: VASSAL-src/trunk/VASSAL/i18n/TranslateWindow.java =================================================================== --- VASSAL-src/trunk/VASSAL/i18n/TranslateWindow.java 2007-05-20 09:16:12 UTC (rev 2078) +++ VASSAL-src/trunk/VASSAL/i18n/TranslateWindow.java 2007-05-21 03:58:54 UTC (rev 2079) @@ -220,7 +220,7 @@ }); keyTable.getSelectionModel().addListSelectionListener(this); - keyTable.setEnabled(Language.getTranslationList().length > 0); + keyTable.setEnabled(currentTranslation != null); JScrollPane keyScroll = new JScrollPane(keyTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); Modified: VASSAL-src/trunk/VASSAL/i18n/Translation.java =================================================================== --- VASSAL-src/trunk/VASSAL/i18n/Translation.java 2007-05-20 09:16:12 UTC (rev 2078) +++ VASSAL-src/trunk/VASSAL/i18n/Translation.java 2007-05-21 03:58:54 UTC (rev 2079) @@ -120,7 +120,12 @@ * property value */ public void setProperty(String key, String value) { - getProperties().setProperty(key, value); + if (value == null || value.length() == 0) { + getProperties().remove(key); + } + else { + getProperties().setProperty(key, value); + } dirty = true; } @@ -156,10 +161,16 @@ if (localProperties == null) { localProperties = new Properties(); } - in = GameModule.getGameModule().getDataArchive().getFileStream(bundle); - localProperties.load(in); + try { + in = GameModule.getGameModule().getDataArchive().getFileStream(bundle); + } catch (IOException e) { + // properties have not been saved yet + } + if (in != null) { + localProperties.load(in); + in.close(); + } dirty = false; - in.close(); } protected VassalResourceBundle getBundle() throws IOException { Modified: VASSAL-src/trunk/VASSAL/launch/Main.java =================================================================== --- VASSAL-src/trunk/VASSAL/launch/Main.java 2007-05-20 09:16:12 UTC (rev 2078) +++ VASSAL-src/trunk/VASSAL/launch/Main.java 2007-05-21 03:58:54 UTC (rev 2079) @@ -23,6 +23,7 @@ import java.util.Properties; import java.util.StringTokenizer; import java.util.zip.ZipFile; + import javax.swing.Action; import javax.swing.Box; import javax.swing.BoxLayout; @@ -37,6 +38,8 @@ import javax.swing.SwingUtilities; import javax.swing.WindowConstants; import javax.swing.border.TitledBorder; + +import VASSAL.Info; import VASSAL.build.GameModule; import VASSAL.build.IllegalBuildException; import VASSAL.build.module.Documentation; @@ -65,12 +68,9 @@ protected boolean isFirstTime; protected boolean builtInModule; protected Prefs globalPrefs; - protected File homeDir; public Main(final String[] args) { System.setProperty("swing.aatext", "true"); //$NON-NLS-1$ //$NON-NLS-2$ System.setProperty("swing.boldMetal", "false"); //$NON-NLS-1$ //$NON-NLS-2$ - initHomeDir(); - initResources(); initProperties(); System.err.println("-- OS " + System.getProperty("os.name")); //$NON-NLS-1$ //$NON-NLS-2$ System.err.println("-- Java version " + System.getProperty("java.version")); //$NON-NLS-1$ //$NON-NLS-2$ @@ -141,7 +141,7 @@ } protected File initPrefsFile() { - File prefsFile = new File(homeDir, "Preferences"); //$NON-NLS-1$ + File prefsFile = new File(Info.getHomeDir(), "Preferences"); //$NON-NLS-1$ File oldFile = new File(System.getProperty("user.home") //$NON-NLS-1$ + File.separator + ".VassalPreferences"); //$NON-NLS-1$ if (!prefsFile.exists() @@ -151,21 +151,6 @@ return prefsFile; } - protected void initHomeDir() { - homeDir = new File(System.getProperty("user.home"), "VASSAL"); //$NON-NLS-1$ //$NON-NLS-2$ - if (!homeDir.exists()) { - homeDir.mkdir(); - } - else if (!homeDir.isDirectory()) { - homeDir.delete(); - homeDir.mkdir(); - } - } - - protected void initResources() { - Resources.init(homeDir); - } - protected void newExtension() { ModuleExtension ext = new ModuleExtension(new ArchiveWriter((String) null)); ext.build(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ vassalengine-svn mailing list vas...@li... https://lists.sourceforge.net/lists/listinfo/vassalengine-svn |