最近在做App的多语言适配,特此记录一些多语言适配需要注意的地方。
1:关于布局:
因为各国语言的长短,高低不同,所以我们在布局时,就不能只考虑中文的情况,假设TextView的宽度,和高度,最好能留出足够的空隙,考虑到,如果字数太多的情况,处理的方法一般为
a:可以接受省略显示的就省略。
android:singleLine="true"
android:ellipsize="end"
b:不能省略的(就是省略了就看不懂了的),可以尝试让翻译公司,缩短翻译。实在缩短不了,就用跑马灯的方法显示出来:
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
c:不能省略且不能用跑马灯显示的,可以根据不同的语言用不同的字体大小。或者不同的容器宽度。
例如,默认的字体大小给16sp,俄语比较长,则在俄语目录下建个dimens.xml,给个12sp.
android:textSize="@dimen/app_setting_item_title_size"
还有对于网格布局,item布局就是上面一个图片,下面是一行文字,由于多语言,下面的文字显示不全,则可以根据不同的语言,设置不同的列,默认一屏幕显示4列,俄语,可以让其显示3列。
总结:能省略显示的省略显示,不能省略显示的,增大控件大小,或者修改文字大小
2:关于RTL的问题。
由于有的国家阅读习惯是从右到左的,例如:阿拉伯语,为了适配这些国家,则需要我们在布局时用start代替left,用end代替right.
a:xml 尽量使用右边的这些属性代替左边的。
PS: 如果你的app要支持到17以下,那么写属性的时候,需要把两个方法都写上,这样才不会报错。
另外:
android:gravity="left"需要写成:android:gravity="start"
android:gravity="right"需要写成:android:gravity="end "
android:layout_gravity="left" 需要写成android:layout_gravity="start"
android:layout_gravity="right" 需要写成android:layout_gravity="end"
PS:注意FrameLayout布局中,子控件如果用了android:layout_gravity=“center_vertical” ,为了适配RTL,则需要写成android:layout_gravity=“start|center_vertical”.
b:代码set方法
PS:使用setCompoundDrawablesRelative()的时候,需要配合使用的是getCompoundDrawablesRelative();
例子:
setCompoundDrawablesRelative(getCompoundDrawablesRelative()[0], getCompoundDrawablesRelative()[1], right,getCompoundDrawablesRelative()[3]);
总结:为了适配RTL,需要将left/right之类的属性替换成start/end.
c:对于电话号码,或者带数字的句子,RTL的问题。
例如:102'10"会被反转成"10'102,要想不被反转则需要加上\u202A标记(当前需要改成LTR且环境是RTL时,才添加\u202A标记)具体的规则请看:
https://www.2cto.com/kf/201803/727737.html
3:关于strings.xml中的占位符,和特殊字符
a:例如:
上次同步: %1$s
前面说了由于有的国家是由右往左阅读,那这个占位符也是需要反转的,例如阿拉伯语,这句话就翻译为:
即%1$s反转为:s$1%,同理:\u2026(省略号)等特殊字符也需要反转,反转为:u2026\。
b:转义字符也需要转义。\'我们知道是为了转义',那在阿拉伯语中则是:'\。
c:但是如果这句中有英文,和阿拉伯语,则这些占位符,特殊字符是不需要反转的,反转就会报错的。例如:
我们可以看到我圈住的那句话,因为有英文,所以,%1$s并没有反转,反转就会报错了。所以注意,只要句子里有英文,不管在特殊的字符多远,特殊字符都不需要反转.
还有很多特殊字符,都需要反转,当然如果翻译公司比较专业的话,都会转好给你们,但是万一遇到不专业的,那这些都需要自己处理了,只想说会整的你大哭的,真的会哭的,太繁琐了。
4:其他的。
a:能用布局写的就不要用图片,特别是图片是文字的 ,到后期做多语言适配,得每个国家一套图,放到对应国家的drawable下,对于做图的来说,能累死,对于我们app来说,能烦死,且增加app的体积。
b:子module下和主工程app下的strings.xml里面包含相同name 的string,则系统会使用app下的。你在代码里,ctrl点进去是子module下,但是实际显示真真是app下的。写在这里,是因为在多语言适配的时候遇见的bug。明明module里面这个string翻译了,显示出来却是没有翻译的,找半天,原来用的是app下的,app下的还没有翻译,这个bug,找了我半个小时,一度以为是见鬼了,都想跪下上供了。。。
以上是我在这次多语言适配中遇到的问题,特此记录,愿可以帮到大家。
每日语录:
好久没有写博客了,因为最近真的忙疯了,公司组织了封闭开发一个月,每天9点上班,10点下班,少则一周6天,多则一周七天,接连端午节三天,休息半天,我还是比较幸运的,有的同事,一个月一天没有休息。每天醒来就是上班,下了班就是睡觉,这段时间第一次意识到,我是一个程序员。我觉得累些没什么,最心累的是,不能得到和付出同等的回报,这个回报不是指的我的假期,我的加班费(虽然没有),这个回报是用户对于我们付出的东西的反馈。也不是很差吧,但是就是觉得,不对等。这其中的原因,我也不太清楚,究其原因大概就是团队互相看不上吧,技术佬们觉得产品的理念有问题,产品们觉得我们的技术做的不完美。但是大家的目标都是一致的,都是想要给用户好的体验,好的产品。所以,希望广大使用我们产品的可爱的人,能给我们一些宽容,我们不完美,但是我们还在努力,努力给你们创造完美的体验,让你们满意一直是我们的努力的终点。(啊哈哈,我也太敬业了,领导要是能看到,会不会给我颁个优秀奖)总之还是很感谢这一段封闭体验的,大家一起工作,一起看向同一个目标,一起往终点冲刺,不管最后是不是冠军,大家都在过程中或多或少收获了一些东西。
“把诗和蓝莓酱抹在荞麦面包上,用树隙里的阳光做件毛坎肩,跟猫狗以及啄窗的小麻雀说说话,往深夜的咖啡杯里倒进碎星星,在心里装一个小女孩儿。你如果爱着生活,生活一定比谁都清楚。”
单曲循环《探清水河》