FckSignups 的国际化(i18n)改造指南:如何支持多语言
【免费下载链接】FckSignupsA list of tools that are open-source, in-browser, and require no-signups!项目地址: https://gitcode.com/GitHub_Trending/fc/FckSignups
FckSignups(现已更名 NoSignups)是一个基于 React + TypeScript 的开源「免注册工具目录」,收录了 200+ 个无需注册、开箱即用的在线工具。本文将带你完成 FckSignups 的国际化(i18n)改造,学会为这类纯前端 React 项目快速接入多语言支持的完整流程,从盘点文案到落地语言切换器,全程只需改动少量文件。
为什么 FckSignups 值得做国际化?
FckSignups 的定位是「浏览器里直接可用的开源工具导航」,天然面向全球用户。但目前所有界面文案都硬编码为英文,例如:
- 页头的
SUBMIT A TOOL按钮和TOOLS LOADED统计 - 搜索框占位符
Search tools by name, tag, or description... - 分区标题
Featured、Editor's Picks、Meets Criteria
把这些英文常量收敛进语言包,就能用一套代码同时服务中文、日文等用户 👇
技术栈提示:项目使用 React 19 + Vite 构建,依赖非常精简,见 package.json。纯前端 SPA 的 i18n 不需要服务端支持,改造成本很低。
第一步:盘点需要翻译的文案位置
国际化改造的第一件事不是写代码,而是「抓文案」。打开以下文件,把硬编码字符串列成清单:
| 文案类型 | 位置 | 典型字符串 |
|---|---|---|
| 品牌标语、统计信息 | Header.tsx | TOOLS LOADED、CATEGORIES |
| 搜索与筛选 | ToolFilters.tsx | SHOWING 03 OF 210 TOOLS |
| 页脚三栏 | Footer.tsx | About、Contribute、Legal |
| 弹窗表单(提交/举报/建议) | ModalConfigs.tsx | 字段标签与 placeholder |
| 分区标题、空状态、加载与错误提示 | Tools.tsx | NO MATCHES FOUND、ERR_LOAD_FAILED |
| 工具卡片徽章 | ToolCard.tsx | Featured、New、Abandoned |
| 加载更多按钮 | ShowMoreButton.tsx | X more tools meet the criteria |
| 悬浮反馈入口 | ReportFloatingWidget.tsx | REPORT AN ENTRY |
| 分类名称与描述 | tools.json | 分类name、工具description |
💡 小技巧:在编辑器里全局搜索
" 开头的 JSX 文本和placeholder=、title=、aria-label=`,能一次性捞出大部分遗漏文案。
第二步:选择轻量级 i18n 方案
对 FckSignups 这种静态站点,无需重型框架。推荐按项目规模二选一:
- JSON 语言包 + React Context(推荐):零新依赖,两个 JSON 文件 + 一个 Provider 即可;
- react-intl / react-i18next:自带复数、插值、日期格式化能力,适合文案复杂或后续要接入翻译平台的项目。
无论选哪种,目录结构建议保持一致:
src/locales/ ├── en.json └── zh-CN.jsonen.json直接把现有英文文案搬进去,zh-CN.json逐条翻译,用「点路径」命名便于维护:
{ "header": { "submitTool": "SUBMIT A TOOL", "toolsLoaded": "TOOLS LOADED", "categories": "CATEGORIES" }, "filters": { "searchPlaceholder": "按名称、标签或描述搜索工具...", "showing": "显示 {shown} / {total} 个工具" } }第三步:封装 i18n 上下文并替换硬编码文案
在项目现有的 hooks 目录 旁新建useI18n钩子,通过 React Context 向下传递当前语言,对外只暴露一个t(key)函数:
// 用法示意 const { t } = useI18n(); return <button onClick={...}>{t("header.submitTool")}</button>;然后把组件里的英文常量逐个替换。以 Header.tsx 为例,改动前后对比:
// 改造前 SUBMIT A TOOL // 改造后 {t("header.submitTool")}几个容易踩的坑:
- 数字补零逻辑:统计文案里的
String(toolCount).padStart(3, "0")属于展示逻辑,翻译时把数字当作变量插值,不要把"007 TOOLS LOADED"整体写死; - 品牌 glitch 特效:Header.tsx 中
data-text="NO"属性驱动 CSS 特效,中文环境下品牌名可保留英文,避免破坏特效; - 弹窗配置是数据不是 JSX:ModalConfigs.tsx 里的
label、placeholder、options是纯数据,最简单的方式是在语言包里按modal.submitTool.fields.category.productivity这类路径存译文,渲染时再查表。
第四步:为 tools.json 数据做多语言化
分类名称(Productivity、Privacy等)直接来自 tools.json。两种处理方式:
| 方案 | 做法 | 适合场景 |
|---|---|---|
按id映射 | 语言包里维护categories.productivity等键,渲染时按分类 ID 查译文 | 分类少、变动小(✅ 推荐) |
| 数据内嵌多语言 | 给name扩展为name: { en, zh }结构,并同步修改 schema.js 校验 | 工具数量大、需要社区协作翻译 |
工具的name、description属于第三方项目内容,建议保留原文,只在 UI 层提供翻译入口,避免每次同步数据都重翻一遍。
第五步:添加语言切换器
在 Header 组件 的统计区旁增加一个切换按钮(如 🌐 EN / 中文):
- 点击后写入
localStorage(如i18n.locale); - 首次访问时用
navigator.language做默认值回退; - 切换时同步更新
document.documentElement.lang,保证屏幕阅读器与 SEO 正确。
语言状态建议挂在 App.tsx 的 Provider 层级,与现有的ModalProvider、ReportProvider并列,这样所有弹窗和组件都能拿到t()。
第六步:同步 SEO 层面的多语言
FckSignups 的静态描述由 src/data/schema.js 输出。做多语言时建议:
- 在 index.html 中给
<html>加上动态lang属性; - 为每个语言版本输出独立的
hreflang标注或独立路径(如/zh/),让搜索引擎区分语言; - 让
schema.js的description跟随当前语言渲染。
改造验收清单 ✅
- 全站无残留硬编码英文(可用正则
>[A-Z]{3,}快速排查 JSX 文本) - 语言切换后刷新页面仍保持所选语言(持久化生效)
- 数字插值正确:
007 TOOLS LOADED在中文下显示已加载 007 个工具 - 空搜索结果、加载失败、Toast 提示三类状态文案均已翻译
document.documentElement.lang随切换更新
常见问题 FAQ
Q:新手第一次做 i18n,从哪里开始动手?先做第二步的文案清单,再选「JSON + Context」方案。FckSignups 的界面文案集中在 8 个组件文件内,一个下午可以完成核心替换。
Q:工具描述等数据内容要翻译吗?不必。第三方工具的description属于数据,保留原文即可,重点翻译 UI 框架文案。
Q:需要重新部署吗?需要。语言包是构建期打包进前端的,改完后执行npm run build重新部署即可,无需任何后端改动。
📌 想亲手试试?克隆仓库开始改造:
git clone https://gitcode.com/GitHub_Trending/fc/FckSignups cd FckSignups && npm install && npm run dev照本文六步走,你就能让 FckSignups 目录用母语向全世界展示「免注册工具导航」的魅力。
【免费下载链接】FckSignupsA list of tools that are open-source, in-browser, and require no-signups!项目地址: https://gitcode.com/GitHub_Trending/fc/FckSignups
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考