15

Django1.4に移植している既存の多言語Djangoアプリがあります。I18nのサポートは現在、いくつかの醜いハックに基づいています。Djangoの組み込みi18nモジュールを使用するようにしたいと思います。

1つの制約は、すでに配置されているURLを変更したくないということです。このサイトはしばらくの間アクティブであり、私が壊したりリダイレクトしたりしたくない外部リンクがあります。urlsスキームは次のように機能します。英語のコンテンツはサイトのルートにありますが、他の言語はドメイン名にプレフィックスを使用します。

英語のURL:

/
/articles/
/suggestions/

スペイン語のURL:

/es/
/es/articulos/
/es/sugerencias/

翻訳されたページはDjango1.4のi18nモジュールで動作しますが、実際には、すべての英語のURLを/en/の下に配置したいと考えています。英語版の非国際化URLの定義など、いくつかの異なるハックを試しました。

def build(callback):
  return callback('',
    url(_(r'^$'), home.index, name="home"),
    url(_(r'^articles/$'), content.article_list, name='article_list'),
    url(_(r'^suggestions/$'), suggestions.suggestions, name='suggestions'),
  )

urlpatterns = build(patterns)
urlpatterns += build(i18n_patterns)

これにより、URLは正しく解決されますが、逆解決を行うための{%url%}タグは機能しません。

プレフィックスのない英語のURLを実現するための最良の方法は何ですか?

4

3 に答える 3

15

同様の問題を解決するためにsolid-i18n-urlを使用しました: https ://github.com/st4lk/django-solid-i18n-urls

それがどのように機能するかについての素晴らしい説明はここにあります:http: //www.lexev.org/en/2013/multilanguage-site-django-without-redirects/

于 2013-06-17T13:07:31.647 に答える
12

Django1.10はそれをネイティブにサポートしています。彼らがドキュメントで言うように:

i18n_patterns(* urls、prefix_default_language = True

この関数はルートURLconfで使用でき、Djangoは現在アクティブな言語コードを内で定義されたすべてのURLパターンの前に自動的に追加しますi18n_patterns()

prefix_default_languageをFalseに設定すると、デフォルト言語(LANGUAGE_CODE)からプレフィックスが削除されます。これは、現在のURLが変更されないように、既存のサイトに翻訳を追加するときに役立ちます。

ソース:https ://docs.djangoproject.com/en/1.10/topics/i18n/translation/#language-prefix-in-url-patterns

于 2016-06-24T17:29:54.227 に答える
10

更新:以下の回答を読んでください、Django1.10はそれをネイティブにサポートしています

私はこの問題に直面し、次のように解決しました。

  • i18n_patternsサイトのメイン言語(で定義)のプレフィックスを付けない代替言語を作成しましたsettings.LANGUAGE_CODE

  • URLプレフィックス言語のみを使用して現在の言語をアクティブ化する代替ミドルウェアを作成しました。

この手法を使用しても副作用は見られませんでした。

コード:

# coding: utf-8
"""
Cauê Thenório - cauelt(at)gmail.com

This snippet makes Django do not create URL languages prefix (i.e. /en/)
for the default language (settings.LANGUAGE_CODE).

It also provides a middleware that activates the language based only on the URL.
This middleware ignores user session data, cookie and 'Accept-Language' HTTP header.

Your urls will be like:

In your default language (english in example):

    /contact
    /news
    /articles

In another languages (portuguese in example):

    /pt/contato
    /pt/noticias
    /pt/artigos

To use it, use the 'simple_i18n_patterns' instead the 'i18n_patterns'
in your urls.py:

    from this_sinppet import simple_i18n_patterns as i18n_patterns

And use the 'SimpleLocaleMiddleware' instead the Django's 'LocaleMiddleware'
in your settings.py:

    MIDDLEWARE_CLASSES = (
    ...
        'this_snippet.SimpleLocaleMiddleware'
    ...
    )

Works on Django >=1.4
"""

import re

from django.conf import settings
from django.conf.urls import patterns
from django.core.urlresolvers import LocaleRegexURLResolver
from django.middleware.locale import LocaleMiddleware
from django.utils.translation import get_language, get_language_from_path
from django.utils import translation


class SimpleLocaleMiddleware(LocaleMiddleware):

    def process_request(self, request):

        if self.is_language_prefix_patterns_used():
            lang_code = (get_language_from_path(request.path_info) or
                         settings.LANGUAGE_CODE)

            translation.activate(lang_code)
            request.LANGUAGE_CODE = translation.get_language()


class NoPrefixLocaleRegexURLResolver(LocaleRegexURLResolver):

    @property
    def regex(self):
        language_code = get_language()

        if language_code not in self._regex_dict:
            regex_compiled = (re.compile('', re.UNICODE)
                              if language_code == settings.LANGUAGE_CODE
                              else re.compile('^%s/' % language_code, re.UNICODE))

            self._regex_dict[language_code] = regex_compiled
        return self._regex_dict[language_code]


def simple_i18n_patterns(prefix, *args):
    """
    Adds the language code prefix to every URL pattern within this
    function, when the language not is the main language.
    This may only be used in the root URLconf, not in an included URLconf.

    """
    pattern_list = patterns(prefix, *args)
    if not settings.USE_I18N:
        return pattern_list
    return [NoPrefixLocaleRegexURLResolver(pattern_list)]

上記のコードは、 https ://gist.github.com/cauethenorio/4948177で入手できます。

于 2013-02-13T23:17:09.440 に答える