openstack horizon国际化分析

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

参考

官网国际化介绍:https://docs.djangoproject.com/en/1.7/topics/i18n/translation/#module-django.conf.urls.i18n
Django模板(网页多语种支持/国际化): http://blog.csdn.net/pipisorry/article/details/45072215
中文翻译 : http://djangobook.py3k.cn/chapter18/

概念

I18N 国际化,是”Internationalization” 的缩写
G11N 全球化,是“Globalization” 的缩写
L10N 本地化,是“Localization” 的缩写

原理

Django的翻译机制是使用 GNU gettext (http://www.gnu.org/software/gettext/),具体为Python标准模块 gettext 。
通过 gettext --version 验证是否可用

开启国际化

openstack_dashboard\setting.py

    MIDDLEWARE_CLASSES = ('django.contrib.sessions.middleware.SessionMiddleware','django.middleware.locale.LocaleMiddleware',  #需要放在SessionMiddleware之后'django.middleware.common.CommonMiddleware',)TEMPLATE_CONTEXT_PROCESSORS = ('django.core.context_processors.i18n', #启用i18n'django.contrib.auth.context_processors.auth',)LANGUAGES = (('en', 'English'),('zh-cn', 'Simplified Chinese'))LANGUAGE_CODE = 'zh-cn'  #网站默认语言LANGUAGE_COOKIE_NAME = 'horizon_language'USE_I18N = True #开启i18nUSE_L10N = True #开启l10nLOCALE_PATHS = ['django_start/locale',]

步骤:

  1. TEMPLATE_CONTEXT_PROCESSORS 加入django.core.context_processors.i18n
  2. MIDDLEWARE_CLASSES中加入django.middleware.locale.LocaleMiddleware,注意:
    它要放在SessionMiddleware和CacheMiddleware的后面,其他中间件的前面
  3. LANGUAGE_CODE 设置缺省的网站语言,如 en, zh-cn,it, de-at, es, pt-br
  4. LANGUAGES设置网站所支持的所有语言,如(('en', u'English'),('zh-cn',u'中文'))
  5. USE_I18N 设置为True

html中使用

{% load i18n %} #启用i18n
<title> Learning Center {% trans "Welcome You" %}--Learn Center</title>
{% blocktrans %}This will have {{ value }} inside.{% endblocktrans %}

在 {% trans %} 中不允许使用模板中的变量,只能使用单引号或双引号中的字符串。 如果翻译时需要用到变量(占位符),可以使用 {% blocktrans %}

py中使用

from django.utils.translation import ugettext_lazy as _
CONSUMER_CHOICES = (('back-end', _('back-end')),
)

可参考:openstack_dashboard/api/cinder.py

js中使用

urls.py文件

urlpatterns = [url(r'^admin/', include(admin.site.urls)),url(r'^jsi18n/(?P<packages>\S+?)/$', 'django.views.i18n.javascript_catalog'),   #定义js上的i18n
]

html文件中

<script type="text/javascript" src="/jsi18n/django_start+django_i18n"></script>  #引入js文件,多个app用+分隔

js文件中

var i18njs = gettext('Welcome'); #直接使用全局的gettext即可

生成语言

在django app目录执行如下命令,将自动检索需要翻译的文件并生成对应的po文件

django-admin.py makemessages -l zh_CN #
django-admin.py makemessages -d djangojs -l zh_CN

django.po和djangojs.po文件区别:

  1. py、html文件中的需要翻译的字符串运行上述命令会自动识别,并添加到django.po文件中
  2. 外部js文件中需要翻译的字符串需要手动创建djangojs.po文件,并将翻译字符串写进去

语言编译

语言翻译完成后 , 通过如下命令将django.po和djangojs.po编译为.mo文件

cd horizon && django-admin compilemessages
cd openstack_dashboard && django-admin compilemessages

编译完成后需要重启项目才能使多语言生效。

语言切换

<form action="{% url 'set_language' %}" method="post">
{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select name="language">  
{% get_language_info_list for LANGUAGES as languages %}  
{% for language in languages %}  
<option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}>  
{{ language.name_local }} ({{ language.code }})  
</option>  
{% endfor %}  
</select>  
<input type="submit" value="Go" />  
</form>  

补充

session db

需要用数据库保存 session,在工程目录中执行如下命令产生 django_session。

python manage.py syncdb

确定语言步骤

LocaleMiddleware 按照如下算法确定用户的语言:
1、在当前用户的 session 的中查找django_language键; 可以通过LANGUAGE_COOKIE_NAME改变,比如:LANGUAGE_COOKIE_NAME = 'horizon_language'
2、它会找寻一个cookie
3、还找不到的话,它会在 HTTP 请求头部里查找Accept-Language, 该头部是你的浏览器发送的,并且按优先顺序告诉服务器你的语言偏好。
Django会尝试头部中的每一个语种直到它发现一个可用的翻译。
4、以上都失败了的话, 就使用全局的 LANGUAGE_CODE 设定值。

转载于:https://my.oschina.net/sannychan/blog/903330

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 收集诊断跟踪信息与如何分析瓶颈

1. 前言上面我们已经做到了接口以及场景压测&#xff0c;通过控制台输出结果&#xff0c;我们只需要将结果收集整理下来&#xff0c;最后汇总到excel上&#xff0c;此次压测报告就可以完成了&#xff0c;但收集报告也挺麻烦的&#xff0c;交给谁呢……找了一圈、没找到愿意接手…

被AI人机疯狂单杀?王者荣耀AI“绝悟”亲测体验

文章目录&#xff08;一&#xff09; 如何评测“绝悟”的智能程度&#xff1f;&#xff08;二&#xff09;“绝悟”个体操作能力分析2.1 草丛埋伏2.2 越塔强杀2.3 技能避伤2.4 技能combo&#xff08;三&#xff09;“绝悟”团队意识能力分析3.1 团队支援3.2 团队控龙3.3 反野意…

background意识(两)

今天看到了有关学习的价值的文章background于background-position该博客&#xff0c;现在与大家分享&#xff1a;语法&#xff1a; background-position : length || length background-position : position || position 取值&#xff1a; length&#xff1a;百分数 |由浮点数字…

js 月份加6个月_美国切削工具6月份订单较上月增加10.1

根据美国切削工具协会(USCTI)和AMT美国制造技术协会的数据&#xff0c;2020年6月&#xff0c;美国切削工具的总消费额为1.506亿美元。根据参与切削工具市场报告合作的公司报告&#xff0c;这一总额比5月份的1.368亿美元增长了10.1%&#xff0c;与2019年6月报告的1.997亿美元相比…

selenium 使用js执行脚本儿链接整理

2019独角兽企业重金招聘Python工程师标准>>> 使用Webdriver执行js小结&#xff1a;http://lijingshou.iteye.com/blog/2018929 SeleniumWebdriver学习(三)执行JS脚本&#xff1a;http://www.tuicool.com/articles/buIbeiN selenium webdriver 执行javascript代码&am…

接口返回json对象出现套娃递归问题 | System.Text.Json 版本

前言看到一篇文章《Asp-Net-Core开发笔记&#xff1a;接口返回json对象出现套娃递归问题》原文是使用 NewtonsoftJson 解决的返回json对象出现套娃递归问题&#xff1a;services.AddControllersWithViews().AddNewtonsoftJson(options > {options.SerializerSettings.Refere…

高效性跨平台分布式软件开发技术——gRPC

文章目录1. gRPC&#xff08;google Remote Procedure Call&#xff09; 技术 —— 高效性地跨平台、跨语言开发2. 基于 python 实现 gRPC 框架2.1 一个 gPRC 项目必须包含的几大部分2.2 helloworld.proto 文件——定义全局可调用函数及其参数数据结构2.3 server.py 文件——实…

在VS中设置比较和谐的字体和颜色的方法

作者&#xff1a;朱金灿来源&#xff1a;http://blog.csdn.net/clever101先在studiostyl.es网站选择你喜欢的字体方案&#xff0c;我个人比较喜欢这款&#xff1a;Humane Studio&#xff0c;注意在网页上选择你使用VS版本&#xff0c;然后单击Downlaod this scheme就可以了&…

一个脚本实现全量增量备份,并推送到远端备份中心服务器

2019独角兽企业重金招聘Python工程师标准>>> 摘要 由于工作需要&#xff0c;刚好需要这样一个功能的脚本&#xff0c;主要解决&#xff1a; 1. 不想在crontab中调度两条备份任务&#xff0c;一个做全量一个做增量 2. 如果每小时做增量&#xff0c;凌晨4点做全量&…

地壳中元素含量排名记忆口诀_Nature:利用熔融包裹体的元素和同位素示踪俯冲带流体来源...

Nature&#xff1a;利用熔融包裹体的元素和同位素示踪俯冲带流体来源在汇聚板块边缘&#xff0c;大洋岩石圈通过俯冲作用携带挥发分(尤其是水)进入地幔。这些俯冲下去的水/流体控制着岩浆产物、地震活动、陆壳形成和资源成矿。但是&#xff0c;识别不同流体的来源(沉积物&#…

Windows 10开发基础——文件、文件夹和库(一)

Windows 10开发基础——文件、文件夹和库&#xff08;一&#xff09; 原文:Windows 10开发基础——文件、文件夹和库&#xff08;一&#xff09;主要内容&#xff1a; 1.枚举查询文件和文件夹 2.文本文件读写的三种方法——创建写入和读取文件 3.获得文件的属性 枚举查询文件和…

Sigmoid函数与逻辑回归

文章目录(1). Sigmoid函数的由来——伯努利分布的衍生物1.1 为什么会有 sigmoid 函数的出现&#xff1f;1.2 sigmoid 函数推导过程1.3 sigmoid 函数求导(2). 逻辑回归&#xff08;Logistic Regression&#xff09;2.1 逻辑回归算法的最终本质——求决策边界2.2 逻辑回归算法中的…

Avalonia跨平台入门第二十二篇之人脸检测

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定、自定义Window样式、动画效果、Expander控件、ListBox折叠列表、聊天窗口、ListBox图片消息、窗口抖动、语音发送、语音播放、语音播放问题、玩…

pkpm板按弹性计算还是塑性_PKPM中的S\R验算显红原因分析

PKPM软件砼结构施工图中的&#xff0c;梁的配筋面积中&#xff0c;SR验算&#xff0c;经常会有个别构件显红的情况。查了一下PKPM说明书&#xff0c;并没有针对此情况的详细说明。根据本人的实际经验&#xff0c;总结了一下解决此问题的主要方法&#xff1a;一.超筋SR的值显示为…

多智能体连续行为空间问题求解——MADDPG

目录1. 问题出现&#xff1a;连续行为空间出现2. DDPG 算法2.1 DDPG 算法原理2.2 DDPG 算法实现代码2.2.1 Actor & Critic2.2.2 Target Network2.2.3 Memory Pool2.2.4 Update Parameters&#xff08;evaluate network&#xff09;2.2.5 Update Parameters&#xff08;targ…

在.NET 6 中如何创建和使用 HTTP 客户端 SDK

如今&#xff0c;基于云、微服务或物联网的应用程序通常依赖于通过网络与其他系统通信。每个服务都在自己的进程中运行&#xff0c;并解决一组有限的问题。服务之间的通信是基于一种轻量级的机制&#xff0c;通常是一个 HTTP 资源 API。从.NET 开发人员的角度来看&#xff0c;我…

ttl接地是高电平还是低电平_功放技术参数1——高电平

在汽车音响中的功放或者DSP再或者是DSP功放中我们都会遇到高电平信号或者低电平信号输入&#xff0c;我们该如何判断主机输出的到底是高电平信号还是低电平信号呢&#xff1f;我们可以用一个很简单的方法来鉴定&#xff0c;那就是主机输出能够直接驱动喇叭的为高电平信号输出&a…

MultiProcessing中主进程与子进程之间通过管道(Pipe)通信

Python 中 Multiprocessing 实现进程通信1. 如何建立主进程与子进程之间的通信管道&#xff1f;2. 为什么一定要将Pipe中的某些端close()?本文参考自&#xff1a;python 学习笔记 - Queue & Pipes&#xff0c;进程间通讯 1. 如何建立主进程与子进程之间的通信管道&#xf…

如何为 .NET 项目自定义强制代码样式规则

前言每个人都有自己的代码样式习惯:命名约定、大括号、空格、换行等。但是&#xff0c;作为一个团队来说&#xff0c;应该使用同样的代码样式规则。这样可以有效减少编译器的警告/建议&#xff0c;保证阅读代码的人员理解一致。今天我们介绍一种为单独的 .NET 项目定义代码样式…

我是如何帮助创业公司改进企业工作的

前段时间在一家创业公司实习&#xff0c;几十个人的团队&#xff0c;正处在规模逐渐扩大的阶段&#xff0c;但是整个公司的协作工作和日常管理却越来越麻烦&#xff0c;鉴于我以前对Saas和协作平台都有过一点研究&#xff0c;于是leader叫我去找一个“简单&#xff0c;好用&…