Django 翻译不适用于基础 html 文件?

Django translation not working on base html file?

我不知道我错过了什么。我正在使用 django 翻译。翻译完美适用于包文件夹以外的所有应用程序,即包含 settings.py.

的应用程序

我的文件结构是这样的:

my-project/
    manage.py
    locale/
    mysite/
        __init__.py
        settings.py
        lacale/
        templates/
            base.html
        urls.py
    profile/
        __init__.py
        locale/
        templates/
            profile/
                profile.html
        views.py
        urls.py
  

设置文件如下:

MIDDLEWARE = [
    ....
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    ....
]

LANGUAGE_CODE = 'es'

USE_I18N = True

USE_L10N = True

USE_TZ = True

LANGUAGES = (
    ('en-us', _('English')),
    ('es', _('Spanish')),
)

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)

我的base.html看起来像这个翻译不起作用:

{% load static %}
{% load i18n %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta name="author" content="Biplove Lamichhane">
    <title>{% block title %}{% endblock title %}</title>
</head>
<body>
    <h1>{% trans "Base" %}</h1>
   {% block content %} 
   {% endblock %}
</body>

我的profile.html是这样的,这个翻译确实有效

{% extends 'base.html' %}
{% load static %}
{% load i18n %}
{% block title %}Title{% endblock title %}
        
{% block content %}
    <h2>{% trans "Check" %}</h2>
{% endblock %}

此外,我已经正确创建了 django.po 文件并添加了我的翻译和编译信息以创建 django.mo.

编辑

django.po 对于 base.html:

# 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: 2020-09-21 12:25+0545\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"
#: profile/templates/profile/profile.html:9
msgid "Check"
msgstr "Spanish check"

djanog.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: 2020-09-21 21:44+0545\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"
#: mysite/settings.py:146
msgid "English"
msgstr ""

#: mysite/settings.py:147
msgid "Spanish"
msgstr ""

#: mysite/templates/base.html:26
msgid "Base"
msgstr "Spanish language for base"

您将 settings.py 中的 LOCALE_PATHS 变量定义为 os.path.join(BASE_DIR, 'locale'),这意味着 my_project/locale/* 并且在应用程序目录中没有任何其他 locale 文件夹。

所以我的建议是将所有 .po 文件合并到 my_projects/locale/ 目录中。确保该路径应类似于 my_project/locale/es/LC_MESSAGES/django.po

# django.po
...

#: mysite/settings.py:146
msgid "English"
msgstr ""

#: mysite/settings.py:147
msgid "Spanish"
msgstr ""

#: profile/templates/profile/profile.html:9
msgid "Check"
msgstr "Spanish check"

#: mysite/templates/base.html:26
msgid "Base"
msgstr "Spanish language for base"

我想您需要将 /mysite/locale 文件夹添加到 LOCALE_PATHS

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
    os.path.join(BASE_DIR, 'mysite', 'locale'),
)

更新

关键是区分 project 包和 app 包以及每个包中预期的默认文件夹(和文件) .

在你的例子中,很明显 mysite 文件夹是你的 Django application/project 的 项目包 ,其中包含(根据 docs ) Django 实例的一组设置,包括数据库配置、Django-specific 选项和 application-specific 设置 并且不是应用程序 里面的 apps.py 文件是可以识别的。就是说,Django 期望像 profile 这样的 app 一堆默认文件夹,例如 statictemplatestemplatetagsmigrations .. 和 locale 但对于任何其他 non-default 位置,您需要在 mysite/settings.py:

中明确提及它们

对于项目级别或 app-independent 文件夹,您需要这样做:

  • 全局模板 /mysite/templates(包含 base.html
TEMPLATES = [
    {
        ..
        'DIRS': [os.path.join(BASE_DIR, 'mysite', 'templates')],
        'APP_DIRS': True,
        ..
    },
]
  • global static /mysite/static(我猜你已经有一个持有全局资产的js,css img ..)
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'mysite', 'static')]
  • 以及全局区域设置文件夹s
LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),  # underneath project root folder 
    os.path.join(BASE_DIR, 'mysite', 'locale'),  # underneath project package 
)