diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3d55ccf..0ba6904 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -135,8 +135,8 @@ importers: specifier: ^3.3.4 version: 3.3.4(react-hook-form@7.51.1(react@18.2.0)) '@i18next-toolkit/react': - specifier: ^1.1.0 - version: 1.1.0(@types/react@18.2.78)(buffer@6.0.3)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: 2.0.0-rc.5 + version: 2.0.0-rc.5(@types/react@18.2.78)(buffer@6.0.3)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@loadable/component': specifier: ^5.16.3 version: 5.16.3(react@18.2.0) @@ -2251,8 +2251,14 @@ packages: '@i18next-toolkit/extractor@1.1.0': resolution: {integrity: sha512-USq83a1XKKCRGqlaKBoNRuCImD1IDFCHMgDHs9686v3IpZ2wQdj/e11+cPaGX1UIjndZKULdQq4b0aZJyMrBfg==} - '@i18next-toolkit/react@1.1.0': - resolution: {integrity: sha512-S9HFkBwCukCwRR18P4yhskzoBJwIJ2W182GQ9u5H69Guj3Sg4Lm0ghGk7VVALS4z3XmQNcJBzA+LWmLB2X5hIQ==} + '@i18next-toolkit/react-core@1.1.0': + resolution: {integrity: sha512-PkuBaIY8jLS0QKy1sjj0g0XAC7zLIDM8ckI5VZGY3feiCPjV6ZdFsuC3cJJwRH+LgOCTj49LurhBii5UXGBlVQ==} + peerDependencies: + '@types/react': ^18.2.55 + react: ^18.2.0 + + '@i18next-toolkit/react@2.0.0-rc.5': + resolution: {integrity: sha512-ZiQaLwS3jnYgFrotDTPbcF74Wbs0JNw0DDouuY+qNegUt5QxLBf/sCymQsglt9C9u2KOU+2CjS3ZP5NWlRknOg==} peerDependencies: '@types/react': ^18.2.55 react: ^18.2.0 @@ -2433,24 +2439,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@14.1.3': resolution: {integrity: sha512-esk1RkRBLSIEp1qaQXv1+s6ZdYzuVCnDAZySpa62iFTMGTisCyNQmqyCTL9P+cLJ4N9FKCI3ojtSfsyPHJDQNw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@14.1.3': resolution: {integrity: sha512-8uOgRlYEYiKo0L8YGeS+3TudHVDWDjPVDUcST+z+dUzgBbTEwSSIaSgF/vkcC1T/iwl4QX9iuUyUdQEl0Kxalg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@14.1.3': resolution: {integrity: sha512-DX2zqz05ziElLoxskgHasaJBREC5Y9TJcbR2LYqu4r7naff25B4iXkfXWfcp69uD75/0URmmoSgT8JclJtrBoQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@14.1.3': resolution: {integrity: sha512-HjssFsCdsD4GHstXSQxsi2l70F/5FsRTRQp8xNgmQs15SxUfUJRvSI9qKny/jLkY3gLgiCR3+6A7wzzK0DBlfA==} @@ -3335,6 +3345,7 @@ packages: resolution: {integrity: sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-gnueabihf@4.9.5': resolution: {integrity: sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==} @@ -3345,66 +3356,79 @@ packages: resolution: {integrity: sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.19.1': resolution: {integrity: sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-gnu@4.9.5': resolution: {integrity: sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.19.1': resolution: {integrity: sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-musl@4.9.5': resolution: {integrity: sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-powerpc64le-gnu@4.19.1': resolution: {integrity: sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.19.1': resolution: {integrity: sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.9.5': resolution: {integrity: sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.19.1': resolution: {integrity: sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.19.1': resolution: {integrity: sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.9.5': resolution: {integrity: sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.19.1': resolution: {integrity: sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-linux-x64-musl@4.9.5': resolution: {integrity: sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.19.1': resolution: {integrity: sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA==} @@ -7270,6 +7294,9 @@ packages: humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + i18next-browser-languagedetector@8.0.0: + resolution: {integrity: sha512-zhXdJXTTCoG39QsrOCiOabnWj2jecouOqbchu3EfhtSHxIB5Uugnm9JaizenOy39h7ne3+fLikIjeW88+rgszw==} + i18next-http-backend@2.4.3: resolution: {integrity: sha512-jo2M03O6n1/DNb51WSQ8PsQ0xEELzLZRdYUTbf17mLw3rVwnJF9hwNgMXvEFSxxb+N8dT+o0vtigA6s5mGWyPA==} @@ -15116,14 +15143,25 @@ snapshots: transitivePeerDependencies: - buffer - '@i18next-toolkit/react@1.1.0(@types/react@18.2.78)(buffer@6.0.3)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@i18next-toolkit/react-core@1.1.0(@types/react@18.2.78)(buffer@6.0.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@types/react': 18.2.78 crc: 4.3.2(buffer@6.0.3) i18next: 23.10.0 - i18next-http-backend: 2.4.3(encoding@0.1.13) react: 18.2.0 react-i18next: 14.0.5(i18next@23.10.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + transitivePeerDependencies: + - buffer + - react-dom + - react-native + + '@i18next-toolkit/react@2.0.0-rc.5(@types/react@18.2.78)(buffer@6.0.3)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@i18next-toolkit/react-core': 1.1.0(@types/react@18.2.78)(buffer@6.0.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@types/react': 18.2.78 + i18next-browser-languagedetector: 8.0.0 + i18next-http-backend: 2.4.3(encoding@0.1.13) + react: 18.2.0 transitivePeerDependencies: - buffer - encoding @@ -21738,6 +21776,10 @@ snapshots: dependencies: ms: 2.1.3 + i18next-browser-languagedetector@8.0.0: + dependencies: + '@babel/runtime': 7.24.0 + i18next-http-backend@2.4.3(encoding@0.1.13): dependencies: cross-fetch: 4.0.0(encoding@0.1.13) diff --git a/src/client/components/layout/UserConfig.tsx b/src/client/components/layout/UserConfig.tsx index 18cf8ab..e9179a2 100644 --- a/src/client/components/layout/UserConfig.tsx +++ b/src/client/components/layout/UserConfig.tsx @@ -23,7 +23,7 @@ import { useUserInfo, useUserStore, } from '@/store/user'; -import { languages } from '@/utils/constants'; +import { languages } from '@/utils/i18n'; import { useTranslation, setLanguage } from '@i18next-toolkit/react'; import { useNavigate } from '@tanstack/react-router'; import { version } from '@/utils/env'; diff --git a/src/client/i18next-toolkit.config.cjs b/src/client/i18next-toolkit.config.cjs index 44120c8..6994e15 100644 --- a/src/client/i18next-toolkit.config.cjs +++ b/src/client/i18next-toolkit.config.cjs @@ -1,6 +1,6 @@ /** @type {import('@i18next-toolkit/cli').I18nextToolkitConfig} */ const config = { - locales: ['en', 'zh', 'jp', 'fr', 'de', 'pl', 'pt', 'ru'], + locales: ['en', 'zh-CN', 'ja-JP', 'fr-FR', 'de-DE', 'pl-PL', 'pt-PT', 'ru-RU'], verbose: true, namespaces: ['translation'], translator: { diff --git a/src/client/init.ts b/src/client/init.ts new file mode 100644 index 0000000..f48aa44 --- /dev/null +++ b/src/client/init.ts @@ -0,0 +1,3 @@ +import { initI18N } from './utils/i18n'; + +initI18N(); diff --git a/src/client/main.tsx b/src/client/main.tsx index 19b9f79..d4b05a1 100644 --- a/src/client/main.tsx +++ b/src/client/main.tsx @@ -1,5 +1,6 @@ import './index.css'; import './styles/global.less'; +import './init'; import React from 'react'; import ReactDOM from 'react-dom/client'; diff --git a/src/client/package.json b/src/client/package.json index 27edca9..2b5a3e7 100644 --- a/src/client/package.json +++ b/src/client/package.json @@ -23,7 +23,7 @@ "@bytemd/plugin-gfm": "^1.21.0", "@bytemd/react": "^1.21.0", "@hookform/resolvers": "^3.3.4", - "@i18next-toolkit/react": "^1.1.0", + "@i18next-toolkit/react": "2.0.0-rc.5", "@loadable/component": "^5.16.3", "@monaco-editor/react": "^4.6.0", "@radix-ui/react-alert-dialog": "^1.0.5", diff --git a/src/client/public/locales/de/flag.png b/src/client/public/locales/de-DE/flag.png similarity index 100% rename from src/client/public/locales/de/flag.png rename to src/client/public/locales/de-DE/flag.png diff --git a/src/client/public/locales/de/translation.json b/src/client/public/locales/de-DE/translation.json similarity index 100% rename from src/client/public/locales/de/translation.json rename to src/client/public/locales/de-DE/translation.json diff --git a/src/client/public/locales/fr/flag.png b/src/client/public/locales/fr-FR/flag.png similarity index 100% rename from src/client/public/locales/fr/flag.png rename to src/client/public/locales/fr-FR/flag.png diff --git a/src/client/public/locales/fr/translation.json b/src/client/public/locales/fr-FR/translation.json similarity index 100% rename from src/client/public/locales/fr/translation.json rename to src/client/public/locales/fr-FR/translation.json diff --git a/src/client/public/locales/jp/flag.png b/src/client/public/locales/ja-JP/flag.png similarity index 100% rename from src/client/public/locales/jp/flag.png rename to src/client/public/locales/ja-JP/flag.png diff --git a/src/client/public/locales/jp/translation.json b/src/client/public/locales/ja-JP/translation.json similarity index 100% rename from src/client/public/locales/jp/translation.json rename to src/client/public/locales/ja-JP/translation.json diff --git a/src/client/public/locales/pl/flag.png b/src/client/public/locales/pl-PL/flag.png similarity index 100% rename from src/client/public/locales/pl/flag.png rename to src/client/public/locales/pl-PL/flag.png diff --git a/src/client/public/locales/pl/translation.json b/src/client/public/locales/pl-PL/translation.json similarity index 100% rename from src/client/public/locales/pl/translation.json rename to src/client/public/locales/pl-PL/translation.json diff --git a/src/client/public/locales/pt/flag.png b/src/client/public/locales/pt-PT/flag.png similarity index 100% rename from src/client/public/locales/pt/flag.png rename to src/client/public/locales/pt-PT/flag.png diff --git a/src/client/public/locales/pt/translation.json b/src/client/public/locales/pt-PT/translation.json similarity index 100% rename from src/client/public/locales/pt/translation.json rename to src/client/public/locales/pt-PT/translation.json diff --git a/src/client/public/locales/ru/flag.png b/src/client/public/locales/ru-RU/flag.png similarity index 100% rename from src/client/public/locales/ru/flag.png rename to src/client/public/locales/ru-RU/flag.png diff --git a/src/client/public/locales/ru/translation.json b/src/client/public/locales/ru-RU/translation.json similarity index 100% rename from src/client/public/locales/ru/translation.json rename to src/client/public/locales/ru-RU/translation.json diff --git a/src/client/public/locales/zh/flag.png b/src/client/public/locales/zh-CN/flag.png similarity index 100% rename from src/client/public/locales/zh/flag.png rename to src/client/public/locales/zh-CN/flag.png diff --git a/src/client/public/locales/zh/translation.json b/src/client/public/locales/zh-CN/translation.json similarity index 100% rename from src/client/public/locales/zh/translation.json rename to src/client/public/locales/zh-CN/translation.json diff --git a/src/client/routes/settings/auditLog.tsx b/src/client/routes/settings/auditLog.tsx index a596c7b..e6ff8d6 100644 --- a/src/client/routes/settings/auditLog.tsx +++ b/src/client/routes/settings/auditLog.tsx @@ -2,8 +2,6 @@ import { routeAuthBeforeLoad } from '@/utils/route'; import { createFileRoute } from '@tanstack/react-router'; import { useTranslation } from '@i18next-toolkit/react'; import { CommonWrapper } from '@/components/CommonWrapper'; -import { ScrollArea } from '@/components/ui/scroll-area'; -import { Empty, List } from 'antd'; import { useMemo, useRef } from 'react'; import { defaultErrorHandler, diff --git a/src/client/utils/constants.ts b/src/client/utils/i18n.ts similarity index 51% rename from src/client/utils/constants.ts rename to src/client/utils/i18n.ts index 365dbdc..4479566 100644 --- a/src/client/utils/constants.ts +++ b/src/client/utils/i18n.ts @@ -1,3 +1,5 @@ +import { setupI18nInstance } from '@i18next-toolkit/react'; + export const languages = [ { label: 'English', @@ -5,31 +7,36 @@ export const languages = [ }, { label: 'Deutsch', - key: 'de', + key: 'de-DE', }, { label: 'Français', - key: 'fr', + key: 'fr-FR', }, { label: '日本語', - key: 'jp', + key: 'ja-JP', }, { label: 'Polski', - key: 'pl', + key: 'pl-PL', }, { label: 'Português', - key: 'pt', + key: 'pt-PT', }, { label: 'Русский', - key: 'ru', + key: 'ru-RU', }, - { label: '简体中文', - key: 'zh', + key: 'zh-CN', }, ]; + +export function initI18N() { + setupI18nInstance({ + supportedLngs: languages.map((l) => l.key), + }); +}