1+ <p align =" center " >
2+ <img src = 'https://s3.bmp.ovh/imgs/2022/03/d585cb1e11fe32cd.png' height="150"/>
3+ </p >
4+
15<div align =" center " >
26
3- ![ ] ( https://s3.bmp.ovh/imgs/2021/10/06051d4647fc92de.png )
4- # react-intl-linter💡
7+ <h1 style =' font-family :" FreeMono" , monospace ;' >react intl linter</h1 >
8+
9+ ![ GitHub Repo stars] ( https://img.shields.io/github/stars/Styx11/react-intl-linter?style=social ) <a href =" https://marketplace.visualstudio.com/items?itemName=styx11.react-intl-linter " target =" __blank " ><img src =" https://img.shields.io/visual-studio-marketplace/v/styx11.react-intl-linter.svg?color=eee&labelColor=2667B2& ; label=VS%20Code%20Marketplace&logo=visual-studio-code " alt =" Visual Studio Marketplace Version " /></a > ![ GitHub] ( https://img.shields.io/github/license/Styx11/react-intl-linter?color=eee&labelColor=A2C348 )
10+
511自动替换中文字符串为 react-intl 代码的 VS Code 插件,Market 👉 [ Link] ( https://marketplace.visualstudio.com/items?itemName=styx11.react-intl-linter )
612
713</div >
814
915## 目录
1016
11- * [ 功能] ( #功能 )
17+ * [ 介绍] ( #介绍 )
18+ * [背景](#背景)
19+ * [工作流程](#工作流程)
1220 * [文本已存在现有配置](#文本已存在现有配置)
1321 * [文本不存在已有配置](#文本不存在已有配置)
1422* [ 使用] ( #使用 )
1523 * [基本使用](#基本使用)
1624 * [Simple Argument](#Simple-Argument)
1725 * [Disabling Rules](#Disabling-Rules)
1826 * [注意](#注意)
27+ * [ 多语言支持] ( #多语言支持 )
28+ * [语言代码](#语言代码)
29+ * [例子](#例子)
1930* [ 配置] ( #配置 )
2031* [ Sponsor] ( #Sponsor )
2132* [ Structure] ( #Structure )
2233* [ Debug] ( #Debug )
2334* [ License] ( #License )
2435
25- ## 功能
36+ ## 介绍
37+
38+ 该插件可以自动检测代码中的** 中文字符串** ,通过 CodeAction 翻译并生成对应的 intl 代码,另外插件会自动更新国际化配置文件。
39+
40+ ### 背景
41+ 我在开发公司项目的时候会有国际化的需求,但是这个过程** 异常繁琐且痛苦** ,尤其是当一个 UI 里面含有大量文本时🤮。因为我们需要收集所有中文文本将他们翻译为英文,然后还要有一个配置文件对应的 intl id(也就是 ` intl.formatMessage(id: ...) ` 的 ` id ` 属性),最后再将它们一个一个填入配置文件中(为了规范化我们甚至还要对配置文件按照名称去排序😓)。所以我认为有必要开发一个自动化插件帮助我们解决以上所有问题!
42+
43+ ### 工作流程
44+
45+ 本插件作为 VSCode 语言类插件,工作流程如下:
46+ 1 . 检测中文、特殊字符串并提示
47+ 2 . 查看现有国际化配置是否已包含目标文本
48+ 3 . 翻译文本至目标语言,用户可以选择或自定义 intl id 内容
49+ 4 . 插件自动更新对应的国际化配置文件(配置会按照 ` id ` 名称进行排序)
50+ 5 . 替换字符串为` intl.formatMessage({ id: ... }) ` 代码
2651
27- 该插件可以自动检测代码中的** 中文字符串** ,并通过 CodeAction 翻译并生成对应的的 intl 代码,另外插件会自动更新配置文件
28- - 中文字符串提示
29- - 自动检测已有国际化配置是否已包含目标文本
30- - 翻译目标文本至英文,用户可以选择或自定义 intl id 内容
31- - 插件自动更新对应的 react-intl 配置文件
32- - 替换中文字符串为` intl.formatMessage({ id: ... }) `
52+ 你可以直接将本插件应用到现有的前端项目中,也可以从一开始就将它加入到项目的 Bootstrap 里,插件会优先检查本地文本是否已经存在于已有的国际化配置文件中,如果没有,插件会自动为你生成所需的配置。它甚至可以根据本地语言和国际语言生成 react-intl 所需的 ` index ` 文件!
3353
3454### 文本已存在现有配置
3555插件会优先检查工作区中是否存在该文本对应的国际化配置,若有会直接替换为对应 react-intl 代码
3656![ ] ( https://s3.bmp.ovh/imgs/2021/09/4d62fb749425d312.gif )
3757
3858### 文本不存在已有配置
39- 当一个中文文本既不存在已有国际化配置,也没有翻译缓存时 ,该插件会翻译文本生成对应的的 react-intl 代码,并自动修改国际化配置
59+ 当一个中文文本既不存在已有国际化配置时 ,该插件会翻译文本生成对应的的 react-intl 代码,并自动修改国际化配置
4060![ ] ( https://s3.bmp.ovh/imgs/2021/09/26497bcd6aded4c0.gif )
4161
4262## 使用
43- * 注意:此插件默认在工作区` src/intl ` 目录下存放国际化配置文件*
63+ * 注意:此插件默认在工作区` src/intl ` 目录下存放国际化配置文件,并默认用户使用的本地语言为** 中文** ,目标的国际语言为** 英文***
64+
65+ 🌐本插件提供了** 多语言** 支持并将其设计得足够灵活,如果你想自定义本地语言和目标国际语言,可以参考 [ 多语言支持] ( #多语言支持 )
4466
4567本插件默认工作区采用以下形式的 react-intl 国际化配置
4668
47- 供 ` IntlProvider ` 使用的 ` index ` 文件
69+ 1 . 供 ` IntlProvider ` 使用的 ` index ` 文件(插件也可以自动生成)
4870``` ts
4971// src/intl/index.ts
5072import zh_CN from " ./zh_CN.json" ;
@@ -70,7 +92,7 @@ export default {
7092 " zh-CN" : zh_CN
7193}
7294```
73- 以及对应的国际化 json 文件
95+ 2 . 对应的国际化 json 文件
7496``` json
7597// src/intl/zh_CN.json
7698{
@@ -92,11 +114,11 @@ const message = '你好'
92114// 👇
93115const message = intl .formatMessage ({ id: ' HELLO' })
94116```
95- 或者使用 ` react-intl= ` 或` $= ` 标识符表示这段文本含有特殊字符串 (isChinese 无法判断含有特殊字符的文本为中文字符)
117+ 另外也可以使用 ` react-intl= ` 或` $= ` 标识符表示这段文本 ** 含有特殊字符串 ** ,或者这是一段除了中文外的 ** 其他语言的文本 ** (isChinese 无法判断含有特殊字符的文本为中文字符)
96118``` ts
97119const intl = useIntl ()
98120
99- const message = ' $=你好 '
121+ const message = ' $=Hello '
100122// 👇
101123const message = intl .formatMessage ({ id: ' HELLO' })
102124```
@@ -177,7 +199,7 @@ const message_03 = '这段话被禁止抛出警告' /* ri-lint-disable-line */
177199const messsage = ' 这段话被禁止抛出警告' // ri-disable-line
178200```
179201
180- 你可以通过 CodeAction 方便的为中文句子添加规则注释 :
202+ 你可以通过 CodeAction 方便地为句子添加规则注释 :
181203[ ![ HtwECT.gif] ( https://s4.ax1x.com/2022/02/10/HtwECT.gif )] ( https://imgtu.com/i/HtwECT )
182204
183205以下是本插件目前支持的所有规则注释:
@@ -216,19 +238,77 @@ const intl = intl.formatMessage({ id: "I_SAID_RAWMESSAGE" }, {raw_message: "你
216238}
217239```
218240
241+ ## 多语言支持
242+ * 关于多语言的实现可参考 [ issue #11 ] ( https://github.com/Styx11/react-intl-linter/issues/11 ) *
243+
244+ 本插件将语言分为了两个概念:一是** 本地语言** ,二是** 国际语言** 。
245+
246+ 本地语言表示用户使用的语言,它代表了本地文本的语言类型;国际语言表示用户想要覆盖到的所有外国语言类型,比如我们的本地语言为中文,我想要支持中英文的国际化,那么英文就是国际语言。
247+
248+ 两种类型会影响我们对文本的翻译,因为我们要基于它们构建一对多的翻译 Token 并得到对应它们的翻译结果。
249+
250+ 举个例子🌰,如果我们的本地语言是中文,国际语言包括英文、日文和繁体中文,那么它们的关系会是这样的:
251+
252+ <img src =" https://s3.bmp.ovh/imgs/2022/03/f0b3a625ddbcba59.png " width =" 600 " />
253+
254+ 用户使用本插件时可以灵活地组合本地语言和国际语言,插件会根据你的设置对这些国际化配置文件进行管理
255+
256+ <img src =" https://s3.bmp.ovh/imgs/2022/03/c42ea11777c28a3f.png " width =" 600 " />
257+
258+ ### 语言代码
259+
260+ 下面是我们现在支持的所有语言以及它们对应的语言代码,用户可以使用这些语言代码进行相应的配置:
261+
262+ 语言名称|代码
263+ ------|----
264+ 中文|zh
265+ 英语|en
266+ 日语|jp
267+ 繁体中文|cht
268+
269+ 用户可以配置` "localLanguage" ` 和` "localLanguageConfigName" ` 来分别表示` 本地语言 ` 和` 本地语言配置文件名 ` ;
270+
271+ 配置` "intlLanguage" ` 和` "intlLanguageConfigName" ` 来表示` 国际语言数组 ` 和` 国际语言配置文件名数组 `
272+
273+ 需要注意的是:用户配置的` "intlLanguage" ` 数组和` "intlLanguageConfigName" ` 数组要** 严格地一一对应** ,否则插件无法正确的将文本写入对应的配置文件中。
274+
275+ ### 例子
276+
277+ 举个例子🌰,我们有以下配置文件:
278+ ``` json
279+ // .vscode/settings.json
280+ {
281+ "reactIntlLinter.localLanguage" : " en" , // 本地语言为英语
282+ "reactIntlLinter.localLanguageConfigName" : " en_US" , // 本地语言配置文件名
283+ "reactIntlLinter.intlLanguage" : [
284+ " zh" , // 国际语言有中文和繁体中文
285+ " cht"
286+ ],
287+ "reactIntlLinter.intlLanguageConfigName" : [
288+ " zh_CN" , // 国际语言配置对应的文件名
289+ " zh_TW"
290+ ],
291+ "reactIntlLinter.intlConfigPath" : " src/intl" ,
292+ }
293+ ```
294+ 以上的配置表明我们的本地语言为** 英文** ,我们想要覆盖到** 中文** 和** 繁体中文** 的国际化,插件会自动将翻译文本写入到对应文件中,效果会是下面这样的:
295+ ![ ] ( https://s3.bmp.ovh/imgs/2022/03/71c25e6b448ecb9c.gif )
296+
219297## 配置
220298本插件提供了诸如国际化配置文件夹路径、国际化配置文件名称和不同框架下的国际化代码等配置项可供用户在 ` settings.json ` 文件下自定义:
221299
222300配置项|类型|默认值|描述
223301-----|-----|------|----
224- reactIntlLinter.zhConfigName|` string ` |` zh_CN ` |中文配置 json 文件名(不包括后缀)
225- reactIntlLinter.enConfigName|` string ` |` en_US ` |英文国际化配置 json 文件名(不包括后缀)
226- reactIntlLinter.intlConfigPath|` string ` |` src/intl ` |国际化配置文件夹路径名(相对于工作区根路径)
227- reactIntlLinter.intlCode|` react-intl ` \| ` vue-i18n ` |` react-intl ` |目标国际化框架,支持 ` react-intl ` ,` vue-i18n ` 。` react-intl ` 对应代码为 ` intl.formatMessage({id: ...}) ` ,` vueI18n ` 对应代码为 ` $t('id') `
302+ localLanguage|` string ` |` 'zh' ` |本地语言代码 [ 语言代码] ( #语言代码 )
303+ localLanguageConfigName|` string ` |` 'zh_CN' ` |本地语言配置 json 文件名(不包括后缀)
304+ intlLanguage|` array ` |` ['en'] ` |国际语言代码数组 [ 语言代码] ( #语言代码 )
305+ intlLanguageConfigName|` array ` |` ['en_US'] ` |国际语言配置 json 文件名数组(不包括后缀)
306+ intlConfigPath|` string ` |` src/intl ` |国际化配置文件夹路径名(相对于工作区根路径)
307+ intlCode|` react-intl ` \| ` vue-i18n ` |` react-intl ` |目标国际化框架,支持 ` react-intl ` ,` vue-i18n ` 。` react-intl ` 对应代码为 ` intl.formatMessage({id: ...}) ` ,` vueI18n ` 对应代码为 ` $t('id') `
228308
229309其中,因为国际化代码还需要适配简单Message Syntax参数的使用(即使以上两种国际化框架使用的是同一参数语法),所以目前无法通过代码字符串的方式进行配置
230310
231- 修改配置后,你需要重启 VS Code
311+ *** 修改配置后,你需要重启 VS Code***
232312
233313## Sponsor
234314由于我使用的翻译接口是需要收费的😅,所以如果这个插件你用的爽的话或许可以 Buy me a Coffee☕️
0 commit comments