2013-08-09 50 views
5

Tôi đang sử dụng Java + Spring cho một trang web quốc tế.Trong Java/Spring, làm thế nào để xử lý một cách duyên dáng các giá trị dịch còn thiếu?

Hai ngôn ngữ là ZH và EN (tiếng Trung và tiếng Anh).

Tôi có 2 tệp: messages.properties (cho cặp khóa/giá trị bằng tiếng Anh) và messages_zh.properties.

Trang web được mã hóa bằng tiếng Anh bằng cách sử dụng #springMessage tags. Sau đó tôi sử dụng Poeditor.com để dịch giả cung cấp các giá trị của Trung Quốc cho mỗi cụm từ tiếng Anh. Vì vậy, mặc dù tệp messages.properties tiếng Anh luôn hoàn tất và mặc dù tệp messages_zh.properties luôn có tất cả các khóa , tệp messages_zh.properties đôi khi sẽ có các giá trị trống vì tôi nhận được bản dịch từ người dịch vài ngày một lát sau.

Tôi cần hệ thống của mình hiển thị giá trị tương đương bằng tiếng Anh (trên trang web của tôi) bất cứ khi nào giá trị Trung Quốc bị thiếu.

Làm cách nào để tôi có thể yêu cầu Spring "quay lại" để sử dụng tiếng Anh bất cứ khi nào giá trị bằng tiếng Trung không khả dụng? Tôi cần điều này xảy ra trên cơ sở giá trị theo giá trị.

Hiện tại, tôi thấy các nhãn nút trống trên trang web của mình ở bất kỳ nơi nào thiếu giá trị Trung Quốc. Tôi thà rằng tiếng Anh (ngôn ngữ mặc định) được sử dụng bất cứ khi nào người Trung Quốc trống.

Trả lời

4

Bạn có thể tạo Nguồn tin nhắn tùy chỉnh của riêng mình cho mục đích này.

Cái gì như:

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

và cấu hình đậu messageSource này trong xml mùa xuân như

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

Hiện hành để được giải quyết Label bạn sẽ được gọi MessageSource's một trong những phương thức dưới đây

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

resolveCode() sẽ được gọi khi bạn r nhãn nhắn có lý lẽ và bạn vượt qua những tranh cãi qua args thông số như dưới đây
invalid.number= {0} is Invalid
và bạn gọi messageSource.getMessage("INVALID_NUMBER", new Object[]{2d}, locale)

resolveCodeWithoutArguments() sẽ được gọi khi nhãn thông điệp của bạn không có lý lẽ và bạn vượt qua args tham số như là null
validation.success = Validation Success
và bạn gọi số messageSource.getMessage("INVALID_NUMBER", null, locale)

+0

lý do cho downvote? – harrybvp

+0

Tôi không chắc chắn ai đã downvoted bạn, nhưng tôi sẽ upvote bạn và cung cấp cho bạn tín dụng cho câu trả lời kể từ khi bạn đã cho tôi đi đúng hướng. Tôi không chắc liệu mã của tôi có làm mọi thứ tôi muốn hay không. Có lẽ bạn có thể tìm thấy vấn đề. – Ryan

+0

@Ryan Tôi cập nhật mã của tôi và thêm giải thích thêm như mong muốn của bạn – harrybvp

1

Câu trả lời của @ harrybvp giúp tôi đi đúng hướng. Đây là mã mà dường như làm việc cho tôi (và là đơn vị kiểm chứng khi bạn thử các phương pháp gọi là "siêu"):

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

     } 

    } 

và trong tôi 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> 

Sau đó, theo quan điểm của Velocity tôi mẫu:

Đối với một chìa khóa bình thường không có đối số: #springMessage('menu_item1')

Đối với một chìa khóa mà chấp nhận đối số: #springMessageText('male_to_female_ratio' [3, 2])

Sau đó, trong thông điệp. các thuộc tính (bản dịch tiếng Anh): male_to_female_ratio = There is a {0}:{1} male-to-female ratio.