2012-09-01 37 views
16

Tôi muốn cho phép người dùng thay đổi ngôn ngữ của ứng dụng của tôi bằng cách sử dụng spinner (hoặc bất kỳ cách nào). Tôi đã thử nhiều cách nhưng họ thay đổi ngôn ngữ của hoạt động này không phải tất cả các hoạt động và tôi muốn lưu nó để khi người dùng khởi động lại ứng dụng, anh ấy sẽ tìm thấy ngôn ngữ được chọn cuối cùng.Android cách thay đổi ngôn ngữ ứng dụng tại thời gian chạy

Trả lời

31

bạn có thể sử dụng mã này trong spinner hoặc bất kỳ cách nào bạn muốn

String languageToLoad = "en"; // your language 
Locale locale = new Locale(languageToLoad); 
Locale.setDefault(locale); 
Configuration config = new Configuration(); 
config.locale = locale; 
getBaseContext().getResources().updateConfiguration(config, 
getBaseContext().getResources().getDisplayMetrics()); 

thì bạn nên lưu các ngôn ngữ như thế này

SharedPreferences languagepref = getSharedPreferences("language",MODE_PRIVATE); 
SharedPreferences.Editor editor = languagepref.edit(); 
editor.putString("languageToLoad",languageToLoad); 
editor.commit(); 

và sử dụng cùng một mã trong mọi hoạt động trong onCreate() để tải languageToLoad từ SharedPreferences

+0

Liệu sự thay đổi này có nằm trong toàn bộ hệ thống Android hay nó sẽ chỉ thay đổi cho ứng dụng? Khi yêu cầu điều này để khi người dùng rời khỏi ứng dụng, họ sẽ có thể tiếp tục với ngôn ngữ mặc định là lang –

+0

@KarueBensonKarue mặc định sẽ chỉ thay đổi trong ứng dụng. –

+0

Tốt, cảm ơn phản hồi của bạn –

5

Sử dụng SharedPreferences để theo dõi ngôn ngữ mà người dùng đã chọn và sau đó đặt hoạt động sử dụng ngôn ngữ đó trong phương thức onCreate() và onResume(). Bằng cách này, nó sẽ tồn tại qua khởi động lại ứng dụng, vv

+1

tất cả nhà phát triển đều sử dụng cách này trong ứng dụng đó, tôi cảm thấy nó không rõ ràng lắm! –

+1

Tôi không thể nói cho các nhà phát triển khác vì tôi không có quyền truy cập vào mã số của họ –

+1

Vâng, đây là cách được đề xuất và rõ ràng hơn để truyền thông tin mà bạn có trong một Hoạt động cho các hoạt động khác. Cách khác, hacky/không hiệu quả hơn để làm điều đó là giữ dữ liệu như một trường tĩnh trong Activity, và truy cập nó từ các hoạt động khác, nhưng nếu ai đó hỏi, tôi đã không nói với bạn điều đó! :) –

2

Đây là câu hỏi cũ nhưng tôi sẽ trả lời: -) Bạn có thể mở rộng lớp Ứng dụng để áp dụng giải pháp của Abol3z trên mọi Hoạt động. Tạo lớp:

public class MyApplication extends Application { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
     String lang = preferences.getString("lang", "en"); 
     Locale locale = new Locale(lang); 
     Locale.setDefault(locale); 
     Configuration config = new Configuration(); 
     config.locale = locale; 
     getBaseContext().getResources().updateConfiguration(config, 
       getBaseContext().getResources().getDisplayMetrics());  
    } 
} 

Và thiết MyApplication như lớp ứng dụng trong manifest:

<application 
     android:name=".MyApplication" 
     ... 
/> 

Bạn có thể thiết lập giá trị lang (trong spinner của bạn):

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext()); 
preferences.edit().putString("lang", "en").commit(); 
+1

Theo [tài liệu] (https://developer.android.com/reference/android/app/Application.html#onCreate()) Ứng dụng onCreate() chỉ được gọi khi khởi động ứng dụng . Vì vậy, bạn không thực sự thay đổi ngôn ngữ trong thời gian chạy, nhưng khi bắt đầu ứng dụng tiếp theo, phải không? Chỉnh sửa: Đọc lại câu hỏi gốc, cách của bạn đã giải quyết được vấn đề sau khi tất cả. – Micha

1
btnChange.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mContext); 
      //preferences.edit().putString("lang", "bn").commit(); 

      String lang = preferences.getString("lang", "en"); 
      //Log.e("lang", "lang in Main Activity:"+lang); 
      if (lang.equalsIgnoreCase("en")){ 
       setLocale("bn"); 
       preferences.edit().putString("lang", "bn").commit(); 
       btnChange.setText("Eng"); 
      }else if(lang.equalsIgnoreCase("bn")){ 
       setLocale("en"); 
       preferences.edit().putString("lang", "en").commit(); 
       btnChange.setText("বাংলা"); 
      } 
     } 
    }); 


public void setLocale(String lang) { 

    myLocale = new Locale(lang); 
    Resources res = getResources(); 
    DisplayMetrics dm = res.getDisplayMetrics(); 
    Configuration conf = res.getConfiguration(); 
    conf.locale = myLocale; 
    res.updateConfiguration(conf, dm); 
    Intent refresh = new Intent(this, MainActivity.class); 
    startActivity(refresh); 
    finish(); 
} 

chúng tôi sử dụng hai ngôn ngữ cho mục đích kiểm tra. giữ tất cả chuỗi trong các thư mục khác nhau có tên là giá trị và giá trị bn.

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