其他分享
首页 > 其他分享> > android国际化(文字、布局、语音、多渠道打包)

android国际化(文字、布局、语音、多渠道打包)

作者:互联网

需求:

最近公司项目销售到了澳门,文字要适配繁体,语音播报要适配粤语,于是就有了国际化需求。主要有 文字、布局、语音 四个方面的适配。本文基于Android Studio开发。

着手:

文字适配:文字随系统语言变化而变化,文字适配搜索的话一堆文章,但是能把步骤写清楚的很少,我尽量把步骤写详细点。

1.将项目切换到Project模式。

2.找到项目/src/res目录,选中,右键New/Android Resource File,选中,出现弹框,适配文字,File Name填-strings,最下方Available qualifiers选中Locale,选中后找你需要适配的国家和地区,若没找到你适配的国家和地区,直接在Directory name中输入也一样,点击OK。(英文:en,中文简体:zh-rCN,中文繁体:香港zh-rHK、澳门zh-rMO、台湾zh-rTW,其余的自己找吧)

3.可以看到res下生成了你选中国家地区的values文件,如values-en,values-rMO,如果是简体换繁体,直接将简体strings文件内容复制到word文档中,直接选择简转繁就可将简体转为繁体,以WPS为例,选中审阅-简转繁,自己读下转完的文字,如果读不通建议到 在线简转繁网站上再翻译一次。

4.填好适配的文字。

5.注册广播,监听系统语言。

private class LoacleChanged extends BroadcastReceiver{

		@Override
		public void onReceive(Context context, Intent intent) {
            //判断是否修改系统语言返回
			if (Objects.equals(intent.getAction(), Intent.ACTION_LOCALE_CHANGED)) {
//根据系统语言进行某些切换操作
				if(getResources().getConfiguration().locale.getCountry().equalsIgnoreCase("US") {	
				}else {	
				}
			}
		}
	}

6.运行demo,修改系统语言就行

问题:

        1.系统语言刷新后,在Application中获取的文字不会自动刷新,需要在监听系统语言修改的方法李,增加刷新Application文字的方法。

         2.若适配了英文,它的字符长度和中文是不一样的,可能一个布局显示中文很合适,英文的话布局就不适合了,由此我们接下来进行布局适配。

布局适配:和strings文件一样,发现哪个布局不对劲,先找到那个布局,按照文字适配的步骤1、2,找到Android Resource File界面,你如果要修改layout,Resource type 选择layout,File name 填layout名称,选择地区点击OK,res会生成layout-XX文件夹。

如果本身有些style控制布局,可以不动layout,生成不同的styles适配。

总结:Android Resource File 弹窗的Resource type的选项对应了res下想要生成国际化的文件夹,File Name是想要生成的具体文件,Directory name是想要适配的国家城市。

语音适配:公司项目有语音播报功能,澳门地区应播报粤语,音量随系统音量变化而变化。

1.用的讯飞语音,新增个广东话播报,LoacleChanged 中判断系统语言,切换语音;

2.注册广播,监听系统音量;

/**
 * 监听系统音量
 */
class SettingContentObserver(val context: Context, handler:Handler):ContentObserver (handler){

    override fun deliverSelfNotifications(): Boolean {
        return super.deliverSelfNotifications()
    }


    override fun onChange(selfChange: Boolean) {
        super.onChange(selfChange)

        VoiceSpeak.setVoiceVolume(context)
    }

}
//系统音量utils
object VolumeUtils {
    lateinit var settingContentObserver:SettingContentObserver

    @JvmStatic
    @Synchronized
    fun registerVolumeChangeReceiver(context: Context){
        settingContentObserver = SettingContentObserver(context, Handler())

        context.contentResolver.registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, settingContentObserver)
    }

    @JvmStatic
    @Synchronized
    fun unRegisterVolumeChangeReceiver(context: Context){
        if(settingContentObserver != null){
            context.contentResolver.unregisterContentObserver(settingContentObserver)
        }
    }
}
object VoiceSpeak {
    val TAG = "VoiceSpeak"
    val CITY_HK = "HK"
    val CITY_TW = "TW"

    @JvmStatic
    val COUNTRY_US = "US"

    @JvmStatic
    @Synchronized
    fun speak(str:String){
        GlobalScope.launch (Dispatchers.IO){
            VoiceClient.speakText(str, VoiceType.SPEAK_BY_SYSTEM)
            Log.d(TAG,"语音播报 ${str}")
        }
    }

    @JvmStatic
    fun getCurrentLanguageVoiceName(context:Context):VoiceName{
        if(context.resources.configuration.locale.country.equals(CITY_HK, ignoreCase = true) ||
            context.resources.configuration.locale.country.equals(CITY_TW, ignoreCase = true)){
            return VoiceName.XIAOMEI
        }else{
            return VoiceName.XIAOYAN
        }
    }

    @JvmStatic
    fun setVoiceVolume(context: Context){
        val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
        val currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
        val maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
        val volume = (currentVolume/maxVolume.toFloat() *100).toInt()
        VoiceClient.setVolume(volume)

        Log.d(TAG,"当前音量: $currentVolume  max:${maxVolume} 设置值:${volume}")
    }

}

问题:之前公司用的百度语音,版本没有做限制,这次国际化选择了讯飞语音,它支持的最小版本为4.4,如果有老设备用的是4.4以下的呢?(公司的性质支持用不同的包进行块状升级,如果公司项目不支持,选择语音平台前就应考虑清楚)

多渠道打包:这个按需求来,我公司需求是分两个包:1.不修改 minSdkVersion 17,使用百度语音;2.修改 minSdkVersion 19,使用讯飞语音

步骤:

1.app的build.gradle文件下,android目录中添加代码,如下

android {
    //差异化打包,名字任意起
    flavorDimensions 'sun'
    //多渠道打包
    productFlavors {
        cantonese{
            minSdkVersion 19
        }
        ori{
            minSdkVersion 17
        }
    }
}

2.引入库修改,这里只有cantonese才需要引入讯飞库,引入写法  XXXImplementation ‘XXX’

cantoneseImplementation 'com.lachesis.androidlib:voice:1.1.19'

3.代码修改,除了库之外,使用的代码也可能不一样

    a.将项目切换到Project模式。

    b.找到项目/app/src,选中src文件夹,右键新建文件夹,为 productFlavors里你定义的名称,以cantonese为例,新建cantonese和ori文件夹,然后新建和main目录路径相同路径的类。

    c.建好文件夹后,选中BuildVariant ,会看到你多渠道的debug和release选项。

    d.必须选择某个渠道才能构建某个渠道的代码,否则你会发现,选择了Cantonese时修改ori的代码会报错哦。

 

 

标签:Context,context,val,适配,语音,fun,android,多渠道,打包
来源: https://blog.csdn.net/fsx_xiaomei/article/details/116590738