Java Web Uygulamaları için Veritabanı Destekli Uluslararasılaştırma (i18n) Uygulaması
Bugünün küreselleşmiş dünyasında, farklı izleyici kitlelerine hitap eden uygulamalar oluşturmak çok önemlidir. Web uygulamalarında farklı dilleri ve kültürleri barındırmanın temel yönlerinden biri uluslararasılaştırmadır (i18n). Bu blog yazısı, Java web uygulamalarında i18n uygulamak isteyen geliştiricilerin karşılaştığı yaygın bir zorluğu ele alacaktır—özellikle i18n anahtar/değer çiftlerini depolamak için bir veritabanı kullanma ve bu verilerin çalışma zamanında nasıl değiştirilip yeniden yükleneceği konusunu masaya yatıracaktır.
Zorluk
Bir geliştirici, i18n verilerini etkili bir şekilde yönetmek için veritabanı destekli bir çözüm kullanmak istediğini belirtti. Hedef, uygulamayı yeniden dağıtmaya gerek kalmadan uluslararasılaştırma dizelerini dinamik olarak güncelleyebilmekti. Bu çözümü <fmt:setlocale>
, <fmt:bundle>
ve <fmt:message>
gibi JSTL (JavaServer Pages Standard Tag Library) etiketleri ile entegre etmek istediler ancak özellikle ResourceBundle
‘ı genişletme konusunda zorluklar yaşadılar.
Eğer benzer zorluklar yaşıyorsanız, endişelenmeyin! Aşağıda, Java web uygulamanızda veritabanı destekli i18n uygulamak için pratik bir yaklaşım tartışılacaktır.
Veritabanı Destekli i18n için Önerilen Çözüm
Adım 1: Veritabanı Kurulumu
Öncelikle, i18n verilerinizi depolamak için basit bir veritabanı tablosu oluşturmanız gerekecek. Önerilen yapı üç sütundan oluşmaktadır:
- language: Dil kodu (örn.
en
,fr
,es
). - key: Her dize için benzersiz bir tanımlayıcı, genellikle İngilizce (örn.
login.error.password.dup
). - value:
key
ile ilişkili çevrilmiş dize.
Örnek Tablo Oluşturma
CREATE TABLE translations (
language VARCHAR(5),
key VARCHAR(100),
value TEXT,
PRIMARY KEY (language, key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Adım 2: Veritabanını Doldurma
translations
tablonuzu anahtar/değer çiftleriyle doldurun. İşte kısa bir örnek:
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é.');
Adım 3: ResourceBundle’ı Ayarlama
Veritabanınızı JSTL etiketleriyle entegre etmek için ResourceBundle
sınıfını genişletmeniz gerekecek. Bu genişletilmiş versiyon, dizeleri doğrudan veritabanınızdan alabilen bir yapıya sahip olacaktır.
Örnek Kod
public class DatabaseResourceBundle extends ResourceBundle {
private String language;
public DatabaseResourceBundle(String language) {
this.language = language;
}
@Override
protected Object handleGetObject(String key) {
// Dil ve anahtar kullanarak veritabanından değeri alma mantığı
return getValueFromDatabase(language, key);
}
@Override
public Enumeration<String> getKeys() {
// Anahtarların bir Enumeration'ını dönen mantık
}
}
Adım 4: JSTL ile Entegrasyon
Özel ResourceBundle
‘ınızı oluşturduktan sonra, bunu JSTL etiketlerinizle entegre etmeniz gerekecek. Lokalizasyon bağlamını Servlet veya JSP’nizde ayarlayabilirsiniz.
Örnek Uygulama
HttpSession session = request.getSession();
String language = "en"; // Dil belirleme mantığı
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));
Ek Dikkate Alınması Gerekenler
- UTF-8 Desteği: Veritabanınızın UTF-8 karakterlerini desteklediğinden emin olmayı unutmayın. Hem MySQL hem de Oracle, bu desteği veritabanı veya tablo oluşturma sırasında ayarlamanıza olanak tanır.
- Önbellekleme: Performansı artırmak için veritabanı kaynak paketi için önbellekleme mekanizmaları uygulamayı değerlendirin.
- Çevirmenler için UI: Daha ileri bir yaklaşım için, çevirmenlerin girişleri düzenlemesine olanak tanıyan ve değişiklikler için denetim izleri içeren bir kullanıcı arayüzü oluşturun.
Sonuç
Java web uygulamalarında veritabanı destekli uluslararasılaştırmanın uygulanması, uygulamanızın dil dizelerine gerçek zamanlı güncellemeler yapma imkanı sunarak esnekliği büyük ölçüde artırabilir. Yukarıda belirtilen adımları izleyerek, JSTL etiketleriyle sorunsuz bir şekilde entegre olabilen sağlam bir sistem oluşturabilirsiniz.
Uygulamanızın spesifik gereksinimlerine göre bu çözümleri denemekten ve uyarlamaktan çekinmeyin. İyi kodlamalar!