2012-07-18 177 views
5

我有一個django網站我正在使用語言選擇器添加翻譯,該語言選擇器用用戶的語言列出可用的語言。我希望將下拉列表包含原生拼寫。本地語言和本地語言的Django語言選擇器

目前,它看起來像這樣:
英語
荷蘭
簡體中國

當我切換到中國,它看起來像:
英語
荷蘭語
簡體中文

我試圖讓它看起來像:
英文/英文
荷蘭/荷蘭
簡體中國/簡體中文

settings.py包括:

ugettext = lambda s: s 
LANGUAGES = (
    ('en', ugettext('English')), 
    ('nl', ugettext('Dutch')), 
    ('zh-cn', ugettext('Simplified Chinese')), 
) 

base.html文件:

{% load i18n %} 
    {% get_available_languages as LANGUAGES %} 
    <form action="/i18n/setlang/" method="post">{% csrf_token %} 
     <input name="next" type="hidden" value="/" /> 
     {% csrf_token %} 
     <select name="language"> 
      {% for lang in LANGUAGES %} 
      <option value="{{ lang.0 }}">{{ lang.1 }}</option> 
      {% endfor %} 
     </select> 
     <input type="submit" value="Go" /> 
    </form> 

我的想法是到另一個項目添加到語言是母語,如:

LANGUAGES = (
    ('en', ugettext('English'), 'English'), 
    ('nl', ugettext('Dutch'), 'Nederlands'), 
    ('zh-ch', ugettext('Simplified Chinese'), '簡體中文'),) 

但Django似乎期待一個2項目元組語言。任何其他想法?每亞歷山大的評論

編輯: 我認爲這可能是一個簡單的解決方案,但改變後的代碼:

 <form action="/i18n/setlang/" method="post">{% csrf_token %} 
     <input name="next" type="hidden" value="/" /> 
     <select name="language"> 
      <option value="en">English</option> 
      <option value="nl">Dutch\Nederlands</option> 
      <option value="ru">Russian\Русский</option> 
      <option value="zh-cn">Simplified Chinese-簡體中文</option> 
     </select> 
     <input type="submit" value="Go" /> 
    </form> 

俄羅斯和中國的腳本都顯示爲問號 - 俄羅斯\ ?? ?????,中文 - ????

我有<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 在html中,其他俄文和中文文本(此表格以外)顯示正常。

+0

我們並沒有打擾自己這樣一個問題:硬編碼模板中的一部分,這就是全部。 – 2012-07-18 20:27:57

+0

您必須切換/設置語言並枚舉所有語言才能生成每種語言名稱的所有可能的本機翻譯。只需爲每種您想要的語言嵌入一個預定義的名稱字典,然後將其傳遞給模板,就容易得多。 – astevanovic 2012-07-18 22:53:16

回答

5

試試這個:

LANGUAGES = (
    ('en', '{}/{}'.format(ugettext('English'), 'English')), 
    ('nl', '{}/{}'.format(ugettext('Dutch'), 'Nederlands')), 
    ('zh-cn', '{}/{}'.format(ugettext('Simplified Chinese'), '簡體中文')), 
) 

然後你就可以在你的模板中使用:

{% for lang in LANGUAGES %} 
    <option value="{{ lang.0 }}">{{ lang.1 }}</option> 
{% endfor %} 
+0

該代碼給我一個UnicodeDecodeError,位於/ 'ascii'編解碼器無法解碼位置8中的字節0xd0:當模板調用{%get_available_languages作爲LANGUAGES%}時,序號不在範圍內(128)。如果我更改爲u'簡體中文',那麼我得到一個UnicodeEncodeError:'ascii'編解碼器無法編碼位置0-6中的字符:序號不在範圍內(128)導入settings.py – Steve 2012-07-19 20:32:41

+0

對不起,我不知道如何格式化評論......我必須將settings.py的編碼設置爲utf-8,以及其他一些調整。這種語言編碼有很多基礎要覆蓋才能很好地工作! – Steve 2012-07-19 20:43:41

+0

你不需要使用{%get_available_languages作爲LANGUAGES%}。如果您沒有更改'TEMPLATE_CONTEXT_PROCESSORS',那麼缺省情況下,{{LANGUAGES}}'已經可用於您的模板。 {%get_available_languages%}會導致您得到的UnicodeDecodeError。 – 2012-07-20 02:11:25

1

以亞歷山大的建議,我是能夠得到在編輯上面的代碼才能正常工作。我沒有<meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 行在'頭'區域,這是必需的,這是給我的?漢字本來應該是這樣的。

在看到它的實際操作後,我可能會有2個語言選擇器,一個會翻譯成當前語言,另一個會翻譯成英語/母語字符(如果不是太忙)。

我也會將語言列表放到一個模塊中,並將它傳遞給模板,類似於獲取LANGUAGES。