前端渲染:"用户错误" 后端接收请求中 "Ac" />

Flask API 如何接入 i18n 实现国际化多语言

flask,api,i18n · 浏览次数 : 12

小编点评

本文介绍了Flask后端如何接入i18n实现国际化多语言。首先,通过使用Flask-Babel插件将原本单语言的程序转换为国际化多语言支持。接着,以GithubStar.Pro后端实现为例,介绍了基本实现过程,包括引入Flask-Babel、设置语言选择器以及处理请求头。最后,讨论了如何与前端的Vue3应用联动,实现自动切换语言。通过这些步骤,可以实现一个前后端协同的国际化多语言应用。 1. **Flask-Babel插件**:本文以Flask为例,介绍了如何使用Flask-Babel插件将单语言的Flask应用转换为支持多语言的应用。通过安装flask-babel并初始化Babel插件,可以方便地实现多语言支持。 2. **基本实现**:文章详细介绍了如何在Flask后端实现i18n,包括设置语言选择器、处理请求头等。通过使用`get_locale()`函数获取当前语言,并在请求头中添加`Accept-Language`信息,可以实现在请求时自动选择合适的语言版本。 3. **前端与后端联动**:文章还讨论了如何在前端应用中(如Vue3)根据后端返回的语言自动切换语言。通过使用Pinia Store和Axios库,可以在前端应用中管理用户状态,并在发送请求时自动将其语言设置为后端返回的语言。 综上所述,本文通过介绍Flask后端如何接入i18n实现国际化多语言,展示了一个前后端协同的国际化多语言应用的实现过程。这种实现方式不仅适用于Web应用,还可以应用于其他需要多语言支持的场景。

正文

1. 介绍

上一篇文章分享了 Vue3 如何如何接入 i18n 实现国际化多语言,这里继续和大家分享 Flask 后端如何接入 i18n 实现国际化多语言。

用户请求 API 的多语言化其实有两种解决方案:

  1. 后端返回:"USER_ERROR"  => 前端渲染:"用户错误"
  1. 后端接收请求中 "Accept-Language" 信息为 "zh-CN" => 后端返回:"用户错误" => 前端渲染:"用户错误"


这里我们采用的是第二种方案,也就是后端直接处理 i18n 逻辑。

对于 Flask 我们常用 flask-babel,这个包对于将原本单语言的程序转为国际化多语言非常友好,我们只要用 gettext() 包裹我们原来的文本:

@api.route("/", methods=["GET"])
def info():
    return jsonify({"msg": gettext("欢迎访问 Githubstar API 服务器.")}), 200

然后工具就可以自动生成翻译文件,我们只要编辑不同语言的翻译文件就可以了:

#: githubstar_api/api.py:39
msgid "欢迎访问 Githubstar API 服务器."
msgstr "Welcome to the Githubstar API server."

2. 基本实现


本文以 GithubStar.Pro 后端的实现为例进行介绍。

要将 flask-babel 引入项目,这里首先安装 flask-babel:

pip install flask-babel

如果你开发包的话,这个依赖也要加入到项目依赖中。

然后,在 Flask 初始化时安装 Babel 插件:

from flask import Flask
from flask_babel import Babel

app = Flask('githubstar_api')
babel = Babel(app)

如果你需要使用工厂模式初始化你的 Flask 实例,可以用:

from flask import Flask
from flask_babel import Babel

app = Flask('githubstar_api')
babel = Babel()

def init_app():
    babel.init_app(app)

然后,将你的所有业务相关的文字都包裹上 gettext():

return (
    jsonify(
        {"errors": [gettext('用户 "%(username)s" 已被封禁.', username=user.username)]}
    ),
    400,
)

句子中的变量,可以用 %()s 包裹,其中 s 代表字符串。

更多的使用方法详见:文档

然后,在项目根目录新建一个 babel.cfg:

[python: githubstar_api/**.py]

​这里的路径应该指向你的所有需要国际化的代码文件。

然后,运行命令,将这些文件中被 gettext() 包裹的文字都提取到模板文件中:

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

这会在项目根目录生成 messages.pot 文件,可以看到包含了所有需要翻译的文本:

#: githubstar_api/api.py:39
msgid "欢迎访问 Githubstar API 服务器."
msgstr ""

随后,我们需要开始进行一个新语言的翻译,例如英文,运行命令:

pybabel init -i messages.pot -d ./githubstar_api/res/locales -l en

我们就可以在 ./githubstar_api/res/locales 中看到生成了一个 en 文件夹, 里面有 messages.po 文件,这就是一个空的全新的翻译文件了。

这里我们可以将文本内容全部发送给 OpenAI GPT4 或者是 Github Copilot,告诉他:

这是一个 babel 翻译文件,请根据中文翻译为英文并填入msgstr中,以下是文件内容:
...

AI 可以很好地完成翻译任务,只需要检查并稍微调整即可。

完成翻译后,需要将翻译文件编译为二进制文件:

pybabel compile -d ./githubstar_api/res/locales

这样,locale 文件夹中的所有语言都被翻译,生产了 messages.po 文件。

现在,文件目录应该是这样的:

./githubstar
├── githubstar_api
│   ├── __init__.py
│   ├── res
│   │   ├── __init__.py
│   │   └── locales
│   │       └── en
│   │           └── LC_MESSAGES
│   │               ├── messages.mo
│   │               └── messages.po
│   ├── api.py
│   ├── app.py
│   └── cli.py
├── messages.pot
└── pyproject.toml

所以,用加载包数据的方式导入:

import importlib.resources as pkg_resources

from . import res

traversable = pkg_resources.files(res)
with pkg_resources.as_file(traversable) as path:
    babel.init_app(
        app,
        default_translation_directories=str(path / "locales"),
    )

接下来,我们需要设定,需要检测请求的 Accept-Language,以下就是完整的 app.py 文件:

from flask import Flask, request
from flask_babel import Babel

app = Flask("githubstar_api")
babel = Babel()

def get_locale():
    return request.accept_languages.best_match(["zh_CN", "en"])

def init_app():
    traversable = pkg_resources.files(res)
    with pkg_resources.as_file(traversable) as path:
        babel.init_app(
            app,
            default_translation_directories=str(path / "locales"),
            locale_selector=get_locale,
            default_locale="zh_CN",
        )

这样,就实现了 Flask API 后端根据请求的 Accept-Language 自动调整返回值的语言了。

注意:如果你要将翻译文件包含在输出的 Python 包中,你需要调整你的 pyproject.toml:

[tool.setuptools]
zip-safe = false
include-package-data = true

[tool.setuptools.packages]
find = {namespaces = false}

[tool.setuptools.package-data]
"githubstar_api.res" = ["**/*.mo"]

3. 与 Vue3 前端联动

接下来,需要让前端发送的请求以当前语言作为 Accept-Language。

这里,我们以用户操作相关 API 为例,这里我们使用一个 Pinia Store 来管理所有的用户状态和相关请求。API 请求用 axios 发送,详见开源仓库:Github: GithubStarPro

export const useUserStore = defineStore('user', {
  state: () => {
    const { locale } = useI18n({ inheritLocale: true, useScope: 'local' });
    const user = useStorage<User | null>('user', null, undefined, { serializer: StorageSerializers.object });
    const api = axios.create({ baseURL: import.meta.env.VITE_API_URL });
    api.interceptors.request.use((config) => {
      config.headers['Accept-Language'] = locale.value;
      if (user.value && user.value.token) {
        config.headers.Authorization = `Bearer ${user.value.token.token}`;
      }
      return config;
    });
  },
  actions: {
    login(username: string, password: string) {
      const payload = {
        username: username,
        password: password,
      };
      this.api.post('/user/login', payload)
        .then((response) => {
          this.user = response.data;
        });
    }
  },
});

​我们重点关注的是:

api.interceptors.request.use((config) => {
  config.headers['Accept-Language'] = locale.value;
  if (user.value && user.value.token) {
    config.headers.Authorization = `Bearer ${user.value.token.token}`;
  }
  return config;
});


这一块是在 axios 对象上定义了一个预处理器,也就是在每个发送的请求上加入当前的 locale,如果用户已登录,还需要加入用户的 Token,这里的 locale 参见我的上一篇文章:Vue3 如何如何接入 i18n 实现国际化多语言

这样,就实现了在每次发送请求时候自动发送当前的 locale。

这样我们就实现了前后端的国际化,如果这篇文章对您有帮助的话,欢迎关注我,我会分享更多全栈网页开发的实用经验。

您也可以关注 Github 互赞平台 GithubStar.Pro,快速提升您的项目关注度。

感谢阅读!

与Flask API 如何接入 i18n 实现国际化多语言相似的内容:

Flask API 如何接入 i18n 实现国际化多语言

​ 1. 介绍 上一篇文章分享了 Vue3 如何如何接入 i18n 实现国际化多语言,这里继续和大家分享 Flask 后端如何接入 i18n 实现国际化多语言。 用户请求 API 的多语言化其实有两种解决方案: 后端返回:"USER_ERROR" => 前端渲染:"用户错误" 后端接收请求中 "Ac

python flask 提供web的get/post开发

转载请注明出处: 使用python flask框架编写web api中的get与post接口,代码编写与调试示例如下: from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/api/get', met

[flask]统一API响应格式

前言 在设计API返回内容时,通常需要与前端约定好API返回响应体内容的格式。这样方便前端进行数据反序列化时相应的解析处理,也方便其它服务调用。不同公司有不同的响应内容规范要求,这里以常见的JSON响应体为例: { "code": 200, "data": { "content": "this is

保姆级教程:用GPU云主机搭建AI大语言模型并用Flask封装成API,实现用户与模型对话

在本文中,我们将以chatglm-6b为例详细介绍GPU云主机搭建AI大语言模型的过程,并使用Flask构建前端界面与该模型进行对话。

在 Flask 项目中配置 Session:简明指南

本文介绍如何在 Flask 项目中配置会话 1. Flask 内置会话 Flask 自带会话管理功能,使用客户端 Cookie 存储会话数据。默认情况下,会话数据是签名的,以防止篡改,但未加密。因此,不建议在会话中存储敏感信息。Flask 内置会话适用于小型应用或会话数据量较少的情况。此外,默认情况

轻量级Web框架Flask(二)

Flask-SQLAlchemy MySQL是免费开源软件,大家可以自行搜索其官网(https://www.MySQL.com/downloads/) 测试MySQL是否安装成功 在所有程序中,找到MySQL→MySQL Server 5.6下面的命令行工具,然后单击输入密码后回车,就可以知道MyS

Flask框架:运用Ajax轮询动态绘图

Ajax是异步JavaScript和XML可用于前后端交互,在之前`《Flask 框架:运用Ajax实现数据交互》`简单实现了前后端交互,本章将通过`Ajax`轮询获取后端的数据,前台使用`echart`绘图库进行图形的生成与展示,后台通过`render_template`方法返回一串JSON数据集,前台收到后将其应用到绘图库上,实现动态监控内存利用率的这个功能。

Flask框架:如何运用Ajax轮询动态绘图

摘要:Ajax是异步JavaScript和XML可用于前后端交互。 本文分享自华为云社区《Flask框架:运用Ajax轮询动态绘图》,作者:LyShark。 Ajax是异步JavaScript和XML可用于前后端交互,在之前《Flask 框架:运用Ajax实现数据交互》简单实现了前后端交互,本章将通

《Flask Web 开发指南 pt.1》

最近在看辉哥的《Flask Web 开发实战》,这才有了《Flask Web 开发指南》系列的文章,偏向学习笔记多一点,也有实战的内容 看下这个系列的文章我能写多少篇 :) 愚人节玩笑 愚人节大家都喜欢开玩笑来整蛊别人以便达到娱乐效果,但对于开发者来说,就有可能出现让人意想不到的情况 2010 年

《Flask Web 开发指南 pt.2》

哈喽大家好,我是咸鱼 在《Flask Web 开发指南 pt.1》中,咸鱼跟大家介绍了 Flask 的由来——诞生于一个愚人节玩笑,简单介绍了一些关于 Flask 的概念,并且编写了一个简单的 Flask 程序 在编写 Flask 程序的时候,你需要注意你的程序文件不要命名为 flask.py,建议