Как перевести стандартные сообщения об ошибках Javascript в Django? - PullRequest
1 голос
/ 23 сентября 2019

У меня есть пара проектов Django, использующих переводы, и все работает нормально, за исключением того, что сообщения об ошибках Javascript в формах не переводятся.

Например, в моей форме входа в систему, если я просто нажму Enter, я получуСообщение об ошибке JS «Пожалуйста, заполните это поле» на английском языке, независимо от того, выбрал ли я английский, французский, немецкий или любой другой язык.Это не мое сообщение об ошибке JS, и если я запускаю manage.py makemessages -d djangojs, то это сообщение не отображается для перевода, поэтому я не думаю, что мне нужно исправлять этот процесс.

Может кто-нибудь посоветовать мне, какчтобы пользователь получал сообщения об ошибках JavaScript на своем языке.Спасибо

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Django предлагает специальное решение для этого:

https://docs.djangoproject.com/en/2.2/topics/i18n/translation/#module-django.views.i18n

, но когда количество сообщений, используемых в js-коде и нуждающихся в переводе, ограничено, как это обычно бывает, я предпочитаюиспользуйте гораздо более простое решение.

Сначала я создаю «каталог сообщений js» в папке «templates»;он просто содержит список глобальных строковых литералов.

Поскольку механизм шаблонов не ограничен HTML и может обрабатывать файлы любого типа, вы можете {% загрузить i18n%} в начале файла js,и использовать «trans» и другие теги шаблона, как требуется, для маркировки значений переводимых строк;эти значения будут обнаружены "makemessages", как и ожидалось.

file "/ myapp / templates / message_catalog.js"

{% load i18n %}

MESSAGE_HELLO = "{% trans 'hello' %}";
MESSAGE_GOODBYE = "{% trans 'goodbye' %}";
...

Затем просто не забудьте включитьэто в основном шаблоне, поэтому каталог сообщений будет доступен из js кода:

file "/ myapp / templates / base.html"

...
    <script>
        {% include 'message_catalog.js' %}
    </script>

</body>
</html>

'Настоящий' код js может жить в обычном статическом режиме и по-прежнему иметь доступ к переведенным сообщениям:

file "/ myapp / static / frontend.js"

function hello() {
    alert(MESSAGE_HELLO);
}

function goodbye() {
    alert(MESSAGE_GOODBYE);
}
0 голосов
/ 30 сентября 2019

документы говорят, что вы должны использовать django-admin makemessages -d djangojs -l de, а не python manage.py ..., также убедитесь, что вы запустили django-admin compilemessages впоследствии.

Если это все еще не работает, вы можете попробовать использовать тег trans, а затем вручную добавить сообщение об ошибке, используя прослушиватели событий в ваших шаблонах.

В верхней части страницы:

{% load trans %}

Для чистого JavaScript:

var inputs = document.querySelectorAll("input");

inputs.forEach(function(input) {
  if (input.hasAttribute("required")) {
    input.oninvalid = function() {
      this.setCustomValidity("{% trans 'Please fill in this field' %}");
    }
  });
});

jQuery:

$("input[required]").on("invalid", function() {
    this.setCustomValidity("{% trans 'Please fill in this field' %}");
});

Если это решение не работает для вашего конкретного случая использования, документы подробно описаныо различных альтернативах.

...