JavaTrip and tricksWeb application

Spring Boot #16 – Internacjonalizacja, aplikacja wielojęzykowa

Spring Boot

Internacjonalizacja

Internacjonalizacja umożliwia wykorzystanie wielojęzyczności w ramach aplikacji. Zwyczajową nazwą na to rozwiązanie jest i18n – z tego względu, że w słowie internationalization pomiędzy i oraz n występuje dokładnie 18 znaków.

Pliki z tłumaczeniami

W pierwszej kolejności należy utworzyć pliki z tłumaczeniami. Należy je umieścić w katalogu resources. Każdy z plików musi posiadać nazwę messages z postfiksem kodu języka np:

  • messages_en.properties
  • messages_pl.properties

IntelliJ zwija pliki tłumaczeń w jeden Bundle co widać na obrazku poniżej. W samym pliku umieszczane są elementy tyku klucz-wartość. Po kluczu będziemy odnosić się do danego tłumaczenia.

Możliwe jest również dodawanie w pliku tłumaczeń parametrów. Wówczas indeks parametru ujmujemy w nawiasach klamrowych.

Dobrym zwyczajem jest umieszczenie tłumaczeń w katalogu i18n.

i18n

Implementacja

Należy utworzyć nowy @Bean, który będzie reprezentował klasę ReloadableResourceBundleMessageSource. Obiektowi temu trzeba przypisać ścieżkę do tłumaczeń, oraz typ kodowania.

@Bean
public ReloadableResourceBundleMessageSource messageSource() {
    ReloadableResourceBundleMessageSource bundleMessageSource = new ReloadableResourceBundleMessageSource();
    bundleMessageSource.setBasename("classpath:i18n/messages");
    bundleMessageSource.setDefaultEncoding("UTF-8");
    return bundleMessageSource;
}

Wykorzystanie

Do wykorzystania elementu należy wstrzyknąć instancje klasy MessageSource, a następnie odwołać się do niej podając klucz tłumaczenia, opcjonalnie parametry oraz język.

@RestController
public class TextApi {

    private MessageSource messageSource;

    @Autowired
    public TextApi(MessageSource messageSource) {
        this.messageSource = messageSource;
    }

    @GetMapping("/hello")
    public String sayHello(@RequestParam String name) {
        return messageSource.getMessage("welcome", new Object[]{name}, Locale.FRENCH);
    }
}

Rezultatem jest wartość dla danego tłumaczenia.

Tags:
Show Buttons
Hide Buttons