0

为 i

 3 years ago
source link: https://blog.rxliuli.com/p/7fc05ef7c1274b168504c216a6774ea6/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
为 i18next json 配置文件生成 dts 类型定义

本文最后更新于:2021年6月21日 早上

吾辈有一些项目需要使用 i18next 来处理国际化,但是使用 typescript 需要有类型定义,所以之前在 joplin-utils 项目中维护和使用。昨天做了很多重构,现在已经分离出来并作为公共 npm 包发布。如果有人感兴趣,可以尝试一下。

English, 简体中文

i18next 的 typescript 类型定义生成器,可以从多个语言翻译 json 文件中生成类型定义,支持嵌套对象与参数。

这个 cli 本身国际化配置的类型定义生成也是由 cli 完成的(自举)

1
2
yarn add -D @liuli-util/i18next-dts-gen
i18next-dts-gen --input src/i18n # 扫描这个目录下的 json 文件并生成 index.d.ts 类型定义
1
2
3
4
5
6
7
8
9
$ i18next-dts-gen -h
Usage: bin [options]

根据 json 生成 .d.ts 类型定义

Options:
-i, --input <input...> 包含一或多个翻译文件的目录
-w, --watch 是否使用监视模式
-h, --help display help for command

为什么已经有了很多第三方的类型定义生成器,甚至最新版 i18next 官方已经推出了 typescript 解决方案,吾辈还要写这个呢?

简而言之,都不完善。

先从 i18next 官方的解决方案说起,它是将 json 文件替换为 ts 文件,但不能支持参数和嵌套对象。

注:最新版似乎利用了 typescript 4.2 的递归类型和模板字符串类型来保证类型安全,但这实际上是不怎么好用的。另外只有 react-i18next 是可用的。

再来说 i18next-typescript 这个第三方库,几乎能满足吾辈的需求了,除了一点:支持对象参数。还有像是 Jack 菊苣的 i18n-codegen,代码设计上非常优雅,但同样的,不支持 react 之外的生态。

另外,就吾辈而言,认为使用生成器生成简单的类型要比从类型系统上支持这种功能更加容易,也更加合理。

是否支持 i18next 的全部特性?

否,这里支持的仅为 i18next 的一个子集。

  • 为多个本地化 json 配置文件生成类型定义
  • 支持包含参数
    • 不支持对象参数
  • 支持嵌套的 key
  • 不支持配置命名空间、嵌套的分割字符串,我们认为约定大于配置
  • 不支持 json 之外的配置文件,我们认为 json 文件对于非开发者都更友好,而且在需要时开发者更容易处理
  • 不支持 i18next 命名空间,即将翻译文件分割

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK