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

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

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

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

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

技術(shù)棧

  • 翻譯管理:SQLAlchemy
  • 翻譯生成:Babel & Baidu Translate API
  • 前端本地化:Jinja2 國際化擴(kuò)展
  • 轉(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ù)存儲(chǔ)

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

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

2. 翻譯生成腳本 generate_po.py

主要功能

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

使用方法

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

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

3. 前端本地化 Jinja2

模板使用

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

4. 語言切換機(jī)制

路由處理

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

HTML 本地化實(shí)現(xiàn)

1. 基本本地化語法

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

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

<div class="info-item">
    <span class="info-label"> {{ _('賬號(hào)類型') }} :</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">{{ _('詢價(jià)') }} </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ù)端傳遞的本地化錯(cuò)誤消息
                    errorDiv.text(data.message);
                }
            }
        });
    });
});

5. 本地化最佳實(shí)踐

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

6. 常見陷阱

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

百度翻譯工具

功能概述

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

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

實(shí)現(xiàn)代碼

def baidu_translate(query, from_lang='zh', to_lang='en'):
    """調(diào)用百度翻譯API進(jìn)行翻譯"""
    # 安全檢查:跳過特定類型的文本
    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
    }

使用場(chǎng)景

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')

安全與性能特性

安全機(jī)制

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

錯(cuò)誤碼映射

error_map = {
    '52003': '未授權(quán)用戶',
    '54000': '必填參數(shù)為空',
    '54001': '簽名錯(cuò)誤',
    '54003': '訪問頻率受限',
    '54004': '賬戶余額不足',
    '54005': '長query請(qǐng)求頻繁',
    '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 請(qǐng)求
  • hashlib:生成 MD5 簽名
  • python-dotenv:加載環(huán)境變量

最佳實(shí)踐

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

注意事項(xiàng)

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

替代方案

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

中文轉(zhuǎn)換工具

ChineseConverter 工具類

功能概述

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

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

實(shí)現(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])

拼音樣式選項(xiàng)

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

使用場(chǎng)景

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)換
  • 性能特點(diǎn)

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

最佳實(shí)踐

全局單例模式

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

  2. 選擇合適的拼音樣式

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

注意事項(xiàng)

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

替代方案

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

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

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

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

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

字段詳解

  1. id

    • 主鍵,自增
    • 唯一標(biāo)識(shí)每條翻譯記錄
  2. msgid

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

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

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

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

    • 最后更新時(shí)間
    • 自動(dòng)更新,記錄翻譯修改時(shí)間

唯一約束

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

使用場(chǎng)景示例

# 創(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()

最佳實(shí)踐

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

翻譯管理最佳實(shí)踐

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

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

2. 性能優(yōu)化

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

擴(kuò)展性建議

1. 支持更多語言

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

2. 人工翻譯集成

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

故障排查

常見問題

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

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

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

PO 文件生成腳本 generate_po.py

腳本功能概述

generate_po.py 是一個(gè)自動(dòng)化翻譯文件生成工具,提供以下核心功能:

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

主要實(shí)現(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, ‘標(biāo)簽', ‘標(biāo)簽', ‘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, ‘個(gè)人資料', ‘個(gè)人資料', ‘zh', ‘2025-02-15 13:50:35', ‘2025-02-15 13:53:03');
#中文
msgid “郵件驗(yàn)證”
msgstr “郵件驗(yàn)證”

msgid “郵箱”
msgstr “郵箱”

msgid “郵編”
msgstr “郵編”

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

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

msgid “驗(yàn)證碼”
msgstr “驗(yàn)證碼”
msgid “郵件驗(yàn)證”
msgstr “Email Verification”

msgid “郵箱”
msgstr “Email Box”

msgid “郵編”
msgstr “Postal Code”

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

msgid “首頁”
msgstr “Home Page”

msgid “驗(yàn)證碼”
msgstr “Verification Code”

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

相關(guān)文章

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

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

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

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

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡單的飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    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ù)設(shè)置,使得?pandas?數(shù)據(jù)框能夠以多種格式導(dǎo)出為?JSON?文件,需要的朋友可以參考下
    2024-07-07
  • Django+zTree構(gòu)建組織架構(gòu)樹的方法

    Django+zTree構(gòu)建組織架構(gòu)樹的方法

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

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

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

    python 多線程重啟方法

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

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

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

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

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

    Python中幾個(gè)比較常見的名詞解釋

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

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

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

最新評(píng)論