国际化与多语言:让App走向世界的第一步
说实话,国际化这件事,很多开发者一开始都不太重视。我早期做的一个工具类App,用户全是国内,自然没考虑多语言。后来产品要出海,好家伙,代码里到处是硬编码的中文字符串,改得我头皮发麻。从那以后,我养成了一个习惯:任何新项目,第一件事就是把strings.xml建好,哪怕只写中文。
今天我们就来聊聊Android国际化的三个核心点:strings.xml多语言、区域限定符、RTL布局适配。这三件事做好了,你的App就能优雅地走向全球。
1. strings.xml多语言:最基础的国际化
Android的多语言支持,说白了就是靠资源文件夹的命名规则。系统会根据用户的语言设置,自动加载对应文件夹下的strings.xml。
举个例子,你的App默认支持中文,现在要加英文和日文。你需要创建这样的目录结构:
res/
├── values/ # 默认(通常是英文或中文)
│ └── strings.xml
├── values-zh/ # 中文
│ └── strings.xml
├── values-ja/ # 日文
│ └── strings.xml
└── values-fr/ # 法文
└── strings.xml
每个strings.xml里的key必须完全一致,value写对应语言。比如:
<!-- values/strings.xml -->
<resources>
<string name="app_name">MyApp</string>
<string name="welcome">Welcome</string>
<string name="login">Login</string>
</resources>
<!-- values-zh/strings.xml -->
<resources>
<string name="app_name">我的应用</string>
<string name="welcome">欢迎</string>
<string name="login">登录</string>
</resources>
2. 区域限定符:不只是语言,还有地区
你有没有想过,同样是中文,大陆和台湾的用词可能不同?「打印机」vs「印表机」,「软件」vs「軟體」。这时候就需要区域限定符了。
区域限定符的格式是:values-语言代码-r地区代码。比如:
values-zh-rCN— 中国大陆简体中文values-zh-rTW— 台湾繁体中文values-zh-rHK— 香港繁体中文values-en-rUS— 美国英语values-en-rGB— 英国英语
系统匹配规则是:先匹配语言,再匹配地区。如果找不到精确匹配,就回退到同语言无地区的版本。比如用户设置的是zh-rTW,系统会先找values-zh-rTW,找不到就找values-zh,再找不到就用values/strings.xml。
r,这是硬性规定。写错了不会报错,但就是匹配不上。
3. RTL布局适配:阿拉伯语和希伯来语的必修课
如果你的App要支持阿拉伯语、希伯来语、波斯语这些从右往左读的语言,光翻译字符串是不够的。布局也得反过来。
Android从4.2开始支持RTL(Right-to-Left)布局。核心思路是:用start和end代替left和right。
比如,一个按钮在LTR(从左往右)布局里靠左,在RTL布局里就应该靠右。用android:layout_gravity="start",系统会自动处理方向。
来看一个具体的例子:
<!-- 不推荐 -->
<Button
android:layout_gravity="left"
android:paddingLeft="16dp"
android:drawableLeft="@drawable/icon"/>
<!-- 推荐 -->
<Button
android:layout_gravity="start"
android:paddingStart="16dp"
android:drawableStart="@drawable/icon"/>
除了布局属性,还有几个关键点:
- 在AndroidManifest.xml里声明支持RTL:添加
android:supportsRtl="true"到<application>标签 - 使用
TextDirection和TextAlignment:对于自定义View,可能需要手动设置文字方向 - 镜像动画和图片:有些箭头、返回图标需要镜像翻转。可以用
autoMirrored="true"属性
核心原则:能用start/end的地方,就别用left/right。这不仅是RTL适配,也是Material Design推荐的做法。
知识体系总览
下面这张图帮你理清国际化的整体脉络:
实战中的几个建议
嗯,光讲理论不够,我分享几个实际项目里的经验:
- 翻译不要硬编码在代码里。所有用户可见的文本,必须走strings.xml。包括Toast、Dialog、通知栏消息。
- 占位符用
%s和%d。比如<string name="welcome_user">欢迎你,%s!</string>。不同语言的语序可能不同,占位符可以灵活调整位置。 - 复数形式用
<plurals>。英文有单复数,中文没有。用<plurals>可以优雅处理:
<!-- values/strings.xml -->
<plurals name="message_count">
<item quantity="one">1 message</item>
<item quantity="other">%d messages</item>
</plurals>
<!-- values-zh/strings.xml -->
<plurals name="message_count">
<item quantity="other">%d 条消息</item>
</plurals>
关于RTL,再多说两句
你可能会问:「我的App只做中文和英文,需要管RTL吗?」
我的建议是:一开始就按RTL友好的方式写布局。因为用start/end替代left/right,成本几乎为零。等产品真要支持阿拉伯语时,你只需要翻译字符串,布局不用动。
反过来,如果一开始全用left/right,后面再改就是大工程。我见过一个项目,改RTL适配花了两个迭代,因为很多自定义View里硬编码了方向。
国际化这件事,说白了就是未雨绸缪。前期多花10%的精力,后期能省90%的麻烦。
公众号:蓝海资料掘金营,微信deep3321