zoukankan      html  css  js  c++  java
  • 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@ADDRESS>, YEAR.
        #
        #, fuzzy
        msgid ""
        msgstr ""
        "Project-Id-Version: PACKAGE VERSION
    "
        "Report-Msgid-Bugs-To: 
    "
        "POT-Creation-Date: 2019-04-17 03:06+0000
    "
        "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE
    "
        "Last-Translator: FULL NAME <EMAIL@ADDRESS>
    "
        "Language-Team: LANGUAGE <LL@li.org>
    "
        "Language: 
    "
        "MIME-Version: 1.0
    "
        "Content-Type: text/plain; charset=UTF-8
    "
        "Content-Transfer-Encoding: 8bit
    "
        "Plural-Forms: nplurals=2; plural=(n != 1);
    "
         
        #: 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@ADDRESS>, YEAR.
        #
        #, fuzzy
        msgid ""
        msgstr ""
        "Project-Id-Version: PACKAGE VERSION
    "
        "Report-Msgid-Bugs-To: 
    "
        "POT-Creation-Date: 2019-04-17 03:06+0000
    "
        "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE
    "
        "Last-Translator: FULL NAME <EMAIL@ADDRESS>
    "
        "Language-Team: LANGUAGE <LL@li.org>
    "
        "Language: 
    "
        "MIME-Version: 1.0
    "
        "Content-Type: text/plain; charset=UTF-8
    "
        "Content-Transfer-Encoding: 8bit
    "
        "Plural-Forms: nplurals=2; plural=(n != 1);
    "
         
        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
  • 相关阅读:
    Linux Centos7(Mac) 安装Docker教程
    SpringBoot应用操作Rabbitmq(fanout广播高级操作)
    SpringBoot应用操作Rabbitmq(topic交换器高级操作)
    SpringBoot应用操作Rabbitmq(direct高级操作)
    CCF 字符串匹配(find()函数的使用)
    PKU 1204 Word Puzzles(AC自动机)
    PKU 1932 XYZZY(Floyd+Bellman||Spfa+Floyd)
    PKU 1201 Intervals(差分约束系统+Spfa)
    PKU 2352 Stars(裸一维树状数组)
    PKU 3169 Layout(差分约束系统+Bellman Ford)
  • 原文地址:https://www.cnblogs.com/lowmanisbusy/p/10930003.html
Copyright © 2011-2022 走看看