当前位置: 首页 > news >正文

VonaJS: I18n如何支持Swagger多语言

VonaJS提供的I18n支持模块化体系。每个业务模块都可以单独提供自己的 I18n 语言资源。我们先了解I18n的一般用法,然后再看看如何支持Swagger多语言

初始化代码骨架

我们先在模块demo-student中初始化I18n的代码骨架

1. Cli命令

$ vona :init:locale demo-student

2. 菜单命令

右键菜单 - [模块路径]: `Vona Init/Locale`

定义语言资源

以模块demo-student为例,定义模块的语言资源:

  • 英文

src/module/demo-student/src/config/locale/en-us.ts

export default {
+ StudentName: 'Student Name',
};
  • 中文

src/module/demo-student/src/config/locale/zh-cn.ts

export default {
+ StudentName: '学生名称',
};

使用语言资源

可以通过 Scope 实例提供的locale对象获取模块的语言资源,支持类型化提示

class ControllerStudent {@Web.get('test')test() {// use current localeconst message1 = this.scope.locale.StudentName();// use locale en-usconst message2 = this.scope.locale.StudentName.locale('en-us');// use locale zh-cnconst message3 = this.scope.locale.StudentName.locale('zh-cn');console.log(message1, message2, message3);}
}  

跨模块使用语言资源

class ControllerStudent {@Web.get('test')test() {// use current localeconst message1 = this.$scope.demoStudent.locale.StudentName();// use locale en-usconst message2 = this.$scope.demoStudent.locale.StudentName.locale('en-us');// use locale zh-cnconst message3 = this.$scope.demoStudent.locale.StudentName.locale('zh-cn');console.log(message1, message2, message3);}
}  

覆盖语言资源

可以使用项目级别的语言资源覆盖模块级别的语言资源

  • 英文

src/backend/config/locale/en-us.ts

export default {modules: {
+   'demo-student': {
+     StudentName: 'Student Name!',
+   },},
};
  • 中文

src/backend/config/locale/zh-cn.ts

export default {modules: {
+   'demo-student': {
+     StudentName: '学生名称!',
+   },},
};

当前locale

1. 获取当前locale

const locale = this.ctx.locale;

2. 设置当前locale

this.ctx.locale = 'en-us';

3. 获取缺省locale

const localeDefault = this.$scope.i18n.config.defaultLocale;

获取当前locale的规则

当用户访问后端 API 时,后端会自动根据规则获取当前 locale

1. 模块配置

I18n 是由模块 a-i18n 提供的核心能力,可以在 App config 中修改模块的配置:

src/backend/config/config/config.ts

// modules
config.modules = {'a-i18n': {defaultLocale: 'en-us',queryField: 'x-vona-locale',headerField: 'x-vona-locale',cookieField: 'locale',},
};
名称 说明
defaultLocale Default locale
queryField 从request query中获取当前locale,query key默认为x-vona-locale
headerField 从request header中获取当前locale,header key默认为x-vona-locale
cookieField 从request cookie中获取当前locale,cookie key默认为locale

2. 规则次序

系统按以下次序,依次判断当前 locale

queryField > headerField > cookieField > Header: Accept-Language > defaultLocale

添加新语言

VonaJS 默认提供了两个语言:en-uszh-cn。下面演示如何添加新语言zh-tw

1. 添加类型定义

采用接口合并机制添加新语言的类型定义

在 VSCode 编辑器中,输入代码片段recordlocale,自动生成代码骨架:

declare module 'vona' {export interface ILocaleRecord {: never;}
}

调整代码,然后添加zh-tw

declare module 'vona' {export interface ILocaleRecord {
+   'zh-tw': never;}
}

2. 添加语言资源

新建语言文件zh-tw.ts,然后添加语言资源

src/module/demo-student/src/config/locale/zh-tw.ts

export default {StudentName: '學生名稱',
};

复数

1. 定义语言资源

src/module/demo-student/src/config/locale/en-us.ts

export default {
+ TestApples_: '%d apples',
+ TestApples_0: 'no apples',
+ TestApples_1: 'one apple',
};

src/module/demo-student/src/config/locale/zh-cn.ts

export default {
+ TestApples_: '%d个苹果',
+ TestApples_0: '没有苹果',
};

2. 使用语言资源

this.ctx.locale = 'en-us';
const apple0 = this.scope.locale.TestApples_(0);
const apple1 = this.scope.locale.TestApples_(1);
const apple2 = this.scope.locale.TestApples_(2);
console.log(`${apple0}, ${apple1}, ${apple2}`);

控制台输出如下:

no apples, one apple, 2 apples
  • TestApples_: 缺省语言资源。语言资源添加后缀_,可以提示开发者该语言资源需要传入参数
  • TestApples_{n}: 可以针对任何具体的n提供独立的语言资源。系统在进行语言翻译时,如果找不到具体n的语言资源,就使用缺省语言资源TestApples_

复数: 多参数

如果语言资源支持多参数,那么可以明确指定哪个参数支持复数

1. 定义语言资源

src/module/demo-student/src/config/locale/en-us.ts

export default {
+ TestNameApples_: '%s has %d apples',
+ TestNameApples_0_1: '%s has no apples',
+ TestNameApples_1_1: '%s has one apple',
};

src/module/demo-student/src/config/locale/zh-cn.ts

export default {
+ TestNameApples_: '%s有%d个苹果',
+ TestNameApples_0_1: '%s没有苹果',
};

2. 使用语言资源

this.ctx.locale = 'en-us';
const apple0 = this.scope.locale.TestNameApples_('Tom', 0);
const apple1 = this.scope.locale.TestNameApples_('Tom', 1);
const apple2 = this.scope.locale.TestNameApples_('Tom', 2);
console.log(`${apple0}, ${apple1}, ${apple2}`);

控制台输出如下:

Tom has no apples, Tom has one apple, Tom has 2 apples
  • TestNameApples_: 缺省语言资源。语言资源添加后缀_,可以提示开发者该语言资源需要传入参数
  • TestNameApples_{n}_{ordinal}: ordinal代表参数序数

Swagger/Openapi

VonaJS 提供了一组工具函数,为 Swagger/Openapi 实现 I18n 国际化

比如,为EntityStudent的字段name提供国际化的title信息

1. $localeScope

在设置字段 title 信息时,要使用语言资源FullKey。在实际生成 Swagger/Openapi 元数据时,系统会自动将语言资源FullKey翻译为指定的语言

+ import { $localeScope } from 'vona';class EntityStudent {
+ @Api.field(v.title($localeScope('demo-student', 'Name')))name: string;
}
  • v.title: 设置 title 信息
  • $localeScope: 传入模块名称语言资源Key,从而生成语言资源FullKey: demo-student::Name

2. $locale

VonaJS 还提供了一个简化的工具函数$locale

+ import { $locale } from '../.metadata/index.ts';class EntityStudent {
+ @Api.field(v.title($locale('Name')))name: string;
}
  • $locale: 传入语言资源Key,从而生成语言资源FullKey: demo-student::Name
    • 每个模块都提供了$locale 函数,因此,使用本模块的$locale 函数就可以取得模块名称

资源

  • Github:https://github.com/vonajs/vona
  • 文档:https://vona.js.org
http://www.gsyq.cn/news/47201.html

相关文章:

  • 2025年环氧防腐底漆生产厂家权威推荐榜单:水性有机硅/水性聚氨酯漆/双组份水性漆源头厂家精选
  • 跨网文件传输怎么做?主要有哪几种安全有效的解决方案?
  • 2025企业选择什么样的IT监控厂商?数字化转型值得部署的5款运维监控产品推荐
  • springboot 使用druid 配置数据库密码加密
  • 迈威IMC系列光纤收发器为何成为市场“真香”选择?
  • 2025年EGUOO肠胃片成分权威解析:四维科学矩阵如何重塑肠胃养护范式
  • 【汇总】VS Code Windows 快捷键 (三列中英文对照)
  • 数字写作工具观察:Markdown编辑器的本地化新选择
  • 2025年EGUOO护肝片深度解析:科研矩阵下的成分协同与代谢干预
  • 2025年11月无线表面肌电生产厂家与品牌推荐:谁才是行业翘楚?
  • 2025年EGUOO关节营养素:深度解析复合配方与实证功效
  • Petrozavodsk Summer 2020. Day 4. Xi Lin Contest 6 L. Tokens on the Tree 题解
  • 2025年EGUOO复合植物舒压睡眠片:深度解析科研底色与温和助眠机制
  • Gitee DevSecOps平台引领军工软件智能化研发新浪潮:从版本管理到全生命周期安全管控
  • 工业光纤收发器:为什么它是现代工业网络的“隐形桥梁”?
  • 物流查询
  • 【IEEE】第八届机械工程与智能制造国际会议(WCMEIM 2025)
  • 2025年EGUOO肠胃消化酶测评:权威解析配方功效与风险边界
  • 从FTP到国产化:替代FTP的最佳方案,满足等保与信创要求
  • 软件许可优化效果大比拼:优化前浪费30%,优化后效率狂飙!
  • 软件又多又贵?3招许可优化,解决企业90%的浪费难题!
  • revit api获取图元的levelid的两种方式
  • 2025自动化运维厂商推荐:信创需求下企业适用什么样的自动化运维软件?
  • 意大利OT高密度脑电肌电推荐企业:瑞鸿安——专业品质与服务
  • Win11安装五笔输入法
  • revit api 获取导入的cad图形的位置
  • 【URP】Unity[后处理]色调分离SplitToning
  • 奇妙清单的制作
  • 深入解析:OpenAI推出即时支付功能,ChatGPT将整合电商能力|技术解析与行业影响
  • 【开题答辩全过程】以 北京房屋租赁数据分析与可视化为例,包含答辩的问题和答案 - 教程