目录
1. 设计理念2. 语言支持2.1 支持的语言列表2.2 语言代码设计3. 核心函数解析3.1 获取翻译器 get_translator()3.2 语言获取 get_locale_from_request()3.3 中间件 i18n_middleware()4. 使用示例4.1 模板中使用4.2 代码中使用5. 目录结构6. 性能优化7. 最佳实践8.结语1. 设计理念
本项目的国际化(Internationalization)解决方案基于Python的gettext模块,提供了一个灵活、可扩展的多语言支持系统。
2. 语言支持
2.1 支持的语言列表
项目支持超过35种语言,包括:
中文(简体、繁体)英语印度语系(印地语、旁遮普语等)东南亚语言欧洲语言非洲语言2.2 语言代码设计
采用标准的语言代码格式,如:
zh_Hans:简体中文zh_Hant:繁体中文en:英语3. 核心函数解析
3.1 获取翻译器 get_translator()
@lru_cache(maxsize=None)def get_translator(locale: str): return gettext.translation( 'messages', localedir=os.path.join(os.path.dirname(__file__), 'locales'), languages=[locale], fallback=True )
使用@lru_cache缓存翻译器实例,提高性能
从locales目录加载翻译文件
支持语言回退机制
3.2 语言获取 get_locale_from_request()
def get_locale_from_request(request: Request) -> str: locale = ( request.query_params.get('lang') or request.cookies.get('locale') or request.headers.get('accept-language', 'en')[:2] ) if locale not in SUPPORTED_LANGUAGES: locale = 'en' # 默认使用英语 return locale
语言获取优先级:
URL查询参数Cookie浏览器语言头默认英语3.3 中间件 i18n_middleware()
def i18n_middleware(get_locale: Callable[[Request], str]): async def middleware(request: Request, call_next): locale = get_locale(request) translator = get_translator(locale) request.state.locale = locale request.state.gettext = translator.gettext request.state.supported_languages = SUPPORTED_LANGUAGES response = await call_next(request) return response return middleware
中间件功能:
设置请求的语言环境注入翻译函数gettext提供支持的语言列表4. 使用示例
4.1 模板中使用
# 在Jinja2模板中{{ _('welcome_message') }}
4.2 代码中使用
def some_function(request): # 使用请求中的翻译函数 welcome_text = request.state.gettext('welcome_message')
5. 目录结构
locales/
├── en/
│ └── LC_MESSAGES/
│ └── messages.po
├── zh_Hans/
│ └── LC_MESSAGES/
│ └── messages.po
└── zh_Hant/
└── LC_MESSAGES/
└── messages.po
6. 性能优化
使用@lru_cache缓存翻译器
支持惰性加载翻译文件
提供语言回退机制
7. 最佳实践
使用标准化的语言代码
提供完善的语言回退
支持动态语言切换
8.结语
这个国际化方案提供了一个灵活、高效的多语言支持机制,能够满足复杂Web应用的本地化需求。
关键技术:
Python gettext
FastAPI中间件
LRU缓存
语言环境检测