国际化与多语言:让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>
我的小习惯:我会在默认的values/strings.xml里放英文。因为Android的默认语言是英文,如果某个语言没有对应翻译,系统会fallback到默认值。用英文做兜底,全球用户至少能看懂。

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。

我曾经踩过的坑:有一次我把values-zh-rCN写成了values-zh-CN(少了个r),结果系统死活不认。Android的资源限定符里,地区代码前面必须加r,这是硬性规定。写错了不会报错,但就是匹配不上。

3. RTL布局适配:阿拉伯语和希伯来语的必修课

如果你的App要支持阿拉伯语、希伯来语、波斯语这些从右往左读的语言,光翻译字符串是不够的。布局也得反过来。

Android从4.2开始支持RTL(Right-to-Left)布局。核心思路是:startend代替leftright

比如,一个按钮在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>标签
  • 使用TextDirectionTextAlignment:对于自定义View,可能需要手动设置文字方向
  • 镜像动画和图片:有些箭头、返回图标需要镜像翻转。可以用autoMirrored="true"属性

核心原则:能用start/end的地方,就别用left/right。这不仅是RTL适配,也是Material Design推荐的做法。

知识体系总览

下面这张图帮你理清国际化的整体脉络:

Android国际化与多语言 strings.xml多语言 区域限定符 RTL布局适配 values/ → values-zh/ → values-ja/ key一致,value翻译 默认语言用英文兜底 values-zh-rCN / values-zh-rTW 先匹配语言,再匹配地区 地区代码前必须加 r start/end 替代 left/right AndroidManifest声明supportsRtl 图片autoMirrored属性 目标:一套代码,适配全球语言和布局方向

实战中的几个建议

嗯,光讲理论不够,我分享几个实际项目里的经验:

  1. 翻译不要硬编码在代码里。所有用户可见的文本,必须走strings.xml。包括Toast、Dialog、通知栏消息。
  2. 占位符用%s%d。比如<string name="welcome_user">欢迎你,%s!</string>。不同语言的语序可能不同,占位符可以灵活调整位置。
  3. 复数形式用<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布局时,不用真的去装阿拉伯语系统。开发者选项里有个「强制使用从右到左布局」的开关,打开就能看到效果。我每次适配完都会用这个功能扫一遍所有页面。

关于RTL,再多说两句

你可能会问:「我的App只做中文和英文,需要管RTL吗?」

我的建议是:一开始就按RTL友好的方式写布局。因为用start/end替代left/right,成本几乎为零。等产品真要支持阿拉伯语时,你只需要翻译字符串,布局不用动。

反过来,如果一开始全用left/right,后面再改就是大工程。我见过一个项目,改RTL适配花了两个迭代,因为很多自定义View里硬编码了方向。

国际化这件事,说白了就是未雨绸缪。前期多花10%的精力,后期能省90%的麻烦。


公众号:蓝海资料掘金营,微信deep3321