2013-08-09 7 views
5

Ich benutze Java + Spring für eine internationale Website.In Java/Spring, wie man mit fehlenden Übersetzungswerten umgehen kann?

Die 2 Sprachen sind ZH und EN (Chinesisch und Englisch).

Ich habe 2 Dateien: messages.properties (für englische Schlüssel/Wert-Paare) und messages_zh.properties.

Die Website ist mit #springMessage-Tags in Englisch codiert. Dann benutze ich Poeditor.com, damit Übersetzer chinesische Werte für jede englische Phrase bereitstellen. Obwohl die englische Datei messages.properties immer vollständig ist und die Datei messages_zh.properties immer alle Schlüssel enthält, hat die Datei messages_zh.properties manchmal leere Werte, weil ich mehrere Tage Übersetzungen von den Übersetzern erhalte später.

Ich brauche mein System, um den entsprechenden englischen Wert (auf meiner Website) anzuzeigen, wenn der chinesische Wert fehlt.

Wie kann ich Spring sagen, dass es "zurückfallen" soll, wenn ein chinesischer Wert nicht verfügbar ist? Ich brauche das auf einer Value-by-Value-Basis.

Im Moment sehe ich leere Schaltflächenbeschriftungen auf meiner Website, wo immer ein chinesischer Wert fehlt. Ich würde lieber Englisch (die Standardsprache) verwenden, wenn der Chinese leer ist.

Antwort

4

Sie könnten zu diesem Zweck Ihre eigene benutzerdefinierte MessageSource erstellen.

Etwas wie:

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

und konfigurieren, um diese Message Bohne im Frühjahr xml als

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

Jetzt aufgelöst Label erhalten Sie MessageSource's eine der beiden folgenden Methoden werden Aufruf

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

resolveCode() wird aufgerufen, wenn Sie r Nachricht Label hat Argumente und Sie übergeben diese Argumente über args Parameter wie unter
invalid.number= {0} is Invalid
und Sie rufen messageSource.getMessage("INVALID_NUMBER", new Object[]{2d}, locale)

resolveCodeWithoutArguments() wird aufgerufen, wenn Sie Ihre Nachricht Etikett nicht Argumente haben, und Sie passieren args Parameter als null
validation.success = Validation Success
und Sie rufen messageSource.getMessage("INVALID_NUMBER", null, locale)

+0

Grund für den Downvote? – harrybvp

+0

Ich bin mir nicht sicher, wer Sie abgelehnt hat, aber ich werde Sie aufrüsten und Ihnen die Antwort geben, seit Sie mich auf die richtige Spur gebracht haben. Ich bin mir nicht sicher, ob mein Code alles tut, was ich will. Vielleicht kannst du Probleme finden. – Ryan

+0

@Ryan Ich aktualisierte meinen Code und fügte weitere Erklärungen hinzu, wie von Ihnen gewünscht – harrybvp

1

@ Harrybvp die Antwort hat mich auf dem richtigen Weg. Dies ist der Code, der für mich (und ist Einheit testbare, wenn Sie die Methoden verspotten, die „super“ nennen) scheint zu funktionieren:

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

     } 

    } 

und in meinem 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> 

Da ist in meiner Velocity View-Templates:

Für einen normalen Schlüssel ohne Argumente: #springMessage('menu_item1')

Für einen Schlüssel, das Argument akzeptiert: #springMessageText('male_to_female_ratio' [3, 2])

Dann in den Nachrichten. Eigenschaften (englische Übersetzungen): male_to_female_ratio = There is a {0}:{1} male-to-female ratio.

Verwandte Themen