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 一堆默认文件夹,例如 static
、templates
、templatetags
、migrations
.. 和 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
)
我不知道我错过了什么。我正在使用 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 一堆默认文件夹,例如 static
、templates
、templatetags
、migrations
.. 和 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
)