feat(i18n): add backend i18n properties, Flyway migration, and dictionary multi-language support

This commit is contained in:
2026-06-24 11:49:26 +08:00
parent 7a07ff882c
commit 442de5149a
7 changed files with 262 additions and 2 deletions

View File

@@ -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();
}

View File

@@ -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<SysDictData> 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;
}
/**
* 根据字典类型和字典标签获取字典值
*

View File

@@ -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';

View File

@@ -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!<br/>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

View File

@@ -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!<br/>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

View File

@@ -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!<br/>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

View File

@@ -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!<br/>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