Android 多语言设置,这里演示中英文转换

有的项目需要国际化,这样在语言需求方面就比较多了,所以我们需要设置语言转换,语言有很多,这里示范中英文转换。

工具:Android Studio

1、生成需要转换语种的 string.xml 文件

2、语种使用设置

3、语种转换

 

1、生成需要转换语种的 string.xml 文件

在android studio项目中,点击 鼠标右键 res > new > android Resource Directory 将会看到如下界面

选中 Locale ,将会看到如下界面

选中英文语言后点击ok,就会生成右边界面看到的 values-en 文件夹,在里面创建一个新的 string.xml 文件,用来放置英文内容

如图,values 里面的 string.xml 用来设置中文以及常规加载, values-en 文件夹下的 string.xml 用来设置英文加载

 

2、语种使用设置

上面定义好语种放置位置之后就可以进行设置,让系统知道加载哪个文件夹下的语言文件

这里我们在 Application 里设置语言,代码如下:

import android.app.Application;
import com.self.iscopy.db.SPUtils;
import com.self.iscopy.utils.system.LanguageUtils;
import com.self.iscopy.utils.tl.L;
import java.util.Locale;
import cn.jpush.android.api.JPushInterface;

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        String language = SPUtils.getLanguage(this);
        if(!language.equals("Language")){
            Locale locale = LanguageUtils.getAppLocale();
            LanguageUtils.changeAppLanguage(this, locale,true);
        }

    }
}

上面的 SPUtils.getLanguage(this) 和 LanguageUtils.getAppLocale() 以及 LanguageUtils.changeAppLanguage(this, locale,true)

这三个方法参考 3 语种转换

3、语种转换

因为这里只有两种语言需要切换,所以我只用了一个按钮来控制切换

代码如下:

buLanguage.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String language = SPUtils.getLanguage(MainActivity.this);
        if(language.equals("Language")){
            LanguageUtils.changeAppLanguage(MainActivity.this, Locale.ENGLISH, true);
        }else{
            SPUtils.setLanguage("Language", MainActivity.this);
        }
    }
});

其中  SPUtils 是我定义的一个 SharedPreferences 工具类,用来保存语言设置,代码如下

//Language
public static String getLanguage(Context context){
    return share(context).getString("Language","Language");
}
//这里使用的是 apply() 方法保存,将不会有返回值
public static void setLanguage(String Language, Context context){
    SharedPreferences.Editor e = share(context).edit();
    e.putString("Language",Language);
    e.apply();
}

//创建
public static SharedPreferences share(Context context){
    SharedPreferences sharedPreferences = context.getSharedPreferences("data", Context.MODE_PRIVATE);
    return sharedPreferences;
}

上面我定义的是默认为 “Language” 就是如果 SharedPreferences 里 getLanguage 里面的值为 “Language” 时,显示默认的也就是中文语言。如果当前是中文语言,就调用 LanguageUtils 语言工具类,里面的 changeAppLanguage 语言设置方法进行设置,代码如下:

import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.util.DisplayMetrics;
import com.self.iscopy.db.SPUtils;
import java.util.Locale;

/**
 * creator iscopy .
 * time 2018/12/27
 * 语言设置
 */
public class LanguageUtils {

    /**
     * 更改app语言
     * @param context
     * @param locale
     * @param persistence
     */
    public static void changeAppLanguage(Context context, Locale locale, boolean persistence) {
        Resources resources = context.getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        Configuration configuration = resources.getConfiguration();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLocale(locale);
        } else {
            configuration.locale = locale;
        }
        resources.updateConfiguration(configuration, metrics);
        if (persistence) {
            SPUtils.setLanguage(locale.getLanguage(), context);//保存设置的语言
        }
    }

    /**
     * 返回当前使用语言
     * @return
     */
    public static Locale getAppLocale(){
        Locale locale = new Locale(Locale.ENGLISH.getLanguage());
        return locale;
    }
}

这样就简单的实现了语言切换的效果,效果展示:

 

不过,这里有一个缺陷,转换效果需要重启app才能够实现,因为数据已经加载好了,当前实时实现语言切换的需要后台数据

我们可以提示用户,需要重启APP才能实现语言切换,让用户去重启,也可以设置如下代码,在永用户同意的情况下调用,个人觉得可以使用弹框询问,如果是第一次进入时,可以在过了引导页后直接跳转跳转到语言设置去

//重启app
public void restart(){
    /*//关闭app
    Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);*/
    Intent intent = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
    PendingIntent restartIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager mgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    mgr.set(AlarmManager.RTC, System.currentTimeMillis(), restartIntent);
    android.os.Process.killProcess(android.os.Process.myPid());
}

如果有很多种语言设置也可以参照当前逻辑

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值