专业的编程技术博客社区

网站首页 > 博客文章 正文

基于供应链SCM平台的多语言国际化设计方案(一)

baijin 2024-08-12 13:39:12 博客文章 20 ℃ 0 评论

本地化的最常见工作就是根据用户所在的语言环境提供本地化消息,本地化即国际化。

在供应链SCM平台中,登录时,由用户选择指定语言环境;登入后,按用户设定的语言环境展示菜单、页面、提示信息、数据格式等。

本地化主要是消息的本地化,从逻辑上划分,可以分为3类:消息定义、消息管理和消息使用。

一、消息定义

默认情况下,消息由两部分组成:消息键和值。

messageWithoutGroup = 不分组的消息

推荐:消息键由两部分组成:分组和消息键,用 / 分隔。这样可以对相关的消息进行分组避免命名冲突。

下面例子中,com.prolog.bc.item.screen 是分组,item.caption 是消息键,值是商品管理。

com.prolog.bc.item.screen/item.caption = 商品管理

二、消息管理

UpCloud3.0系列OTWBE产品基于spring cloud、spring boot、Vue2等技术,公司自研技术框架,采用微服务架构、前后端分离模式进行开发。

在消息管理时,我们区分页面维度系统服务维度等2部分消息本地化管理。

2.1 页面维度

页面维度消息,包括登录页、系统首页、菜单文本、菜单页面、页面校验和前端组件(富文本、对话框)等消息本地化。这些消息本地化工作,我们划分为全局消息菜单级消息2大类:

  1. 全局消息,包含登录页、系统首页、系统设置、前端组件、全局Key(默认页面元素)等系统通用的消息Key定义。
  2. 菜单级消息,包含菜单标题、菜单对应页面元素、页面校验消息Key。

同一key在全局消息和菜单级消息配置中同时出现时,菜单级消息优先于全局消息。

全局消息配置页面


菜单级消息配置页面

2.2 系统服务维度

系统服务维度本地化,包括数据模型、异常信息、校验信息、数据格式、时区转换等方面。

我们采用微服务架构,基于spring boot 2.x 系统进行开发,在消息管理基于spring boot规范,在项目工程中默认的消息包由一组 messages_<language>.properties 文件组成,位于 src/main/resources 目录下的根包目录内。

消息包文件必须是 UTF-8 编码。

prolog.core.available-locales=en,zh_CN

2.2.1 数据模型本地化

数据模型元素本地化的约定:实体、属性名称和枚举值。这些约定支持框架在 UI 组件中显示实体和枚举时方便查找本地化名称。

实体名称使用 <package>/<class> 格式本地化,属性名称使用 <package>/<class>.<attribute> 格式。

# 实体名
com.prolog.bc.mdm.chain.entity/Customer = 客户
# 属性名
com.prolog.bc.mdm.chain.entity/Customer.id = ID
com.prolog.bc.mdm.chain.entity/Customer.version = 版本号
com.prolog.bc.mdm.chain.entity/Customer.name = 名称

枚举类使用 <package>/<class> 格式本地化,枚举值使用 <package>/<class>.<value> 格式。

# 枚举名
com.prolog.bc.mdm.chain.consts/StatusEnum = 状态
# 枚举值
com.prolog.bc.mdm.chain.consts/StatusEnum.ACTIVE = 激活
com.prolog.bc.mdm.chain.consts/StatusEnum.SUSPENDED = 挂起
com.prolog.bc.mdm.chain.consts/StatusEnum.INACTIVE = 禁用

2.2.2 数据格式本地化

数据格式本地化,包含日期格式、数字间隔符和数字精度的本地化设置。日期格式还需按照用户所在时区转换为正确的时间。

    1. 日期格式, 如:2024/05/13,05/13/2024, May 13, 2024
    2. 时区,时间根据不同时区转换
    3. 数字间隔符,如:10000, 10_000, 10,000
    4. 数字精度, 如:#,##0,#,##0.###

数据格式本地化由框架进行实现,只需要在 messages_<language>.properties 文件中配置需要的格式即可。如:

# Date/time formats
dateFormat = dd/MM/yyyy
dateTimeFormat = dd/MM/yyyy HH:mm
offsetDateTimeFormat = dd/MM/yyyy HH:mm Z
timeFormat = HH:mm
offsetTimeFormat = HH:mm Z

# Number formats
integerFormat = #,##0
doubleFormat = #,##0.###
decimalFormat = #,##0.##

# Number separators
numberDecimalSeparator = .
numberGroupingSeparator = ,

2.2.3 添加消息包

当项目Key较多时,可以定义附加消息包以保持合理的属性文件大小。

  1. src/main/resources 下面的任意文件夹创建一组任意命名的属性文件。下面例子中,我们在主消息包的同级目录中创建了一组 additional_messages 文件。
 src/
    main/
        resources/
            localization_demo/
                ex1/
                    additional_messages_en.properties
                    additional_messages_zh_CN.properties
                    messages_en.properties
                    messages_zh_CN.properties
  1. 在附加消息包中按照主消息包一样的格式写入本地化消息。
  2. 为应用程序类添加 @MessageSourceBasenames 注解,并设置附加包的路径和名称:
@SpringBootApplication
@MessageSourceBasenames({"localization_demo/ex1/additional_messages"})
public class LocalizationExampleApplication {
   // ...
    
}

所有消息包中的键值加载至同一个列表中,因此需要保证所有包中键值的唯一性。

未完待续...

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表