【问题标题】:Django 1.5: Remove default language prefix from url in django i18nDjango 1.5:从 django i18n 中的 url 中删除默认语言前缀
【发布时间】:2019-07-13 23:45:07
【问题描述】:

我正在使用 Django 1.5

我在项目中设置了国际化,并在 settings.py 文件中设置了以下变量

LANGUAGE_CODE = 'en'

LANGUAGES = (
    ('en', 'English'),
    ('es', 'Spanish')
)

urls.py 文件 contians

urlpatterns += i18n_patterns('',
    url(r'^', include(app_urlpatterns)),
)

但这会将 en 附加到每个 URL,例如

https://example.com/en/dashboard

我想从 URL 模式中隐藏默认语言。

我尝试将prefix_default_language=False 放在网址格式中

urlpatterns += i18n_patterns('',
    url(r'^', include(app_urlpatterns)),
    prefix_default_language=False
)

但这会产生错误

i18n_patterns() got an unexpected keyword argument 'prefix_default_language'

如何在 Django 1.5 中隐藏 URL 的默认语言前缀?

【问题讨论】:

    标签: django django-1.5 django-i18n


    【解决方案1】:

    据我从docs 了解到,默认情况下,django 1.5 中不支持prefix_default_language。所以要么你需要放弃使用它的想法,要么你需要自己实现它。如果选择后者,则需要创建一个新的i18n_patterns 函数,还需要在其中更新LocaleRegexURLResolver。例如:

    from django.core.urlresolvers import LocaleRegexURLResolver
    
    
    class CustomLocaleRegexURLResolver(LocaleRegexURLResolver):
         def __init__(self, urlconf_name, default_kwargs=None, app_name=None, namespace=None, prefix_default_language=True):
            self.prefix_default_language = prefix_default_language
            super(LocaleRegexURLResolver, self).__init__(None, urlconf_name, default_kwargs, app_name, namespace)
    
         @property
         def regex(self):
            language_code = get_language()
            if language_code == settings.LANGUAGE_CODE and not self.prefix_default_language:
                 return re.compile('^')
            if language_code not in self._regex_dict:
                regex_compiled = re.compile('^%s/' % language_code, re.UNICODE)
                self._regex_dict[language_code] = regex_compiled
            return self._regex_dict[language_code]
    

    现在,您需要在自定义i18n_patterns 中使用CustomLocaleRegexURLResolver,如下所示:

    from django.conf import settings
    from django.conf.urls import patterns, url
    from django.core.urlresolvers import LocaleRegexURLResolver
    
    def custom_i18n_patterns(prefix, *args, *kwargs):
        prefix_default_language = kwargs.get('prefix_default_language', True)
        pattern_list = patterns(prefix, *args)
        if not settings.USE_I18N:
            return pattern_list
        return [CustomLocaleRegexURLResolver(pattern_list, prefix_default_language=prefix_default_language)]
    

    最后,在你的 url 中使用这个:

    urlpatterns += custom_i18n_patterns('',
        url(r'^', include(app_urlpatterns)),
        prefix_default_language=False
    )
    

    已经根据代码available here实现了。

    【讨论】:

      【解决方案2】:

      您应该花两秒钟时间在设置文件中设置USE_I18N = True。然后 Django 会做一些优化,以免加载国际化机制。在TEMPLATE_CONTEXT_PROCESSORS 设置中添加'django.core.context_processors.i18n'

      settings.py

      USE_I18N = True
      TEMPLATE_CONTEXT_PROCESSORS = (
          "django.contrib.auth.context_processors.auth",
          "django.core.context_processors.debug",
          "django.core.context_processors.i18n",
          "django.core.context_processors.media",
          "django.core.context_processors.static",
          "django.core.context_processors.tz",
          "django.contrib.messages.context_processors.messages"
      )
      

      urls.py

      urlpatterns += (
          url(r'^', include(app_urlpatterns)),
      )
         
      

      参考:https://django-doc-test1.readthedocs.io/en/stable-1.5.x/topics/i18n/translation.html#overview

      【讨论】:

      • 但我想在我的应用程序中实现国际化,并且只想删除默认语言的前缀。对于其他语言,没问题。
      猜你喜欢
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 2016-06-07
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多