Compare commits

...

7 Commits

Author SHA1 Message Date
08aab8d5a9 add TimiSpring.getLanguageRaw 2025-11-07 23:38:50 +08:00
f887079a62 catch multilingualHeader exception 2025-11-07 16:56:40 +08:00
3283c678db fix TimiSpring.getLanguage fail on Chrome 2025-11-07 16:55:59 +08:00
3eb6bd7df5 log for not prod env 2025-11-07 15:15:41 +08:00
6a57d22366 add Multilingual common entity 2025-11-06 17:16:39 +08:00
007253f828 support get URI token for TimiSpring.getToken 2025-11-06 16:59:00 +08:00
d1728955aa fix TimiSpring.getLanguage result null for xx-XX 2025-11-06 16:34:56 +08:00
4 changed files with 130 additions and 9 deletions

View File

@ -20,6 +20,7 @@ import org.springframework.web.context.request.ServletRequestAttributes;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Locale; import java.util.Locale;
/** /**
@ -336,12 +337,16 @@ public class TimiSpring {
} }
/** /**
* 获取请求头的令牌,键为 Token * 获取请求令牌,键为 Token 或 token包括请求头和 URI
* *
* @return 令牌 * @return 令牌
*/ */
public static String getToken() { public static String getToken() {
return getHeader("Token"); return TimiJava.firstNotEmpty(getHeader("Token"), getHeader("token"), getRequestArg("token"), getRequestArg("Token"));
}
public static String getLanguageRaw() {
return getHeader("Accept-Language");
} }
/** /**
@ -351,10 +356,16 @@ public class TimiSpring {
public static Language getLanguage() { public static Language getLanguage() {
String name = getRequestArg("lang"); String name = getRequestArg("lang");
if (TimiJava.isEmpty(name)) { if (TimiJava.isEmpty(name)) {
name = getHeader("Accept-Language"); List<Locale.LanguageRange> rangeList = Locale.LanguageRange.parse(getLanguageRaw());
for (Locale.LanguageRange item : rangeList) {
if (item.getRange().contains("-")) {
name = item.getRange();
break;
} }
if (TimiJava.isEmpty(name)) { }
name = getLocale().toString(); }
if (TimiJava.isNotEmpty(name)) {
name = name.replace("-", "_");
} }
if (TimiJava.isEmpty(name)) { // use for not support if (TimiJava.isEmpty(name)) { // use for not support
return Language.zh_CN; return Language.zh_CN;

View File

@ -0,0 +1,105 @@
package com.imyeyu.spring.bean;
import com.imyeyu.java.ref.Ref;
import com.imyeyu.spring.entity.UUIDEntity;
/**
* @author 夜雨
* @since 2025-10-17 15:21
*/
public class Multilingual extends UUIDEntity {
protected String key;
protected String zhCN;
protected String zhTW;
protected String enUS;
protected String ruRU;
protected String koKR;
protected String jaJP;
protected String deDE;
/**
* 获取指定语言值
*
* @param language 指定语言
* @return 值
*/
public String getValue(com.imyeyu.java.bean.Language language) {
try {
return Ref.getFieldValue(this, language.toString().replace("_", ""), String.class);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getZhCN() {
return zhCN;
}
public void setZhCN(String zhCN) {
this.zhCN = zhCN;
}
public String getZhTW() {
return zhTW;
}
public void setZhTW(String zhTW) {
this.zhTW = zhTW;
}
public String getEnUS() {
return enUS;
}
public void setEnUS(String enUS) {
this.enUS = enUS;
}
public String getRuRU() {
return ruRU;
}
public void setRuRU(String ruRU) {
this.ruRU = ruRU;
}
public String getKoKR() {
return koKR;
}
public void setKoKR(String koKR) {
this.koKR = koKR;
}
public String getJaJP() {
return jaJP;
}
public void setJaJP(String jaJP) {
this.jaJP = jaJP;
}
public String getDeDE() {
return deDE;
}
public void setDeDE(String deDE) {
this.deDE = deDE;
}
}

View File

@ -89,7 +89,7 @@ public class GlobalExceptionHandler {
@ExceptionHandler(Throwable.class) @ExceptionHandler(Throwable.class)
public TimiResponse<?> error(Throwable e) { public TimiResponse<?> error(Throwable e) {
if (e instanceof TimiException timiE) { if (e instanceof TimiException timiE) {
if (env.startsWith("dev") || log.isDebugEnabled()) { if (!env.startsWith("prod") || log.isDebugEnabled()) {
log.error(timiE.getMessage(), e); log.error(timiE.getMessage(), e);
} }
// 一般异常 // 一般异常

View File

@ -55,11 +55,16 @@ public class GlobalReturnHandler implements ResponseBodyAdvice<Object> {
} else { } else {
result = new TimiResponse<>(TimiCode.SUCCESS, body); result = new TimiResponse<>(TimiCode.SUCCESS, body);
} }
try {
if (multilingualHeader != null && TimiJava.isNotEmpty(result.getMsgKey())) { if (multilingualHeader != null && TimiJava.isNotEmpty(result.getMsgKey())) {
result.setMsg(multilingualHeader.handler(result)); result.setMsg(multilingualHeader.handler(result));
} else if (TimiJava.isEmpty(result.getMsg())) { } else if (TimiJava.isEmpty(result.getMsg())) {
result.setMsg(TimiCode.fromCode(result.getCode()).toString()); result.setMsg(TimiCode.fromCode(result.getCode()).toString());
} }
} catch (Exception e) {
log.error("multilingual response error", e);
result.setMsg(TimiCode.fromCode(result.getCode()).toString());
}
if (30000 < result.getCode()) { if (30000 < result.getCode()) {
log.warn("ID: {} Response -> Exception.{}.{}", TimiSpring.getSessionAttr(AOPLogInterceptor.REQUEST_ID), result.getCode(), result.getMsg()); log.warn("ID: {} Response -> Exception.{}.{}", TimiSpring.getSessionAttr(AOPLogInterceptor.REQUEST_ID), result.getCode(), result.getMsg());
} }