i18n-core
The foundation. Polymorphic resource inheritance, JSON/XML bundles, locale-change events, and full JPMS support. Works with any Java UI or none at all.
i18n-core
The foundation. Polymorphic resource inheritance, JSON/XML bundles, locale-change events, and full JPMS support. Works with any Java UI or none at all.
i18n-swing
Swing bindings. Drop-in replacements for every standard Swing component — buttons, menus, tables, dialogs — that re-apply all localizable properties on the EDT when the locale changes.
i18n-fx
JavaFX bindings. Resourceful wrappers for every standard JavaFX control — including MenuItem, Tab, TableColumn, and Tooltip — updated on the Application Thread automatically.
// 1. Your frame is the locale-event sourcepublic class MyFrame extends LocalizableJFrame { ... }
// 2. Components declare what they displayResource okResource = new Resource(myFrame, "okButton");ResourcefulJButton okButton = ResourcefulJButton.create(okResource);
// 3. One call updates everythingmyFrame.setBundleLocale(Locale.FRANCE);// → every Resourceful component attached to myFrame// re-applies its French text, mnemonic, icon, tooltip,// and accessibility attributes on the EDTEvent-driven
A single setBundleLocale() call fires a LocaleEvent to every registered component. No polling, no manual refresh, no missed updates.
Polymorphic bundles
Bundles follow the class hierarchy. Subclasses inherit parent entries and override only what changes — eliminating copy-paste across locale variants.
JSON and XML bundles
Rich, typed bundle entries without code generation. An AttributeCollection carrying text, icon path, mnemonic, and tooltip is a plain JSON object in your resource file.
Thread-safe by design
All locale-event dispatch is marshalled onto the EDT (Swing) or Application Thread (JavaFX). Library users never call SwingUtilities.invokeLater() or Platform.runLater().
JPMS native
Both classpath and module-path deployments are supported and tested in CI. The module system is not an afterthought.
No global side effects
The library never calls Locale.setDefault(). Per-object bundle locales leave the rest of your JVM untouched.
All three libraries are on Maven Central under dev.javai18n.
<!-- Foundation (pulled in transitively by the UI bindings) --><dependency> <groupId>dev.javai18n</groupId> <artifactId>i18n-core</artifactId> <version>1.4.0</version></dependency>
<!-- Swing bindings (Java 17+) --><dependency> <groupId>dev.javai18n</groupId> <artifactId>i18n-swing</artifactId> <version>1.2.2</version></dependency>
<!-- JavaFX bindings (Java 21+) --><dependency> <groupId>dev.javai18n</groupId> <artifactId>i18n-fx</artifactId> <version>1.0</version></dependency>