2013-09-24 65 views
6

Làm cách nào để triển khai chuyển đổi ngôn ngữ mà không phải đặt ngôn ngữ theo cách thủ công bên trong ứng dụng Android? Tôi biết ứng dụng sẽ tải strings.xml theo ngôn ngữ trong khi khởi động, nhưng tôi không muốn lựa chọn này được thực hiện dựa trên ngôn ngữ hệ thống, mà thay vào đó được người dùng chỉ định trong Cài đặt.Chuyển đổi ngôn ngữ bên trong ứng dụng android

Hoặc, có đặt thủ công ngôn ngữ địa phương không?

+0

Bạn có thể rõ ràng hơn không? Bạn muốn ngôn ngữ thay đổi dựa trên cài đặt ứng dụng thay vì cài đặt ngôn ngữ thiết bị? –

+0

Có, tôi muốn ngôn ngữ ứng dụng thay đổi dựa trên cài đặt ứng dụng. –

Trả lời

18

Bạn có thể mở rộng Lớp ứng dụng (bạn cũng phải khai báo lớp này trong tệp kê khai) và đặt thứ gì đó như thế này vào đó.

Bất cứ khi nào bạn muốn thay đổi ngôn ngữ mà bạn có thể gọi tới

((App)getApplicationContext()).changeLang(lang); 

từ bên trong hoạt động của bạn. R.string.locale_lang chỉ là một khóa được lưu trữ trong strings.xml cho các tùy chọn được chia sẻ

public class App extends Application { 

    private Locale locale = null; 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     if (locale != null) { 
      Locale.setDefault(locale); 
      Configuration config = new Configuration(newConfig); 
      config.locale = locale; 
      getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
     } 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); 
     String lang = settings.getString(getString(R.string.locale_lang), ""); 
     changeLang(lang); 
    } 

    public void changeLang(String lang) { 
     Configuration config = getBaseContext().getResources().getConfiguration(); 
     if (!"".equals(lang) && !config.locale.getLanguage().equals(lang)) { 

      Editor ed = PreferenceManager.getDefaultSharedPreferences(this).edit(); 
      ed.putString(getString(R.string.locale_lang), lang); 
      ed.commit(); 

      locale = new Locale(lang); 
      Locale.setDefault(locale); 
      Configuration conf = new Configuration(config); 
      conf.locale = locale; 
      getBaseContext().getResources().updateConfiguration(conf, getBaseContext().getResources().getDisplayMetrics()); 
     } 
    } 

    public String getLang(){ 
     return PreferenceManager.getDefaultSharedPreferences(this).getString(this.getString(R.string.locale_lang), ""); 
    } 



} 
+0

Cảm ơn. Tôi có ý tưởng. Nhưng, làm cách nào để khai báo nó trong tệp kê khai? không phải là hoạt động tôi đoán. –

+1

không phải là hoạt động nhưng bạn có thẻ ứng dụng bao quanh thẻ hoạt động. Là một thuộc tính cho ứng dụng, bạn phải thêm android: name = ". App" – kjurkovic

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