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\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@ADDRESS>\n"
    "Language-Team: LANGUAGE <LL@li.org>\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@ADDRESS>, 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@ADDRESS>\n"
    "Language-Team: LANGUAGE <LL@li.org>\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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM