04.10 Интернационализация и локализация
- Ещё раз, кротко:
Чтоб смотреть в окошке вид, Подцепи себе... (ɓиʚоʞ)
Пример на подглядеть: GradeProject2021
- Поставить: babel достаточно
Счётчик введенных слов:
- напишите программу, которая в цикле:
- получает со стандартного ввода строку
подсчитывает количество слов в ней (слова разделены пробелами, достаточно использовать split())
выводит текст: "Entered <N> word(s)", где <N> - количество слов
Контрольная точка: никаких i18n пока
- напишите программу, которая в цикле:
l18n
обмазывание _() и gettext.translation()
проверить, что работает
Первичный перевод
- Создать шаблон перевода
- Создать пустой русский перевод-исходник
Перевести ("Введено <N> слов")
Обратите внимание на то, что строку "Entered {N} word(s)" перевести очень сложно, надо пользоваться "Entered {N} word(s)".format(N=N), например
- Скомпилировать перевод
проверить, что работает
- Множественные формы и обновление перевода (чтобы было "1 слово", "2 слова", ..., "5 слов", ..., "14 слов", ... - по правилам русского языка):
добавить ngettext()
проверить, что ngettext() работает (пока без перевода)
- обновить шаблон
- обновить старый перевод на основе нового шаблона
пронаблюдать «,fuzzy»
скомпилировать, проверить, что перевод "отвалился"
доперевести, убрать ,fuzzy, скомпилировать
проверить, что всё работает в двух локалях (ru, en)
TODO переключение локалей в рантайме (для Д/З)
Д/З
Задача_0. Доделать упражнения по русификации, т.к. они будут использоваться в упражнениях на занятии по автоматизации.
Задача_1. Локализация сообщений на стороне сервера.
- Почему на стороне сервера?
- на сервере формируются сообщения, включающие числовые значения и соответствующие им слова в множественном числе
- протокол от сервера к клиенту строится на сообщениях, НЕ ПОДЛЕЖАЩИХ интерпретации клиентом (т.е. они только выводятся клиентом в терминал), а значит числовые значения как отдельные параметры в нём передать невозможно
- поскольку вариантов множественного числа в русском языке больше, чем в английском, полноценная русификация множественного числа на клиенте БЕЗ ЗНАНИЯ числового значения тоже невозможна (нельзя просто взять и перевести "points" как "очков", потому что "два очка")
Скопировать решение Задачи_1 с предыдущего занятия. Сделать коммит. Работать на ветке work.
добавить в клиент поддержку команды locale <имя_локали> (просто распознавание и передача на сервер)
- добавить в сервер поддержку работы с локалями:
- запоминание, для каждого клиента В ОТДЕЛЬНОСТИ, заданной клиентом локали
поддержка через babel перевода сообщений для единственной (у нас учебная задача) локали ru_RU.UTF8
- отправка на клиент локализованных сообщений: если для установленной этим клиентом локали есть перевод, то отправляем переведенные сообщения, иначе - исходные сообщения: "Поскольку для каждого клиента отдельная корутина, локаль клиента — это просто переменная в ней. Надо просто не забывать каждый раз при отправки сообщеньки выставлять эту локаль" (с)
- большинство сообщений от сервера клиенту - широковещательные (т.е. ко всем клиентам), и каждому клиенту это сообщение нужно отправлять с учетом выставленной ЭТИМ клиентом локали.
- какие сообщения сервера нужно локализовывать:
реакция сервера на установку локали (сообщение только тому клиенту, который подал команду locale):
исходное: "Set up locale: <имя_локали>"
рус. локаль: "Установлена локаль: <имя_локали>"
- сообщения о знаковых событиях: атака на монстра, установка монстра, заход пользователя, прекращение сеанса пользователя
подробности о знаковых событиях см. https://uneex.ru/LecturesCMC/PythonDevelopment2023/Prac/06_SocialProject
- количество очков здоровья у монстра (имеющихся при установке, снятых при атаке, оставшихся после атаки) должно локализовываться с правильным применением множественного числа (1 очко / 2 очка / ... 5 очков / ... 21 очко и т.п.), то есть в файле локализации нужно задействовать формулу выбора множественного числа.
добавьте файлы локализации сервера в его модуль, проверьте что после установки модуля локализация "подхватывается" (при выставлении клиентом локали ru_RU.UTF8 этому клиенту выдаются русифицированные сообщения)