深入学习Django源码基础8 - Django中系统级国际化本地化

【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》 全书共分为13章,内容包括Django框架基础与环境搭建、常用配置、模型、视图与路由、模板、表单、后台管理、异常管理与自动化测试、用户Auth认证系统、安全与国际化,以及常用的Web应用程序工具等。此外,为了突出本书项目实战的特性,最后两章基于Django框架分别讲解了投票应用系统和内容管理系统两个实际项目的开发,可以帮助读者深入理解Django的应用开发流程。 阅读详情

具体使用步骤与分析http://www.ibm.com/developerworks/cn/web/1101_jinjh_djangoi18n/


本篇主要分析系统级的方法。不涉及自定义的

代码太多,采用逆向部分源码法来学习分析

main.py源码

import os
from django.utils.formats import *

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.settings')
print get_format('DATETIME_INPUT_FORMATS')


时间部分

ISO_INPUT_FORMATS = {
    'DATE_INPUT_FORMATS': ('%Y-%m-%d',),
    'TIME_INPUT_FORMATS': ('%H:%M:%S', '%H:%M'),
    'DATETIME_INPUT_FORMATS': (
        '%Y-%m-%d %H:%M:%S',
        '%Y-%m-%d %H:%M:%S.%f',
        '%Y-%m-%d %H:%M',
        '%Y-%m-%d'
    ),
}


settings.py中

__author__ = 'watsy'

TIME_ZONE = 'Asia/Shanghai'
LANGUAGE_CODE = 'en-us'
USE_I18N = True
USE_L10N = True
USE_TZ = True
LANGUAGE_CODE = 'zh-cn'
SECRET_KEY = 'm&vr890n*%65ed4!alhj!-d=24cz+#)0%5@dq_8bgc&0p'

进入get_format中,查看文件提供方法

_format_cache
_format_modules_cache
ISO_INPUT_FORMATS
reset_format_cache()
iter_format_modules()
iter_format_modules(lang)
get_format_modules(lange=None,reverse=False)
get_format(format_type,lang=None,use_l10n=None)
get_format_lazy
date_format(value,format=None,use_l10n=None)
time_format(value,format=None,use_l10n=None)
....
localize(value,use_l10n=None)
...

下面的全部调用到get_format获取。因此进入 get_format函数

def get_format(format_type, lang=None, use_l10n=None):
    format_type = force_str(format_type)
    if use_l10n or (use_l10n is None and settings.USE_L10N):
        if lang is None:
            lang = get_language()
        cache_key = (format_type, lang)
        try:
            cached = _format_cache[cache_key]
            if cached is not None:
                return cached
            else:
                # Return the general setting by default
                return getattr(settings, format_type)
        except KeyError:
            for module in get_format_modules(lang):
                try:
                    val = getattr(module, format_type)
                    for iso_input in ISO_INPUT_FORMATS.get(format_type, ()):
                        if iso_input not in val:
                            if isinstance(val, tuple):
                                val = list(val)
                            val.append(iso_input)
                    _format_cache[cache_key] = val
                    return val
                except AttributeError:
                    pass
            _format_cache[cache_key] = None
    return getattr(settings, format_type)
首先判断是否支持国际化

  如果支持,并且提供语言

     获取语言
  生存缓存关键字

       获取缓存并返回

       异常以后加载国际化语言模块从新获取,并记录到缓存


因此重点分析获取语言与模块提取部分

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

def get_format_modules(lang=None, reverse=False):
    """
    Returns a list of the format modules found
    """
    if lang is None:
        lang = get_language()
    modules = _format_modules_cache.setdefault(lang, list(iter_format_modules(lang)))
    if reverse:
        return list(reversed(modules))
    return modules

获取格式化模块部分重点在list遍历生成部分

def iter_format_modules(lang):
    """
    Does the heavy lifting of finding format modules.
    """
    if check_for_language(lang):
        format_locations = ['django.conf.locale.%s']
        if settings.FORMAT_MODULE_PATH:
            format_locations.append(settings.FORMAT_MODULE_PATH + '.%s')
            format_locations.reverse()
        locale = to_locale(lang)
        locales = [locale]
        if '_' in locale:
            locales.append(locale.split('_')[0])
        for location in format_locations:
            for loc in locales:
                try:
                    yield import_module('.formats', location % loc)
                except ImportError:
                    pass

检查语言是否支持

   格式化语言模块

   加载

def import_module(name, package=None):
    if name.startswith('.'):
        if not package:
            raise TypeError("relative imports require the 'package' argument")
        level = 0
        for character in name:
            if character != '.':
                break
            level += 1
        name = _resolve_name(name[level:], package, level)
    __import__(name)
    return sys.modules[name]

分析检查是否支持语言模块,最终定位到utils中translation下trans_real.py文件中

def check_for_language(lang_code):
    for path in all_locale_paths():
        if gettext_module.find('django', path, [to_locale(lang_code)]) is not None:
            return True
    return False

遍历本地化路径,判断多国语言的编码模块是否支持

进入本地化路径部分

def all_locale_paths():
    from django.conf import settings
    globalpath = os.path.join(
        os.path.dirname(upath(sys.modules[settings.__module__].__file__)), 'locale')
    return [globalpath] + list(settings.LOCALE_PATHS)

这段代码比较有意思,文件加载部分。

全局的代码会得到django.core.locale路径

本地化路径需要在settings.LOCALE_PATHS变量中设置。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------


获取语言部分

def get_language():
    t = getattr(_active, "value", None)
    if t is not None:
        try:
            return t.to_language()
        except AttributeError:
            pass
    from django.conf import settings
    return settings.LANGUAGE_CODE

得到当前激活的语言,否则返回 settings.LANGUAGE_CODE语言


在来看本地化语言的路径。


这里与上一片本地化内容一样了。


其他函数经过分析可以看出来

trans_real.py 包装了python的本地化方法。针对http部分进行了增强

format.py文件提供格式化系统级别的一些多国语言函数


以后有时间在分析app内使用的原理~

Arduino蜂鸣器播放《Astronomia》:从乐谱到代码的嵌入式音乐实现 在嵌入式系统开发中,通过编程控制硬件执行特定任务是核心基础。其原理在于利用微控制器生成精确的时序和频率信号,驱动执行器(如蜂鸣器、电机)完成预定动作。这项技术的价值在于实现了软件逻辑与物理世界的直接交互,是物联网设备、智能硬件开发的基石。常见的应用场景包括电子玩具的音效生成、报警器设计以及交互式艺术装置。本文以热门歌曲《Astronomia》的播放为例,具体展示了如何运用Arduino的`tone()`函数和数组数据结构,将抽象的乐谱转化为可执行的频率与延时控制代码,完整呈现了从**核心硬件解析**到**软 阅读详情

相关推荐

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月14日-Clamshell 拆卸与安装

Clamshell 拆卸与安装。

weixin_46735260的博客 1684

python动态加载模块_python 中怎么动态 import 模块?

32016-03-14 03:15:07 +08:00看一下 import_module 实现,当然, 3.x 直接用了。"""Backport of importlib.import_module from 3.x."""# While not critical (and in no way guaranteed!), it would be nice to keep this# code co...

weixin_39736606的博客 293

激光及激光器超全细节&原理总结

本文详细展示了激光、激光器、PN结、半导体激光器、光纤激光器的原理和应用;

guangwulv的博客 5342

python相对路径导包|模块

https://www.cnblogs.com/f-ck-need-u/p/9961372.html#%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84%E5%AF%BC%E5%85%A5%E9%99%B7%E9%98%B1

HayPinF的博客 7175

RabbitMq安装

本文详细介绍了在CentOS7系统上离线部署RabbitMQ4.3.2的完整流程。主要内容包括:1)准备RabbitMQ安装包、Erlang依赖和socat网络工具;2)安装系统编译依赖并编译安装Erlang;3)部署RabbitMQ服务,配置环境变量和socat依赖;4)启用Web管理插件并创建管理员账号;5)配置防火墙放行端口;6)设置Systemd开机自启服务;7)提供常用运维命令。文档特别强调离线部署注意事项,包括socat依赖、版本兼容性、账号安全及主机名配置等问题,为生产环境部署提供完整解决方案

sinat_25821779的博客 323

【rk3566/3568】Android 11移植gms

【rk3566/3568】Android 11移植gms 1、前言 测试功能时,想去Google play store去下个应用测试,发现通过网页搜索总是下载不到正确的谷歌服务框架;于是就不得不去搞一个内置的gms。 2、移植 1、需要下载Android 11对应的gms的包 opengapps 2、看下文件目录 直接移植core里面的文件,GAPPs Optional按需添加 3、在vendor下创建google目录 ...

lin_ff的博客 7645

python 模块导入详解

本文不讨论 Python 的导入机制(底层实现细节),仅讨论模块与包,以及导入语句相关的概念。通常,导入模块都是使用如下语句: import ... import ... as ... from ... import ... from ... import ... as ... 一般情况下,使用以上语句导入模块已经够用的。但是在一些特殊场景中,可能...

weixin_38167363的博客 278

PCL学习笔记(四)——点云曲面重建

文章目录一、凸包算法二、 单纯的点云数据固然很好,但仅仅是点的话仍是不够的,因为这不利于我们后续对实体对象的渲染与各种应用,如计算实体的表面积、体积等等,所以这就需要我们对实体进行点云的曲面重建。 一、凸包算法 在计算机图形学中,凸包是指在任意维空间中包含某一有限点集P的最小凸集,它由凸包顶点构成,在二维上其表现形式为一个凸多边形,而在三维上则表现为一个凸多面体。在二维层面上来讲,最常用的凸包算法有Graham扫描法和Jarvis卷包裹法,但前者并不适用于三维层面,后者倒是可以扩展到三维。除此之外,在

dayuhaitang1的博客 6912

python 基础系列(七) — Python中的模块

python 基础系列(七) — Python中的模块 python基础系列索引 python 基础系列(一) — Python介绍 python 基础系列(二) — Python基本语法 python 基础系列(三) — Python中的变量进阶 python 基础系列(四) — Python中的面向对象 python 基础系列(五) — Python中的继承 python...

bencheng06的博客 468

uniapp(微信小程序):实现PDF在线预览+在线预览pdf文件完整示例源码,支持文件来源:服务器pdf外链URL预览、调用后端API接口获取PDF文件流二进制下载及解析打开、上传本地PDF文件预览

uni-app实现PDF预览功能,uniapp微信小程序预览PDF,uniapp开发微信小程序在线预览pdf等文件,uniApp微信小程序实现PDF在线预览,Uniapp app在线预览pdf文件流,微信小程序实现pdf预览(苹果安卓兼容),uniapp-微信小程序 实现pdf外链在线预览,uniapp小程序如何做在线预览pdf功能,uniapp小程序端 实现pdf文件预览,微信小程序(uniapp)PDF预览完整实现方案示例demo源码,uni-app预览PDF,小程序pdf预览插件插件,Uniapp微信

✅ 精选推荐文章 4703

YOLOv11改进 | Conv篇 | DWRSeg扩张式残差助力小目标检测 (附创新修改后的C3k2DWRSeg)

本文内容给大家带来的DWRSeg中的DWR模块来改进YOLOv11中的C2f和Bottleneck模块,主要针对的是小目标检测,主要创新点可以总结如下:多尺度特征提取机制的深入研究和创新的DWR模块和SIR模块的提出这种方法使得网络能够更灵活地适应不同尺度的特征,从而更准确地识别和分割图像中的物体。DWRSeg的基本原理和框架,并且能够在你自己的网络结构中进行添加DWRSeg需要增加一定的计算量一个DWR模块大概增加0.4GFLOPsYOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备。

Snu77的博客 4184

django的国际化

 Django应用进行国际化的三个步骤: 1. 第一步:在你的Python代码和模板中嵌入待翻译的字符串。 2. 第二步:把那些字符串翻译成你要支持的语言。 3. 第三步:在你的Django settings文件中激活本地中间件 1.标准翻译: 使用函数 ugettext() 来指定一个翻译字符串。 作为惯例,使用短别名 _ 来引入这个函数以节省键入时间.不但可以翻译正常的字符

钟爱技术 1223

保边滤波之Mean shift filter

保边滤波之Mean shift filter 目录 保边滤波之Mean shift filter 一、算法原理 二、练手实现的算法代码如下: 三、实现结果 一、算法原理 在OpenCV中,meanshift filter函数为 p...

大熊 1561

Django支持多语言开发—i18n_django i18n

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《2024年Go语言全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

2401_84247423的博客 1159

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

python技术文档翻译_【翻译】Django1.8 中文文档

关于Django你需要知道的一些事情。开始你的第一步你是第一次接触Django或者……编程吗?那就从这里开始吧!从零开始:概览 | 安装教程:第一章: 模型 | 第二章: 用admin管理站点 | 第三章: 视图和模板 | 第四章: 表单和通用视图 | 第五章: 测试你的网站 | 第六章: 静态文件高级教程:怎样写一个复用性强的应用 | 编写你的第一个Django补丁模型层为了构建和操作你的网站应...

weixin_39573781的博客 96

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Python Django 5 Web应用开发实战

本文主要介绍了Python Django 5 Web应用开发实战,希望能对学习Python Web应用开发的同学们有所帮助。 文章目录 1. 前言 2. 书籍推荐 2.1 内容简介 2.2 本书作者 2.3 本书目录 2.4 适合读者 3. 购买链接

weixin_43178406的博客 2万+

【图书推荐】《Django 5企业级Web应用开发实战(视频教学版)》

本书精选当前简单、实用和流行的Django实例代码,帮助读者学习和掌握Django 5框架及其相关技术栈的开发知识。本书系统全面、内容翔实、重点突出、通俗易懂,基本涵盖Django 5框架应用开发的所有技术。本书配套示例源码、PPT课件和教学视频。本书共分为13章,内容包括Django框架基础与环境搭建、常用配置、模型、视图与路由、模板、表单、后台管理、异常管理与自动化测试、用户Auth认证系统、安全与国际化,以及常用的Web应用程序工具等。

夏天又到了的专栏 2263

从入门到精通:Babel本地化工具链使用教程

Babel是一个强大的Python国际化库,提供了一系列集成工具,帮助开发者轻松实现Python应用程序(尤其是基于Web的应用)的国际化和本地化。无论是处理多语言日期格式、数字转换,还是管理翻译文件,Babel都能提供高效解决方案。 ## 📋 核心功能概览 Babel作为Python国际化工具体系的核心,主要包含以下关键模块: ### 🌍 本地化数据处理 - **日期与时间格式化**:

gitblog_01067的博客 550

基于Python+Vue的在线学习笔记系统设计与实现django

🌞博主介绍:✌优快云特邀作者、全栈领域优质创作者、10年IT从业经验、码云/掘金/知乎/B站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发、文档编写、答疑辅导等。✌🌞👇🏻精彩专栏 推荐订阅👇🏻2023-2024年最值得选的微信小程序毕业设计选题大全:200个热门选题推荐✅2023-2024年最值得选的计算机毕业设计选题大全:500个热门选题推荐✅Java精品实战案例《500套》微信小程序项目精品案例《200套》

qq_33638415的博客 2741

CVAT 多语言配置实战:4 步完成国际化部署,让界面跟着团队语言走

这篇 CVAT 多语言支持指南面向刚接手部署的同学:读完后,你能在 CVAT 上启用 CVAT 中文界面、日文界面等自定义语言,学会用前端语言包 + Django 后端翻译 + 环境变量三层配合完成一套可切换的多语言环境,并掌握浏览器语言自动检测与手动切换的验证方法。 [![CVAT 标注场景插画:标注员面对的框、多边形、轨迹等元素,正是多语言界面需要覆盖的对象](https://raw.git

gitblog_00228的博客 739

Django基于Python的校园二手交易平台设计与实现(源码+lw+部署+讲解)

本基于Python的校园二手交易平台设计与实现采用B/S架构,数据库是MySQL。网站的搭建与开发采用了先进的Python进行编写,使用了Django框架。该系统从三个对象:由管理员和用户、店铺来对系统进行设计构建。主要功能包括:个人信息修改,对用户、店铺、二手物品、广告、资讯、留言反馈等功能进行管理。本系统在一般二手物品交易系统的基础上增加了首页推送最新信息的功能,方便用户快速浏览,是一个高效的、动态的、交互友好的二手物品交易系统。

qq_33638415的博客 1399

Django基于Python的汽车故障维修管理系统设计与实现(源码+lw+部署+讲解)

汽车维修,不仅需要在硬件上为现代社会的人们提供一个汽车维修的平台,获取汽车知识的环境,更要在软件上为车辆提供汽车维修的服务。于是汽车维修管理系统便应运而生。目前在本课题范围内,分析了汽车维修管理人员对汽车的管理现状和现有的用户对汽车维修管理人员的服务的要求。针对两者的要求,设计了一套基于Python的汽车维修管理系统。

qq_33638415的博客 1151

基于Python+Vue的图书文献服务系统设计与实现django(源码+lw+部署+讲解)

🌞博主介绍:✌优快云特邀作者、全栈领域优质创作者、10年IT从业经验、码云/掘金/知乎/B站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发、文档编写、答疑辅导等。✌🌞👇🏻精彩专栏 推荐订阅👇🏻2023-2024年最值得选的微信小程序毕业设计选题大全:200个热门选题推荐✅2023-2024年最值得选的计算机毕业设计选题大全:500个热门选题推荐✅Java精品实战案例《500套》微信小程序项目精品案例《200套》

qq_33638415的博客 1162

基于python的考研辅导学习平台设计与实现django(源码+lw+部署+讲解)

博主介绍:✌优快云特邀作者、全栈领域优质创作者、10年IT从业经验、码云/掘金/知乎/B站/华为云/阿里云等平台优质作者,计算机毕设实战导师,目前专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌技术栈范围:SpringBoot、Vue、SSM、HLML、Nodejs、Python、PHP、爬虫、数据可视化、小程序、安卓app、大数据等设计与开发。主要服务内容免费功能设计、选题定题、开题报告、任务书、程序开发、论文编写和辅导、论文降重、程序讲解、答辩辅导等,欢迎咨询~

qq_33638415的博客 728

基于python的毕业生就业去向反馈调查平台设计与实现django(源码+lw+部署+讲解)

博主介绍:✌优快云特邀作者、全栈领域优质创作者、10年IT从业经验、码云/掘金/知乎/B站/华为云/阿里云等平台优质作者,计算机毕设实战导师,目前专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌技术栈范围:SpringBoot、Vue、SSM、HLML、Nodejs、Python、PHP、爬虫、数据可视化、小程序、安卓app、大数据等设计与开发。主要服务内容免费功能设计、选题定题、开题报告、任务书、程序开发、论文编写和辅导、论文降重、程序讲解、答辩辅导等,欢迎咨询~

qq_33638415的博客 1132

Django基于Python的高校宿舍管理系统设计与实现(源码+lw+部署+讲解)

本高校宿舍管理平台设计,该系统包括了学生信息、寝室信息、宿舍安排、宿舍报修、物品登记、晚归登记、卫生评比、费用信息、论坛交流等。学生通过注册登录到平台上查看寝室相关信息,管理员对所有信息进行增删改查,不用手动抄录大量的数据报表,达到了双赢。本系统结合计算机技术的实际而设计,使用Python开发语言,工具为PyCharm,持久层的数据库采用MySQL

qq_33638415的博客 1158
上一篇: 深入学习Django源码基础7 - python的gettext国际化本地化
下一篇: 深入学习Django源码基础9 - 简单分析DjangoORM部分
watsy
博客等级 码龄19年 133粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值