Flask-Babel 使用示例

news2025/7/22 19:34:40

下面创建一个简单的 Flask-Babel 示例,展示如何在 Flask 应用中实现国际化和本地化功能。这个示例将包括多语言支持(中文和英文)、语言切换功能以及翻译文本的使用。

项目结构

我们将创建以下文件结构:
在这里插入图片描述

1. 首先,创建 requirements.txt 文件

flask==2.3.3
flask-babel==3.1.0

项目构建:
在这里插入图片描述

2. 创建配置文件

import os

class Config:
    # 设置密钥
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'dev-key-should-be-changed'
    
    # Babel 配置
    LANGUAGES = ['en', 'zh']
    BABEL_DEFAULT_LOCALE = 'en'
    BABEL_DEFAULT_TIMEZONE = 'UTC'

3. 创建 Babel 配置文件

[python: **.py]
[jinja2: **/templates/**.html]

4. 创建 HTML 模板

基础模板

<!DOCTYPE html>
<html lang="{{ g.locale }}">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}{{ _('Flask Babel Example') }}{% endblock %}</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">
    <style>
        body { padding-top: 20px; }
        .content { margin-top: 20px; }
        .language-selector { margin-top: 10px; }
    </style>
</head>
<body>
    <div class="container">
        <nav class="navbar navbar-expand-lg navbar-light bg-light">
            <div class="container-fluid">
                <a class="navbar-brand" href="{{ url_for('index') }}">{{ _('Flask Babel') }}</a>
                <div class="language-selector">
                    <a href="{{ url_for('set_locale', locale='en') }}" class="btn btn-sm {% if g.locale == 'en' %}btn-primary{% else %}btn-outline-primary{% endif %}">English</a>
                    <a href="{{ url_for('set_locale', locale='zh') }}" class="btn btn-sm {% if g.locale == 'zh' %}btn-primary{% else %}btn-outline-primary{% endif %}">中文</a>
                </div>
            </div>
        </nav>
        
        <div class="content">
            {% block content %}{% endblock %}
        </div>
    </div>
    
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

首页模板

{% extends "base.html" %}

{% block title %}{{ _('Home') }} - {{ _('Flask Babel Example') }}{% endblock %}

{% block content %}
<div class="jumbotron">
    <h1 class="display-4">{{ _('Welcome to Flask Babel Example') }}</h1>
    <p class="lead">{{ _('This is a simple demonstration of Flask-Babel for internationalization.') }}</p>
    <hr class="my-4">
    <p>{{ _('Current language') }}: <strong>{{ g.locale }}</strong></p>
    <p>{{ _('Current time') }}: {{ moment }}</p>
    <p>{{ _('Sample translated text with parameters: Hello, %(name)s!', name='Flask') }}</p>
    
    <h3>{{ _('Features demonstrated:') }}</h3>
    <ul>
        <li>{{ _('Text translation with gettext') }}</li>
        <li>{{ _('Language switching') }}</li>
        <li>{{ _('Date and time localization') }}</li>
        <li>{{ _('Parameter substitution in translations') }}</li>
    </ul>
</div>
{% endblock %}

5. 创建主应用文件

from flask import Flask, render_template, request, g, session, redirect, url_for
from flask_babel import Babel, gettext, format_datetime
from datetime import datetime
import os
from config import Config

app = Flask(__name__)
app.config.from_object(Config)

# 定义选择器函数
def get_locale():
    # 如果用户已经选择了语言,则使用用户选择的语言
    if 'locale' in session:
        return session['locale']
    # 否则,尝试从请求头中获取最佳匹配的语言
    return request.accept_languages.best_match(app.config['LANGUAGES'])

def get_timezone():
    # 这里可以根据用户设置返回不同的时区
    return app.config['BABEL_DEFAULT_TIMEZONE']

# 初始化 Babel(使用新版本 API)
babel = Babel(app, locale_selector=get_locale, timezone_selector=get_timezone)


@app.before_request
def before_request():
    g.locale = get_locale()

@app.route('/')
def index():
    # 获取当前时间并格式化
    moment = format_datetime(datetime.utcnow())
    return render_template('index.html', moment=moment)

@app.route('/set_locale/<locale>')
def set_locale(locale):
    # 检查是否是支持的语言
    if locale in app.config['LANGUAGES']:
        session['locale'] = locale
    return redirect(url_for('index'))

if __name__ == '__main__':
    # 确保 translations 目录存在
    if not os.path.exists('translations'):
        os.makedirs('translations')
    app.run(debug=True)

6. 创建翻译文件

首先,我们需要提取需要翻译的文本:

pybabel extract -F babel.cfg -o messages.pot .

然后,为每种语言创建翻译文件:

# 创建英文翻译文件
pybabel init -i messages.pot -d translations -l en

# 创建中文翻译文件
pybabel init -i messages.pot -d translations -l zh

编辑翻译文件:

英文翻译文件 (translations/en/LC_MESSAGES/messages.po)

# English translations for PROJECT.
# Copyright (C) 2025 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2025.
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2025-06-05 22:01+0800\n"
"PO-Revision-Date: 2025-06-05 22:02+0800\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en\n"
"Language-Team: en <LL@li.org>\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.17.0\n"

#: templates/base.html:6 templates/index.html:3
msgid "Flask Babel Example"
msgstr "Flask Babel Example"

#: templates/base.html:18
msgid "Flask Babel"
msgstr "Flask Babel"

#: templates/index.html:3
msgid "Home"
msgstr "Home"

#: templates/index.html:7
msgid "Welcome to Flask Babel Example"
msgstr "Welcome to Flask Babel Example"

#: templates/index.html:8
msgid "This is a simple demonstration of Flask-Babel for internationalization."
msgstr "This is a simple demonstration of Flask-Babel for internationalization."

#: templates/index.html:10
msgid "Current language"
msgstr "Current language"

#: templates/index.html:11
msgid "Current time"
msgstr "Current time"

#: templates/index.html:12
#, python-format
msgid "Sample translated text with parameters: Hello, %(name)s!"
msgstr "Sample translated text with parameters: Hello, %(name)s!"

#: templates/index.html:14
msgid "Features demonstrated:"
msgstr "Features demonstrated:"

#: templates/index.html:16
msgid "Text translation with gettext"
msgstr "Text translation with gettext"

#: templates/index.html:17
msgid "Language switching"
msgstr "Language switching"

#: templates/index.html:18
msgid "Date and time localization"
msgstr "Date and time localization"

#: templates/index.html:19
msgid "Parameter substitution in translations"
msgstr "Parameter substitution in translations"

中文翻译文件 (translations/zh/LC_MESSAGES/messages.po)

# Chinese translations for PROJECT.
# Copyright (C) 2025 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2025.
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2025-06-05 22:01+0800\n"
"PO-Revision-Date: 2025-06-05 22:02+0800\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: zh\n"
"Language-Team: zh <LL@li.org>\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.17.0\n"

#: templates/base.html:6 templates/index.html:3
msgid "Flask Babel Example"
msgstr "Flask Babel 示例"

#: templates/base.html:18
msgid "Flask Babel"
msgstr "Flask Babel"

#: templates/index.html:3
msgid "Home"
msgstr "首页"

#: templates/index.html:7
msgid "Welcome to Flask Babel Example"
msgstr "欢迎使用 Flask Babel 示例"

#: templates/index.html:8
msgid "This is a simple demonstration of Flask-Babel for internationalization."
msgstr "这是一个简单的 Flask-Babel 国际化演示。"

#: templates/index.html:10
msgid "Current language"
msgstr "当前语言"

#: templates/index.html:11
msgid "Current time"
msgstr "当前时间"

#: templates/index.html:12
#, python-format
msgid "Sample translated text with parameters: Hello, %(name)s!"
msgstr "带参数的示例翻译文本:你好,%(name)s!"

#: templates/index.html:14
msgid "Features demonstrated:"
msgstr "演示的功能:"

#: templates/index.html:16
msgid "Text translation with gettext"
msgstr "使用 gettext 进行文本翻译"

#: templates/index.html:17
msgid "Language switching"
msgstr "语言切换"

#: templates/index.html:18
msgid "Date and time localization"
msgstr "日期和时间本地化"

#: templates/index.html:19
msgid "Parameter substitution in translations"
msgstr "翻译中的参数替换"

编辑完翻译文件后,需要编译它们:

pybabel compile -d translations

运行应用

uv run app.py

应用将在 http://127.0.0.1:5000/ 上运行。
在这里插入图片描述
切换英文
在这里插入图片描述

功能说明

  1. 多语言支持:应用支持英文和中文两种语言。
  2. 语言切换:用户可以通过点击页面顶部的语言按钮切换语言。
  3. 文本翻译:使用 gettext 函数(在模板中使用 _() 简写)来标记需要翻译的文本。
  4. 日期和时间本地化:使用 format_datetime 函数根据当前语言环境格式化日期和时间。
  5. 参数替换:在翻译文本中使用参数,例如 _('Hello, %(name)s!', name='Flask')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2401657.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国标GB28181视频平台EasyGBS视频实时监控系统打造换热站全景可视化管理方案

一、方案背景​ 在城市供热体系中&#xff0c;换热站作为连接热源与用户的核心枢纽&#xff0c;其运行稳定性直接影响供热质量。面对供热规模扩大与需求升级&#xff0c;传统人工巡检模式暴露出效率低、响应慢、监测不足等问题。基于GB28181协议的EasyGBS视频实时监控系统&…

docker生命周期

进入容器里面 docker pull ubuntu # 获取ubtuntu镜像 docker run ubtuntu # -i 交互式命令操作&#xff0c;-t 开启一个终端 bash 进入容器后&#xff0c;执行的命令 docker run -it ubtuntu bash

鸿蒙缺少WMIC missing WMIC

在DecEco Studio中选择模拟器的时候会弹出“可能会导致设备管理功能失效。请检查并安装 WMIC”。 在启动鸿蒙模拟器时报&#xff1a;missing WMIC missing WMIC lt may cause the device management function to fail. Please check and install WMIC. 解决方案&#xff1a…

Spring Boot 使用 SLF4J 实现控制台输出与分类日志文件管理

概述 在日常的 Java 项目开发中&#xff0c;日志是最重要的调试与排查手段之一。为了便于开发时实时查看&#xff0c;同时在生产中追踪问题&#xff0c;我们通常希望实现以下日志管理目标&#xff1a; ✅ 控制台实时输出日志&#xff0c;方便开发调试✅ 日志根据级别分类保存…

linux_centos7.x的ifconfig命令显示内容详解

这是一段在Linux系统中执行 ifconfig 命令后得到的网络接口信息输出。ifconfig 命令用于显示或配置网络接口的参数。以下是对输出中各个网络接口信息的详细解释&#xff1a; 1. ens33 接口 ​​状态标志​​&#xff1a;flags4163<UP,BROADCAST,RUNNING,MULTICAST> 表示…

CentOS 7 如何pip3安装pyaudio?

CentOS 7 如何pip3安装pyaudio&#xff1f; # 先将yum软件源改为阿里云镜像源 http://mirrors.aliyun.com/centos-vault/7.9.2009/ bash <(curl -sSL https://linuxmirrors.cn/main.sh) # 基于一键换源脚本&#xff0c;全部回车即可# pip3安装模块是从源码构建&#xff08;…

【个人笔记】数据库原理(西电)

第一章 ER图和关系分解见课本p69 ER图是常用的 概念模型 方形&#xff1a;实体圆形&#xff1a;属性菱形&#xff1a;关系 常用的逻辑模型 说白了&#xff1a;增删改查 几种数据模型的基本概念 层次模型&#xff1a;树状结构【只能处理一对多的关系&#xff0c;只有沿着从根…

嵌入式学习之系统编程(十)网络编程之TCP传输控制协议

目录 一、网络模型 1、服务器/客户端模型 2、C/S与B/S区别 3、P2P模型 二、TCP&#xff08;传输控制协议&#xff09; &#xff08;一&#xff09;TCP概述 &#xff08;二&#xff09;TCP的特征&#xff08;面问高频问题&#xff09; 1、有链接 三次握手&#xff1a;建…

【react+antd+vite】优雅的引入svg和阿里巴巴图标

1.安装相关包 由于是vite项目&#xff0c;要安装插件来帮助svg文件引入进来&#xff0c;否则会失败 npm下载包 npm i vite-plugin-svgr vite.config.ts文件内&#xff1a; import svgr from "vite-plugin-svgr"; //... export default defineConfig({plugins: …

3D动画在微信小程序的实现方法

微信小程序支持通过多种方式实现3D动画效果&#xff0c;主要包括使用CSS3、WebGL及第三方库。以下为具体方法&#xff1a; 一. 使用CSS3 Transform实现基础3D动画详解 CSS3的transform属性提供了强大的2D/3D变换功能&#xff0c;通过简单的代码就能实现复杂的视觉效果。在小程…

计算机网络 | 1.2 计算机网络体系结构与参考模型

计算机网络体系结构与参考模型 目录 计算机网络体系结构与参考模型 【思维导图】 1、计算机的分层结构 1、为什么要分层&#xff1f; 2、什么是计算机网络体系结构 2、计算机网络协议、接口和服务 1&#xff09;协议&#xff1a; 2&#xff09;接口&#xff1a; 3…

网心云 OEC/OECT 笔记(1) 拆机刷入Armbian固件

目录 网心云 OEC/OECT 笔记(1) 拆机刷入Armbian固件网心云 OEC/OECT 笔记(2) 运行RKNN程序 外观 内部 PCB正面 PCB背面 PCB背面 RK3566 1Gbps PHY 配置 OEC 和 OECT(OEC-turbo) 都是基于瑞芯微 RK3566/RK3568 的网络盒子, 没有HDMI输入输出. 硬件上 OEC 和 OECT…

【Web应用】若依框架:基础篇17二次开发-项目名称修改-新建业务模块

文章目录 ⭐前言⭐一、课程讲解⭐二、自己手动实操⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈&#xff08;,NET/Java/Python/C&#xff09;、数据库、操作系统、大数据、人工智能、工控、网络、…

MQTT入门实战宝典:从零起步掌握物联网核心通信协议

MQTT入门实战宝典&#xff1a;从零起步掌握物联网核心通信协议 前言 物联网时代&#xff0c;万物互联已成为现实&#xff0c;而MQTT协议作为这个时代的"数据总线"&#xff0c;正默默支撑着从智能家居到工业物联的各类应用场景。本文将带你揭开MQTT的神秘面纱&#…

05【Linux经典命令】Linux 用户管理全面指南:从基础到高级操作

目录 前言 1 Linux用户管理基础概念 1.1 Linux用户类型 1.2 用户相关配置文件 1.3 UID与GID 2 用户创建与管理 2.1 创建用户 2.2 设置用户密码 3 用户权限管理 3.1 授予sudo权限 3.2 以其他用户身份执行命令 4 用户信息查询 4.1 查看用户基本信息 4.2 查看用户所…

使用vite-plugin-html在 HTML 文件中动态注入数据,如元数据、环境变量、标题

vite-plugin-html 是一个用于 Vite 构建工具的插件&#xff0c;它可以帮助你在构建过程中动态注入一些 HTML 内容&#xff0c;比如标题、元数据、环境变量等。通过使用这个插件&#xff0c;你可以根据项目的配置和环境变量自动生成带有动态内容的 HTML 文件&#xff0c;适用于 …

Kinova机械臂在Atlas手术导航系统中的核心作用

Kinova机械臂凭借其高精度运动控制和智能交互功能&#xff0c;成为Atlas手术导航系统的重要组成部分。该系统通过实时跟踪患者位置和精确规划手术路径&#xff0c;提高了医疗过程的精准性与效率。灵活的设计使外科医生能够更轻松地操作复杂的手术工具&#xff0c;从而提升患者安…

性能优化之SSR、SSG

一、SSR和SSG介绍 SSR&#xff08;Server-Side Rendering&#xff0c;服务端渲染&#xff09;和 SSG&#xff08;Static Site Generation&#xff0c;静态站点生成&#xff09;是现代前端框架&#xff08;如 Next.js、Nuxt.js、Gatsby&#xff09;的核心渲染策略&#xff0c;用…

经典算法:回文链表

题目&#xff1a;234. 回文链表 给你一个单链表的头节点 head&#xff0c;请你判断该链表是否为 回文链表。如果是&#xff0c;返回 true&#xff1b;否则&#xff0c;返回 false。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#x…

uboot移植之GPIO上电初始状态的调整

开发板在上电之后&#xff0c;GPIO都有一个默认初始状态&#xff0c;这个状态可能是高电平也可能是低电平。而我们的应用程序在正式接管控制这些GPIO&#xff0c;是在内核起来并成功加载根文件系统之后。所以在内核启动的这段时间内&#xff0c;这些GPIO保持在一种不受控的状态…