How do you implement internationalization (i18n) in a Spring application?
Table of Contents
Introduction
Internationalization (i18n) is a critical feature for applications that need to support multiple languages and regions. In Spring-based applications, implementing i18n allows your application to display content in different languages based on the user’s locale. This guide will walk you through how to implement i18n in a Spring application, covering key concepts such as MessageSource
, LocaleResolver
, and handling multiple languages.
Setting Up Internationalization in a Spring Application
1. Configure MessageSource
for Language Support
The MessageSource
bean in Spring is used to handle the resolution of messages and text in various languages. You'll need to configure a MessageSource
bean that points to a set of properties files (one for each language) containing the text to be displayed.
Example:
In this configuration, messages.properties
is the default file, and other locale-specific property files can be added such as messages_en.properties
, messages_fr.properties
, etc.
2. Set Up LocaleResolver
to Determine the User's Locale
Spring uses LocaleResolver
to detect and resolve the locale for the user. The most common approach is to use SessionLocaleResolver
, which stores the locale in the HTTP session.
Example:
This configuration allows the user to change the language by appending the lang
parameter to the URL, like ?lang=fr
for French or ?lang=de
for German.
3. Create Message Properties Files
For each language you wish to support, create a properties file that contains the translations. These files should be placed in the src/main/resources
directory.
Example:
messages.properties (default):
messages_fr.properties (French):
messages_es.properties (Spanish):
4. Using Messages in the Application
Once the message source and locale resolver are configured, you can use the messages in your Spring controllers or views by injecting the MessageSource
or using @Value
annotations.
Example in Controller:
In this example, the greeting message is retrieved from the messages
properties file based on the current locale.
5. Using Messages in Views (Thymeleaf)
If you're using Thymeleaf as your template engine, you can access the messages directly in your HTML views.
Example (Thymeleaf):
In the above example, the #{greeting}
syntax tells Thymeleaf to resolve the greeting
message key based on the current locale.
Practical Examples
Example 1: Changing Language via URL Parameters
You can add links in your views to switch between different languages. When the user clicks on a link, the lang
parameter in the URL is used to change the language of the content.
<a href="/?lang=en">English</a> | <a href="/?lang=fr">French</a> | <a href="/?lang=es">Spanish</a>
Example 2: Locale-Specific Date and Time Formatting
Spring provides the ability to format dates, times, and numbers according to the current locale. This can be helpful for displaying dates in the correct format for different countries.
This approach will automatically format the date according to the default locale of the user.
Conclusion
Implementing internationalization (i18n) in a Spring application allows you to create globally accessible applications by supporting multiple languages. The key components for setting up i18n include configuring a MessageSource
for message resolution, using LocaleResolver
to detect the user’s locale, and creating properties files for different languages. With these steps, you can ensure that your application adapts to different regions and provides a localized experience for your users.