每天40分玩转Django:Django国际化

ops/2024/12/28 9:31:49/

Django国际化

一、今日学习内容概述

学习模块重要程度主要内容
国际化基础⭐⭐⭐⭐⭐基本概念、配置设置
字符串翻译⭐⭐⭐⭐⭐翻译标记、消息文件
模板国际化⭐⭐⭐⭐模板标签、过滤器
动态内容翻译⭐⭐⭐⭐模型字段、表单翻译

二、国际化基础配置

python"># settings.py# 启用国际化
USE_I18N = True# 启用本地化
USE_L10N = True# 启用时区
USE_TZ = True# 支持的语言
LANGUAGES = [('en', 'English'),('zh-hans', '简体中文'),('ja', '日本語'),
]# 默认语言
LANGUAGE_CODE = 'en'# 翻译文件路径
LOCALE_PATHS = [BASE_DIR / 'locale',
]# 中间件配置
MIDDLEWARE = [# ...'django.middleware.locale.LocaleMiddleware',# ...
]

三、代码中的字符串翻译

python"># models.py
from django.db import models
from django.utils.translation import gettext_lazy as _class Article(models.Model):STATUS_CHOICES = [('draft', _('草稿')),('published', _('已发布')),]title = models.CharField(_('标题'), max_length=200)content = models.TextField(_('内容'))status = models.CharField(_('状态'),max_length=10,choices=STATUS_CHOICES,default='draft')created_at = models.DateTimeField(_('创建时间'), auto_now_add=True)class Meta:verbose_name = _('文章')verbose_name_plural = _('文章')# views.py
from django.utils.translation import gettext as _
from django.contrib import messagesdef article_create(request):if request.method == 'POST':form = ArticleForm(request.POST)if form.is_valid():article = form.save()messages.success(request, _('文章创建成功!'))return redirect('article_detail', pk=article.pk)else:form = ArticleForm()return render(request, 'articles/create.html', {'title': _('创建新文章'),'form': form})

四、模板国际化

<!-- templates/base.html -->
{% load i18n %}
<!DOCTYPE html>
<html>
<head><title>{% trans "我的网站" %}</title>
</head>
<body><header><h1>{% trans "欢迎访问" %}</h1><div class="language-selector"><form action="{% url 'set_language' %}" method="post">{% csrf_token %}<input name="next" type="hidden" value="{{ request.path }}"><select name="language" onchange="this.form.submit()">{% get_current_language as CURRENT_LANGUAGE %}{% get_available_languages as LANGUAGES %}{% for code, name in LANGUAGES %}<option value="{{ code }}"{% if code == CURRENT_LANGUAGE %}selected{% endif %}>{{ name }}</option>{% endfor %}</select></form></div></header><nav><ul><li><a href="{% url 'home' %}">{% trans "首页" %}</a></li><li><a href="{% url 'about' %}">{% trans "关于" %}</a></li><li><a href="{% url 'contact' %}">{% trans "联系我们" %}</a></li></ul></nav><main>{% block content %}{% endblock %}</main><footer>{% blocktrans %}版权所有 © {{ year }} 我的网站{% endblocktrans %}</footer>
</body>
</html>

五、国际化流程图

在这里插入图片描述

六、消息文件管理

6.1 创建和编译消息文件

# 创建/更新消息文件
python manage.py makemessages -l zh_hans
python manage.py makemessages -l ja# 编译消息文件
python manage.py compilemessages

6.2 消息文件示例

# locale/zh_hans/LC_MESSAGES/django.po
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-01-19 10:00+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"#: models.py:8
msgid "标题"
msgstr "Title"#: models.py:9
msgid "内容"
msgstr "Content"#: templates/base.html:4
msgid "我的网站"
msgstr "My Website"

七、动态内容翻译

7.1 模型翻译

python"># models.py
from django.db import models
from django.utils.translation import gettext_lazy as _class TranslatableModel(models.Model):"""可翻译内容的基类"""class Meta:abstract = Trueclass ArticleTranslation(models.Model):article = models.ForeignKey('Article', on_delete=models.CASCADE)language = models.CharField(max_length=10, choices=settings.LANGUAGES)title = models.CharField(max_length=200)content = models.TextField()class Meta:unique_together = ('article', 'language')class Article(TranslatableModel):# 基本字段保持原样created_at = models.DateTimeField(auto_now_add=True)def get_translation(self, language=None):"""获取指定语言的翻译"""if language is None:language = get_language()try:return self.articletranslation_set.get(language=language)except ArticleTranslation.DoesNotExist:# 如果没有找到翻译,返回默认语言return self.articletranslation_set.get(language=settings.LANGUAGE_CODE)

7.2 表单翻译

python"># forms.py
from django import forms
from django.utils.translation import gettext_lazy as _class ContactForm(forms.Form):name = forms.CharField(label=_('姓名'),max_length=100,error_messages={'required': _('请输入您的姓名'),'max_length': _('姓名长度不能超过100个字符'),})email = forms.EmailField(label=_('电子邮箱'),error_messages={'required': _('请输入您的电子邮箱'),'invalid': _('请输入有效的电子邮箱地址'),})message = forms.CharField(label=_('留言内容'),widget=forms.Textarea,error_messages={'required': _('请输入留言内容'),})

八、URL国际化

python"># urls.py
from django.conf.urls.i18n import i18n_patterns
from django.urls import path, includeurlpatterns = [path('i18n/', include('django.conf.urls.i18n')),
]urlpatterns += i18n_patterns(path('admin/', admin.site.urls),path('', include('myapp.urls')),
)

九、JavaScript国际化

// static/js/i18n.js
const gettext = function(msgid) {return window.TRANSLATIONS[msgid] || msgid;
};const interpolate = function(fmt, obj) {return fmt.replace(/%\(\w+\)s/g, function(match) {return String(obj[match.slice(2,-2)]);});
};// 使用示例
const message = gettext('欢迎访问,%(name)s!');
const welcomeMessage = interpolate(message, {name: 'John'});

十、日期和数字格式化

python"># views.py
from django.utils.formats import date_format, number_format
from django.utils import translationdef format_example(request):current_language = translation.get_language()# 格式化日期today = date.today()formatted_date = date_format(today, format='DATETIME_FORMAT')# 格式化数字number = 1234567.89formatted_number = number_format(number,decimal_pos=2,use_l10n=True)return render(request, 'format_example.html', {'formatted_date': formatted_date,'formatted_number': formatted_number,})

通过本章学习,你应该能够:

  1. 配置Django国际化
  2. 实现字符串翻译
  3. 处理动态内容翻译
  4. 使用本地化格式

怎么样今天的内容还满意吗?再次感谢朋友们的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!


http://www.ppmy.cn/ops/145625.html

相关文章

Linux编程题

编写一个shell脚本&#xff0c;从键盘上输入若干数&#xff0c;计算其平均值 #!/bin/bash# 提示用户输入数字 echo "请输入若干个数字&#xff0c;输入完成后按 Enter&#xff0c;结束输入时请输入 done&#xff1a;"# 初始化变量 sum0 count0# 循环获取用户输入 wh…

游戏开发-UE4高清虚幻引擎教程

简介 Unreal Engine 4 相关教程&#xff0c;涵盖美术流程、独立游戏制作编程、虚拟现实实战、高级材质系统、蓝图可视化编程及进阶、RPG 游戏与特效开发、VR 交互虚拟漫游等方面。包含大量视频教程、工程文件及源码&#xff0c;如 UE4 零基础美术教程中有火焰材质等案例及模型…

PDF书籍《手写调用链监控APM系统-Java版》第11章 插件与链路的结合:HttpClient插件实现跨进程传输TraceSegment

本人阅读了 Skywalking 的大部分核心代码&#xff0c;也了解了相关的文献&#xff0c;对此深有感悟&#xff0c;特此借助巨人的思想自己手动用JAVA语言实现了一个 “调用链监控APM” 系统。本书采用边讲解实现原理边编写代码的方式&#xff0c;看本书时一定要跟着敲代码。 作者…

【机器学习】机器学习的基本分类-半监督学习-半监督生成对抗网络(Semi-supervised GANs)

半监督生成对抗网络&#xff08;Semi-supervised GANs&#xff0c;简称 SGAN&#xff09;是一种结合生成对抗网络&#xff08;GAN&#xff09;和半监督学习的模型&#xff0c;能够在有限标注数据和大量未标注数据的情况下训练分类器。它扩展了传统 GAN 的结构&#xff0c;使得判…

高校网络安全存在的问题与对策研究

目 录 摘 要1 第1章 引言2 1.1研究背景2 1.2研究意义2 第2章系统开发的相关技术简介3 2.1 Spring boot框架3 2.2 MySQL简介3 2.3 Vue框架3 2.4 JAVA简介3 第3章 系统需求分析4 3.1可行性分析4 3.1.1技术可行性4 3.1.2运行可行性4 3.1.3经济可行性5 3.2功能需求…

深入了解 Java 字符串:基础、操作与性能优化

在 Java 编程中&#xff0c;字符串 是最常用的数据类型之一。几乎所有的 Java 应用程序都会涉及到字符串操作&#xff0c;无论是读取用户输入、处理文件内容&#xff0c;还是与数据库进行交互。因此&#xff0c;掌握 Java 字符串的使用方式和相关技巧&#xff0c;对开发者来说至…

笔记本电脑需要一直插着电源吗?电脑一直充电的利弊介绍

笔记本电脑属于常用电子设备&#xff0c;它的便携性和功能性给我们带来了很多便利。但是&#xff0c;我们在使用笔记本电脑的时候&#xff0c;是否应该一直插着电源呢&#xff1f;这个问题可能困扰了很多人&#xff0c;因为不同的使用方式可能会对笔记本电脑的性能和寿命产生不…

AI 机器人外呼:智能沟通,开启全新营销与服务篇章

在当今数字化高速发展的时代&#xff0c;企业的营销与客户服务方式正经历着深刻变革。 AI 机器人外呼作为一项创新技术&#xff0c;正逐渐崭露头角&#xff0c;成为众多企业提升效率、优化客户体验的得力助手。 你是否接到过这样的电话&#xff1a;声音清晰流畅&#xff0c;对…