欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

項目多語言架構

技術棧

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

目錄結構

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

翻譯工作流

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

數(shù)據(jù)庫 translations 表結構:

  • 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):
    # 設置語言 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 中,可以通過服務端渲染的方式傳遞本地化文本。

示例:消息頁面 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 {
                    // 使用服務端傳遞的本地化錯誤消息
                    errorDiv.text(data.message);
                }
            }
        });
    });
});

5. 本地化最佳實踐

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

6. 常見陷阱

  • 不要本地化 URL、路徑等技術性文本
  • 注意保持 HTML 結構的一致性
  • 考慮不同語言的文本長度變化

百度翻譯工具

功能概述

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

  • 調(diào)用百度翻譯 API 進行文本翻譯
  • 支持多種語言互相轉換
  • 內(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')
# 結果: "International Marriage Network"

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

2. 多語言支持

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

安全與性能特性

安全機制

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

錯誤碼映射

error_map = {
    '52003': '未授權用戶',
    '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. 緩存翻譯結果:對于重復翻譯,考慮使用緩存
  2. 限制翻譯頻率:避免超過 API 調(diào)用限制
  3. 處理長文本:分段翻譯大段文本
  4. 備用翻譯方案:準備替代翻譯服務

注意事項

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

替代方案

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

中文轉換工具

ChineseConverter 工具類

功能概述

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

  • 簡體中文 ↔ 繁體中文互轉
  • 中文文本轉拼音
  • 多種拼音樣式支持

實現(xiàn)代碼

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

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

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

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

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

拼音樣式選項

Style.NORMAL:普通風格,不帶聲調(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. 簡繁轉換

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

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

2. 拼音轉換

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

性能與依賴

  • 依賴庫

    • opencc:處理簡繁轉換
    • pypinyin:處理拼音轉換
  • 性能特點

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

最佳實踐

全局單例模式

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

  2. 選擇合適的拼音樣式

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

注意事項

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

替代方案

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

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

數(shù)據(jù)庫表結構 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

    • 翻譯后的文本
    • 對應特定語言的翻譯結果
    • 最大長度 255 字符
  4. lang_code

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

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

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

唯一約束

  • UniqueConstraint('msgid', 'lang_code', name='unique_translation')
  • 確保每個文本在特定語言中只有一個翻譯
  • 防止重復翻譯和數(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. 翻譯質量控制

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

2. 性能優(yōu)化

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

擴展性建議

1. 支持更多語言

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

2. 人工翻譯集成

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

故障排查

常見問題

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

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

    • 確認 .po 文件生成正確
    • 檢查語言環(huán)境設置
    • 驗證 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): 指定語言代碼
    """
    # 獲取中文(簡體)基礎翻譯
    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, ‘關于', ‘關于', ‘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)容,更多關于python fastapi多語言國際化的資料請關注腳本之家其它相關文章!

相關文章

  • 詳解Python是如何處理不同時區(qū)的

    詳解Python是如何處理不同時區(qū)的

    時區(qū)是指在地球上不同地方的時間差異,地球分為?24?個時區(qū),每個時區(qū)都相對于格林威治標準時間或協(xié)調(diào)世界時(UTC)有所偏移。本文主要和大家來聊聊Python是如何處理不同時區(qū)的,希望對大家有所幫助
    2023-02-02
  • python實現(xiàn)簡單的飛機大戰(zhàn)

    python實現(xiàn)簡單的飛機大戰(zhàn)

    這篇文章主要為大家詳細介紹了python實現(xiàn)簡單的飛機大戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 探討python??pandas.DataFrame.to_json?函數(shù)

    探討python??pandas.DataFrame.to_json?函數(shù)

    這篇文章主要介紹了python??pandas.DataFrame.to_json?函數(shù)示例詳解,to_json?函數(shù)提供了靈活的參數(shù)設置,使得?pandas?數(shù)據(jù)框能夠以多種格式導出為?JSON?文件,需要的朋友可以參考下
    2024-07-07
  • Django+zTree構建組織架構樹的方法

    Django+zTree構建組織架構樹的方法

    zTree是一個開源的依靠JQuery實現(xiàn)的多功能樹插件,具有性能優(yōu)異、配置靈活、功能強大的特點,這篇文章主要介紹了Django+zTree構建組織架構樹,需要的朋友可以參考下
    2019-08-08
  • pytorch模型的保存加載與續(xù)訓練詳解

    pytorch模型的保存加載與續(xù)訓練詳解

    這篇文章主要為大家介紹了pytorch模型的保存加載與續(xù)訓練詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • python 多線程重啟方法

    python 多線程重啟方法

    今天小編就為大家分享一篇python 多線程重啟方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • pycharm社區(qū)版安裝node.js插件運行js代碼方法

    pycharm社區(qū)版安裝node.js插件運行js代碼方法

    PyCharm可以說是當今最流行的一款Python IDE了,下面這篇文章主要給大家介紹了關于pycharm社區(qū)版安裝node.js插件運行js代碼的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • Pytorch mask-rcnn 實現(xiàn)細節(jié)分享

    Pytorch mask-rcnn 實現(xiàn)細節(jié)分享

    這篇文章主要介紹了Pytorch mask-rcnn 實現(xiàn)細節(jié)分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python中幾個比較常見的名詞解釋

    Python中幾個比較常見的名詞解釋

    這篇文章主要介紹了Python中幾個比較常見的名詞解釋,本文解釋同樣適應其它編程語言,本文講解了循環(huán)、迭代、遞歸、遍歷等名詞的含義,需要的朋友可以參考下
    2015-07-07
  • 在Mac OS上搭建Python的開發(fā)環(huán)境

    在Mac OS上搭建Python的開發(fā)環(huán)境

    這篇文章主要介紹了在Mac OS上搭建Apache服務器和Python解釋器的開發(fā)環(huán)境,雖然Mac OS上自帶Python但往往難以滿足開發(fā)者對版本的需求,需要的朋友可以參考下
    2015-12-12

最新評論