2011-09-27 47 views
8

tôi đang cố gắng để có được nội địa hóa i18n làm việc trên một Grails/enum Groovy,Làm thế nào để sử dụng i18n với một Grails/Groovy enum trong một g: chọn?

public enum Notification { 
    GENERIC(0), 
    CONFIRM_RESERVATION(100), 
    CONFIRM_ORDER(200), 
    CONFIRM_PAYMENT(300), 

    final int id; 

    private Notification(int id) { 
     this.id = id 
    } 

    String toString() { 
     id.toString() 
    } 

    String getKey() { 
     name() 
    } 
} 

Bất kỳ gợi ý về làm thế nào tôi có thể đạt được điều đó? Tôi cố gắng để đưa các classname vv đầy đủ trong một địa hóa nhưng điều này không noet có vẻ làm việc

<g:select from="${Notification.values()}" name="notification" valueMessagePrefix="full.path.to.package.Notification"/> 

Trả lời

13

Xin lỗi vì sự chậm trễ nhưng tôi nghĩ điều này có thể giúp bạn. Tôi đã có cùng một vấn đề với enums và i18n. Đây là giải pháp tôi thấy:

Sau enum của bạn được xác định trước, trong message.properties bạn file đặt một mục nhập cho mỗi giá trị của enum Ví dụ:

enum.value.GENERIC 
enum.value.CONFIRM_RESERVATION 
enum.value.CONFIRM_ORDER 
enum.value.CONFIRM_PAYMENT 

Sau đó, khi bạn muốn hiển thị các giá trị của enum trong một yếu tố lựa chọn sau đó làm như sau:

<g:select from="${path.to.package.Notification.values()}" keys="${path.to.package.Notification?.values()}" name="notification" valueMessagePrefix="enum.value"/> 

theo tài liệu Grails về thẻ lựa chọn, giá trị mà bạn đặt trong thuộc tính valueMessagePrefix được sử dụng tiếp theo là một dấu chấm và sau đó giá trị (.) của yếu tố của enum. Vì vậy, theo cách đó nó sẽ đi đến tập tin message.properties và tìm kiếm các dòng bạn đặt trước.

Bây giờ, điều khác bạn cần làm là ví dụ trong danh sách dữ liệu, hiển thị giá trị của enum cho mỗi bản ghi. Trong trường hợp đó, bạn cần phải làm như sau:

${message(code:'enum.value.'+fieldValue(bean: someDomainClass, field: "notification"))} 

Đây là nếu bạn có một lớp miền có một thuộc tính loại thông báo.

Hy vọng điều này sẽ hữu ích. Tạm biệt!

+1

Bạn xứng đáng nhận được +100 nhưng vì tôi không thể làm như vậy, tôi đã +1! Cảm ơn. –

7

Một phương pháp được trình bày trong this blog post bởi Rob Fletcher (từ năm 2009)

Hãy chắc chắn rằng lớp enum của bạn implements org.springframework.context.MessageSourceResolvable

Sau đó triển khai the methods it defines

Các vấn đề liên quan