多语言/国际化工具 Translator

简化您的多语言应用开发 —— Translator,精心设计的接口,在 Spring 的国际化功能(MessageSource)基础上升级,使用更简单、便捷。

配置

在您的 resources 目录下添加 language/zh_CN/loginpage.properties

properties
i18n.page.button.login=您好,{}!

使用

i18n
@Autowried
private Translator translator;

// 返回:您好,shoulder!
// 若以上配置未完成,返回 welcome, shoulder
public String genHelloTip() {
    String msg = "i18n.page.button.login";
    String userName = "shoulder";

    // 无需传入语言,默认从上下文中取 AppContext.getLocaleOrDefault()
    return translator.getMessageOrDefault(msg, "welcome, {}", userName);
}

亮点

  • 去除资源文件命名限制:命名无须为 messages_Shoulder 允许您更自由地命名以更方便的按模块管理您的多语言文件。

  • 语言自动识别:根据当前用户设置或系统默认值自动选择合适的语言环境([_运行上下文_appcontext]),实现上下文感知,高度个性化的翻译。

  • 简化的方法签名:提供 getMessageOrDefault 方法,允许指定默认值,避免因找不到翻译而中断程序。

  • 链式调用友好:默认值和参数化的翻译方法,支持直接使用或结合参数动态生成消息。

  • 智能默认处理:当特定翻译不可用时,立即回退到提供的默认消息,保证应用流畅运行。

  • 改良的资源文件目录:让多语言资源文件的管理更轻松。

NOTE: .去除资源文件命名限制

无资源文件命名限制, Spring / JDK 要求翻译文件命名必须为 messages_,—— 这陈旧的规则完全没必要,Shoulder 允许您更自由地命名以更方便的按模块管理您的多语言文件,如 user.properties dictionary.properties,这在大型的项目中更加容易开发、管理和维护。

使用场景

  • 在用户界面显示动态文本,确保不同地区用户看到的是其本地语言。

  • 实现多语言邮件、通知模板,提升用户体验。

通过 Translator ,开发者可以快速实现国际化功能,减少样板代码,使应用更加国际化,满足全球用户的需要。立即探索,让您的应用跨越语言障碍!

测试时确保 i18nKey 存在和有效性,避免 NoSuchMessageException

多个资源文件加载优先级

Shoulder 对多语言的底层支持完全由 Spring 实现,故参考 Spring ReloadableResourceBundleMessageSource 的资源文件加载顺序即可:

默认会根据传入 Locale,按以下顺序尝试加载

  1. 资源名_语言_地区_变种

  2. 资源名_语言_地区

  3. 资源名_语言

  4. 使用当前操作系统语言再次尝试加载一轮(spring.messages.fallback-to-system-locale=true

  5. 资源名_语言_地区_变种

  6. 资源名_语言_地区

  7. 资源名_语言

  8. 使用不带语言标识加载一次【Shoulder】

翻译建议
  • 在前后分离的场景,建议统一由前端处理多语言和翻译,后端仅作多语言 key 的配合。

  • 非前后分离或动态页面的场景,如 JspThymeleafFreeMark 由后端翻译。

  • 多租户场景下,如有必要,每个租户可以定制自己的界面和提示信息,同时可采用继承统一默认数据源方式简化多语言管理。如先取当前租户对应翻译,如果未配置,则尝试取默认租户配置而非直接失败。

学习资源

  • 查阅Spring的 MessageSource 文档,深入了解底层机制。

  • 参考网络文章了解 String.format 和特殊字符处理,优化翻译表现。