2012-11-29 60 views
14

我有一个现有的多语言Django应用程序,我将移植到Django 1.4。 I18n支持目前基于一些丑陋的黑客攻击,我想让它使用Django的内置i18n模块。Django i18n默认语言没有路径前缀

一个约束是我不想更改已经存在的URL。这个网站一直活跃一段时间,并有外部链接,我不'想要打破或重定向。网址方案是这样的:英文内容是网站的根本,而其他语言的使用前缀的域名:

英文网址:

/ 
/articles/ 
/suggestions/ 

西班牙语网址:

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

我已经有翻译过的页面与Django 1.4的i18n模块一起工作,但它确实真的想要将所有英文url放在/ en /下。我已经尝试了一些不同的黑客,包括定义为英文版非国际网址:

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%}标签做反向解析不起作用。

什么是最好的方式来完成非前缀的英语网址?

+0

只是一个问题:就是你'_'非懒版FO gettext的?即''从django.utils.translation输入ugettext为_' –

+0

不,这是懒惰的版本:django.utils.translation.ugettext_lazy –

+0

你可以试试它与非懒惰版本,看看它是否工作? –

回答

9

UPDATE:阅读答案波纹管,Django的1.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

+0

'from django.conf.urls import patterns' does not exist – PvdL

+1

@PvdL对于较新的django版本,您应该使用本地解决方案:https://docs.djangoproject.com/en/1.10/topics/i18n/translation/# language-prefix-in-url-patterns –

+2

谢谢,完全忽略了'i18n_patterns(* url,prefix_default_language = True)的'kwarg' – PvdL

11

Django 1.10本地支持它。因为它们在doc说:

i18n_patterns(*网址,prefix_default_language =真

该功能可在一个根URL配置被使用和Django会自动预先设置当前活动的语言代码,以在i18n_patterns()内定义的所有网址格式。

将prefix_default_language设置为False将删除默认语言的前缀(LANGUAGE_CODE)。将翻译添加到现有网站时,这可能会很有用,以便当前网址不会更改。

来源:https://docs.djangoproject.com/en/1.10/topics/i18n/translation/#language-prefix-in-url-patterns