做了个工具解决 i18n 翻译协作痛点 - 翻译人员直接在页面上改文案,实时同步代码 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
weixind
0.49D
V2EX    分享创造

做了个工具解决 i18n 翻译协作痛点 - 翻译人员直接在页面上改文案,实时同步代码

  •  
  •   weixind
    erweixin 7 天前 1528 次点击

    做前端搞过 i18n 的应该经历过的痛苦:开发改完代码,导出翻译文件,翻译人员看着 Excel 里一堆文字不知道用在哪里,改完后导入,UI 发现长度不对,又要重新调...无限循环。

    于是我做了个工具来解决这个问题, 也希望给大家一个解决相关问题的思路。

    原来的协作流程

    开发完成中文版 --> 导出文案/AI 翻译(通过在线文档或者 excel 协作) --> 翻译人员检验以及做本地化 --> 导入项目 --> UI/翻译调整 --> 开发调整 --> 翻译/UI 走查。

    具体痛点:

    1. 流程反复:后半段容易无限循环,开发变成了"改翻译文件工具人"

    2. 上下文缺失:翻译人员只看到 Excel 里的文字,不知道在哪用

      • 例如"序号",在表格标题和列表序号应该用不同英文,但翻译人员无法区分
    3. UI 适配难:英文翻译长短不一,需要适配 UI ,但翻译人员看不到效果

      • 例如"确定"翻译成 "Confirm" 还是 "OK"?要看按钮大小才知道

    新的协作流程

    开发完成中文版 --> 起一个开发服务给到翻译 --> 翻译人员可以在页面更改文案,所见即所得(自动同步到开发人员代码) --> 提交代码(收工)

    核心特性:

    按住 Ctrl/Cmd+Shift 点击页面文案即可编辑

    实时预览效果:修改后立即看到 UI 变化,不用来回确认

    自动同步代码:修改自动写入开发本地翻译文件,触发热更新

    零侵入接入:只需加个插件,几行配置,生产代码零影响

    demo 视频: https://github.com/user-attachments/assets/15e14439-8a14-4054-80b0-f07ccbcea1b1

    在线 demo: https://stackblitz.com/github/erweixin/i18nflow/tree/main/playground/react-kiwi-rspack?file=src/App.tsx

    GitHub: https://github.com/erweixin/i18nflow 欢迎 Star 、提 Issue 和 PR !


    有类似痛点的朋友欢迎试用反馈,也欢迎大家提建议~

    针对 kiwi-intl 在 rspack/vite 中使用已经生产 ready 。

    react-i18next 在 nextjs/rspack 中使用也已经进入测试阶段。

    后续会陆续接入其他 i18n 库和不同的打包工具。

    11 条回复    2025-11-20 15:15:48 +08:00
    nzm
        1
    nzm  
       7 天前
    期待支持更多 i18n 库
    zhmouV2
        2
    zhmouV2  
       7 天前
    你好 demo 视频链接 404 了
    22092
        3
    22092  
       7 天前
    在线 DEMO 看到的是 :

    1.修改后要 reload 整页

    2.重置 button 不是重置到上一个更改,只是 reset 当前输入变更

    3.Ctrl/Cmd + Shift 点击页面文案会有选取效果,影响视觉

    更关注 {count} 字串插值, 表达式
    weixind
        5
    weixind  
    OP
       7 天前
    @22092

    感谢反馈。

    1. 修改后改成走 HMR 。
    2. 这个我再想想。
    3. 我觉得改成类似 devtool 以后 hover 到某个节点高亮的交互会好一些。

    最近会改动 1 、3 。

    普通单层 {count} 字串插值和表达式是支持的。可以参考这个 demo:https://stackblitz.com/github/erweixin/i18nflow/tree/main/playground/react-i18next-rspack

    多层嵌套的情况还不支持,例如以下写法:

    t('userForm.errors.required', { field: t('userForm.confirmPassword')})
    hoodjannn
        6
    hoodjannn  
       7 天前
    几年前有这个需求。现在我都是直接拿好审核后的 json 翻译,然后丢给 claude code 直接改就好了,不看多语言
    unco020511
        7
    unco020511  
       7 天前   1
    可以,对于我来说有一些价值,已 star
    22092
        8
    22092  
       6 天前
    我知道 i18next 是支持的,期望的是在 UI ,否则这个 UI 感觉作用不大,现在是翻译人员检验并不是传统的翻译工作,传统的翻译已交给 AI 了
    22092
        9
    22092  
       6 天前
    注重校对方面更有利发展,所以 editor, git history 不可少的
    penzi
        10
    penzi  
       5 天前
    上下文缺失:翻译人员只看到 Excel 里的文字,不知道在哪用

    例如"序号",在表格标题和列表序号应该用不同英文,但翻译人员无法区分


    你们需要的是给每个 string 加一个 comment, 这才是正经需要多语言的公司在用的标准流程
    weixind
        11
    weixind  
    OP
       5 天前
    @penzi 感谢分享
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1050 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 23:05 PVG 07:05 LAX 15:05 JFK 18:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86