61 lines
1.8 KiB
Java
61 lines
1.8 KiB
Java
package com.imyeyu.api.util;
|
|
|
|
import com.google.gson.Gson;
|
|
import com.google.gson.JsonElement;
|
|
import com.google.gson.JsonSerializationContext;
|
|
import com.google.gson.JsonSerializer;
|
|
import com.imyeyu.java.TimiJava;
|
|
import com.imyeyu.java.ref.Ref;
|
|
import com.imyeyu.api.TimiServerAPI;
|
|
import com.imyeyu.api.bean.MultilingualHandler;
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
import java.lang.reflect.Field;
|
|
import java.lang.reflect.Type;
|
|
import java.util.List;
|
|
|
|
/**
|
|
* @author 夜雨
|
|
* @version 2023-10-26 10:16
|
|
*/
|
|
@Slf4j
|
|
@Component
|
|
@RequiredArgsConstructor
|
|
public class GsonSerializerAdapter implements JsonSerializer<Object> {
|
|
|
|
private final Gson gson;
|
|
private final RedisMultilingual redisMultilingual;
|
|
|
|
@Override
|
|
public JsonElement serialize(Object value, Type typeOfSrc, JsonSerializationContext context) {
|
|
if (value instanceof MultilingualHandler _value) {
|
|
fillMultilingual(_value);
|
|
}
|
|
return gson.toJsonTree(value);
|
|
}
|
|
|
|
private <K extends MultilingualHandler> void fillMultilingual(K value) {
|
|
try {
|
|
List<Field> fields = Ref.listFields(value.getClass());
|
|
for (int i = 0; i < fields.size(); i++) {
|
|
Field field = fields.get(i);
|
|
MultilingualHandler.MultilingualField multiField = field.getAnnotation(MultilingualHandler.MultilingualField.class);
|
|
if (multiField != null) {
|
|
String multiLangId = Ref.getFieldValue(value, field, String.class);
|
|
if (TimiJava.isNotEmpty(multiLangId)) {
|
|
Long langId = Long.parseLong(multiLangId);
|
|
if (redisMultilingual.map(TimiServerAPI.getUserLanguage()) instanceof RedisLanguage rl) {
|
|
// TODO 支持插值参数
|
|
Ref.setFieldValue(value, field, rl.text(langId));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} catch (IllegalAccessException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
}
|
|
}
|