Django url 更改语言代码

Rgf*_*Iff 5 python django django-i18n

当用户单击 Django 中的按钮时,我试图更改网站的语言。

\n\n

我有一个基础项目,网址是:

\n\n
urlpatterns += i18n_patterns(\n    # Ecommerce is the app where I want to change the language\n    url(r\'^\', include("ecommerce.urls")),\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

Ecommerce.urls 内的 url 是:

\n\n
urlpatterns = [\n    url(r\'^testing/$\', views.test, name=\'url_testing\'),\n    ... other urls\n]\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我访问上面的网址时,我首先访问:http://localhost/en/testing/

\n\n

我想设置一个链接<a href="{% url \'url_testing\' %}">Change Language</a>,以便当用户单击它时,它会将语言更改为http://localhost/zh-hans/testing/. 如何在我的模板中执行此操作?

\n\n

编辑

\n\n

我现在可以使用以下代码更改语言,但问题是它只能工作一次:

\n\n
<form id="languageForm" action="/i18n/setlang/" method="post">\n    {% csrf_token %}\n    <input name="next" type="hidden" value="{% url \'url_testing\' %}" /> \n    <input id="newLanguageInput" type="hidden" name="language"/>\n</form>\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的链接是:

\n\n
<li><a onclick="changeLanguage(\'zh-hans\')">\xe7\xae\x80\xe4\xbd\x93</a></li>\n<li><a onclick="changeLanguage(\'zh-hant\')">\xe7\xb9\x81\xe9\xab\x94</a></li>\n
Run Code Online (Sandbox Code Playgroud)\n\n

函数changeLanguage定义如下:

\n\n
function changeLanguage(newLanguage) {\n    $(\'input[name="newLanguageInput"]\').val(newLanguage);\n    $(\'#languageForm\').submit();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我第一次单击这 2 个链接中的任何一个时,该代码就会起作用,并且我将被重定向到 urlhttp://localhost/zh-hans/testing/http://localhost/zh-hant/testing/. 问题是我改变一次语言后,它就不再改变了。我的提交有问题吗?

\n

小智 6

当用户单击链接(无网址翻译,无帖子)时,您可以更改网站的语言,如下所示:

navigation.html(带有 bootstrap4 和很棒的字体)

<li class="nav-item dropdown">
  {% get_current_language as LANGUAGE_CODE %}
  <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown">{{ LANGUAGE_CODE }}</a>
  <div class="dropdown-menu dropdown-menu-right">

    {% get_available_languages as languages %}
    {% for lang_code, lang_name in languages %}

    <a href="{% url 'main:activate_language' lang_code %}" class="dropdown-item">
      {% if lang_code == LANGUAGE_CODE %}
        <i class="fas fa-check-circle"></i>&nbsp;&nbsp;
      {% else %}
        <i class="far fa-circle"></i>&nbsp;&nbsp;
      {% endif %}
      {{ lang_name }} ({{ lang_code }})
    </a>

    {% endfor %}
  </div>
</li>
Run Code Online (Sandbox Code Playgroud)

视图.py

from django.shortcuts import redirect
from django.utils import translation
from django.views.generic.base import View

class ActivateLanguageView(View):
    language_code = ''
    redirect_to   = ''

    def get(self, request, *args, **kwargs):
        self.redirect_to   = request.META.get('HTTP_REFERER')
        self.language_code = kwargs.get('language_code')
        translation.activate(self.language_code)
        request.session[translation.LANGUAGE_SESSION_KEY] = self.language_code
        return redirect(self.redirect_to)
Run Code Online (Sandbox Code Playgroud)

urls.py

from django.urls import path
from .views import ActivateLanguageView

app_name = 'main'
urlpatterns = [
    path('language/activate/<language_code>/', ActivateLanguageView.as_view(), name='activate_language'),
]
Run Code Online (Sandbox Code Playgroud)

这对我来说是工作。


nik*_*k_m 4

实际上,它不会是一个简单的<a>链接,而是一个<form>.

阅读如何set_language重定向视图。该表格将负责更改语言。这很容易。

确保您已经LANGUAGES先设置了一些。