【问题标题】:Django translation not working on base html file?Django 翻译不适用于基本 html 文件?
【发布时间】:2020-09-21 14:48:19
【问题描述】:

我不知道我错过了什么。我正在使用 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"

【问题讨论】:

  • 你为什么把{% load i18n %}放了两次?
  • 感谢您指出...这是缩短问题时的错误...实际上,它只是 1。
  • 向我们展示您的django.po 文件

标签: python django django-templates translation


【解决方案1】:

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

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

更新

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

在您的情况下,很明显mysite 文件夹是您的 Django 应用程序/项目的 项目包,其中包含(根据 docs一个实例的设置集合Django 的,包括数据库配置、特定于 Django 的选项和特定于应用程序的设置不是应用程序,可以通过内部的 apps.py 文件识别。也就是说,Django 期望像profile 这样的应用程序 有一堆默认文件夹,如statictemplatestemplatetagsmigrations .. 和locale,但对于任何其他非- 您需要在mysite/settings.py 中明确提及它们的默认位置:

对于项目级别或独立于应用程序的文件夹,您需要这样做:

  • 全局模板/mysite/templates(包含base.html
TEMPLATES = [
    {
        ..
        'DIRS': [os.path.join(BASE_DIR, 'mysite', 'templates')],
        'APP_DIRS': True,
        ..
    },
]
  • 全局静态/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 
)

【讨论】:

  • 谢谢!!!它起作用了..但是,你能解释一下吗?因为,我只是没有为主包获得这个本地路径公式。
  • 好吧……现在说得通了。非常感谢。
【解决方案2】:

您将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"

【讨论】:

  • 您在 settings.py 中将 LOCALE_PATHS 变量定义为 os.path.join(BASE_DIR, 'locale') 这意味着 my_project/locale/* 并且在应用程序目录中没有任何其他语言环境文件夹。 ,如果那么profile.html 也不应该正确翻译... Coz,我对profile 的翻译在profile 应用程序中而不是在root 中?
  • 我认为在一个语言环境中合并所有翻译会很麻烦???
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多