2013-05-20 24 views
1

我需要在我的項目中實現國際化,所以我想使用i18n靜態內容,而我使用應用程序django模型翻譯的模型。我支持以下語言:I18n似乎並沒有工作,而modeltranslation沒有(一點)

EN-US(默認) NL-NL 去德 FR-FR ES-ES

,而我的荷蘭語,Django不改變語言爲荷蘭語。我確實有一個英文窗口,但鉻被設置成荷蘭語來測試國際化。這不是唯一的問題,只有模型在默認語言更改時自動轉換。當我將默認語言設置爲荷蘭語時,所有模型都會顯示荷蘭語翻譯,但靜態內容保持英語。

注:我沒有使用compilemessages並重新啓動服務器

Settings.py

USE_I18N = True 

LANGUAGE_CODE = 'en-us' 

gettext = lambda s: s 
LANGUAGES = (
    ('en-us', gettext('English')), 
    ('nl-nl', gettext('Dutch')), 
    ('fr-fr', gettext('French')), 
    ('de-de', gettext('German')), 
    ('es-es', gettext('Spain')), 
) 

LOCALE_PATHS = ('/vagrant/locale',) 

/vagrant/locale/en-us/LC_MESSAGES/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 protected]>, YEAR. 
# 
#, fuzzy 
msgid "" 
msgstr "" 
"Project-Id-Version: PACKAGE VERSION\n" 
"Report-Msgid-Bugs-To: \n" 
"POT-Creation-Date: 2013-05-17 23:14+0200\n" 
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 
"Last-Translator: FULL NAME <[email protected]>\n" 
"Language-Team: LANGUAGE <[email protected]>\n" 
"MIME-Version: 1.0\n" 
"Language: en-us\n" 
"Content-Type: text/plain; charset=UTF-8\n" 
"Content-Transfer-Encoding: 8bit\n" 

#: PyDiving/settings.py:170 
msgid "English" 
msgstr "" 

#: PyDiving/settings.py:171 
msgid "Dutch" 
msgstr "" 

#: PyDiving/settings.py:172 
msgid "French" 
msgstr "" 

#: PyDiving/settings.py:173 
msgid "German" 
msgstr "" 

#: PyDiving/settings.py:174 
msgid "Spain" 
msgstr "" 

#: company/templates/company/company_detail.html:22 
msgid "City" 
msgstr "" 

/vagrant/locale/nl-nl/LC_MESSAGES/django.po(僅示出了差異,以縮短交)

"Language: nl-nl\n" 

#: company/templates/company/company_detail.html:28 
msgid "Postal Code" 
msgstr "Postcode" 

#: company/templates/company/company_detail.html:34 
msgid "City" 
msgstr "Stad" 

模板公司/模板/公司/ company_detail.html

{% load i18n %} 
{{ company.text }} # this is the model translation, this will change when i change the default language 
{% trans "City" %} # this always says "City" 

成果時默認語言爲en-us

EnglishCity 

其中 '英語是模型的內容'

默認語言nl-nl

NederlandsCity 
+0

你使用的是'django.middleware.locale.LocaleMiddleware'嗎?你可以在模板中輸出'request.LANGUAGE_CODE'來確保設置正確的語言嗎? –

+0

出於某種原因,當我添加LocaleMiddleware(我沒有使用,因爲我讀它是用於設置語言而不是識別),它會更改模型以顯示西班牙語(es-es)。它'成功'識別一種語言,因爲我可以更改默認代碼,但request.LANGUAGE_CODE仍然表示它是es-es,這是不正確的。我在荷蘭ip/chrome和英文窗口進入荷蘭。但是,語言文件保持英文。我檢查了西班牙文語言文件,它與英文/荷蘭文相同。 – LHolleman

+0

通常情況下,你應該在任何情況下都需要'LocaleMiddleware' ......你可以在Chrome的Web Inspector中檢查你的瀏覽器發送了什麼「Accept-Language」(在Network標籤中...選擇你的文檔並查看請求頭文件) –

回答

0

我碰到這個帖子:Django internationalization language codes。顯然,django只支持ISO 639-1語言代碼,這在文檔中是不可見的,更糟的是,它說你必須使用像en-us這樣的代碼。只要我將語言改爲en-us> en,nl-nl> nl等,它立即生效。

無論如何,感謝您的關注。

+1

這裏解釋了[這裏](https://docs.djangoproject.com/en/dev/topics/i18n/#term-locale-name),它確實表示它支持特定項目的翻譯:/ –

+0

我發現頁面現在已經鏈接,讀錯了,我的錯誤。發佈它,我會接受它。 – LHolleman

+0

我會發布它,但它並沒有真正回答這個問題。我仍然不知道爲什麼它不起作用,現在,在將'en-us'改爲'en'之後,它確實如此。根據文件,'en-us'是有效的。 –

2

我發現不同的平臺允許/偏好不同的語言文件夾名稱。因爲'/ pt-br/LC_MESSAGES /'不起作用,所以即使makemessages以這種方式創建文件夾並且編譯消息也能正常工作,所以我在我的開發系統(Mac OS X)上拉長了頭髮。一旦我將語言重新命名爲'/ pt_br/LC_MESSAGES /'(注意下劃線),它終於變成現實。注意我設置的LANGUAGES元組使用aa-bb格式,就像你在這裏使用的一樣。

將相同的項目遷移到生產環境(Ubuntu),它再次停止工作,我試着在Sun下的所有東西都認爲文件夾名稱必須已經正確,因爲它們在我的開發中工作。機。最後,我絕望地試圖將'/ pt_BR/LC_MESSAGES /'這個國家組件放大,然後,繁榮,它再次開始工作。我發現使用aa_BB表單可以普遍使用。

因此,我認爲您正在尋找的解決方案是更改您的語言環境文件夾中的語言環境目錄的名稱。你應該有:

[project] 
    locale 
     de_DE 
     en_US 
     es_ES 
     fr_FR 
     nl_NL 
    ... 
    settings.py 

在每個你會有LC_MESSAGES等當然正常。你的Django配置不應該改變,這只是gettext在你的平臺上接受的。再次,我想如果你使用aa_BB表單,你在大多數系統上都會好起來的。

如果由於某些原因需要在某個其他位置使用您的語言環境文件夾,請確保相應地設置屬性settings.LOCALE_PATHS。另外,Django文檔清楚地說明它如何找到這個文件夾:https://docs.djangoproject.com/en/dev/topics/i18n/translation/#how-django-discovers-translations

+0

@Lolleman:你甚至試過我的建議嗎? – mkoistinen

0

我知道這個問題已經回答了已經有一年多了,但是我遇到了類似的問題,經過幾個小時的努力,我終於找到了一個確定性的anwser。

免責聲明:我使用PT-BR因爲是我的母語,但你可以得到你這個給你想要

首先我是怎麼對我的Django應用程序做任何語言,(假設你已經有了創建的項目和應用[S]和當前目錄是項目DIR):

  • 創建語言環境DIR:mkdir locale
  • 創建的語言環境pt_BR表示:django-admin.py makemessages -l pt_BR
  • 改變了文本創建的文件
  • 編譯裏面的所有消息:django-admin.py compilemessages
  • 添加LOCALE_PATHS變量Django的設置:LOCALE_PATHS =('/path/to/locale_foder',)

在此之後,我的Django應用程序從未被翻譯。無論我做了什麼......

根據Django文檔(https://docs.djangoproject.com/en/dev/topics/i18n/translation/#how-django-discovers-language-preference)Django中有一個預定義的方式找到語言首選項,這是它如何工作的:

在語言前綴
  1. 的Django搜索url,爲了這個工作,你必須在django url中使用i18n_patterns。
  2. 如果上述失敗,搜索在用戶會話
  3. 如果上述的可變失敗,搜索一個cookie
  4. 如果上述失敗,則使用接受語言HTTP頭
  5. 如果上述失敗,請在django設置中使用同名變量中指定的語言。

我突出顯示了數字4,因爲在我的情況下,這就是我正在使用的那個。這意味着我的應用程序依賴於HTTP瀏覽器數據。

現在,由於我們依賴於HTTP數據,因此我們來檢查瀏覽器的行爲。我主要使用chrome和firefox。我的鉻對我的筆記本下列語言設置:

  • PT
  • EN-US
  • 連接

而這就是問題所在,我接受語言HTTP標頭髮送PT,但我沒有pt語言環境,我只有一個pt-br語言環境。如果這是另一種方式,這將起作用。我的結論是,應該總是有iso 639-1代碼,並從那裏使用專業化。例如:我現在將pt用作pt-br的默認值,對於葡萄牙的特定翻譯則使用pt-pt。