refactor: update language resource loading to use dynamic imports and async functions

pull/22810/head
twwu 7 months ago
parent 9b4c69486a
commit 153093be0f

@ -1,13 +1,19 @@
'use client' 'use client'
import { resources } from '@/i18n/i18next-config' import { loadLangResources } from '@/i18n/i18next-config'
import { useEffect, useState } from 'react' import { useCallback, useEffect, useState } from 'react'
import cn from '@/utils/classnames' import cn from '@/utils/classnames'
import { LanguagesSupported } from '@/i18n/language'
export default function I18nTest() { export default function I18nTest() {
const [langs, setLangs] = useState<Lang[]>([]) const [langs, setLangs] = useState<Lang[]>([])
const getLangs = useCallback(async () => {
const langs = await genLangs()
setLangs(langs)
}, [])
useEffect(() => { useEffect(() => {
setLangs(genLangs()) getLangs()
}, []) }, [])
return ( return (
@ -107,10 +113,15 @@ export default function I18nTest() {
) )
} }
function genLangs() { async function genLangs() {
const langs_: Lang[] = [] const langs_: Lang[] = []
let en!: Lang let en!: Lang
const resources: Record<string, any> = {}
// Initialize empty resource object
for (const lang of LanguagesSupported)
resources[lang] = await loadLangResources(lang)
for (const [key, value] of Object.entries(resources)) { for (const [key, value] of Object.entries(resources)) {
const keys = getNestedKeys(value.translation) const keys = getNestedKeys(value.translation)
const lang: Lang = { const lang: Lang = {

@ -2,71 +2,59 @@
import i18n from 'i18next' import i18n from 'i18next'
import { initReactI18next } from 'react-i18next' import { initReactI18next } from 'react-i18next'
import { LanguagesSupported } from '@/i18n/language' const requireSilent = async (lang: string) => {
const requireSilent = (lang: string) => {
let res let res
try { try {
res = require(`./${lang}/education`).default res = (await import(`./${lang}/education`)).default
} }
catch { catch {
res = require('./en-US/education').default res = (await import('./en-US/education')).default
} }
return res return res
} }
const loadLangResources = (lang: string) => ({ export const loadLangResources = async (lang: string) => ({
translation: { translation: {
common: require(`./${lang}/common`).default, common: (await import(`./${lang}/common`)).default,
layout: require(`./${lang}/layout`).default, layout: (await import(`./${lang}/layout`)).default,
login: require(`./${lang}/login`).default, login: (await import(`./${lang}/login`)).default,
register: require(`./${lang}/register`).default, register: (await import(`./${lang}/register`)).default,
app: require(`./${lang}/app`).default, app: (await import(`./${lang}/app`)).default,
appOverview: require(`./${lang}/app-overview`).default, appOverview: (await import(`./${lang}/app-overview`)).default,
appDebug: require(`./${lang}/app-debug`).default, appDebug: (await import(`./${lang}/app-debug`)).default,
appApi: require(`./${lang}/app-api`).default, appApi: (await import(`./${lang}/app-api`)).default,
appLog: require(`./${lang}/app-log`).default, appLog: (await import(`./${lang}/app-log`)).default,
appAnnotation: require(`./${lang}/app-annotation`).default, appAnnotation: (await import(`./${lang}/app-annotation`)).default,
share: require(`./${lang}/share-app`).default, share: (await import(`./${lang}/share-app`)).default,
dataset: require(`./${lang}/dataset`).default, dataset: (await import(`./${lang}/dataset`)).default,
datasetDocuments: require(`./${lang}/dataset-documents`).default, datasetDocuments: (await import(`./${lang}/dataset-documents`)).default,
datasetHitTesting: require(`./${lang}/dataset-hit-testing`).default, datasetHitTesting: (await import(`./${lang}/dataset-hit-testing`)).default,
datasetSettings: require(`./${lang}/dataset-settings`).default, datasetSettings: (await import(`./${lang}/dataset-settings`)).default,
datasetCreation: require(`./${lang}/dataset-creation`).default, datasetCreation: (await import(`./${lang}/dataset-creation`)).default,
explore: require(`./${lang}/explore`).default, explore: (await import(`./${lang}/explore`)).default,
billing: require(`./${lang}/billing`).default, billing: (await import(`./${lang}/billing`)).default,
custom: require(`./${lang}/custom`).default, custom: (await import(`./${lang}/custom`)).default,
tools: require(`./${lang}/tools`).default, tools: (await import(`./${lang}/tools`)).default,
workflow: require(`./${lang}/workflow`).default, workflow: (await import(`./${lang}/workflow`)).default,
runLog: require(`./${lang}/run-log`).default, runLog: (await import(`./${lang}/run-log`)).default,
plugin: require(`./${lang}/plugin`).default, plugin: (await import(`./${lang}/plugin`)).default,
pluginTags: require(`./${lang}/plugin-tags`).default, pluginTags: (await import(`./${lang}/plugin-tags`)).default,
time: require(`./${lang}/time`).default, time: (await import(`./${lang}/time`)).default,
education: requireSilent(lang), education: (await requireSilent(lang)).default,
}, },
}) })
type Resource = Record<string, ReturnType<typeof loadLangResources>>
// Automatically generate the resources object
export const resources = LanguagesSupported.reduce<Resource>((acc, lang) => {
acc[lang] = loadLangResources(lang)
return acc
}, {})
i18n.use(initReactI18next) i18n.use(initReactI18next)
.init({ .init({
lng: undefined, lng: undefined,
fallbackLng: 'en-US', fallbackLng: 'en-US',
resources: {
'en-US': loadLangResources('en-US'),
},
}) })
export const changeLanguage = async (lng?: string) => { export const changeLanguage = async (lng?: string) => {
const resolvedLng = lng ?? 'en-US' const resolvedLng = lng ?? 'en-US'
const resources = { const resources = {
[resolvedLng]: loadLangResources(resolvedLng), [resolvedLng]: await loadLangResources(resolvedLng),
} }
if (!i18n.hasResourceBundle(resolvedLng, 'translation')) if (!i18n.hasResourceBundle(resolvedLng, 'translation'))
i18n.addResourceBundle(resolvedLng, 'translation', resources[resolvedLng].translation, true, true) i18n.addResourceBundle(resolvedLng, 'translation', resources[resolvedLng].translation, true, true)

Loading…
Cancel
Save