聊一聊国际化i18n

news2024/9/22 7:41:40

i18n 概述


i18n 是国际化的缩写,其完整的写法是 Internationalization,翻译为国际化。

国际化是指在软件开发中对于不同语言和地区的支持。目的是为了让一款软件可以在不同的语言和地区环境下正常运行,使其适应全球各地的用户。

这通常包括对语言翻译,日期、时间和数字格式等本地化的支持。它也可以包括对某些语言字符集(如中文或日语)的支持,以确保正确显示所有字符。

国际化是为了让软件可以在全球范围内的多种语言和地区环境下正常工作,以提高用户体验并扩大其市场。

前后端在处理i18n问题时有啥区别


前端国际化处理


前端通常使用 JavaScript 库(例如 i18next)

在客户端,国际化字符串通常存储在 JSON 文件中,每个文件对应一种语言。

前端国际化库读取并解析 JSON 文件,并将相应的字符串显示在网页上。

举个例子,可以在 JavaScript 中使用以下代码:

// 加载语言文件
i18next.init({
    lng: 'en',
    resources: {
        en: {
            translation: {
                "key1": "Hello World!"
            }
        },
        fr: {
            translation: {
                "key1": "Bonjour le monde!"
            }
        }
    }
});

// 在页面上使用国际化字符串
document.querySelector('#content').innerHTML = i18next.t('key1');

前端框架通常都提供了国际化库,如 React,Vue 等。你可以使用这些国际化库来动态地切换语言,并且根据用户语言设置自动地选择合适的语言文件。

以 Vue.js 为例,可以使用 vue-i18n 来实现国际化:

import Vue from 'vue'
import VueI18n from 'vue-i18n'

Vue.use(VueI18n)

const i18n = new VueI18n({
  locale: 'zh', // 语言标识
  messages: {
    zh: {
      message: {
        hello: '你好,世界'
      }
    },
    en: {
      message: {
        hello: 'Hello, world'
      }
    }
  }
})

new Vue({
  i18n,
  render: h => h(App)
}).$mount('#app')

在页面模板中,可以使用以下语法来引用国际化字符串:

<template>
  <div>
    {{ $t('message.hello') }}
  </div>
</template>

后端国际化处理


MessageSource、MessageSourceSupport,MessageSourceAccessor和Locale是Spring框架中用于国际化的关键类:

MessageSource是一个接口,用于访问应用程序中的消息资源(如文本、错误消息等),它提供了getMessage()方法用于获取消息的文本内容。

如下是MessageSource的一个类图:

MessageSourceSupport 是一个抽象类,提供了一些便捷的方法来支持多语言国际化的实现。在 Spring 中,我们可以通过继承 MessageSourceSupport 类来编写自己的国际化类,简化国际化代码的编写过程。MessageSourceSupport 主要提供了以下功能:

  1. 提供了 getMessage() 方法,让子类能够方便地获取国际化消息,避免了直接使用 MessageSource 的麻烦;

  1. 封装了参数绑定和消息格式化方法,简化了消息处理的流程;

  1. 提供了模板方法,让子类可以更方便地实现自己的国际化逻辑,避免了重复代码的出现。

MessageSourceAccessor是MessageSource的封装类,它简化了消息资源的访问方式,使得在代码中访问消息更加方便,例如通过getMessage(String code, Object... args)方法来获取消息内容。

Locale是表示特定地理、政治或文化区域的类,用于指定消息的语言和国家/地区。在Spring中,可以通过指定Locale对象来获取特定地区的消息内容。

使用示例代码:

第一步,在 Spring 配置文件中配置 MessageSource 和 MessageSourceAccessor

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
  <property name="basename" value="classpath:messages" />
  <property name="defaultEncoding" value="UTF-8" />
</bean>

<bean id="messageSourceAccessor" class="org.springframework.context.support.MessageSourceAccessor">
  <constructor-arg ref="messageSource" />
</bean>

在上面的示例代码中,我们使用 ReloadableResourceBundleMessageSource 配置了 MessageSource,并使用 MessageSourceAccessor 封装了 MessageSource。

第二步,在代码中使用 MessageSourceAccessor 获取多语言消息

@Controller
public class HelloController {

  @Autowired
  private MessageSourceAccessor messageSourceAccessor;

  @RequestMapping(value = "/hello", method = RequestMethod.GET)
  public String hello(ModelMap model, Locale locale) {
    String message = messageSourceAccessor.getMessage("hello.message", new Object[] { "World" }, locale);
    model.addAttribute("message", message);
    return "hello";
  }

}

在上面的代码中,我们在 HelloController 类中注入了 MessageSourceAccessor 实例,并在 hello() 方法中使用它来获取多语言消息。其中,getMessage() 方法接收三个参数:

  1. 消息的 key,对应于资源文件中的键;

  1. 参数数组,用于格式化消息,可以为 null;

  1. 本地化对象,用于指定本地化信息,可以为 null。

通过使用 MessageSourceAccessor,我们可以避免直接使用 MessageSource 的繁琐操作,使代码更加简洁和易读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/357562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Simulink 自动代码生成电机控制:低阶滑模观测器仿真实现及生成代码在开发板上运行

目录 理论参考 仿真实现 运行演示 总结 前段实时搭过高阶的滑模观测器&#xff0c;相比于高阶的&#xff0c;普通的滑模观测器计算量小更适合计算能力低的MCU&#xff0c;这里参考Microchip的16位MCU所使用的观测器&#xff0c;通过Simulink建模仿真实现系统控制&#xff0…

【查看多个长图】如何方便地在安卓手机上查看多个长图?如何更便捷地浏览长图合集

经常我会看到有些知识分享是通过长图形式进行。 往往在手机本地的图片浏览器中不能很方便地查看很多长图&#xff08;能放大&#xff0c;但是横向滑动时&#xff0c;无法保证同样的放缩比例浏览同一个文件夹&#xff09;。 我推荐下面一个APP和曲折解决办法。 1、perfect vi…

Error: Timeout trying to fetch resolutions from npm

总目录&#xff1a; 如何使用VSCode插件codesight扫描出前端项目的风险依赖包并借助 npm-force-resolutions 修复之&#xff1f;blackduck issue fix 文章目录问题描述【最终解决】我搜索到的解决方案npmjs 该依赖各版本列表及对应的被下载次数github issue 说降级到0.0.3就可以…

(十五)、从插件市场引入问题反馈页面【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1&#xff0c;插件市场问题反馈页面 插件市场链接 dloud插件插件市场中找到问题反馈插件&#xff1a; 首先确保登录了dcloud账号。 使用hbuilderX导入插件到自己项目中。 选择合并导入。 从插件市场导入意见反馈页面的路径地址如下&#xff1a; 2&#xff0c;点击跳转到…

论文阅读_AlphaGo_Zero

论文信息 name_en: Mastering the game of Go without human knowledge name_ch: 在没有人类知识的情况下掌握围棋游戏 paper_addr: http://www.nature.com/articles/nature24270 doi: 10.1038/nature24270 date_publish: 2017-10-01 tags: [‘深度学习’,‘强化学习’] if: 6…

【C++封装】C++面向对象模型

文章内容如下&#xff1a; 1&#xff09;成员变量和函数的存储 2&#xff09;this指针 3&#xff09;const修饰成员函数 4&#xff09;有元 一。成员变量和函数的存储 C实现了封装&#xff0c;数据(-变量)和处理数据的操作(-函数)是分开存储的&#xff0c;C中的非静态数据…

SpringBoot Notes

文章目录1 SpringBootWeb快速入门1.1Spring官网1.2 Web分析2. HTTP协议2.1 HTTP介绍34 SpringBootWeb请求响应5 响应6 分层解耦6.1 三层架构6.1.1 三层架构介绍6.1.2 基于三层架构的程序执行流程&#xff1a;6.1.3 代码拆分6.2 分层解耦6.2.1 内聚、耦合6.2.2 解耦思路6.3 IOC&…

[LeetCode周赛复盘] 第 333 场周赛20230219

[LeetCode周赛复盘] 第 333 场周赛20230219 一、本周周赛总结二、 [Easy] 6362. 合并两个二维数组 - 求和法1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6365. 将整数减少到零需要的最少操作数1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6364. 无平方子集计数1. 题目描…

操作系统闲谈08——系统调用、中断、异常

操作系统闲谈08——系统调用、中断、异常 一、系统调用 IDT - GDT - 系统调用表 找到对应系统调用号将系统调用号以及一些现场信息存入寄存器eax中&#xff08;ebx、ecx、edx存放其他信息&#xff09;&#xff0c;然后触发软中断&#xff08;x86中&#xff0c;0x80为中断号&…

设计模式 状态机

前言 本文梳理状态机概念&#xff0c;在实操中状态机和状态模式类似&#xff0c;只是被封装起来&#xff0c;可以很方便的实现状态初始化和状态转换。 概念 有限状态机&#xff08;finite-state machine&#xff09;又称有限状态自动机&#xff08;英语&#xff1a;finite-s…

ThreadLocal知识点总结

什么是ThreadLocal&#xff1f;它的作用是什么&#xff1f; ThreadLocal是线程Thread中属性threadLocals的管理者。 ThreadLocal是Java中lang包下的一个类&#xff0c;可以用于在多线程环境中为每个线程维护独立的变量副本。它的作用是让每个线程都拥有自己的数据副本&#xff…

Java面向对象的特性:封装,继承与多态

Java面向对象的特性 在学习Java的过程是必须要知道的Java三大特性&#xff1a;封装、继承、多态。如果要分为四类的话&#xff0c;加上抽象特性。 封装 1.封装概述 是面向对像三大特征之一&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09; 是面向对象编程语言对客…

语音增强学习路线图Roadmap

语音增强算是比较难的研究领域&#xff0c;从入门到精通有很多台阶&#xff0c;本文介绍一些有价值的书籍&#xff0c;值得反复阅读。主要分为基础类和进阶类书籍&#xff0c;大多都是理论和实践相结合的书籍&#xff0c;编程实践是抓手,让知识和基础理论变扎实。基础书籍《信号…

RT-Thread初识学习-01

1. RT-Thread 简介 1.1 RT-Thread 是什么 据不完全统计&#xff0c;世界有成千上万个 RTOS&#xff08;Real-time operating system&#xff0c;实时操作系统&#xff09;&#xff0c;RT-Thread 就是其中一个优秀的作品。 RT-Thread 内核的第一个版本是熊谱翔先生在 2006 年…

分布式-分布式存储笔记

读写分离 什么时候需要读写分离 互联网大部分业务场景都是读多写少的&#xff0c;读和写的请求对比可能差了不止一个数量级。为了不让数据库的读成为业务瓶颈&#xff0c;同时也为了保证写库的成功率&#xff0c;一般会采用读写分离的技术来保证。 读写分离的实现是把访问的压…

LeetCode-384-打乱数组

1、列表随机 为了能够初始化数组&#xff0c;我们使用nums保存当前的数组&#xff0c;利用orignal保存初始化数组。为了实现等可能随机打乱&#xff0c;考虑到随机数本质上是基于随机数种子的伪随机&#xff0c;我们采用如下的方式实现等可能随机&#xff1a;我们将所有元素压…

MySQL备份恢复(十二)

文章目录1. MySQL数据损坏类型1.1 物理损坏1.2 逻辑损坏2. DBA运维人员备份/恢复职责2.1 设计备份/容灾策略2.1.1 备份策略2.1.2 容灾策略2.2 定期的备份/容灾检查2.3 定期的故障恢复演练2.4 数据损坏时的快速准确恢复2.5 数据迁移工作3. MySQL常用备份工具3.1 逻辑备份方式3.2…

【scl】博图程序的导入和导出

导入或者导出博图文件的方法&#xff08;也叫移植文件&#xff09; 目录 前言 ​编辑 ​编辑 前言 本篇文章主要写一下关于博图文件的导入和导出&#xff0c;具体要怎么样才能将写好的程序或者块移植到其他地方&#xff0c;下面我们一起来看&#xff01; 一、程序块的导入和导…

[软件工程导论(第六版)]第4章 形式化说明技术(课后习题详解)

文章目录1. 举例对比形式化方法和欠形式化方法的优缺点。2. 在什么情况下应该使用形式化说明技术&#xff1f;使用形式化说明技术时应遵守哪些准则&#xff1f;3. 一个浮点二进制数的构成是&#xff1a;一个可选的符号&#xff08;&#xff0b;或&#xff0d;&#xff09;&…

Seata分布式事务框架-AT模式与TCC模式介绍

Seata分布式事务框架-AT模式介绍 Seata AT事务方案 Seata 的 AT 模式&#xff08;Automatic Transaction&#xff09;是一种无侵入的分布式事务解决方案。下面结合具体业务场景来分析其执行的原理。 业务场景 订单系统 当用户下订单时&#xff0c;执行以下三步流程&#x…