最近在使用 Django 开发一个股票数据采集平台,在开发过程中想要把后台管理页面显示的英文改成中文显示,然后就得知了 locale 的存在和用法。Django 作为功能强大的 Python Web 框架,内置了完善的国际化(i18n)和本地化(l10n)机制。本文分享一下 locale 的用法。
先看效果
这个是配置之前的后台显示效果,有的第三方应用都是英文显示:
这是因为之前的 django-celery-results 版本没有提供中文翻译,所以在后台显示的都是英文,当然最新版其实提供了中文。
然后是我配置了 locale 之后的效果:
什么是 locale?
在 Django 项目中,locale 是一个目录,用于存放翻译文件(.po 和 .mo),每个语言版本对应一个子目录。其主要目的是为模板、视图、模型等定义的文本内容提供多语言支持。
基础配置
确认 settings.py 的配置项:
# settings.py
LANGUAGE_CODE = 'zh-hans' # 默认语言
USE_I18N = True # 启用国际化
USE_L10N = True # 启用本地化(数字、日期格式)
USE_TZ = True # 启用时区
# 翻译文件存放路径
LOCALE_PATHS = [
os.path.join(BASE_DIR, 'locale'),
]
生成 locale 文件
1. 标记待翻译文本
一般常用的翻译内容是在模型或模板中使用。
比如典型的模型名称还有字段名称:
from django.utils.translation import gettext_lazy as _
class Meta:
"""Table information."""
ordering = ['-date_done']
verbose_name = _('task result')
verbose_name_plural = _('task results')
或者是在模板中:
{% load i18n %}
<p>{% trans "Welcome" %}</p>
2. 生成 .po 文件
执行如下命令,扫描项目中所有待翻译内容,并生成一个 .po 文件:
django-admin makemessages -l zh_Hans
执行后将会生成如下结构:
locale/
└── zh_Hans/
└── LC_MESSAGES/
└── django.po
3. 编辑翻译文件
在 django.po 中编辑 msgstr :
msgid "task result"
msgstr "任务结果"
msgid "task results"
msgstr "任务结果"
msgid "Hello, world!"
msgstr "你好,世界!"
4. 编译成 .mo 文件
执行编译命令,将 .po 文件编译为 .mo 文件:
django-admin compilemessages
容器化建议
1、git 只提交 .po 文件到项目代码,忽略 .mo 文件
2、镜像中安装编译需要的 gettext
由于编译 .mo 文件需要依赖 gettext,而有的基础镜像没有这个软件,所以需要安装一下。参考 dockerfile 中命令:
RUN apt-get update && apt-get install -y \
default-libmysqlclient-dev \
build-essential \
gettext \
&& rm -rf /var/lib/apt/lists/*
3、在镜像构建的时候执行 django-admin compilemessages
编译生产 .mo 文件
参考命令:
COPY . .
RUN django-admin compilemessages
我的经验
其实最好的获取 django.po 的方式是去找指定的第三方库的源码,拿到其他翻译的文件,然后改一份中文的,比如这个是我博客的版本引用的 django-celery-results 的翻译
版权声明:如无特殊说明,文章均为本站原创,转载请注明出处
本文链接:https://tendcode.com/subject/article/django-locale/
许可协议:署名-非商业性使用 4.0 国际许可协议