Django国际化静态网站

时间:2015-06-21 13:45:32

标签: python django internationalization static-site

我正在尝试使用Django和Python制作双语(意大利语和英语)网站。 我跟着this小教程,我一直有疑问 我不想要这个站点的任何数据库(既不是管理员页面),所以我删除了 settings.py 中的数据库设置部分,然后我激活了“USE_I18N = True”和 ugettext < / em>以及其他一切。事实上,当我去 localhost 时,它会正确显示 / it / / en / 之后的语言翻译本地主机:8000
我现在正在尝试创建一个用于切换语言的按钮,将 djangoproject 代码添加到我的模板文件中,在这里:

{% load i18n %}
<form action="{% url 'set_language' %}" method="post">
{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select name="language">
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}>
    {{ language.name_local }} ({{ language.code }})
</option>
{% endfor %}
</select>
<input type="submit" value="Go" />
</form>

问题是当我从下拉菜单中选择一种语言时,会出现错误

ImproperlyConfigured at /it/i18n/setlang/
settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.
Request Method: POST
Request URL:    http://localhost:8000/it/i18n/setlang/
Django Version: 1.8.2
Exception Type: ImproperlyConfigured
Exception Value:    
settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.

这是应用程序树:

sito_personale --- locale --- en --- LC_MESSAGES --- django.mo
                                                 --- django.po
                          --- it --- LC_MESSAGES --- django.mo
                                                 --- django.po
               --- pages --- migration
                         --- static
                         --- templates
               --- sito_personale
               --- manage.py

我能解决这个问题吗?

我非常感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

Django将所选语言保存到会话中。 SESSION_ENGINE默认使用数据库,因为您不使用db,这可能会导致您获得异常。

尝试将SESSION_ENGINE设置为django.contrib.sessions.backends.file,而不是将会话数据存储在磁盘上(请参阅Using file-based sessions)。

因此,在 settings.py 中添加:

SESSION_ENGINE = 'django.contrib.sessions.backends.file'

更新

如果您的网站不需要会话支持,您还可以删除会话中间件。在这种情况下,Django将使用cookie来存储语言偏好

  

视图期望通过POST方法使用语言调用   请求中的参数集。如果启用了会话支持,则视图   将语言选择保存在用户的会话中。否则,它会节省   默认情况下命名的cookie中的语言选择   django_language。 (名称可以通过改变   LANGUAGE_COOKIE_NAME设置。)

更新来自评论的后续问题

正如warning in the docs所示,i18n模式需要与语言无关的urlpatterns:

  

警告
  确保您不在i18n_patterns()中包含上述URL    - 它本身需要与语言无关才能正常工作。

以下是一个快速示例,说明如何从上方转换为 urls.py

urlpatterns = solid_i18n_patterns('',
    # Examples:
    # url(r'^$', 'sito_personale.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),
    url(r'', include('pages.urls')),
)

urlpatterns += patterns('',
    url(r'^i18n/', include('django.conf.urls.i18n')),
)

答案 1 :(得分:0)

我可能找到了解决方案,但我不知道它是否正确/最好。 我在模板代码中更改了:

<input name="next" type="hidden" value="{{ redirect_to }}" />

<input name="next" type="hidden" value="/" />

现在它完美无瑕!我希望这是解决问题的最好方法,如果有人能回答我对它的疑问,我真的很感激。