Takip et

Spring MVC Internationalization (i18n) ve Localization (L10n) Örneği

Spring MVC Internationalization (i18n) ve Localization (L10n) Örneği Spring Framework, modern web uygulamalarının geliştirilmesinde en çok terc

Spring MVC Internationalization (i18n) ve Localization (L10n) Örneği

Spring Framework, modern web uygulamalarının geliştirilmesinde en çok tercih edilen ekosistemlerden biridir. Günümüz küresel dünyasında, bir uygulamanın farklı dilleri ve kültürel tercihleri desteklemesi, kullanıcı deneyimi açısından kritik bir öneme sahiptir. Bu makale, Spring MVC tabanlı uygulamalarda uluslararasılaştırma (Internationalization – i18n) ve yerelleştirme (Localization – L10n) kavramlarını, bunların nasıl uygulandığını ve adım adım bir örnekle nasıl hayata geçirileceğini detaylı bir şekilde ele alacaktır.

Giriş: Küreselleşen Dünyada Uygulama Geliştirme

Uygulamalarımızı geliştirirken, genellikle hedef kitlemizin tek bir dil veya bölge ile sınırlı olmadığını fark ederiz. Bir uygulamanın dünya çapında başarılı olabilmesi için farklı dilleri, para birimlerini, tarih formatlarını ve kültürel normları desteklemesi gerekir. İşte tam bu noktada i18n ve L10n devreye girer.

Uluslararasılaştırma (i18n), bir uygulamanın farklı diller ve bölgeler için uyarlanabilir hale getirilmesi sürecidir. Bu, uygulamanın kod tabanında dil veya bölgeye özel metinlerin, formatların veya diğer kültürel unsurların sabit kodlanmaması anlamına gelir. “i18n” terimi, “internationalization” kelimesindeki ‘i’ ve ‘n’ harfleri arasında 18 harf bulunmasından gelir.

Yerelleştirme (L10n) ise, uluslararasılaştırılmış bir uygulamanın belirli bir dil ve bölgeye özel hale getirilmesi sürecidir. Bu süreç, metinlerin çevrilmesini, tarih ve saat formatlarının ayarlanmasını, para birimi sembollerinin ve biçimlerinin düzenlenmesini, renklerin, görsellerin ve diğer kültürel unsurların hedeflenen bölgeye uygun hale getirilmesini içerir. “L10n” terimi de “localization” kelimesindeki ‘L’ ve ‘n’ harfleri arasında 10 harf bulunmasından türetilmiştir.

Spring Framework, bu karmaşık süreçleri basitleştirmek ve geliştiricilere güçlü araçlar sunmak için tasarlanmıştır. Spring MVC’nin i18n ve L10n desteği sayesinde, uygulamalarınızı kolayca çok dilli ve çok bölgeli hale getirebilirsiniz.

Temel Kavramlar ve Spring Mekanizmaları

Spring MVC’de i18n ve L10n’yi anlamak için bazı temel kavramları ve Spring’in bu konudaki ana bileşenlerini bilmek önemlidir.

Locale (Yerel Ayarlar)

java.util.Locale sınıfı, belirli bir coğrafi, politik veya kültürel bölgeyi temsil eder. Bir Locale, genellikle bir dil kodu (örn. en for English, tr for Turkish) ve isteğe bağlı olarak bir ülke kodu (örn. US for United States, TR for Turkey) kombinasyonundan oluşur. Örneğin, en_US Amerika Birleşik Devletleri İngilizcesi’ni, tr_TR Türkiye Türkçesi’ni temsil eder. Spring, kullanıcının tercih ettiği Locale‘i belirleyerek ve bu Locale‘e göre içerik sunarak i18n’yi yönetir.

Resource Bundles (Kaynak Paketleri / Mesaj Paketleri)

Resource Bundles, farklı dillerdeki metin mesajlarını, etiketleri ve diğer yerelleştirilmiş içeriği depolamak için kullanılan dosyalardır. Spring’de bu genellikle .properties uzantılı dosyalardır. Her dil ve bölge kombinasyonu için ayrı bir .properties dosyası oluşturulur.

Örnek bir yapı:
* messages.properties: Varsayılan dil (genellikle İngilizce) için mesajlar.
* messages_en.properties: İngilizce mesajlar (isteğe bağlı, varsayılan messages.properties ise gerekmez).
* messages_tr.properties: Türkçe mesajlar.
* messages_de.properties: Almanca mesajlar.

Bu dosyaların içinde anahtar-değer çiftleri bulunur:

# messages.properties
welcome.message=Welcome to our application!
button.submit=Submit
# messages_tr.properties
welcome.message=Uygulamamıza Hoş Geldiniz!
button.submit=Gönder

MessageSource

org.springframework.context.MessageSource arayüzü, Spring’in mesaj paketlerinden mesajları çözümlemek için kullandığı ana bileşendir. Bir MessageSource bean’i tanımlayarak, uygulamanızdaki metinleri Locale‘e göre dinamik olarak yükleyebilirsiniz.

Spring’in en yaygın MessageSource implementasyonları şunlardır:
* ResourceBundleMessageSource: Sabit bir dizindeki .properties dosyalarından mesajları yükler. Uygulama başlatıldığında tüm mesajları yükler ve önbelleğe alır.
* ReloadableResourceBundleMessageSource: Geliştirme ortamında çok kullanışlıdır, çünkü .properties dosyalarındaki değişiklikleri uygulama yeniden başlatılmadan algılayabilir ve mesajları yeniden yükleyebilir. Üretim ortamında performans nedenleriyle genellikle ResourceBundleMessageSource tercih edilir.

Locale Resolvers (Yerel Ayar Çözümleyicileri)

org.springframework.web.servlet.LocaleResolver arayüzü, gelen her istekle birlikte kullanıcının tercih ettiği Locale‘i belirlemekten sorumludur. Spring, çeşitli LocaleResolver implementasyonları sunar:

* AcceptHeaderLocaleResolver: HTTP isteğinin Accept-Language başlığına bakar. Bu, tarayıcı ayarlarından gelen varsayılan dil tercihidir. Spring’in varsayılan çözümleyicisidir.
* SessionLocaleResolver: Kullanıcının Locale‘ini HTTP oturumunda (session) saklar. Kullanıcı bir kez dil seçtiğinde, bu tercih oturum boyunca korunur.
* CookieLocaleResolver: Kullanıcının Locale‘ini bir HTTP çerezinde (cookie) saklar. Bu, kullanıcının tercihini oturumlar arasında bile hatırlamak için idealdir.
* FixedLocaleResolver: Her zaman sabit bir Locale döndürür. Genellikle test amaçlı veya tek dilli uygulamalar için kullanılır.

LocaleChangeInterceptor (Yerel Ayar Değişim Yakalayıcısı)

org.springframework.web.servlet.i18n.LocaleChangeInterceptor, kullanıcının URL parametresi (örn. ?lang=tr) veya başka bir yolla Locale‘ini değiştirmesine olanak tanır. Bu interceptor, belirli bir parametreyi (varsayılan olarak lang) dinler ve bu parametre mevcutsa, LocaleResolver aracılığıyla kullanıcının Locale‘ini değiştirir.

Spring MVC’de i18n/L10n Adım Adım Uygulama Örneği

Şimdi, Spring Boot kullanarak çok dilli bir web uygulaması oluşturmak için adım adım bir örnek üzerinde çalışalım. Bu örnekte Thymeleaf şablon motorunu kullanacağız, ancak JSP veya diğer şablon motorlarıyla da benzer prensipler geçerlidir.

1. Proje Oluşturma ve Bağımlılıkları Ekleme

Öncelikle, Spring Initializr (start.spring.io) kullanarak yeni bir Spring Boot projesi oluşturalım. Gerekli bağımlılıklar:
* Spring Web
* Thymeleaf
* Spring Boot DevTools (isteğe bağlı, geliştirme kolaylığı için)

pom.xml dosyanızın dependencies bölümü aşağıdaki gibi görünecektir (sürüm numaraları farklılık gösterebilir):



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        3.2.5
         
    
    com.example
    i18n-example
    0.0.1-SNAPSHOT
    i18n-example
    Spring MVC i18n Example
    
        17
    
    
        org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-thymeleaf
        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

2. Mesaj Paketleri Oluşturma

src/main/resources dizini altında mesaj paketleri dosyalarımızı oluşturalım:

* messages.properties (varsayılan dil – İngilizce)
* messages_tr.properties (Türkçe)
* messages_de.properties (Almanca)

src/main/resources/messages.properties:

app.title=My Internationalized Application
welcome.message=Welcome to our application!
language.select=Select Language:
lang.en=English
lang.tr=Turkish
lang.de=German

src/main/resources/messages_tr.properties:

app.title=Uluslararasılaştırılmış Uygulamam
welcome.message=Uygulamamıza Hoş Geldiniz!
language.select=Dil Seçin:
lang.en=İngilizce
lang.tr=Türkçe
lang.de=Almanca

src/main/resources/messages_de.properties:

app.title=Meine Internationalisierte Anwendung
welcome.message=Willkommen in unserer Anwendung!
language.select=Sprache auswählen:
lang.en=Englisch
lang.tr=Türkisch
lang.de=Deutsch

3. Spring Konfigürasyonu

Uygulama için i18n bileşenlerini yapılandırmamız gerekiyor. Bunun için bir WebMvcConfigurer implementasyonu kullanabiliriz.

src/main/java/com/example/i18nexample/config/WebConfig.java:

package com.example.i18nexample.config;

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;

import java.util.Locale;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    // 1. MessageSource Bean'i Tanımlama
    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasenames("classpath:messages"); // messages.properties, messages_tr.properties vb.
        messageSource.setDefaultEncoding("UTF-8"); // Karakter kodlamasını UTF-8 olarak ayarla
        messageSource.setCacheSeconds(3600); // Mesajları 1 saat önbellekte tut
        return messageSource;
    }

    // 2. LocaleResolver Bean'i Tanımlama
    @Bean
    public LocaleResolver localeResolver() {
        // CookieLocaleResolver kullanarak kullanıcının dil tercihini çerezde saklayalım.
        // Böylece tarayıcı kapatılıp açılsa bile tercih korunur.
        CookieLocaleResolver localeResolver = new CookieLocaleResolver();
        localeResolver.setDefaultLocale(Locale.ENGLISH); // Varsayılan dil İngilizce
        localeResolver.setCookieName("language"); // Çerezin adı
        localeResolver.setCookieMaxAge(3600  24  30); // Çerezi 30 gün boyunca sakla
        return localeResolver;
    }

    // 3. LocaleChangeInterceptor Bean'i Tanımlama ve Kaydetme
    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        lci.setParamName("lang"); // URL'deki dil parametresi (örn. ?lang=tr)
        return lci;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }
}

Açıklamalar:
* MessageSource: ReloadableResourceBundleMessageSource kullandık. Bu, geliştirme sırasında .properties dosyalarında yapılan değişikliklerin uygulama yeniden başlatılmadan algılanmasını sağlar. setBasenames("classpath:messages") ile messages.properties önekli dosyaları aramasını söyledik.
* LocaleResolver: CookieLocaleResolver seçtik. Bu, kullanıcının dil tercihini bir çerezde saklayarak, tarayıcı kapansa bile bu tercihin hatırlanmasını sağlar. setDefaultLocale(Locale.ENGLISH) ile varsayılan dilin İngilizce olduğunu belirledik.
* LocaleChangeInterceptor: Bu interceptor, URL’deki lang parametresini dinler. Örneğin, http://localhost:8080/?lang=tr isteği geldiğinde, LocaleChangeInterceptor bu parametreyi yakalar ve LocaleResolver aracılığıyla kullanıcının dilini Türkçe olarak ayarlar. Daha sonra, tüm sayfalardaki içerik Türkçe olarak gösterilir.

4. Controller Oluşturma

Şimdi ana sayfamızı gösterecek basit bir controller oluşturalım.

src/main/java/com/example/i18nexample/controller/HomeController.java:

package com.example.i18nexample.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "index"; // index.html (Thymeleaf) şablonunu döndür
    }
}

5. View Oluşturma (Thymeleaf ile)

src/main/resources/templates dizini altında index.html dosyamızı oluşturalım. Thymeleaf, i18n mesajlarını kolayca entegre etmek için #{...} sözdizimini kullanır.

src/main/resources/templates/index.html:




    
    
    


    

    
Select Language: English Turkish German

Açıklamalar:
* th:text="#{app.title}": Bu Thymeleaf ifadesi, messageSource‘dan app.title anahtarının değerini alır ve mevcut Locale‘e göre ekrana basar.
* Dil değiştirme bağlantıları: th:href="@{/?lang=en}" gibi bağlantılar, LocaleChangeInterceptor‘ın dinlediği lang parametresini kullanarak dilin değiştirilmesini sağlar. Kullanıcı bir dile tıkladığında, LocaleChangeInterceptor devreye girer, LocaleResolver aracılığıyla çerezdeki Locale‘i günceller ve sayfa yeniden yüklenir.

6. Uygulamayı Çalıştırma ve Test Etme

Uygulamayı çalıştırdıktan sonra (örneğin, IDE’nizden main metodu ile veya mvn spring-boot:run komutuyla):
1. Tarayıcınızda http://localhost:8080/ adresine gidin. Varsayılan dil olan İngilizce içeriği görmelisiniz.
2. “Turkish” bağlantısına tıklayın. Sayfa yeniden yüklenecek ve tüm metinler Türkçe’ye dönecektir.
3. “German” bağlantısına tıklayın. Sayfa yeniden yüklenecek ve tüm metinler Almanca’ya dönecektir.
4. Tarayıcınızı kapatıp tekrar açtığınızda, CookieLocaleResolver sayesinde en son seçtiğiniz dilin hala aktif olduğunu göreceksiniz.

7. Formlarda i18n ve Doğrulama Mesajları

Spring MVC, formlarla çalışırken de i18n desteği sunar. Thymeleaf’te form alanlarının etiketlerini ve doğrulama (validation) mesajlarını da mesaj paketlerinden alabilirsiniz.

Örneğin, bir kullanıcı giriş formu düşünelim.
Önce form doğrulama mesajları için yeni bir mesaj paketi oluşturalım:
src/main/resources/ValidationMessages.properties:

NotBlank.user.username=Username cannot be empty.
Size.user.username=Username must be between {min} and {max} characters.

src/main/resources/ValidationMessages_tr.properties:

NotBlank.user.username=Kullanıcı adı boş bırakılamaz.
Size.user.username=Kullanıcı adı {min} ile {max} karakter arasında olmalıdır.

WebConfig sınıfımızda MessageSource‘a bu yeni paketi ekleyelim:

// ...
@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    // Birden fazla basename belirtebiliriz
    messageSource.setBasenames("classpath:messages", "classpath:ValidationMessages"); 
    messageSource.setDefaultEncoding("UTF-8");
    messageSource.setCacheSeconds(3600);
    return messageSource;
}
// ...

Şimdi bir model ve controller oluşturalım:
src/main/java/com/example/i18nexample/model/User.java:

package com.example.i18nexample.model;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

public class User {

    @NotBlank
    @Size(min = 3, max = 20)
    private String username;

    private String password; // Basitlik adına validasyon eklemedik

    // Getters and Setters
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

src/main/java/com/example/i18nexample/controller/UserController.java:

package com.example.i18nexample.controller;

import com.example.i18nexample.model.User;
import jakarta.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class UserController {

    @GetMapping("/login")
    public String showLoginForm(Model model) {
        model.addAttribute("user", new User());
        return "login";
    }

    @PostMapping("/login")
    public String processLogin(@Valid @ModelAttribute("user") User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return "login"; // Hata varsa formu tekrar göster
        }
        // Giriş başarılı, başka bir sayfaya yönlendir
        return "redirect:/success";
    }

    @GetMapping("/success")
    public String loginSuccess() {
        return "success";
    }
}

src/main/resources/templates/login.html:




    
    
    


    
Select Language: English Turkish German
Username Error

src/main/resources/templates/success.html:




    
    
    


    
    

You have successfully logged in.

messages.properties dosyalarına yeni anahtarlar ekleyelim:
messages.properties:

# ... (önceki anahtarlar)
login.form.title=User Login
login.form.username=Username:
login.form.password=Password:
login.success.title=Login Successful!
login.success.message=You have successfully logged in.

messages_tr.properties:

# ... (önceki anahtarlar)
login.form.title=Kullanıcı Girişi
login.form.username=Kullanıcı Adı:
login.form.password=Şifre:
login.success.title=Giriş Başarılı!
login.success.message=Başarıyla giriş yaptınız.

Bu örnekte, th:errors="*{username}" Thymeleaf özelliği sayesinde, @NotBlank ve @Size gibi validasyon anotasyonlarından gelen hata mesajları otomatik olarak ValidationMessages.properties dosyasından alınır ve mevcut Locale‘e göre ekranda gösterilir.

8. Tarih ve Sayı Biçimlendirme (L10n)

i18n sadece metin çevirisi değil, aynı zamanda Locale‘e özgü tarih, saat ve sayı biçimlendirmesini de içerir. Spring, bu konuda da güçlü destek sunar.

@DateTimeFormat ve @NumberFormat anotasyonları, modeldeki alanların Locale‘e göre biçimlendirilmesini sağlar.

Örneğin, bir ürün modelimiz olsun:
src/main/java/com/example/i18nexample/model/Product.java:

package com.example.i18nexample.model;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.NumberFormat;

import java.math.BigDecimal;
import java.time.LocalDate;

public class Product {
    private String name;

    @NumberFormat(style = NumberFormat.Style.CURRENCY) // Para birimi olarak formatla
    private BigDecimal price;

    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) // ISO tarih formatı, Locale'e göre gösterilir
    private LocalDate manufacturingDate;

    // Constructors, Getters and Setters
    public Product(String name, BigDecimal price, LocalDate manufacturingDate) {
        this.name = name;
        this.price = price;
        this.manufacturingDate = manufacturingDate;
    }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public BigDecimal getPrice() { return price; }
    public void setPrice(BigDecimal price) { this.price = price; }
    public LocalDate getManufacturingDate() { return manufacturingDate; }
    public void setManufacturingDate(LocalDate manufacturingDate) { this.manufacturingDate = manufacturingDate; }
}

Bir controller ve view ile bu veriyi gösterelim:
src/main/java/com/example/i18nexample/controller/ProductController.java:

package com.example.i18nexample.controller;

import com.example.i18nexample.model.Product;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.math.BigDecimal;
import java.time.LocalDate;

@Controller
public class ProductController {

    @GetMapping("/product")
    public String showProduct(Model model) {
        Product product = new Product("Laptop", new BigDecimal("1234.56"), LocalDate.of(2023, 10, 26));
        model.addAttribute("product", product);
        return "product";
    }
}

src/main/resources/templates/product.html:




    
    
    


    
Select Language: English Turkish German

Name: Laptop

Price: 1234.56

Manufacturing Date: 2023-10-26

messages.properties dosyalarına yeni anahtarlar ekleyelim:
messages.properties:

# ...
product.detail.title=Product Details
product.name=Name:
product.price=Price:
product.manufacturing.date=Manufacturing Date:

messages_tr.properties:

# ...
product.detail.title=Ürün Detayları
product.name=Adı:
product.price=Fiyatı:
product.manufacturing.date=Üretim Tarihi:

product.html sayfasını ziyaret ettiğinizde ve dili değiştirdiğinizde, ürün adı gibi statik metinlerin yanı sıra, fiyat (1.234,56 TL vs. $1,234.56) ve üretim tarihi (26.10.2023 vs. Oct 26, 2023) gibi alanların da Locale‘e göre otomatik olarak biçimlendirildiğini göreceksiniz. Spring’in formatlama desteği, bu tür L10n ihtiyaçlarını otomatik olarak karşılar.

Gelişmiş Konular ve En İyi Uygulamalar

Mesaj Paketleri Yönetimi

Büyük uygulamalarda, tüm mesajları tek bir messages.properties dosyasına koymak yönetimi zorlaştırabilir. Uygulamanın farklı bölümleri için ayrı mesaj paketleri (örn. validation.properties, errors.properties, dashboard.properties) oluşturmak ve bunları MessageSource‘a setBasenames metodunda virgülle ayırarak eklemek iyi bir uygulamadır.

Veritabanından Mesaj Yükleme

Bazı durumlarda, mesajları .properties dosyalarında tutmak yerine bir veritabanında depolamak isteyebilirsiniz. Bu, çevirilerin dinamik olarak güncellenmesi veya CMS (İçerik Yönetim Sistemi) entegrasyonu gibi senaryolarda faydalıdır. Spring’in MessageSource arayüzünü implemente ederek kendi özel DatabaseMessageSource‘unuzu oluşturabilirsiniz.

Varsayılan Dil (Fallback Locale)

Bir Locale için belirli bir mesaj bulunamadığında, Spring varsayılan Locale‘e (genellikle messages.properties tarafından temsil edilen Locale) geri döner. Bu davranış, MessageSource yapılandırmasında fallbackToSystemLocale gibi özelliklerle ayarlanabilir. Mesaj paketlerinizde her zaman bir varsayılan dil olduğundan emin olun.

SEO ve i18n

Uluslararasılaştırılmış web siteleri için arama motoru optimizasyonu (SEO) yaparken, farklı dil ve bölge varyantlarını arama motorlarına bildirmek önemlidir. Bunun için hreflang etiketleri kullanılır. Örneğin:


Bu etiketler, arama motorlarına bir sayfanın farklı dil veya bölge versiyonlarının nerede bulunduğunu söyler.

Test Etme

i18n ve L10n özelliklerini test ederken, farklı Locale‘leri simüle etmek önemlidir. Spring MockMvc ile testler yazarken, HTTP isteğine Accept-Language başlığı ekleyerek veya LocaleChangeInterceptor‘ın parametresini (örn. ?lang=tr) kullanarak farklı dillerdeki yanıtları test edebilirsiniz.

Performans Konuları

ResourceBundleMessageSource ve ReloadableResourceBundleMessageSource mesajları önbelleğe alır. ReloadableResourceBundleMessageSource‘un setCacheSeconds metodu ile önbellek süresini ayarlayabilirsiniz. Üretim ortamında, mesaj paketlerinin sık sık değişmediği durumlarda setCacheSeconds değerini yüksek tutmak veya ResourceBundleMessageSource kullanmak performansı artırabilir.

Sonuç

Spring MVC, uygulamalarınızı uluslararasılaştırmak ve yerelleştirmek için kapsamlı ve esnek bir çerçeve sunar. MessageSource, LocaleResolver ve LocaleChangeInterceptor gibi temel bileşenler sayesinde, farklı dilleri ve kültürel tercihleri destekleyen uygulamalar geliştirmek oldukça basittir. Bu makalede sunulan adım adım örnek ve açıklamalarla, kendi Spring MVC uygulamanızda i18n ve L10n’yi başarıyla uygulayabilir ve küresel bir kullanıcı kitlesine hitap edebilirsiniz. Küreselleşen dünyada, kullanıcı deneyimini zenginleştirmek ve pazar erişimini genişletmek için i18n ve L10n’nin önemi yadsınamaz. Spring Framework, bu süreci geliştiriciler için olabildiğince sorunsuz hale getirerek, daha erişilebilir ve kullanıcı dostu uygulamalar oluşturmamıza olanak tanır.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version