Android的应用多语言开发

2020-02-02

关键字:自动切换语言



在 Android 应用开发中,最简单的多语言实现就是直接在 res 目录下将你需要的不同语言的资源以 values-xx 子目录的形式存放。

例如,res 目录下默认只有一个 values 目录,这个目录下存放的资源就是应用默认使用的资源,包括文字、色彩值、尺寸、样式等等等等。

如果你默认目录下使用的是中文,现在想要增加一个英文,则只需要自行创建多一个目录,以名称 values-en 命名即可。然后将 values 目录下的资源文件翻译好后拷贝过去即可。

这种情况下应用选择的语言环境是跟着 Android 系统走的,即系统的显示语言是什么它就读取哪个目录下的资源。当我们的应用中没有与系统对应的资源时,就使用默认的 values 目录下的资源。

想象一下,这种可以将不同语言分目录保管,并自动加载的机制是不是可以让我们的应用更容易做到“全球化”?

举个例子来说就是,我们不说文字,这个太肤浅。假如你正在开发的一款应用,它的其中一个页面的基本色调是天蓝色。而偏偏有一个民族的人非常忌讳天蓝色,他们更喜欢大红色。那我们有这套机制解决起这个问题来岂不易哉。代码完全不用改,只需要准备两套基本色调配置表即可。这种机制真是太妙了。

言归正传。世界上不同语言种族这么多,我们很难记得住每个国家地区的对应缩写是什么。那我们要如何来创建这个 values-xx 目录呢?

如果你是使用 Android Studio 来开发应用的,那这个就不难。只需要按照如下步骤操作即可由 Android Studio 自动帮你创建对应目录:

当然,其实也完全可以手动创建目录与资源文件,如果你知道它的对应缩写的话。

而 Android Studio 中也有很方便的多语言资源编辑工具,可以让开发者很方便地以对照式来编辑不同语言的资源。其操作步骤如下图所示:

以上是跟随 Android 系统来切换显示语言的情况。但有些应用可能还需要能够摆脱操作系统的设置,自行选择显示语言。这该怎么办呢?

其实也不难。只需要在上述步骤的基础之上,再在应用启动时自行设置一下显示语言就可以了。

为了全局统一,一般是在自定义的 Application 类的初始化中来设置。

这里简单说一下笔者的一个比较简单的解决方案。

因为是应用自行控制语言选项,因为应用需要自行保存当前选择的显示语言。笔者采用的是 SharedPreferences 来保存。

从 SharedPreferences 中读取出要显示的语言以后,再通过如下代码设置即可:

        Configuration conf = context.getResources().getConfiguration();
        conf.locale = isThai ? new Locale(LOCALE_THAI) : Locale.SIMPLIFIED_CHINESE;
        context.getResources().updateConfiguration(conf, context.getResources().getDisplayMetrics());

上述代码已将关键的一行以加粗标红表示出来了。需要注意的是,Locale 类默认提供的语言并不全面。如果恰巧你需要的语言各类它没有默认提供,正如笔者上面所需要的泰语言一样,那就需要你自行实例化一个 Locale 对象。实例化时直接将对应语言的缩写作为参数传入即可。如笔者上面的实例化泰语言时,它的写法就是:new Locale("th");。

如此即可。

对了,这种方式似乎是针对较低版本的 Android 系统的,这段代码笔者最高在 Android7.0 上运行通过过。其它更高版本的系统似乎还有另外一种写法,那种写法笔者没有去研究过,就不贴出来了,仅在此提一下。

最后,笔者不得不提一下应用多语言显示与 AppCompact 主题之间的冲突。

这个冲突当初可是困扰了笔者一整天。

具体现象就是在正确设置好 values-xx 资源目录以后,发现应用怎么都不能切换至对应语言风格去显示。无论是用跟随系统显示语言的方式还是手动指定显示语言的方式。

当时笔者真是各种加打印,各种百度谷歌都找不到原因。

在几近绝望的时候偶然发现在另外一个 Activity 中能够将语言给切换过来。(注:笔者开发的是一款需要登录的应用,且这个应用有免密登录功能。笔者先前保存过登录信息,因此应用每次打开都只显示一个固定的界面。)

唯独那个主 Activity 的语言死活不能切换。

有了这个对照,至少证明了笔者的资源配置没有错,甚至也可以证明手动切换显示语言的代码也没有错。

那就只能在这两个 Activity 中找差异了。

经过对比,笔者最终发现是因为这两个 Activity 所使用的主题样式,就是 style 不同而导致另一个 Activity 不能切换显示语言的。

这个不能让应用切换显示语言的主题就是 AppCompact 主题:

 <style name="App_Compact_Theme" parent="Theme.AppCompat.Light.NoActionBar"/>

笔者的主 Activity 使用到了 Fragment,因此最开始继承了 AppCompactActivity 类,而这个 AppCompactActivity 类又要求其主题必须是 AppCompact 的主题。至于为什么这个主题会不能切换显示语言,笔者倒是没有去深究,也觉得没有必要。

最终笔者将主 Activity 的父类换成 FragmentActivity,再将 style 更换成 <style name="Normal_theme" parent="android:Theme.Light.NoTitleBar"/> 以后成功地解决了问题。

以上就是笔者关于Android应用多语言开发的心得与笔记。



Android的应用多语言开发

原文地址:https://www.cnblogs.com/chorm590/p/12229889.html

时间: 2024-10-13 10:07:14

Android的应用多语言开发的相关文章

用C++语言开发Android程序 配置开发环境

如果你是一个C++语言的死忠,你喜欢C++语言到了偏执的状态,如果不想学习Java语言,或者你很讨厌Java语言,如果你认为Java虚拟机的内存占用太多和执行低效.如果你过度关注Andoird程序的执行效率,对Android程序的执行速度过于敏感,喜欢自己用手动档来控制程序的内存和线程等资源,如果你在其他平台下用C++语言开发了一个程序,想要移植到Android平台下,本教程就是为了满足你的以上诸多怪癖而发布的,本文的目的就是指导你学习如何只用C++语言来开发Android程序,而不使用任何其他

【用tcl/tk语言开发android应用】

用tcl/tk语言开发android应用 tcl/tk 的跨平台能力如其官方说的一样:"native applications that run unchanged across Windows, Mac OS X, Linux and more" 除了前面提到的,还有BSD.UINX,PocketPc都支持,现在又有个项目,据说要在android ARM上运行tcl/tk,我试了一下可以在手机上运行tcl/tk源代码,能做出各类界面部件,能访问移动设备的gps(好像底层访问,反正我小

Android Studio入门(安装--&gt;开发调试)

写在前面的话:本文来源:http://blog.csdn.net/yanbober/article/details/45306483 目标:Android Studio新手–>下载安装配置–>零基础入门–>基本使用–>调试技能–>构建项目基础–>使用AS应对常规应用开发 下载安装 下载AS前先说下,AS安装包分为含SDK版本和不含SDK版本下载,如果你有SDK,那么完全可以下载不含SDK版本:不过下载了含SDK版本也没事,安装时选择自定义SDK也可以,安装后重新指定SD

《Android深度探索卷一》第一章Android系统移植与驱动开发概述。

<Android深度探索>第一章讲的是Android系统移植与驱动开发概述.这一章节将对Android以及Linux驱动做一个总体的介绍. Android是一个非常优秀的的嵌入式操作系统.经过几年的发展和演进,Android已经形成了非常完善的系统架构.Android的系统架构分为四层,如下图 Android移植可分为两部分:应用移植和系统移植. Android系统移植是指让Android操作系统在某一个特定硬件平台上运行.使一个操作系统在特定硬件平台上运行的一个首要条件就是该操作系统支持硬件

原生Android也能做Web开发了

原生Android也能做Web开发了 版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com 大家好,今天跟大家介绍一个让原生Android也可以做Web开发的开源项目--AndServer. 开源地址:https://github.com/yanzhenjie/AndServer AndServer是一个Android端的Web服务器,类似Apache或者Tomcat,但又有不同,它是一个普通的Android Library,Android项目Grad

深入浅出 - Android系统移植与平台开发(一)

深入浅出 - Android系统移植与平台开发(一) 分类: Android移植2012-09-05 14:16 16173人阅读 评论(12) 收藏 举报 androidgitgooglejdkubuntu 目录(?)[+] +-------------------------------------------------+ +      本系列为连载,不定期会更新       + +-------------------------------------------------+ 一.A

Android深度探索(卷1)HAL与驱动开发 第一章&#160;Android系统移植与驱动开发概述 读书笔记

Android深度探索(卷1)HAL与驱动开发 第一章 Android系统移植与驱动开发概述 读书笔记 本章是 Android系统移植与驱动开发概述性的具体讲解.首先,Android被分为了四层架构.在最底层的是Linux内核 .然后分别是C/C++代码库.Android SDK A和应用程序.而Android的移植又分为系统移植和应用移植.系统移植要实现Android操作系统在其他硬件平台上运行起来,其中的关键是Linux的内核.内核必须要完成对平台上运行的各个硬件的识别.所以这就需要Linu

学习Android系统移植与驱动开发的心得1

首先,学习Android系统移植与驱动开发,我们需要了解两个概念.什么是“移植”?由于Android原生的代码支持的设备并不多,因此我们想要在自己的设备上完美运行Android,就需要另外开发一些程序,使得Android可以识别相应设备中的各种硬件,这个过程被称为“移植”.在这个移植的过程中,我们必需要了解另外一个知识,就是“驱动开发”(Android是基于Linux内核的).到底什么是“Linux驱动”呢?作为初学者,我们只需要知道任何的Linux驱动都有一个加载函数和一个卸载函数即可,它们分

【Android的从零单排开发日记】之入门篇(八)——Android数据存储(下)

废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基于数据库的应用.Android的数据库应用,依托于当下最流行的开源嵌入式数据库SQLite.在Android中,应用的数据库文件是该应用私有的,存储在应用数据目录下的databases子目录内.从代码结构来看,Android的数据库实现可以分成两个层次,在底层通过C++调用SQLite的接口来执行S