在Spring Boot實現國際化的案例

banq發表於2022-02-09

將 I18N 新增到我們的 API 非常簡單。因此,如果您正在考慮建立供全球使用的 API(並且如果您還沒有這樣做),那麼將其新增到您的其他良好實踐(乾淨的程式碼、文件、測試……)中並不是一個壞主意。
I18N國際化是設計軟體應用程式的過程,以便它可以適應各種語言和地區,而無需進行工程更改。
整體流程
該過程包括四個步驟:
  1. 建立我們的訊息服務
  2. 為我們想要支援的所有語言新增資源包
  3. 將變數新增到應用程式屬性
  4. 開始使用我們的訊息服務

1. 建立服務
讓我們首先建立一個將用作訊息服務的類。


@Service
public class MessageService {

    @Autowired
    private ResourceBundleMessageSource messageSource;

    @Value("${custom.app.locale}")
    private String systemLanguage;

    private Locale locale;

    @PostConstruct
    private void init() {
        locale = new Locale(systemLanguage);
        LocaleContextHolder.setDefaultLocale(locale);
    }

    public String getMessage(String prefix, String key){
        return getMessage(prefix, key, "");
    }

    public String getMessage(String prefix, String key, String value){
        List<String> listOfValues = Collections.singletonList(value);
        return getMessage(prefix, key, listOfValues);
    }

    public String getMessage(String prefix, String key, List<String> args){
        return messageSource.getMessage(concatPrefixAndKey(prefix, key), args.toArray(), locale);
    }

    public String getMessage(String prefix, String key, List<String> args, Locale requestedLocale){
        if (requestedLocale == null){
            return getMessage(prefix, key, args);
        } else {
            return messageSource.getMessage(concatPrefixAndKey(prefix, key), args.toArray(), requestedLocale);
        }
    }

    public String getRequestLocalizedMessage(String prefix, String key){
        return getRequestLocalizedMessage(prefix, key, new ArrayList<>());
    }

    public String getRequestLocalizedMessage(String prefix, String key, List<String> args){
        return getMessage(prefix, key, args, LocaleContextHolder.getLocale());
    }

    private String concatPrefixAndKey(String prefix, String key){
        return prefix.concat(".").concat(key);
    }
}

 
2.新增訊息
現在,我們將在資原始檔夾中建立一個資源包,併為我們想要支援的每種語言新增一個屬性檔案。
messages.properties

## GENERIC MESSAGES
generic.message.i18n=Hey, this is a message in english.

messages_en.properties

## GENERIC MESSAGES
generic.message.i18n=Hey, this is a message in english.

messages_es.properties

## GENERIC MESSAGES
generic.message.i18n=Hey, este es un mensaje en español.

messages_fr.properties

## GENERIC MESSAGES
generic.message.i18n=Salut, c'est un message en français.


 
3.更新application.properties
在這裡,我們將新增兩個變數,一個用於預設語言,一個用於應用程式編碼。

# The default locale for our API
custom.app.locale=fr

# This sets the Spring boot encoding used for the API responses
spring.messages.encoding=ISO-8859-1

 
4.使用服務
最後一步,我們需要連線我們的訊息服務並使用它。為此,我建立了一個呼叫getRequestLocalizedMessage方法的簡單控制器。該方法使用LocalContextHolder來檢測Accept-Language標頭。如果標頭存在,它將以請求的語言返回響應。如果不是,它會以預設語言返回訊息。

@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private MessageService messageService;

    private final String prefixKey = "generic.message";

    @GetMapping(produces = {MediaType.APPLICATION_JSON_VALUE})
    public ResponseEntity<String> getTest(){
        return ResponseEntity.status(HttpStatus.OK).body(messageService.getRequestLocalizedMessage(prefixKey, "i18n"));
    }
}

您可以使用 MessageService 中的其他方法來實現相同的目標。

// You can pass the Locale as an argument to the getMessage function to get the message in a specific language

Locale requestedLocale = new Locale("es");
messageService.getMessage(prefixKey, "i18n", new ArrayList<>(), requestedLocale);

// OR

// You can use the getMessage without a specific locale to get the message in the default language
messageService.getMessage(prefixKey, "i18n");



 

相關文章