实战:第二十二章:i18n国际化(已实现中文,英文,波兰文)

简介: 实战:第二十二章:i18n国际化(已实现中文,英文,波兰文)

创建一个maven模块

pom.xml:

创建一个maven模块
在这里插入图片描述
pom.xml:
<?xml

创建配置文件:LocaleConfiguration

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
/**
 * 语言区域配置
 * @author zhiwei Liao
 */
@Configuration
public class LocaleConfiguration {
    private final String LOCAL_HEAD_NAME = "Locale";
    @Bean
    public WebMvcConfigurer localeInterceptor() {
        return new WebMvcConfigurer() {
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor();
                localeInterceptor.setParamName(LOCAL_HEAD_NAME);
                registry.addInterceptor(localeInterceptor);
            }
        };
    }
}

创建常量:LanguageConstant

/**
 * @author zhiwei Liao
 * @version 1.0
 * @Description 语言
 * @Date 2021/7/19 18:31
 */
public class LanguageConstant {
    //波兰文
    public static final String PL = "pl_pl";
    //英文
    public static final String US = "en_us";
    //中文
    public static final String CN = "zh_cn";
    //请求头中设置语言
    public static final String ACCEPT_LANGUAGE = "accept-language";
}
import com.liao.common.i18n.constant.LanguageConstant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.security.auth.login.LoginContext;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.Locale;
/**
 * 国际化转换工具
 * @author zhiwei Liao
 */
@Component
public class LocaleUtils {
    private static final Logger log = LoggerFactory.getLogger(LocaleUtils.class);
    private static MessageSource messageSource;
    public LocaleUtils(MessageSource messageSource) {
        LocaleUtils.messageSource = messageSource;
    }
    public static String getMessage(String msgKey) {
        return getMessage(msgKey, null);
    }
    public static String getMessage(String msgKey,Object[] args) {
        try {
            return messageSource.getMessage(msgKey, args, LocaleContextHolder.getLocale());
        } catch (Exception e) {
            return msgKey;
        }
    }
    /**
     * @Description 获取当前语言
     * @MethodParameterTypes []
     * @MethodParameters []
     * @MethodReturnType java.util.Locale
     * @Author zhiwei Liao
     * @Date 2021/7/19 18:43
     **/
    public static Locale getCurrentLocale() {
        String language = null;
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        if (headerNames != null) {
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement();
                if(LanguageConstant.ACCEPT_LANGUAGE.equals(name)){
                    Enumeration<String> values = request.getHeaders(name);
                    while (values.hasMoreElements()) {
                        String value = values.nextElement();
                        if(LanguageConstant.PL.equals(value)){
                            language = value;
                        }else if(LanguageConstant.US.equals(value)){
                            language = value;
                        }else if(LanguageConstant.CN.equals(value)){
                            language = value;
                        }
                    }
                }
            }
        }
        log.info("======getCurrentLocale.language:" + language);
        Locale locale = null;
        if(LanguageConstant.PL.equals(language)){
            //波兰文
            locale = new Locale("pl","PL");
//                locale = new Locale("pl_PL");//本地有效,服务器上无效
        }else if(LanguageConstant.US.equals(language)){
            //英文
            locale = Locale.US;
        }else if(LanguageConstant.CN.equals(language)){
            //简体中文
            locale = Locale.SIMPLIFIED_CHINESE;
        }else {
            //请求头中没有语言设置时,默认给英文
            locale = Locale.US;
        }
        log.info("=========locale:" + locale);
        return locale;
    }
}

其他模块使用国际化

引用国际化模块的依赖,创建多语言文件


错误提示国际化返回:

log.error(UserinfoConstant.LOGIN_FAILED);
String message = messageSource.getMessage("user.login.failed", null, LocaleUtils.getCurrentLocale());
return ResultData.error(UserCodeConstant.LOGIN_FAILED, message);


测试是否可用:

波兰文:



英文:



中文:



相关文章
|
C++
推荐一款vscdoe中免费且能够快速将中文转英文变量的编程效率插件!
推荐一款vscdoe中免费且能够快速将中文转英文变量的编程效率插件,能够在日常编程办公中,助力你的编程效率,让你摆脱想英文变量名的烦恼!
286 0
|
1天前
|
Web App开发 人工智能
翻译类插件 实现英文文献自由
这是一组提升阅读与学习效率的翻译及语言辅助插件简介,包含:Google 翻译(快速整页翻译)、彩云小译(AI 翻译支持双语对照)、DeepL Translator(高精准度翻译)、Mate Translate(单词翻译带发音例句)和 Readlang Web Reader(生词点击翻译与保存功能)。以上工具各具特色,满足不同场景下的翻译与学习需求。
23 4
|
9月前
|
C#
技术经验分享:c#拆分字符串英文和数字(包括国外所以文字)
技术经验分享:c#拆分字符串英文和数字(包括国外所以文字)
52 0
技术经验分享:c#拆分字符串英文和数字(包括国外所以文字)
|
8月前
|
人工智能 程序员 开发者
|
搜索推荐 Linux C++
推荐一款utools中免费的中文转英文代码变量的编程效率工具
一款utools软件内使用的免费中文转英文代码变量命名工具,能够在日常编程办公中,助力你的编程效率,让你摆脱想英文变量名的烦恼!
207 0
|
人工智能 安全 程序员
谁说不能用中文写代码?
现代计算机和编程的起源和推动力量主要源自美国,再加上26个字母很便于表示(算上大小写,6位bit就够了),因此英语一直是编程领域的不二之选。但这就给部分非英语国家的编程学习者带来一些困扰。以至于有些人还没开始学,就担心自己的英语问题。这完全没必要,因为编程初期所用到的单词很有限,你就当做一个符号去记,也能很快熟悉。而且我们一直在讲的 Python,也可以“用中文”来编程。
|
人工智能 自然语言处理 前端开发
向ChatGPT提问, 用中文还是英文?
用英文相对更准确, 因为chatgpt训练的素材, 大部分都是英文, 英文语料更丰富,多用英文提问, 会得到更好的答案
880 0
OFFICE技术讲座:中文标点符号有哪些
OFFICE技术讲座:中文标点符号有哪些
163 0
|
前端开发
前端工作总结197-获取对应中文
前端工作总结197-获取对应中文
102 0
前端工作总结197-获取对应中文
|
XML 开发框架 JavaScript
程序员:一些该知道的英文缩写
程序员:一些该知道的英文缩写
230 0