Различия между версиями 8 и 9
Версия 8 от 2023-04-24 16:17:26
Размер: 8024
Редактор: hbd
Комментарий:
Версия 9 от 2023-05-30 13:32:31
Размер: 8109
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 44: Строка 44:
'''TODO''' переключение локалей в рантайме (для Д/З)

04.10 Интернационализация и локализация

  • Ещё раз, кротко:
    • Процесс
      1. i18n — обмазывание gettext-ом

      2. l10n — перевод и иже с ним

    • Инструменты
      • locale — работа с локалью

      • gettext — собственно подстановка перевода

      • ßαъεl — инструменты подготовки перевода

        • Весть остальной babel — ещё что-то
        • буковки бывают и более забавные: ɓиʚоʞ

Чтоб смотреть в окошке вид,
Подцепи себе...
      (ɓиʚоʞ)
  • Пример на подглядеть: GradeProject2021

  • Поставить: babel достаточно
  • {i} Счётчик введенных слов:

    • напишите программу, которая в цикле:
      • получает со стандартного ввода строку
      • подсчитывает количество слов в ней (слова разделены пробелами, достаточно использовать split())

      • выводит текст: "Entered <N> word(s)", где <N> - количество слов

    • {i} Контрольная точка: никаких i18n пока

  • {i} l18n

    • обмазывание _() и gettext.translation()

      • {i} проверить, что работает

  • {OK} Первичный перевод

    • Создать шаблон перевода
    • Создать пустой русский перевод-исходник
    • Перевести ("Введено <N> слов")

      • Обратите внимание на то, что строку "Entered {N} word(s)" перевести очень сложно, надо пользоваться "Entered {N} word(s)".format(N=N), например

    • Скомпилировать перевод
    • {i} проверить, что работает

  • Множественные формы и обновление перевода (чтобы было "1 слово", "2 слова", ..., "5 слов", ..., "14 слов", ... - по правилам русского языка):
    • добавить ngettext()

    • {i} проверить, что ngettext() работает (пока без перевода)

    • обновить шаблон
    • обновить старый перевод на основе нового шаблона
    • пронаблюдать «,fuzzy»

    • {i} скомпилировать, проверить, что перевод "отвалился"

    • доперевести, убрать ,fuzzy, скомпилировать

    • {i} проверить, что всё работает в двух локалях (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 этому клиенту выдаются русифицированные сообщения)

LecturesCMC/PythonDevelopment2023/Prac/09_I18n (последним исправлял пользователь FrBrGeorge 2023-05-30 13:32:31)