跳到内容
CrossFly 是 100% 开源在 GitHub 关注我们
CrossFlyCrossFly
开始使用

本页面由葡萄牙语机器翻译,可能存在错误。葡萄牙语版本为准。

国际化(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。

另请参阅

这个页面有帮助吗?