[英]Django translations does not work
我正在嘗試按照 此處的教程使 Django 的翻譯系統正常工作。
這是我的兩個視圖(一個用於直接 output,一個用於模板),一個都不起作用。
def home(request):
output = _("hello") # (lazy)
return HttpResponse(output)
def with_template(request):
return render(request, 'translation_template.html')
這是第二個視圖的模板文件:
{% extends "base_site.html" %}
{% load i18n %}
{% block content %}
<p>{% trans 'hello' %}</p>
{% language 'tr' %}
<p>{% trans 'hello' %}</p>
{% endlanguage %}
{% language 'tr-TR' %}
<p>{% trans 'hello' %}</p>
{% endlanguage %}
{% endblock %}
在我的設置文件中,我添加了以下內容:(如果需要,可以添加之前的部分)
LANGUAGE_CODE = 'en-us'
# also tried LANGUAGE_CODE = 'tr' and LANGUAGE_CODE = 'tr-TR'
PROJECT_DIR = os.path.dirname(__file__)
"""
# tried but didn't work
from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.context_processors.auth",
"django.core.context_processors.i18n",
)
"""
LOCALE_PATHS = ( os.path.join(PROJECT_DIR, 'locale'), )
LANGUAGES = (
('tr', _('Turkish')),
('en', _('English')),
)
保存這些后,我在終端中執行:
python ./manage.py makemessages -l tr
然后編輯新創建的myproject/locale/tr/LC_MESSAGES/django.po
有這個:
msgid "hello"
msgstr "merhaba"
然后執行
python ./manage.py compilemessages
並重新啟動服務器。 終端命令沒有顯示錯誤,但是當我加載視圖時,沒有一個“hello”被翻譯。
我在這里做錯了什么?
謝謝你的幫助!
我在 en/../django.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 ""
我解決了我的問題。 就我而言,問題在於 settings.py 中的LOCALE_PATHS
定義。
我在視圖中通過以下方式對其進行了測試:
from TranslationTest import settings
return HttpResponse(settings.LOCALE_PATHS)
它顯示home/myProjects/TranslationTest/TranslationTest/locale
,但是makemessages
正在生成home/myProjects/TranslationTest/locale
所以我改變了我的設置如下:
SITE_ROOT = os.path.dirname(os.path.realpath(__name__))
LOCALE_PATHS = ( os.path.join(SITE_ROOT, 'locale'), )
現在它起作用了。
但我仍然想知道,為什么makemessages
不明白它應該在 settings.py 指定的LOCALE_PATHS
創建文件?
根據我的理解,它總是在 SITE_ROOT/locale 中生成語言環境文件,所以我們應該始終將 LOCALE_PATHS 設置為這個? 如果這是默認值,為什么要設置它? 我將不勝感激有關此問題的更多信息。
感謝您的幫助!
請記住,如果您的語言中有一個國家/地區,例如 fa-IR,則必須在您的設置文件中添加:
LANGUAGE_CODE = 'fa-IR'
但是當您想調用 makemessages 命令時,您應該將-
更改為_
:
makemessages -l fa_IR
如果您激活了語言環境中間件,就會發生這種情況。 通過這樣做,我認為您的本地會話取決於您的瀏覽器區域設置。
如果您評論語言環境中間件,它應該按預期工作。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.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',
]
我只是想提醒一些給我帶來小問題的事情,那就是我應該更改瀏覽器的語言(從選項)。 然而,我完全做了一切,但我看不到翻譯的文本。 順便說一句,我不想使用任何特定的 url 來查看翻譯。
到今天為止,對於 Django 3.2,這個問題仍然存在。 就我而言,我有以下設置:
C:.
├───documents
├───project
│ ├───apps
│ │ ├───accounts
│ │ │ ├───...
│ │ ├───common
│ │ │ ├───...
│ │ └───...
│ ├───locale
│ │ └───it
│ │ └───LC_MESSAGES
│ └───...
└───tests
設置文件是這樣設置的:
LANGUAGE_CODE = 'it'
LOCALE_PATHS = [
os.path.join(Path(__file__).resolve().parent, "locale"),
]
LANGUAGES = [
('en', _('English')),
('it', _('Italian')),
]
訣竅在於 LOCALE_PATHS 的定義。 Django-admin 在某種程度上與 Django 環境不同步。
對我來說,評論在線工作正常
USE_I18N = True
USE_L10N = True
LANGUAGE_CODE = 'uk'
LANGUAGES = (
('uk', _('Ukrainian')),
# ('en', _('English')),
)
項目根目錄中沒有 locale 文件夾,沒有自定義 LOCALE_PATHS
將本地中間件添加到 django 中間件對我'django.middleware.locale.LocaleMiddleware',
您可能需要閱讀這篇Django 如何發現語言偏好。
TLDR;
語言環境中間件按以下順序決定用戶語言:
URLconf
i18n_patterns
函數LANGUAGE_COOKIE_NAME
設置設置的 cookieLANGUAGE_CODE
設置就我而言,我遵循了教程,但我不知道為什么我的語言沒有改變。
我已經完成了語言環境文件夾,在那里我翻譯了兩種語言的所有字符串,並且我已經正確設置了LOCALE_PATH
和其他東西。
因此,為了測試,我更改了LANGUAGE_CODE
以顯示印地語文本,但我不知道語言優先級的東西。
我在我的設置中設置了以下內容
LANGUAGES = (
('hi', _('Hindi')),
('en', _('English')),
)
LANGUAGE_CODE = 'hi'
所以發生的事情是我沒有指定語言的 cookie,所以優先級下降了在 http 標頭中傳遞的瀏覽器默認語言。
所以它從來沒有出現在我的設置中的LANGUAGE_CODE
並且request.LANGUAGE_CODE
的語言被設置為 en。
所以為了解決這個問題,我將 cookie 設置為在我的瀏覽器之前優先
from django.conf import settings
from django.http import HttpResponse
from django.utils import translation
user_language = 'hi'
translation.activate(user_language)
response = HttpResponse(...)
response.set_cookie(settings.LANGUAGE_COOKIE_NAME, user_language)
我從這里拿了這個明確設置活動語言
我嘗試了上面提供的幾乎所有解決方案,但都沒有成功。 然后我意識到我忘了在makemessages
命令之后運行compilemessages
。 所以確保你運行:
python manage.py compilemessages
運行 makemessages 后。 compilemessages
命令的作用是將.po
文件轉換為您的語言環境目錄中的.mo
文件。 這是必需的,因為.mo
文件是 gettext 可以理解的唯一文件。 如果沒有.mo
文件,翻譯將無法工作,對我來說就是這種情況。
您可以嘗試使用Candy Translate代替 Django 原生翻譯模塊。 它更容易,不需要設置中間件,基本上為您完成大部分工作。 它還允許您管理 excel 文件中的翻譯,當您將文本發送給翻譯人員時會派上用場。
它有一些限制,但對於我所有的網站來說,它就足夠了,而且實現得更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.