国际化
官网用 URL 语言前缀 决定语言,而不是浏览器语言或 localStorage。
路由约定
- 支持:
zh(默认)、en - 首页:
/zh、/en - 内部链接使用
<LocalizedLink to="Activity">(src/lib/LocalizedLink.jsx),会自动加上当前 locale - 切换语言:Navbar「中 | EN」,或
useLocale().switchLocale('en')
mailto: 与 http(s): 链接不会被加上 locale 前缀。
命名空间
在 src/i18n/index.js 注册,中英各一份 JSON:
| 命名空间 | 文件 | 用途 |
|---|---|---|
common | common.json | 页脚、document.title、无障碍文案 |
nav | nav.json | 导航与下拉项 |
home | home.json | 首页 |
activity | activity.json | 活动 |
about | about.json | 关于与部门 |
resources | resources.json | 资源 |
honor | honor.json | 荣誉墙界面文案 |
partnership | partnership.json | 合作页界面文案 |
荣誉墙/合作伙伴的条目数据仍在页面旁 JSON,不一定走 i18n 命名空间。
在组件中使用
import { useTranslation } from 'react-i18next';
const { t } = useTranslation('activity');
return <h1>{t('title')}</h1>;
嵌套 key 用点号,例如 t('activityItems.xinChunJiaNianHua')。
添加或修改翻译
- 在
src/locales/zh/<namespace>.json与src/locales/en/<namespace>.json写入同一 key。 - 组件里
useTranslation('该命名空间')。 - 新增命名空间时:创建中英 JSON → 在
src/i18n/index.jsimport→ 写入resources.zh/resources.en。
漏注册命名空间时,t('...') 会原样显示 key。
不翻译政策
以下保持原文:
- BUCSSA、CSSA、BU
- 人名、邮箱
- 外部 URL、PDF 文件名
活动详情、部门详情页正文保持中文,但路由必须在 /en/ 下可访问(切换语言不能 404)。列表页、导航、页脚应提供英文。
LanguageSwitcher
src/components/LanguageSwitcher.jsx 调用 switchLocale,只改路径中的 locale 段并保留 search/hash。不要在切换时手动 i18n.changeLanguage——MainLayout 已根据 URL 同步。