Python實(shí)現(xiàn)Web應(yīng)用國(guó)際化i18n的示例詳解
1. 設(shè)計(jì)理念
本項(xiàng)目的國(guó)際化(Internationalization)解決方案基于Python的gettext模塊,提供了一個(gè)靈活、可擴(kuò)展的多語(yǔ)言支持系統(tǒng)。
2. 語(yǔ)言支持
2.1 支持的語(yǔ)言列表
項(xiàng)目支持超過35種語(yǔ)言,包括:
- 中文(簡(jiǎn)體、繁體)
- 英語(yǔ)
- 印度語(yǔ)系(印地語(yǔ)、旁遮普語(yǔ)等)
- 東南亞語(yǔ)言
- 歐洲語(yǔ)言
- 非洲語(yǔ)言
2.2 語(yǔ)言代碼設(shè)計(jì)
采用標(biāo)準(zhǔn)的語(yǔ)言代碼格式,如:
- zh_Hans:簡(jiǎn)體中文
- zh_Hant:繁體中文
- en:英語(yǔ)
3. 核心函數(shù)解析
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緩存翻譯器實(shí)例,提高性能
從locales目錄加載翻譯文件
支持語(yǔ)言回退機(jī)制
3.2 語(yǔ)言獲取 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' # 默認(rèn)使用英語(yǔ) return locale
語(yǔ)言獲取優(yōu)先級(jí):
- URL查詢參數(shù)
- Cookie
- 瀏覽器語(yǔ)言頭
- 默認(rèn)英語(yǔ)
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
中間件功能:
- 設(shè)置請(qǐng)求的語(yǔ)言環(huán)境
- 注入翻譯函數(shù)gettext
- 提供支持的語(yǔ)言列表
4. 使用示例
4.1 模板中使用
# 在Jinja2模板中 {{ _('welcome_message') }}
4.2 代碼中使用
def some_function(request): # 使用請(qǐng)求中的翻譯函數(shù) welcome_text = request.state.gettext('welcome_message')
5. 目錄結(jié)構(gòu)
locales/
├── en/
│ └── LC_MESSAGES/
│ └── messages.po
├── zh_Hans/
│ └── LC_MESSAGES/
│ └── messages.po
└── zh_Hant/
└── LC_MESSAGES/
└── messages.po
6. 性能優(yōu)化
使用@lru_cache緩存翻譯器
支持惰性加載翻譯文件
提供語(yǔ)言回退機(jī)制
7. 最佳實(shí)踐
使用標(biāo)準(zhǔn)化的語(yǔ)言代碼
提供完善的語(yǔ)言回退
支持動(dòng)態(tài)語(yǔ)言切換
8.結(jié)語(yǔ)
這個(gè)國(guó)際化方案提供了一個(gè)靈活、高效的多語(yǔ)言支持機(jī)制,能夠滿足復(fù)雜Web應(yīng)用的本地化需求。
關(guān)鍵技術(shù):
Python gettext
FastAPI中間件
LRU緩存
語(yǔ)言環(huán)境檢測(cè)
到此這篇關(guān)于Python實(shí)現(xiàn)Web應(yīng)用國(guó)際化i18n的示例詳解的文章就介紹到這了,更多相關(guān)Python國(guó)際化i18n內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 多維切片之冒號(hào)和三個(gè)點(diǎn)的用法介紹
下面小編就為大家分享一篇python 多維切片之冒號(hào)和三個(gè)點(diǎn)的用法介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04如何在windows下安裝Pycham2020軟件(方法步驟詳解)
這篇文章主要介紹了在windows下安裝Pycham2020軟件方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05python虛擬機(jī)之描述器實(shí)現(xiàn)原理與源碼分析
在本篇文章當(dāng)中主要給大家介紹描述器背后的實(shí)現(xiàn)原理,通過分析?cpython對(duì)應(yīng)的源代碼了解與描述器相關(guān)的字節(jié)碼的指令,我們就可以真正了解到描述器背后的原理,需要的朋友可以參考下2023-05-05Python實(shí)現(xiàn)byte轉(zhuǎn)integer
這篇文章主要介紹了Python實(shí)現(xiàn)byte轉(zhuǎn)integer操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06python-docx讀取模板文檔并填充數(shù)據(jù)
python-docx?是開源的一個(gè)?Python?庫(kù),用于讀取、創(chuàng)建和更新Microsoft?Word?2007+(.docx)文件,下面我們就來看看如何利用python-docx讀取模板文檔并填充數(shù)據(jù)吧2024-11-11django rest framework之請(qǐng)求與響應(yīng)(詳解)
下面小編就為大家?guī)硪黄猟jango rest framework之請(qǐng)求與響應(yīng)(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望對(duì)大家有所幫助2017-11-11