my-gradio-app / i18n /multilingual_handler.py
Nguyen Trong Lap
Recreate history without binary blobs
eeb0f9c
"""
Multilingual Handler
Handles language detection and response translation
"""
from typing import Optional, Dict, Any
from .language_detector import Language, LanguageDetector
from .translations import Translations, t
class MultilingualHandler:
"""Handle multilingual conversations"""
def __init__(self):
self.detector = LanguageDetector()
self.user_languages = {} # user_id -> preferred language
def detect_and_set_language(self, user_id: str, message: str) -> Language:
"""
Detect language from message and set user preference
Args:
user_id: User identifier
message: User's message
Returns:
Detected language
"""
language = self.detector.detect(message)
self.user_languages[user_id] = language
return language
def get_user_language(self, user_id: str) -> Language:
"""
Get user's preferred language
Args:
user_id: User identifier
Returns:
User's language (default: Vietnamese)
"""
return self.user_languages.get(user_id, Language.VIETNAMESE)
def set_user_language(self, user_id: str, language: Language) -> None:
"""
Manually set user's language
Args:
user_id: User identifier
language: Preferred language
"""
self.user_languages[user_id] = language
def get_agent_system_prompt(self, agent_type: str, language: Language) -> str:
"""
Get agent system prompt in user's language
Args:
agent_type: Type of agent
language: Target language
Returns:
System prompt
"""
return Translations.get_agent_prompt(agent_type, language)
def translate_message(self, key: str, language: Language, **kwargs) -> str:
"""
Translate a message key
Args:
key: Translation key
language: Target language
**kwargs: Format arguments
Returns:
Translated message
"""
return t(key, language, **kwargs)
def format_response_with_language(
self,
response: str,
language: Language,
add_language_note: bool = False
) -> str:
"""
Format response with language-specific additions
Args:
response: Original response
language: Target language
add_language_note: Add note about language detection
Returns:
Formatted response
"""
if add_language_note:
if language == Language.ENGLISH:
note = "\n\n_Note: I detected you're using English. You can switch to Vietnamese anytime._"
else:
note = "\n\n_Lưu ý: Tôi phát hiện bạn đang dùng tiếng Việt. Bạn có thể chuyển sang tiếng Anh bất cứ lúc nào._"
return response + note
return response
def get_language_stats(self) -> Dict[str, Any]:
"""
Get statistics about language usage
Returns:
Language statistics
"""
total_users = len(self.user_languages)
if total_users == 0:
return {
'total_users': 0,
'vietnamese_users': 0,
'english_users': 0,
'vietnamese_percentage': 0.0,
'english_percentage': 0.0
}
vietnamese_count = sum(1 for lang in self.user_languages.values() if lang == Language.VIETNAMESE)
english_count = sum(1 for lang in self.user_languages.values() if lang == Language.ENGLISH)
return {
'total_users': total_users,
'vietnamese_users': vietnamese_count,
'english_users': english_count,
'vietnamese_percentage': round(vietnamese_count / total_users * 100, 1),
'english_percentage': round(english_count / total_users * 100, 1)
}
# Global instance
_multilingual_handler = None
def get_multilingual_handler() -> MultilingualHandler:
"""Get global multilingual handler instance"""
global _multilingual_handler
if _multilingual_handler is None:
_multilingual_handler = MultilingualHandler()
return _multilingual_handler