跟着JHipster学做项目 (18) 国际化i18n实现

merge-jsons-webpack-plugin:该插件用于使用glob或文件名将json文件合并为单个json文件 合并json文件 使用此webpack插件合并Json文件。 例如,将不同模块中的i18n json文件合并为angular2中的单个最终json文件或react模块将非常有用。 最新版本和重大更改。 突破了最新版本2.0.0中引入的更改,现在所有值都将被覆盖(包括数组),以前的行为是连接数组和覆盖文字,然后连接文本或数组,将覆盖false传递为输入,这将连接所有值目标与源值。 此版本还解决了Webpack 5的兼容性问题 用法 用npm安装 npm i merge-jsons-webpack-plugin var MergeJsonWebpackPlugin = require ( "merge-jsons-webpack-plugin" ) ; new MergeJsonWebpackPlugin ( { "files" : [ "./jsons/fil 立即下载

通过添加i18n功能,改变的(包括新增)文件如下:

package.json
src/main/docker/jhipster-control-center.yml
src/main/java/com/adun/api/web/rest/errors/ExceptionTranslator.java
src/main/java/com/adun/api/web/rest/UserResource.java
src/main/resources/config/application-dev.yml
src/main/resources/config/application-prod.yml
src/main/webapp/app/account/account.service.ts
src/main/webapp/app/account/activate/activate.vue
src/main/webapp/app/account/change-password/change-password.vue
src/main/webapp/app/account/login-form/login-form.vue
src/main/webapp/app/account/register/register.component.ts
src/main/webapp/app/account/register/register.vue
src/main/webapp/app/account/reset-password/finish/reset-password-finish.vue
src/main/webapp/app/account/reset-password/init/reset-password-init.vue
src/main/webapp/app/account/settings/settings.vue
src/main/webapp/app/admin/configuration/configuration.vue
src/main/webapp/app/admin/health/health-modal.vue
src/main/webapp/app/admin/health/health.vue
src/main/webapp/app/admin/logs/logs.vue
src/main/webapp/app/admin/metrics/metrics-modal.vue
src/main/webapp/app/admin/metrics/metrics.vue
src/main/webapp/app/admin/user-management/user-management-edit.component.ts
src/main/webapp/app/admin/user-management/user-management-edit.vue
src/main/webapp/app/admin/user-management/user-management-view.vue
src/main/webapp/app/admin/user-management/user-management.component.ts
src/main/webapp/app/admin/user-management/user-management.vue
src/main/webapp/app/app.vue
src/main/webapp/app/core/error/error.vue
src/main/webapp/app/core/home/home.vue
src/main/webapp/app/core/jhi-footer/jhi-footer.vue
src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts
src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue
src/main/webapp/app/core/ribbon/ribbon.vue
src/main/webapp/app/declarations.d.ts
src/main/webapp/app/main.ts
src/main/webapp/app/shared/alert/alert.service.ts
src/main/webapp/app/shared/config/config.ts
src/main/webapp/app/shared/config/dayjs.ts
src/main/webapp/app/shared/jhi-item-count.component.ts
src/main/webapp/app/shared/jhi-item-count.vue
src/main/webapp/index.html
src/test/resources/config/application.yml
src/test/resources/i18n/messages_en.properties
webpack/webpack.common.js
src/main/resources/i18n/messages_en.properties
src/main/resources/i18n/messages_zh_CN.properties
src/main/resources/i18n/messages_zh_TW.properties
src/main/webapp/app/locale
src/main/webapp/app/locale/translation.service.ts
src/main/webapp/app/shared/config/formatter.ts
src/main/webapp/app/shared/config/store/translation-store.ts
src/main/webapp/i18n
src/main/webapp/i18n/en
src/main/webapp/i18n/en/activate.json
src/main/webapp/i18n/en/configuration.json
src/main/webapp/i18n/en/error.json
src/main/webapp/i18n/en/global.json
src/main/webapp/i18n/en/health.json
src/main/webapp/i18n/en/home.json
src/main/webapp/i18n/en/login.json
src/main/webapp/i18n/en/logs.json
src/main/webapp/i18n/en/metrics.json
src/main/webapp/i18n/en/password.json
src/main/webapp/i18n/en/register.json
src/main/webapp/i18n/en/reset.json
src/main/webapp/i18n/en/sessions.json
src/main/webapp/i18n/en/settings.json
src/main/webapp/i18n/en/user-management.json
src/main/webapp/i18n/zh-cn
src/main/webapp/i18n/zh-cn/activate.json
src/main/webapp/i18n/zh-cn/configuration.json
src/main/webapp/i18n/zh-cn/error.json
src/main/webapp/i18n/zh-cn/global.json
src/main/webapp/i18n/zh-cn/health.json
src/main/webapp/i18n/zh-cn/home.json
src/main/webapp/i18n/zh-cn/login.json
src/main/webapp/i18n/zh-cn/logs.json
src/main/webapp/i18n/zh-cn/metrics.json
src/main/webapp/i18n/zh-cn/password.json
src/main/webapp/i18n/zh-cn/register.json
src/main/webapp/i18n/zh-cn/reset.json
src/main/webapp/i18n/zh-cn/sessions.json
src/main/webapp/i18n/zh-cn/settings.json
src/main/webapp/i18n/zh-cn/user-management.json

1  package.json: 增加了两个packages, Folder-hash和merge-jsons-webpack-plugin

Folder-hash: 为文件夹添加hashcode, 确保显示最新的多语言信息;

merge-jsons-webpack-plugin: 将分散的json组合为一个文件

2  ExceptionTranslator.java: 设置createFailureAlert方法中的参数enableTranslation为true.

    @ExceptionHandler
    public ResponseEntity<Problem> handleEmailAlreadyUsedException(
        com.adun.api.service.EmailAlreadyUsedException ex,
        NativeWebRequest request
    ) {
        EmailAlreadyUsedException problem = new EmailAlreadyUsedException();
        return create(
            problem,
            request,
            HeaderUtil.createFailureAlert(applicationName, true, problem.getEntityName(), problem.getErrorKey(), problem.getMessage())
        );
    }

3 UserResource.java: 设置createAlert方法中的参数message为error key.

    public ResponseEntity<Void> deleteUser(@PathVariable @Pattern(regexp = Constants.LOGIN_REGEX) String login) {
        log.debug("REST request to delete User: {}", login);
        userService.deleteUser(login);
        return ResponseEntity.noContent().headers(HeaderUtil.createAlert(applicationName, "userManagement.deleted", login)).build();
    }

4 account.service.ts 添加当前语言类型设置和页面翻译

if (this.store.getters.currentLanguage !== account.langKey) {
    this.store.commit('currentLanguage', account.langKey);
}

this.translationService.refreshTranslation(this.store.getters.currentLanguage);

5 activate.vue 添加多语言信息

        <h1 v-text="$t('activate.title')">Activation</h1>
        <div class="alert alert-success" v-if="success">
          <span v-html="$t('activate.messages.success')"><strong>Your user account has been activated.</strong> Please </span>
          <a class="alert-link" v-on:click="openLogin" v-text="$t('global.messages.info.authenticated.link')">sign in</a>.
        </div>
        <div class="alert alert-danger" v-if="error" v-html="$t('activate.messages.error')">

6 index.html 阻止页面自动翻译

<meta name="google" content="notranslate" />

7 main.ts 添加翻译模块

import TranslationService from '@/locale/translation.service';

const i18n = config.initI18N(Vue);

const translationService = new TranslationService(store, i18n);
const loginService = new LoginService();
const accountService = new AccountService(store, translationService, router);

8 config.ts 添加initI18N

export function initI18N(vue) {
  vue.use(VueI18n);
  return new VueI18n({
    dateTimeFormats,
    silentTranslationWarn: true,
    formatter: new JhiFormatter(),
  });
}

9 webpack.common.js 添加folder-hash和MergeJsonWebpackPlugin

const { hashElement } = require('folder-hash');
const MergeJsonWebpackPlugin = require('merge-jsons-webpack-plugin');

  const languagesHash = await hashElement(resolve('src/main/webapp/i18n'), {
    algo: 'md5',
    encoding: 'hex',
    files: { include: ['*.json'] },
  });

        new MergeJsonWebpackPlugin({
          output: {
            groupBy: [
              { pattern: './src/main/webapp/i18n/en/*.json', fileName: './i18n/en.json' },
              { pattern: './src/main/webapp/i18n/zh-cn/*.json', fileName: './i18n/zh-cn.json' },
              { pattern: './src/main/webapp/i18n/zh-tw/*.json', fileName: './i18n/zh-tw.json' },
              // jhipster-needle-i18n-language-webpack - JHipster will add/remove languages in this array
            ],
          },

10 增加translation-store.ts, translation.service.ts, 以及对应的json信息文件。

最后,但是很重要的一点总结,JHipster国际化的思路是把所有的翻译工作放在前端来完成,利用vue-i18n,后端只有在发送邮件时会根据用户的langKey来获取信息,代码如下:

    @Async
    public void sendEmailFromTemplate(User user, String templateName, String titleKey) {
        if (user.getEmail() == null) {
            log.debug("Email doesn't exist for user '{}'", user.getLogin());
            return;
        }
        Locale locale = Locale.forLanguageTag(user.getLangKey());
        Context context = new Context(locale);
        context.setVariable(USER, user);
        context.setVariable(BASE_URL, jHipsterProperties.getMail().getBaseUrl());
        String content = templateEngine.process(templateName, context);
        String subject = messageSource.getMessage(titleKey, null, locale);
        sendEmail(user.getEmail(), subject, content, false, true);
    }

Good Luck,

Cheers!

jhipster-control-center:从一个地方管理您的JHipster应用程序 jhipsterControlCenter 该应用程序是使用JHipster 7.0.0-beta.1生成的,您可以在找到文档和帮助。 JHipster控制中心 特定的弹簧轮廓 为了正常工作,必须使用与Spring Cloud发现后端相对应的spring配置文件来启动Control Center。 eureka :连接到Eureka服务器并获取其注册的实例,该实例在application-eureka.yml配置 consul :连接到Consul服务器并获取其注册实例,该实例在application-consul.yml配置 static :使用作为属性提供的实例的静态列表,该列表在application-static.yml配置 kubernetes :待开发 控制中心API localhost:7419/api/services/instances :获取注册实例 localh 立即下载

相关推荐

RK3576的ISP和VPSS图像处理能力实测:对比海思方案能做什么?

本文深度评测了RK3576芯片的ISP和VPSS图像处理能力,并与海思方案进行对比。测试显示,RK3576在MIPI接口灵活性、多路视频支持、HDR动态范围和降噪效果等方面表现优异,特别适合智能视觉和安防监控应用。通过实测数据展示了其在低照度、高动态范围等复杂场景下的卓越性能。

weixin_42713608的博客 259

webpack-merge 实现开发、生产和测试环境的不同配置

使用可以方便地合并多个 Webpack 配置对象,从而实现开发、生产和测试环境的不同配置。

kevin_lcq的博客 912

Eureka常见面试题总结

点击关注我的博客原文 Eureka是Netflix组件的一个子模块,也是核心模块之一。云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移(来源springcloud中文网的介绍:https://www.springcloud.cc/)。下图总结了Eureka服务端(以下简称服务端)与Eureka客户端(以下简称客户端)之间协同工作的流程: 流程说明:...

u012105931的博客 2万+

jhipster angular2 lazyload 权限&国际化整体总结

首先:要修改web打包的懒加载loader: \webpack\webpack.common.js 修改内容如下: module: { rules: [ { test: /bootstrap\/dist\/js\/umd\//, loader: 'imports-loader?jQuery=jquery' }, ...

yaokunshan123的博客 141

SPSS_Process—简单&平行&链式中介模型

本篇文章介绍采用SPSS的插件Process对简单中介、链式中介、平行中介模型进行检验的操作方法及结果解读。

m0_54401011的博客 4万+

清华开源GPGPU“承影Ventus”初体验:用RISC-V RVV指令集跑通第一个OpenCL程序

本文详细介绍了清华大学开源GPGPU“承影Ventus”的开发实践,展示了如何基于RISC-V RVV指令集运行首个OpenCL程序。从环境配置、内核开发到性能优化,全面解析了这一创新架构的开发流程,为开发者提供了在RISC-V生态中进行通用GPU计算的实用指南。

weixin_30415113的博客 489

原理篇-- 定时任务xxl-job-服务端(admin)项目启动过程--initI18n() (2)

本文对 XxlJobScheduler init() 方法中的 initI18n() 进行介绍。本文对 initI18n() 方法进行介绍。

拽着尾巴的鱼儿的博客 1140

RK3588部署Zipformer模型问题总结

本文分享了在RK3588嵌入式设备上部署小米Zipformer语音识别模型时遇到的问题及解决方法。主要遇到两个问题:1)在rknn_model_zoo例程编译时出现静态库版本不兼容,通过重新编译kaldi-native-fbank库并修改链接路径解决;2)sherpa-onnx编译时提示缺少portaudio库,通过修改编译脚本启用相关宏定义后成功编译。最终成功在RK3588上运行Zipformer模型,测试结果显示该模型具有较好的识别效果和实时性(RTF=0.22),验证了其在边缘设备上的适用性。

pkyang2004的博客 2144

XXL-JOB学习

xxl-job的个人学习

lyh59的博客 1万+

ASME B31.3-2024工艺管道标准介绍

ASME B31.3-2024《过程管道》是ASME发布的最新版工业管道标准,适用于石油、化工、制药等行业的管道系统设计、建造和维护。该版标准进行了多项重要更新,包括软管管理、应力指数调整、新增管件类型、焊接检查和泄漏测试等条款修订,并新增了书面报告要求。标准共594页,为全球过程工业提供管道安全规范,对保障管道系统完整性、可靠性具有重要意义,被多国强制采用或推荐使用。

TXNMG的博客 4697

zemax像差参数Ray Fan/Spot Diagram/MTF/....讲解三

zemax像差参数Ray Fan/Spot Diagram/MTF/....讲解三

weixin_72050316的博客 1384

跟着JHipster学做项目 (5) 异常处理(下)Vue前端

JHipster前端处理异常主要包括三个方面,异常获取,异常显示,以及异常信息国际化。 异常获取JHipster通常放在组件类中实现,比如register.component.ts this.registerService() .processRegistration(this.registerAccount) .then(() => { this.success = true; }) .catch(error

java_augur的专栏 962

TC3XX - MCAL知识点(三):MCU EB-tresos配置说明及代码浅析

AURIX 2G Tc3xx的配置相较AURIX 1G Tc2xx来讲简化了许多,但是依赖于数据手册的理解来讲整个MCU功能做了较大增强,此处先简单的介绍一下,本文前期先补充介绍一下英飞凌手册的阅读规则,因为后面的文章会基于此文的一些缩写进行截图寄存器之类的。MCU在AUTOSAR架构里面的图示如下MCU驱动程序负责配置SCU、GTM、CCU6、GPT12和STM外设。驱动程序提供由AUTOSAR指定的运行时服务。

梦想技术家 2872

Webpack-Merge 使用教程

Webpack-Merge 是一个用于合并 Webpack 配置的工具。它提供了一个 `merge` 函数,可以用来连接数组和合并对象,创建一个新的对象。如果遇到函数,它会执行这些函数,将结果通过算法处理,然后再次将返回的值包装在一个函数中。这种行为在配置 Webpack 时特别有用。 ## 项目快速启动 ### 安装 首先,你需要安装 `webpack-merge`: ```bash n...

gitblog_00119的博客 1067

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

i18n中英文切换

"notebook":"知识小册","comments":"留言板","aticle":"文章","about":"关于","zh_CN":"中文","files":"归档","en_US":"英文"(3)、在index.ts中引入。(2)、在项目中使用。// 初始化i18n。

QLF19的博客 632

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

探索 TinyVue 组件库系列之国际化 (i18n) 支持

i18n 系统采用集中式包设计,以作为所有国际化操作的基础。该架构利用适配器模式无缝支持 Vue 2 和 Vue 3,通过虚拟模块解析来抽象特定框架的实现。系统通过虚拟模块策略解决框架兼容性问题。入口点从导入,该模块根据构建时检测到的 Vue 版本动态选择合适的实现。这种方法确保了相同的 API 表面在 Vue 2 和 Vue 3 环境中一致地工作,而无需在应用程序组件中编写特定版本的代码。对于具有现有 i18n 基础设施的应用程序,i18n()})

kagol的博客 630

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

vue-i18n 用法

安装插件 npm install vue-i18n@^8.18.2 i18njs帮助类 import Vue from 'vue' import VueI18n from 'vue-i18n' //this.$i18n.locale // 通过切换locale的值来实现语言切换 //window.vm.$i18n.t('lang.我的网站名') 主要为了在index页面使用多语言 //html {{$t('lang.test')}} //js调用this.$t('lang.test') //自

℡メ㏑╭ァ小凯 1403

Jhipster后台跨域请求配置

将 exposed-headers: 'Authorization,Link,X-Total-Count'默认改为空 开发环境: jhipster: cache: # Cache configuration ehcache: # Ehcache configuration time-to-live-seconds: 3600 # By default objects stay 1 hour in the cache max-entries: 100 # N...

杨咩咩 656

使用jhipster启动注册中心(一)

关于jhipster的介绍可以去官网看:官网地址 一、从github上下载下来jhipster-registry-master 代码地址:https://github.com/jhipster/jhipster-registry.git 1.如果本机安装了git,可以使用git命令下载,建一个空文件夹,切换到此目录下执行命令: git clone https://github.com/jhipst...

生命不息,奋斗不止 3278

使用 JHipster 构建微服务架构

JHipster 是一个代码生成工具,可以为 Kubernetes 创建 Web 应用程序、微服务、部署文件、云集成和 CI/CD Jenkins 文件。这个工具对于可以快速生成代码并避免创建样板代码的开发人员非常有帮助,可以节省 30% 的工作量。

stone1290的专栏 1229

使用 vue-i18n 进行Vue国际化处理,使项目切换中英文

1.下载安装插件 命令进入项目目录,执行以下命令安装vue 国际化插件vue-i18n npm install vue-i18n --save 2. 项目增加国际化翻译文件 在项目的src下添加lang文件夹增加中文翻译文件(zh.js)以及英文翻译文件(en.js),里面分别存储项目中需要翻译的信息。 en.js 英文语言包: export const m = { //...

xuan的博客 9282

【i18n】使用 vue-i18n 实现国际化多语言切换

vue-i18n 的使用 , 国际化的使用 , 多语言的切换 , 怎么切换多语言 , 怎么在 ts 的 script 中使用 vue-i18n 进行语言切换

shaoyahu的博客 2888

webpack-merge的使用

注意,在环境特定的配置中使用 merge() 功能,可以很方便地引用 webpack.dev.js 和 webpack.prod.js 中公用的 common 配置。webpack-merge 工具提供了各种 merge(合并) 高级功能,但是在我们的用例中,无需用到这些功能。

haosicx的博客 4159

聊一聊国际化i18n

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

G探险者的博客 2097

vue后台管理系统——添加i18n国际化功能——技能提升

vue后台管理系统——添加i18n国际化功能——技能提升

yehaocheng520的博客 2639
上一篇: 跟着JHipster学做项目 (17) Spring Boot处理分页和排序
下一篇: Js中如何获取当月的一号和最后一天
java_augur
博客等级 码龄22年 67粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值