From 442de5149a3a5be8e48cf2d60c6dd6d3ae151d6a Mon Sep 17 00:00:00 2001 From: chenqi Date: Wed, 24 Jun 2026 11:49:26 +0800 Subject: [PATCH] feat(i18n): add backend i18n properties, Flyway migration, and dictionary multi-language support --- .../core/domain/entity/SysDictData.java | 25 ++++++++- .../java/com/core/common/utils/DictUtils.java | 34 ++++++++++- .../V20260624__add_dict_multilang_columns.sql | 7 +++ .../resources/i18n/messages_en_US.properties | 56 +++++++++++++++++++ .../resources/i18n/messages_vi_VN.properties | 56 +++++++++++++++++++ .../resources/i18n/messages_en_US.properties | 43 ++++++++++++++ .../resources/i18n/messages_vi_VN.properties | 43 ++++++++++++++ 7 files changed, 262 insertions(+), 2 deletions(-) create mode 100644 healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V20260624__add_dict_multilang_columns.sql create mode 100644 healthlink-his-server/healthlink-his-application/src/main/resources/i18n/messages_en_US.properties create mode 100644 healthlink-his-server/healthlink-his-application/src/main/resources/i18n/messages_vi_VN.properties create mode 100644 healthlink-his-server/healthlink-his-miniapp/src/main/resources/i18n/messages_en_US.properties create mode 100644 healthlink-his-server/healthlink-his-miniapp/src/main/resources/i18n/messages_vi_VN.properties diff --git a/healthlink-his-server/core-common/src/main/java/com/core/common/core/domain/entity/SysDictData.java b/healthlink-his-server/core-common/src/main/java/com/core/common/core/domain/entity/SysDictData.java index 79eaa3625..bbbe68f81 100755 --- a/healthlink-his-server/core-common/src/main/java/com/core/common/core/domain/entity/SysDictData.java +++ b/healthlink-his-server/core-common/src/main/java/com/core/common/core/domain/entity/SysDictData.java @@ -55,6 +55,12 @@ public class SysDictData extends BaseEntity { /** 拼音首字母 */ private String pyStr; + /** 字典英文值 */ + private String dictValueEn; + + /** 字典越南文值 */ + private String dictValueVi; + public Long getDictCode() { return dictCode; } @@ -146,12 +152,29 @@ public class SysDictData extends BaseEntity { this.pyStr = pyStr; } + public String getDictValueEn() { + return dictValueEn; + } + + public void setDictValueEn(String dictValueEn) { + this.dictValueEn = dictValueEn; + } + + public String getDictValueVi() { + return dictValueVi; + } + + public void setDictValueVi(String dictValueVi) { + this.dictValueVi = dictValueVi; + } + @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append("dictCode", getDictCode()) .append("dictSort", getDictSort()).append("dictLabel", getDictLabel()).append("dictValue", getDictValue()) .append("dictType", getDictType()).append("cssClass", getCssClass()).append("listClass", getListClass()) - .append("isDefault", getIsDefault()).append("status", getStatus()).append("pyStr", getPyStr()) + .append("isDefault", getIsDefault()) .append("status", getStatus()).append("pyStr", getPyStr()) + .append("dictValueEn", getDictValueEn()).append("dictValueVi", getDictValueVi()) .append("createBy", getCreateBy()).append("createTime", getCreateTime()).append("updateBy", getUpdateBy()) .append("updateTime", getUpdateTime()).append("remark", getRemark()).toString(); } diff --git a/healthlink-his-server/core-common/src/main/java/com/core/common/utils/DictUtils.java b/healthlink-his-server/core-common/src/main/java/com/core/common/utils/DictUtils.java index 46da42293..f4bcb4bcc 100755 --- a/healthlink-his-server/core-common/src/main/java/com/core/common/utils/DictUtils.java +++ b/healthlink-his-server/core-common/src/main/java/com/core/common/utils/DictUtils.java @@ -12,6 +12,8 @@ import org.slf4j.LoggerFactory; import java.util.Collection; import java.util.List; +import java.util.Locale; +import org.springframework.context.i18n.LocaleContextHolder; /** * 字典工具类 @@ -76,7 +78,7 @@ public class DictUtils { } /** - * 根据字典类型和字典值获取字典标签 + * 根据字典类型和字典值获取字典标签(支持国际化) * * @param dictType 字典类型 * @param dictValue 字典值 @@ -89,6 +91,36 @@ public class DictUtils { return getDictLabel(dictType, dictValue, SEPARATOR); } + /** + * 根据字典类型和字典值获取国际化字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return 国际化字典标签 + */ + public static String getDictLabelI18n(String dictType, String dictValue) { + if (StringUtils.isEmpty(dictValue)) { + return StringUtils.EMPTY; + } + List datas = getDictCache(dictType); + if (StringUtils.isNull(datas)) { + return StringUtils.EMPTY; + } + Locale locale = LocaleContextHolder.getLocale(); + String lang = locale.getLanguage(); + for (SysDictData dict : datas) { + if (dictValue.equals(dict.getDictValue())) { + if ("en".equals(lang) && dict.getDictValueEn() != null) { + return dict.getDictValueEn(); + } else if ("vi".equals(lang) && dict.getDictValueVi() != null) { + return dict.getDictValueVi(); + } + return dict.getDictLabel(); + } + } + return StringUtils.EMPTY; + } + /** * 根据字典类型和字典标签获取字典值 * diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V20260624__add_dict_multilang_columns.sql b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V20260624__add_dict_multilang_columns.sql new file mode 100644 index 000000000..f8bf23fd8 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V20260624__add_dict_multilang_columns.sql @@ -0,0 +1,7 @@ +-- Add multi-language columns to dictionary data table +ALTER TABLE sys_dict_data ADD COLUMN IF NOT EXISTS dict_value_en VARCHAR(200); +ALTER TABLE sys_dict_data ADD COLUMN IF NOT EXISTS dict_value_vi VARCHAR(200); + +-- Add comments +COMMENT ON COLUMN sys_dict_data.dict_value_en IS 'Dictionary value in English'; +COMMENT ON COLUMN sys_dict_data.dict_value_vi IS 'Dictionary value in Vietnamese'; diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/i18n/messages_en_US.properties b/healthlink-his-server/healthlink-his-application/src/main/resources/i18n/messages_en_US.properties new file mode 100644 index 000000000..6a4fdba51 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/i18n/messages_en_US.properties @@ -0,0 +1,56 @@ +# Error messages +not.null=* Must be filled +user.jcaptcha.error=Verification code error +user.jcaptcha.expire=Verification code expired +user.not.exists=User does not exist/Incorrect password +user.password.not.match=User does not exist/Incorrect password +user.password.retry.limit.count=Incorrect password input {0} times +user.password.retry.limit.exceed=Incorrect password input {0} times, account locked for {1} minutes +user.password.delete=Sorry, your account has been deleted +user.blocked=User has been banned, please contact administrator +role.blocked=Role has been banned, please contact administrator +login.blocked=Regretfully, the visiting IP has been blacklisted +user.logout.success=Logged out successfully +length.not.valid=Length must be between {min} and {max} characters +user.username.not.valid=* 2 to 20 characters consisting of Chinese characters, letters, numbers, or underscores, and must start with a non-digit +user.password.not.valid=* 5-50 characters +user.email.not.valid=Invalid email format +user.mobile.phone.number.not.valid=Invalid phone number format +user.login.success=Login successful +user.register.success=Registration successful +user.notfound=Please log in again +user.forcelogout=Administrator forced logout, please log in again +user.unknown.error=Unknown error, please log in again +## File upload messages +upload.exceed.maxSize=Uploaded file size exceeds the limit!
The maximum allowed file size is: {0}MB! +upload.filename.exceed.length=Uploaded filename is at most {0} characters +## Permissions +no.permission=You do not have data permission, please contact administrator to add permission [{0}] +no.create.permission=You do not have create data permission, please contact administrator to add permission [{0}] +no.update.permission=You do not have modify data permission, please contact administrator to add permission [{0}] +no.delete.permission=You do not have delete data permission, please contact administrator to add permission [{0}] +no.export.permission=You do not have export data permission, please contact administrator to add permission [{0}] +no.view.permission=You do not have view data permission, please contact administrator to add permission [{0}] +apl.common.M00001={0} added successfully +apl.common.M00002={0} saved successfully +apl.common.M00003={0} already exists +apl.common.M00004={0} operation successful +apl.common.M00005={0} deleted successfully +apl.common.M00006=Operation failed, this data has been deleted by others, please refresh and retry +apl.common.M00007=Operation failed, this data has been modified by others, please refresh and retry +apl.common.M00008=Please do not submit repeatedly +apl.common.M00009=Query successful +apl.common.M00010=Operation failed, please contact administrator +apl.chargeRefund.M00001=Related {0} of this charge bill has already been issued, please refund medicine first then refund charges +apl.payment.M00001=Total actual collection from all payment channels is not equal to actual collection amount +apl.payment.M00002=Total actual collection is not equal to receivable amount +apl.payment.M00003=Please select payment method +apl.payment.M00004=Query successful +apl.payment.M00005=Operation failed, please contact administrator +apl.payment.M00006=Collection successful +apl.payment.M00007=No charge items found +apl.payment.M00008=No {0} account information found +apl.payment.M00009=No charge items found, no account conversion needed +apl.adjustPrice.M00001=Execution failed, no data loaded! +apl.adjustPrice.M00002=Execution failed, there are items under review in the price adjustment bill, please check and resubmit! +apl.yb.M00001={0} catalog does not exist, please contact administrator diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/i18n/messages_vi_VN.properties b/healthlink-his-server/healthlink-his-application/src/main/resources/i18n/messages_vi_VN.properties new file mode 100644 index 000000000..23d3cb68f --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/i18n/messages_vi_VN.properties @@ -0,0 +1,56 @@ +# Loi khi +not.null=* Phai dien +user.jcaptcha.error=Ma xac minh sai +user.jcaptcha.expire=Ma xac minh het han +user.not.exists=Tai khoan khong ton tai/Mat khau sai +user.password.not.match=Tai khoan khong ton tai/Mat khau sai +user.password.retry.limit.count=Nhap mat khau sai {0} lan +user.password.retry.limit.exceed=Nhap mat khau sai {0} lan, tai khoan bi khoa {1} phut +user.password.delete=Xin loi, tai khoan cua ban da bi xoa +user.blocked=Tai khoan da bi cam, vui long lien he quan tri vien +role.blocked=Vai tro da bi cam, vui long lien he quan tri vien +login.blocked=Rat tiec, dia chi IP da bi danh den den +user.logout.success=Dang xuat thanh cong +length.not.valid=Do dai phai tu {min} den {max} ky tu +user.username.not.valid=* Tu 2 den 20 ky tu gom chu Han, chu, so hoac gach duoi, va phai bat dau bang ky tu khong phai so +user.password.not.valid=* 5-50 ky tu +user.email.not.valid=Dinh dang email khong hop le +user.mobile.phone.number.not.valid=Dinh dang so dien thoai khong hop le +user.login.success=Dang nhap thanh cong +user.register.success=Dang ky thanh cong +user.notfound=Vui long dang nhap lai +user.forcelogout=Quan tri vien buc buc dang xuat, vui long dang nhap lai +user.unknown.error=L loi khong xac dinh, vui long dang nhap lai +## Tin nhan tai len +upload.exceed.maxSize=Kich thuoc tap tin tang len vuot qua gioi han!
Kich thuoc tap tin toi da cho phep la: {0}MB! +upload.filename.exceed.length=Ten tap tin tang len dai toi da {0} ky tu +## Quyen +no.permission=Ban khong co quyen du lieu nay, vui long lien he quan tri vien de them quyen [{0}] +no.create.permission=Ban khong co quyen tao du lieu, vui long lien he quan tri vien de them quyen [{0}] +no.update.permission=Ban khong co quyen sua du lieu, vui long lien he quan tri vien de them quyen [{0}] +no.delete.permission=Ban khong co quyen xoa du lieu, vui long lien he quan tri vien de them quyen [{0}] +no.export.permission=Ban khong co quyen xuat du lieu, vui long lien he quan tri vien de them quyen [{0}] +no.view.permission=Ban khong co quyen xem du lieu, vui long lien he quan tri vien de them quyen [{0}] +apl.common.M00001=Da them {0} thanh cong +apl.common.M00002=Da luu {0} thanh cong +apl.common.M00003={0} da ton tai +apl.common.M00004={0} thuc hien thanh cong +apl.common.M00005=Da xoa {0} thanh cong +apl.common.M00006=Thuc hien that bai, du lieu nay da bi nguoi khac xoa, vui long cap nhat va thuc hien lai +apl.common.M00007=Thuc hien that bai, du lieu nay da bi nguoi khac sua, vui long cap nhat va thuc hien lai +apl.common.M00008=Vui long khong gan gui lai +apl.common.M00009=Truy van thanh cong +apl.common.M00010=Thuc hien that bai, vui long lien he quan tri vien +apl.chargeRefund.M00001={0} lien quan den hoa don nay da duoc phat, vui long hoan thuoc truoc roi moi hoan phi +apl.payment.M00001=Tong so tien thu thue tu cac keo thanh toan khong bang so tien thu thuc te +apl.payment.M00002=Tong so tien thu thuc te khong bang so tien phai thu +apl.payment.M00003=Vui long chon phuong thuc thanh toan +apl.payment.M00004=Truy van thanh cong +apl.payment.M00005=Thuc hien that bai, vui long lien he quan tri vien +apl.payment.M00006=Thu phi thanh cong +apl.payment.M00007=Khong tim thay muc phi +apl.payment.M00008=Khong tim thay thong tin tai tai {0} +apl.payment.M00009=Khong tim thay muc phi, khong can chuyen tai khoan +apl.adjustPrice.M00001=Thuc hien that bai, khong tai du lieu nao! +apl.adjustPrice.M00002=Thuc hien that bai, trong don sua gia co hang dang trong qua trinh duyet, vui long kiem tra va gan gui lai! +apl.yb.M00001=Muc {0} khong ton tai, vui long lien he quan tri vien diff --git a/healthlink-his-server/healthlink-his-miniapp/src/main/resources/i18n/messages_en_US.properties b/healthlink-his-server/healthlink-his-miniapp/src/main/resources/i18n/messages_en_US.properties new file mode 100644 index 000000000..3c37cf4cf --- /dev/null +++ b/healthlink-his-server/healthlink-his-miniapp/src/main/resources/i18n/messages_en_US.properties @@ -0,0 +1,43 @@ +# Error messages +not.null=* Must be filled +user.jcaptcha.error=Verification code error +user.jcaptcha.expire=Verification code expired +user.not.exists=User does not exist/Incorrect password +user.password.not.match=User does not exist/Incorrect password +user.password.retry.limit.count=Incorrect password input {0} times +user.password.retry.limit.exceed=Incorrect password input {0} times, account locked for {1} minutes +user.password.delete=Sorry, your account has been deleted +user.blocked=User has been banned, please contact administrator +role.blocked=Role has been banned, please contact administrator +login.blocked=Regretfully, the visiting IP has been blacklisted +user.logout.success=Logged out successfully +length.not.valid=Length must be between {min} and {max} characters +user.username.not.valid=* 2 to 20 characters consisting of Chinese characters, letters, numbers, or underscores, and must start with a non-digit +user.password.not.valid=* 5-50 characters +user.email.not.valid=Invalid email format +user.mobile.phone.number.not.valid=Invalid phone number format +user.login.success=Login successful +user.register.success=Registration successful +user.notfound=Please log in again +user.forcelogout=Administrator forced logout, please log in again +user.unknown.error=Unknown error, please log in again +## File upload messages +upload.exceed.maxSize=Uploaded file size exceeds the limit!
Maximum allowed file size is: {0}MB! +upload.filename.exceed.length=Uploaded filename is at most {0} characters +## Permissions +no.permission=You do not have data permission, please contact administrator to add permission [{0}] +no.create.permission=You do not have create data permission, please contact administrator to add permission [{0}] +no.update.permission=You do not have modify data permission, please contact administrator to add permission [{0}] +no.delete.permission=You do not have delete data permission, please contact administrator to add permission [{0}] +no.export.permission=You do not have export data permission, please contact administrator to add permission [{0}] +no.view.permission=You do not have view data permission, please contact administrator to add permission [{0}] +apl.common.M00001={0} added successfully +apl.common.M00002={0} saved successfully +apl.common.M00003={0} already exists +apl.common.M00004={0} operation successful +apl.common.M00005={0} deleted successfully +apl.common.M00006=Operation failed, data deleted by others, please refresh and retry +apl.common.M00007=Operation failed, data modified by others, please refresh and retry +apl.common.M00008=Please do not submit repeatedly +apl.common.M00009=Query successful +apl.common.M00010=Operation failed, please contact administrator diff --git a/healthlink-his-server/healthlink-his-miniapp/src/main/resources/i18n/messages_vi_VN.properties b/healthlink-his-server/healthlink-his-miniapp/src/main/resources/i18n/messages_vi_VN.properties new file mode 100644 index 000000000..2874cb00a --- /dev/null +++ b/healthlink-his-server/healthlink-his-miniapp/src/main/resources/i18n/messages_vi_VN.properties @@ -0,0 +1,43 @@ +# Loi khi +not.null=* Phai dien +user.jcaptcha.error=Ma xac minh sai +user.jcaptcha.expire=Ma xac minh het han +user.not.exists=Tai khoan khong ton tai/Mat khau sai +user.password.not.match=Tai khoan khong ton tai/Mat khau sai +user.password.retry.limit.count=Nhap mat khau sai {0} lan +user.password.retry.limit.exceed=Nhap mat khau sai {0} lan, tai khoan bi khoa {1} phut +user.password.delete=Xin loi, tai khoan cua ban da bi xoa +user.blocked=Tai khoan da bi cam, vui long lien he quan tri vien +role.blocked=Vai tro da bi cam, vui long lien he quan tri vien +login.blocked=Rat tiec, dia chi IP da bi danh den den +user.logout.success=Dang xuat thanh cong +length.not.valid=Do dai phai tu {min} den {max} ky tu +user.username.not.valid=* Tu 2 den 20 ky tu gom chu Han, chu, so hoac gach duoi, va phai bat dau bang ky tu khong phai so +user.password.not.valid=* 5-50 ky tu +user.email.not.valid=Dinh dang email khong hop le +user.mobile.phone.number.not.valid=Dinh dang so dien thoai khong hop le +user.login.success=Dang nhap thanh cong +user.register.success=Dang ky thanh cong +user.notfound=Vui long dang nhap lai +user.forcelogout=Quan tri vien buc buc dang xuat, vui long dang nhap lai +user.unknown.error=L loi khong xac dinh, vui long dang nhap lai +## Tin nhan tai len +upload.exceed.maxSize=Kich thuoc tap tin tang len vuot qua gioi han!
Kich thuoc toi da cho phep la: {0}MB! +upload.filename.exceed.length=Ten tap tin tang len dai toi da {0} ky tu +## Quyen +no.permission=Ban khong co quyen du lieu nay, vui long lien he quan tri vien de them quyen [{0}] +no.create.permission=Ban khong co quyen tao du lieu, vui long lien he quan tri vien de them quyen [{0}] +no.update.permission=Ban khong co quyen sua du lieu, vui long lien he quan tri vien de them quyen [{0}] +no.delete.permission=Ban khong co quyen xoa du lieu, vui long lien he quan tri vien de them quyen [{0}] +no.export.permission=Ban khong co quyen xuat du lieu, vui long lien he quan tri vien de them quyen [{0}] +no.view.permission=Ban khong co quyen xem du lieu, vui long lien he quan tri vien de them quyen [{0}] +apl.common.M00001=Da them {0} thanh cong +apl.common.M00002=Da luu {0} thanh cong +apl.common.M00003={0} da ton tai +apl.common.M00004={0} thuc hien thanh cong +apl.common.M00005=Da xoa {0} thanh cong +apl.common.M00006=Thuc hien that bai, du lieu nay da bi nguoi khac xoa, vui long cap nhat va thuc hien lai +apl.common.M00007=Thuc hien that bai, du lieu nay da bi nguoi khac sua, vui long cap nhat va thuc hien lai +apl.common.M00008=Vui long khong gan gui lai +apl.common.M00009=Truy van thanh cong +apl.common.M00010=Thuc hien that bai, vui long lien he quan tri vien