Localizing JavaFx Controls

后端 未结 4 1618
悲哀的现实
悲哀的现实 2020-12-10 19:11

I am trying add a ResourceBundle for my language for the JavaFx controls but am failing to do so.

I tried to add controls_fi_FI.properties in the classpath.. and hop

4条回答
  •  隐瞒了意图╮
    2020-12-10 19:40

    I created Simple "Hello, world!" example showing a ready to roll JavaFX project using multiple-language support is for those who need some more exotic language (be-BY, ru-RU etc.)

    Here's how I solved the problem, it works for me

    Messages.java

    /**
     * The class with all messages of this application.
     */
    public abstract class Messages {
    
        private static ResourceBundle BUNDLE;
    
        private static final String FIELD_NAME = "lookup";
        private static final String BUNDLE_NAME = "messages/messages";
        private static final String CONTROLS_BUNDLE_NAME = "com/sun/javafx/scene/control/skin/resources/controls";
    
        public static final String MAIN_APP_TITLE;
    
        public static final String DIALOG_HEADER;
        public static final String MAIN_CONTROLLER_CONTENT_TEXT;
        public static final String MAIN_CONTROLLER_HELLO_TEXT;
        public static final String MAIN_CONTROLLER_GOODBYE_TEXT;
    
        static {
            final Locale locale = Locale.getDefault();
            final ClassLoader classLoader = ControlResources.class.getClassLoader();
    
            final ResourceBundle controlBundle = getBundle(CONTROLS_BUNDLE_NAME,
                    locale, classLoader, PropertyLoader.getInstance());
    
            final ResourceBundle overrideBundle = getBundle(CONTROLS_BUNDLE_NAME,
                    PropertyLoader.getInstance());
    
            final Map override = getUnsafeFieldValue(overrideBundle, FIELD_NAME);
            final Map original = getUnsafeFieldValue(controlBundle, FIELD_NAME);
    
            //noinspection ConstantConditions,ConstantConditions,unchecked
            original.putAll(override);
    
            BUNDLE = getBundle(BUNDLE_NAME, PropertyLoader.getInstance());
    
            MAIN_APP_TITLE = BUNDLE.getString("MainApp.title");
    
            DIALOG_HEADER = BUNDLE.getString("Dialog.information.header");
            MAIN_CONTROLLER_CONTENT_TEXT = BUNDLE.getString("MainController.contentText");
            MAIN_CONTROLLER_HELLO_TEXT = BUNDLE.getString("MainController.helloText");
            MAIN_CONTROLLER_GOODBYE_TEXT = BUNDLE.getString("MainController.goodbyeText");
        }
    
        public static ResourceBundle GetBundle() {
            return BUNDLE;
        }
    }
    

    and in PropertyLoader.java

    public class PropertyLoader extends ResourceBundle.Control {
    
        private static final String PROPERTIES_RESOURCE_NAME = "properties";
    
        private static final PropertyLoader INSTANCE = new PropertyLoader();
    
        public static PropertyLoader getInstance() {
            return INSTANCE;
        }
    
        @Override
        public ResourceBundle newBundle(final String baseName, final Locale locale, final String format,
                                        final ClassLoader loader, final boolean reload)
                throws IllegalAccessException, InstantiationException, IOException {
    
            final String bundleName = toBundleName(baseName, locale);
            final String resourceName = toResourceName(bundleName, PROPERTIES_RESOURCE_NAME);
    
            ResourceBundle bundle = null;
            InputStream stream = null;
    
            if (reload) {
    
                final URL url = loader.getResource(resourceName);
    
                if (url != null) {
                    final URLConnection connection = url.openConnection();
                    if (connection != null) {
                        connection.setUseCaches(false);
                        stream = connection.getInputStream();
                    }
                }
    
            } else {
                stream = loader.getResourceAsStream(resourceName);
            }
    
            if (stream != null) {
                try {
                    bundle = new PropertyResourceBundle(new InputStreamReader(stream, StandardCharsets.UTF_8));
                } finally {
                    stream.close();
                }
            }
    
            return bundle;
        }
    }
    

    More I described here or on GitHub

    Here is a demonstration in the Belarusian language:

提交回复
热议问题