django支持多语言 ゝ一纸荒年。 2022-12-12 04:53 143阅读 0赞 ## Django支持多语言切换 ## 下面介绍下如何使网站或APP国际化,让其支持多种语言 。 [官网][Link 1] ### 效果 ### ![在这里插入图片描述][20201006133549593.gif_pic_center] ### 1、创建locale文件夹 ### 先在项目根目录下创建一个名为locale的文件夹,这个文件夹是用来存放django.po和django.mo编译过的翻译文件。下面是我的项目文件夹示例: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj_size_16_color_FFFFFF_t_70_pic_center] ### 2、settings.py中配置 ### 首先配置中间件,添加LocaleMiddleware,放在SessionMiddleware后面,CommonMiddleware前面, 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', ] 配置支持多语言: from django.utils.translation import ugettext_lazy as _ LANGUAGE_CODE = 'zh-hans' # 默认使用中国时区 TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = True LANGUAGES = ( ('en', _('English')), ('zh-hans', _('Simplified Chinese')), ) # 用于存放django.po和django.mo编译过的翻译文件 LOCALE_PATHS = (os.path.join(BASE_DIR, 'locale'),) ### 3、设置urls.py ### 在项目中的路由配置urls.py中设置i18n多语言路由。 from django.conf.urls.i18n import i18n_patterns from django.contrib import admin from django.urls import path, re_path, include from django.views.static import serve from mallSystem import settings urlpatterns = [ path('i18n/', include('django.conf.urls.i18n')), ] urlpatterns += i18n_patterns( path('admin/', admin.site.urls), path("", include("mall.urls")), re_path(r'^static/(?P<path>.*)$', serve, { 'document_root': settings.STATICFILES_DIRS}), ) 注:i18n是国际化(Internationalization)的缩写。i 和 n 之间有 18 个字母,简称 i18n,。l10n是本地化(localization)的缩写。l 和 n 之间有 10 个字母,简称 l10n。 ### 4、访问admin ### 现在就可以通过不同的语言来访问后台管理网站了, 中文:http://127.0.0.1:8001/zh-hans/admin/login/ ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj_size_16_color_FFFFFF_t_70_pic_center 1] 英文:http://127.0.0.1:8001/en/admin/login/ ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj_size_16_color_FFFFFF_t_70_pic_center 2] ### 5、翻译py、html中的字符串 ### 在py文件中使用函数ugettext\_lazy 。 在html中使用标签\{% trans “string” %\}或\{% blocktrans%\} \{%endblocktrans %\} ,需在文件开头加入\{% load i18n %\} 表示使用多语言。 下面是翻译的一个示例。通过访问url来得到不同语言的html。 apps/mall/urls.py from django.urls import path from mall import views urlpatterns = [ path("", views.index, name="index"), # 首页 ] apps/mall/views.py from django.shortcuts import render from django.utils.translation import ugettext_lazy as _ def index(request): context = { 'msg': _("这是一个有趣的购物网站,你可以在这里购买都衣服、手提包、鞋子等等")} return render(request, 'index.html', context) templates/index.html <!DOCTYPE html> {% load static %} {% load i18n %} <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="description" content="Quickly get a project started with any of our examples ranging from using parts of the framework to custom components and layouts."> <title>{% trans "购物网站" %}</title> <link rel="canonical" href="https://getbootstrap.com/docs/4.5/examples/"> <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous"> <style> body { overflow-x: hidden; /* Prevent scroll on narrow devices */ font-family: 'Inter', Arial, sans-serif; background: #F6F8FF; padding-top: 56px; } .form-control{ margin-right: 10px; } </style> </head> <body> {#多语言切换下拉框#} <nav class="navbar navbar-expand-md fixed-top navbar-light box-shadow bg-white"> <div class="container"> <a class="navbar-brand align-items-md-center" href="index.html">{% trans "Django多语言切换" %}</a> <form class="form-inline ml-3-md" action="{% url 'set_language' %}" method="post"> {% csrf_token %} <div class="input-group"> <select name="language" class="form-control"> {% get_current_language as LANGUAGE_CODE %} {% 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 }} </option> {% endfor %} </select> <div class="input-group-append"> <button type="submit" class="btn btn-inline btn-sm bg-success"> {% trans "Select" %} </button> </div> </div> </form> </div> </nav> {% block content %} <div class="py-4 px-3 bg-light"> <div class="container"> {% get_current_language as LANGUAGE_CODE %} <h4>{% trans '当前语言' %}: <b>{ { LANGUAGE_CODE }}</b></h4> <p><small>{% trans "这是一个购物网站" %}</small></p> <hr/> <p>{% blocktrans %} { { msg }} {% endblocktrans %}</p> </div> </div> {% endblock %} <footer class="bd-footer bg-light"> <div class="container pt-3 pb-2 px-3 px-md-2"> <ul class="bd-footer-links list-unstyled text-muted list-inline pb-2"> <li class="list-inline-item"> <small>© {% trans '开发者 LDC' %}</small> </li> <li class="list-inline-item"> <small>{% trans '联系方式: 微信 1257309054' %}</small> </li> </ul> </div> </footer> <script src="https://lib.baomitu.com/jquery/3.5.0/jquery.js"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script> </body> </html> 可以通过get\_current\_language获取当前语言。 ### 6、生成po、mo翻译文件 ### 如果是windows系统,需要先下载gettext, 下载方式一:[官网][Link 2] 下载方式二:关注公众号“轻松学编程”,回复**gettext**即可。 下载gettext后解压缩到C盘, C:\\Program Files (x86)\\gettext,复制`C:\Program Files (x86)\gettext\bin`路径加入到系统PATH的环境变量(在控制面板>系统>高级>环境变量中添加) 在项目根目录中打开cmd窗口,激活虚拟环境,然后运行以下命令生成po文件: # 生成中文的po文件 python manage.py makemessages -l zh_HANS # 生成英文的po文件 python manage.py makemessages -l en ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj_size_16_color_FFFFFF_t_70_pic_center 3] 如果生成成功,那么在locale文件夹中可以看到以下文件: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj_size_16_color_FFFFFF_t_70_pic_center 4] 翻译好每一个msgstr后,就需要生成mo文件,命令为: python manage.py compilemessages 然后打开浏览器,输入http://127.0.0.1:8001/zh-hans/,就可以看到中文html, ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj_size_16_color_FFFFFF_t_70_pic_center 5] 输入http://127.0.0.1:8001/en/就可以看到英文的html了,当然也可以通过下拉框来进行切换。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj_size_16_color_FFFFFF_t_70_pic_center 6] ## 后记 ## 【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。 也可加我微信【1257309054】,拉你进群,大家一起交流学习。 如果文章对您有帮助,请我喝杯咖啡吧! 公众号 ![公众号][20200317124808234.jpg] ![赞赏码][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj_size_16_color_FFFFFF_t_70] 关注我,我们一起成长~~ [Link 1]: https://docs.djangoproject.com/en/3.1/topics/i18n/translation/ [20201006133549593.gif_pic_center]: /images/20221123/9bc66df2cfed4d7ebff1e5f448d7fade.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj_size_16_color_FFFFFF_t_70_pic_center]: /images/20221123/1b696d03f36b4af2905dabc2ad0e08d7.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj_size_16_color_FFFFFF_t_70_pic_center 1]: /images/20221123/31c483b9ebab4d61a82eaa29d8ba66c1.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj_size_16_color_FFFFFF_t_70_pic_center 2]: /images/20221123/41ef707913cd4a15961709adc4c8b391.png [Link 2]: https://mlocati.github.io/articles/gettext-iconv-windows.html [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj_size_16_color_FFFFFF_t_70_pic_center 3]: /images/20221123/6847cbd2eacf445fb4ec1d0c81c64c1a.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj_size_16_color_FFFFFF_t_70_pic_center 4]: /images/20221123/58468ba676d84a9397caf3cf3fc372ca.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj_size_16_color_FFFFFF_t_70_pic_center 5]: /images/20221123/20554b4608704e718472f942434399c8.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj_size_16_color_FFFFFF_t_70_pic_center 6]: /images/20221123/72d0eb1eeac249fe8f5c434303c30657.png [20200317124808234.jpg]: /images/20221123/03bc7a691043448088eac06544a68aff.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xtX2lzX2Rj_size_16_color_FFFFFF_t_70]: /images/20221123/4a76b26f29b6469a85b0900b342732d6.png
还没有评论,来说两句吧...