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

Django国际化

一、今日学习内容概述

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

二、国际化基础配置

# 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',
    # ...
]

三、代码中的字符串翻译

# 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 messages

def 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 模型翻译

# models.py
from django.db import models
from django.utils.translation import gettext_lazy as _

class TranslatableModel(models.Model):
    """可翻译内容的基类"""
    class Meta:
        abstract = True

class 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 表单翻译

# 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国际化

# urls.py
from django.conf.urls.i18n import i18n_patterns
from django.urls import path, include

urlpatterns = [
    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'});

十、日期和数字格式化

# views.py
from django.utils.formats import date_format, number_format
from django.utils import translation

def format_example(request):
    current_language = translation.get_language()
    
    # 格式化日期
    today = date.today()
    formatted_date = date_format(today, format='DATETIME_FORMAT')
    
    # 格式化数字
    number = 1234567.89
    formatted_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大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/941881.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能离散数学基础】——深入详解图论:基础图结构及算法,应用于图神经网络等

深入详解图论&#xff1a;基础图结构及算法&#xff0c;应用于图神经网络等 图论&#xff08;Graph Theory&#xff09;是数学中研究图这种离散结构的分支&#xff0c;广泛应用于计算机科学、网络分析、人工智能等领域。随着图神经网络&#xff08;Graph Neural Networks, GNNs…

【docker】docker desktop 在windows上支持 host模式

针对以前的情况&#xff0c;对于 Windows 和 macOS 用户&#xff0c;是不能够使用host模式的。只能在linux上才能够使用 更新日志 docker desktop 在4.34.0版本&#xff0c;开始支持host模式。

【ALGC】探秘 ALGC—— 卓越数据处理能力的科技瑰宝

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 在大数据时代&#xff0c;如何高效地处理和分析海量数据是一个核心挑战。ALGC&#xff08;Advanced Learning and Generalized Comp…

FPGA实现MIPI转FPD-Link车载同轴视频传输方案,基于IMX327+FPD953架构,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、详细设计方案设计原理框图IMX327 及其配置FPD-Link视频串化-解串方案MIPI CSI RX图像 ISP 处理图像缓存HDMI输出工程源码架构 5、…

STM32 与 AS608 指纹模块的调试与应用

前言 在嵌入式系统中&#xff0c;指纹识别作为一种生物识别技术&#xff0c;广泛应用于门禁系统、考勤机、智能锁等场景。本文将分享如何在 STM32F103C8T6 开发板上使用 AS608 指纹模块&#xff0c;实现指纹的录入和识别功能。 硬件准备 STM32F103C8T6 开发板AS608 指纹模块…

Linux Shell 基础教程⑧

Shell 教程 Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服务。 Ke…

网络刷卡器的功能和使用场景

网络刷卡器是一种连接互联网的设备&#xff0c;能够通过网络将读取到的各种卡片信息传输至服务器进行处理。这类刷卡器通常支持多种类型的卡片&#xff0c;如银行卡、身份证、会员卡、公交卡等&#xff0c;并运用现代信息技术确保数据的安全性和高效性&#xff0c;功能十分强大…

Centos7下的根口令重置与GRUB修复

目录 1. 利用GRUB进入单用户模式重置根口令&#xff1b; 步骤较多方法 步骤较少方法&#xff1a;这里主要是把重新以rw方式挂载的步骤换为了在编辑模式直接修改 2. 利用Linux系统安装光盘进入急救模式重置根口令&#xff1b; 3. 如果GRUB损坏&#xff0c;利用Linu…

赋能新一代工业机器人-望获实时linux在工业机器人领域应用案例

在工业4.0蓬勃发展的当下&#xff0c;工业机器人作为制造业转型升级的中流砥柱&#xff0c;正朝着超精密、极速响应的方向全力冲刺。然而&#xff0c;为其适配理想的望获实时Linux系统&#xff0c;却犹如寻找开启宝藏之门的关键钥匙&#xff0c;成为众多企业在智能化进程中的棘…

“无需代码,一句需求,立刻看到你的创意变成网页”==>前端AI工具 “V0”

想象一下&#xff0c;一个能帮你跳过所有烦人的代码编写过程&#xff0c;直接根据你的需求生成页面的 AI&#xff01;没错&#xff0c;这就是 v0&#xff01;你只需要用自然语言描述你想要的界面&#xff0c;v0 就会挥一挥它的“魔法鼠标”&#xff0c;立刻生成漂亮的 UI 代码。…

C语言(一)——初识C语言

目录 简单认识一段代码 数据类型 变量和常量 变量的作用域和变量的生命周期 常量 字符串 转义字符 注释 函数 数组 操作符 关键字 结构体 结构的声明 结构成员的类型 结构体变量的初始化 结构体传参 简单认识一段代码 main()函数是程序的入口&#xff0c;所以…

频繁拿下定点,华玉高性能中间件迈入商业化新阶段

伴随着智能驾驶渗透率的快速增长&#xff0c;中国基础软件市场开始进入黄金窗口期。 近日&#xff0c;华玉通软&#xff08;下称“华玉”&#xff09;正式获得某国内头部轨道交通产业集团的智能化中间件平台定点项目。这将是华玉在基础软件领域深耕和商业化发展过程中的又一重…

怎么学习数据结构与算法?

数据结构与算法 提及数据结构与算法&#xff0c;许多人可能会不自觉地皱起眉头。似乎在不知不觉中&#xff0c;以字节跳动为代表的一批公司&#xff0c;在面试环节开始了一场针对算法的连环盘问。若非事先系统地刷过一系列算法题目&#xff0c;想要轻松通过这一关&#xff0c;…

MySQL通过日志恢复数据的步骤

试验环境&#xff1a;Windows Server2012 r2、MySql-8.0.27-winx64。 1、先检查MySQL有没有开启binlog日志 通过下面的SQL命令查看MySQL是否开启日志以及日志文件的位置&#xff1a; show variables like %log_bin% 执行结果如下图所示&#xff1a; 图中&#xff0c;log_bi…

react+antd的Table组件编辑单元格

需求&#xff1a;新增加一行&#xff0c;且单元格可以编辑 场景&#xff1a;真实的业务需求&#xff08;antd 3 版本react&#xff09; 效果图&#xff1a;1. 默认增加一行时&#xff0c;第一列是下拉选择框&#xff0c;第2 3列是TextArea&#xff0c;图1 2. 当下拉选择的数据不…

基于Springboot的数码产品抢购系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

LabVIEW电机控制中的主动消抖

在LabVIEW电机控制系统中&#xff0c;抖动现象&#xff08;如控制信号波动或机械振动&#xff09;会影响系统的稳定性和精度。通过使用主动消抖算法&#xff0c;可以有效降低抖动&#xff0c;提高控制性能。本文将介绍几种主流的主动消抖算法&#xff0c;并结合具体应用案例进行…

连续自成核退火热分级(SSA)技术表征共聚聚丙烯(PP)分子链结构

共聚聚丙烯是一种多相多组分高分子体系&#xff0c;体系中同时存在多种链组成、序列结构和相结构。研究表明&#xff0c;共聚聚丙烯中除了均聚聚丙烯外&#xff0c;还有乙丙无规共聚物&#xff08;又称乙丙橡胶&#xff0c;EPR&#xff09;及不同序列长度的乙丙嵌段共聚物&…

游戏AI实现-寻路算法(Dijkstra)

戴克斯特拉算法&#xff08;英语&#xff1a;Dijkstras algorithm&#xff09;&#xff0c;又称迪杰斯特拉算法、Dijkstra算法&#xff0c;是由荷兰计算机科学家艾兹赫尔戴克斯特拉在1956年发现的算法。 算法过程&#xff1a; 1.首先设置开始节点的成本值为0&#xff0c;并将…

C# OpenCV机器视觉:缺陷检测

在一个阳光明媚的早晨&#xff0c;阿强正准备享受他的一杯咖啡&#xff0c;突然接到了老板的电话。“阿强&#xff0c;我们的生产线出现了问题&#xff01;有几个产品的质量不合格&#xff0c;客户投诉不断&#xff01;你能不能想办法解决这个问题&#xff1f;” 阿强一听&…