feat(i18n): Implement server-side internationalization support

- Added ServerI18nManager to handle translations and locale settings on the server.
- Integrated server-side translations into templates, reducing language flashing on initial load.
- Created API endpoints for setting and getting user language preferences.
- Enhanced client-side i18n handling to work seamlessly with server-rendered content.
- Updated various templates to utilize the new translation system.
- Added mixed i18n handler to coordinate server and client translations, improving user experience.
- Expanded translation files to include initialization messages for various components.
This commit is contained in:
Will Miao
2025-08-30 16:56:56 +08:00
parent 3c9e402bc0
commit 29160bd6e5
14 changed files with 775 additions and 42 deletions

View File

@@ -112,6 +112,10 @@ class MiscRoutes:
# Add new route for checking if a model exists in the library
app.router.add_get('/api/check-model-exists', MiscRoutes.check_model_exists)
# Language settings endpoints
app.router.add_post('/api/set-language', MiscRoutes.set_language)
app.router.add_get('/api/get-language', MiscRoutes.get_language)
@staticmethod
async def clear_cache(request):
@@ -697,3 +701,69 @@ class MiscRoutes:
'success': False,
'error': str(e)
}, status=500)
@staticmethod
async def set_language(request):
"""
Set user language preference
Expects a JSON body with:
{
"language": "en" | "zh-CN" | "zh-TW" | "ru" | "de" | "ja" | "ko" | "fr" | "es"
}
"""
try:
data = await request.json()
language = data.get('language')
if not language:
return web.json_response({
'success': False,
'error': 'Missing language parameter'
}, status=400)
# Validate language code
supported_languages = ['en', 'zh-CN', 'zh-TW', 'ru', 'de', 'ja', 'ko', 'fr', 'es']
if language not in supported_languages:
return web.json_response({
'success': False,
'error': f'Unsupported language: {language}. Supported languages: {", ".join(supported_languages)}'
}, status=400)
# Save language setting
settings.set('language', language)
return web.json_response({
'success': True,
'message': f'Language set to {language}',
'language': language
})
except Exception as e:
logger.error(f"Failed to set language: {e}", exc_info=True)
return web.json_response({
'success': False,
'error': str(e)
}, status=500)
@staticmethod
async def get_language(request):
"""
Get current user language preference
Returns the current language setting from settings
"""
try:
current_language = settings.get('language', 'en')
return web.json_response({
'success': True,
'language': current_language
})
except Exception as e:
logger.error(f"Failed to get language: {e}", exc_info=True)
return web.json_response({
'success': False,
'error': str(e)
}, status=500)