实战:第二十二章: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);


测试是否可用:

波兰文:



英文:



中文:



相关文章
|
2月前
|
人工智能 自然语言处理 数据安全/隐私保护
AI生成的文本:如何识破机器的“笔迹”?
AI生成的文本:如何识破机器的“笔迹”?
337 85
|
算法 安全 网络安全
简单认识一下mbedTLS
简单认识一下mbedTLS
1981 0
|
Kubernetes 容器
k8s集群初始化节点
k8s集群初始化节点
248 0
|
2月前
|
人工智能 监控 安全
让Agent系统更聪明之前,先让它能被信任
当我们将所有希望寄托于大模型的「智能」时,却忘记了智能的不确定性必须以工程的确定性为支撑。一个无法复现、无法调试、无法观测的智能,更像是一场精彩但失控的魔法,而非我们真正需要的、可靠的生产力。本文尝试从系统工程的视角剖析 Agent 系统在可运行、可复现与可进化三个层次上不断升级的问题以及复杂度。进一步认识到:框架/平台让 Agent 「好搭」但没有让它「好用」,真正的复杂性,从未被消除,只是被推迟。
284 33
让Agent系统更聪明之前,先让它能被信任
|
3月前
|
人工智能 测试技术 开发工具
如何将 AI 代码采纳率从30%提升到80%?
AI编码采纳率低的根本原因在于人类期望其独立完成模糊需求,本文提出了解决之道,讲解如何通过结构化文档和任务拆解提高AI的基础可靠性。
982 24
|
9月前
|
数据采集 机器学习/深度学习 人工智能
SongGen:三秒克隆音色!开源AI一键生成专业级歌曲,创作人必备神器
SongGen是由上海AI Lab、北京航空航天大学和香港中文大学联合推出的单阶段自回归Transformer模型,能够通过文本生成高质量歌曲,支持混合模式和双轨模式,显著提升生成歌曲的自然度和人声清晰度。
867 3
SongGen:三秒克隆音色!开源AI一键生成专业级歌曲,创作人必备神器
|
设计模式 Java 关系型数据库
设计模式——工厂模式
工厂模式介绍、静态简单工厂模式、工厂方法模式、抽象工厂模式、JDK 源码分析
设计模式——工厂模式
|
9月前
|
安全 网络安全 虚拟化
Hyper-V网络连接无响应解决方案
当Hyper-V虚拟机出现网络连接无响应时,可从以下方面排查:1) 检查物理网络连接,确保设备正常;2) 验证虚拟网络配置,包括虚拟交换机和网络适配器设置;3) 更新驱动程序以解决兼容性问题;4) 调整防火墙和安全软件设置;5) 重启相关服务和设备;6) 使用命令行工具诊断网络问题;7) 检查BIOS中虚拟化技术是否启用;8) 排查IP冲突和其他日志错误。综合以上步骤,可有效修复网络连接故障。
|
SQL Rust 数据挖掘
4秒读取50w行Excel数据
4秒读取50w行Excel数据
407 1
|
NoSQL 中间件 Java
字节面试:聊聊 CAP 定理?哪些中间件是AP? 哪些是CP? 说说 为什么?
45岁老架构师尼恩在其读者交流群中分享了关于CAP定理的重要面试题及其解析,包括CAP定理的基本概念、CAP三要素之间的关系,以及如何在分布式系统设计中权衡一致性和可用性。文章还详细分析了几种常见中间件(如Redis Cluster、Zookeeper、MongoDB、Cassandra、Eureka、Nacos)的CAP特性,并提供了高端面试技巧,帮助读者在面试中脱颖而出。尼恩还推荐了其团队编写的《尼恩Java面试宝典PDF》等资料,助力求职者准备面试,提升技术水平。

热门文章

最新文章