openstack horizon国际化分析
2019獨角獸企業重金招聘Python工程師標準>>>
參考
官網國際化介紹: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',]步驟:
它要放在SessionMiddleware和CacheMiddleware的后面,其他中間件的前面
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_CNdjango.po和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
總結
以上是生活随笔為你收集整理的openstack horizon国际化分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Idea maven项目不能新建pack
- 下一篇: Yet another nio fram