yangys
2024-04-01 a36d93e531c292240dc59cb8e712b2eca21a4066
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
package com.qianwen.core.i18n.advice;
 
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.qianwen.core.i18n.annotation.I18nClass;
import com.qianwen.core.i18n.annotation.I18nField;
import com.qianwen.core.i18n.props.I18nOptions;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.core.MethodParameter;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
 
@RestControllerAdvice
/* loaded from: blade-starter-i18n-9.3.0.0-SNAPSHOT.jar:org/springblade/core/i18n/advice/I18nResponseAdvice.class */
public class I18nResponseAdvice implements ResponseBodyAdvice<Object> {
    private final MessageSource messageSource;
    private final boolean useCodeAsDefaultMessage;
    private Locale fallbackLocale;
    private final List<String> excludeClassList = Arrays.asList("com.qianwen.core.tool.api.R");
    private static final Logger log = LoggerFactory.getLogger(I18nResponseAdvice.class);
    private static final ExpressionParser PARSER = new SpelExpressionParser();
    private static final Map<String, Expression> EXPRESSION_CACHE = new HashMap();
 
    public I18nResponseAdvice(MessageSource messageSource, I18nOptions i18nOptions) {
        this.fallbackLocale = null;
        this.messageSource = messageSource;
        String fallbackLanguageTag = i18nOptions.getFallbackLanguageTag();
        if (fallbackLanguageTag != null) {
            String[] arr = fallbackLanguageTag.split("-");
            Assert.isTrue(arr.length == 2, "error fallbackLanguageTag!");
            this.fallbackLocale = new Locale(arr[0], arr[1]);
        }
        this.useCodeAsDefaultMessage = i18nOptions.isUseCodeAsDefaultMessage();
    }
 
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }
 
    public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        switchLanguage(body);
        return body;
    }
 
    public void switchLanguage(Object source) {
        Field[] fields;
        if (source == null) {
            return;
        }
        Class<?> sourceClass = source.getClass();
        I18nClass i18nClass = (I18nClass) sourceClass.getAnnotation(I18nClass.class);
        if (i18nClass == null && !this.excludeClassList.contains(sourceClass.getName())) {
            return;
        }
        for (Field field : ReflectUtil.getFields(sourceClass)) {
            Class<?> fieldType = field.getType();
            Object fieldValue = ReflectUtil.getFieldValue(source, field);
            if (fieldValue instanceof String) {
                I18nField i18nField = (I18nField) field.getAnnotation(I18nField.class);
                if (i18nField != null) {
                    String conditionExpression = i18nField.condition();
                    if (StrUtil.isNotEmpty(conditionExpression)) {
                        Expression expression = EXPRESSION_CACHE.get(conditionExpression);
                        if (expression == null) {
                            expression = PARSER.parseExpression(conditionExpression);
                            EXPRESSION_CACHE.put(conditionExpression, expression);
                        }
                        Boolean needI18n = (Boolean) expression.getValue(source, Boolean.class);
                        if (needI18n != null && !needI18n.booleanValue()) {
                        }
                    }
                    String annotationCode = i18nField.code();
                    String code = StrUtil.isNotEmpty(annotationCode) ? annotationCode : (String) fieldValue;
                    if (!StrUtil.isEmpty(code)) {
                        Locale locale = LocaleContextHolder.getLocale();
                        String message = codeToMessage(code, locale, this.fallbackLocale);
                        ReflectUtil.setFieldValue(source, field, message);
                    }
                }
            } else if (fieldValue instanceof Collection) {
                Collection<Object> elements = (Collection) fieldValue;
                if (!CollectionUtil.isEmpty(elements)) {
                    for (Object element : elements) {
                        switchLanguage(element);
                    }
                }
            } else if (fieldType.isArray()) {
                Object[] elements2 = (Object[]) fieldValue;
                if (elements2 != null && elements2.length != 0) {
                    for (Object element2 : elements2) {
                        switchLanguage(element2);
                    }
                }
            } else {
                switchLanguage(fieldValue);
            }
        }
    }
 
    /* JADX WARN: Removed duplicated region for block: B:15:0x0060  */
    /* JADX WARN: Removed duplicated region for block: B:17:0x0062  */
    /*
        Code decompiled incorrectly, please refer to instructions dump.
        To view partially-correct code enable 'Show inconsistent code' option in preferences
    */
    private java.lang.String codeToMessage(java.lang.String r8, java.util.Locale r9, java.util.Locale r10) {
        /*
            r7 = this;
            r0 = r7
            org.springframework.context.MessageSource r0 = r0.messageSource     // Catch: org.springframework.context.NoSuchMessageException -> L11
            r1 = r8
            r2 = 0
            r3 = r9
            java.lang.String r0 = r0.getMessage(r1, r2, r3)     // Catch: org.springframework.context.NoSuchMessageException -> L11
            r11 = r0
            r0 = r11
            return r0
        L11:
            r13 = move-exception
            r0 = r13
            r12 = r0
            org.slf4j.Logger r0 = com.qianwen.core.i18n.advice.I18nResponseAdvice.log
            java.lang.String r1 = "[codeToMessage]未找到对应的国际化配置,code: {}, local: {}"
            r2 = r8
            r3 = r9
            r0.warn(r1, r2, r3)
            r0 = r10
            if (r0 == 0) goto L59
            r0 = r9
            r1 = r10
            if (r0 == r1) goto L59
            r0 = r7
            org.springframework.context.MessageSource r0 = r0.messageSource     // Catch: org.springframework.context.NoSuchMessageException -> L3d
            r1 = r8
            r2 = 0
            r3 = r10
            java.lang.String r0 = r0.getMessage(r1, r2, r3)     // Catch: org.springframework.context.NoSuchMessageException -> L3d
            r11 = r0
            r0 = r11
            return r0
        L3d:
            r13 = move-exception
            org.slf4j.Logger r0 = com.qianwen.core.i18n.advice.I18nResponseAdvice.log
            java.lang.String r1 = "[codeToMessage]期望语言和回退语言中皆未找到对应的国际化配置,code: {}, local: {}, fallbackLocale:{}"
            r2 = 3
            java.lang.Object[] r2 = new java.lang.Object[r2]
            r3 = r2
            r4 = 0
            r5 = r8
            r3[r4] = r5
            r3 = r2
            r4 = 1
            r5 = r9
            r3[r4] = r5
            r3 = r2
            r4 = 2
            r5 = r10
            r3[r4] = r5
            r0.warn(r1, r2)
        L59:
            r0 = r7
            boolean r0 = r0.useCodeAsDefaultMessage
            if (r0 == 0) goto L62
            r0 = r8
            return r0
        L62:
            r0 = r12
            throw r0
        */
        throw new UnsupportedOperationException("Method not decompiled: com.qianwen.core.i18n.advice.I18nResponseAdvice.codeToMessage(java.lang.String, java.util.Locale, java.util.Locale):java.lang.String");
    }
}