04.14 Интернационализация и локализация
- Ещё раз, кротко:
 
Чтоб смотреть в окошке вид,
Подцепи себе...
      (ɓиʚоʞ)Пример на подглядеть: 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-а поддержку команды включения/выключения режима бродячих монстров 
Скопировать решение Задачи_2 с предыдущего занятия. Сделать коммит. Работать на ветке 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 этому клиенту выдаются русифицированные сообщения)
