2013-08-09 15 views
5

Korzystam z Java + Spring na potrzeby międzynarodowej strony internetowej.W języku Java/Spring, jak zręcznie obsługiwać brakujące wartości tłumaczenia?

Dwa języki to ZH i EN (chiński i angielski).

Mam 2 pliki: messages.properties (dla angielskich par klucz/wartość) i messages_zh.properties.

Witryna jest kodowana w języku angielskim za pomocą tagów #springMessage. Następnie używam serwisu Poeditor.com, aby tłumacze przedstawili wartości chińskie dla każdego angielskiego wyrażenia. Tak więc, chociaż plik English messages.properties jest zawsze kompletny i chociaż plik messages_zh.properties ma zawsze wszystkie klucze , plik messages_zh.properties będzie miał czasami puste wartości, ponieważ otrzymuję tłumaczenia od tłumaczy kilka dni później.

Potrzebuję, aby mój system wyświetlał równoważną wartość angielską (na mojej stronie), gdy brakuje chińskiej wartości.

W jaki sposób mogę nakazać Springowi "powrót" do używania języka angielskiego, gdy chińska wartość jest niedostępna? Potrzebuję tego, aby stało się to na podstawie wartości.

W tej chwili widzę puste etykiety przycisków w mojej witrynie, bez względu na chińską wartość. Wolałbym, aby angielski (domyślny język) był używany, gdy chiński jest pusty.

Odpowiedz

4

W tym celu można utworzyć własne niestandardowe źródło wiadomości.

Coś jak:

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

i skonfigurować tę MessageSource fasoli w wiosennej XML jako

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

Teraz zostanie rozwiązany Label będzie powołując MessageSource's jedną z poniższych metod

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

resolveCode() zostanie wywołany, gdy Komunikat r etykieta ma argumentów i przekazać te argumenty poprzez args parametr jak poniżej
invalid.number= {0} is Invalid
i wywołać messageSource.getMessage("INVALID_NUMBER", new Object[]{2d}, locale)

resolveCodeWithoutArguments() zostanie wywołana, gdy etykieta wiadomość nie ma argumentów i zdać args parametr jako zerowy
validation.success = Validation Success
i wywołujesz messageSource.getMessage("INVALID_NUMBER", null, locale)

+0

powód do objęcia stanowiska? – harrybvp

+0

Nie jestem pewien, kto cię zawiódł, ale awansuję i dam ci odpowiedź, ponieważ postawiłeś mnie na właściwej drodze. Nie jestem pewien, czy mój kod robi wszystko, co chcę. Może znajdziesz problemy. – Ryan

+0

@Ryan Zaktualizowałem swój kod i dodałem więcej wyjaśnień zgodnie z Twoimi potrzebami – harrybvp

1

@ Harrybvp odpowiedź dostałem mnie na właściwym tropie. Jest to kod, który wydaje się działać dla mnie (i jest jednostka-sprawdzalne kiedy drwić metod, które nazywamy „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); 

     } 

    } 

iw moim 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> 

Następnie w moich Velocity widoku szablonów:

dla normalnego klucza bez żadnych argumentów: #springMessage('menu_item1')

o klucz, który akceptuje argumenty #springMessageText('male_to_female_ratio' [3, 2])

następnie w wiadomościach. właściwości (tłumaczenia w języku angielskim): male_to_female_ratio = There is a {0}:{1} male-to-female ratio.