project-nomad/admin/inertia/app/app.tsx
Claude a8f6fe353b feat(i18n): Add internationalization support with English and Chinese
- Add i18next, react-i18next, and i18next-browser-languagedetector
- Create i18n configuration with language detection
- Add English (en) and Chinese (zh) translation files
- Create LanguageSwitcher component for runtime language switching
- Integrate i18n initialization in app.tsx

Translation keys organized by section:
- common: Common UI elements
- home: Dashboard/home page
- menu: Navigation menu items
- maps: Maps feature
- chat: AI chat feature
- settings: Settings pages
- system: System settings
- apps: App management
- models: AI models
- easySetup: Setup wizard
- docs: Documentation
- about: About page
- errors: Error pages

Co-Authored-By: Claude <noreply@anthropic.com>
2026-04-04 10:24:25 +08:00

62 lines
2.1 KiB
TypeScript

/// <reference path="../../adonisrc.ts" />
/// <reference path="../../config/inertia.ts" />
import '../css/app.css'
import { createRoot } from 'react-dom/client'
import { createInertiaApp } from '@inertiajs/react'
import { resolvePageComponent } from '@adonisjs/inertia/helpers'
import ModalsProvider from '~/providers/ModalProvider'
import { TransmitProvider } from 'react-adonis-transmit'
import { generateUUID } from '~/lib/util'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
import NotificationsProvider from '~/providers/NotificationProvider'
import { ThemeProvider } from '~/providers/ThemeProvider'
import { UsePageProps } from '../../types/system'
import '../i18n'
const appName = import.meta.env.VITE_APP_NAME || 'Project N.O.M.A.D.'
const queryClient = new QueryClient()
// Patch the global crypto object for non-HTTPS/localhost contexts
if (!window.crypto?.randomUUID) {
// @ts-ignore
if (!window.crypto) window.crypto = {}
// @ts-ignore
window.crypto.randomUUID = generateUUID
}
createInertiaApp({
progress: { color: '#424420' },
title: (title) => `${title} - ${appName}`,
resolve: (name) => {
return resolvePageComponent(`../pages/${name}.tsx`, import.meta.glob('../pages/**/*.tsx'))
},
setup({ el, App, props }) {
const environment = (props.initialPage.props as unknown as UsePageProps).environment
const showDevtools = ['development', 'staging'].includes(environment)
createRoot(el).render(
<QueryClientProvider client={queryClient}>
<ThemeProvider>
<TransmitProvider
baseUrl={window.location.origin}
enableLogging={environment === 'development'}
>
<NotificationsProvider>
<ModalsProvider>
<App {...props} />
{showDevtools && (
<ReactQueryDevtools initialIsOpen={false} buttonPosition="bottom-left" />
)}
</ModalsProvider>
</NotificationsProvider>
</TransmitProvider>
</ThemeProvider>
</QueryClientProvider>
)
},
})