【Django 开发】 (国际化项目&支持多语言)_django language_code

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

2.1 为翻译字符串添加钩子

1) py文件

将需要翻译的字符串统一使用gettext_lazygettext包裹

from django.utils.translation import gettext_lazy as _

class Candidate(models.Model):
	# \* 基础信息 (对于整形数值一定要定义null=true,因为如果没有赋值,数据库会声明不能为null
	user_id = models.IntegerField(verbose_name=_('应聘者ID'), blank=True, null=True)
	username = models.CharField(max_length=135, verbose_name=_('姓名'))
	city = models.CharField(max_length=135, verbose_name=_('城市'), blank=True)
	phone = models.CharField(max_length=135, verbose_name=_('手机号码'))
	email = models.EmailField(max_length=135, verbose_name=_('邮箱'), blank=True)
	gender = models.CharField(max_length=135, verbose_name=_('性别'), blank=True)
	apply_position = models.CharField(max_length=135, verbose_name=_('应聘职位'), blank=True)
	born_address = models.CharField(max_length=135, verbose_name=_('生源地'), blank=True)
	candidate_remark = models.CharField(max_length=135, blank=True, verbose_name=_('候选人信息备注'))

2)HTML文件

导入i18n,为需要翻译的代码添加代码{% translate %} 或者{% blocktranslate %}用于存在变量翻译

{% load i18n %}
				<div class="">
					<h6 class="uppercase font-semibold mb-4 flex justify-center md:justify-start">
						{% translate 	"Useful links" %}
					</h6>
					<p class="mb-4">
						<a href="#!" class="text-gray-600">{% translate 	"Pricing" %}</a>
					</p>
					<p class="mb-4">
						<a href="#!" class="text-gray-600">{% translate 	"Settings" %}</a>
					</p>
					<p class="mb-4">
						<a href="#!" class="text-gray-600">{% translate 	"Orders" %}</a>
					</p>
					<p>
						<a href="#!" class="text-gray-600">{% translate 	"Help" %}</a>

-----------------------------------------------------------------------------------------------
<-- 块翻译 -->
{% blocktranslate with job_name=job.job_name job_city=job.job_place %}
		<h2>岗位名称:{{ job_name }}</h2>
		<div>
		</div>
		<div>
			城市: {{ job_city }}
		</div>
		{% endblock %}

如果在翻译中存在二级变量或者三级变量在渲染时需要提前保存

2.2 生成本地化翻译资源文件

  1. 在settings加入如下

# 默认语言
LANGUAGE_CODE = 'zh-hans'

from django.utils.translation import gettext_lazy as _

LANGUAGES = [
    ('en', _('English')),
    ('zh-hans', _('Simplified Chinese')),
]
# 用于存放django.po和django.mo编译过的翻译文件
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__name__)))
LOCALE_PATHS = (
    os.path.join(PROJECT_ROOT, 'locale'),
)


  1. 在项目根目录下生成locale目录,用于保存翻译消息文件(.po和.mo格式的)
  2. 在终端输入

( 大坑插入
由于在gettext版本低于0.15, 报错Make sure you have GNU gettext tools 0.15 or newer installed.,我花了一整天时间处理😑,由于支持window系统以及配置网上的方法都比较旧,最后还是stackoverflow香😎,直接在网址https://mlocati.github.io/articles/gettext-iconv-windows.html下载static 64文件,将其bin文件配置到系统环境变量即可!!

django-admin makemessages -l zh_Hans -l en

  • 生成对应文件
    在这里插入图片描述
  1. 我们需要在对应的文件中,给这些需要翻译的键添加值 ( msgid (message id)是键,msstr(message str)是值。
  • en 文件

( 这里的en 是之前所设置的名字,需要与setting中语言配置元组中第一个数据一样,此时我们需要都将中文翻译成英文,注意!!不进行翻译会默认使用其他语言!,例如在中文广州市翻译中翻译成了英文!
在这里插入图片描述
在这里插入图片描述

msgid "工作经验"
msgstr "work-experience"

#: .\jobs\models.py:65
msgid "项目经历"
msgstr "product-experience"

#: .\jobs\models.py:75 .\jobs\models.py:76
msgid "简历"
msgstr "resume"

#: .\jobs\views.py:60
msgid "job does not exist"
msgstr "工作不存在"

#: .\recruitment\urls.py:34
msgid "霍格沃兹学院"
msgstr "Hogwarts"

#: .\recruitment\urls.py:36 .\templates\base.html:9
msgid "霍格沃兹招聘信息网"
msgstr "Hogwarts job list"


  • zh_Hans 文件则翻译为中文
msgstr "忘记密码?"

#: .\templates\account\login.html:71
msgid "Log In"
msgstr "登 录"

#: .\templates\account\login.html:75
msgid "Don't have an account?"
msgstr "还没有账户?"

#: .\templates\account\login.html:75
msgid "Register here."
msgstr "点击注册"

#: .\templates\account\logout.html:9 .\templates\account\logout.html:12
#: .\templates\account\logout.html:21
msgid "Sign Out"
msgstr "注销"

#: .\templates\account\logout.html:14
msgid "Are you sure you want to sign out?"
msgstr "你确定要注销吗"

  1. 编译为二进制文件
django-admin compliemessages

在这里插入图片描述

三、配置settings文件

  1. 添加路径映射
  path('i18n/', include('django.conf.urls.i18n')),

  1. settings添加国家化的配置
# 默认语言
LANGUAGE_CODE = 'en-us'

# 设置I18n和L10N为True
USE_I18N = True
USE_L10N = True

from django.utils.translation import gettext_lazy as _

LANGUAGES = [
    # 第一个是对应语言,第二个是字符串表达
    ('en', _('English')),
    ('zh-hans', _('Simplified Chinese')),
]
# 用于存放django.po和django.mo编译过的翻译文件
LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)

  • 效果

可以看到中文都翻译成了自己翻译的英文

在这里插入图片描述

  1. 配置本地化中间件

LocaleMiddleware这个中间件。它的位置也很重要,应于SessionMiddleware之后,CommonMiddleware之前。(通用中间件前,改中间件主要用于一些简单处理,如语言的切换对于路径操作)

MIDDLEWARE = [
    'interview.performance.performance\_logger\_middleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware', # 新增多语支持
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

四、让用户自己选择语言

1) 通过表单修改语言版本

添加下拉框选择语言,在base.html根模板下修改如下

{# set language #}
<form method="POST" action="{% url "set_language" %}">
    {% csrf_token %}
    <input type="hidden" name="next" value="{{ redirect\_to }}"/>
    <select name="language">
        {# 得到当前语言#}
        {% get_current_language as LANGUAGE\_CODE %}
        {# 可用语言就是setting文件配置的元组 #}
        {% get_available_languages as LANGUAGES %}
        {# 获取可用语言详细信息字典#}
        {% get_language_info_list for LANGUAGES as languages %}
        {% for language in languages %}               {# 复选框默认为当前语言 #}
            <option value="{{ language.code }}" {% if language.code == LANGUAGE\_CODE %} selected {% endif %}>
                {{ language.name_local }} {{ language.code }}
            </option>
        {% endfor %}
    </select>


![img](https://img-blog.csdnimg.cn/img_convert/8d209abf42b0cf078f015c8cab1e6eee.png)
![img](https://img-blog.csdnimg.cn/img_convert/e7b648bbc7c84e7c8b8f2079600d4949.png)
![img](https://img-blog.csdnimg.cn/img_convert/0a8142ece6508245f8891f7b7ebb3070.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


[外链图片转存中...(img-RVYsbi3z-1714985544659)]
[外链图片转存中...(img-oO6fp8xG-1714985544659)]
[外链图片转存中...(img-2sFhcCRB-1714985544659)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值