当前位置: 首页 > 面试题库 >

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

裴昊阳
2023-03-14
问题内容

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

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

英文网址:

/
/articles/
/suggestions/

西班牙语网址:

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

我已经将翻译后的页面与Django 1.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%}标签无法进行反向解析。


问题答案:

请看下面的答案,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)]


 类似资料:
  • 我写一个多语言应用程序。我不想为默认语言使用区域设置前缀,所以例如,我的URL结构应该是这样的: 我使用按前缀对我的路线进行分组: 在我的中间件中,我设置了URL的区域设置和前缀: 然后我的控制器打印数据: 这对于和前缀很有效,但对于英语lang,没有前缀也不行。我试图复制

  • 经过在internet上的搜索,我知道了在交互式/非交互式-登录/非登录shell组合的情况下应该在哪里更改PATH变量的值。 从另一个帖子中找到的 我有“/bin/sh”作为缺省登录shell,只有/etc/profile文件用于导出系统中所有需要的环境变量。在非交互式登录shell的情况下,/etc/profile也不会被引用,尽管上面的link说它会被引用。但当我执行时, 我可以看到PATH

  • 问题内容: 我比以往更加谨慎,因为我对过去的行为感到困惑。 我在Mac上,并通过安装的node.js 。 现在,我想在命令行中作为命令运行,我发现完成此操作的规范方法是成功运行此输出的: 后来 由于没有在我的身体里。 1)为什么没有安装全局 路径到路径?也许是的,但是确实有一些事情弄糟了。我在哪里可以找到? 2)我应该这样做吗?(附加到我底部的) 看来这不是正确的方法,因为如果以后再安装其他东西(

  • 执行以下操作时产生此错误: 事实上,我正试图在一个培训视频中跟进,所以我对这个有点陌生。据我所知,他正在尝试使用ES6,我知道一些命令,如import,在NodeVer9中本机不可用。这可能是其中之一吗?还有别的选择吗?

  • 问题内容: 第二个命令是否将当前路径添加为另一个搜索路径? 用冒号分隔多个路径是否正确? 默认情况下,当前路径不是始终在ClassPath中,因此不需要显式指定吗? 谢谢。 问题答案: 从Oracle的页面上设置类路径: 默认的类路径是当前目录。设置CLASSPATH变量或使用命令行选项将 覆盖 默认值,因此,如果要在搜索路径中包括当前目录,则必须包括“。”。在新设置中。 使用了Windows和类

  • 问题内容: 我有一个静态html,imgs,flash内容文件夹,它位于webapp文件夹之外。现在,我正在使用符号链接将该文件夹映射到我的webapp目录中。我的问题是,当我取消部署应用程序时,它会遵循符号链接并删除所有这些文件。 我尝试实现的解决方案之一是特殊的servlet,它包装了默认的servlet,但是使用了不同的相对路径。我在找出如何以覆盖默认servlet路径的方式包装默认serv