
🤵♂️ 个人主页: @计算机魔术师
👨💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。
🌐 推荐一款找工作神器网站: 牛客网🎉🎉|笔试题库|面试经验|实习招聘内推
还没账户的小伙伴 速速点击链接跳转牛客网登录注册 开始刷爆题库,速速通关面试吧🙋♂️
该文章收录专栏
✨—【Django | 项目开发】从入门到上线 专栏—✨
文章目录


这个翻译不是浏览器翻译的,Django也不会帮你翻译。这个需要你自己事先手动翻译好,存放在专门翻译文件中,Django只是事后调用而已。
将需要翻译的字符串统一使用gettext_lazy或gettext包裹
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=_('候选人信息备注'))
导入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 %}
如果在翻译中存在二级变量或者三级变量在渲染时需要提前保存
# 默认语言
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'),
)
locale目录,用于保存翻译消息文件(.po和.mo格式的)( 大坑插入:
由于在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

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"
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 "你确定要注销吗"
django-admin compliemessages

path('i18n/', include('django.conf.urls.i18n')),
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'),
)
可以看到中文都翻译成了自己翻译的英文

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',
]
添加下拉框选择语言,在
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>
{% trans "The current language:" %} {{ LANGUAGE_CODE }}
<button type="submit">{% trans "Switch" %}</button>
</form>
django文档一样
tailwind){# set language #}
<div class="fixed bottom-0 right-0 mb-3 xl:w-96">
<form method="POST" action="{% url "set_language" %}" class="my-2 p-1 flex rounded svelte-1l8159u">
{% csrf_token %}
<input type="hidden" name="next" value="{{ redirect_to }}"/>
<select name="language" class="form-select form-select-sm
appearance-none
block
w-full
px-2
py-1
text-sm
font-normal
text-gray-700
bg-white bg-clip-padding bg-no-repeat
border border-solid border-gray-300
rounded
transition
ease-in-out
m-0
focus:text-gray-700 focus:bg-blue focus:border-blue-600 focus:outline-none">
{# 得到当前语言#}
{% 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 %}>
{% trans "The current language:" %} {{ language.name_local }} {{ language.code }}
</option>
{% endfor %}
</select>
<button type="submit" class="inline-block px-4 py-1.5 bg-blue-600 text-white font-medium text-xs leading-tight uppercase rounded shadow-md hover:bg-blue-700 hover:shadow-lg focus:bg-blue-700 focus:shadow-lg focus:outline-none focus:ring-0 active:bg-blue-800 active:shadow-lg transition duration-150 ease-in-out">{% trans "Switch" %}</button>
</form>
</div>

其实
django官方文档的国家化项目中也是这么干的
这里需要添加路由url i18n_patterns
from django.contrib import admin
from django.urls import path, include
from django.conf.urls.i18n import i18n_patterns
urlpatterns = [
path('i18n/', include('django.conf.urls.i18n')),
]
urlpatterns += i18n_patterns(
path('admin/', admin.site.urls),
path('', include('myapp.urls')),
)
这样在不同路径下,就会切换语言,但是目前是需要全部项目的路由都要修改,不知道如何配置才不需要😂(参考文章: 大江狗 | 刘江的博客)
django查询语言是先从
url找,然后再从cookie里面找,再从浏览器header里面找,如果都没有的话则使用系统默认语言LANGUAGE_CODE
在切换语言from表单中,我们所提交的表单路径
set_language是我们所导入i18n url路径所提供的,提交的language.code能够对应到我们所设置的语言就能切换语言。

🤞到这里,如果还有什么疑问🤞
🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server