Android动态改变应用程序语言

           Android动态改变应用程序语言

今天主要是记录下如何让我们的应用实现语言国际化,实现本地化资源的国际化很简单,网络数据可能比较麻烦……..,一般我们实现本语言国际化主要是建立不同的values,应用app会自动加载不同的文件。
eg:
中文:values-zh-rCN
英文: values-en

今天主要实现的功能是,在app的应用程序中手动设置语言类型,应用会自动加载相关的values;
思路比较简单,首先获取到当前的系统语言,保存在SharedPreferences里,然后再Activity中注册个广播来监听语言是否发生改变,当我们手动改变语言的时候,同sendBroadcast(intent);通知应用发生改变,lsu.saveLanguage(language);然后保存当前的语言;
lsu.refreshLanguage(); 通知语言发生改变

/**
* 语言工具类
* @author joe.xiang
*/
public class LanguageSettingUtil {
//单例模式-
private static LanguageSettingUtil instance;
private Context context;
//存储当前系统的language设置-
private String defaultLanguage;
//存储当前系统Locale-
private Locale defaultLocale;
public final static String ENGLISH = “en”;
public final static String CHINESE = “zh”;

private LanguageSettingUtil(Context paramContext) {
    //得到系统语言-
    Locale localLocale = Locale.getDefault();
    Log.i("language", localLocale.getLanguage());
    this.defaultLocale = localLocale;

    //保存系统语言到defaultLanguage
    String str = this.defaultLocale.getLanguage();
    this.defaultLanguage = str;
    this.context = paramContext;
}

//检验自身是否被创建-
public static LanguageSettingUtil get() {
    if (instance == null)
        throw new IllegalStateException(
                "language setting not initialized yet");
    return instance;
}

//初始化-
public static void init(Context paramContext) {
    if (instance == null) {
        instance = new LanguageSettingUtil(paramContext);
    }
}

// 创建Configuration-
private Configuration getUpdatedLocaleConfig(String paramString) {

    Configuration localConfiguration = context.getResources()
            .getConfiguration();
    Locale localLocale = getLocale(paramString);
    localConfiguration.locale = localLocale;
    return localConfiguration;
}

//得到APP配置文件目前的语言设置-
public String getLanguage() {
    SharedPreferences localSharedPreferences = PreferenceManager
            .getDefaultSharedPreferences(this.context);
    //如果当前程序没有设置language属性就返回系统语言,如果有,就返回以前的-
    return localSharedPreferences.getString("language",
            this.defaultLanguage);
}

//如果配置文件中没有语言设置-
public Locale getLocale() {
    String str = getLanguage();
    return getLocale(str);
}

//创建新Locale并覆盖原Locale-
public Locale getLocale(String paramString) {
    Locale localLocale = new Locale(paramString);
    Locale.setDefault(localLocale);
    return localLocale;
}

//刷新显示配置-
public void refreshLanguage() {
    String str = getLanguage();
    Resources localResources = this.context.getResources();
    if (!localResources.getConfiguration().locale.getLanguage().equals(str)) {
        Configuration localConfiguration = getUpdatedLocaleConfig(str);
        // A structure describing general information about a display, such
        // as its size, density, and font scaling.
        DisplayMetrics localDisplayMetrics = localResources
                .getDisplayMetrics();
        localResources.updateConfiguration(localConfiguration,
                localDisplayMetrics);
    }
}

//设置系统语言-
public void saveLanguage(String paramString) {
    PreferenceManager.getDefaultSharedPreferences(this.context).edit()
            .putString("language", paramString).commit();
}

//保存系统的语言设置到SharedPreferences-
public void saveSystemLanguage() {
    PreferenceManager.getDefaultSharedPreferences(this.context).edit()
            .putString("PreSysLanguage", this.defaultLanguage).commit();
}

public void checkSysChanged(String cuerSysLanguage) {
    //如果系统语言设置发生变化-
    if (!cuerSysLanguage.equals(PreferenceManager
            .getDefaultSharedPreferences(this.context).getString(
                    "PreSysLanguage", "zh"))) {
        //如果系统保存了this对象,就在这里修改defaultLanguage的值为当前系统语言cuerSysLanguage
        this.defaultLanguage = cuerSysLanguage;
        saveLanguage(cuerSysLanguage);
        saveSystemLanguage();
    }
}

/* 所有父类Activity/
public class SetingActivity extends SupperActivity {

private EditText language;
private Button seting,bacck;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_setting);
    InitView();
}


public void InitView(){
    language = (EditText) findViewById(R.id.language);
    seting = (Button) findViewById(R.id.seting);
    bacck = (Button) findViewById(R.id.bacck);
    seting.setText(getResources().getString(R.string.seting));
    bacck.setText(getResources().getString(R.string.bacck));
    seting.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            String strlanguage =  language.getText().toString().trim();
            // TODO Auto-generated method stub
            Log.i("bb",strlanguage);
            if(strlanguage!=null && !"".equals(strlanguage)){
                Intent intent = new Intent();
                intent.setAction("com.example.textcontrylanguage.language");
                intent.putExtra("language", strlanguage);
                //通知广播发生改变
                sendBroadcast(intent);
            }
        }
    });

    bacck.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            SetingActivity.this.finish();
        }
    });
}

最后附上Demo的源码:http://download.csdn.net/detail/xianglinglong/9362715

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值