2009-12-02 72 views
29

我正在嘗試使用i18n以不同語言呈現模板。我做了我能讀懂的所有內容,從設置語言代碼,創建和編譯翻譯文件(包括模板中的翻譯標記等),甚至通過{{LANGUAGE_CODE}}變量點,我的模板仍以英語呈現我打算渲染的正確(和不同)代碼。我錯過了什麼?django - 如何使翻譯工作?

模板:

{% extends "base.html" %} 
{% load i18n %} 
{% get_current_language as LANGUAGE_CODE %} 
{% get_available_languages as LANGUAGES %} 
{% get_current_language_bidi as LANGUAGE_BIDI %} 
{% block title %}{% trans "translation test" %}{% endblock %} 
{% block content %} 
<div id="some-text"> 
    {% trans "some translated text goes here" %} 
    {% blocktrans %} 
    <ol> 
    <li>here are some</li> 
    <li>items that should be</li> 
    <li>translated as well</li> 
    </ol> 
    {% endblocktrans %} 
    <ul> 
     <li>The current language is <b>{{ LANGUAGE_CODE }}</b></li> 
     {% if LANGUAGE_BIDI %} 
     <li>The current language is bidirectional</li> 
     {% else %} 
     <li>The current language is <b>not</b> bidirectional</li> 
     {% endif %} 
     <li>Available languages are: 
     <ul> 
     {% for lang in LANGUAGES %} 
      <li>{{ lang.1}}</li> 
     {% endfor %} 
     </ul> 
     </li> 
    </ul> 
</div> 
{% endblock %} 

觀點:

$ django-admin.py makemessages -l he-il -e html 
$ django-admin.py compilemessages 

settings.py:

from django.shortcuts import render_to_response 
from django.template import RequestContext 
from pdb import set_trace as debugger 
def check(request): 
    return render_to_response('index.html', context_instance=RequestContext(request) 

命令行(我當時在.po文件正確的翻譯填寫)

# Language code for this installation. All choices can be found here: 
# http://www.i18nguy.com/unicode/language-identifiers.html 
LANGUAGE_CODE = 'he-il' 

gettext = lambda s: s 
LANGUAGES = (
    ('he-il', gettext('Hebrew')), 
    ('en-us', gettext('English')), 
) 

# If you set this to False, Django will make some optimizations so as not 
# to load the internationalization machinery. 
USE_I18N = True 

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth", 
    "django.core.context_processors.i18n", 
) 

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
) 

回答

2

我去它的方式是通過使用Django的在它自己的翻譯文件使用確切的語言代碼(而不是通過內部settings.py提供的鏈接),假設這種語言支持(如果不是事情變得複雜,因爲你必須提供自己的翻譯文件到Django的爲好)。

我通過去$ DJANGO_DIR/conf/locale並查看文件夾的名稱(對於我來說它位於/usr/local/lib/python2.6/dist-packages/django/conf/locale,但根據操作系統等可能有所不同)。

19

我可能是錯的 - 爲我所用的東西翻譯是在一個測試項目很久以前唯一的一次 - 但我認爲你不希望這樣的:

$ django-admin.py makemessages -l he-il -e html

而恰恰這一點:

$ django-admin.py makemessages -l he_il -e html

注意下劃線he_il

我在使用pt-BR時也遇到了問題,直到我用pt_br代替消息文件。然後事情開始工作......

是的,這是不明顯的,我無法找到任何地方的文檔。

希望有所幫助。

+2

剛纔遇到了這個有趣的行爲。 LANGUAGE設置應使用短劃線,但/ locale /中的路徑應使用下劃線。 – Andrew 2011-04-02 22:48:09

+1

+1這就是它!這些互聯網上有許多關於這個問題的問題,並且你已經完成了。我剛剛將我的語言從fr-fr更名爲fr_fr,一切都變得生機勃勃! (在Django重啓後)。 – mkoistinen 2013-04-06 01:45:33

+0

對我來說,我不得不使用:LANGUAGE_CODE ='en_GB',而在LANGUAGES =(('en-gb',ugettext('English')),...) – dalore 2013-10-31 12:34:04

1

是的,你確實需要進行信息文件作爲celopes建議,然後將它們編譯

python manage.py compilemessages 

但你仍然有問題。

禁用LocaleMiddleware了一點,即從您的中間件列表中刪除此

django.middleware.locale.LocaleMiddleware 

。如果您不需要在運行時切換語言,則不要使用它,但如果您確實需要它,則會出現solution。之前我有the same problem,有人向我解釋這一點。

另外我之前有過this weird issue。 Makemessages命令會阻塞.py文件中的反斜槓字符串。

+1

django翻譯文檔很好,但很長,不幸的是你需要閱讀大部分的文檔。 – Evgeny 2009-12-02 18:14:04

+0

我刪除了中間件,但沒有任何更改。即使LANGUAGE_CODE指向'he'(我將它從'he-il'更改爲django.conf.locale所具有的內容),但頁面仍然僅以英文呈現。有什麼想法嗎? – sa125 2009-12-03 14:30:31

+0

是否有關於消息構建和編譯的錯誤消息?看看locale/he/django.po有沒有#,模糊標記? – Evgeny 2009-12-03 18:37:44

1

我有非常相同的問題,我試圖切換我的語言和django說不行。沒有錯誤,沒有警告,但Django的語言切換到pl-pl(在我的情況下)。但是從語言環境中刪除所有文件夾並執行命令: django-admin.py makemessages -l pl_PL(下劃線代替第二個PL的破折號和大寫字母,解決了此問題)。

我希望它能幫助那裏的一些人。

63

只需添加所產生的settings.py文件中像下面

LOCALE_PATHS = ("/xxx/xxx/Projects/xxx/sites/avb/locale/",) 
+8

經過多年你的答案仍然有幫助!謝謝! – Daviddd 2013-04-29 14:44:19

+3

要添加更多,我會推薦'os.path.join(BASE_DIR,'locale'),'。 **不要**使用相對路徑,因爲雖然他們在開發中工作,但他們可能無法工作取決於服務器等。 – Wtower 2015-12-15 10:29:40

13

我有同樣的問題區域設置文件的路徑。但是我通過將「Language:」放入.po文件來解決這個問題。在我的情況.po文件不包含「語言」屬性,它看起來像......

 
"Language-Team: LANGUAGE \n" 
"Language: \n" 
"MIME-Version: 1.0\n" 

但是當我把語言代碼(在我的情況下,「儒」或「恩」)

 
"Language-Team: LANGUAGE \n" 
"Language: ru\n" 
"MIME-Version: 1.0\n" 

它爲我工作

4

我有同樣的問題,似乎與您所在區域的路徑必須結尾加上一個斜線

LOCALE_PATHS = (
    '/dir/to/my/locale/', 
) 
+2

謝謝。這是我的情況。這裏有一個針對那些運行相同問題的代碼片段:'LOCALE_PATHS = os.path.join(BASE_DIR,'','locale /')' – 2014-06-30 19:33:20

+0

我希望我可以不止一次地upvote – maersu 2014-09-25 05:13:40

+1

在我的情況下,逗號「,」 – 2015-04-16 00:48:19

17

這是我一直在用從Django的1.4,仍然在1.7.1完整的解決方案:

在settings.py ...

添加到MIDDLEWEAR_CLASSES,語言環境,它能夠根據要求語言選擇:

'django.middleware.locale.LocaleMiddleware', 

添加LOCALE_PATHS,這是你的翻譯文件將被存儲:

LOCALE_PATHS = (
    os.path.join(PROJECT_PATH, 'locale/'), 
) 

啓用國際化:

USE_I18N = True  

,你將網站被翻譯成集語言:

ugettext = lambda s: s 
LANGUAGES = (
    ('en', ugettext('English')), 
    ('fr', ugettext('French')), 
    ('pl', ugettext('Polish')), 
) 

添加國際化模版上下文處理器TEMPLATE_CONTEXT_PROCESSORS,請求現在將包括語言和LANGUAGE_CODE:

'django.core.context_processors.i18n', 

在URL中的.py:

在url_patterns,添加以下,它會使集語言重定向視圖:

url(r'^i18n/', include('django.conf.urls.i18n')), 

見雜項在Translations更多關於這一點。

添加以下的進口,並封裝你想翻譯與i18n_patterns的URL。這裏是我的樣子:

from django.conf.urls.i18n import i18n_patterns 
from django.utils.translation import ugettext_lazy as _ 

urlpatterns = patterns('', 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^i18n/', include('django.conf.urls.i18n')), 
) 

urlpatterns += i18n_patterns('', 
    (_(r'^dual-lang/'), include('duallang.urls')), 
    (r'^', include('home.urls')), 
) 

現在任何地方,你使用的文字並希望將其進口lazytext轉換和包裝每一個字符串它像這樣_(「文本」),你甚至可以去到其他網址.py文件,做像這樣的網址翻譯:

url(_(r'^dual_language/$'), landing, name='duallang_landing'), 

你可以用你想翻譯的其他文件的文本,如models.py,views.py等。這裏是翻譯的例子示範田用於標籤和help_text:

name = models.CharField(_('name'), max_length=255, unique=True, help_text=_("Name of the FAQ Topic")) 

在您的HTML模板...

對您的模板做同樣的事情,並加載國際化的模板標籤,並在您要翻譯的靜態內容上使用trans和transblock。這裏有一個例子:

{% load i18n %} 

{% trans "This is a translation" %}<br><br> 
{% blocktrans with book_t='book title'|title author_t='an author'|title %} 
This is {{ book_t }} by {{ author_t }}. Block trans is powerful! 
{% endblocktrans %} 

現在運行的每個區域設置的makemessages:

./manage.py makemessages -l pl 

現在所有剩下的工作就是進入你的/區域設置文件夾,並編輯每個的.po的文件。填寫每個msgstr的數據。這裏是一個這樣的例子:

msgid "English" 
msgstr "Angielski" 

最後編譯消息:

./manage.py compilemessages 

對於模型實例數據轉換,你可以使用一些現有的可重複使用的包裝像

有一個要學習翻譯更多,internationalization與此主題密切相關,因此請查閱文檔。我還建議查看一些Django可用的國際化軟件包,如django-rosettadjango-linguo。他們幫助翻譯模型內容,django-rosetta不會在數據庫中爲此創建新條目,而Django-linguo則可以。

如果你遵循這一點,你應該開始一個好的開始。我相信這是使您的網站以多種語言運行的最標準化的方式。乾杯!

+0

謝謝你:)也要小心,你必須放在正確的地方LocalMidleware: '它應該在SessionMiddleware之後,因爲LocaleMiddleware利用會話數據。它應該在CommonMiddleware之前出現,因爲CommonMiddleware需要激活的語言才能解析所請求的URL。「更多你可以在這裏找到[https://docs.djangoproject.com/en/1.8/topics/i18n/translation/#如何-Django的發現的語言偏好) – jkaluzka 2015-11-28 18:24:56

0

我有同樣的問題。我在this link under another similar question中詳細解釋了它。

簡單地說,我的問題已經解決了這個代碼重新加載服務器:

sudo /etc/init.d/uwsgi reload 

現在,每次我改變短語和彙編語言文件後,我重新加載服務器太看到的變化。