2011-06-29 40 views
16

Ok, tôi biết âm thanh tiêu đề điên :)Nhận chuỗi từ ngôn ngữ mặc định bằng chuỗi ở ngôn ngữ cụ thể

Đây là những gì tôi muốn. Ứng dụng của tôi được bản địa hóa cho người dùng thiết bị nhưng thông tin tôi gửi lại cho máy chủ cần phải là tất cả tiếng Anh. Ngôn ngữ mặc định của ứng dụng tiếng Anh của tôi.

Ví dụ, tôi có mảng:

  • Táo
  • Cam
  • Peaches

Tôi đã cục bộ mảng:

  • Яблоки
  • Апельсины
  • Персики

Khi người dùng Nga nhìn thấy danh sách và chọn vài mục - Tôi cần phải nhận được tương ứng với phiên bản tiếng Anh.

Tôi đoán câu trả lời của tôi sẽ tóm tắt cách thực hiện getString() và chuyển miền địa phương? Hoặc làm cách nào để tôi nhận được Array ở ngôn ngữ cụ thể?

Trả lời

1

Bạn phải xác định yếu tố này bằng phần tử khác, như id hoặc thậm chí là Tên tiếng Anh.

Không thể lấy chuỗi gốc cho một chuỗi được bản địa hóa cụ thể. Một trong những lý do là việc bản địa hóa các chuỗi không phải là một hàm chuyển tiếp, nhưng có nhiều lý do khác tại sao đây không phải là một hướng tốt.

+0

Đó là những gì tôi nghĩ .. – katit

23

Mã dưới đây sẽ lấy chuỗi cục bộ cho ngôn ngữ đánh bóng ngay cả khi miền địa phương mặc định trên thiết bị là khác nhau:

Configuration conf = getResources().getConfiguration(); 
conf.locale = new Locale("pl"); 
DisplayMetrics metrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metrics); 
Resources resources = new Resources(getAssets(), metrics, conf); 
/* get localized string */ 
String str = resources.getString(R.string.hello); 

Tôi hy vọng điều này cũng áp dụng đối với các loại tài nguyên khác như mảng, vì vậy nó là đủ để thay thế "pl" với "vi" ...

+0

Tôi thực sự không nghĩ rằng đó là cách tốt để vận hành địa phương như vậy. Nếu tôi hiểu chính xác, tôi cần đảm bảo chuyển đổi xem lại ngôn ngữ thích hợp trước khi tất cả các nội dung được bản địa hóa khác không bắt đầu phát sinh .. – katit

+0

@katit Tôi đã không kiểm tra điều đó, nhưng nếu bạn tiếp tục gọi 'getResources()' trên đối tượng ngữ cảnh của bạn thay vì sử dụng các tài nguyên đã tạo cho một miền địa phương cụ thể, nó luôn phải trả về các resouces đã được bản địa hóa đúng cách đối với ngôn ngữ thiết bị hiện tại và bạn không phải quay lại, tôi hy vọng tôi hiểu chính xác mối quan tâm của bạn – wjeshak

+0

'Tài nguyên' mới cũng có thể được lấy ra bởi' getResources(). getDisplayMetrics() '. Không cần phải liên quan đến trình quản lý cửa sổ. –

1

Bản địa hóa "lực lượng" này sẽ không hoạt động nếu thiết bị của bạn không có ngôn ngữ bạn đang buộc.

Không thể chứng minh điều này "chỉ như thế này", nhưng bây giờ tôi đang đấu tranh với vấn đề như vậy, nơi tôi buộc tài nguyên phải được trong ngôn ngữ/phù thủy ngôn ngữ không được cài đặt trên thiết bị (trên android 2.3.3) và vẫn nhận được chuỗi từ các nguồn tài nguyên giá trị-en (tiếng Anh).

Trên các thiết bị khác, với ngôn ngữ bạn đang buộc (nhưng không cần thiết được đặt làm ngôn ngữ hiện tại), bạn sẽ nhận được tài nguyên chính xác.

0

Tôi tin rằng, đây là cách an toàn để đi (mà không cần chạm cấu hình hiện tại):

Configuration conf = new Configuration(); 
conf.setToDefaults(); // That will set conf.locale to null (current locale) 
// We don't want current locale, so modify it 
conf.locale = new Locale(""); // Or conf.locale = Locale.ROOT for API 9+ 
           // or conf.setLocale(Locale.ROOT) for API 14+ 
// Since we need only strings, we can safely set metrics to null 
Resources rsrcDflt = new Resources(getAssets(), null, conf); 
String apples = srcDflt.getString(R.string.apples); // Got it at last! 
+2

Thực ra hàm tạo mới Tài nguyên (getAssets(), null, conf) ghi đè cấu hình hệ thống cho APK của bạn. Vì vậy, sau khi tạo đối tượng đó, bạn sẽ luôn nhận được phiên bản chuỗi mặc định. – ddmytrenko

2

Nếu bạn sử dụng JB 2.2.x hoặc cao hơn (về cơ bản API> = 17), bạn có thể sử dụng createConfigurationContext làm:

public String translate(Locale locale, int resId) { 
    Configuration config = new Configuration(context.getResources().getConfiguration()); 
    config.setLocale(locale); 
    return context.createConfigurationContext(config).getText(resId); 
} 
0

Tôi gặp vấn đề tương tự với ListPreference đã lưu tùy chọn "tên trạng thái" và "hình cơ thể". ListPreference nhận giá trị và mục nhập của nó từ một mảng được lưu trong thư mục "giá trị" được bản địa hóa. Giá trị danh sách giống nhau (tiếng Anh) nhưng các mục nhập đã được bản địa hóa (tiếng Anh và tiếng Do Thái).

cuối cùng tôi đã sử dụng đoạn mã sau:

public void OnSharedPreferenceChanged (SharedPreferences sharedPreferences, String key) 
{ 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    Preference pref = settings.findPreference(key); 
    pref.setSummary(sharedPreferences.getString(key, "")); 

    if (key.equalsIgnoreCase(PREF_STATE) 
     || key.equalsIgnoreCase(PREF_BODY_FIGURE)) 
    { 
     editor.putString(key, ((ListPreference) pref).getValue()); 
     editor.commit(); 
    } 
} 

Bằng cách đó các sở thích luôn cho thấy chuỗi cục bộ cho người sử dụng (như bản tóm tắt) nhưng lưu chuỗi tiếng Anh trong bộ nhớ sở thích mà cuối cùng đã được gửi đến máy chủ.

1

một này không có tác dụng phụ: API17 và cao hơn

Configuration config = new Configuration(context.getResources().getConfiguration()); 
config.setLocale(locale); 
return context.createConfigurationContext(config).getResources(); 
+0

Điều này làm việc cho tôi, cảm ơn! Lưu ý: để hỗ trợ nope4561759

0

tôi kết hợp hai phương pháp cần thiết để làm việc trên tất cả các phiên bản Android. See my answer here.

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