2012-07-05 21 views
7

Tôi đang sử dụng i18n_patterns để thêm tiền tố của lang_code hiện tại vào url của tôi.django i18n_patterns ẩn lang_code mặc định từ url

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

Nó allowes tôi để có được url như /en/about-us/, /pl/about-us/ vv .. ngôn ngữ mặc định của tôi là pl

LANGUAGE_CODE = 'pl' 

Tôi muốn URL như/về-us/cho khách hàng xem trang web của tôi trong lenguage đánh bóng . Có cách nào để ẩn tiền tố lang_code từ url cho lang_code mặc định không?

+0

Bạn đã tìm hiểu cách thực hiện việc này chưa? Tôi rất muốn biết điều đó! – Javaaaa

Trả lời

0

Đây là giải pháp của tôi:

Tạo django middleware: 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 

Nó đọc các thông số get của yêu cầu và nếu nó có lang thuộc tính, sau đó chuyển sang ngôn ngữ . Ex .:/về-us/lang = pl

Bao gồm middleware này để 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', 
) 
1

tôi phải đối mặt với vấn đề này và giải quyết theo cách này:

  • tạo một sự thay thế i18n_patterns không làm tiền tố ngôn ngữ chính của trang web (được xác định trong settings.LANGUAGE_CODE).

  • Tạo một phần mềm trung gian thay thế chỉ sử dụng ngôn ngữ tiền tố URL để kích hoạt ngôn ngữ hiện tại.

Tôi không thấy bất kỳ tác dụng phụ nào khi sử dụng kỹ thuật này.

Mã:

# 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)] 

Đoạn mã trên có sẵn trên: https://gist.github.com/cauethenorio/4948177

1

Bạn có thể muốn kiểm tra yawd-translations mà làm chính xác điều đó. Nếu bạn không quan tâm đến chức năng bổ sung (quản lý ngôn ngữ từ db), bạn có thể xem phương thức urls.translation_patternsmiddleware.TranslationMiddleware để xem cách thực hiện.

6

Đây là một gói phần mềm rất đơn giản: django-solid-i18n-urls

Sau khi cài đặt, các url mà không tiền tố ngôn ngữ sẽ luôn luôn sử dụng ngôn ngữ mặc định, đó là quy định tại settings.LANGUAGE_CODE. Chuyển hướng sẽ không xảy ra.

Nếu url sẽ có tiền tố ngôn ngữ thì ngôn ngữ này sẽ được sử dụng.

Cũng trả lời ở đây: https://stackoverflow.com/a/16580467/821594.

0

Django >=1.10 có thể xử lý nguyên bản này. Có một đối số prefix_default_language mới trong hàm i18n_patterns.

Thiết prefix_default_language-False loại bỏ các tiền tố từ ngôn ngữ mặc định (LANGUAGE_CODE). Điều này có thể hữu ích khi thêm bản dịch vào trang web hiện tại để các URL hiện tại sẽ không thay đổi.

Nguồn:https://docs.djangoproject.com/en/dev/topics/i18n/translation/#language-prefix-in-url-patterns

Ví dụ:

# Main urls.py: 
urlpatterns = i18n_patterns(
    url(r'^', include('my_app.urls', namespace='my_app')), 
    prefix_default_language=False 
) 

# my_app.urls.py: 
url(r'^contact-us/$', ...), 

# settings: 
LANGUAGE_CODE = 'en' # Default language without prefix 

LANGUAGES = (
    ('en', _('English')), 
    ('cs', _('Czech')), 
) 

Câu trả lời của example.com/contact-us/ sẽ bằng tiếng Anh và example.com/cs/contact-us/ tại Séc.

Các vấn đề liên quan