04.15 Интернационализация и локализация
- Ещё раз, кротко:
Чтоб смотреть в окошке вид, Подцепи себе... (ɓиʚоʞ)
Пример на подглядеть: GradeProject2021
_podir в этом проекте — это подкаталог пакета (вычисляется как путь/до/AppBase/po/); в упражнении надо делать проще — например, просто "po".
- Поставить: babel достаточно
Счётчик введенных слов:
- напишите программу, которая в цикле:
- получает со стандартного ввода строку
подсчитывает количество слов в ней (слова разделены пробелами, достаточно использовать split())
выводит текст: f"Entered {N} word(s)", где N - количество слов
Контрольная точка: никаких i18n пока
- напишите программу, которая в цикле:
l18n
обмазывание _() и gettext.translation()
проверить, что работает
Последовательность выполнения команд pybabel для создания и обновления перевода описана в лекции, раздел "Создание перевода".
Первичный перевод
- Создать шаблон перевода
- Создать пустой русский перевод-исходник
Перевести ("Введено <N> слов")
Обратите внимание на то, что строку f"Entered {N} word(s)" перевести очень сложно, а проще переводить "Entered {} word(s)".format(N), например
Переводить надо саму форматную строку, а не результат подстановки в неё - обращайте внимание на то, перед какими скобками в коде стоит "_"
- Скомпилировать перевод
проверить, что работает
- Множественные формы и обновление перевода (чтобы было "1 слово", "2 слова", ..., "5 слов", ..., "14 слов", ... - по правилам русского языка):
добавить ngettext()
проверить, что ngettext() работает (пока без перевода)
- обновить шаблон
- обновить старый перевод на основе нового шаблона
пронаблюдать «,fuzzy»
скомпилировать, проверить, что перевод "отвалился"
доперевести, убрать ,fuzzy, скомпилировать
проверить, что всё работает в двух локалях (ru, en)
Переключение локалей в рантайме (для Д/З)
Д/З
Задача_0. Доделать упражнения по русификации, т.к. они будут использоваться в упражнениях на занятии по автоматизации.
Задача_1. Реализовать для MUD-а поддержку команды включения/выключения режима бродячих монстров
Скопировать решение Задачи_1 с предыдущего занятия. Сделать коммит. Работать на ветке work.
- реализовать команду:
- формат: "movemonsters on" / "movemonsters off" (включить / выключить режим бродячих монстров)
состояние сервера по умолчанию: режим бродячих монстров включен
- сообщение от сервера в ответ на команду: "Moving monsters: on" / "Moving monsters: off"
выключение режима Б.М. нужно для автоматического тестирования через скрипты. Сложно тестировать атаку на монстра, если нет уверенности, что он всё ещё там, куда его поставили...
Задача_2. Локализация сообщений на стороне сервера.
- Почему на стороне сервера?
- на сервере формируются сообщения, включающие числовые значения и соответствующие им слова в множественном числе
протокол от сервера к клиенту строится на сообщениях, не подлежащих интерпретации клиентом (т.е. они только выводятся клиентом в терминал), а значит числовые значения как отдельные параметры в нём передать невозможно
поскольку вариантов множественного числа в русском языке больше, чем в английском, полноценная русификация множественного числа на клиенте без знания числового значения тоже невозможна (нельзя просто взять и перевести "points" как "очков", потому что "два очка")
Скопировать решение Задачи_1. Сделать коммит. Работать на ветке work.
добавить в клиент поддержку команды locale <имя_локали> (просто распознавание и передача на сервер)
- добавить в сервер поддержку работы с локалями:
запоминание, для каждого клиента в отдельности, заданной клиентом локали
поддержка через babel перевода сообщений для единственной (у нас учебная задача) локали ru_RU.UTF8
- отправка на клиент локализованных сообщений: если для установленной этим клиентом локали есть перевод, то отправляем переведенные сообщения, иначе - исходные сообщения: "Поскольку для каждого клиента отдельная корутина, локаль клиента — это просто переменная в ней. Надо просто не забывать каждый раз при отправки сообщеньки выставлять эту локаль" (с)
большинство сообщений от сервера клиенту - широковещательные (т.е. ко всем клиентам), и каждому клиенту это сообщение нужно отправлять с учетом выставленной этим клиентом локали.
- какие сообщения сервера нужно локализовывать:
реакция сервера на установку локали (сообщение только тому клиенту, который подал команду locale):
исходное: "Set up locale: <имя_локали>"
рус. локаль: "Установлена локаль: <имя_локали>"
- сообщения о знаковых событиях: атака на монстра, установка монстра, заход пользователя, прекращение сеанса пользователя
подробности о знаковых событиях см. ../06_SocialProject
- количество очков здоровья у монстра (имеющихся при установке, снятых при атаке, оставшихся после атаки) должно локализовываться с правильным применением множественного числа (1 очко / 2 очка / ... 5 очков / ... 21 очко и т.п.), то есть в файле локализации нужно задействовать формулу выбора множественного числа.
добавьте файлы локализации сервера в его модуль, проверьте что после установки модуля локализация "подхватывается" (при выставлении клиентом локали ru_RU.UTF8 этому клиенту выдаются русифицированные сообщения)