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

项目结构

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

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

flask==2.3.3
flask-babel==3.1.0

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

2. 创建配置文件

import osclass 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 Configapp = 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'] = localereturn 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.pswp.cn/diannao/85811.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/85811.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/85811.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[论文阅读] 软件工程 | 量子计算如何赋能软件工程(Quantum-Based Software Engineering)

arXiv:2505.23674 [pdf, html, other] Quantum-Based Software Engineering Jianjun Zhao Subjects: Software Engineering (cs.SE); Quantum Physics (quant-ph) 量子计算如何赋能软件工程 我们在开发软件时&#xff0c;常常会遇到一些棘手的问题。比如&#xff0c;为了确保软…

Ansible 进阶 - Roles 与 Inventory 的高效组织

Ansible 进阶 - Roles 与 Inventory 的高效组织 如果说 Playbook 是一份完整的“菜谱”,那么 Role (角色) 就可以被看作是制作这道菜(或一桌菜)所需的标准化“备料包”或“半成品组件”。例如,我们可以有一个“Nginx Web 服务器安装配置 Role”、“MySQL 数据库基础设置 Ro…

青少年编程与数学 01-011 系统软件简介 04 Linux操作系统

青少年编程与数学 01-011 系统软件简介 04 Linux操作系统 一、Linux 的发展历程&#xff08;一&#xff09;起源&#xff08;二&#xff09;早期发展&#xff08;三&#xff09;成熟与普及&#xff08;四&#xff09;移动与嵌入式领域的拓展 二、Linux 的内核与架构&#xff08…

将图形可视化工具的 Python 脚本打包为 Windows 应用程序

前文我们已经写了一个基于python的tkinter库和matplotlib库的图形可视化工具。 基于Python的tkinter库的图形可视化工具&#xff08;15种图形的完整代码&#xff09;:基于Python的tkinter库的图形可视化工具&#xff08;15种图形的完整代码&#xff09;-CSDN博客 在前文基础上&…

【Kotlin】简介变量类接口

【Kotlin】简介&变量&类&接口 【Kotlin】数字&字符串&数组&集合 【Kotlin】高阶函数&Lambda&内联函数 【Kotlin】表达式&关键字 文章目录 Kotlin_简介&变量&类&接口Kotlin的特性Kotlin优势创建Kotlin项目变量变量保存了指向对…

OpenCV种的cv::Mat与Qt种的QImage类型相互转换

一、首先了解cv::Mat结构体 cv::Mat::step与QImage转换有着较大的关系。 step的几个类别区分: step:矩阵第一行元素的字节数step[0]:矩阵第一行元素的字节数step[1]:矩阵中一个元素的字节数step1(0):矩阵中一行有几个通道数step1(1):一个元素有几个通道数(channel()) cv::Ma…

搭建基于VsCode的ESP32的开发环境教程

一、VsCode搜索ESP-IDF插件 根据插件处搜索找到ESP-IDF并安装 安装完成 二、配置安装ESP-IDF 配置IDF 按照如下配置&#xff0c;点击安装 安装完成 三、使用案例程序 创建一个闪光灯的例子程序&#xff0c;演示程序编译下载。 选择blink例子&#xff0c;闪烁LED的程序 选…

企业培训学习考试系统源码 ThinkPHP框架+Uniapp支持多终端适配部署

在数字化转型浪潮下&#xff0c;企业对高效培训与精准考核的需求日益迫切。一套功能完备、多终端适配且易于定制的培训学习考试系统&#xff0c;成为企业提升员工能力、检验培训成果的关键工具。本文给大家分享一款基于 ThinkPHP 框架与 Uniapp 开发的企业培训学习考试系统&…

【PmHub面试篇】PmHub集成Redission分布式锁保障流程状态更新面试专题解析

你好&#xff0c;欢迎来到本次关于PmHub整合TransmittableThreadLocal (TTL)缓存用户数据的面试系列分享。在这篇文章中&#xff0c;我们将深入探讨这一技术领域的相关面试题预测。若想对相关内容有更透彻的理解&#xff0c;强烈推荐参考之前发布的博文&#xff1a;【PmHub后端…

mac 设置cursor (像PyCharm一样展示效果)

一、注册 Cursor - The AI Code Editor 二、配置Python环境 我之前使用pycharm创建的python项目&#xff0c;以及创建了虚拟环境&#xff0c;现在要使用cursor继续开发。 2.1 选择Python 虚拟环境 PyCharm 通常将虚拟环境存储在项目目录下的 venv 或 .venv 文件夹中&#xf…

Spring事务失效-----十大常见场景及解决方案全解析

Spring事务失效的常见场景及原因分析 Spring事务管理是开发中的核心功能,但在实际应用中可能因各种原因导致事务失效。以下是常见的事务失效场景及详细解析: 1. 方法未被Spring管理 场景:使用new关键字直接创建对象,而非通过Spring容器注入原因:Spring事务基于AOP代理,…

刚出炉热乎的。UniApp X 封装 uni.request

HBuilder X v4.66 当前最新版本 由于 uniapp x 使用的是自己包装的 ts 语言 uts。目前语言还没有稳定下来&#xff0c;各种不支持 ts 各种报错各种不兼容问题。我一个个问题调通的&#xff0c;代码如下&#xff1a; 封装方法 // my-app/utils/request.uts const UNI_APP_BASE…

【ArcGIS微课1000例】0148:Geographic Imager6.2使用教程

文章目录 一、Geographic Imager6.2下载安装二、Geographic Imager6.2使用方法1. 打开Geographic Imager2. 导入地理影像3. 导入DEM地形渲染4. 设置地理坐标系统5. 进行地理影像的处理6. 导出地理影像一、Geographic Imager6.2下载安装 在专栏上一篇文章中已经详细讲述了Geogr…

零基础安装 Python 教程:从下载到环境配置一步到位(支持 VSCode 和 PyCharm)与常用操作系统操作指南

零基础安装 Python 教程&#xff1a;从下载到环境配置一步到位&#xff08;支持 VSCode 和 PyCharm&#xff09;与常用操作系统操作指南 本文是一篇超详细“Python安装教程”&#xff0c;覆盖Windows、macOS、Linux三大操作系统的Python安装方法与环境配置&#xff0c;包括Pyt…

定时任务的 cron 表达式

定时任务的 cron 表达式 一、什么时 cron 表达式 Cron表达式是一种广泛应用于Linux系统的时间表示格式&#xff0c;常用于定时任务的调度。Cron表达式可以通过指定不同的时间参数&#xff0c;描述一个在 未来某个时间点执行的任务。 二、Cron表达式语法 秒 分 时 日 月 周几…

PHP+mysql 美容美发预约小程序源码 支持DIY装修+完整图文搭建教程

在数字化浪潮席卷的当下&#xff0c;美容美发行业也急需线上转型&#xff0c;以提升客户预约效率与服务体验。开发一款美容美发预约小程序成为众多商家的迫切需求。本文将为大家分享一套基于 PHPMySQL 的美容美发预约小程序源码&#xff0c;功能完备、支持 DIY 装修&#xff0c…

十八、【用户认证篇】安全第一步:基于 JWT 的前后端分离认证方案

【用户认证篇】安全第一步:基于 JWT 的前后端分离认证方案 前言什么是 JWT (JSON Web Token)?准备工作第一部分:后端 Django 配置 JWT 认证1. 安装 `djangorestframework-simplejwt`2. 在 `settings.py` 中配置 `djangorestframework-simplejwt`3. 在项目的 `urls.py` 中添加…

03 Deep learning神经网络的编程基础 代价函数(Cost function)--吴恩达

深度学习中的损失函数(Cost Function)用于量化模型预测与真实数据的差距,是优化神经网络的核心指标。以下是常见类型及数学表达: 核心原理 逻辑回归通过sigmoid函数将线性预测结果转换为概率: y ^ ( i ) \hat{y}^{(i)}

Linux信号捕捉技术深度解析

根据您的需求&#xff0c;文章可以聚焦技术实现与实践的结合&#xff0c;以下提供几个标题方案供选择&#xff1a; 方案一&#xff08;学术向标题&#xff09; 《Linux信号捕捉机制全解析&#xff1a;内核态捕获原理、可重入函数实践与SIGCHLD异步处理中的volatile陷阱》 方案…

【大模型部署】mac m1本地部署 ChatGLM3-6B 超详细教程

本人环境&#xff1a;macOS 15.5 (Sonoma) - Apple M1 / 16 G 目标&#xff1a;在 mac m1 16G 上 完全离线 的本地模型目录上&#xff0c;跑通官方 ChatGLM3-6B 目录 背景 & 踩坑记录 准备工作 新建 Conda 环境并安装依赖 关键环境变量 运行 composite_demo 常见报错与…