2012-07-18 5 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'), '简体中文'),) 
のような母国語3210

しかし、DjangoはLANGUAGESの2項目タプルを期待しているようです。他のアイデア?アレクサンダーさんのコメントあたり

EDIT: 私はそれが簡単な解決策かもしれないと思ったが、コードの変更後:

 <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

私たちは、このような問題を抱えていませんでした。テンプレートにハードコーディングされた部分がありました。 –

+0

各言語名の可能なすべてのネイティブ翻訳を生成するには、言語を切り替えて設定し、すべてを列挙しなければなりません。あなたが望む言語ごとにネイティブのスペルで名前の事前定義されたdictを埋め込み、それをテンプレートに渡す方がはるかに簡単です。 – astevanovic

答えて

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'コーデックは、テンプレートが{%get_available_languagesをLANGUAGES%}としてコールすると、位置8のバイト0xd0をデコードできません。私がu '简体中文'に変更した場合、UnicodeEncodeErrorが発生します: 'ascii'コーデックは0-6の文字をエンコードできません:ordinalは設定をインポートするときに範囲(128)にありません – Steve

+0

申し訳ありませんが、コメントをうまくフォーマットする方法... settings.pyのエンコーディングをutf-8に設定しなければならず、その他いくつかの調整が必要でした。この言語のエンコーディングには、うまく機能するための多くの基盤があります。 – Steve

+0

あなたは{%get_available_languagesをLANGUAGES%}として使う必要はありません。 'TEMPLATE_CONTEXT_PROCESSORS'を変更していない場合は、デフォルトで' {{LANGUAGES}} 'があなたのテンプレートですでに利用可能です。 {%get_available_languages%}は、取得しているUnicodeDecodeErrorを引き起こします。 –

1

はアレキサンダーの提案を取って、私は正常に動作するために、上記の編集でコードを取得することができました。私は<meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 行を 'head'領域内には持っていませんでした。これは必須です。漢字があったはずです。

実際にそれを見た後、2つの言語セレクタを持つことができます.1つは現在の言語に翻訳され、もう1つは英語/ネイティブ文字で翻訳されます。

また、言語リストをモジュールに入れて、LANGUAGESの取得と同様にテンプレートに渡します。

関連する問題