簡體   English   中英

Django 翻譯不起作用

[英]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;

語言環境中間件按以下順序決定用戶語言:

  1. URLconf i18n_patterns函數
  2. 如果失敗,它將查找由LANGUAGE_COOKIE_NAME設置設置的 cookie
  3. 如果失敗,它會查看瀏覽器發送的 Accept-Language HTTP 標頭
  4. 如果失敗,它將使用全局LANGUAGE_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM