2013-06-18 27 views
10

Tôi đang phát triển một ứng dụng Android và tôi muốn biết liệu tôi có thể đặt Enum.toString() đa ngôn ngữ hay không.Tạo Enum.toString() đã bản địa hóa

Tôi sẽ sử dụng số này Enum trên Spinner và tôi muốn sử dụng các văn bản đa ngôn ngữ.

public class Types 
{ 
    public enum Stature 
    { 
     tall (0, "tall"), 
     average(1, "average"), 
     small(2, "small"); 

     private final int stature; 
     private final String statureString; 

     Stature(int anStature, String anStatureString) { stature = anStature; statureString = anStatureString; } 

     public int getValue() { return stature; } 

     @Override 
     public String toString() { return statureString; } 
    } 
} 

Tôi không biết làm thế nào để sử dụng Context.getString() bên trong một Enum, và tôi đã hardcoded "cao", "trung bình" và "nhỏ" để kiểm tra nó. Tôi đã xác định rằng enum bên trong lớp trợ giúp.

này làm thế nào tôi sử dụng enum trên Spinner:

mSpinStature.setAdapter(new ArrayAdapter<Stature>(mActivity, android.R.layout.simple_dropdown_item_1line, Stature.values())); 

Bạn có biết làm thế nào tôi có thể làm điều đó?

+0

Điều này có thể giúp: http://stackoverflow.com/a/6350364/1025599 – Nachi

Trả lời

1

Giả sử con đường khu vực này

String resourceBundlePath = "my.package.bundles.messages" 

Trong gói my.package.bundles bạn có thể có messages.properties , messages_en_US.properties v.v.

Sau đó, sử dụng

ResourceBundle resourceBundle = ResourceBundle.getBundle(resourceBundlePath); 
String messageKey = "myFirstMessage"; 
String message = resourceBundle.getMessage(messageKey); 

message sẽ chứa giá trị của thuộc tính messageKey được xác định trên messages.properties. Nếu địa phương hiện tại thực sự là en_US bạn sẽ nhận được giá trị từ messages_en_US.properties. Nếu miền địa phương hiện nay là một cái gì đó bạn không cần phải nộp một thuộc tính cho giá trị sẽ từ mặc định messages.properties

Bạn cũng có thể gọi

ResourceBundle.getBundle(resourceBundlePath, myLocale); 

nhưng nói chung là tốt hơn để sử dụng locale nền tảng (có một xem các đối số jvm -Duser.language, -Duser.country)

Bạn có thể có ResourceBundle cho mỗi enum mà bạn muốn dịch bằng các phím tên thành phần enum và sử dụng nó trong toString() thực hiện enum của bạn:

@Override 
public String toString() { 
return resourceBudle.getString(super.toString()); 
} 
1

tôi sẽ rời khỏi enum như là và sử dụng ResourceBundle tiếp cận tiêu chuẩn http://docs.oracle.com/javase/tutorial/i18n/resbundle/concept.html sử dụng Enum.toString là chìa khóa

+0

Cảm ơn câu trả lời của bạn. Tôi đã thêm nhiều chi tiết hơn cho câu hỏi của mình. Những chuỗi được định nghĩa trong strings.xml. Và tôi không biết làm thế nào tôi có thể làm điều đó bằng cách sử dụng ResourceBundle. – VansFannel

+0

Không toString()! Sử dụng .name() –

-1
@Override 
public String toString() 
{ 
    //java 
    return ResourceBundle.getBundle().getString(id); 
    //android? 
    App.getContext().getString(id); 

} 
+0

Chào mừng bạn đến với StackOverflow. Bạn đang thiếu một số điều trong câu trả lời của bạn: một văn bản mô tả cho người đọc, cũng mã của bạn sẽ không hoạt động vì id không được khai báo. – RvdK

+0

oh cảm ơn. Sẽ cố gắng cẩn thận từ nay trở đi – Optional

6

Tôi tạo ra một thư viện đơn giản mà là một phần của dự án lớn của tôi (Xdroid):

compile 'com.shamanland:xdroid-enum-format:0.2.4' 

Bây giờ bạn có thể tránh được cùng một con khỉ trong công việc (tuyên bố lĩnh vực, nhà xây dựng, vv) cho tất cả enumetations bằng cách sử dụng chú thích:

public enum State { 
    @EnumString(R.string.state_idle) 
    IDLE, 

    @EnumString(R.string.state_pending) 
    PENDING, 

    @EnumString(R.string.state_in_progress) 
    IN_PROGRESS, 

    @EnumString(R.string.state_cancelled) 
    CANCELLED, 

    @EnumString(R.string.state_done) 
    DONE; 
} 

Và sau đó sử dụng phương pháp tiếp cận Java thông thường - phần mở rộng sử dụng các lớp java.text.Format:

public void onStateChanged(State state) { 
    EnumFormat enumFormat = EnumFormat.getInstance(); 
    toast(enumFormat.format(state)); 
} 

chuỗi.xml

<string name="state_idle">Idle</string> 
<string name="state_pending">Pending</string> 
<string name="state_in_progress">In progress</string> 
<string name="state_cancelled">Cancelled</string> 
<string name="state_done">Done</string> 

Look here làm thế nào để hiển thị Toast đơn giản.

Bạn cũng có thể biên dịch ứng dụng demo từ github.

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