首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有路径前缀的Django i18n默认语言

没有路径前缀的Django i18n默认语言
EN

Stack Overflow用户
提问于 2012-11-30 07:21:41
回答 3查看 12.4K关注 0票数 15

我有一个现有的多语言Django应用程序,我正在移植到Django 1.4。目前对I18n的支持是基于一些丑陋的技巧,我想让它使用Django的内置i18n模块。

一个限制是我不想更改已经存在的urls。这个网站已经活跃了一段时间了,还有一些我不想破坏或重定向的外部链接。urls方案的工作原理如下:英文内容位于站点的根目录,而其他语言在域名中使用前缀:

英文urls:

代码语言:javascript
复制
/
/articles/
/suggestions/

西班牙语urls:

代码语言:javascript
复制
/es/
/es/articulos/
/es/sugerencias/

我已经将翻译后的页面与Django1.4的i18n模块一起使用了,但它真的、真的、真的想把所有的英文urls放在/en/下。我尝试了几种不同的方法,包括为英文版本定义非国际化urls:

代码语言:javascript
复制
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%}标记不起作用。

实现无前缀英文urls的最佳方式是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-14 07:17:09

更新:阅读答案如下,Django1.10原生支持

我直面这个问题,并以这种方式解决:

  • 创建了不为站点主语言添加前缀的替代语言(在settings.LANGUAGE_CODE).
  • Created中定义),这是一种仅使用i18n_patterns前缀激活当前语言的替代中间件。

我没有看到使用这种技术的任何副作用。

代码:

代码语言:javascript
复制
# 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上找到

票数 10
EN

Stack Overflow用户

发布于 2013-06-17 21:07:32

我使用solid-i18n-url解决了类似的问题:https://github.com/st4lk/django-solid-i18n-urls

很好地描述了它是如何工作的,位于此处:http://www.lexev.org/en/2013/multilanguage-site-django-without-redirects/

票数 15
EN

Stack Overflow用户

发布于 2016-06-25 01:29:54

Django 1.10本身就支持它。正如他们在文档中所说的:

i18n_patterns(*urls,prefix_default_language=True)

这个函数可以在根URLconf中使用,Django会自动将当前的活动语言代码添加到i18n_patterns()中定义的所有url模式中。

将prefix_default_language设置为False将从默认语言(LANGUAGE_CODE)中删除前缀。这在向现有站点添加翻译时非常有用,这样当前的URL就不会发生变化。

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

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13636604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档