最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python使用fastapi實現(xiàn)多語言國際化的操作指南

 更新時間:2025年02月21日 09:44:13   作者:老大白菜  
本文介紹了使用Python和FastAPI實現(xiàn)多語言國際化的操作指南,包括多語言架構(gòu)技術(shù)棧、翻譯管理、前端本地化、語言切換機制以及常見陷阱和最佳實踐,需要的朋友可以參考下

多語言國際化實現(xiàn)指南

項目多語言架構(gòu)

技術(shù)棧

  • 翻譯管理:SQLAlchemy
  • 翻譯生成:Babel & Baidu Translate API
  • 前端本地化:Jinja2 國際化擴展
  • 轉(zhuǎn)換工具:OpenCC (簡繁轉(zhuǎn)換)

目錄結(jié)構(gòu)

web/
├── locales/                # 語言資源目錄
│   ├── zh/                 # 中文(簡體)
│   ├── cht/                # 中文(繁體)
│   ├── en/                 # 英文
│   └── ...                 # 其他語言
├── scripts/
│   └── generate_po.py      # 翻譯文件生成腳本
└── utils/
    └── baidutran.py        # 百度翻譯工具
    └── chinesetw.py  # 中文轉(zhuǎn)換工具

翻譯工作流

1. 翻譯數(shù)據(jù)存儲

數(shù)據(jù)庫 translations 表結(jié)構(gòu):

  • msgid:原始文本(中文)
  • msgstr:翻譯文本
  • lang_code:語言代碼

2. 翻譯生成腳本 generate_po.py

主要功能

  • 從數(shù)據(jù)庫獲取原始翻譯文本
  • 使用百度翻譯 API 自動翻譯
  • 生成 .po 文件
  • 支持指定語言或全量生成

使用方法

# 生成所有語言翻譯
python generate_po.py

# 生成特定語言翻譯
python generate_po.py en

3. 前端本地化 Jinja2

模板使用

<!-- 使用 _() 函數(shù)進行文本本地化 -->
<span>{{ _('用戶名') }}</span>

4. 語言切換機制

路由處理

@router.get("/change_language")
def change_language(request: Request, lang: str):
    # 設(shè)置語言 Cookie 或 Session
    request.session['lang'] = lang

HTML 本地化實現(xiàn)

1. 基本本地化語法

在 HTML 模板中,使用 {{ _('文本') }} 進行文本本地化。

示例:用戶資料頁面 profile.html

<div class="info-item">
    <span class="info-label"> {{ _('賬號類型') }} :</span>
    <span>
        {{ _('管理員') if user.is_admin else _('普通用戶') }}
    </span>
</div>
<div class="info-item">
    <span class="info-label"> {{ _('性別') }} :</span>
    <span>
        {{ _('男') if user.sex == '1' else _('女') if user.sex == '0' else user.sex}}
    </span>
</div>

2. 條件本地化

可以在條件語句中使用本地化函數(shù),如上例所示。

3. 消息頁面本地化 message.html

<form action="" method="">
    <div class="mb-3">
        <input type="hidden" name="id" id="id" value="0">
        <label for="content" class="form-label">{{ _('詢價') }} </label>
        <textarea class="form-control" id="content" name="content" rows="3" required></textarea>
    </div>
    <button type="button" class="btn btn-primary">{{ _('提交') }} </button>
</form>

4. JavaScript 本地化

在 JavaScript 中,可以通過服務(wù)端渲染的方式傳遞本地化文本。

示例:消息頁面 JS 本地化

$(function(){
    $('.btn-primary').on('click', function(e) {
        $.ajax({
            url:'/addcomment',
            type: 'POST',
            data: form.serialize(),
            success: function(data) {
                if (data.status === 'success') {
                    location.reload();
                } else {
                    // 使用服務(wù)端傳遞的本地化錯誤消息
                    errorDiv.text(data.message);
                }
            }
        });
    });
});

5. 本地化最佳實踐

  • 始終使用 _() 函數(shù)包裹需要翻譯的文本
  • 避免在 JavaScript 中硬編碼文本
  • 使用服務(wù)端渲染傳遞本地化文本
  • 為復(fù)雜的文本提供上下文注釋

6. 常見陷阱

  • 不要本地化 URL、路徑等技術(shù)性文本
  • 注意保持 HTML 結(jié)構(gòu)的一致性
  • 考慮不同語言的文本長度變化

百度翻譯工具

功能概述

baidu_translate() 是一個強大的翻譯函數(shù),提供以下核心功能:

  • 調(diào)用百度翻譯 API 進行文本翻譯
  • 支持多種語言互相轉(zhuǎn)換
  • 內(nèi)置錯誤處理和安全機制

實現(xiàn)代碼

def baidu_translate(query, from_lang='zh', to_lang='en'):
    """調(diào)用百度翻譯API進行翻譯"""
    # 安全檢查:跳過特定類型的文本
    if re.match(r'^/?https?://.+\.(jpg|png|jpeg|gif|bmp|mp3|wav|ogg|mp4|avi|mov|wmv|flv|mkv)$', query):
        return query
    elif re.match(r'^\d{1,11}@[\w.-]{2,30}\.[\w.-]{2,10}$', query):
        return query
    
    # 生成百度翻譯所需的簽名
    salt = random.randint(32768, 65536)
    sign_str = f"{app_id}{query}{salt}{secret_key}"
    sign = hashlib.md5(sign_str.encode('utf-8')).hexdigest()
    
    # 調(diào)用翻譯 API
    params = {
        'q': query,
        'from': from_lang,
        'to': to_lang,
        'appid': app_id,
        'salt': salt,
        'sign': sign
    }

使用場景

1. 基本翻譯

# 中文翻譯到英文
english_text = baidu_translate("國際婚姻網(wǎng)", from_lang='zh', to_lang='en')
# 結(jié)果: "International Marriage Network"

# 英文翻譯到中文
chinese_text = baidu_translate("Hello World", from_lang='en', to_lang='zh')
# 結(jié)果: "你好,世界"

2. 多語言支持

# 支持多種語言轉(zhuǎn)換
japanese_text = baidu_translate("你好", from_lang='zh', to_lang='jp')
french_text = baidu_translate("Hello", from_lang='en', to_lang='fra')

安全與性能特性

安全機制

  1. 輸入驗證:跳過文件路徑、郵箱等特定格式文本
  2. 簽名生成:防止未授權(quán)調(diào)用
  3. 錯誤處理:詳細的錯誤碼映射

錯誤碼映射

error_map = {
    '52003': '未授權(quán)用戶',
    '54000': '必填參數(shù)為空',
    '54001': '簽名錯誤',
    '54003': '訪問頻率受限',
    '54004': '賬戶余額不足',
    '54005': '長query請求頻繁',
    '58000': '客戶端IP非法',
    '58001': '譯文語言方向不支持'
}

配置與依賴

環(huán)境變量

# .env 文件配置
BAIDU_TRANS_APPID=your_app_id
BAIDU_TRANS_SECRET_KEY=your_secret_key
BAIDU_TRANS_HOST=https://fanyi-api.baidu.com/api/trans/vip/translate

依賴庫

  • requests:發(fā)送 HTTP 請求
  • hashlib:生成 MD5 簽名
  • python-dotenv:加載環(huán)境變量

最佳實踐

  1. 緩存翻譯結(jié)果:對于重復(fù)翻譯,考慮使用緩存
  2. 限制翻譯頻率:避免超過 API 調(diào)用限制
  3. 處理長文本:分段翻譯大段文本
  4. 備用翻譯方案:準備替代翻譯服務(wù)

注意事項

  • API 調(diào)用有頻率和額度限制
  • 翻譯質(zhì)量取決于百度翻譯 API
  • 敏感或?qū)I(yè)文本需人工校對
  • 保護 API 密鑰安全

替代方案

  1. Google Translate API
  2. DeepL 翻譯 API
  3. 本地翻譯字典
  4. 人工翻譯服務(wù)

中文轉(zhuǎn)換工具

ChineseConverter 工具類

功能概述

ChineseConverter 是一個強大的中文文本轉(zhuǎn)換工具,提供以下核心功能:

  • 簡體中文 ↔ 繁體中文互轉(zhuǎn)
  • 中文文本轉(zhuǎn)拼音
  • 多種拼音樣式支持

實現(xiàn)代碼

class ChineseConverter:
    def __init__(self):
        self.s2t = OpenCC('s2t')  # 簡體到繁體
        self.t2s = OpenCC('t2s')  # 繁體到簡體

    def to_traditional(self, text: str) -> str:
        """將簡體中文轉(zhuǎn)換為繁體中文"""
        return self.s2t.convert(text)

    def to_simplified(self, text: str) -> str:
        """將繁體中文轉(zhuǎn)換為簡體中文"""
        return self.t2s.convert(text)

    def to_pinyin(self, text: str, style=Style.NORMAL) -> list:
        """
        將中文轉(zhuǎn)換為拼音
        支持多種拼音樣式
        """
        return pinyin(text, style=style)

    def to_pinyin_str(self, text: str, separator=' ', style=Style.NORMAL) -> str:
        """將中文轉(zhuǎn)換為拼音字符串"""
        py_list = self.to_pinyin(text, style=style)
        return separator.join([''.join(p) for p in py_list])

拼音樣式選項

Style.NORMAL:普通風(fēng)格,不帶聲調(diào)

converter.to_pinyin_str("國際婚姻網(wǎng)")
# 輸出: guo ji hun yin wang

Style.TONE:帶聲調(diào)的拼音

converter.to_pinyin_str("國際婚姻網(wǎng)", style=Style.TONE)
# 輸出: guó jì hūn yìn wǎng

Style.TONE2:數(shù)字聲調(diào)

converter.to_pinyin_str("國際婚姻網(wǎng)", style=Style.TONE2)
# 輸出: guo2 ji4 hun1 yin4 wang3

Style.FIRST_LETTER:首字母

converter.to_pinyin_str("國際婚姻網(wǎng)", style=Style.FIRST_LETTER, separator='')
# 輸出: gjhyw

使用場景

1. 簡繁轉(zhuǎn)換

# 簡體轉(zhuǎn)繁體
traditional_text = converter.to_traditional("國際婚姻網(wǎng)")
# 結(jié)果: 國際婚姻網(wǎng)

# 繁體轉(zhuǎn)簡體
simplified_text = converter.to_simplified("國際婚姻網(wǎng)")
# 結(jié)果: 國際婚姻網(wǎng)

2. 拼音轉(zhuǎn)換

# 獲取帶聲調(diào)拼音
pinyin_with_tone = converter.to_pinyin_str("國際婚姻網(wǎng)", style=Style.TONE)
# 結(jié)果: guó jì hūn yìn wǎng

性能與依賴

  • 依賴庫

    • opencc:處理簡繁轉(zhuǎn)換
    • pypinyin:處理拼音轉(zhuǎn)換
  • 性能特點

    • 輕量級轉(zhuǎn)換
    • 無需調(diào)用外部 API
    • 轉(zhuǎn)換速度快
    • 內(nèi)存占用低

最佳實踐

全局單例模式

# 推薦創(chuàng)建全局轉(zhuǎn)換器實例
converter = ChineseConverter()
  1. 避免重復(fù)創(chuàng)建轉(zhuǎn)換器實例

  2. 選擇合適的拼音樣式

  3. 處理特殊字符和非中文文本

注意事項

  • 部分生僻字可能轉(zhuǎn)換不準確
  • 不支持方言轉(zhuǎn)換
  • 僅支持簡體和繁體中文

替代方案

  • 對于大規(guī)模、高精度轉(zhuǎn)換,考慮專業(yè)翻譯服務(wù)
  • 對于特定領(lǐng)域術(shù)語,建議人工校對

翻譯數(shù)據(jù)模型

數(shù)據(jù)庫表結(jié)構(gòu) translations

class Translation(Base):
    __tablename__ = 'translations'
    
    # 主鍵
    id = Column(Integer, primary_key=True, autoincrement=True)
    
    # 原始文本標識符
    msgid = Column(String(255), nullable=False)
    
    # 翻譯后的文本
    msgstr = Column(String(255), nullable=False)
    
    # 語言代碼
    lang_code = Column(String(10), nullable=False)
    
    # 創(chuàng)建時間戳
    created_at = Column(DateTime, server_default=func.now())
    
    # 最后更新時間戳
    updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now())

    # 唯一約束:確保每個 msgid 在特定語言中只有一個翻譯
    __table_args__ = (
        UniqueConstraint('msgid', 'lang_code', name='unique_translation'),
    )

字段詳解

  1. id

    • 主鍵,自增
    • 唯一標識每條翻譯記錄
  2. msgid

    • 原始文本標識符
    • 通常為中文(源語言)文本
    • 最大長度 255 字符
  3. msgstr

    • 翻譯后的文本
    • 對應(yīng)特定語言的翻譯結(jié)果
    • 最大長度 255 字符
  4. lang_code

    • 語言代碼(如 ‘zh’, ‘en’, ‘cht’)
    • 標識翻譯的目標語言
  5. created_at

    • 記錄創(chuàng)建時間
    • 使用數(shù)據(jù)庫服務(wù)器默認時間
  6. updated_at

    • 最后更新時間
    • 自動更新,記錄翻譯修改時間

唯一約束

  • UniqueConstraint('msgid', 'lang_code', name='unique_translation')
  • 確保每個文本在特定語言中只有一個翻譯
  • 防止重復(fù)翻譯和數(shù)據(jù)冗余

使用場景示例

# 創(chuàng)建新翻譯
new_translation = Translation(
    msgid='用戶名',
    msgstr='Username',
    lang_code='en'
)
db.add(new_translation)
db.commit()

# 查詢特定語言翻譯
english_translations = db.query(Translation).filter_by(lang_code='en').all()

最佳實踐

  1. 保持 msgid 的一致性
  2. 及時更新 updated_at 時間戳
  3. 定期清理過時或無效的翻譯記錄
  4. 為長文本考慮使用 Text 類型而非 String

翻譯管理最佳實踐

1. 翻譯質(zhì)量控制

  • 使用人工審核機制
  • 建立翻譯記錄日志
  • 定期更新翻譯緩存

2. 性能優(yōu)化

  • 緩存翻譯結(jié)果
  • 異步翻譯處理
  • 限制單次翻譯數(shù)量

擴展性建議

1. 支持更多語言

  • 在 language_version 表中添加新語言
  • 更新 generate_po.py 支持新語言

2. 人工翻譯集成

  • 開發(fā)人工翻譯審核界面
  • 允許管理員修改自動翻譯結(jié)果

故障排查

常見問題

  1. 翻譯 API 調(diào)用失敗

    • 檢查網(wǎng)絡(luò)連接
    • 驗證 API 配額
    • 使用備用翻譯服務(wù)
  2. 本地化顯示異常

    • 確認 .po 文件生成正確
    • 檢查語言環(huán)境設(shè)置
    • 驗證 Jinja2 本地化配置

PO 文件生成腳本 generate_po.py

腳本功能概述

generate_po.py 是一個自動化翻譯文件生成工具,提供以下核心功能:

  • 從數(shù)據(jù)庫獲取原始翻譯文本
  • 使用百度翻譯 API 自動生成翻譯
  • 創(chuàng)建 .po 格式的本地化文件
  • 支持全量或指定語言翻譯

主要實現(xiàn)邏輯

def generate_translations(output_dir='locales', specific_lang=None):
    """
    生成翻譯文件
    
    Args:
        output_dir (str): 輸出目錄
        specific_lang (str, optional): 指定語言代碼
    """
    # 獲取中文(簡體)基礎(chǔ)翻譯
    zh_translations = generator.get_translations('zh')
    
    # 確定要生成的語言
    if specific_lang:
        other_langs = [specific_lang]
    else:
        other_langs = generator.get_available_languages()

    # 為每種語言生成翻譯文件
    for lang_code in other_langs:
        # 創(chuàng)建語言目錄
        lang_dir = os.path.join(output_dir, lang_code, 'LC_MESSAGES')
        os.makedirs(lang_dir, exist_ok=True)
        
        # 生成 .po 文件
        with open(os.path.join(lang_dir, 'messages.po'), 'w') as f:
            # 寫入文件頭
            # 寫入翻譯條目
            for zh_trans in zh_translations:
                # 使用百度翻譯 API 翻譯
                msgstr = baidu_translate(zh_trans['msgid'], from_lang='zh', to_lang=lang_code)
                
                # 寫入翻譯條目
                f.write(f'msgid "{zh_trans["msgid"]}"\n')
                f.write(f'msgstr "{msgstr}"\n')

### 語言提示保存在表里
DROP TABLE IF EXISTS translations;
CREATE TABLE translations (
id int NOT NULL AUTO_INCREMENT,
msgid varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
msgstr varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
lang_code varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP,
updated_at timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id) USING BTREE,
UNIQUE INDEX unique_translation(msgid ASC, lang_code ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 32 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
INSERT INTO translations VALUES (1, ‘首頁', ‘首頁', ‘zh', ‘2025-02-15 13:50:35', ‘2025-02-15 13:53:03');
INSERT INTO translations VALUES (2, ‘分類', ‘分類', ‘zh', ‘2025-02-15 13:50:35', ‘2025-02-15 13:53:03');
INSERT INTO translations VALUES (3, ‘標簽', ‘標簽', ‘zh', ‘2025-02-15 13:50:35', ‘2025-02-15 13:53:03');
INSERT INTO translations VALUES (4, ‘關(guān)于', ‘關(guān)于', ‘zh', ‘2025-02-15 13:50:35', ‘2025-02-15 13:53:03');
INSERT INTO translations VALUES (5, ‘個人資料', ‘個人資料', ‘zh', ‘2025-02-15 13:50:35', ‘2025-02-15 13:53:03');
#中文
msgid “郵件驗證”
msgstr “郵件驗證”

msgid “郵箱”
msgstr “郵箱”

msgid “郵編”
msgstr “郵編”

msgid “閱讀更多”
msgstr “閱讀更多”

msgid “首頁”
msgstr “閱讀更多”

msgid “驗證碼”
msgstr “驗證碼”
msgid “郵件驗證”
msgstr “Email Verification”

msgid “郵箱”
msgstr “Email Box”

msgid “郵編”
msgstr “Postal Code”

msgid “閱讀更多”
msgstr “Read More”

msgid “首頁”
msgstr “Home Page”

msgid “驗證碼”
msgstr “Verification Code”

以上就是python使用fastapi實現(xiàn)多語言國際化的操作指南的詳細內(nèi)容,更多關(guān)于python fastapi多語言國際化的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python如何實現(xiàn)wifi自動連接,解決電腦wifi經(jīng)常斷開問題

    python如何實現(xiàn)wifi自動連接,解決電腦wifi經(jīng)常斷開問題

    這篇文章主要介紹了python實現(xiàn)wifi自動連接,解決電腦wifi經(jīng)常斷開的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Python3.10新特性之match語句示例詳解

    Python3.10新特性之match語句示例詳解

    這篇文章主要為大家介紹了Python3.10新特性之match語句示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Pycharm在指定目錄下生成文件和刪除文件的實現(xiàn)

    Pycharm在指定目錄下生成文件和刪除文件的實現(xiàn)

    這篇文章主要介紹了Pycharm在指定目錄下生成文件和刪除文件的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • python 刪除列表里所有空格項的方法總結(jié)

    python 刪除列表里所有空格項的方法總結(jié)

    下面小編就為大家分享一篇python 刪除列表里所有空格項的方法總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • 一文帶你玩轉(zhuǎn)Python中的倒排索引

    一文帶你玩轉(zhuǎn)Python中的倒排索引

    倒排索引是一種索引機制,廣泛應(yīng)用于信息檢索和數(shù)據(jù)庫系統(tǒng)中,本文主要為大家介紹了Python中倒排索引的原理與實戰(zhàn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • python爬取淘寶商品銷量信息

    python爬取淘寶商品銷量信息

    這篇文章主要為大家詳細介紹了python爬取淘寶商品的銷量信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Django學(xué)習(xí)筆記之ORM基礎(chǔ)教程

    Django學(xué)習(xí)筆記之ORM基礎(chǔ)教程

    ORM,即Object-Relational Mapping(對象關(guān)系映射),它的作用是在關(guān)系型數(shù)據(jù)庫和業(yè)務(wù)實體對象之間作一個映射,下面這篇文章主要給大家介紹了關(guān)于Django學(xué)習(xí)筆記之ORM基礎(chǔ)教程的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-03-03
  • 分享一下Python數(shù)據(jù)分析常用的8款工具

    分享一下Python數(shù)據(jù)分析常用的8款工具

    Python是數(shù)據(jù)處理常用工具,可以處理數(shù)量級從幾K至幾T不等的數(shù)據(jù),具有較高的開發(fā)效率和可維護性,還具有較強的通用性和跨平臺性,這里就為大家分享幾個不錯的數(shù)據(jù)分析工具,需要的朋友可以參考下
    2018-04-04
  • Python元類編程之動態(tài)創(chuàng)建類的實戰(zhàn)案例

    Python元類編程之動態(tài)創(chuàng)建類的實戰(zhàn)案例

    python是一門動態(tài)的語言,動態(tài)語言的精髓在于可以在運行期間,創(chuàng)建類,通過類創(chuàng)建對象,進而通過對象調(diào)用方法和屬性,這篇文章主要介紹了Python元類編程之動態(tài)創(chuàng)建類的相關(guān)資料,需要的朋友可以參考下
    2026-01-01
  • 基于python實現(xiàn)地址和經(jīng)緯度轉(zhuǎn)換

    基于python實現(xiàn)地址和經(jīng)緯度轉(zhuǎn)換

    這篇文章主要介紹了基于python實現(xiàn)地址和經(jīng)緯度轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05

最新評論

嘉峪关市| 大化| 洮南市| 云南省| 浮山县| 临猗县| 长宁区| 安福县| 保康县| 临清市| 牙克石市| 凌海市| 张家口市| 吉木乃县| 福贡县| 永州市| 平泉县| 仁怀市| 澄江县| 泸西县| 南城县| 临潭县| 洮南市| 张北县| 定兴县| 任丘市| 贵德县| 曲阳县| 合水县| 吕梁市| 平谷区| 平山县| 平和县| 阳谷县| 大庆市| 确山县| 怀仁县| 合川市| 丁青县| 家居| 灌云县|