whycxzp
2023-03-30 d6b67df6e87b0597ab83be9cc07793ad3a0ee2ef
国际化配置提交
4个文件已添加
3个文件已修改
167 ■■■■■ 已修改文件
src/main/java/com/whyc/config/I18nLocaleResolver.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/ServerController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/util/MessageUtils.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/config/application-dev.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/config/application-prod.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/i18n/message_en_US.properties 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/i18n/message_zh_CN.properties 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/config/I18nLocaleResolver.java
New file
@@ -0,0 +1,61 @@
package com.whyc.config;
import com.sun.istack.internal.Nullable;
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
     *
     * @param httpServletRequest    httpServletRequest
     * @return                      语言Local
     */
    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        //获取请求中的语言参数
        String language = httpServletRequest.getParameter("lang");
        //如果没有就使用默认的(根据主机的语言环境生成一个 Locale
        Locale locale = Locale.getDefault();
        //如果请求的链接中携带了 国际化的参数
        if (!StringUtils.isEmpty(language)){
            //zh_CN
            String[] s = language.split("_");
            //国家,地区
            locale = new Locale(s[0], s[1]);
        }
        return locale;
    }
    /**
     * 用于实现Locale的切换。比如SessionLocaleResolver获取Locale的方式是从session中读取,但如果
     * 用户想要切换其展示的样式(由英文切换为中文),那么这里的setLocale()方法就提供了这样一种可能
     *
     * @param request               HttpServletRequest
     * @param httpServletResponse   HttpServletResponse
     * @param locale                locale
     */
    @Override
    public void setLocale(@NonNull HttpServletRequest request, @Nullable HttpServletResponse httpServletResponse, @Nullable Locale locale) {
    }
}
src/main/java/com/whyc/controller/ServerController.java
@@ -5,7 +5,6 @@
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
src/main/java/com/whyc/util/MessageUtils.java
New file
@@ -0,0 +1,99 @@
package com.whyc.util;
import com.whyc.config.I18nLocaleResolver;
import lombok.var;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.nio.charset.StandardCharsets;
import java.util.Locale;
import java.util.Objects;
@Component
public class MessageUtils {
    /*private static MessageSource messageSource;
    public MessageUtils(MessageSource messageSource) {
        MessageUtils.messageSource = messageSource;
    }
    public static String getMessage(String key) {
        try {
            return messageSource.getMessage(
                    key,
                    null,
                    LocaleContextHolder.getLocale());
        } catch (Exception e) {
            return key;
        }
    }*/
    @Value("${spring.messages.basename}")
    private String basename;
    private final I18nLocaleResolver resolver;
    private static I18nLocaleResolver customLocaleResolver;
    private static String path;
    public MessageUtils(I18nLocaleResolver resolver) {
        this.resolver = resolver;
    }
    @PostConstruct
    public void init() {
        setBasename(basename);
        setCustomLocaleResolver(resolver);
    }
    /**
     * 获取 国际化后内容信息
     *
     * @param code 国际化key
     * @return 国际化后内容信息
     */
    public static String getMessage(String code) {
        Locale locale = customLocaleResolver.getLocal();
        return getMessage(code, null, code, locale);
    }
    public static String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        //判断locale,如果不是zh或en,则使用英文
        String language = locale.getLanguage();
        /*else {
            messageSource.setDefaultEncoding(StandardCharsets.UTF_8.toString());
        }*/
        if((language.equals("zh"))){
            locale = Locale.SIMPLIFIED_CHINESE;
            messageSource.setDefaultEncoding("GBK");
        }else{ //不是中文,则采用en_US
            locale = Locale.US;
        }
        messageSource.setBasename(path);
        String content;
        try {
            content = messageSource.getMessage(code, args, locale);
        } catch (Exception e) {
            content = defaultMessage;
        }
        return content;
    }
    public static void setBasename(String basename) {
        MessageUtils.path = basename;
    }
    public static void setCustomLocaleResolver(I18nLocaleResolver resolver) {
        MessageUtils.customLocaleResolver = resolver;
    }
}
src/main/resources/config/application-dev.yml
@@ -40,6 +40,8 @@
    multipart:
      max-file-size: 200MB
      max-request-size: 200MB
  messages:
    basename: i18n/message
mybatis-plus:
  typeAliasesPackage: com.whyc.pojo,com.whyc.dto
  mapper-locations: classpath:mapper/**/*Mapper.xml
src/main/resources/config/application-prod.yml
@@ -41,6 +41,8 @@
    multipart:
      max-file-size: 200MB
      max-request-size: 200MB
  messages:
    basename: i18n/message
mybatis-plus:
  typeAliasesPackage: com.whyc.pojo,com.whyc.dto
  mapper-locations: classpath:mapper/**/*Mapper.xml
src/main/resources/i18n/message_en_US.properties
New file
@@ -0,0 +1 @@
test=this is a i18n test case
src/main/resources/i18n/message_zh_CN.properties
New file
@@ -0,0 +1 @@
test=这是一个i18n测试