Ответ 1
1) используйте _() (или gettext()) в своем коде и шаблонах. Переведенные строки, заданные в глобальных глоссалах или определениях классов, должны использовать некоторую форму ленивого gettext(), потому что i18n не будет доступен при импорте модулей.
2) Извлеките все переводы с помощью pybabel. Здесь мы передаем две каталоги для сканирования: каталог шаблонов и каталог приложения. Это создаст файл messages.pot в каталоге /locale со всеми строками, найденными в этих каталогах. babel.cfg - это конфигурация извлечения, которая зависит от используемого вами механизма шаблона:
$ pybabel extract -F ./babel.cfg -o ./locale/messages.pot ./templates/ ./app/
3) Инициализировать каталог для каждого языка. Это делается только один раз. Здесь мы инициализируем три перевода: en_US, es_ES и pt_BR и используем файл messages.pot, созданный на шаге 2:
$ pybabel init -l en_US -d ./locale -i ./locale/messages.pot
$ pybabel init -l es_ES -d ./locale -i ./locale/messages.pot
$ pybabel init -l pt_BR -d ./locale -i ./locale/messages.pot
Переведите сообщения. Они будут в .mo файлах в каждом каталоге переводов. После того, как все локали переведены, скомпилируйте их:
$ pybabel compile -f -d ./locale
Позже, если новые переводы будут добавлены, повторите шаг 2 и обновите их, используя новый .pot файл:
$ pybabel update -l pt_BR -d ./locale/ -i ./locale/messages.pot
Затем переведите новые строки и снова скомпилируйте переводы.
4) Стратегия здесь может быть разной. Для каждого запроса вы должны установить правильные переводы, которые будут использоваться, и, возможно, захотите кэшировать загруженные переводы для повторного использования в последующих запросах.