FckSignups 的国际化(i18n)改造指南:如何支持多语言
2026/9/17 2:29:29 网站建设 项目流程

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...
  • 分区标题FeaturedEditor's PicksMeets Criteria

把这些英文常量收敛进语言包,就能用一套代码同时服务中文、日文等用户 👇

技术栈提示:项目使用 React 19 + Vite 构建,依赖非常精简,见 package.json。纯前端 SPA 的 i18n 不需要服务端支持,改造成本很低。

第一步:盘点需要翻译的文案位置

国际化改造的第一件事不是写代码,而是「抓文案」。打开以下文件,把硬编码字符串列成清单:

文案类型位置典型字符串
品牌标语、统计信息Header.tsxTOOLS LOADEDCATEGORIES
搜索与筛选ToolFilters.tsxSHOWING 03 OF 210 TOOLS
页脚三栏Footer.tsxAboutContributeLegal
弹窗表单(提交/举报/建议)ModalConfigs.tsx字段标签与 placeholder
分区标题、空状态、加载与错误提示Tools.tsxNO MATCHES FOUNDERR_LOAD_FAILED
工具卡片徽章ToolCard.tsxFeaturedNewAbandoned
加载更多按钮ShowMoreButton.tsxX more tools meet the criteria
悬浮反馈入口ReportFloatingWidget.tsxREPORT AN ENTRY
分类名称与描述tools.json分类name、工具description

💡 小技巧:在编辑器里全局搜索" 开头的 JSX 文本和placeholder=title=aria-label=`,能一次性捞出大部分遗漏文案。

第二步:选择轻量级 i18n 方案

对 FckSignups 这种静态站点,无需重型框架。推荐按项目规模二选一:

  1. JSON 语言包 + React Context(推荐):零新依赖,两个 JSON 文件 + 一个 Provider 即可;
  2. react-intl / react-i18next:自带复数、插值、日期格式化能力,适合文案复杂或后续要接入翻译平台的项目。

无论选哪种,目录结构建议保持一致:

src/locales/ ├── en.json └── zh-CN.json

en.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 里的labelplaceholderoptions是纯数据,最简单的方式是在语言包里按modal.submitTool.fields.category.productivity这类路径存译文,渲染时再查表。

第四步:为 tools.json 数据做多语言化

分类名称(ProductivityPrivacy等)直接来自 tools.json。两种处理方式:

方案做法适合场景
id映射语言包里维护categories.productivity等键,渲染时按分类 ID 查译文分类少、变动小(✅ 推荐)
数据内嵌多语言name扩展为name: { en, zh }结构,并同步修改 schema.js 校验工具数量大、需要社区协作翻译

工具的namedescription属于第三方项目内容,建议保留原文,只在 UI 层提供翻译入口,避免每次同步数据都重翻一遍。

第五步:添加语言切换器

在 Header 组件 的统计区旁增加一个切换按钮(如 🌐 EN / 中文):

  1. 点击后写入localStorage(如i18n.locale);
  2. 首次访问时用navigator.language做默认值回退;
  3. 切换时同步更新document.documentElement.lang,保证屏幕阅读器与 SEO 正确。

语言状态建议挂在 App.tsx 的 Provider 层级,与现有的ModalProviderReportProvider并列,这样所有弹窗和组件都能拿到t()

第六步:同步 SEO 层面的多语言

FckSignups 的静态描述由 src/data/schema.js 输出。做多语言时建议:

  • 在 index.html 中给<html>加上动态lang属性;
  • 为每个语言版本输出独立的hreflang标注或独立路径(如/zh/),让搜索引擎区分语言;
  • schema.jsdescription跟随当前语言渲染。

改造验收清单 ✅

  • 全站无残留硬编码英文(可用正则>[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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询