2011-12-31 45 views
22

Làm cách nào để biết ngôn ngữ (ngôn ngữ) hiện tại ứng dụng Android sử dụng để hiển thị văn bản cho người dùng?Làm cách nào để hiển thị ngôn ngữ (ngôn ngữ) hiện tại ứng dụng Android?

Tôi biết tôi có thể sử dụng Locale.getDefault() để nhận ngôn ngữ mặc định của OS. Nhưng nó có thể khác với ngôn ngữ được ứng dụng sử dụng để hiển thị văn bản và các tài nguyên khác, nếu ngôn ngữ này không được ứng dụng hỗ trợ.


Tôi cần xác định ngôn ngữ (ngôn ngữ) được ứng dụng hiển thị, do đó ứng dụng có thể chuyển ngôn ngữ tới máy chủ, để bản địa hóa kết quả được trả lại.

Trả lời

41

Giải pháp của riêng tôi là thêm vào strings.xml cặp khóa-giá trị locale=<locale code>, do đó context.getResources().getString(R.string.locale) sẽ trả lại mã miền địa phương cụ thể cho ngôn ngữ đã sử dụng.

+0

Tôi đoán giải pháp này được cho là một phần của câu hỏi của bạn. –

+1

@YaqubAhmad Tôi đã đến giải pháp này sau. Nhưng tôi vẫn đang chờ giải pháp tốt hơn. –

+1

Tôi thích giải pháp này vì sau đó tôi được đảm bảo chỉ lấy mã miền địa phương nếu tài nguyên dịch thuật của tôi đang được sử dụng. Và đó là lần duy nhất tôi muốn nó. Nếu không, tôi có thể nhận ngày tháng bằng một ngôn ngữ và các tài nguyên chuỗi khác bằng ngôn ngữ khác nếu tôi phạm phải một số lỗi lầm khi nhận được ngôn ngữ. – Suragch

32

Đó là vào cấu hình ứng dụng của bạn, vì vậy bạn có thể lấy nó với:

getResources().getConfiguration().locale 

này là khác nhau từ

Locale.getDefault() 

và hiển thị Locale rằng ứng dụng sử dụng mà có thể khác nhau.

Nó có thể khác nhau vì các nhà phát triển có thể thay đổi nó bằng cách cập nhật các cấu hình ứng dụng, kiểm tra: Resources.updateConfiguration

+0

Tài liệu cho fn thứ nhất mà bạn liệt kê cho biết "Tùy chọn người dùng hiện tại cho ngôn ngữ, tương ứng với bộ định danh tài nguyên miền địa phương". Nếu đây là 'sở thích người dùng hiện tại' thì nó khác với fn thứ hai như thế nào. Cả hai cách, hàm nào của lớp Locale thực hiện một cuộc gọi để nhận mã miền địa phương String (tương đương với phần mở rộng tài nguyên) có thể được truyền lại cho máy chủ (như trong câu hỏi ban đầu)? – Tom

+0

Câu trả lời này đề cập đến cách chính xác để nhận 'Locale' (dòng mã đầu tiên). Nhưng sai là có một sự khác biệt: 'Locale.getDefault()' tương đương với ví dụ đầu tiên. Nếu bạn muốn lấy mã ngôn ngữ, bạn phải gọi 'getLanguage()'. – caw

+6

Thật không may, điều này không hoạt động như tôi cần. Nếu đặt ngôn ngữ Hệ thống, ví dụ: đối với Dansk (Đan Mạch), 'getResources(). GetConfiguration(). Locale' trả về da_DK, trong khi hiển thị chuỗi tiếng Anh (từ' values ​​/ strings.xml'). –

0

Bạn có thể sử dụng mã dưới đây. Ví dụ, các chức năng được trình bày bên dưới có thể được đặt bên trong lớp mở rộng lớp Ứng dụng.

public class MyApplication extends Application { 
    ... 
    public static String APP_LANG; 
    private Context ctx = getBaseContext(); 
    private Resources res = ctx.getResources(); 
    public SharedPreferences settingPrefs; 
    ... 

    public void restoreAppLanguage(){ 
    /** 
    *Use this method to store the app language with other preferences. 
    *This makes it possible to use the language set before, at any time, whenever 
    *the app will started. 
    */ 
     settingPrefs = getSharedPreferences("ConfigData", MODE_PRIVATE); 
     String lang = settingPrefs.getString("AppLanguage", ""); 
     if(!settingPrefs.getAll().isEmpty() && lang.length() == 2){ 
      Locale myLocale; 
      myLocale = new Locale(lang); 
      Locale.setDefault(myLocale); 
      Configuration config = new Configuration(); 
      config.locale = myLocale; 
      res.updateConfiguration(config, res.getDisplayMetrics()); 
     } 
    } 

    public void storeAppLanguage(int lang) { 
    /** 
    *Store app language on demand 
    */ 
     settingPrefs = getSharedPreferences("ConfigData", MODE_PRIVATE); 
     Editor ed = settingPrefs.edit(); 

     Locale myLocale; 
     myLocale = new Locale(lang); 
     Locale.setDefault(myLocale); 
     Configuration config = new Configuration(); 
     config.locale = myLocale; 
     res.updateConfiguration(config, res.getDisplayMetrics()); 
     ed.putString("AppLanguage", lang); 

     ed.commit(); 
    } 

    public void setAppLanguage(String lang){ 
    /** 
    *Use this method together with getAppLanguage() to set and then restore 
    *language, whereever you need, for example, the specifically localized 
    *resources. 
    */ 
     Locale myLocale; 
     myLocale = new Locale(lang); 
     Locale.setDefault(myLocale); 
     Configuration config = new Configuration(); 
     config.locale = myLocale; 
     res.updateConfiguration(config, res.getDisplayMetrics()); 
    } 

    public void getAppLanguage(){ 
    /** 
    *Use this method to obtain the current app language name 
    */ 
     settingPrefs = getSharedPreferences("ConfigData",MODE_PRIVATE); 
     String lang = settingPrefs.getString("AppLanguage", ""); 
     if(!settingPrefs.getAll().isEmpty() && lang.length() == 2){ 
      APP_LANG = lang; 
     } 
     else APP_LANG = Locale.getDefault().getLanguage(); 
    } 
} 

Và rồi bất cứ nơi nào trong mã chính chúng ta có thể viết:

public class MainActivity extends ActionBarActivity { 
    ... 
    MyApplication app; 
    ... 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
     app = (MyApplication)getApplicationContext(); 
     ... 
     if(settingPrefs.getAll().isEmpty()){ 
      //Create language preference if it is not 
      app.storeAppLanguage(Locale.getDefault().getLanguage()); 
     } 

     //Restore previously used language 
     app.restoreAppLanguage(); 
     ... 
    } 
    ... 
    void SomethingToDo(){ 
     String lang = "en"; //"fr", "de", "es", "it", "ru" etc. 
     ... 
     app.getAppLanguage(); 
     app.setAppLanguage(lang); 
     ... 
     //do anything 
     ... 
     app.setAppLanguage(app.APP_LANG); 
    } 
    ... 
} 

Trong trường hợp của bạn, bạn, trong thời gian ngắn, có thể sử dụng getAppLanguage() và sau đó kiểm tra các biến công APP_LANG để có được những gì ngôn ngữ hiện đang được sử dụng .

0
public boolean CheckLocale(Context context, String app_language) { 
     Locale myLocale = new Locale(app_language); 
     Resources res = context.getResources(); 
     Configuration conf = res.getConfiguration(); 
     conf.locale = myLocale; 
     if(res.getConfiguration().locale==myLocale) 
      return true; 
     else 

     return false; 

    } 

Sử dụng phương pháp này.

3

Các mã sau đây làm việc cho tôi:

@TargetApi(Build.VERSION_CODES.M) 
private String getCurrentDefaultLocaleStr(Context context) { 
    Locale locale = context.getResources().getConfiguration().locale; 
    return locale.getDefault().toString(); 
} 

Lưu ý: Có một thay đổi nhỏ về cách bạn sẽ nhận được locale trên Build.VERSION_CODES.N. Đối với N và ở trên, mã sẽ trông giống như khối mã bên dưới; Tuy nhiên, tôi chỉ làm điều đó cho M và bên dưới như trong khối mã trên và nó tương thích với N và ở trên cũng vậy.

// Build.VERSION_CODES.N 
    Locale locale = context.getResources().getConfiguration().getLocales().get(0); 

tôi sau đây trên các ngôn ngữ quốc gia Tôi ủng hộ:

English:    en 
Traditional Chinese: zh_TW_#Hant 
Simplified Chinese: zh_CN_#Hans 
Spanish:    es_ES 
French:    fr_FR 
Japanese:   ja_JP 
German:    de_DE 

Có một danh sách các phương pháp cung cấp thông tin địa phương cùng một trong các định dạng khác nhau:

Locale.getDefault() .getCountry();
locale.getDefault(). GetISO3Language();
locale.getDefault().getISO3Country();
locale.getDefault(). GetDisplayCountry();
locale.getDefault(). GetDisplayName();
locale.getDefault(). GetDisplayLanguage();
locale.getDefault(). GetLanguage();
locale.getDefault(). ToString();

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