whyclxw
2025-05-14 d8e2cd27eed45224faecb07ca45be69bf78611af
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
package com.whyc.config;
 
import com.whyc.constant.YamlProperties;
import com.whyc.util.ActionUtil;
import com.whyc.util.CommonUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.lang.NonNull;
import org.springframework.web.servlet.LocaleResolver;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
 
/**
 * i18n自定义LocaleResolver
 */
@Configuration
public class I18nLocaleResolver implements LocaleResolver {
 
    @Autowired
    private HttpServletRequest request;
 
    public Locale getLocal() {
        return resolveLocale(request);
    }
 
    /**
     * 从HttpServletRequest中获取Locale
     * 优先级:
     * 配置文件指定>从request指定lang>从session中获取lang>本机语言环境获取Locale
     *
     * @param httpServletRequest    httpServletRequest
     * @return                      语言Local
     */
    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        //如果没有就使用默认的(根据主机的语言环境生成一个 Locale
        Locale locale = Locale.getDefault();
        //配置文件指定
        String i18nLanguage = YamlProperties.i18nLanguage;
        if(StringUtils.isNotBlank(i18nLanguage)){
            if(i18nLanguage.startsWith("zh")){
                locale = Locale.CHINESE;
            }else{
                locale = Locale.US;
            }
        }
 
        else if(httpServletRequest!=null) {
            //获取请求中的语言参数
            String language = httpServletRequest.getParameter("lang");
            //从session中获取lang
            String language2 = (String) ActionUtil.getSession().getAttribute("lang");
            //如果请求的链接中携带了 国际化的参数
            if (!StringUtils.isEmpty(language)) {
                //zh_CN
                String[] s = language.split("_");
                //国家,地区
                locale = new Locale(s[0], s[1]);
            } else if (!StringUtils.isEmpty(language2)) {
                if ((language2.startsWith("zh"))) {
                    locale = Locale.SIMPLIFIED_CHINESE;
                } else { //不是中文,则采用en_US
                    locale = Locale.US;
                }
            }
        }
        return locale;
    }
 
    /**
     * 用于实现Locale的切换。比如SessionLocaleResolver获取Locale的方式是从session中读取,但如果
     * 用户想要切换其展示的样式(由英文切换为中文),那么这里的setLocale()方法就提供了这样一种可能
     *
     * @param request               HttpServletRequest
     * @param httpServletResponse   HttpServletResponse
     * @param locale                locale
     */
    @Override
    public void setLocale(@NonNull HttpServletRequest request, HttpServletResponse httpServletResponse, Locale locale) {
 
    }
}