Android 语言国际化

Android国际化语言适配 Android国际化语言适配 最近做的开发涉及到海外业务,所有经常遇到海外语言适配问题,strings.xml翻译好后,需要放到对应的values-xxx,xxx是对应的目录,每次都要百度觉得比较麻烦,所以记录下来。 如何适配国际化? 在res文件下面创建values文件夹,不同的国家地区根据国家地区语言代码建立文件夹即可,如韩国则values-ko-rKR,然后将翻译过来的strings.xml... 阅读详情
前言

我们在使用Android手机系统的时候经常在“设置”项里面会提供用户多种系统语言选择,比如:中文、英语…… 大家或许已经发现这些语言显示顺序都是“从左往右”;但是有一些语言是“从右往左”显示的,比如阿拉伯语、希伯来语等语言,当在这种语言环境下时,我们需要怎么来处理布局文件呢?接下来的时间我们就来讨论处理阿拉伯语等“从右往左”显示语言的问题。

布局

首先我们先讲解布局问题,在Android系统中为了支持不同语言显示,可以定义特定(阿拉伯语、希伯来语……)语言布局文件,具体如图所示:


图中layout-ar对应的就是阿拉伯语的布局文件,因此我们只需要修改该目录下的布局文件,就可以实现我们在阿拉伯语言环境中的现实效果。在Android4.2之前,我们需要对每一种“从右往左”显示的语言copy一份布局文件进行修改,如图中layout-fa layout-iw等,这样做的缺点就是会产生许多冗余布局文件。

Android4.2版本之后,Google针对阿拉伯等bidi语言(备注:bidi语言即“从右往左”书写的语言)view和文字布局文件做了重大修改,类似2D图形加速机制,可以从Activity/Application控制、Window代码控制、View资源控制共3个级别的控制。所有关于bidi语言的布局文件都可以放在layout-ldrtl目录,如图所示:


layout-ldrtl是Google专门为bidi语言预留的布局目录,所以在Android4.2版本之后,layout-fa layout-iw等目录可以直接删除,只需要在layout-ldrtl目录下定义bidi语言布局即可。

Activity/Application控制

在Manifest文件中我们可以设置android:supportsRtl属性,具体请参考如下代码:

  1. <application  
  2.     android:allowBackup="true"  
  3.     android:icon="@drawable/ic_launcher"  
  4.     android:label="@string/app_name"  
  5.     android:theme="@style/AppTheme"  
  6.     android:supportsRtl="true" >  

View控制

在layout-ldrtl目录的布局文件中设置android:layoutDirection属性,具体请参考如下代码:

  1. <LinearLayout  
  2. xmlns:android="http://schemas.android.com/apk/res/android"  
  3. xmlns:tools="http://schemas.android.com/tools"  
  4. android:layout_width="match_parent"  
  5. android:layout_height="match_parent"  
  6. android:layoutDirection="rtl" >  
  7.     <TextView  
  8. android:layout_width="wrap_content"  
  9. android:layout_height="wrap_content"  
  10. android:text="@string/hello_world"  
  11. android:layoutDirection="rtl" />  
  12. </LinearLayout>  
备注:layout-ldrtl优先级介绍,layout-ldrtl优先级要低于语言级别(layout-ar),因此如果存在layout-ar目录,会首先去查找layout-ar目录下的布局文件,因此建议删除layout-ar等bidi语言目录。layout-ldrtl优先级又高于分辨率等级,优先级归纳如下:

layout-ar(语言级别) > layout-ldrtl > layout-800*540(分辨率)

代码控制

介绍了以上两种静态的控制方式后,我们再来看看动态控制bidi语言显示方式,具体请参考如下代码:

  1. if ("ar".equals(Locale.getDefault().getLanguage())) {  
  2.     getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);  
  3. }  
以上就是bidi语言涉及的布局修改及配置方式,组合使用以上几种方式便可以解决我们在国际化中遇到的bidi语言问题。
HashCode
当大家阅读到这儿的时候,可能会存在疑问,Hashcode和语言会有什么关系呢?其实Hashcode问题才是最终决定我写这篇博客的目的。说到Hashcaode我们先来回忆一下Java中hashcode的作用,简单的说hashcode就是标识对象的唯一标识(备注:非严谨的说法)。最近在开发Android系统开发中遇到这样一个问题,当手机拍照后正常显示(图标显示Camera图标)应该如图1-1所示:

         

                              图1-1                                                                                           图1-2                                            

但是在Azeri和Turkish语言环境中却显示成了文件夹图标,如下图1-2所示,经过调查最终发现是以下代码在不同语言环境下Hashcode不同造成的,具体代码如下所示:

  1. public static int getBucketId(String path) {  
  2.     return path.toLowerCase().hashCode();  
  3. }  
按照以下方式更改后就能正常显示,具体代码如下:
  1. public static int getBucketId(String path) {  
  2.     return path.toLowerCase(Locale.ENGLISH).hashCode();//使用英语字符转换  
  3. }  
Android的解释信息如下:

Converts this string to lower case, using the rules of locale.
Most case mappings are unaffected by the language of a Locale. Exceptions include dotted and dotless I in Azeri and Turkish locales, and dotted and dotless I and J in Lithuanian locales. On the other hand, it isn't necessary to provide a Greek locale to get correct case mapping of Greek characters: any locale will do.
大概意思就是阿塞拜疆和土耳其语言环境中使用的字符编码不一样,我们必须将字符编码设置成统一的本地编码这样Hashcode才保持一致

具体编码请参考:http://www.unicode.org/Public/UNIDATA/SpecialCasing.txt

总结:Android语言国际化就总结这么多,希望对大家有所助力;大家如果对语言国际化有新的见解或者更好的实现方式,请在commit中评论,我们共同讨论。

简单的Android客户端国际化(语言适配)方案 前言:   国际化,其实就是语言的适配,当你切换系统语言到别的国家语言,app显示的语言就是该国的语言.说明一下,这里适配的只是简单的app端的string字符串,完整的国际化,一些别的操作和后台的配合是必不可少的.   本文章基本参照http://blog.youkuaiyun.com/chenliguan/article/details/50678678这个博客的文章的,实际上就是细化一些操作,在... 阅读详情

相关推荐

Android应用语言国际化完整实现方案

全球化应用开发已成为移动互联网时代的必然趋势,而语言国际化(Internationalization, i18n)是实现这一目标的核心环节。在Android平台中,语言国际化不仅关乎多语言文本的展示,更涉及用户文化习惯、区域格式、布局方向等多个维度的适配。Android通过资源分离机制实现多语言支持,利用等语言专属资源文件,结合系统Locale自动加载对应语言内容。其底层依赖Resources和Configuration系统,在应用启动或配置变更时动态选择最优资源集。

weixin_35734408的博客 1141

Android多语言布局layout

1. 定义某种具体的语言资源layout eg:layout-ar 2. 同意放在layout-ldrtl目录 eg:layout-ldrtl 3.android:supportsRtl属性 eg:Activity/Application标签android:supportsRtl="true" 4.android:layoutDirection属性 eg:view布局中android:layoutDirection="rtl" 5.优先级 layout-ar(语言级别) >...

1990

动力锂电池-二阶RC模型等效电路-RLS参数辨识-Simulink

1.锂电池二阶RC等效电路模型

QQ1978009424的博客 1万+

Android 联系人在中文,繁体,和English语言切换时,中文联系人排序显示乱码

alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/LocaleSet.java --- a/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/LocaleSet.java +++ b/alps...

逆风飞翔 553

Ansys Lumerical 2023 R1.2新功能实战:薄膜铌酸锂调制器仿真全流程解析

本文详细解析了Ansys Lumerical 2023 R1.2在薄膜铌酸锂电光相位调制器仿真中的最新功能与应用。通过实战演示,展示了从电极配置、电场计算到模式分析的全流程,重点介绍了各向异性介电常数支持和多物理场耦合优化等关键技术,助力开发者高效设计高性能光通信器件。

weixin_28454475的博客 1205

【原理图PCB专题】Cadence 17.4版本原理图及PCB 模块复用

在我们设计复杂板卡的时候,往往会遇到一部分电路被反复使用的情况。Cadence允许设计者一开始就将复用模块设计好,以后只要直接调用复用模块就可以直接用以设计更复杂的电路板了。这对于大规模集成设计无疑是非常好的选择,它不仅让设计者不必花费时间在相同模块反复设计上,更有利于电路的模块化设计。

一点硬件 2016

android 布局显示bug,在方向改变后加载"layout-ldltr"布局的android bug是否对"layout-ldrtl"?...

萨拉姆.在我的项目中,我必须为语言和语言创建两者layout-ldltr和layout-ldrtl布局.Right-To-LeftLeft-To-Right我启动了从右到左语言的应用程序,每件事都很好.但是当方向改变时,android加载layout-ldltr布局反对layout-ldrtl,虽然当前Locale设置为RTL语言!怎么解决这个问题?!在 AndroidManifest.xmlan...

weixin_33345090的博客 321

agent实战专栏|日程管理Agent:智能时间管家

在快节奏的现代生活中,时间管理已成为每个人面临的核心挑战。根据全球知名调研机构 Gallup 的统计数据,现代职场人平均每天仅能有效专注工作 2 小时 23 分钟,剩余时间被会议、邮件、碎片化事务大量占据。微软的另一项研究显示,知识工作者平均每天需要处理 200 多条日程相关的信息,包括会议邀请、日历变更、提醒通知等。传统的日历工具(如 Google Calendar、Outlook Calendar、Apple Calendar)虽然在可视化展示和基础提醒方面表现出色,但在智能化方面仍存在明显短板:日程管

2201_76125393的博客 52

android 适配语言

适配多国语言

qq_26522993的博客 986

算法 | 基于灰狼优化算法的无人机三维路径规划方法研究(附matlab代码)

针对复杂环境下的无人机三维路径规划问题,本文提出一种基于灰狼优化算法(Grey Wolf Optimizer, GWO)的解决方案。通过模拟灰狼群体的社会等级与协作捕猎机制,结合动态参数调整策略,优化路径长度与避障性能。实验表明,相较于粒子群优化(PSO)和遗传算法(GA),GWO算法在收敛速度与路径成本上分别提升约25%和18%,且在三维城市地形中表现出更强的避障鲁棒性。本文提供完整的MATLAB代码实现,为无人机自主导航提供理论与技术支撑。

尘世冰封的专栏 287

Qt C++ 信号发生器控制软件

waveformComboBox->addItems({"正弦波", "方波", "三角波", "锯齿波", "脉冲波"});frequencyLabel = new QLabel("频率 (Hz):");amplitudeLabel = new QLabel("幅值 (V):");offsetLabel = new QLabel("直流偏移 (V):");} else if (currentWaveform == "三角波") {} else if (currentWaveform == "方波") {

寒寒豆豆软件公司的博客 124

关于安卓中的语言国际化问题

向下拉动可以刷新

uni7corn的专栏 7825

PPT制作能力在职场中真的重要吗?一定要美术功底才能学好PPT吗?

我推出PPT技能培训专栏啦!好的PPT可以让你事半功倍、2023拥有PPT能力还可以让你具备一门极有价值的斜杠能力。更多内容请进:梦幻训练营专栏。专栏内会用本人积累的近10年的PPT学习方法论在短时间内教会你如何制作出精美绝伦的PPT,每篇教程后还会免费赠送一些小福利,不可多得。

打造全国最全的AI Agent开发知识领域的博客 728

安卓国际化【多语言以及不同语言下的图片适配】

前言: 在一些场合中,比如即将到来的冬奥会,我们做的APP就可能需要面对别的国家的用户,这个时候如果你的APP只支持中文那就太尴尬了。废话不多说: 一.多语言适配 1.安卓7.0之前: 1.1.第一步: private void chooseLanguage(Locale locale) { Resources resources = getResources(); ...

小王的学习blog 2086

极智AI | 详解 ViT 算法实现

大家好,我是极智视界,本文详细介绍一下 ViT 算法的设计与实现,包括代码。

极智视界 5603

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Android 国际化 语言适配

怎么让app名字适配系统语言,很简单。

minger1202的专栏 1686

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android 之 语言 国际化

     在安卓应用编写过程中,加入直接android:text="######"  这种形式,就会出现黄色感叹号。这就是没有按照标准化来处理。这种形式不利于以后程序的更新完善。一般把字符串的名称全部定义到 string.xml  文件中。      如果我们想要把自己开发的软件在很多国家都能够用,那么就需要语言国际化,简单的话就是要配置多中语言。 安卓模拟手机设置的标准语言为英语

jia635的专栏 757

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android 指定语言的资源,Android国际化多语言切换

最近工作中突然要求要项目进行国际化,之前没遇到过。但是也很简单呀,只需要把添加一个相应语言的的strings.xml的资源文件就好了,不是吗?这样只要切换系统语言就能切换app的文字语言了。但是由此引发了一个稍微深入一点的问题,那就是如果要实现在app中不跟随系统切换语言,可以直接切换语言哪又要怎么做呢?这种功能是支付宝/微信都有的,功能如下图:多语言切换.gif于是努力的研究了一下子,发现实现这...

weixin_39901404的博客 668

Android 语言国际化三步

【Android多语言配置与切换】通过locale-config文件配置支持中文、英文、俄语等语言,使用MMKV存储语言偏好。切换语言时更新缓存并调用getLanguage()方法实现即时切换,支持多国语言代码如es-es(西班牙语)、fr-ca(法语加拿大)等。具体语言代码可参考优快云相关文章。

赵星海 1067

安卓开发时语言国际化自适应

安卓开发时语言国际化自适应 -------------------- 1.当设备使用者切换设备语言环境时,APP上显示的字符串也会自动更换语言种类。(测试 的时候最好测自己认识的其它语言) 方法是在values不同文件下建一个中文的strings和一个英文的strings,里面name的命名要一样 2.原理是: 系统会根据语言环境,优先选取某些values--X

xu_Melon的博客 964

Android 实现APP内语言国际化

最近稍微闲暇,写一下项目中用到的语言国际化。 1:首先再res文件下,创建我们需要国际化的各种语言。 2:

xiebin的博客 663

Android语言国际化

Android语言国际化 一、首先android:text内容必须用 values下的strings.xml进行引入的. 二、在res下新建一个values-国家语言简写字符 **注:**在values-en和values-zh中的strings.xml下的string标签的name引入必须是hello_word. 三、实现上面步骤后即可运行改应用 系统就会根据你的手机语言自动对text...

qq_41023789的博客 284

android国际化语言(适配各国语言)

原文链接:https://blog.youkuaiyun.com/taowuhua0505/article/details/80508494 在res文件下面创建values文件夹,例如values-zh-rTW这里面的xml里面是繁体字,然后切换语言的时候就为台湾语言 或者values-de-rDExml里面使用德语然后xml使用德语。其他依次看列表,列表借鉴别人的,自己再次基础上作了修改 效果图: 国家/地区 语言代码 国家/地区 语言代码 简体中文(中国) zh-rC...

NewActivity的博客 3057

android国际化(多语言)

1.  很大程度上,为什么我们能如此方便的实现国际化、分辨率匹配等?      主要就是得益于 Android 中这种独特的资源管理方式。程序员的代码可以不直接和资源发生关系。Android 中,我们通常通过 R 文件提供的索引来间接的引用某一个资源。而如何维护资源索引和真正的资源之间的关系,这个活,却是 Android 系统来做的。      这里面就可以大作文章了不是么?

truesea's blog of it 5万+
上一篇: 源码分析:LayoutParams的wrap_content, match_parent, 和具体值
下一篇: 8.4.6 从右到左布局(RTL Layout)
xiaoxiandroid
博客等级 码龄12年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值