In Java/Spring, how to gracefully handle missing translation values?

前端 未结 2 1797
深忆病人
深忆病人 2021-01-18 09:16

I\'m using Java + Spring for an international website.

The 2 languages are ZH and EN (Chinese and English).

I have 2 files: messages.properties (for English

2条回答
  •  既然无缘
    2021-01-18 10:00

    You could create your own Custom MessageSource for this purpose.

    Something like:

    public class SpecialMessageSource extends ReloadableResourceBundleMessageSource {
    
          @Override
          protected MessageFormat resolveCode(String code, Locale locale) {
             MessageFormat result = super.resolveCode(code, locale);
             if (result.getPattern().isEmpty() && locale == Locale.CHINESE) {
                return super.resolveCode(code, Locale.ENGLISH);
             }
             return result;
          }
    
          @Override
          protected String resolveCodeWithoutArguments(String code, Locale locale) {
             String result= super.resolveCodeWithoutArguments(code, locale);
             if ((result == null || result.isEmpty()) && locale == Locale.CHINESE) {
                return super.resolveCodeWithoutArguments(code, Locale.ENGLISH);
             }
             return result;
          }
       }
    

    and configure this messageSource bean in spring xml as

    
    .....
    
    

    Now to get resolved Label you will be invoking MessageSource's either of the below methods

    String getMessage(String code, Object[] args, Locale locale);
    String getMessage(String code, Object[] args, String defaultMessage, Locale locale);
    

    resolveCode() will be called when your message label has arguments and you pass those arguments via args parameter like below
    invalid.number= {0} is Invalid
    and you invoke messageSource.getMessage("INVALID_NUMBER", new Object[]{2d}, locale)

    resolveCodeWithoutArguments() will be called when your message label does not have arguments and you pass args parameter as null
    validation.success = Validation Success
    and you invoke messageSource.getMessage("INVALID_NUMBER", null, locale)

提交回复
热议问题