refactor: 迁移 i18n 系统从 react-i18next 到 chrome.i18n

- 移除 react-i18next、i18next 及相关依赖
- 删除旧的 i18n/ 目录和 useLazyTranslation 工具
- 新增 utils/chromeI18n.ts 类型安全 wrapper(useI18n Hook + getMessage)
- 生成 public/_locales/{zh,en}/messages.json(298 个翻译 key)
- 批量更新 39+ 组件文件的导入和翻译调用
- 转换翻译键格式:namespace:key → namespace_key
- 修复 ErrorBoundary/PageErrorBoundary 从 withTranslation HOC 改为直接调用 getMessage
- 更新 vitest.setup.ts mock 加载实际翻译文本
- 修复 11 个测试文件的断言以匹配中文翻译
- TypeScript、ESLint、547 项测试全部通过

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
雨霖铃
2026-05-28 19:21:54 +08:00
parent 64e23994a6
commit aa23a263fe
94 changed files with 2987 additions and 1844 deletions
+2 -2
View File
@@ -3,7 +3,7 @@ import { Clock } from 'lucide-react';
import CopyButton from '@/components/CopyButton';
import { useSnackbar } from '@/components/GlobalSnackbar';
import type { UnitType } from './constants';
import { useLazyTranslation } from '@/utils/useLazyTranslation';
import { useI18n } from '@/utils/chromeI18n';
import { cn } from '@/lib/utils'; // 引入标准的 shadcn 工具函数
interface LiveClockProps extends React.HTMLAttributes<HTMLDivElement> {
@@ -12,7 +12,7 @@ interface LiveClockProps extends React.HTMLAttributes<HTMLDivElement> {
}
const LiveClock = React.memo(({ unit, onUseNow, className, ...props }: LiveClockProps) => {
const { t } = useLazyTranslation('timestamp');
const { t } = useI18n('timestamp');
const { showMessage } = useSnackbar();
const onUseNowRef = useRef(onUseNow);
+2 -2
View File
@@ -3,7 +3,7 @@ import dayjs from '@/utils/dayjs';
import CopyButton from '@/components/CopyButton';
import type { UnitType } from './constants';
import { DATE_FORMAT } from './constants';
import { useLazyTranslation } from '@/utils/useLazyTranslation';
import { useI18n } from '@/utils/chromeI18n';
import { cn } from '@/lib/utils'; // shadcn 核心类名合并工具
interface ResultViewProps extends React.HTMLAttributes<HTMLDivElement> {
@@ -25,7 +25,7 @@ const ResultView = React.memo(
className,
...props
}: ResultViewProps) => {
const { t } = useLazyTranslation('timestamp');
const { t } = useI18n('timestamp');
// 严谨计算时间衍生的附加时区/相对时间状态
const extraInfo = useMemo(() => {
+2 -2
View File
@@ -3,7 +3,7 @@ import { ZONES } from './constants';
import LiveClock from './LiveClock';
import ResultView from './ResultView';
import { useTimestampConverter } from './useTimestampConverter';
import { useLazyTranslation } from '@/utils/useLazyTranslation';
import { useI18n } from '@/utils/chromeI18n';
import { cn } from '@/lib/utils';
// 1. 引入标准的 shadcn/ui 原子表单组件(代替原生的原生 Input 和 Select
@@ -17,7 +17,7 @@ import {
} from '@/components/ui/select';
export default function Index() {
const { t } = useLazyTranslation('timestamp');
const { t } = useI18n('timestamp');
// 2. 完美对接全新重构后的统一单源响应式 Hook
const {
+2 -2
View File
@@ -2,7 +2,7 @@ import { useCallback, useMemo, useState } from 'react';
import dayjs from '@/utils/dayjs';
import type { UnitType, ZoneType } from './constants';
import { DATE_FORMAT } from './constants';
import { useLazyTranslation } from '@/utils/useLazyTranslation';
import { useI18n } from '@/utils/chromeI18n';
import { useContextMenuData } from '@/utils/useContextMenuData';
export interface UseTimestampConverterReturn {
@@ -26,7 +26,7 @@ function isTimestampLike(input: string): boolean {
}
export function useTimestampConverter(): UseTimestampConverterReturn {
const { t } = useLazyTranslation('timestamp');
const { t } = useI18n('timestamp');
const [mode, setMode] = useState<'ts2dt' | 'dt2ts'>('ts2dt');
const [unit, setUnit] = useState<UnitType>('ms');
const [zone, setZone] = useState<ZoneType>('Asia/Shanghai');