2012-10-16 93 views
69

我希望我的应用支持三种语言西班牙语,葡萄牙语&英文。并提供选择语言的应用程序。我已经取得用户选择语言时如何更改应用程序的语言?

1)3个可绘制文件夹drawable-es,drawable-pt,drawable。

2)3个值文件夹值-es,values-pt,values.Change根据语言的String.xml值。

我有imageView来选择language.When点击菜单打开包含选项英语,西班牙语,葡萄牙语。

我设置的Locale里面的选项选择应用此代码

public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.en: 
      Locale locale = new Locale("en"); 
      Locale.setDefault(locale); 
      Configuration config = new Configuration(); 
      config.locale = locale; 
      getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
      Toast.makeText(this, "Locale in English !", Toast.LENGTH_LONG).show(); 
      break; 

     case R.id.pt: 
      Locale locale2 = new Locale("pt"); 
      Locale.setDefault(locale2); 
      Configuration config2 = new Configuration(); 
      config2.locale = locale2; 
      getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics()); 

      Toast.makeText(this, "Locale in Portugal !", Toast.LENGTH_LONG).show(); 
      break; 

     case R.id.es: 
      Locale locale3 = new Locale("es"); 
      Locale.setDefault(locale3); 
      Configuration config3 = new Configuration(); 
      config3.locale = locale3; 
      getBaseContext().getResources().updateConfiguration(config3, getBaseContext().getResources().getDisplayMetrics()); 

      Toast.makeText(this, "Locale in Spain !", Toast.LENGTH_LONG).show(); 
      break; 


    } 
     return super.onOptionsItemSelected(item); 
} 

我在Manifest- 声明的android:configChanges = “区域设置”

这工作,但它有一些问题。

问题: -

当语言中的1),屏幕,它由语言选择的图像不会改变,但其它屏幕是变化。

2)方向改变后,应用程序根据手机的区域设置恢复语言。

+0

对于第二个问题尝试添加:'机器人:configChanges =“区域设置”'为AndroidManifest.xml中 –

+0

内的活动我已经在我的清单中添加每activitiy。 – mukesh

+0

您可以使用以下库,它提供语言列表,设置屏幕的首选项,并覆盖应用程序中的语言:https://github.com/delight-im/Android-Languages – caw

回答

127

它的摘录的网页:http://android.programmerguru.com/android-localization-at-runtime/

是很简单的改变在用户您的应用程序从语言列表中选择它的语言。有一个像下面这样的接受区域设置为String的方法(比如英文'en',印地文'hi'),为你的App配置语言环境并刷新当前活动以反映语言的变化。您应用的区域设置在您再次手动更改之前不会更改。

public void setLocale(String lang) { 
    Locale 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, AndroidLocalize.class); 
    startActivity(refresh); 
    finish(); 
} 

确保您输入以下软件包:

import java.util.Locale; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.content.res.Resources; 
import android.util.DisplayMetrics; 

清单中添加到活动机器人:configChanges = “区域|定位”

+2

是的。我可以提供网页的摘录。我需要提供的地方请让我知道。谢谢。 – Udhay

+2

+1提供摘录。 –

+0

作为您的附加信息,我的AVD变成了错误。所以我删除了'Intent refresh = new Intent(this,AndroidLocalize.class); startActivity(refresh);'并将它放在'onSharedPreferenceChange'方法中。简单地说,我把它放在'setLocale(String lang)'子类之外。现在它工作。 –

5

您应该从清单,删除android:configChanges="locale"这将导致活动重新加载,或覆盖onConfigurationChanged方法:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
super.onConfigurationChanged(newConfig); 
    // your code here, you can use newConfig.locale if you need to check the language 
    // or just re-set all the labels to desired string resource 
} 
1

好的解决方案在这里解释得非常好。但这里还有一个。

创建您自己的CustomContextWrapper类延伸ContextWrapper并使用它来更改整个应用程序的区域设置。 Here is a GIST有用法。

然后用保存的区域设置标识符例如CustomContextWrapper来呼叫。 'hi'活动生命周期方法中的印地文语言attachBaseContext。在这里使用:

@Override 
protected void attachBaseContext(Context newBase) { 
//fetch from shared preference also save to the same when applying. default here is en = English 
    String language = MyPreferenceUtil.getInstance().getString("saved_locale", "en"); 
    super.attachBaseContext(SnapContextWrapper.wrap(newBase, language)); 
} 
1

Udhay的示例代码运行良好。除Sofiane Hassaini和Chirag SolankI的问题外,重新入场时,它不起作用。我尝试调用Udhay的代码,而无需在super.onCreate(savedInstanceState);之前重新启动onCreate()中的活动。那就OK! 只有一点问题,菜单字符串仍然没有更改为设置的区域设置。

public void setLocale(String lang) { //call this in onCreate() 
    Locale 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, AndroidLocalize.class); 
    //startActivity(refresh); 
    //finish(); 
} 
相关问题