Интернационализация Django - перевод из всплывающего окна, обработанного Javascript, не подхватывается
Я использую Django Internationalization
в моем проекте django.
На одной из моих страниц есть текст, который прекрасно переводится, и всплывающее окно, которое упорно не воспринимает перевод, предложенный в файле po
.
Как бы то ни было, перевод присутствует в po
.
Поскольку это всплывающее окно создавало проблемы в прошлом, я предполагаю, что это из-за javascript, который управляет открытием и закрытием окна.
Я начал следовать этому посту Как решить проблему перевода/локализации внешних файлов JavaScript, поскольку Django не позволяет использовать встроенные теги в других файлах? , но мне кажется, что я что-то упустил: как мне связать мой файл локали с каталогом javascript?
- project: mysite
- app: main
url (уровень проекта)
urlpatterns += i18n_patterns(
path('', include("main.urls")),
#add for i18n translation for javascript content
path("jsi18n/", JavaScriptCatalog.as_view(), name="javascript-catalog"),
)
base.html
<script src="{% url 'javascript-catalog' %}"></script>
шаблон (уровень приложения) со скриптом
<div class="form-popup" id="myForm{{ model.id }}">
<form action="{% url 'url' %}" class="show-venue-popup-container" method="post">
{% csrf_token %}
<h5 class="show-venue-popup-title">{% translate 'text to be translated_0!' %}</h5>
<p class="show-venue-popup-text">{% translate 'text to be translated_1' %}</p>
<button type="submit" class="btn">{% translate 'text to be translated_2' %}</button>
<button type="button" class="btn cancel" onclick="closeForm('{{ model.id }}')">{% translate 'text to be translated_3' %}</button>
</form>
</div>
<script>
// Shows and hides claim window
// Pop up when user clicks claim starts
function openForm(modelId) {
document.getElementById("myForm" + modelId).style.display = "block";
}
function closeForm(modelId) {
document.getElementById("myForm" + modelId).style.display = "none";
}
// Pop up when user clicks claim ends
function displayTab(containerId) {
const tab = document.querySelector(containerId);
const isOpen = !tab.classList.contains('hide');
const allTabs = document.querySelectorAll('.tab-container');
allTabs.forEach(container => {
container.classList.add('hide');
Array.from(container.querySelectorAll('.tab-section')).forEach(section => {
section.classList.add('hide');
section.style.display = 'none';
});
});
if (!isOpen) {
tab.classList.remove('hide');
Array.from(tab.querySelectorAll('.tab-section')).forEach(section => {
section.classList.remove('hide');
section.style.display = 'flex';
});
}
}
</script>
locale/language/django.po:
#: .\main\templates\template
msgid "text to be translated_0!"
msgstr "xxxx"
Я был почти там:
В документации (https://docs.djangoproject.com/en/5.0/topics/i18n/translation/) Я не увидел двух строк, которые должны быть продублированы в обоих шаблонах url:
Если ваш корневой URLconf использует i18n_patterns(), JavaScriptCatalog также должен быть обернут i18n_patterns(), чтобы каталог был сгенерирован правильно. сгенерирован.
поэтому для тех, кто, как и я, не умеет читать, эти две строки следует повторить, и ваш код должен выглядеть так:
urls.py
urlpatterns = [
path('jsi18n/', JavaScriptCatalog.as_view(), name='javascript-catalog'),
]
urlpatterns += i18n_patterns(
path('', include("main.urls")),
#add for i18n translation for javascript content
path('jsi18n/', JavaScriptCatalog.as_view(), name='javascript-catalog'),
)
base.html (я поместил его в элемент header)
<script src="{% url 'javascript-catalog' %}"></script>
Ничего не нужно менять в файле шаблона.
тогда: python manage.py makemessages
и python manage.py compilemessages