8

i18n_patterns を使用して、現在の lang_code のプレフィックスを URL に追加しています。

urlpatterns += i18n_patterns('',
    url(r'^', include('blaszczakphoto2.gallery.urls')),
)

/en/about-us/などのURL を取得でき/pl/about-us/ます。デフォルトの言語はpl

LANGUAGE_CODE = 'pl'

私のサイトをポーランド語で表示しているクライアントのために、/about-us/ のような URL が必要です。デフォルトの lang_code の URL から lang_code プレフィックスを非表示にする方法はありますか?

4

5 に答える 5

5

これは非常に単純なパッケージです: django-solid-i18n-urls

設定後、言語プレフィックスのない URL は、 で指定されているデフォルトの言語を常に使用しますsettings.LANGUAGE_CODE。リダイレクトは発生しません。

URL に言語プレフィックスがある場合、この言語が使用されます。

ここでも回答: https://stackoverflow.com/a/16580467/821594

于 2013-07-07T22:23:29.907 に答える
2

私はこの問題に直面し、この方法で解決しました:

  • 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-13T21:10:31.723 に答える
0

これが私の解決策です:

django ミドルウェアを作成します: django_app/lib/middleware/locale.py

from django.utils import translation

    class SwitchLanguageMiddleware(object):

        def process_request(self, request):
            lang = request.GET.get('lang', '')

            if lang:
                translation.activate(lang)
                request.LANGUAGE_CODE = translation.get_language()

        def process_response(self, request, response):
            request.session['django_language'] = translation.get_language()
            if 'Content-Language' not in response:
                response['Content-Language'] = translation.get_language()
            translation.deactivate()

            return response

リクエストのgetパラメータを読み込み、lang属性があれば言語を切り替えます。例: /about-us/?lang=pl

このミドルウェアを settings.py に含めます。

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.common.CommonMiddleware',

    'django_app.libs.middleware.locale.SwitchLanguageMiddleware',
)
于 2012-10-02T19:24:14.387 に答える