完整的多语言解决方案包括前端多语言,后端多语言,数据多语言。个人接触过的框架提供的多语言支持都略显不足,比如用 Spring 支持多语言的工具类库,通常会在此基础上把多语言资源维护到数据库以支持动态配置,但没有提供方案解决开发人员编写支持多语言特性代码的痛点。以下提供的方案是在开发成本和系统国际化程度之间做权衡。
创建声明多语言的注解
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DeclareI18N {
String value();
}
创建多语言常量
public interface DemoMessages {
@DeclareI18N("你好,世界!")
String HELLO_WORLD = "helloWorld";
}
创建多语言工具类
public class Q {
public static String tr(String message, Object... args) {
// 查找多语言并返回
}
}
业务代码中获取多语言
String message = Q.tr(DemoMessages.HELLO_WORLD);
// 此处 message 的值将是字符串 "你好,世界!"
查找多语言的策略
比如 Q.tr 可以先查数据库,没有找到才查 xxxx.properties 等文件,最后才获取多语言常量上 @DeclareI18N 定义的值。通过该方案开发人员在添加新的多语言时只需要往常量类里增加用 @DeclareI18N 注解的字段,至于其它语种的多语言资源在适当的时机补充上去。