开发过程中,因为国际化太麻烦,我写了这款 vscode 国际化插件

大厂技术  高级前端  Node进阶

点击上方 程序员成长指北,关注公众号
回复1,加入高级Node交流群

效果展示

完整流程

由于 gif 图有大小限制,这里录了两个。

01

a16be1cb80c0dd6e469c7476b3192c04.gif

02

5548265057bd53c5525768eeb509a7ba.gif

删除某个中文和检测本地文件是否已经存在

64f9cf6b3dd6767525e2e9fa6375e80f.gif

  1. 这里如果不想对某个中文做国际化,可以手动给删掉。

  2. 如果本地已经对当前中文做过国际化,就不会再去翻译了,而是直接把对应的key取出来,直接替换代码。

增加国际化语言类型

39fb85f36b44e02f53be8db783bb122d.gif

 这里新增了一个国际化类型,翻译的时候多了一个繁体中文,保存的时候,也会检测本地文件是否存在如果不存在,会自动创建该类型文件。添加国际化语言时冒号前面是百度翻译支持的类型,后面是文件名,如果一样可以只写一个。

下面是百度翻译常用语种和对应代码。

名称代码名称代码
自动检测auto中文zh
英语en粤语yue
文言文wyw日语jp
韩语kor法语fra
西班牙语spa泰语th
阿拉伯语ara俄语ru
葡萄牙语pt德语de
意大利语it希腊语el
荷兰语nl波兰语pl
保加利亚语bul爱沙尼亚语est
丹麦语dan芬兰语fin
捷克语cs罗马尼亚语rom
斯洛文尼亚语slo瑞典语swe
匈牙利语hu繁体中文cht
越南语vie

react代码中出现中文的几种方式

53ef343d91acf2b8695bc464f2291c6e.gif

 利用抽象语法树,能够精准的获取代码中的中文。

插件功能介绍

  1. 到vscode插件市场搜索easy-i18n-helper然后安装,作者是dbfu321,别安装错了。也可以访问这个 在线地址https://marketplace.visualstudio.com/items?itemName=dbfu321.easy-i18n-helper) 去安装。

  2. 首先在百度翻译平台开通通用文本服务,得到APP ID和密钥,然后在vscode配置中设置easy-i18n-helper.Baidu App Id和easy-i18n-helper.Baidu App Token后,就能使用该插件了。开通百度翻译服务教程在下面。

  3. 在react代码文件中右键,然后点击翻译当前页面,会自动获取当前页面的中文,然后展示出来,这里如果你不想对某个中文做国际化,你可以给删除。

  4. 点击名称,可以跳到对应编辑器中并选中当前中文,可以让你快速知道当前中文在代码中的位置,然后决定是否删除。

  5. 点击翻译会调百度翻译公共接口去翻译,这里会检测本地是否已经存在要做国际化的中文,如果存在,则不会去调翻译接口,直接用本地的。

  6. 点击翻译按钮过后,会在翻译结果页面看到哪些是新增的,哪些是直接取本地的。

  7. 点击保存后,会自动检测当前文件是否引入了国际化方法,如果没有引入,会自动引入,这个导入代码可以在配置里自定义。

  8. 把新增的国际化内容保存到本地文件中,如果本地文件不存在,则自动创建。

  9. 用国际化方法覆盖掉代码中的中文

  10. 自定义语种。到vscode配置中搜索easy-i18n-helper.languages,然后添加一个语种,百度翻译支持的语种上面已经发过了。

  11. 自定义导入国际化方法语句。到vscode配置中搜索easy-i18n-helper.Import Codes,然后改成自己想要的。

  12. 自定义存放本地国际化文件的文件夹地址。到vscode配置中搜索easy-i18n-helper.Locales Path,然后改成自己的。

  13. 自定义国际化文件后缀。有的项目可能没有用ts,所以这里支持去修改成js。到vscode配置中搜索easy-i18n-helper.File Type,然后改成其他的。

  14. 自定义国际化方法名。有的项目可能不叫t,到vscode配置中搜索easy-i18n-helper.Method Name,然后改成其他的。

  15. mac快捷键:command+shift+t

  16. win快捷键:ctrl+shift+t

开通百度翻译翻译服务和获取 app id 和 密钥

开通这个服务还是很简单的,整个流程大概只需要几分钟。百度翻译每个月有100w字符的免费(良心企业啊),如果个人使用,基本可以放心的使用。这里提醒一下,如果超出100w字符,是会扣费的,所以大家要保护好自己的app id和密钥。

01 进入百度翻译网站,登录百度账号

02 点击下面的通用文本翻译的查看详情

72ea4923ba852a231dc54f4bb0e3c5d4.jpeg

点击立即使用

795bdbf8e5fe91046927f5926ca98708.jpeg

选个人开发者,填写信息

2dc38af02f820757969c5260f2289653.jpeg

实名认证,可开通高级版

e0dc1ccc3f3925f6efa45a3e90eebb87.jpeg

开通文本翻译服务

a4370c030383b2f8f53238332ddcf09c.jpeg

选通用文本翻译

88dac73adfc4ebb9d4920385ad701cb6.jpeg

开通高级版

c27b833b747cf05eda7a1527a0ec69e2.jpeg

写应用名(随意),其他可不填,提交申请,秒通过

7223ec4450105147f8be7a8d72f12342.jpeg

总览下方,可得到 app id 和 密钥,配置到 vscode 中,即可用当前插件

737a4129b2e112322d7e6e9b4acc05af.jpeg

插件代码实现思路

  1. 获取并检查用户配置,并把获取到的用户配置存到全局。

  2. 获取当前内容ast

  3. 通过ast获取所有中文

  4. 使用vscode webview显示中文列表页面,并在页面中实现删除功能。

  5. 监听webview消息事件

  6. 当监听到webview传输open类型的事件时:使用vscode api实现选中当前中文。

  7. 使用ast检测用户当前本地项目中有没有对应的中文

  8. 根据用户配置的语言列表,把本地没有做过国际化的中文,借助百度翻译api翻译成对应的语言。

  9. 使用webiew展示翻译结果

  10. 保存,把新增的国际化存到本地,然后使用国际化生成的key和封装的国际化方法替换掉当前文本。

插件中用到的主要技术

抽象语法树

项目里主要使用了babel把文件内容转换成抽象语法树,然后通过遍历语法树获取中文。

@babel/parser 使用这个库把代码转换成抽象语法树

@babel/traverse 使用这个库遍历语法树,获取代码中的中文

@babel/generator 使用这个库把处理过的ast转换成代码

private getAst(): ParseResult<t.File> | undefined {
    try {
      this.ast = parse(this.fileContent, {
        sourceType: "module",
        plugins: [
          "jsx",
          "flow",
          ["decorators", { "decoratorsBeforeExport": true }],
        ],
      });
      return this.ast;
    } catch (error) {
      console.log(error);
    }
  }
private getChineseWordsByAst(ast: ParseResult<t.File>) {
    const words: Words[] = [];
    traverse(ast, {
      ["StringLiteral"]: (path: any) => {
        if (/[\u4e00-\u9fa5]/.test(path.node.value)) {
          words.push({
            value: path.node.value,
            loc: path.node.loc,
            isJsxAttr: path.parent.type === "JSXAttribute",
            id: getId(),
          });
        }
      },
      ["JSXText"]: (path: any) => {
        if (/[\u4e00-\u9fa5]/.test(path.node.value)) {
          const val = path.node.value.replace(/\n/g, '').trim();
          words.push({
            id: getId(),
            value: val,
            loc: path.node.loc,
            isJsxAttr: true,
            isJsxText: true,
            rawValue: path.node.value,
          });
        }
      },
      ["TemplateElement"]: (path: any) => {
        if (/[\u4e00-\u9fa5]/.test(path.node.value.raw)) {
          const val = path.node.value.raw.replace(/\n/g, '').trim();
          words.push({
            id: getId(),
            value: val,
            loc: path.node.loc,
            isTemplate: true,
          });
        }
      }
    });
    return words;
  }
    const ast = parse(fileContent, { sourceType: "module" });


    const visitor: any = {
      // eslint-disable-next-line @typescript-eslint/naming-convention
      ObjectExpression(nodePath: any) {
        const { node } = nodePath;


        node.properties.push(
          ...newWords.map((word) => {
            return t.objectProperty(
              t.stringLiteral(word.key),
              t.stringLiteral(word.value),
            );
          })
        );
      },
    };


    traverse(ast, visitor);


    const newContent = generator(ast, {
      jsescOption: { minimal: true },
    }).code;

这里只简单的介绍一下,后面会开单篇详细介绍babel。

vscode插件开发

webview 和 vscode 通信

vscode中创建webview后,可以使用onDidReceiveMessage这个方法监听webview中js发送过来的消息。

this.webviewPanel = window.createWebviewPanel(
  'translate',
  "中文列表",
  columnToShowIn || ViewColumn.Active,
  {
    retainContextWhenHidden: true,
    enableScripts: true
  }
);
this.webviewPanel.webview.onDidReceiveMessage((e) => this.didReceiveMessageHandle(e));

webview script中可以通过acquireVsCodeApi这个方法得到vscodeAPI对象,然后使用postMessage给vscode发送消息。

<script>
 const vscode = acquireVsCodeApi();
 vscode.postMessage({
   data: window.words,
   type: "save",
 });
</script>

webview 中获取 vscode 主题

为了让用户体验更好,插件可以根据用户主题自动改变颜色。

在css中可以使用body.vscode-lightbody.vscode-dark来定制webview中的主题。

body.vscode-light {
   color: #333;
}


body.vscode-dark {
  color: #eee;
}

使用--vscode-editor-font-size变量获取编辑器设置的字体大小

body,
table {
  font-size: var(--vscode-editor-font-size);
  word-break: break-word;
}

小结

后面也会开单篇介绍如何从零开发一个 vscode 插件

ejs html 模版引擎

官网地址

这个我用的也不多,因为要根据变量生成一些dom元素,不想用原生api一个个创建dom元素,就使用了这个市面上比较常用的html模版引擎。用了一下,感觉还挺方便。就遇到了一个问题,怎么把变量注入到window对象上。从网上搜了一些资料,他们给的方案是有点问题的。

网上的方案:

<script>
   window.words = <%= JSON.stringify(words) %>;
</script>

这样写在运行的时候会报错,因为<%= 会把内容转换成html,导致json中{会被转译掉,然后JSON.stringify就报错了。

正确用法:

<script>
   window.words = <%- JSON.stringify(words) %>;
</script>

使用<%-就行了。

  • <% '脚本' 标签,用于流程控制,无输出。

  • <%_ 删除其前面的空格符

  • <%= 输出数据到模板(输出是转义 HTML 标签)

  • <%- 输出非转义的数据到模板

  • <%# 注释标签,不执行、不输出内容

  • <%% 输出字符串 '<%'

  • %> 一般结束标签

  • -%> 删除紧随其后的换行符

  • _%> 将结束标签后面的空格符删除

总结

相信很多同学都不愿意做国际化,但是公司要求必须要做,只能很痛苦的去做。但是有了这款插件,开发的时候就不用关注国际化了,可以在开发完一个功能后,一键国际化。

我不知道别人的系统国际化是怎么做的,看了一些开源的框架,都是在本地文件中做,其实这样做有个不好的地方,很容易导致代码冲突,所以我们把本地存储迁移到了数据库。迁移到线上还有一个好处,如果业务对机翻的结果不满意,可以在线修改。

在公司内部我还写了一个插件,和这个区别是调系统接口把自动翻译的结果存储到数据库,而不是存储到本地。

因为我对 vue 不熟,所以现在插件只支持 react,哪位兄弟有时间提个 pr,把 vue 也支持一下吧。

代码中我写了个抽象类,写 vue 插件的时候继承一下这个类,只要实现获取中文,替换文本和导入国际化这三个抽象方法就行了,代码文件可以加在这个目录下。

38a870e29f130daacf2c2172d57d06d8.jpeg

作者:前端小付
链接:https://juejin.cn/post/7217248299924996133

Node 社群

我组建了一个氛围特别好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你对Node.js学习感兴趣的话(后续有计划也可以),我们可以一起进行Node.js相关的交流、学习、共建。下方加 考拉 好友回复「Node」即可。

74bff5b8147c7f01ca29061716f02241.png

“分享、点赞、在看” 支持一下
<think>嗯,用户想用VSCode和C#来开发AutoCAD插件,我得先理清楚步骤。首先,AutoCAD的二次开发通常需要ObjectARX库,对吧?但ObjectARX主要是C++的,而用户要用C#,可能需要用到AutoCAD .NET API。不过用户可能不太清楚这些区别,需要先解释清楚。 然后,VSCode配置方面。虽然Visual Studio有更好的集成,但用户可能更倾向于VSCode,所以得指导如何安装必要的扩展,比如C#扩展和.NET SDK。还需要配置项目文件,比如.csproj,确保引用正确的AutoCAD库,比如acdbmgd.dll和acmgd.dll。这时候可能需要手动编辑项目文件,因为VSCode不像VS那样有图形界面。 接下来是代码示例。用户需要知道如何创建一个类库,使用CommandMethod属性来注册命令。要提醒用户注意文档的获取,比如Application.DocumentManager,还有如何输出信息到命令行。示例代码的编要简洁,同时说明编译和加载的步骤。 调试部分可能比较麻烦,因为VSCode调试AutoCAD插件需要配置launch.json,指定启动外部程序为acad.exe,并处理调试符号。这里可能需要详细说明配置步骤,或者建议使用Visual Studio更方便,但用户可能坚持用VSCode,所以还是要给出方法。 参考资料方面,用户提供的引用里有C#的例子,比如引用3里的代码,可以借鉴。同时要指出ObjectARX的C++项目可能不太适合,但如果有C#的资源更好。另外,版本兼容性很重要,需要提醒用户保持AutoCAD版本一致,如引用2提到的。 用户可能遇到的问题包括找不到必要的DLL,或者调试配置不正确,还有版本不匹配。需要提前预见到这些问题,并在回答中给出解决方案,比如手动添加引用,检查路径,确保.NET框架版本正确等。 最后,生成的相关问题要围绕用户可能的后续疑问,比如环境配置问题、调试方法、与Visual Studio的区别,以及版本兼容性问题。这样能帮助用户更全面地了解开发过程中可能遇到的挑战。</think>根据您的需求,我将为您整理使用VSCode和C#开发AutoCAD插件的完整指南(基于最新开发实践): ### 一、开发环境配置 1. **AutoCAD版本要求** - 推荐使用AutoCAD 2020+版本,支持.NET Framework 4.8[^2] - 需安装对应版本的AutoCAD .NET开发包(ObjectARX SDK) 2. **VSCode配置步骤** ```bash # 安装必要组件 dotnet new -i AutoCAD.NET.Templates::2024.1.0 dotnet new classlib -n MyAutoCADPlugin -f net48 ``` - 安装扩展:C# for Visual Studio Code(由Microsoft提供) - 添加NuGet包引用: ```xml <ItemGroup> <Reference Include="acdbmgd"> <HintPath>$(AutoCADPath)\acdbmgd.dll</HintPath> </Reference> <Reference Include="acmgd"> <HintPath>$(AutoCADPath)\acmgd.dll</HintPath> </Reference> </ItemGroup> ``` ### 二、基础插件开发 1. **创建命令类** ```csharp using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.Runtime; namespace MyPlugin { public class BasicCommands { [CommandMethod("HelloCAD")] public void HelloWorldCommand() { var doc = Application.DocumentManager.MdiActiveDocument; doc.Editor.WriteMessage("\nHello AutoCAD from VSCode!"); } } } ``` 2. **编译配置(.csproj关键设置)** ```xml <PropertyGroup> <TargetFramework>net48</TargetFramework> <AutoCADVersion>2024</AutoCADVersion> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup> ``` ### 三、调试配置(.vscode/launch.json) ```json { "version": "0.2.0", "configurations": [ { "name": "Attach to AutoCAD", "type": "clr", "request": "attach", "processId": "${command:pickProcess}", "symbolSearchPath": "${workspaceFolder}/bin/Debug" } ] } ``` ### 四、部署与测试 1. **加载插件方法** ```lisp ; 在AutoCAD命令行执行 NETLOAD "D:\Projects\MyAutoCADPlugin\bin\Debug\MyAutoCADPlugin.dll" ``` 2. **执行测试命令** ```bash HELLOCAD # 应显示"Hello AutoCAD from VSCode!" ``` ### 五、关键注意事项 1. 版本匹配:AutoCAD主程序、SDK、.NET Framework三者版本必须一致[^2] 2. 调试技巧:使用`acad.exe /nologo`启动可加快调试速度 3. 性能优化:通过`[CommandFlags(CommandFlags.Session)]`属性提升命令执行效率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值