【Android】让你的安卓app国际化、支持语言自动切换

摘要:
如果你在项目初期就想着要将应用推向国际市场,就要注意字符串一定要养成习惯全部写在string.xml里,不然后期再加真的很崩溃。创建多语言的string.xml我们的目标是,应用跟随系统语言改变而改变。然后选择Locale类别,添加进来,名称就叫string.xml然后选择对应的语言,地区选择全部这样你就得到了两份string.xml文件,一份是原版的即中文,另一份是英文的对照版本。
碎碎念

我在写app的时候,无论是布局上的字符串还是代码中的,我都喜欢直接敲上去,无视那个善意提醒的波浪线。

对于小项目来说,我觉得无可厚非,虽然不规范但方便直观,不需要苦于给字符串起名字。

如果你在项目初期就想着要将应用推向国际市场,就要注意字符串一定要养成习惯全部写在string.xml里,不然后期再加真的很崩溃。

创建多语言的string.xml

我们的目标是,应用跟随系统语言改变而改变。

首先是创建对应的语言的string.xml文件。

选中res/values文件夹,右键新建一个资源文件。

【Android】让你的安卓app国际化、支持语言自动切换第1张

然后选择Locale类别,添加进来,名称就叫string.xml

【Android】让你的安卓app国际化、支持语言自动切换第2张

然后选择对应的语言,地区选择全部

【Android】让你的安卓app国际化、支持语言自动切换第3张

这样你就得到了两份string.xml文件,一份是原版的即中文,另一份是英文的对照版本。

在中文的中创建一个字符串,会有相应的提示需要在英文对照版本中创建一份翻译的版本。

【Android】让你的安卓app国际化、支持语言自动切换第4张

【Android】让你的安卓app国际化、支持语言自动切换第5张

如何使用

在布局中可以直接使用@string形式来加载,在代码中使用:

 /*** 加载字符串
     * @paramid 字符串id
     * */
    public static String getStaticString(Context context,intid){
        returncontext.getResources().getString(id);
    }
自动切换

为了实现自动切换功能,我们需要封装一个LanguageUtil(参考自 简书

importandroid.content.Context;
importandroid.content.SharedPreferences;
importandroid.content.res.Configuration;
importandroid.os.Build;
importandroid.util.DisplayMetrics;

importcom.google.gson.Gson;

importjava.util.Locale;

public classLanguageUtil {
    private static final String LOCALE_SP = "LOCALE_SP";
    private static final String LOCALE_SP_KEY = "LOCALE_SP_KEY";




    public staticLocale getLocale(Context context) {
        SharedPreferences spLocale =context.getSharedPreferences(LOCALE_SP, Context.MODE_PRIVATE);
        String localeJson = spLocale.getString(LOCALE_SP_KEY, "");
        Gson gson = newGson();
        return gson.fromJson(localeJson, Locale.class);
    }


    private static voidsetLocale(Context pContext, Locale pUserLocale) {
        SharedPreferences spLocal =pContext.getSharedPreferences(LOCALE_SP, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit =spLocal.edit();
        String json = newGson().toJson(pUserLocale);
        edit.putString(LOCALE_SP_KEY, json);
        edit.apply();
    }


    public static booleanupdateLocale(Context context, Locale locale) {
        if(needUpdateLocale(context, locale)) {
            Configuration configuration =context.getResources().getConfiguration();
            if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.JELLY_BEAN_MR1) {
                configuration.setLocale(locale);
            } else{
                configuration.locale =locale;
            }
            DisplayMetrics displayMetrics =context.getResources().getDisplayMetrics();
            context.getResources().updateConfiguration(configuration, displayMetrics);
            setLocale(context, locale);
            return true;
        }
        return false;
    }

    public static booleanneedUpdateLocale(Context pContext, Locale newUserLocale) {
        return newUserLocale != null && !getCurrentLocale(pContext).equals(newUserLocale);
    }
    public staticLocale getCurrentLocale(Context context) {
        Locale locale;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //7.0有多语言设置获取顶部的语言
            locale = context.getResources().getConfiguration().getLocales().get(0);
        } else{
            locale =context.getResources().getConfiguration().locale;
        }
        returnlocale;
    }
}

紧接着我们创建一个Application来自动加载

public class MyApplication extendsApplication {
    @Override
    public voidonCreate() {
        super.onCreate();
        languageWork();
    }

    @Override
    public voidonConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        languageWork();
    }

    private voidlanguageWork() {
        Locale locale = LanguageUtil.getLocale(this);
        LanguageUtil.updateLocale(this, locale);
    }
}

在AndroidManifest.xml中配置一下:

 android:name=".MyApplication"

如图所示:

【Android】让你的安卓app国际化、支持语言自动切换第6张

愉快的去使用吧~

免责声明:文章转载自《【Android】让你的安卓app国际化、支持语言自动切换》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇element Image组件SqlServer临时表下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#--反射基础

以下是学习笔记: 一,反射的基本信息 DLL/EXE: 主要区别EXE文件有一个入口,DLL文件不能运行,但是DLL能拿到其他地方去使用 metadata(元数据):描述exe/dll文件的一个清单,记录了exe/dll文件中有哪些类,属性,特性,字段。。。 Reflection(反射):用来操作或获取元数据metadata 有什么作用: 1,更新程序(...

在datasnap 中使用unidac 访问数据(服务器端)

从delphi 6 开始,datasnap 作为delphi 自带的多层框架,一直更新到最新的delphi 10.3 。同时逐步增加了很多新的功能 ,比如支持REST 调用,支持 IIS ,apache 等服务器。今天简单介绍一下如何在datasnap 中使用unidac 访问数据库。 首先,按照向导生成一个标准的datasnap 服务器。 、...

SALT+HASH撒盐加密

#region 撒盐加密 string salt = Guid.NewGuid().ToString(); byte[] passwordAndSaltBytes = System.Text.Encoding.UTF8.GetBytes(model.Password + salt);...

MD5加密解密以及设置salt(盐值)

MD5算法 package com.oracle.jsp.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * * @author wjxing * */ public class MD5 {...

重磅!JDK 17 发布,Oracle 宣布从 JDK 17 开始正式免费。。

上一版:JDK 16 正式发布,一次性发布 17 个新特性…不服不行! JDK 17 正式发布+免费 牛逼啊,JDK 16 刚发布半年(2021/03/16),JDK 17 又如期而至(2021/09/14),这个时间点牛逼啊,蹭苹果发布会的热度?记得当年 JDK 15 的发布也是同天,巧了。。 虽然 iPhone 13 发布了,但真的不是 13 香,真...

rabbitMQ第二篇:java简单的实现RabbitMQ

前言:在这里我将用java来简单的实现rabbitMQ。下面我们带着下面问题来一步步的了解和学习rabbitMQ。 1:如果消费者连接中断,这期间我们应该怎么办 2:如何做到负载均衡 3:如何有效的将数据发送到相关的接收者?就是怎么样过滤 4:如何保证消费者收到完整正确的数据 5:如何让优先级高的接收者先收到数据 一:"Hello RabbitMQ" 下面...