使用 vite-plugin-lingo 进行可视化翻译管理

发布: (2025年12月17日 GMT+8 01:29)
5 min read
原文: Dev.to

Source: Dev.to

转变 i18n 工作流

传统上,开发者或翻译人员使用原始文本文件或外部平台。vite-plugin-lingo 深度集成 Vite,使翻译像本地开发的常规部分:运行开发服务器,打开路由,编辑文本,刷新。

功能

  • 可视化编辑器 – 用于 .po 文件的 GUI;无需担心破坏文件格式。
  • 无缝集成 – 与 wuchale 等解决方案以及其他 i18n 库兼容。
  • 开发者体验 – 管理翻译变成标准 Vite 工作流的另一部分。

为什么它与众不同(不仅仅是“UI”)

  • .po‑native – 直接使用标准 Gettext 目录。
  • Framework‑agnostic – 如果它在 Vite 上运行,则可与 Svelte、React、Vue、Solid 等配合使用。
  • wuchale‑friendly – 通过加速“人工审校 + 润色”步骤,补充编译时 i18n 工作流。
  • Self‑hostable – 团队可以将翻译保持私有,并存放在现有代码库中。

目标不是取代你的 i18n 系统,而是消除编辑、审校和发布翻译过程中的摩擦。

安全说明

由于编辑器 UI 通过路由暴露,请将其视为 dev‑time tool。如果在本地开发之外启用它,请使用身份验证进行保护或限制访问。计划中的团队工作流功能将包括适当的身份验证、角色和审查门槛。

为什么要使用它?

如果你使用 Gettext,vite-plugin-lingo 可以消除上下文切换。你可以在不离开项目的情况下查看、编辑和管理翻译,避免在代码审查中难以发现的细微 .po 格式错误(缺少头部、引号破损等)。

接下来计划(付费版)

免费插件提供了一个坚实的编辑器 UI 用于开发。付费计划将添加完整的翻译工作流功能:

  • AI 翻译辅助 – 在保留 .po 格式的同时,建议并批量翻译字符串。
  • 协作 – 多用户角色(译者/审校者/管理员)和活动日志。
  • 生产模式 – 在开发环境之外安全启用编辑器,并通过身份验证。
  • 审批工作流 – 在写回 .po 文件之前,将更改排队等待审查。
  • 翻译记忆库 – 重用已有翻译并建议相近匹配。
  • 质量检查 – 占位符验证、一致性检查以及对风险编辑的警告。
  • 术语表 & 词汇 – 保持产品用词的一致性。
  • 导入/导出 – 在常见格式和工作流之间移动数据。

指导原则: 让快速推进变得容易,同时不让翻译质量下降。

Backend Vision (For Teams)

  • 身份验证 – 翻译者无需仓库访问权限。
  • API 密钥 – 确保插件与后端的调用安全。
  • 使用跟踪 – 审计和运营可视化。
  • AI 翻译端点 – 高质量建议。
  • 仪表盘 – 管理访问、密钥和工作区设置。

插件保持轻量且本地优先,同时在需要时启用团队功能。

结论

简化 i18n 工作流可以更大程度地确保您的应用多语言支持保持最新。尝试一下 vite-plugin-lingo,看看它如何简化您的本地化流程。

快速开始

安装

bun add -d vite-plugin-lingo
# or
npm install --save-dev vite-plugin-lingo

将插件添加到你的 Vite 配置中

// vite.config.ts
import { defineConfig } from "vite";
import lingo from "vite-plugin-lingo";

export default defineConfig({
  plugins: [
    lingo({
      route: "/_translations",
      localesDir: "./locales",
    }),
  ],
});

启动开发服务器并打开:

工作流想法(团队)

  • .po 文件保存在版本控制中。
  • 开发者在功能开发期间进行小幅 UI 文本微调。
  • 对于较大改动,译者可以使用他们偏好的工具,同时所有人都能受益于低摩擦的“立即修复”路径。

资源

  • GitHub 仓库:
  • npm 包:
  • 网站:
Back to Blog

相关文章

阅读更多 »

Webpack Fast Refresh 与 Vite

概述 本文分享了在 ilert‑ui 的日常开发中感觉最快的做法,ilert‑ui 是一个大型 React + TypeScript 应用,拥有许多懒加载路由。我们首先迁移了…