2012-11-01 46 views
10

Chúng tôi có một ứng dụng Android hoạt động như một ứng dụng khách cho một chương trình PC từ xa. Chúng tôi muốn thêm một tính năng để PC có thể hướng dẫn ứng dụng Android thay đổi ngôn ngữ của nó trong thời gian chạy, tức là, khởi động ứng dụng; đưa nó vào giao tiếp với PC; đôi khi PC nói với ứng dụng để chuyển sang, nói, tiếng Tây Ban Nha hoặc Trung Quốc.Thay đổi ngôn ngữ khi chạy?

Chúng tôi đã có tất cả các bố cục và tài nguyên chuỗi được thiết lập cho ngôn ngữ tương ứng của chúng. Ứng dụng của chúng tôi là ứng dụng duy nhất mà người dùng nhìn thấy nên không quan trọng nếu phần còn lại của thiết bị vẫn bằng tiếng Anh.

Có một chuỗi khác trên trang này tại Change language programmatically in Android nhưng dường như không đạt được kết luận.

Tôi có thể đặt. . .

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

. . . trong onCreate() trước setContentView() nhưng điều đó không thực sự hữu ích nếu tôi muốn thay đổi ngôn ngữ sau khi màn hình của tôi bật lên và đang chạy. Có cách nào để tải lại chế độ xem nội dung sau khi Hoạt động đã chạy không? Vì vậy, có cách nào thực tế để thay đổi ngôn ngữ một cách đáng tin cậy hoặc tôi có phải nói với sếp của mình không thể thực hiện ngoại trừ việc đặt toàn bộ thiết bị sang ngôn ngữ mới trước khi bắt đầu ứng dụng?

Trả lời

15

Kể từ API 11 bạn có thể sử dụng recreate như vậy có thể làm cho phương pháp này trong hoạt động của bạn:

private void restartInLocale(Locale locale) 
{ 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    Resources resources = getResources(); 
    resources.updateConfiguration(config, resources.getDisplayMetrics()); 
    recreate(); 
} 
+1

Phương thức 'updateConfiguration()' không được chấp nhận. Đây là giải pháp không được chấp nhận: http://stackoverflow.com/questions/40221711/android-context-getresources-updateconfiguration-deprecated – wilkas

+0

config.locale được khấu hao quá –

+0

@HasanAliKaraca cũng được đề cập trong câu trả lời được liên kết. – weston

3

Bạn có thể bắt đầu một phiên bản hoạt động mới và thoát khỏi hoạt động cũ. Dưới đây là ví dụ đầy đủ (chưa được kiểm tra) cách bạn có thể lưu trữ bất kỳ ngôn ngữ mong muốn nào và khởi động lại ứng dụng của mình. Bạn chỉ cần gọi số restartInLanguage bằng ngôn ngữ ưa thích của mình.

public class YourMainActivity extends Activity { 
    private static final String APP_SHARED_PREFS = "com.example.test"; 
    private SharedPreferences settings; 
    private Editor editor; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     settings=getSharedPreferences(APP_SHARED_PREFS, Activity.MODE_PRIVATE); 
     editor=settings.edit(); 

     Locale locale = new Locale(settings.getString("lang", "default-lang")); 
     Locale.setDefault(locale); 
     Configuration config = new Configuration(); 
     config.locale = locale; 
     getResources().updateConfiguration(config, getResources().getDisplayMetrics()); 

     // your stuff... 
    } 

    public void restartInLanguage(String lang) { 
     editor.putString("lang", lang); 
     editor.commit(); 
     Intent intent = getIntent(); 
     finish(); 
     startActivity(intent); 
    } 

    // ... 
} 
+0

tôi sẽ làm điều này từ đâu đến?Chương trình bắt đầu trong hoạt động chính, làm thế nào điều này sẽ thay đổi ngôn ngữ của màn hình chính? Hoặc bạn có nghĩa là để bắt đầu một trường hợp mới của hoạt động chính từ hoạt động chính và sau đó có các hoạt động chính cũ giết chính nó? (thậm chí có thể được thực hiện?) – user316117

+0

Có vì vậy nó là ... Bạn đặt mã đó ở trên trong * ngôn ngữ xử lý thay đổi * mà khởi động lại hoạt động chính của bạn. – rekire

+0

Tôi vẫn không thể phân tích cú pháp câu trả lời của bạn. Bạn đang nói tôi có thể khởi động lại hoạt động chính của mình * từ * hoạt động chính của tôi? Làm thế nào để làm điều đó? – user316117

0

Các giải pháp là sử dụng setContentView và controlLanguage (bạn cũng có thể gọi phương pháp này từ một lớp học toàn cầu) các phương thức trong MỌI hoạt động trong phương thức onResume sau khi thiết lập miền địa phương của bạn. Ví dụ:

@Override 
    public void onClick(View v) { 
     SharedPreferences.Editor editor; 
     editor = sharedPref.edit(); 
     Configuration config = new Configuration(getBaseContext().getResources().getConfiguration()); 
     String language = ""; 
     switch (v.getId()){ 
      case R.id.turkceButton: 
       editor.putString("language", "tr"); 
       language="tr"; 
       break; 
      case R.id.englishButton: 
       editor.putString("language", "en"); 
       language="en"; 
       break; 
     } 
     Locale locale = new Locale(language); 
     Locale.setDefault(locale); 
     config.locale = locale; 
     getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
     editor.commit(); 


@Override 
    protected void onResume() { 
     super.onResume(); 
     controlLanguage(getApplicationContext(), getResources()); 
     setContentView(R.layout.main); 
    } 

public void controlLanguage(Context context, Resources res){ 
     SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); 
     String language = sharedPref.getString("language","en"); 
     Locale locale = new Locale(language); 
     Locale.setDefault(locale); 
     res.getConfiguration().locale = locale; 
     res.updateConfiguration(res.getConfiguration(), res.getDisplayMetrics()); 
    } 
1

tôi đã kết hợp @weston và @rekire (cả +1) và extendet nó để xử lý này use-case:

  • ActivityA => ActivityB => SettingsActivity-changeLocale

Sau changeLocale trong SettingsActivity hoạt động gốc ActivityAActivityB cũng phải được tạo lại để phản ánh ngôn ngữ mới.

Giải pháp của tôi: ActivityA và ActivityB kế thừa từ LocalizedActivity mà kiểm tra trong onResume nếu miền địa phương đã thay đổi và kích hoạt một recreate() nếu cần thiết

Vì vậy, mọi hoạt động được thừa kế từ LocalizedActivity tự động xử lý các ứng dụng thay đổi miền địa phương cụ thể.

/** 
* An activity that can change the locale (language) of its content. 
* 
* Inspired by http://stackoverflow.com/questions/13181847/change-the-locale-at-runtime 
* 
* Created by k3b on 07.01.2016. 
*/ 
public class LocalizedActivity extends Activity { 
    /** if myLocale != Locale.Default : activity must be recreated in on resume */ 
    private Locale myLocale = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     fixLocale(this); 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     // Locale has changed by other Activity ? 
     if ((myLocale != null) && (myLocale.getLanguage() != Locale.getDefault().getLanguage())) { 
      myLocale = null; 
      recreate(); 
     } 
    } 

    /** 
    * Set Activity-s locale to SharedPreferences-setting. 
    * Must be called before onCreate 
    * @param context 
    */ 
    public static void fixLocale(Context context) 
    { 
     final SharedPreferences prefs = PreferenceManager 
       .getDefaultSharedPreferences(context); 
     String language = prefs.getString(Global.PREF_KEY_USER_LOCALE, ""); 
     Locale locale = Global.systemLocale; // in case that setting=="use android-locale" 
     if ((language != null) && (!language.isEmpty())) { 
      locale = new Locale(language); // overwrite "use android-locale" 
     } 

     if (locale != null) { 
      Locale.setDefault(locale); 
      Configuration config = new Configuration(); 
      config.locale = locale; 
      Resources resources = context.getResources(); 
      resources.updateConfiguration(config, resources.getDisplayMetrics()); 
      // recreate(); 

      if (context instanceof LocalizedActivity) { 
       ((LocalizedActivity) context).myLocale = locale; 
      } 
     } 
    } 
} 

Dưới đây là nguồn gốc của LocalizedActivity.javaSettingsActivity.java được sử dụng trong tôi A Photo Manager project

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