feat(i18n): 新增 zh-TW/zh-HK 繁体语言包与 locale 别名映射

支持 Accept-Language 变体(zh-Hant/zh-MO 等)映射到主资源目录,台港互不回退,缺 key 统一回退 zh-CN;补齐后端 enum/error 繁体与简英词条。
This commit is contained in:
DaxPay Dev
2026-07-14 11:57:46 +08:00
parent a23a10abd7
commit 95694eb0d1
245 changed files with 3940 additions and 37 deletions

View File

@@ -0,0 +1,4 @@
{
"authFailed": "換取支付寶用户標識失敗: {0}",
"clientInitFailed": "支付寶 OpenAPI 初始化失敗: {0}"
}

View File

@@ -0,0 +1,4 @@
{
"authFailed": "換取支付寶使用者標識失敗: {0}",
"clientInitFailed": "支付寶 OpenAPI 初始化失敗: {0}"
}

View File

@@ -0,0 +1,3 @@
{
"authFailed": "抖音: 獲取用户標識失敗: {0}"
}

View File

@@ -0,0 +1,3 @@
{
"authFailed": "抖音: 獲取使用者標識失敗: {0}"
}

View File

@@ -0,0 +1,22 @@
{
"configNotExist": "平台配置不存在或未啓用",
"unsupportedSource": "不支持的平台",
"unsupportedClient": "社交登錄僅支持運營端(admin)與商户端(merchant)",
"configDuplicated": "該平台配置已存在",
"notConfigured": "平台尚未配置,無法啓停",
"authCodeBlank": "授權碼不能為空",
"endpointNotConfigured": "端點配置中缺少對應前端訪問地址,無法生成回調 URL",
"adminEndpointNotConfigured": "請先在端點配置中設置「管理端訪問地址」(adminBaseUrl)",
"merchantEndpointNotConfigured": "請先在端點配置中設置「商户端訪問地址」(merchantBaseUrl),商户社交登錄依賴該地址生成回調",
"alipayNotConfigured": "平台級支付寶配置不完整,請先在「三方平台管理」中配置",
"wechatMpNotConfigured": "平台級微信公眾號配置不完整,請先在「三方平台管理」中配置",
"douyinH5NotConfigured": "平台級抖音 H5 應用配置不完整,請先在「三方平台管理」中配置",
"weCom": {
"notCorpMember": "非本企業成員,不支持登錄"
},
"bind": {
"alreadyBoundByOther": "該第三方賬號已被其他用户綁定",
"alreadyBoundPlatform": "您已綁定該平台,請先解綁後再綁定新賬號",
"clientMismatch": "當前登錄用户不屬於該終端,無法完成綁定"
}
}

View File

@@ -0,0 +1,22 @@
{
"configNotExist": "平臺配置不存在或未啟用",
"unsupportedSource": "不支援的平臺",
"unsupportedClient": "社交登入僅支援運營端(admin)與商戶端(merchant)",
"configDuplicated": "該平臺配置已存在",
"notConfigured": "平臺尚未配置,無法啟停",
"authCodeBlank": "授權碼不能為空",
"endpointNotConfigured": "端點配置中缺少對應前端訪問地址,無法生成回撥 URL",
"adminEndpointNotConfigured": "請先在端點配置中設定「管理端訪問地址」(adminBaseUrl)",
"merchantEndpointNotConfigured": "請先在端點配置中設定「商戶端訪問地址」(merchantBaseUrl),商戶社交登入依賴該地址生成回撥",
"alipayNotConfigured": "平臺級支付寶配置不完整,請先在「三方平臺管理」中配置",
"wechatMpNotConfigured": "平臺級微信公眾號配置不完整,請先在「三方平臺管理」中配置",
"douyinH5NotConfigured": "平臺級抖音 H5 應用配置不完整,請先在「三方平臺管理」中配置",
"weCom": {
"notCorpMember": "非本企業成員,不支援登入"
},
"bind": {
"alreadyBoundByOther": "該第三方賬號已被其他使用者繫結",
"alreadyBoundPlatform": "您已繫結該平臺,請先解綁後再繫結新賬號",
"clientMismatch": "當前登入使用者不屬於該終端,無法完成繫結"
}
}

View File

@@ -25,6 +25,13 @@ import java.util.concurrent.ConcurrentHashMap;
/// 扫描规则: 扫描 classpath*:i18n/{locale}/**\/*.json, 文件路径映射为 key 前缀
/// 例如: i18n/zh-CN/channel/enum.json → key 前缀 "channel.enum"
/// JSON 内容: { "alipay": "支付宝" } → 完整 key: "channel.enum.alipay"
///
/// ## 地区别名
/// 无独立资源目录的 Accept-Language 变体会先映射到主资源 locale:
/// - `zh-Hant` / `zh-Hant-TW` → `zh-TW`
/// - `zh-HK` / `zh-Hant-HK` / `zh-MO` / `zh-Hant-MO` → `zh-HK`
/// - `zh-Hans` / `zh-Hans-CN` → `zh-CN`
/// 缺 key 时: 精确资源 → 默认 `zh-CN`(台港互不为 fallback
@Slf4j
public class JsonMessageSource extends AbstractMessageSource {
@@ -40,10 +47,26 @@ public class JsonMessageSource extends AbstractMessageSource {
/// 已加载的可用 locale 标签集合(如 en-US, zh-CN启动时扫描
private final Set<String> availableLocaleTags = new HashSet<>();
/// 语言码 → 首个匹配的地区 locale 标签(如 en → en-US, zh → zh-CN用于反向回退
/// 当请求纯语言码(如 en而无对应资源目录时, 据此映射到同语言的地区资源
/// 语言码 → 地区 locale 标签(如 en → en-US, zh → zh-CN用于反向回退
private final Map<String, String> languageToRegionLocale = new HashMap<>();
/// Accept-Language / 客户端变体 → 资源目录 locale 标签
private static final Map<String, String> LOCALE_ALIASES = Map.ofEntries(
Map.entry("zh-hans", "zh-CN"),
Map.entry("zh-hans-cn", "zh-CN"),
Map.entry("zh-cn", "zh-CN"),
Map.entry("zh-hant", "zh-TW"),
Map.entry("zh-hant-tw", "zh-TW"),
Map.entry("zh-tw", "zh-TW"),
Map.entry("zh-hant-hk", "zh-HK"),
Map.entry("zh-hk", "zh-HK"),
Map.entry("zh-hant-mo", "zh-HK"),
Map.entry("zh-mo", "zh-HK"),
Map.entry("en", "en-US"),
Map.entry("en-us", "en-US"),
Map.entry("en-gb", "en-US")
);
public JsonMessageSource(ResourcePatternResolver resourceResolver) {
this.resourceResolver = resourceResolver;
this.scanAvailableLocales();
@@ -51,38 +74,56 @@ public class JsonMessageSource extends AbstractMessageSource {
@Override
protected MessageFormat resolveCode(String code, Locale locale) {
Map<String, String> messages = this.loadMessages(locale);
Locale resolved = this.resolveResourceLocale(locale);
Map<String, String> messages = this.loadMessages(resolved);
String message = messages.get(code);
// 未命中则按语言(不含地区)回退: zh-CN -> zh
// 未命中则按语言反向匹配地区: en -> en-USzh 优先 zh-CN
if (message == null) {
Locale langOnly = Locale.of(locale.getLanguage());
if (!langOnly.equals(locale)) {
messages = this.loadMessages(langOnly);
message = messages.get(code);
}
}
// 仍未命中则按语言反向匹配地区: en -> en-US, zh -> zh-CN, zh-Hans -> zh-CN
if (message == null) {
String lang = locale.getLanguage();
String lang = resolved.getLanguage();
if (!lang.isEmpty()) {
String regionTag = this.languageToRegionLocale.get(lang);
if (regionTag != null) {
Locale regionLocale = Locale.forLanguageTag(regionTag);
if (!regionLocale.equals(locale)) {
if (!regionLocale.equals(resolved)) {
messages = this.loadMessages(regionLocale);
message = messages.get(code);
}
}
}
}
// 仍未命中则用默认 locale 回退
if (message == null && !locale.equals(this.defaultLocale)) {
// 仍未命中则用默认 locale 回退(台港互不回退,统一可回 zh-CN
if (message == null && !resolved.equals(this.defaultLocale)) {
messages = this.loadMessages(this.defaultLocale);
message = messages.get(code);
}
return message != null ? new MessageFormat(message, locale) : null;
}
/// 将请求 locale 规范为资源目录标签对应的 Locale
private Locale resolveResourceLocale(Locale locale) {
if (locale == null) {
return this.defaultLocale;
}
String tag = locale.toLanguageTag();
String lower = tag.toLowerCase(Locale.ROOT);
String alias = LOCALE_ALIASES.get(lower);
if (alias != null) {
return Locale.forLanguageTag(alias);
}
// 脚本 Hant 无地区 → 台湾
if ("zh".equals(locale.getLanguage()) && "Hant".equalsIgnoreCase(locale.getScript())
&& (locale.getCountry() == null || locale.getCountry().isEmpty())) {
return Locale.forLanguageTag("zh-TW");
}
// 脚本 Hans → 简体
if ("zh".equals(locale.getLanguage()) && "Hans".equalsIgnoreCase(locale.getScript())) {
return Locale.forLanguageTag("zh-CN");
}
return locale;
}
private Map<String, String> loadMessages(Locale locale) {
return this.cachedMessages.computeIfAbsent(locale, this::loadFromFiles);
}
@@ -90,25 +131,20 @@ public class JsonMessageSource extends AbstractMessageSource {
private Map<String, String> loadFromFiles(Locale locale) {
Map<String, String> result = new HashMap<>();
String localeTag = locale.toLanguageTag();
// 兼容 zh-CN 和 zh_CN 两种格式
String basePath = "classpath*:i18n/" + localeTag + "/**/*.json";
try {
Resource[] resources = this.resourceResolver.getResources(basePath);
for (Resource resource : resources) {
String filePath = resource.getURL().toString();
// 提取相对路径: 从 i18n/{locale}/ 之后到 .json 之前
String relativePath = this.extractRelativePath(filePath, localeTag);
if (relativePath == null) {
continue;
}
// 读取文件内容
String content = this.readResourceContent(resource);
if (content == null || content.isBlank()) {
continue;
}
// 解析 JSON
JSONObject jsonObj = JSONUtil.parseObj(content);
// 递归展平
this.flattenJson(relativePath, jsonObj, result);
}
log.debug("加载国际化文件完成, locale={}, 条目数={}", localeTag, result.size());
@@ -121,7 +157,6 @@ public class JsonMessageSource extends AbstractMessageSource {
/// 从完整 URL 路径中提取 locale 后的相对路径
/// 例如: .../i18n/zh-CN/channel/enum.json → channel.enum
/// 从资源 URL 解析 i18n 相对路径前缀(供单测校验)
String extractRelativePath(String fileUrl, String localeTag) {
String decoded = URLDecoder.decode(fileUrl, StandardCharsets.UTF_8);
String marker = "i18n/" + localeTag + "/";
@@ -130,23 +165,19 @@ public class JsonMessageSource extends AbstractMessageSource {
return null;
}
String relative = decoded.substring(idx + marker.length());
// 去掉 .json 后缀
if (relative.endsWith(".json")) {
relative = relative.substring(0, relative.length() - 5);
}
// 路径分隔符替换为 .
return relative.replace('/', '.').replace('\\', '.');
}
/// 启动时扫描 i18n 目录下所有 locale 子目录,建立「语言码 → 地区 locale」反向映射
/// 用于支持请求纯语言码(如 en时反向匹配到地区资源如 en-US
private void scanAvailableLocales() {
try {
Resource[] resources = this.resourceResolver.getResources("classpath*:i18n/**/*.json");
for (Resource resource : resources) {
String localeTag = this.extractLocaleTag(resource.getURL().toString());
if (localeTag != null && this.availableLocaleTags.add(localeTag)) {
// 首次发现该 locale, 记录语言 → 地区映射
Locale locale = Locale.forLanguageTag(localeTag);
String lang = locale.getLanguage();
if (!lang.isEmpty()) {
@@ -154,14 +185,21 @@ public class JsonMessageSource extends AbstractMessageSource {
}
}
}
// 多中文地区并存时,纯语言码 zh 固定落到简体,避免扫序导致落到 zh-TW/zh-HK
if (this.availableLocaleTags.contains("zh-CN")) {
this.languageToRegionLocale.put("zh", "zh-CN");
}
if (this.availableLocaleTags.contains("en-US")) {
this.languageToRegionLocale.put("en", "en-US");
}
log.debug("扫描到可用 locale: {}, 语言→地区映射: {}", this.availableLocaleTags, this.languageToRegionLocale);
} catch (IOException e) {
}
catch (IOException e) {
log.warn("扫描可用 locale 失败, 语言→地区反向回退将不可用", e);
}
}
/// 从资源 URL 提取 locale 标签
/// .../i18n/en-US/enum/xxx.json → "en-US"
private String extractLocaleTag(String fileUrl) {
String decoded = URLDecoder.decode(fileUrl, StandardCharsets.UTF_8);
String marker = "i18n/";
@@ -174,9 +212,6 @@ public class JsonMessageSource extends AbstractMessageSource {
return slash > 0 ? after.substring(0, slash) : null;
}
/// 递归展平 JSON 对象
/// 例如: { "alipay": "支付宝", "amount": { "exceed": "金额超限" } }
/// 前缀 "channel.enum" → channel.enum.alipay="支付宝", channel.enum.amount.exceed="金额超限"
private void flattenJson(String prefix, JSONObject json, Map<String, String> result) {
for (Map.Entry<String, Object> entry : json.entrySet()) {
String key = prefix.isEmpty() ? entry.getKey() : prefix + "." + entry.getKey();

View File

@@ -0,0 +1,8 @@
{
"cny": "CNY",
"usd": "USD",
"jpy": "JPY",
"eur": "EUR",
"hkd": "HKD",
"gbp": "GBP"
}

View File

@@ -0,0 +1,8 @@
{
"normal": "Normal Pay",
"gateway": "Gateway Pay",
"authorize": "Authorize",
"capture": "Capture",
"recurring": "Recurring",
"combine_sub": "Combine Sub-order"
}

View File

@@ -28,5 +28,6 @@
"beReplaced": "Account signed in on another device",
"kickOut": "Session no longer valid, please log in again",
"tokenFreeze": "Authentication credential frozen",
"concurrentLimitExceeded": "Concurrent login limit reached, please sign out from another device first"
"concurrentLimitExceeded": "Concurrent login limit reached, please sign out from another device first",
"contextNotInit": "Auth context is not initialized. Please sign in again or refresh the page."
}

View File

@@ -36,5 +36,10 @@
"gatewayPayTypeNotExist": "Gateway pay type not found: {0}",
"aggregateConfigLevelNotExist": "Aggregate config level not found: {0}",
"gatewayCashierTypeNotExist": "Gateway cashier type not found: {0}",
"cashierItemResolveModeNotExist": "Cashier item resolve mode not found: {0}"
"cashierItemResolveModeNotExist": "Cashier item resolve mode not found: {0}",
"currencyNotExist": "Currency not found: {0}",
"payTradeTypeNotExist": "Pay trade type not found: {0}",
"payFundStatusNotExist": "Pay fund status not found: {0}",
"normalOrderStatusNotExist": "Normal pay order status not found: {0}",
"gatewayOrderStatusNotExist": "Gateway order status not found: {0}"
}

View File

@@ -5,5 +5,6 @@
"permissionDbError": "User has no permission",
"internalCannotDelete": "Built-in role cannot be deleted",
"assignOutOfScope": "Role assignment exceeds the assignable scope",
"assignCrossClient": "Cannot assign a role across terminals: user client [{0}], role client [{1}]",
"notExist": "Role not found"
}

View File

@@ -0,0 +1,8 @@
{
"cny": "人民币",
"usd": "美元",
"jpy": "日元",
"eur": "欧元",
"hkd": "港元",
"gbp": "英镑"
}

View File

@@ -0,0 +1,8 @@
{
"normal": "普通支付",
"gateway": "网关支付",
"authorize": "预授权冻结",
"capture": "预授权捕获",
"recurring": "周期代扣",
"combine_sub": "合单子单"
}

View File

@@ -28,5 +28,6 @@
"beReplaced": "账号已在其他设备登录",
"kickOut": "登录状态已失效,请重新登录",
"tokenFreeze": "登录凭证已被冻结",
"concurrentLimitExceeded": "并发登录数已达上限,请先退出其他设备"
"concurrentLimitExceeded": "并发登录数已达上限,请先退出其他设备",
"contextNotInit": "认证上下文未初始化,请重新登录或刷新页面"
}

View File

@@ -36,5 +36,10 @@
"gatewayPayTypeNotExist": "网关支付类型不存在: {0}",
"aggregateConfigLevelNotExist": "聚合扫码配置深度不存在: {0}",
"gatewayCashierTypeNotExist": "收银台类型不存在: {0}",
"cashierItemResolveModeNotExist": "收银台支付项解析模式不存在: {0}"
"cashierItemResolveModeNotExist": "收银台支付项解析模式不存在: {0}",
"currencyNotExist": "币种不存在: {0}",
"payTradeTypeNotExist": "资金交易形态不存在: {0}",
"payFundStatusNotExist": "资金交易状态不存在: {0}",
"normalOrderStatusNotExist": "普通支付订单状态不存在: {0}",
"gatewayOrderStatusNotExist": "网关支付订单状态不存在: {0}"
}

View File

@@ -5,5 +5,6 @@
"permissionDbError": "用户没有权限",
"internalCannotDelete": "内置角色不允许删除",
"assignOutOfScope": "角色分配超出了可分配的范围",
"assignCrossClient": "禁止为用户分配跨终端角色:用户归属终端[{0}],角色归属终端[{1}]",
"notExist": "角色不存在"
}

View File

@@ -0,0 +1,35 @@
{
"success": "success",
"channelNotFound": "不支持的通道編碼",
"channelNotFoundWithDetail": "不支持的通道編碼: {0}",
"invalidConfig": "通道配置無效",
"sdkCallFailed": "SDK 調用失敗",
"sdkCallFailedWithDetail": "SDK 調用失敗: {0}",
"callbackVerifyFailed": "回調驗籤失敗",
"cacheConcurrentConflict": "併發衝突",
"systemError": "系統內部錯誤",
"validateParams": "參數校驗失敗",
"wechatOrderQueryFailed": "微信訂單查詢異常: {0}",
"wechatRefundQueryFailed": "微信退款查詢異常: {0}",
"wechatRefundCallFailed": "微信退款調用異常: {0}",
"wechatPayCallFailed": "微信支付調用異常: {0}",
"wechatCloseOrderFailed": "微信關閉訂單異常: {0}",
"alipayOrderQueryFailed": "支付寶訂單查詢異常: {0}",
"alipayRefundQueryFailed": "支付寶退款查詢異常: {0}",
"alipayRefundFailed": "支付寶退款異常: {0}",
"alipayRefundCallFailed": "支付寶退款調用異常: {0}",
"alipayPreCreateFailed": "支付寶預創建訂單異常: {0}",
"alipayPayCallFailed": "支付寶支付調用異常: {0}",
"alipayCloseOrderFailed": "支付寶關閉訂單異常: {0}",
"alipayClientCreateFailed": "創建AlipayClient異常: {0}",
"lakalaIsvKeyNotConfigured": "拉卡拉服務商密鑰未配置",
"lakalaMerchantDuplicate": "該商户下已存在此拉卡拉商户號",
"lakalaPayFailed": "支付異常: {0}",
"lakalaRefundFailed": "退款異常: {0}",
"lakalaSyncFailed": "訂單同步異常: {0}",
"lakalaCloseFailed": "關閉訂單異常: {0}",
"lakalaUnsupportedPayMethod": "拉卡拉不支持的支付方式: {0}",
"yeepayPayFailed": "易寶支付下單失敗",
"yeepayCloseFailed": "易寶關閉訂單失敗",
"yeepayUnsupportedPayMethod": "易寶不支持該支付方式: {0}"
}

View File

@@ -0,0 +1,12 @@
{
"save": "保存",
"delete": "刪除",
"confirm": "確認",
"cancel": "取消",
"submit": "提交",
"enable": "啓用",
"disable": "停用",
"operation": "操作",
"createTime": "創建時間",
"updateTime": "更新時間"
}

View File

@@ -0,0 +1,5 @@
{
"auto": "跟隨通道路由",
"method": "指定支付方式",
"direct": "指定通道商户"
}

View File

@@ -0,0 +1,5 @@
{
"merchant": "商户進件",
"enterprise": "企業進件",
"micro": "小微進件"
}

View File

@@ -0,0 +1,4 @@
{
"method": "指定支付方式",
"direct": "指定通道商户"
}

View File

@@ -0,0 +1,7 @@
{
"browser": "瀏覽器環境",
"wechat_pay": "微信環境",
"alipay": "支付寶環境",
"union_pay": "雲閃付環境",
"douyin": "抖音環境"
}

View File

@@ -0,0 +1,20 @@
{
"alipay": "支付寶",
"wechat": "微信支付",
"union_pay": "雲閃付",
"leshua_pay": "樂刷",
"vbill_pay": "隨行付",
"ada_pay": "匯付天下",
"dougong_pay": "斗拱",
"hkrt_pay": "海科融通",
"lakala_pay": "拉卡拉",
"fuyou_pay": "富友",
"sheng_pay": "盛付通",
"ysep_pay": "銀盛",
"quick_pay": "快錢",
"sand_pay": "杉德",
"yee_pay": "易寶",
"ums_pay": "銀聯商務",
"douyin_pay": "抖音支付",
"jee_pay": "jeepay"
}

View File

@@ -0,0 +1,5 @@
{
"mch": "標準商户",
"isv": "服務商",
"mix": "混合調用"
}

View File

@@ -0,0 +1,6 @@
{
"wechat": "微信",
"alipay": "支付寶",
"union_pay": "銀聯",
"douyin": "抖音"
}

View File

@@ -0,0 +1,4 @@
{
"mch": "商户號",
"identity": "身份標識"
}

View File

@@ -0,0 +1,7 @@
{
"init": "初始化",
"wait": "未報送",
"submit": "已報送",
"logged": "已註銷",
"error": "錯誤"
}

View File

@@ -0,0 +1,5 @@
{
"gateway": "支付網關",
"admin": "運營端",
"merchant": "商户端"
}

View File

@@ -0,0 +1,8 @@
{
"cny": "人民幣",
"usd": "美元",
"jpy": "日元",
"eur": "歐元",
"hkd": "港元",
"gbp": "英鎊"
}

View File

@@ -0,0 +1,5 @@
{
"mini_program": "小程序",
"mobile_app": "移動應用",
"web_app": "網站應用"
}

View File

@@ -0,0 +1,6 @@
{
"oss": "對象存儲配置",
"alipay_auth": "支付寶開放平台認證配置",
"wechat_mp_auth": "微信公眾號 H5 認證配置",
"douyin_h5_auth": "抖音開放平台 H5 應用認證配置"
}

View File

@@ -0,0 +1,4 @@
{
"pending": "待上傳",
"uploaded": "已上傳"
}

View File

@@ -0,0 +1,8 @@
{
"qr_code": "掃碼支付",
"link": "跳轉鏈接",
"mini_app": "小程序跳轉鏈接",
"jsapi": "JSAPI",
"from": "表單方式",
"app": "APP支付方式"
}

View File

@@ -0,0 +1,4 @@
{
"h5": "H5收銀台",
"web": "WEB收銀台"
}

View File

@@ -0,0 +1,7 @@
{
"wait_pay": "待支付",
"paying": "支付中",
"paid": "已支付",
"closed": "已關閉",
"expired": "已過期"
}

View File

@@ -0,0 +1,4 @@
{
"cashier": "統一收銀台",
"aggregate": "聚合掃碼"
}

View File

@@ -0,0 +1,4 @@
{
"disabled": "禁用",
"enable": "啓用"
}

View File

@@ -0,0 +1,8 @@
{
"catalog": "目錄",
"menu": "菜單",
"subpage": "子頁面",
"subpage_group": "子頁面分組",
"embedded": "內嵌頁面",
"link": "外鏈"
}

View File

@@ -0,0 +1,4 @@
{
"disabled": "禁用",
"enable": "啓用"
}

View File

@@ -0,0 +1,5 @@
{
"merchant": "商户端",
"admin": "管理端",
"cashier": "收銀台小程序"
}

View File

@@ -0,0 +1,8 @@
{
"wx_h5": "微信公眾號",
"wx_mini": "微信小程序",
"alipay_mini": "支付寶小程序",
"dy_mini": "抖音小程序",
"android": "安卓APP",
"ios": "iOS APP"
}

View File

@@ -0,0 +1,6 @@
{
"wait_pay": "待支付",
"paid": "已支付",
"closed": "已關閉",
"expired": "已過期"
}

View File

@@ -0,0 +1,4 @@
{
"auto": "自動發送",
"manual": "手動發送"
}

View File

@@ -0,0 +1,4 @@
{
"pay": "支付訂單變動通知",
"refund": "退款訂單變動通知"
}

View File

@@ -0,0 +1,4 @@
{
"normal": "普通",
"important": "重要"
}

View File

@@ -0,0 +1,5 @@
{
"draft": "草稿",
"published": "發佈",
"offline": "下線"
}

View File

@@ -0,0 +1,4 @@
{
"notice": "公告",
"message": "消息"
}

View File

@@ -0,0 +1,12 @@
{
"other": "其它",
"add": "新增",
"update": "修改",
"delete": "刪除",
"grant": "授權",
"sync": "同步",
"export": "導出",
"import": "導入",
"force": "強退",
"clean": "清空"
}

View File

@@ -0,0 +1,8 @@
{
"link": "支付鏈接",
"jsapi": "JSAPI對象",
"from": "表單數據",
"identifier": "標識碼",
"qr_code": "二維碼",
"json": "JSON對象"
}

View File

@@ -0,0 +1,30 @@
{
"aggregate_pay_qrcode": "聚合掃碼",
"aggregate_pay_barcode": "聚合付款碼",
"wechat_cashier": "微信小程序收銀台",
"wechat_jsapi": "微信 JSAPI",
"wechat_app": "微信 APP",
"wechat_h5": "微信 H5",
"wechat_qr": "微信掃碼",
"wechat_mini": "微信小程序",
"wechat_barcode": "微信付款碼",
"alipay_barcode": "支付寶付款碼",
"alipay_qr": "支付寶掃碼",
"alipay_app": "支付寶 APP",
"alipay_h5": "支付寶 H5",
"alipay_pc": "支付寶電腦",
"alipay_jsapi": "支付寶 JSAPI",
"alipay_mini": "支付寶小程序",
"union_pay_qr": "銀聯掃碼",
"union_pay_barcode": "銀聯付款碼",
"union_pay_h5": "銀聯 H5",
"union_pay_jsapi": "銀聯 JSAPI",
"douyin_qr": "抖音掃碼",
"douyin_jsapi": "抖音 JSAPI",
"douyin_h5": "抖音 H5",
"douyin_app": "抖音 APP",
"visa_card_gateway": "Visa 網關",
"visa_card_present": "Visa 線下",
"mastercard_card_gateway": "萬事達網關",
"mastercard_card_present": "萬事達線下"
}

View File

@@ -0,0 +1,5 @@
{
"prod": "生產環境",
"sandbox": "沙箱環境",
"none": "未啓用"
}

View File

@@ -0,0 +1,8 @@
{
"init": "待支付",
"processing": "處理中",
"success": "成功",
"fail": "失敗",
"close": "已關閉",
"cancel": "已撤銷"
}

View File

@@ -0,0 +1,3 @@
{
"no_credit": "信用卡支付"
}

View File

@@ -0,0 +1,31 @@
{
"aggregate_pay_qrcode": "聚合掃碼",
"aggregate_pay_barcode": "聚合付款碼",
"wechat_cashier": "微信小程序收銀台",
"wechat_qr": "微信Native",
"wechat_jsapi": "微信JSAPI",
"wechat_mini": "微信小程序",
"wechat_h5": "微信H5",
"wechat_app": "微信APP",
"wechat_barcode": "微信付款碼",
"alipay_qr": "支付寶掃碼",
"alipay_jsapi": "支付寶JSAPI",
"alipay_mini": "支付寶小程序",
"alipay_pc": "支付寶PC",
"alipay_h5": "支付寶H5",
"alipay_app": "支付寶APP",
"alipay_barcode": "支付寶付款碼",
"union_qr": "銀聯掃碼",
"union_jsapi": "銀聯JSAPI",
"union_h5": "銀聯H5",
"union_pay_barcode": "銀聯付款碼",
"douyin_qr": "抖音掃碼",
"douyin_jsapi": "抖音JSAPI",
"douyin_h5": "抖音H5",
"douyin_app": "抖音APP",
"visa_card_gateway": "Visa網關",
"visa_card_present": "Visa刷卡",
"mastercard_card_gateway": "萬事達網關",
"mastercard_card_present": "萬事達刷卡",
"other": "其他"
}

View File

@@ -0,0 +1,9 @@
{
"aggregate_pay": "聚合支付",
"wechat": "微信支付",
"alipay": "支付寶",
"union_pay": "銀聯",
"visa": "Visa",
"mastercard": "萬事達",
"douyin": "抖音支付"
}

View File

@@ -0,0 +1,6 @@
{
"no_refund": "未退款",
"refunding": "退款中",
"partial_refund": "部分退款",
"refunded": "全部退款"
}

View File

@@ -0,0 +1,4 @@
{
"basic": "按渠道默認",
"scene": "按支付方式"
}

View File

@@ -0,0 +1,9 @@
{
"wait": "待支付",
"progress": "支付中",
"success": "成功",
"close": "支付關閉",
"cancel": "支付撤銷",
"fail": "失敗",
"timeout": "支付超時"
}

View File

@@ -0,0 +1,8 @@
{
"normal": "普通支付",
"gateway": "網關支付",
"authorize": "預授權凍結",
"capture": "預授權捕獲",
"recurring": "週期代扣",
"combine_sub": "合單子單"
}

View File

@@ -0,0 +1,9 @@
{
"security_password_policy": "密碼策略配置",
"security_login": "登錄安全配置",
"security_session": "會話管理配置",
"security_two_factor_auth": "雙因素認證配置",
"url": "系統訪問地址配置",
"website": "站點顯示內容配置",
"wechat_notify": "微信消息通知模板配置"
}

View File

@@ -0,0 +1,27 @@
{
"alipay_isv": "支付寶(服務商)",
"alipay": "支付寶(直連)",
"wechat_isv": "微信支付(服務商)",
"wechat_pay": "微信支付(直連)",
"douyin_pay": "抖音支付(直連)",
"ums_qrcode": "銀聯商務(C掃B)",
"ums_jsapi": "銀聯商務(公眾號)",
"ums_app": "銀聯商務(APP)",
"ums_mini": "銀聯商務(小程序)",
"ums_h5": "銀聯商務(H5)",
"ums_barcode": "銀聯商務(B掃C)",
"lakala_pay": "拉卡拉支付",
"leshua_pay": "樂刷支付",
"ada_pay": "匯付天下",
"dougong_pay": "斗拱支付",
"hkrt_pay": "海科融通",
"vbill_pay": "隨行付",
"fuyou_pay": "富友支付",
"sheng_pay": "盛付通",
"ysep_pay": "銀盛支付",
"quick_pay": "快錢支付",
"hm_pay": "河馬付",
"sand_pay": "杉德支付",
"yee_pay": "易寶支付",
"jee_pay": "Jeepay"
}

View File

@@ -0,0 +1,4 @@
{
"random": "自定義金額",
"fixed": "固定金額"
}

View File

@@ -0,0 +1,4 @@
{
"enabled": "啓用",
"disabled": "停用"
}

View File

@@ -0,0 +1,7 @@
{
"init": "初始化",
"progress": "退款中",
"success": "退款成功",
"fail": "退款失敗",
"close": "退款關閉"
}

View File

@@ -0,0 +1,6 @@
{
"H5": "H5頁面",
"MINI_APP": "小程序",
"ADMIN": "後台創建",
"PC": "PC端"
}

View File

@@ -0,0 +1,3 @@
{
"merchant_admin": "商户管理員"
}

View File

@@ -0,0 +1,12 @@
{
"weChat": "微信開放平台",
"weCom": "企業微信",
"qq": "QQ",
"github": "GitHub",
"gitee": "Gitee",
"google": "Google",
"feishu": "飛書",
"dingTalk": "釘釘",
"douyin": "抖音",
"alipay": "支付寶"
}

View File

@@ -0,0 +1,4 @@
{
"disabled": "停用",
"enable": "啓用"
}

View File

@@ -0,0 +1,5 @@
{
"micro": "小微商户",
"individual": "個體工商户",
"enterprise": "企業"
}

View File

@@ -0,0 +1,5 @@
{
"pay": "支付",
"refund": "退款",
"transfer": "轉賬"
}

View File

@@ -0,0 +1,7 @@
{
"user": "用户操作",
"mch_api": "商户API",
"cashier_code": "碼牌",
"checkout": "收銀台支付",
"aggress_pay": "聚合/收銀台支付"
}

View File

@@ -0,0 +1,8 @@
{
"progress": "執行中",
"success": "成功",
"fail": "失敗",
"closed": "關閉",
"revoked": "撤銷",
"exception": "異常"
}

View File

@@ -0,0 +1,6 @@
{
"pay": "支付",
"refund": "退款",
"cashouts": "提現",
"settle": "結算"
}

View File

@@ -0,0 +1,4 @@
{
"public": "公開文件",
"private": "私有文件"
}

View File

@@ -0,0 +1,5 @@
{
"WEB": "Web端",
"APP": "App端",
"MINIAPP": "小程序端"
}

View File

@@ -0,0 +1,5 @@
{
"DRAFT": "草稿",
"PUBLISHED": "已發佈",
"ARCHIVED": "已歸檔"
}

View File

@@ -0,0 +1,6 @@
{
"USER_AGREEMENT": "用户協議",
"PRIVACY_POLICY": "隱私政策",
"THIRD_PARTY_INFO": "第三方信息共享清單",
"CHILDREN_POLICY": "未成年人隱私説明"
}

View File

@@ -0,0 +1,5 @@
{
"normal": "正常",
"lock": "鎖定",
"ban": "封禁"
}

View File

@@ -0,0 +1,4 @@
{
"withdraw": "提現",
"adjust": "人工調賬"
}

View File

@@ -0,0 +1,4 @@
{
"SP_APP": "服務商應用",
"SUB_APP": "子商户應用"
}

View File

@@ -0,0 +1,4 @@
{
"sp": "服務商用户標識",
"sub": "子商户應用用户標識"
}

View File

@@ -0,0 +1,5 @@
{
"official_account": "公眾號",
"mini_program": "小程序",
"mobile_app": "移動應用"
}

View File

@@ -0,0 +1,5 @@
{
"official_account": "公眾號",
"mini_program": "小程序",
"mobile_app": "移動應用"
}

View File

@@ -0,0 +1,4 @@
{
"official_account": "公眾號",
"miniprogram": "小程序"
}

View File

@@ -0,0 +1,7 @@
{
"sendFailed": "消息發送失敗: {0}",
"delaySendFailed": "延時消息發送失敗: {0}",
"serializeFailed": "消息序列化失敗: {0}",
"parseBodyFailed": "消息體解析失敗: {0}",
"typeConvertFailed": "消息類型轉換失敗: {0}"
}

View File

@@ -0,0 +1,33 @@
{
"accountOrPasswordError": "賬號或密碼不正確",
"notLogin": "用户未登錄",
"passwordExpired": "密碼已過期,請先修改密碼",
"captchaError": "驗證碼錯誤",
"captchaRequired": "請輸入驗證碼",
"userNotFound": "用户未找到",
"routerCheck": "沒有對應請求路徑的權限",
"applicationNotFound": "未找到對應的應用",
"applicationNotEnable": "指定應用已被停用",
"clientNotFound": "未找到對應的終端",
"clientNotEnable": "指定終端方式已被停用",
"clientMismatch": "該第三方賬號綁定的用户不屬於當前登錄終端",
"userStatusError": "用户狀態異常",
"privateKeyNotConfigured": "平台私鑰未配置,無法解密密碼",
"passwordDecryptFailed": "密碼解密失敗,請檢查密碼傳輸方式",
"loginMethodNotSupported": "當前終端不支持該登錄方式",
"loginAuthenticatorNotFound": "未找到對應的登錄認證器",
"builtinAdminLoginDisabled": "當前終端未開啓內置超管登錄能力",
"userDisabled": "該用户已被禁用",
"twoFactorRequired": "需要雙因素認證",
"twoFactorCodeError": "動態碼或備用碼錯誤",
"twoFactorPreAuthExpired": "預認證令牌無效或已過期,請重新登錄",
"loginRetryLock": "登錄失敗次數過多,請{0}分鐘後重試",
"notToken": "未提供登錄憑證",
"invalidToken": "登錄憑證無效",
"tokenTimeout": "登錄已過期,請重新登錄",
"beReplaced": "賬號已在其他設備登錄",
"kickOut": "登錄狀態已失效,請重新登錄",
"tokenFreeze": "登錄憑證已被凍結",
"concurrentLimitExceeded": "併發登錄數已達上限,請先退出其他設備",
"contextNotInit": "認證上下文未初始化,請重新登錄或刷新頁面"
}

View File

@@ -0,0 +1,3 @@
{
"envMismatch": "通道商户環境與支付產品當前生效環境不一致"
}

View File

@@ -0,0 +1,47 @@
{
"alipayNotEnabled": "支付寶通道未啓用",
"wechatNotEnabled": "商户或服務商微信支付通道未啓用",
"productConfigNotExist": "服務商產品支付配置不存在",
"noSubMchPerm": "你沒有權限配置此子商户號",
"closeFailed": "支付寶關閉訂單異常: {0}",
"closeFailedReason": "關閉失敗, 原因: {0}",
"cannotCloseSyncFirst": "當前交易無法關閉操作, 請對訂單同步狀態後再進行操作",
"refundQueryInterval": "間隔10秒以上再發起退款查詢請求",
"alipayRefundFailed": "支付寶退款失敗: {0}",
"wechatRefundV3Failed": "微信退款V3失敗",
"alipayH5Failed": "支付寶手機支付失敗",
"alipayAppFailed": "支付寶APP支付失敗",
"alipayPcFailed": "支付寶PC支付失敗",
"alipayJsapiFailed": "支付寶JsApi支付失敗",
"alipayScanFailed": "支付寶掃碼支付失敗",
"alipayBscanFailed": "主動掃碼支付失敗",
"payFailed": "支付寶支付異常: {0}",
"notSupportCancel": "該訂單不支持撤銷操作",
"notSupportMethod": "暫不支持的支付寶支付方式: {0}",
"wechatJsapiNeedOpenid": "微信JSAPI支付必須傳入openId參數",
"wechatH5Failed": "微信V3手機網站支付失敗",
"wechatAppFailed": "微信V3程序支付失敗",
"wechatJsapiFailed": "微信V3JsApi支付失敗",
"wechatScanFailed": "微信V3掃碼支付失敗",
"wechatCancelV3Failed": "微信撤銷支付V3失敗",
"privateKeyRequired": "應用私鑰不可為空",
"alipayPublicKeyRequired": "支付寶公鑰不可為空",
"appCertRequired": "應用公鑰證書不可為空",
"alipayCertRequired": "支付寶公鑰證書不可為空",
"alipayRootCertRequired": "支付寶CA根證書不可為空",
"apiV3KeyRequired": "API V3密鑰不可為空",
"subConfigNotExist": "支付寶子商户配置不存在",
"mchProductConfigNotExist": "支付寶產品支付配置不存在",
"appIdDuplicate": "同一服務商下應用ID已存在",
"appNotFound": "支付寶服務商應用不存在",
"mchAppNotFound": "支付寶通道商户應用不存在",
"subMerchantDuplicate": "該支付寶應用下已存在此子商户號",
"directMchDuplicate": "同一商户下該支付寶商户已存在",
"userIdTypeInvalid": "用户標識類型不合法",
"capabilityDuplicate": "支付能力[{0}]重複配置",
"authUserIdMismatch": "授權返回的商户號與通道商户綁定的子商户號不一致,已拒絕綁定",
"subMerchantNoRequired": "請先配置子商户號(2088)後再發起代運營授權",
"authCodeInvalid": "支付寶授權碼無效或已過期",
"authTokenExchangeFailed": "換取應用授權令牌失敗: {0}",
"paymentGatewayUrlRequired": "平台支付網關地址(paymentGatewayBaseUrl)未配置,無法生成授權回調地址"
}

View File

@@ -0,0 +1,10 @@
{
"mchAppNotFound": "抖音通道商户應用不存在",
"appIdDuplicate": "同一通道商户下抖音應用ID已存在",
"directMchDuplicate": "同一商户下該抖音直連商户已存在",
"appTypeInvalid": "抖音應用類型無效",
"capabilityDuplicate": "同一通道商户下支付能力[{0}]重複配置",
"payFailed": "抖音支付異常: {0}",
"closeFailed": "抖音關閉訂單異常: {0}",
"notSupportMethod": "暫不支持的抖音支付方式: {0}"
}

View File

@@ -0,0 +1,7 @@
{
"privateKeyRequired": "應用私鑰不可為空",
"publicKeyRequired": "應用公鑰不可為空",
"lklAppIdRequired": "拉卡拉應用編號不可為空",
"mchSerialNoRequired": "商户證書序列號不可為空",
"termNoNotConfigured": "終端號未配置, 請在商户配置中填寫"
}

View File

@@ -0,0 +1,4 @@
{
"isvKeyNotConfigured": "樂刷服務商密鑰未配置",
"merchantDuplicate": "該商户下已存在此樂刷商户號"
}

View File

@@ -0,0 +1,5 @@
{
"payFailed": "銀聯商務支付異常: {0}",
"closeFailed": "銀聯商務關閉訂單異常: {0}",
"notSupportMethod": "暫不支持的銀聯商務支付方式: {0}"
}

View File

@@ -0,0 +1,5 @@
{
"isvKeyNotConfigured": "隨行付服務商密鑰未配置",
"mnoNotConfigured": "天闕商户號(mno)未配置, 請在商户配置中填寫",
"merchantDuplicate": "該商户下已存在此天闕商户號"
}

View File

@@ -0,0 +1,59 @@
{
"notEnabled": "微信支付未啓用",
"refundV3Failed": "微信退款V3失敗: {0}",
"jsapiNeedOpenid": "微信JSAPI支付需要傳入openId",
"h5Failed": "微信H5支付失敗: {0}",
"appFailed": "微信APP支付失敗: {0}",
"jsapiFailed": "微信JSAPI支付失敗: {0}",
"scanFailed": "微信掃碼支付失敗: {0}",
"cancelV3Failed": "微信撤銷V3失敗: {0}",
"apiV3KeyRequired": "API V3密鑰未配置",
"privateKeyRequired": "商户私鑰未配置",
"messageRecordNotExist": "消息記錄不存在",
"onlyFailedCanResend": "只能重發失敗的消息",
"platformConfigNotExist": "微信消息通知配置不存在",
"mpAuthConfigIncomplete": "三方平台微信公眾號憑據未配置(AppId/AppSecret)",
"configParamsRequired": "微信配置參數不能為空",
"mpTemplateMessageFailed": "發送公眾號模板消息失敗: {0}",
"mpTemplateMessageError": "發送公眾號模板消息異常: {0}",
"maUniformMessageFailed": "發送小程序統一服務消息失敗: {0}",
"maUniformMessageError": "發送小程序統一服務消息異常: {0}",
"unsupportedMessageType": "不支持的消息類型: {0}",
"messageResendFailed": "重發消息失敗: {0}",
"userInfoFetchFailed": "獲取用户信息失敗: {0}",
"userInfoFetchError": "獲取用户信息異常: {0}",
"paramsRequired": "參數不能為空",
"phoneFetchFailed": "獲取手機號失敗: {0}",
"phoneFetchError": "獲取手機號異常: {0}",
"userInfoNotFound": "未獲取到微信用户信息",
"userNotSubscribed": "用户未關注公眾號",
"phoneNotFound": "未獲取到微信手機號",
"mpAuthFailed": "微信公眾號認證失敗: {0}",
"mpAuthConfigError": "微信公眾號認證配置錯誤: {0}",
"maAuthFailed": "微信小程序認證失敗: {0}",
"maAuthConfigError": "微信小程序認證配置錯誤: {0}",
"subConfigNotExist": "微信子商户配置不存在",
"productConfigNotExist": "微信服務商密鑰配置不存在",
"appNotFound": "微信服務商應用不存在",
"mchAppNotFound": "微信通道商户應用不存在",
"mchAppWxAppIdDuplicate": "該通道商户下微信應用AppId已存在",
"appIdDuplicate": "該服務商下微信應用AppId已存在",
"appTypeInvalid": "微信應用類型無效",
"authAppTypeInvalid": "微信認證應用類型無效",
"appSecretRequired": "應用密鑰不可為空",
"publicKeyRequired": "支付公鑰未配置",
"privateCertRequired": "API證書未配置",
"subMerchantDuplicate": "該微信應用下已存在此特約商户號",
"directMchDuplicate": "同一商户下該微信商户已存在",
"capabilityDuplicate": "微信支付能力[{0}]重複配置",
"payFailed": "微信支付異常: {0}",
"closeFailed": "微信關閉訂單異常: {0}",
"unsupportedPayMethod": "暫不支持的微信支付方式: {0}",
"accessTokenLockFailed": "獲取AccessToken失敗無法獲取分佈式鎖",
"refreshAccessTokenFailed": "刷新AccessToken失敗: {0}",
"refreshAccessTokenEmpty": "刷新AccessToken失敗返回的Token為空",
"isvKeyNotConfigured": "微信服務商密鑰未配置或不完整,請先完成服務商密鑰配置",
"authUrlFailed": "獲取授權鏈接失敗: {0}",
"authFailed": "獲取用户標識(openId)失敗: {0}",
"opAppIdNotFound": "指定的應用AppId[{0}]未在系統中配置"
}

View File

@@ -0,0 +1,45 @@
{
"system": "系統錯誤",
"authFail": "認證失敗",
"notFound": "資源不存在",
"dataNotExist": "數據不存在",
"validateParams": "參數驗證失敗: {0}",
"parseParams": "參數處理失敗",
"unsupportedOperate": "不支持的操作",
"repetitiveOperation": "重複操作",
"dangerSql": "檢測到危險SQL",
"dangerSqlWithValue": "請注意值可能存在SQL注入風險!--->{0}",
"rsaPrivateKeyParseFailed": "私鑰解析失敗,需要為 PKCS#8 格式的Rsa私鑰",
"rsaPublicKeyParseFailed": "公鑰解析失敗,需要為 PKCS#8 格式的Rsa公鑰",
"internalForbidden": "內部接口不允許普通用户進行調用",
"dbTypeNotFound": "獲取數據庫類型失敗",
"nonceMissing": "請求缺少防重放驗證參數",
"nonceInvalid": "請求驗證已失效,請重試",
"timestampExpired": "請求時間戳已過期,請重試",
"translateColumnNotFound": "實體類 {0} 中未找到屬性 {1} 的列映射",
"enumUnknown": "未知類型: {0}",
"fileOperationFailed": "文件操作失敗: {0}",
"payStatusNotExist": "該支付狀態不存在",
"payEnvNotExist": "支付環境不存在",
"tradeTypeNotExist": "交易類型不存在: {0}",
"tradeStatusNotExist": "交易狀態不存在: {0}",
"refundStatusNotExist": "退款狀態不存在: {0}",
"payRefundStatusNotExist": "該退款狀態不存在: {0}",
"payCallTypeNotSupported": "不支持的收銀台類型: {0}",
"channelAuthTypeNotExist": "認證類型不存在: {0}",
"mchAppStatusNotFound": "未找到對應的商户應用狀態類型: {0}",
"storeStatusNotFound": "未找到對應的門店狀態類型: {0}",
"backendBaseUrlNotConfigured": "平台後端訪問地址(backendBaseUrl)未配置, 無法生成回調地址",
"requestContextMissing": "無法獲取請求上下文",
"gatewayUrlNotConfigured": "支付網關前端地址(paymentGatewayBaseUrl)未配置, 無法生成認證回調地址",
"cashierSceneNotExist": "收銀場景不存在: {0}",
"gatewayPayTypeNotExist": "網關支付類型不存在: {0}",
"aggregateConfigLevelNotExist": "聚合掃碼配置深度不存在: {0}",
"gatewayCashierTypeNotExist": "收銀台類型不存在: {0}",
"cashierItemResolveModeNotExist": "收銀台支付項解析模式不存在: {0}",
"currencyNotExist": "幣種不存在: {0}",
"payTradeTypeNotExist": "資金交易形態不存在: {0}",
"payFundStatusNotExist": "資金交易狀態不存在: {0}",
"normalOrderStatusNotExist": "普通支付訂單狀態不存在: {0}",
"gatewayOrderStatusNotExist": "網關支付訂單狀態不存在: {0}"
}

Some files were not shown because too many files have changed in this diff Show More