Implementierung von Datenbankgestützter Internationalisierung (i18n) für Java-Webanwendungen
In der heutigen globalisierten Welt ist es entscheidend, Anwendungen zu schaffen, die unterschiedlichen Zielgruppen gerecht werden. Ein wesentlicher Aspekt zur Berücksichtigung verschiedener Sprachen und Kulturen in Webanwendungen ist die Internationalisierung (i18n). In diesem Blogbeitrag werden wir eine häufige Herausforderung behandeln, mit der Entwickler konfrontiert sind, wenn sie i18n in Java-Webanwendungen umsetzen wollen – insbesondere, wie man eine Datenbank verwendet, um i18n Schlüssel/Wert-Paare zu speichern und diese Daten zur Laufzeit zu modifizieren oder neu zu laden.
Die Herausforderung
Ein Entwickler fragte nach einer datenbankgestützten Lösung, um ihre i18n-Daten effektiv zu verwalten. Das Ziel war es, dynamische Aktualisierungen von Internationalisierungstexten zu ermöglichen, ohne die Anwendung neu bereitstellen zu müssen. Sie wollten diese Lösung mit JSTL (JavaServer Pages Standard Tag Library) Tags wie <fmt:setlocale>
, <fmt:bundle>
und <fmt:message>
integrieren, stießen jedoch auf Schwierigkeiten, insbesondere im Zusammenhang mit der Erweiterung von ResourceBundle
.
Wenn Sie ähnliche Herausforderungen haben, brauchen Sie sich nicht zu fürchten! Im Folgenden werden wir einen praktischen Ansatz zur Implementierung von datenbankgestützter i18n in Ihrer Java-Webanwendung erörtern.
Vorgeschlagene Lösung für datenbankgestützte i18n
Schritt 1: Datenbankeinrichtung
Zuerst müssen Sie eine einfache Datenbanktabelle erstellen, um Ihre i18n-Daten zu speichern. Die empfohlene Struktur besteht aus drei Spalten:
- sprache: Der Sprachcode (z.B.
en
,fr
,es
). - schlüssel: Ein eindeutiger Bezeichner für jeden String, typischerweise auf Englisch (z.B.
login.error.password.dup
). - wert: Der übersetzte String, der dem
schlüssel
entspricht.
Beispiel für die Tabellenerstellung
CREATE TABLE translations (
language VARCHAR(5),
key VARCHAR(100),
value TEXT,
PRIMARY KEY (language, key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Schritt 2: Befüllen der Datenbank
Füllen Sie Ihre translations
-Tabelle mit Schlüssel/Wert-Paaren. Hier ist ein kurzes Beispiel:
INSERT INTO translations (language, key, value) VALUES
('en', 'login.error.password.dup', 'Password is already in use.'),
('fr', 'login.error.password.dup', 'Le mot de passe est déjà utilisé.');
Schritt 3: Anpassen von ResourceBundle
Um Ihre Datenbank mit JSTL-Tags zu integrieren, müssen Sie die ResourceBundle
-Klasse erweitern. Diese erweiterte Version kann die Strings direkt aus Ihrer Datenbank abrufen.
Beispielcode
public class DatabaseResourceBundle extends ResourceBundle {
private String language;
public DatabaseResourceBundle(String language) {
this.language = language;
}
@Override
protected Object handleGetObject(String key) {
// Logik zum Abrufen des Wertes aus der Datenbank mit Sprache und Schlüssel
return getValueFromDatabase(language, key);
}
@Override
public Enumeration<String> getKeys() {
// Logik zur Rückgabe einer Enumeration der Schlüssel
}
}
Schritt 4: Integration mit JSTL
Sobald Sie das benutzerdefinierte ResourceBundle
haben, müssen Sie es mit Ihren JSTL-Tags integrieren. Sie können den Lokalisierungskontext in Ihrem Servlet oder JSP einrichten.
Beispielimplementierung
HttpSession session = request.getSession();
String language = "en"; // Logik zur Bestimmung der Sprache
ResourceBundle bundle = new DatabaseResourceBundle(language);
Locale locale = new Locale(language);
javax.servlet.jsp.jstl.core.Config.set(session, Config.FMT_LOCALIZATION_CONTEXT, new LocalizationContext(bundle, locale));
Zusätzliche Überlegungen
- UTF-8 Unterstützung: Stellen Sie sicher, dass Ihre Datenbank UTF-8 Zeichen unterstützt. Sowohl MySQL als auch Oracle ermöglichen es Ihnen, dies während der Datenbank- oder Tabellenerstellung einzurichten.
- Caching: Um die Leistung zu verbessern, sollten Sie in Betracht ziehen, Caching-Mechanismen für das Datenbankressourcenbündel zu implementieren.
- Benutzeroberfläche für Übersetzer: Für einen fortgeschritteneren Ansatz können Sie eine Benutzeroberfläche erstellen, die es Übersetzern ermöglicht, Einträge zu bearbeiten, einschließlich Änderungsprotokollen.
Fazit
Die Implementierung von datenbankgestützter Internationalisierung in Java-Webanwendungen kann die Flexibilität erheblich verbessern und Echtzeit-Updates für die Sprachstrings Ihrer Anwendung ermöglichen. Indem Sie die oben skizzierten Schritte befolgen, können Sie ein robustes System erstellen, das sich nahtlos in JSTL-Tags integriert.
Zögern Sie nicht, mit diesen Lösungen zu experimentieren und sie an die spezifischen Anforderungen Ihrer Anwendung anzupassen. Viel Spaß beim Codieren!