Files
Charon/frontend/src/i18n.ts
GitHub Actions 4f1637c115 fix: crowdsec bouncer auto-registration and translation loading
CrowdSec LAPI authentication and UI translations now work correctly:

Backend:
- Implemented automatic bouncer registration on LAPI startup
- Added health check polling with 30s timeout before registration
- Priority order: env var → file → auto-generated key
- Logs banner warning when environment key is rejected by LAPI
- Saves bouncer key to /app/data/crowdsec/bouncer_key with secure permissions
- Fixed 6 golangci-lint issues (errcheck, gosec G301/G304/G306)

Frontend:
- Fixed translation keys displaying as literal strings
- Added ready checks to prevent rendering before i18n loads
- Implemented password-style masking for API keys with eye toggle
- Added 8 missing translation keys for CrowdSec console enrollment and audit logs
- Enhanced type safety with null guards for key status

The Cerberus security dashboard now activates successfully with proper
bouncer authentication and fully localized UI text.

Resolves: #609
2026-02-04 09:44:26 +00:00

37 lines
1.3 KiB
TypeScript

import i18n from 'i18next'
import { initReactI18next } from 'react-i18next'
import LanguageDetector from 'i18next-browser-languagedetector'
import enTranslation from './locales/en/translation.json'
import esTranslation from './locales/es/translation.json'
import frTranslation from './locales/fr/translation.json'
import deTranslation from './locales/de/translation.json'
import zhTranslation from './locales/zh/translation.json'
const resources = {
en: { translation: enTranslation },
es: { translation: esTranslation },
fr: { translation: frTranslation },
de: { translation: deTranslation },
zh: { translation: zhTranslation },
}
i18n
.use(LanguageDetector) // Detect user language
.use(initReactI18next) // Pass i18n instance to react-i18next
.init({
resources,
fallbackLng: 'en', // Fallback to English if translation not found
debug: false, // Debug mode disabled (enable temporarily for troubleshooting)
interpolation: {
escapeValue: false, // React already escapes values
},
detection: {
order: ['localStorage', 'navigator'], // Check localStorage first, then browser language
caches: ['localStorage'], // Cache language selection in localStorage
lookupLocalStorage: 'charon-language', // Key for storing language in localStorage
},
})
export default i18n