Django网址更改语言代码

oxcyiej7  于 2022-12-05  发布在  Go
关注(0)|答案(3)|浏览(123)

当用户点击Django中的一个按钮时,我试图更改网站的语言。
我有一个基本项目和网址是:

urlpatterns += i18n_patterns(
    # Ecommerce is the app where I want to change the language
    url(r'^', include("ecommerce.urls")),
)

Ecommerce. url中的网址是:

urlpatterns = [
    url(r'^testing/$', views.test, name='url_testing'),
    ... other urls
]

当我访问上面的网址时,我首先转到:http://localhost/en/testing/ .
我想设置一个链接<a href="{% url 'url_testing' %}">Change Language</a>,这样当用户单击它时,它会将语言更改为http://localhost/zh-hans/testing/。如何在我的模板中执行此操作?

编辑

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

<form id="languageForm" action="/i18n/setlang/" method="post">
    {% csrf_token %}
    <input name="next" type="hidden" value="{% url 'url_testing' %}" /> 
    <input id="newLanguageInput" type="hidden" name="language"/>
</form>

我的链接是:

<li><a onclick="changeLanguage('zh-hans')">简体</a></li>
<li><a onclick="changeLanguage('zh-hant')">繁體</a></li>

函数changeLanguage的定义如下:

function changeLanguage(newLanguage) {
    $('input[name="newLanguageInput"]').val(newLanguage);
    $('#languageForm').submit();
}

当我第一次点击2个链接中的任何一个时,代码都可以工作,我会被重定向到url http://localhost/zh-hans/testing/http://localhost/zh-hant/testing/。问题是我更改了一次语言后,它就不再更改了。我的提交有什么问题吗?

zf9nrax1

zf9nrax11#

实际上,它不是一个简单的<a>链接,而是一个<form>链接。
阅读如何set_language重定向视图。此表单将负责更改语言。非常简单。
请确保您已先设置了一些LANGUAGES

3gtaxfhh

3gtaxfhh2#

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

  • navigation.html(带有引导程序4和字体)*
<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>
  • 查看次数.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)
  • 网址.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'),
]

这是我的工作。

wko9yo5t

wko9yo5t3#

新的代码片段兼容新的API(Boostrap 5和Django〉= 4.0),更新自优秀的@Boris urkan答案。
Django已经放弃了对translation.LANGUAGE_SESSION_KEY的支持,所以基本上我们需要使用session cookie来进行设置。

class ActivateLanguageView(View):

    def get(self, request, lang, **kwargs):
        url = request.META.get('HTTP_REFERER', '/')
        translation.activate(lang)
        response = HttpResponseRedirect(url)
        response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang)
        return response

Boostrap已更改其下拉列表的jQuery绑定:

<li class="nav-item dropdown">
  {% get_current_language as LANGUAGE_CODE %}
  <a class="nav-link dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-bs-toggle="dropdown" aria-expanded="false">
    <strong>{{ LANGUAGE_CODE }}</strong>
  </a>
  <div class="dropdown-menu dropdown-menu-right">

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

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

    {% endfor %}
  </div>
</li>

代码的其他部分基本保持不变。

相关问题