本页面由葡萄牙语机器翻译,可能存在错误。葡萄牙语版本为准。
国际化(i18n)
分工很清晰:格式化是自动的(LocaleFormats),文本翻译是手动的(由你负责)。搞清楚各自的边界,能避免去找一个根本不存在的 API。
自动格式化——LocaleFormats
LocaleFormats(位于 dev.crossfly.util)集中管理对区域设置敏感的分隔符和格式,并被 DatePicker/TimePicker/货币掩码自动遵循:
| 字段 | 类型 | 控制 |
|---|---|---|
dateFormat |
UIConstants.DateFormat |
日期顺序(DMY/MDY/YMD) |
dateSeparator |
char |
日期分隔符(/、-、.) |
timeSeparator |
char |
时间分隔符(:) |
is24Hour |
boolean |
12 小时制 vs 24 小时制 |
decimalSeparator |
char |
小数点(, 或 .) |
thousandsSeparator |
char |
千位分隔符 |
weekStart |
byte |
每周的第一天 |
LocaleFormats.decimalSeparator = ',';
LocaleFormats.thousandsSeparator = '.';
LocaleFormats.is24Hour = true;
// 从此处起,货币掩码和 pickers 已按 pt-BR 标准格式化
文本翻译——手动
没有内置的字符串目录。 将你的文本外部化(用你自己的 Map/枚举),并根据语言进行切换:
enum Idioma { PT, EN }
static Idioma idioma = Idioma.PT;
static final Map<String, Map<Idioma,String>> T = Map.of(
"salvar", Map.of(Idioma.PT, "Salvar", Idioma.EN, "Save"),
"cancelar", Map.of(Idioma.PT, "Cancelar", Idioma.EN, "Cancel")
);
static String t(String chave) { return T.get(chave).get(idioma); }
// 用法:
new Button(t("salvar"));
月份/星期名称以及各选择器的标签都是公共字段,你可以重新赋值以实现本地化。
为什么布局已经帮了忙
基于分数/Relative 的布局能容忍不同语言之间长度不一的文本(“Salvar” vs “Enregistrer”)而不至于破版——这是不使用固定宽度带来的又一好处。
最佳实践
- 在引导启动时根据用户的区域设置一次性配置
LocaleFormats。 - 从一开始就将所有可见文本外部化(事后改造代价很高)。
- 测试那些“最长”的语言,以确保布局能够容纳。
常见错误
- 寻找内置的字符串系统/
R.string——它并不存在;自己做一个。 - 在日期中硬编码
/,而不使用LocaleFormats.dateSeparator。
另请参阅
这个页面有帮助吗?感谢你的反馈!