Skip to content

javai18n

Java internationalization that keeps up. Locale-aware components for Swing and JavaFX that update every label, tooltip, icon, and accessibility attribute the moment the locale changes — on the correct thread, without a line of boilerplate.

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.

View library →

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.

View library →

i18n-fx

JavaFX bindings. Resourceful wrappers for every standard JavaFX control — including MenuItem, Tab, TableColumn, and Tooltip — updated on the Application Thread automatically.

View library →

// 1. Your frame is the locale-event source
public class MyFrame extends LocalizableJFrame { ... }
// 2. Components declare what they display
Resource okResource = new Resource(myFrame, "okButton");
ResourcefulJButton okButton = ResourcefulJButton.create(okResource);
// 3. One call updates everything
myFrame.setBundleLocale(Locale.FRANCE);
// → every Resourceful component attached to myFrame
// re-applies its French text, mnemonic, icon, tooltip,
// and accessibility attributes on the EDT

Event-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>