2016-04-28 13 views
2
settings.py: 
INSTALLED_APPS = [ 
    ..., 
    'modeltranslation', 
] 
TIME_ZONE = 'Europe/Belgrade' 
USE_I18N = True 
USE_L10N = True 
USE_TZ = True 
LANGUAGES = (
    ('en-us', _('English')), 
    ('hu', _('Hungarian')), 
    ('sr-latn', _('Serbian')), 
) 
LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'), 
    os.path.join(BASE_DIR, 'books', 'locale'), 
) 

urls.py: 
urlpatterns = [ 
    url(r'^i18n/', include('django.conf.urls.i18n')), 
    ] 
urlpatterns += i18n_patterns(
    url(_r('^books/'), include('books.urls', namespace='books')) 
    ) 

デフォルト言語は英語です。 私のモデルには、各言語ごとに3つのタイトルフィールドがあります。 それはmodeltranslationパッケージは、すなわちどのように動作するかです:Django:URLを正しく反映するように言語を設定および変更するにはどうすればよいですか?

(title_en、title_hu、title_sr_latn)

私は、URL内のモデルのインスタンスのURL表現のためのslugフィールドを使用しているので、私は言語ごとに3つのスラグfiledsを持っていますしたがって私のモデルクラスでも。

私は私のURLは、例えば、ハンガリーで次のようになります任意のローミングサービスが表示されない:

127.0.0.1/hu/konyvek/learn-django 

私は私のURLは次のようになりたい:

英語のURL(Iデフォルトの言語の言語の接頭辞を持っている必要はありません):!

127.0.0.1/books/the-lord-of-the-rings 

ハンガリーURLを

127.0.0.1/hu/konyvek/a-gyuruk-ura 

セルビアURL(セルビア語の接頭辞は、まさにこだわり醜いが、それは別のトピックであることを残念なことです):

127.0.0.1/sr-latn/knjige/gospodar-prstenova 

私は、この問題を解決し、これまでに何かを見つけることができませんでした。 私がテンプレートに自分の言語の切り替え「次へ」フォーム要素の値にこれらのいずれかを使用することができないことは明らかである: {{ request.path }}または

{{ request.get_absolute_path|slice:'3:' }}は、だから私は、一時的に「次へ」の要素を除外しました。 言語を切り替えると、フロントページですべてうまく機能します。 私が書籍のページ、例えば(/hu/konyvek/)に行った場合、それは適切に表示されますが、私がそこから別の言語に変更したいのであれば、それはできません。 現在のページをリロードするだけです。

これを行う方法を教えてください。

+0

新しい言語で次のURLが必要な場合は、これが役立ちます:http://stackoverflow.com/questions/11437454/django-templates-get-current-url-in-another-language – pasztorpisti

+0

ありがとう@pasztorpisti for you寄付や返事が遅れて申し訳ありません。しかし、それは私を助けませんでした。それでも何らかの解決策を探しています。 –

答えて

1

今のところ、私はこの問題を解決する優雅な方法を見つけることができませんでした。 ハードコードされているので、私は今このプロジェクトで一時的にしか動作しない醜い解決策を持っています。

私はhttps://djangosnippets.org/snippets/2875/

@register.simple_tag(takes_context=True) 
def change_lang(context, lang=None, *args, **kwargs): 
    path = context['request'].path 
    url_parts = resolve(path) 

    cur_language = get_language() 

    try: 
     activate(lang) 
     url = reverse(url_parts.view_name, kwargs=url_parts.kwargs) 
    finally: 
     activate(cur_language) 


    return "%s" % url 

でこのコードを見つけました。しかし、この解決策は、私の問題の半分しか解決しました。 URLの 'book /'部分は正しく翻訳されましたが、スラッグ部分e.i. 'the-Lord-of-the-Ring /'は古いままだった。 djangoは言語が切り替わったためURLのパスを解決できませんでしたが、最初のレベルのURLは変更されましたが、urlconfのようなものはありません。 'konyvek/the-Lord-of-the-rings /'

私は、コードを少し変更されました:

@register.simple_tag(takes_context=True) 
def change_lang(context, lang=None, *args, **kwargs): 

    path = context['request'].path 
    url_parts = resolve(path) 

    cur_language = get_language() 

    try: 
     translation.activate(lang) 
     if 'book' in context: 
      slug = context['book'].slug 
      url = reverse(url_parts.view_name, kwargs={'slug': slug}) 
     else: 
      url = reverse(url_parts.view_name, kwargs=url_parts.kwargs) 
    finally: 
     translation.activate(cur_language) 

    return '%s' % url 

「幸いにも」は、コンテキストリストは「ブック」と呼ばれるオブジェクトのインスタンスを持っているので、私は新しいを起動した後、私は適切なSlugfieldを選択するためにそれを使用することができますが言語はそれを逆関数でkwargsに転送しました。

おそらくミドルウェアとカスタムタグを書く方がよいでしょう。

とにかく、これはうまくいきますが、誰かがこれについてより良い、一般的な解決策を持っている、または見つけたら歓迎します。

この問題の解決策がないことは非常に奇妙なようです。

しかし、多分私は間違っていて、それを見つけることができません。

関連する問題