feat: init i18n

This commit is contained in:
CalciumIon
2024-12-12 23:32:55 +08:00
parent 16599a900b
commit cd21aa1c56
6 changed files with 1270 additions and 1 deletions

View File

@@ -23,7 +23,10 @@
"react-turnstile": "^1.0.5",
"semantic-ui-offline": "^2.5.0",
"semantic-ui-react": "^2.1.3",
"sse": "github:mpetazzoni/sse.js"
"sse": "github:mpetazzoni/sse.js",
"i18next": "^23.16.8",
"react-i18next": "^13.0.0",
"i18next-browser-languagedetector": "^7.2.0"
},
"scripts": {
"dev": "vite",

58
web/pnpm-lock.yaml generated
View File

@@ -32,6 +32,12 @@ importers:
history:
specifier: ^5.3.0
version: 5.3.0
i18next:
specifier: ^23.16.8
version: 23.16.8
i18next-browser-languagedetector:
specifier: ^7.2.0
version: 7.2.2
marked:
specifier: ^4.1.1
version: 4.3.0
@@ -47,6 +53,9 @@ importers:
react-fireworks:
specifier: ^1.0.4
version: 1.0.4
react-i18next:
specifier: ^13.0.0
version: 13.5.0(i18next@23.16.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-router-dom:
specifier: ^6.3.0
version: 6.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -1071,6 +1080,15 @@ packages:
history@5.3.0:
resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==}
html-parse-stringify@3.0.1:
resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==}
i18next-browser-languagedetector@7.2.2:
resolution: {integrity: sha512-6b7r75uIJDWCcCflmbof+sJ94k9UQO4X0YR62oUfqGI/GjCLVzlCwu8TFdRZIqVLzWbzNcmkmhfqKEr4TLz4HQ==}
i18next@23.16.8:
resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==}
iconv-lite@0.4.24:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.0'}
@@ -1487,6 +1505,19 @@ packages:
react-fireworks@1.0.4:
resolution: {integrity: sha512-jj1a+HTicB4pR6g2lqhVyAox0GTE0TOrZK2XaJFRYOwltgQWeYErZxnvU9+zH/blY+Hpmu9IKyb39OD3KcCMJw==}
react-i18next@13.5.0:
resolution: {integrity: sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==}
peerDependencies:
i18next: '>= 23.2.3'
react: '>= 16.8.0'
react-dom: '*'
react-native: '*'
peerDependenciesMeta:
react-dom:
optional: true
react-native:
optional: true
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
@@ -1812,6 +1843,10 @@ packages:
terser:
optional: true
void-elements@3.1.0:
resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==}
engines: {node: '>=0.10.0'}
warning@4.0.3:
resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==}
@@ -2935,6 +2970,18 @@ snapshots:
dependencies:
'@babel/runtime': 7.26.0
html-parse-stringify@3.0.1:
dependencies:
void-elements: 3.1.0
i18next-browser-languagedetector@7.2.2:
dependencies:
'@babel/runtime': 7.26.0
i18next@23.16.8:
dependencies:
'@babel/runtime': 7.26.0
iconv-lite@0.4.24:
dependencies:
safer-buffer: 2.1.2
@@ -3611,6 +3658,15 @@ snapshots:
react-fireworks@1.0.4: {}
react-i18next@13.5.0(i18next@23.16.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@babel/runtime': 7.26.0
html-parse-stringify: 3.0.1
i18next: 23.16.8
react: 18.3.1
optionalDependencies:
react-dom: 18.3.1(react@18.3.1)
react-is@16.13.1: {}
react-is@18.3.1: {}
@@ -3998,6 +4054,8 @@ snapshots:
optionalDependencies:
fsevents: 2.3.3
void-elements@3.1.0: {}
warning@4.0.3:
dependencies:
loose-envify: 1.4.0

22
web/src/i18n/i18n.js Normal file
View File

@@ -0,0 +1,22 @@
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
import enTranslation from './locales/en.json';
i18n
.use(LanguageDetector)
.use(initReactI18next)
.init({
resources: {
en: {
translation: enTranslation
}
},
fallbackLng: 'en',
interpolation: {
escapeValue: false
}
});
export default i18n;

1183
web/src/i18n/locales/en.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -15,6 +15,7 @@ import { ThemeProvider } from './context/Theme';
import FooterBar from './components/Footer';
import { StyleProvider } from './context/Style/index.js';
import PageLayout from './components/PageLayout.js';
import './i18n/i18n.js';
// initialization

View File

@@ -26,6 +26,7 @@ export default defineConfig({
esbuildOptions: {
loader: {
'.js': 'jsx',
'.json': 'json',
},
},
},
@@ -45,6 +46,7 @@ export default defineConfig({
'react-toastify',
'react-turnstile',
],
'i18n': ['i18next', 'react-i18next', 'i18next-browser-languagedetector'],
},
},
},