django 进行语言的国际化及在后台进行中英文切换

项目的部署地为: 中国大陆与美国东海岸, 两个地区的服务器数据不进行同步, 中国地区的服务器页面展示中文, 美国地区的服务器页面展示成英文, 项目后台使用python编程语言进行开发, 并结合django框架进行版本迭代.

这里对项目的国际化进行配置说明:

一.在配置文件settings.py中:

1) 开启国际化功能

    # 语言, 先设置成中文
    LANGUAGE_CODE = ‘zh-hans‘  # 1.8版本之后的language code设置不同, 1.8之前是LANGUAGE_CODE = ‘zh-CN‘
    # LANGUAGE_CODE = ‘en‘

    # 时区
    TIME_ZONE = ‘Asia/Shanghai‘
    # TIME_ZONE = ‘UTC‘

    # Internationalization
    # https://docs.djangoproject.com/en/2.1/topics/i18n/
    # 开启国际化
    USE_I18N = True

    # 开启本地化
    USE_L10N = True

    USE_TZ = True

    LANGUAGES = (
       (‘en‘, ‘English‘),
       (‘zh-hans‘, ‘中文简体‘),
    )

    # 翻译文件所在目录, 与 manage.py 文件在同级目录下
    LOCALE_PATHS = (
        os.path.join(BASE_DIR, ‘locale‘),
    )

2) 添加进行国际化的中间件

    MIDDLEWARE = [
        ‘django.middleware.security.SecurityMiddleware‘,
        ‘django.contrib.sessions.middleware.SessionMiddleware‘,
        # 这就是新添加进来的中间件, 注意位置: 需要放置在 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‘,
    ]

3) 添加i18n上下文渲染器

    TEMPLATES = [
        {
            ‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘,
            ‘DIRS‘: [os.path.join(BASE_DIR, ‘templates‘)],
            ‘APP_DIRS‘: True,
            ‘OPTIONS‘: {
                ‘context_processors‘: [
                    # 新添加进来的上下文渲染器, 不知是否是本人配置不当, 如果将该渲染器放置在其他位置, 无法进行语言切换
                    ‘django.template.context_processors.i18n‘,
                    ‘django.template.context_processors.debug‘,
                    ‘django.template.context_processors.request‘,
                    ‘django.contrib.auth.context_processors.auth‘,
                    ‘django.contrib.messages.context_processors.messages‘,
                ],
            },
        },
    ]

二.在项目的路由文件 urls.py中, 添加路由:

    # 如果需要支持在页面自由选择语言进行切换, 必须添加该路由, 获取语言翻译文件
    url(r‘^i18n/‘, include(‘django.conf.urls.i18n‘)),

三.在模板文件中开启国际化

    <!DOCTYPE html>

    {% load i18n %}

在需要进行国际化的模板中开启国际化功能: 在文件的开头添加: {% load i18n %}, 也可以放置在 <!DOCTYPE html> 后面

四.添加需要进行国际化的字符串

1) 在视图中调用模板, 通过变量赋值渲染模板( 或者直接返回json数据给前台, 由前台通过js或者其他模块进行翻译):

在views.py中:

    from django.utils.translation import gettext_lazy as _

        ...
        if user.is_active:
            # _("已激活") 标示对该字符串进行国际化翻译, 如果是前后端分离,使用 gettext_lazy() 进行国际化翻译以后, 就可以转换成json数据向前台返回了
            context = {"text": _("已激活"),"domain": domain}
            # 进行模板渲染,响应用户请求.如果前后分离,可以直接返回json数据给前端,由前端在js中进行国际化
            return render(request, "./users/active_account.html", context)

如果是模板渲染, 在相应的模板文件 acitveacitve_account.html 中:

    <body>
        <h2>{%trans "你好!" %}</h2>
        <h2>{{ text }}</h2>
        <img src="{{ domain }}/static/images/qcat2.jpeg" alt="">
    </body>

直接将变量渲染到模板中即可, 由模板调用翻译文件进行翻译.

如果需要进行国际化的字符串可以直接写死在模板中, 也可以直接在模板中使用下面的方式进行国际化:

{%trans "需要翻译的字符串" %} , 如上面的代码中所示.

五.生成翻译文件(先在manage.py的同级目录下创建 locale目录)

python manage.py makemessages -l en

会在locale目录下生成 po 翻译文件, 文件自动列出需要进行翻译的字符串, 如:

    # SOME DESCRIPTIVE TITLE.
    # Copyright (C) YEAR THE PACKAGE‘S COPYRIGHT HOLDER
    # This file is distributed under the same license as the PACKAGE package.
    # FIRST AUTHOR <[email protected]>, YEAR.
    #
    #, fuzzy
    msgid ""
    msgstr ""
    "Project-Id-Version: PACKAGE VERSION\n"
    "Report-Msgid-Bugs-To: \n"
    "POT-Creation-Date: 2019-04-17 03:06+0000\n"
    "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    "Last-Translator: FULL NAME <[email protected]>\n"
    "Language-Team: LANGUAGE <[email protected]>\n"
    "Language: \n"
    "MIME-Version: 1.0\n"
    "Content-Type: text/plain; charset=UTF-8\n"
    "Content-Transfer-Encoding: 8bit\n"
    "Plural-Forms: nplurals=2; plural=(n != 1);\n"

    #: apps/users/models.py:25
    msgid "邮箱地址"
    msgstr ""

    #: apps/users/views.py:748
    msgid "已激活"
    msgstr ""

    #: templates/users/active_account.html:10
    msgid "你好!"
    msgstr ""

msgid : 需要进行国际化的字符串

msgstr: 将翻译好的字符串, 填充进去即可,如:

    # SOME DESCRIPTIVE TITLE.
    # Copyright (C) YEAR THE PACKAGE‘S COPYRIGHT HOLDER
    # This file is distributed under the same license as the PACKAGE package.
    # FIRST AUTHOR <[email protected]>, YEAR.
    #
    #, fuzzy
    msgid ""
    msgstr ""
    "Project-Id-Version: PACKAGE VERSION\n"
    "Report-Msgid-Bugs-To: \n"
    "POT-Creation-Date: 2019-04-17 03:06+0000\n"
    "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    "Last-Translator: FULL NAME <[email protected]>\n"
    "Language-Team: LANGUAGE <[email protected]>\n"
    "Language: \n"
    "MIME-Version: 1.0\n"
    "Content-Type: text/plain; charset=UTF-8\n"
    "Content-Transfer-Encoding: 8bit\n"
    "Plural-Forms: nplurals=2; plural=(n != 1);\n"

    msgid "邮箱地址"
    msgstr "email"

    #: apps/users/views.py:748
    msgid "已激活"
    msgstr "You have successfully activated the account, do not need to activete it again, thank you!"

    #: templates/users/active_account.html:10
    msgid "你好!"
    msgstr "hello"

编译po文件, 在locale所在目录下执行下面的命令:

python manage.py compilemessages

到这里, 国际化的配置基本完成, 可以通过修改下面的配置项,进行平台语言展示的设置

    # 中文
    LANGUAGE_CODE = ‘zh-hans‘  # 1.8版本之后的language code设置不同, 1.8之前是LANGUAGE_CODE = ‘zh-CN‘
    # LANGUAGE_CODE = ‘en‘

    # 时区
    TIME_ZONE = ‘Asia/Shanghai‘
    # TIME_ZONE = ‘UTC‘

如下所示

中文:

    你好!
    已激活

英文:

    hello
    You have successfully activated the account, do not need to activete it again, thank you!

如果需要在页面中让用户自行选择进行语言切换, 还需要进行额外的配置, 详情可以去查看官方文档

六.如果前台是APP,语言切换时,因为前后台的语言环境需要保持一直,所以我这里采取了一种不是太优雅的的办法: 封装一个接口, 当用户进行国际化切换时,由APP请求一下该接口, 告知后台该用户选择了那种语言, 接口代码如下所示:

    @api_view(["POST"])
    def set_lang(request):
        """
        用户在app进行语言切换时, 请求一下该接口
        :param request:
        :return:
        """
        language = request.data.get("language", "en")

        if language == "zh-hans":
            request.session[‘_language‘] = "zh-hans"
        else:
            request.session[‘_language‘] = "en"

        return Response({"msg": "Ok"}, status=status.HTTP_200_OK)

当用户请求其他接口时,就可以通过request请求对象获取到用户当前是选择的那种语言(即使不进行登录也可以获取到):

language = request.LANGUAGE_CODE

原文地址:https://www.cnblogs.com/lowmanisbusy/p/10930003.html

时间: 2024-08-30 03:52:25

django 进行语言的国际化及在后台进行中英文切换的相关文章

Django 模版语言详解

一.简介 模版是纯文本文件.它可以产生任何基于文本的的格式(HTML,XML,CSV等等). 模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签. 例: {% extends "base_generic.html" %} {% block title %}{{ section.title }}{% endblock %} {% block content %} <h1>{{ section.title }}</h1> {% for story in s

Django模板语言

常用语法 {{  }}和{% %} 变量相关的用{{}} , 逻辑相关的用{% %} 变量 在Django的模板语言中按此语法使用:{{ 变量名 }}. 当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身. 变量 的命名包括任何字母数字以及下划线 ("_")的组合(不提倡数字开头). 变量名称中 不能有空格或标点符号. 点(.)在模板语言中有特殊的含义.当模版系统遇到点("."),它将以这样的顺序 查询: 字典查询(Dictionary lookup)

Django模板语言小记

1.blog.views.py  # Create your views here. from django.template import loader,Context from django.http import HttpResponse from blog.models import BlogPost def archive(request):     posts = BlogPost.objects.all()     t = loader.get_template('archive.

OAF_OAF页面的多语言开发国际化(案例)

2014-06-06 BaoXinjian 一.摘要 在做欧美项目时,对页面做全球化的定制的必须,本文介绍了OAF在页面上做多语言的开发 OAF多语言开发涉及两个方面 界面的多语言开发 底层数据库的多语言开发 界面的多语言开发一般也有两种方式实现 OAF个性化实施 OAF对MDS的xlf修改导入 二.案例1 - 通过定制xlf文件,实现页面的多语言 案例:对客制化的expense summary 的OAF页面进行页面多语言开发 1. 查看OAF对应的page xml的路径 /bxj/oracle

django 模板语言

Django的模板语言的目的是取得力量和易用性之间的平衡,与其他的模板语言相比,django模板语言显得更简单,更专一, django模板系统由模板,变量,过滤器,标签,注释等主要部分组成 模板 一个模板是一个简单的文本文件,它可以生成任何基于文本的格式,html,csv,xml等等 模板里面包含变量,过滤器,标签和注释,下面是一个简单的模板文件 {% extends "base_generic.html" %} {% block title %}{{ section.title }}

[iOS]如何在iOS开发中切换显示语言实现国际化

1.在Project设置,添加中英两种语言: 2.新建Localizable.strings文件,作为多语言对应的词典,存储多种语言,点击右侧Localization,勾选中英: 3.添加一个字段, 在English中,添加:"SUBMIT_BTN_TITLE" = "Go"; 在Chinese中,添加:"SUBMIT_BTN_TITLE" = "开始"; 4.一个工具类GDLocalizableController,用来切换

实现iOS语言本地化/国际化

实现iOS语言本地化/国际化(图文详解) 前言 语言本地化,又叫做语言国际化.是指根据用户操作系统的语言设置,自动将应用程序的语言设置为和用户操作系统语言一致的语言.往往一些应用程序需要提供给多个国家的人群使用,或者一个国家有多种语言,这就要求应用程序所展示的文字.图片等信息,能够让讲不同语言的用户读懂.看懂.进而提出为同一个应用程序适配多种语言,也即是国际化.语言国际化之所以又叫做语言本地化,这是站在每个用户的角度而言的,是指能够让用户本地.本土人群能够看懂的语言信息,顾名思义,语言本地化.其

sepl 2.0,器普语言支持国际化

sepl 2.0,器普语言支持国际化 sepl 2.0 最近使用sepl编程,除了编译器有错误外,还有就是语法还有些问题. 为了把 C#程序员吸引过来不让他们回去,决定引入英文关键字.这样C#程序移植到sepl将非常容易. 而且国际用户也可以用英文编程,符合计算机语言习惯,不必一定要中文. 对于中文语法,采用强制执行,而不是禁止用英文.如果代码不需要审核,也不关心是否完全中文吧. 这样不仅能做到彻底中文化,也能保留英文编程.说到底.这是为了国际化准备,否则会丧失很大市场. 最大区别是 赋值 使用

Django模版语言

Django模版语言 常用语法 只需要记两种特殊符号: {{ }}和{% %} 变量相关的用{{}},逻辑相关的用{% %} 变量 {{ name }} --->变量 变量名由字母数字和下划线组成. 点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值. 例子: view中的代码: def template_test(request): l = [11, 22, 33] d = {"name": "alex"} class Person(object):