首页 > 解决方案 > 如何向 Django 项目添加多种语言?

问题描述

我正在向我的 Django 网站添加第二种语言,但是当我选择第二种语言时,没有任何变化。

设置.py

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
# 'login_required.middleware.LoginRequiredMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

# provide a list of language which your site support
LANGUAGE_CODE = 'en-us'
LANGUAGES = [
('en', 'English'),
('ar', 'Arabic'),
]

# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

# List where django should look into for django.po
LOCALE_PATHS = [os.path.join(BASE_DIR, 'locale'), ]

网址.py

from django.conf.urls.i18n import set_language
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include
from django.conf import settings

urlpatterns = [
              path('i18n/', include('django.conf.urls.i18n')),
              path('admin/', admin.site.urls),
              path('', include('company.urls')),
              path('', include('core.urls')),
              path('', include('movement.urls')),
              path('', include('warehouse.urls')),
              path('setlang/', set_language, name='set_language'),
              path('', include('maintenance.urls')),
              path('', include('reporters.urls')),
              path('', include('accounts.urls')),
          ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

索引.html

{% load i18n static %}
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_language_info_list for LANGUAGES as languages %}
<div class="btn-group">
                <button type="button" class="btn dropdown-toggle dropdown-icon" data-toggle="dropdown">
                    <i class="fa fa-language"></i>
                </button>
                <div class="dropdown-menu" role="menu">
                    {% for language in languages %}
                        {% if language.code != LANGUAGE_CODE %}
                            <a class="dropdown-item" href="{% url 'set_language' %}" class="dropdown-item"
                               data-language-code="{{ language.code }}"> {{ language.name_local }}
                            </a>
                        {% endif %}
                    {% endfor %}
                </div>
            </div>

我也运行这些命令

  1. py manage.py makemessages -l ar
  2. django-admin 编译消息

并翻译 django.po 文件中的所有字符串。但是当我选择另一种语言时,什么都没有改变。

标签: pythondjango

解决方案


我发现我的代码问题它在模板 indes.html 中

            <form action="{% url 'set_language' %}" method="post">{% csrf_token %}
                <div class="input-group">
                    <div class="input-group-prepend">
                        <button type="submit" class="btn btn-default" value="Go">{% trans 'Save' %}</button>
                    </div>
                    <!-- /btn-group -->
                    <input name="next" type="hidden" value="{{ redirect_to }}">
                    {% get_current_language as LANGUAGE_CODE %}
                    {% get_available_languages as LANGUAGES %}
                    {% get_language_info_list for LANGUAGES as languages %}
                    <select class="custom-select" name="language">
                        {% for language in languages %}
                            <option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %}
                                    selected{% endif %}>
                                {{ language.name_local }} ({{ language.code }})
                            </option>
                        {% endfor %}
                    </select>
                </div>

            </form>

我刚刚添加了一个标签并将 action 属性设置为 set_language url,一切正常。

<form action="{% url 'set_language' %}" method="post">
{% csrf_token %}
       

推荐阅读