Функция override
Функция override из модуля django.utils.translation
позволяет временно установить другой язык для выполнения
определенного участка кода. Она особенно полезна при
тестировании многоязычных приложений или при необходимости
выполнить операции на конкретном языке, не изменяя глобальный
язык сессии. Функция принимает код языка в качестве аргумента
и возвращает контекстный менеджер, который автоматически
восстанавливает исходный язык после выхода из блока.
Синтаксис
from django.utils.translation import override
with override(language_code):
# Код, выполняемый с временным языком
pass
Параметры
Функция override принимает следующие параметры:
-
language_code- строка с кодом языка (например,'en','ru','fr') -
deactivate- логический флаг, указывающий, нужно ли деактивировать текущий язык перед установкой нового (по умолчаниюFalse)
Пример . Использование с переводом строк
Давайте временно установим русский язык для перевода строки:
from django.utils.translation import gettext as _, override
# Текущий язык - английский
print(_("Hello, world!"))
with override('ru'):
# Временный язык - русский
print(_("Hello, world!"))
# После выхода из блока язык восстановлен
print(_("Hello, world!"))
Результат выполнения кода:
"Hello, world!"
"Привет, мир!"
"Hello, world!"
Пример . Использование с несколькими языками
Давайте выполним последовательный перевод строки на разные языки:
from django.utils.translation import gettext as _, override
text = "Welcome to our website"
languages = ['en', 'ru', 'fr', 'de']
for lang in languages:
with override(lang):
print(f"{lang}: {_(text)}")
Результат выполнения кода:
"en: Welcome to our website"
"ru: Добро пожаловать на наш сайт"
"fr: Bienvenue sur notre site web"
"de: Willkommen auf unserer Website"
Пример . Использование в тестах
Функция override особенно полезна при тестировании
многоязычных представлений:
from django.test import TestCase
from django.utils.translation import override
from django.urls import reverse
class ArticleViewTest(TestCase):
def test_article_translation(self):
# Проверка английской версии
with override('en'):
response = self.client.get(reverse('article_detail', args=[1]))
self.assertContains(response, "Article")
# Проверка русской версии
with override('ru'):
response = self.client.get(reverse('article_detail', args=[1]))
self.assertContains(response, "Статья")
Пример . Использование внутри функции
Функцию override можно использовать внутри функций
для возврата данных на определенном языке:
from django.utils.translation import gettext as _, override
def get_welcome_message(language=None):
if language:
with override(language):
return _("Welcome!")
return _("Welcome!")
print(get_welcome_message('ru'))
print(get_welcome_message('fr'))
print(get_welcome_message())
Результат выполнения кода:
"Добро пожаловать!"
"Bienvenue!"
"Welcome!"
Смотрите также
-
функция
gettext,
которая выполняет перевод строки -
функция
gettext_lazy,
которая откладывает перевод до момента использования -
функция
ngettext,
которая обрабатывает перевод строк с учетом числа -
функция
activate,
которая устанавливает активный язык для текущего потока