Backend - Django 多语言

2024-02-09 08:30
文章标签 语言 django backend

本文主要是介绍Backend - Django 多语言,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、安装 GNU gettext

(一)说明

(二)下载并解压(自定义文件包名)

(三)安装并配置环境变量

        1. 安装

        2. 配置环境变量

(四)查看是否安装

二、settings.py配置

(一)设置多语言的middleware(启用多语言支持)

(二)设置i18n上下文渲染器

(三)开启国际化,创建翻译文件存储位置

        1. 开启国际化,设置可选语言列表

        2. 多语言文件存放位置

        3. 并在manage.py所在目录下创建locale文件夹(与manage.py同层级)

(四)生成.po文件(会存放在locale文件夹内)

(五)编辑.po文件好后,执行编译生成mo文件

       1. 例子

        2. 注意

(六)执行编译

(七)激活多语言

三、应用

(一)html 模板,使用多语言

1. 前提设置

2. 使用时

(二)views使用

1. views和html的例子

(1)views.py

(2)templates.html

(三)admin后台管理界面

1. models值显示

(1)导入多语言包

(2)设置model的栏位名

 (3)设置model的自身名

 2. settings值显示

四、切换多语言

(一)第一种:同个View视图处理

 1. urls.py

 2. views.py

 3. lang.html

(二)第二种:不同方法处理,再重定向到原View视图

1. urls.py

 2. views.py

 3. lang.html


一、安装 GNU gettext

(一)说明

        GNU gettext 是国际化(i18n)和本地化(i10n)工具

(二)下载并解压(自定义文件包名)

        下载地址:https://mlocati.github.io/articles/gettext-iconv-windows.html

(三)安装并配置环境变量

        1. 安装

        将解压后的文件包(自命名Django Language)放置在此电脑某盘。

        2. 配置环境变量

        此电脑 > 右键选择内容属性 > 进阶系统设置 > 进阶页签中点击环境变量 > path中新增D:\XXX\Django Language\bin > 一般设置环境变量后,得重启电脑。

(四)查看是否安装

        Windows运行终端cmd,输入如下指令

xgettext --version

        例子: 


二、settings.py配置

(一)设置多语言的middleware(启用多语言支持)

MIDDLEWARE = […'django.middleware.locale.LocaleMiddleware',  # 多语言(LocaleMiddleware这个中间件,应于SessionMiddleware之后,CommonMiddleware之前)'django.middleware.common.CommonMiddleware',  # 多语言(顺序尽量靠前)
]

(二)设置i18n上下文渲染器

TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')],'APP_DIRS': True,'OPTIONS': {'context_processors': […'django.template.context_processors.i18n',  # i18n上下文渲染器],},}
]

(三)开启国际化,创建翻译文件存储位置

        1. 开启国际化,设置可选语言列表

TIME_ZONE = 'Asia/Shanghai'  # 亚洲上海
USE_I18N = True  # 开启国际化(Internationalization)
USE_L10N = True  # 开启本地化(localization)
USE_TZ = False  # 关闭时区支持(是否错过8小时)from django.utils.translation import ugettext_lazy as _
LANGUAGES = (('en', _('English')),('zh-hans', _('中文简体')),
)

        2. 多语言文件存放位置

LOCALE_PATHS = (os.path.join(BASE_DIR, 'locale'),),  # 多语言翻译文件存放位置

        3. 并在manage.py所在目录下创建locale文件夹(与manage.py同层级)

(四)生成.po文件(会存放在locale文件夹内)

python manage.py makemessages -l en
python manage.py makemessages -l zh_Hans

(五)编辑.po文件好后,执行编译生成mo文件

       1. 例子

        编辑zh_HAnt的po文件内容,将文本翻译为中文。

msgid "luobogan"
msgstr "萝卜干"

        2. 注意

        翻译的目标最好不要重复(代码赘余)。

        先在locale>tz>django.po中查找是否有设置想要翻译的目标,若无,才新增。

(六)执行编译

python manage.py compilemessages 
# 或者
django-admin compilemessages

(七)激活多语言

        无论是只有前端转换,还是说既有后端转换好传向前端,又有前端转换。

        都必须要在views中的get()和postt()里添加多语言激活。

active('zh-hans')


三、应用

包括:models、 views、templates多语言使用。

(一)html 模板,使用多语言

1. 前提设置

        在html模板文件头部添加 {% load i18n %}

2. 使用时

 {%  trans 'XXX' %}

注意:多个地方翻译成同名,则使用{% trans "luobo" as luobogan %}

(二)views使用

from django.utils.translation import activate
from django.utils.translation import gettext as _
activate('zh-hans')
user = _("luobo")

1. views和html的例子

(1)views.py
from django.utils.translation import activate
from django.utils.translation import gettext as _
class BookRead(View):def get(self, request):activate('zh-hans')return render(request, 'book/book_read.html', {'booktb': _('Book Table')})
(2)templates.html
<div><h1>{{ booktb }}</h1><div><th><h4>{% trans "tb_thead" %}</h4></th>

(三)admin后台管理界面

1. models值显示

(1)导入多语言包
from django.utils.translation import gettext_lazy as _
(2)设置model的栏位名

        在model类里的栏位中设置verbose_name,並用_( ) 包裹。

class Book(models.Model):bookname = models.CharField(verbose_name= _("BookName"), max_length=40)
 (3)设置model的自身名

        在model类里的class Meta中设置verbose_name_plural,並用_( ) 包裹。

class Book(models.Model):bookname = models.CharField(verbose_name="BookName", max_length=40)class Meta:verbose_name = _("Book")verbose_name_plural = verbose_name  # 对象是复数时,与单数的别名一致

 2. settings值显示

# from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext as _
ADMIN_REORDER = ({'app': 'auth','label': _('Book Admin'),'models': ('auth.User','auth.Group','C_runMES.GroupPermissions','C_runMES.URL',),},
)

四、切换多语言

(一)第一种:同个View视图处理

 1. urls.py

urlpatterns = [# . . .path('url_set_lang/', views_base.SetLang.as_view(), name='url_set_lang'),  # Set Lang 初始化界面path('url_lang/<language>/', views_base.SetLang.as_view(), name='url_change_lang'),  # Change Lang 处理界面
]

 2. views.py

class SetLang(View):def get(self, request, *args, **kwargs):try:lang = kwargs['language'] if kwargs.get('language') else 'zh-hans'activate(lang)return render(request, 'lang.html', {'opts': ['zh-hans', 'en'], 'setlang': _('Set Django Language')})except Exception as e:print('error: ', str(e))

 3. lang.html

<select onchange="window.location=this.value"><option disabled selected>----请选择----</option><option value="/url_lang/zh-hans">zh-hans</option><option value="/url_lang/en">en</option>
</select>

(二)第二种:不同方法处理,再重定向到原View视图

1. urls.py

urlpatterns = [# . . .path('url_set_lang/', views_base.SetLang.as_view(), name='url_set_lang'),  # Set Lang 初始化界面path('url_lang/en/', views_base.lang_en, name='lang_en'),  # Change Lang 处理界面(en)path('url_lang/zh-hans/', views_base.lang_hans, name='lang_hans'),  # Change Lang 处理界面(zh-hans)
]

 2. views.py

class SetLang(View):def get(self, request, *args, **kwargs):try:lang = request.session['language'] if request.session.get('language') else 'zh-hans'activate(lang)return render(request, 'lang.html', {'opts': ['zh-hans', 'en'], 'setlang': _('Set Django Language')})except Exception as e:print('error: ', str(e))def lang_en(request):try:return _set_lang(request, 'en')except Exception as e:print('error: ', str(e))def lang_hans(request):try:return _set_lang(request, 'zh-hans')except Exception as e:print('error: ', str(e))def _set_lang(request, lang):request.session['language'] = langnext = request.META.get('HTTP_REFERER')next = next and unquote(next)  # HTTP_REFERER may be encoded.return HttpResponseRedirect(next)  # 重定向到原路由的get方法

 3. lang.html

<select onchange="window.location=this.value"><option disabled selected>----请选择----</option><option value="/url_lang/zh-hans">zh-hans</option><option value="/url_lang/en">en</option>
</select>

这篇关于Backend - Django 多语言的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/693698

相关文章

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上