복붙노트

[SPRING] Java / Spring에서 누락 된 변환 값을 정상적으로 처리하는 방법은 무엇입니까?

SPRING

Java / Spring에서 누락 된 변환 값을 정상적으로 처리하는 방법은 무엇입니까?

국제 웹 사이트에 Java + Spring을 사용하고 있습니다.

2 개의 언어는 ZH와 EN (중국어와 영어)입니다.

두 파일 : messages.properties (영어 키 / 값 쌍) 및 messages_zh.properties 있습니다.

이 사이트는 #springMessage 태그를 사용하여 영어로 코딩되어 있습니다. 그런 다음 Poeditor.com을 사용하여 각 영어 구에 중국어 값을 제공합니다. 따라서 영문 messages.properties 파일은 항상 완전하지만 messages_zh.properties 파일에는 항상 모든 키가 있지만 messages_zh.properties 파일은 수 일 후에 번역사의 번역을 받기 때문에 때때로 공백 값을 갖습니다.

중국인의 가치가 없어지면 내 웹 사이트에서 동등한 영어 값을 표시 할 수있는 시스템이 필요합니다.

어떻게하면 중국어 값을 사용할 수 없을 때마다 영어를 사용하도록 Spring이 "후퇴"하도록 말할 수 있습니까? 가치 기준으로이 작업이 필요합니다.

현재 중국의 가치가없는 곳이라면 내 사이트에 빈 버튼 레이블이 표시됩니다. 나는 중국어가 공백 일 때마다 영어 (기본 언어)를 사용하려고한다.

해결법

  1. ==============================

    1.이 목적을 위해 사용자 지정 MessageSource를 만들 수 있습니다.

    이 목적을 위해 사용자 지정 MessageSource를 만들 수 있습니다.

    같은 것 :

    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;
          }
       }
    

    Spring에서이 messageSource bean을 다음과 같이 설정한다.

    <bean id="messageSource" class="SpecialMessageSource">
    .....
    </bean>
    

    이제 Label을 해결하기 위해 MessageSource의 아래 메소드 중 하나를 호출하게됩니다.

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

    resolveCode ()는 메시지 레이블에 인수가 있고 아래 인수와 같은 인수를 전달할 때 호출됩니다 invalid.number = {0}은 (는) 잘못되었습니다. messageSource.getMessage ( "INVALID_NUMBER", 새 Object [] {2d}, 로켈)를 호출하면

    resolveCodeWithoutArguments ()는 메시지 레이블에 인수가없고 args 매개 변수를 null로 전달할 때 호출됩니다. validation.success = 유효성 검사 성공 messageSource.getMessage ( "INVALID_NUMBER", null, locale)를 호출합니다.

  2. ==============================

    2.@ harrybvp의 대답은 올바른 방향으로 나를 잡았습니다. 이것은 나를 위해 작동하는 것으로 보이는 코드입니다 (그리고 "super"라고 불리는 메소드를 조롱 할 때 단위 테스트 가능합니다) :

    @ harrybvp의 대답은 올바른 방향으로 나를 잡았습니다. 이것은 나를 위해 작동하는 것으로 보이는 코드입니다 (그리고 "super"라고 불리는 메소드를 조롱 할 때 단위 테스트 가능합니다) :

        public class GracefulMessageSource extends org.springframework.context.support.ReloadableResourceBundleMessageSource {
    
            final static private Locale defaultLocale = Locale.ENGLISH;
    
            @Override protected MessageFormat resolveCode(final String code, final Locale locale) {
                MessageFormat result = superResolveCode(code, locale);
    
                if (result.toPattern().isEmpty() && !locale.equals(this.defaultLocale)) {
                    result = superResolveCode(code, this.defaultLocale);
                }
    
                return result;
            }
    
            @Override protected String resolveCodeWithoutArguments(final String code, final Locale locale) {
                String result = superResolveCodeWithoutArguments(code, locale);
    
                if (result.isEmpty() && !locale.equals(this.defaultLocale)) {
                    result = superResolveCodeWithoutArguments(code, this.defaultLocale);
                }
    
                return result;
            }
    
            protected MessageFormat superResolveCode(final String code, final Locale locale) {
                return super.resolveCode(code, locale);
    
            }
    
            protected String superResolveCodeWithoutArguments(final String code, final Locale locale) {
                return super.resolveCodeWithoutArguments(code, locale);
    
            }
    
        }
    

    그리고 내 webmvc-config.xml :

    <bean id="messageSource" class="com.mycode.fe.web.GracefulMessageSource">
        <property name="basename">
            <value>${content.path.config}/WEB-INF/messages</value>
        </property>
        <property name="defaultEncoding" value="UTF-8" />
        <property name="cacheSeconds" value="2"/>
        <property name="fallbackToSystemLocale" value="true"/>
    </bean>
    

    그런 다음 내 Velocity보기 템플릿에서

    인수가없는 일반 키 : #springMessage ( 'menu_item1')

    인수를 허용하는 키 : #springMessageText ( 'male_to_female_ratio'[3, 2])

    그런 다음 messages.properties (영문 번역본)에서 : male_to_female_ratio = {0} : {1} 명의 남녀 비율이 있습니다.

  3. from https://stackoverflow.com/questions/18152710/in-java-spring-how-to-gracefully-handle-missing-translation-values by cc-by-sa and MIT license