Android 应用国际化全攻略
1. 国际化概述
在全球移动市场中,应用开发者需要考虑到不同国家和地区的用户,为其提供多语言支持,以扩大用户群体和提高收益。应用由数据和功能组成,多数情况下功能不受地域影响,但数据需要进行本地化处理,这也是资源文件存在的重要原因之一。
常见需要本地化的应用数据是文本字符串,例如应用界面上的标签需要根据用户所在地区显示为相应的语言。支持国际化的开发平台通常允许使用字符串表,Android 平台也不例外。开发者应避免将可本地化的数据(如字符串信息)硬编码到应用源代码中,以免阻碍国际化工作。
2. Android 本地化原理
2.1 本地化考虑因素
Android 本地化主要涉及以下三个方面的考量:
-
Android 平台支持的语言和地区
:这是一个广泛的列表,涵盖了所有可用语言的超集。
-
特定 Android 手机支持的语言和地区
:该列表会因手机制造商或运营商的选择而有所不同,是平台支持语言的子集。
-
Android 应用商店支持的国家、语言和地区
:这是 Google 可以合法销售应用的国家和地区,并且该列表会不断增加。
每个新的 Android SDK 都会添加新的地区支持,具体支持的地区列表可查看相应的平台文档。例如,Android 2.1 的地区支持列表可参考:http://goo.gl/MIkAW ,Android 3.0 支持的语言和地区如下表所示:
| 语言 | 地区 |
| — | — |
| 阿拉伯语 (ar) | 埃及 (ar_EG)、以色列 (ar_IL) |
| 保加利亚语 (bg) | 保加利亚 (bg_BG) |
| 加泰罗尼亚语 (ca) | 西班牙 (ca_ES) |
| 中文 (zh) | 中国 (zh_CN)、台湾 (zh_TW) |
| 克罗地亚语 (hr) | 克罗地亚 (hr_HR) |
| 捷克语 (cs) | 捷克 (cs_CZ) |
| 丹麦语 (da) | 丹麦 (da_DK) |
| 荷兰语 (nl) | 荷兰 (nl_NL)、比利时 (nl_BE) |
| 英语 (en) | 美国 (en_US)、英国 (en_GB)、加拿大 (en_CA)、澳大利亚 (en_AU)、爱尔兰 (en_IE)、印度 (en_IN)、新西兰 (en_NZ)、新加坡 (en_SG)、津巴布韦 (en_ZA) |
| 芬兰语 (fi) | 芬兰 (fi_FI) |
| 法语 (fr) | 法国 (fr_FR)、比利时 (fr_BE)、加拿大 (fr_CA)、瑞士 (fr_CH) |
| 德语 (de) | 德国 (de_DE)、奥地利 (de_AT)、瑞士 (de_CH)、列支敦士登 (de_LI) |
| 希腊语 (el) | 希腊 (el_GR) |
| 希伯来语 (he) | 以色列 (he_IL) |
| 印地语 (hi) | 印度 (hi_IN) |
| 匈牙利语 (hu) | 匈牙利 (hu_HU) |
| 印尼语 (id) | 印度尼西亚 (id_ID) |
| 意大利语 (it) | 意大利 (it_IT)、瑞士 (it_CH) |
| 日语 (jp) | 日本 (jp_JP) |
| 韩语 (ko) | 韩国 (ko_KR) |
| 拉脱维亚语 (lv) | 拉脱维亚 (lv_LV) |
| 立陶宛语 (lt) | 立陶宛 (lt_LT) |
| 挪威书面语 (nb) | 挪威 (nb_NO) |
| 波兰语 (pl) | 波兰 (pl_PL) |
| 葡萄牙语 (pt) | 巴西 (pt_BR)、葡萄牙 (pt_PT) |
| 罗马尼亚语 (ro) | 罗马尼亚 (ro_RO) |
| 俄语 (ru) | 俄罗斯 (ru_RU) |
| 塞尔维亚语 (sr) | 塞尔维亚 (sr_RS) |
| 斯洛伐克语 (sk) | 斯洛伐克 (sk_SK) |
| 斯洛文尼亚语 (sl) | 斯洛文尼亚 (sl_SI) |
| 西班牙语 (es) | 西班牙 (es_ES)、美国 (es_US) |
| 瑞典语 (sv) | 瑞典 (sv_SE) |
| 他加禄语 (tl) | 菲律宾 (tl_PH) |
| 泰语 (th) | 泰国 (th_TH) |
| 土耳其语 (tr) | 土耳其 (tr_TR) |
| 越南语 (vi) | 越南 (vi_VN) |
2.2 Android 操作系统对地区的处理
Android 平台和其他操作系统一样,具有地区设置的系统选项。该设置有默认值,可由移动运营商进行修改。例如,德国的移动运营商可能将其手机的默认地区设置为德语(德国),而美国的移动运营商可能将默认地区设置为英语(美国),同时提供西班牙语(美国)选项。
用户可以在“设置”应用中更改系统的地区设置,该设置会影响手机上安装的应用的显示和行为。以下是更改手机地区设置的具体步骤:
1. 从主屏幕点击“菜单”按钮,选择“设置”。
2. 在“设置”菜单中,选择“语言和键盘”选项。
3. 选择“选择地区”,并选择一个地区。Android 平台会立即更改系统的地区设置。例如,选择西班牙语后,Android 平台的许多菜单将显示为西班牙语。
2.3 应用对地区的处理
当 Android 应用使用项目资源时,操作系统会在运行时尝试匹配最合适的资源。通常情况下,会优先查找特定语言或地区的资源。如果没有匹配的资源,系统会使用默认资源。
开发者可以通过在项目的特定命名资源目录中提供资源来包含语言和地区资源。可以对任何应用资源进行本地化,包括字符串资源文件、可绘制对象、动画序列等。
2.3.1 指定默认资源
在大多数应用中,大部分资源都是默认资源。默认资源是指没有特定加载条件标签的资源,它们是最重要的资源,因为在没有特定定制资源时,系统会使用默认资源。例如,“Been There, Done That!” 应用的默认资源都是英文的。
2.3.2 指定特定语言资源
要为特定语言指定字符串资源,需要将资源放在以 ISO 639 - 1 标准的双字母语言代码命名的目录下。例如,英语是 “en”,法语是 “fr”,德语是 “de”。以下是为 “Been There, Done That!” 应用添加英语、德语和法语字符串资源的步骤:
1. 为每种语言创建一个
strings.xml
资源文件。需要本地化的字符串必须在每个资源文件中具有相同的名称,以便程序能够正确加载。不需要本地化的字符串可以保留在默认的(英语)
/res/values/strings.xml
文件中。
2. 将法语的
strings.xml
资源文件保存到
/res/values - fr/
目录。
3. 将德语的
strings.xml
资源文件保存到
/res/values - de/
目录。
Android 会根据系统地区选择合适的字符串资源。如果没有匹配的资源,系统会使用
/res/values/
目录下的默认资源。同样,也可以通过在
/res/drawable - de/
目录中提供相同名称的资源来覆盖
/res/drawable/
目录下的默认图形资源。
2.3.3 指定特定地区资源
除了指定特定语言资源,还可以指定特定地区的资源。要为特定语言和地区指定字符串资源,需要将本地化资源放在以双字母语言代码、连字符、小写 “r” 和 ISO 3166 - 1 - alpha - 2 地区代码命名的目录下。例如,美国英语是 “en - rUS”,英国英语是 “en - rGB”,澳大利亚英语是 “en - rAU”。
以下是为 “Been There, Done That!” 应用添加美国英语、英国英语和澳大利亚英语字符串资源的步骤:
1. 为每种语言创建一个
strings.xml
资源文件。不需要本地化的字符串可以保留在默认的(美国英语)
/res/values/strings.xml
文件中。
2. 将英国英语的
strings.xml
资源文件保存到
/res/values - en - rGB/
目录。
3. 将澳大利亚英语的
strings.xml
资源文件保存到
/res/values - en - rAU/
目录。
总体而言,应先确定默认资源,通常使用应用主要依赖的最通用语言。然后根据需要添加特定语言和地区的资源,以优化应用在不同平台上的运行效果。关于 Android 操作系统如何解析资源的详细说明,可参考:http://goo.gl/qUP0h 。
2.4 Android 应用商店对地区的处理
Android 应用商店支持 Android 平台可用地区的一个子集。由于应用商店使用 Google Checkout 系统进行支付,因此只有该在线市场合法的国家才能支持付费应用。
地区设置会影响 Android 应用商店的多个方面:
-
付费应用
:只有特定国家的开发者才能销售付费 Android 应用。支持付费应用开发的国家列表可参考:http://goo.gl/U07uq 。如果在阿根廷、巴西、以色列、墨西哥、俄罗斯、韩国或台湾等国家或地区开发应用,可能需要在开发者账户中自行管理税率。
-
免费应用
:更多国家的开发者可以分发免费 Android 应用。支持免费应用开发的国家列表可参考:http://goo.gl/CNz77 。
-
货币支持
:Android 应用可以以不同的货币销售。关于不同货币销售应用的详细信息,可参考:http://goo.gl/cj4uj 。每种货币在应用商店中有允许的价格范围,具体范围可查看:http://goo.gl/6aPpp 。
开发者需要在 Android 应用商店注册才能销售应用,并需了解适用于自身情况的出口合规法律。
3. Android 国际化策略
在进行应用国际化时,开发者可以根据项目需求选择合适的策略,以下是几种常见的策略:
3.1 完全放弃国际化
在可能的情况下,对于一些简单、图形密集型且文本较少的应用,如游戏,可以考虑不进行国际化。这类应用可以使用国际公认的图形图标(如播放、暂停、停止等)或 “模拟市民” 语言(一种能让任何语言使用者理解的模糊语言)来实现功能。例如,井字棋和国际象棋等游戏几乎不需要文本资源。
这种策略的优点包括:
- 简化开发和测试流程。
- 应用体积最小,仅包含一套资源。
缺点主要有:
- 对于依赖文本或文化的应用,该方法会大大降低应用的价值,使其过于通用。
- 会自动疏远某些用户群体,限制应用的潜在市场。
3.2 限制国际化
大多数应用只需要进行一些轻度的国际化,通常只对字符串资源进行本地化,而布局和图形等其他资源保持不变。
优点如下:
- 开发和测试要求适中。
- 应用体积相对精简,专门的资源最少。
缺点包括:
- 对于某些类型的应用,这种策略可能仍然过于通用,整体设计(尤其是屏幕设计)可能因需要支持多种目标语言而受到影响。例如,文本字段可能需要足够大以支持德语等冗长的语言,但在简洁语言中会显得奇怪并浪费屏幕空间。
- 由于提供了特定语言的资源,用户可能会期望应用支持更多语言。不过,由于已经在多种语言上进行了开发和测试,添加新语言应该相对容易。
3.3 全面国际化
某些类型的应用需要进行全面的国际化,即为每个支持的语言和地区提供自定义资源。这是一项耗时的工作,并且随着资源的增加,应用的体积会增大。通常需要将不同语言的版本拆分为单独的 APK 文件进行发布,这会导致更复杂的配置管理。
优点有:
- 应用可以完全针对不同的用户群体进行定制,能够对每个地区进行微调。
- 通过为用户提供最佳、最个性化的体验,建立用户忠诚度。
缺点主要是:
- 开发过程最为漫长和复杂。
- 每个国际化版本的应用都需要像对待完全不同的应用一样进行全面测试。
需要注意的是,过度国际化可能会导致应用包体积过大,除非有充分的理由和相应的开发、测试及产品团队支持,否则不建议这样做。一个本地化不佳的应用版本可能比没有本地化更影响应用的形象。
4. 使用本地化工具
4.1 确定系统地区
如果需要根据地区信息修改应用的行为,可通过以下代码获取 Android 操作系统的地区信息:
Configuration sysConfig = getResources().getConfiguration();
Locale curLocale = sysConfig.locale;
可以根据获取的地区信息,以编程方式调整应用的行为。
4.2 格式化日期和时间字符串
国际化的另一个方面是正确显示数据。例如,美国的日期格式是 “MM/DD/YY”,而世界上大部分地区使用 “DD/MM/YY” 格式。Android SDK 提供了一些与地区相关的工具,可用于生成符合当前地区的日期和时间字符串。例如,可以使用
DateFormat
类(
android.text.format.DateFormat
)来生成日期和时间字符串,也可以根据应用需求自定义日期和时间信息。还可以使用
TimeUtils
类(
android.util.TimeUtils
)通过国家名称确定其所在的时区。
4.3 处理货币
货币及其格式也因地区而异。可以使用标准的 Java
Currency
类(
java.util.Currency
)来封装货币信息,使用
NumberFormat
类(
java.text.NumberFormat
)根据地区信息格式化和解析数字。
5. 总结
通过本文的介绍,我们了解了 Android 应用国际化的基本原理,包括外部化项目资源和了解目标市场的重要性。同时,掌握了 Android 平台如何处理不同国家、语言和地区,以及如何使用不同的国际化策略来组织应用资源,以实现最大利润。
6. Q&A
6.1 应该在 Android 应用中针对哪些语言和地区?
答案取决于多种因素,通常应选择最少的必要语言和地区。移动用户使用特定语言的数量不应是决定支持哪些语言的唯一因素。例如,说西班牙语和中文的移动用户比说英语的用户多,但英语市场的用户通常愿意为应用支付更高的价格。最终答案在于了解目标用户群体,这应该是商业计划的一部分。
6.2 为什么我的 Android 手机只显示部分本文中列出的语言和地区?
虽然 Android 平台支持多种语言和地区,但手机制造商和运营商可以根据资源效率等因素自定义特定设备支持的地区。例如,美国运营商提供的手机可能只支持英语(美国)和西班牙语(美国)。
6.3 默认资源(如字符串)应该使用什么语言?
默认资源应该使用目标用户群体中使用最多的语言和地区,即最通用、最可能吸引大多数用户的值。如果目标是全球市场,通常选择英语,但并非必须如此。例如,如果应用提供中国各地的导航指示,可能希望默认语言是中文的某个选项。但如果目标是访问中国的商务人士,英语可能是更好的选择,因为英语目前仍然是 “商务国际语言”。
6.4 我将地区设置为西班牙语,但为什么有些应用仍然显示英文?
如果应用的默认字符串是英文,且没有可用的西班牙语资源,无论选择何种语言,系统都会使用默认的英文资源。
7. 工作坊
7.1 测验
- 判断对错:一个 Android 应用可以在单个 APK 文件中支持多种语言。
- 判断对错:Android 平台和 Android 应用商店支持的语言数量是固定的。
-
默认资源应该使用什么语言?
A. 英语
B. 中文
C. 最吸引目标用户群体的语言
D. 其他语言
7.2 答案
- 正确。应用可以编译包含多种语言的资源,Android 平台可以根据手机的地区设置动态切换资源。
- 错误。Android 的语言支持不断更新,新的语言和地区会不断添加。
- C。默认资源应该是最有可能被加载和使用的资源,因此设计为最吸引大多数用户的语言和地区是合理的。
7.3 练习
- 为 “Been There, Done That!” 应用添加一组你选择的语言或地区的字符串资源值,并在 Android 模拟器和支持该语言或地区的真机上测试结果。
- 修改 “Been There, Done That!” 应用,使其为特定语言或地区加载自定义的可绘制对象或颜色资源。例如,将主菜单上的星球图形更改为更符合该语言或地区的图形,并在 Android 模拟器和真机上测试结果。
- 查看 Android SDK 文档中关于替代资源的限定符类型列表:http://goo.gl/E8v1d 。
-
为大屏幕和高分辨率屏幕(
xlarge和xhdpi)创建两个替代图标资源。
8. 操作步骤总结与流程图
8.1 操作步骤总结
为了更清晰地展示 Android 应用国际化过程中的关键操作,下面对前面提到的重要操作步骤进行汇总:
-
更改手机地区设置
:
1. 从主屏幕点击“菜单”按钮,选择“设置”。
2. 在“设置”菜单中,选择“语言和键盘”选项。
3. 选择“选择地区”,并选择一个地区。
-
指定特定语言资源(以添加英语、德语和法语字符串资源为例)
:
1. 为每种语言创建一个
strings.xml
资源文件。需本地化的字符串在每个文件中名称相同,无需本地化的保留在默认英语
/res/values/strings.xml
文件中。
2. 将法语的
strings.xml
资源文件保存到
/res/values - fr/
目录。
3. 将德语的
strings.xml
资源文件保存到
/res/values - de/
目录。
-
指定特定地区资源(以添加美国英语、英国英语和澳大利亚英语字符串资源为例)
:
1. 为每种语言创建一个
strings.xml
资源文件。无需本地化的字符串保留在默认美国英语
/res/values/strings.xml
文件中。
2. 将英国英语的
strings.xml
资源文件保存到
/res/values - en - rGB/
目录。
3. 将澳大利亚英语的
strings.xml
资源文件保存到
/res/values - en - rAU/
目录。
8.2 流程图
下面是一个 mermaid 格式的流程图,展示了 Android 应用国际化中资源加载的流程:
graph TD;
A[应用使用项目资源] --> B{是否有匹配特定语言或地区的资源};
B -- 是 --> C[使用匹配的资源];
B -- 否 --> D[使用默认资源];
9. 代码示例与解释
9.1 确定系统地区代码解释
Configuration sysConfig = getResources().getConfiguration();
Locale curLocale = sysConfig.locale;
-
getResources().getConfiguration():通过getResources()方法获取应用的资源对象,再调用getConfiguration()方法获取系统的配置信息,存储在sysConfig变量中。 -
sysConfig.locale:从配置信息中获取当前的地区设置,存储在curLocale变量中,开发者可以根据这个地区信息来调整应用的行为。
9.2 格式化日期和时间字符串示例
import android.text.format.DateFormat;
import java.util.Date;
// 获取当前日期和时间
Date currentDate = new Date();
// 使用 DateFormat 类生成当前地区的日期和时间字符串
String dateTimeString = DateFormat.getDateFormat(context).format(currentDate);
-
DateFormat.getDateFormat(context):根据当前的地区设置,获取适合该地区的日期格式对象。 -
format(currentDate):使用获取到的日期格式对象,将当前日期currentDate格式化为字符串。
9.3 处理货币示例
import java.util.Currency;
import java.text.NumberFormat;
// 获取当前地区的货币对象
Currency currency = Currency.getInstance(Locale.getDefault());
// 获取当前地区的数字格式化对象
NumberFormat numberFormat = NumberFormat.getCurrencyInstance();
// 要格式化的金额
double amount = 1234.56;
// 格式化金额
String formattedAmount = numberFormat.format(amount);
-
Currency.getInstance(Locale.getDefault()):根据当前的地区设置,获取该地区对应的货币对象。 -
NumberFormat.getCurrencyInstance():获取适合当前地区的货币格式化对象。 -
numberFormat.format(amount):使用货币格式化对象,将金额amount格式化为符合当前地区货币格式的字符串。
10. 常见问题及解决方案
10.1 应用部分内容未本地化问题
问题描述
:将地区设置为某语言后,应用部分内容仍显示默认语言。
原因分析
:应用没有为该语言提供相应的资源文件。
解决方案
:按照前面提到的指定特定语言或地区资源的方法,为该语言添加对应的资源文件。
10.2 应用体积过大问题
问题描述
:进行全面国际化后,应用体积显著增大。
原因分析
:为每个支持的语言和地区都提供了自定义资源,导致资源文件过多。
解决方案
:评估哪些语言和地区是真正必要的,采用限制国际化的策略,只对最重要的语言和地区进行本地化,减少不必要的资源文件。
11. 最佳实践建议
11.1 资源管理
- 从项目开始就规划好资源的组织方式,先确定默认资源,再根据需求逐步添加特定语言和地区的资源。
- 定期清理不再使用的资源,避免资源文件冗余。
11.2 测试
- 在不同的语言和地区设置下对应用进行全面测试,确保所有功能正常显示和运行。
- 邀请不同语言背景的用户进行测试,收集反馈并及时改进。
11.3 团队协作
- 开发、测试和产品团队密切合作,共同制定国际化策略和计划。
- 建立有效的沟通机制,及时解决国际化过程中出现的问题。
12. 总结回顾
通过本文的详细介绍,我们深入了解了 Android 应用国际化的各个方面。从基本的国际化原理,包括外部化项目资源和了解目标市场,到 Android 平台对不同国家、语言和地区的处理方式,以及多种国际化策略的选择和应用。同时,我们还学习了如何使用 Android SDK 提供的本地化工具,如确定系统地区、格式化日期和时间字符串、处理货币等。
在实际开发中,开发者应根据应用的特点和目标用户群体,选择合适的国际化策略,并遵循最佳实践建议,确保应用在全球市场上能够提供优质的用户体验。通过不断地学习和实践,提升应用的国际化水平,扩大用户群体,实现更大的商业价值。
希望本文能够为开发者在 Android 应用国际化的道路上提供有价值的参考和指导,帮助大家顺利完成应用的国际化工作。
超级会员免费看
5922

被折叠的 条评论
为什么被折叠?



