Android应用出海必备技能 —— 多语言适配

引言:自杀式重生,他杀式淘汰。走别人的路,不是让别人无路可走,而是规避自己开辟一条新道路的风险。

软银集团创始人孙正义说过,在成熟的市场发生过的事情,在落后市场发生的概率就会增加。那么,创业这件事就是如此,如果国内市场饱和了,那么就换个地方。同样的模式,降维打击。你赚钱最稳的方式,就是把一个已经发生过的市场的业务,转移到还没有发生过的。因为坑都已经踩过了,所以相比做开创性的创新业务来说,风险更小。

那么就进入今天的主题,Android应用如何做多语言的适配?

Android多语言适配

切换语言

一行最关键的代码就是

java 复制代码
AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags("en"));

添加values文件夹

在多个国家的values文件中适配strings.xml,默认的values文件夹中字符串key的内容,尽量适配到所有本地化配置文件夹。如以下除了values-night是适配暗色模式的外,其他都要适配。

跟着系统语言设置联动

一行代码虽然能切换语言,但是在应用进程被杀掉重启应用后又会恢复到默认语言,为了保存状态还需要配置一下AndroidManifest.xml。那么,我们在application标签里面加入以下service。

xml 复制代码
<service 
    android:name="androidx.appcompat.app.AppLocalesMetadataHolderService" 
    android:enabled="true" 
    android:exported="true">
    <meta-data 
        android:name="autoStoreLocales" 
        android:value="true"/> 
</service>

注意事项

那么重点来了,如何完美实现应用内语言的实时更新呢?

java 复制代码
Intent intent = new Intent(context.getApplicationContext(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(intent);

这样可不可以?可以,但是不建议,有bug,具体自己去实验 。如果到就写完了,我就不会写这篇文章了。既然你都看到这了,那么我不妨推荐一下我的框架,里面有对多语言的支持。里面有个github.com/dora4/dora/... ,可以实现世界各国语言的切换。你可以使用updateLang方法,我还是建议你使用包装的系统api,使用updateSysLang这个方法。虽然有些语言的映射需要做一些小的修改,把下划线修改为横线,但是使用系统的方案可能会更加稳定一点。

kotlin 复制代码
val lang = LanguageUtils.getLangTag(this)
if (lang.equals(LanguageUtils.LANG_ZH_CN)) {
    AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags("zh"))
} else if (lang.equals(LanguageUtils.LANG_ZH_TW)) {
    AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags("zh-TW"))
} else {
    AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(lang))
}

以上的代码写在哪里呢?既然前文提到了,不建议使用重启activity的方式,那么建议使用的方式为,使用eventbus等消息框架发送消息通知语言设置页面上一个页面调用以上代码刷新界面,因为finish不会触发上个界面的生命周期。或者你也可以使用startActivityForResult和onActivityResult那一套。其他界面会在打开时重新创建并获取默认语言显示。

Dora SDK对多语言支持的源码

我们最后看一下Dora SDK的源代码。

dora.BaseActivity

java 复制代码
@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(LanguageUtils.attachBaseContext(newBase));
}

dora.BaseApplication

java 复制代码
@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(LanguageUtils.attachBaseContext(base));
    if (mAppDelegate == null) {
        mAppDelegate = new AppDelegate(base);
    }
    mAppDelegate.attachBaseContext(base);
}

如果你使用dora框架的话,会在继承Base类的情况下,自动帮你更新本地化配置。如果你使用系统的更新语言的方式,以上代码不会起作用,也不会影响业务逻辑。

相关推荐
阿巴斯甜12 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker13 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952714 小时前
Andorid Google 登录接入文档
android
黄林晴15 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android