Streamlit + Gettext + Localazy

Я создал приложение Streamlit для своей недавней статьи о мониторинге ключевых слов. Он используется для поиска по ключевым словам в Google и весьма полезен. Поскольку результаты поиска и темы SEO в целом зависят от местоположения, я подумал, что было бы полезно перевести интерфейс приложения на несколько языков.

Теоретически сделать версию на другом языке не составляет труда. В конце концов, достаточно перевести отдельные надписи и описания на другой язык и сопоставить их с помощью словаря.

На практике этот простой подход требует много времени и подвержен ошибкам. Однозначно лучше не изобретать велосипед и использовать уже известные решения. Один из них - Gettext - универсальный набор инструментов для создания многоязычных сообщений.

Из этой статьи вы узнаете, как переводить приложение Streamlit с помощью Gettext и Localazy.

«🔔 Хотите больше подобных статей? Подпишите здесь."

Старт проекта

Https://github.com/fischerbach/streamlit-gettext

Репозиторий кода прилагается к этой статье. Отдельные шаги разделены на последовательные ветви. Файл README.md содержит инструкции по настройке и запуску панели управления.

Результат должен быть таким:

После предоставления ключа API:

Возможно, мы могли бы переводить сообщения на другие языки и использовать операторы if, чтобы изменять их по желанию пользователя, но такой подход был бы утомительным и подверженным ошибкам. Поэтому сначала мы извлечем все строки из кода, чтобы работать с ними отдельно от бизнес-логики.

Gettext

GNU gettext - это универсальный набор инструментов для создания многоязычных сообщений. Он предоставляет основу для поддержки переведенных строк сообщений. Он поддерживает множество языков программирования 😉, включая Python. Модуль gettext поставляется со стандартной библиотекой Python. Лучшее в gettext - это то, что он помогает нам легко извлекать текстовые сообщения в отдельные файлы.

Мы подготовим английскую, польскую и немецкую языковые версии. Во-первых, нам нужно подготовить структуру каталогов.

mkdir -p locales/{de,pl}/LC_MESSAGES

Затем мы должны извлечь сообщения из кода.

/Library/Frameworks/Python.framework/Versions/3.8/share/doc/python3.8/examples/Tools/i18n/pygettext.py -d base -o locales/base.pot dashboard.py

Чтобы найти файл pygettext.py, вы можете использовать команду: locate pygettext.py.

Это создаст в папке locales файл base.pot со строками, взятыми из файла dashboard.py.

К сожалению, сгенерированный base.pot не содержит строк. Чтобы исправить это, нам нужно изменить dashboard.py, пометив сообщения для перевода.

После повторной генерации base.pot в нем появляются строки.

branch: step1

Первые переводы

А теперь подготовим первые переводы. Скопируйте и переименуйте base.pot в каждую языковую папку:

cp locales/base.pot locales/de/LC_MESSAGES/base.po
cp locales/base.pot locales/pl/LC_MESSAGES/base.po

Давайте изменим отдельные языковые файлы:

Чтобы использовать перевод в нашей программе, нам нужно сгенерировать файлы MO. Файлы MO - это файлы двоичных данных, которые анализируются модулем Python gettext и используются в программе.

msgfmt -o locales/de/LC_MESSAGES/base.mo locales/de/LC_MESSAGES/base
msgfmt -o locales/pl/LC_MESSAGES/base.mo locales/pl/LC_MESSAGES/base

Теперь мы можем изменить файл dashboard.py для отображения отчетов на разных языках.

В начале файла добавьте:

С этого момента пользователь может выбрать язык из раскрывающегося списка. Интерфейс обновит каждую метку, обрабатываемую функцией _():

Две метки в приложении есть. перевел, пришло время для отдыха. Порядок такой же. Каждый раз, когда в исходном коде появляется строка с сообщением, окружайте ее функцией _(‘This is a string’). Как только это будет сделано, сгенерируйте файл POT с самого начала, скопируйте его в локали каждого языка, переведите его и сгенерируйте двоичные файлы.

branch: step2

Управление переводом

Итак, в следующей итерации нашего решения мы добавим на панель управления функции, которые генерируют файлы POT и MO. Здесь все изменения:

Localazy

Localazy - отличная программа, которая делает обычно ужасный перевод сносным и даже почти приятным. Он поддерживает множество фреймворков и форматов файлов и предоставляет инструменты CLI для автоматизации сборки. Мои любимые функции - это возможность совместного перевода и автоматическое управление изменениями в переведенных файлах.

Итак, давайте объединим наш отчет с Localazy. Сначала создайте учетную запись Localazy и установите Localazy CLI. Затем создайте новое приложение.

Затем выберите файлы POT из доступных форматов файлов.

Вы увидите файл конфигурации шаблона localazy.json. Скопируйте его в основную папку проекта.

Не забудьте изменить путь к папке locales. Зайдите в свое приложение на Localazy и добавьте несколько новых языков.

Теперь вы можете снова сгенерировать файлы PO и загрузить их в Localazy:

localazy upload

Через некоторое время вы увидите список фраз для перевода на каждый язык вашего приложения.

И самое главное, что каждая фраза сопровождается машинным переводом.

После того, как все переводы будут приняты или созданы, вы можете загрузить их в свое приложение и повторно сгенерировать двоичные файлы MO.

К сожалению, для загрузки изменений в приложение Streamlit необходимо выполнить сброс экземпляра. Если мне удастся устранить это неудобство, я обновлю статью.

Конечный эффект:

branch: step3

проблема с f-строками

В проекте довольно широко используются ф-струны. К сожалению, мы не можем использовать их в качестве аргументов функции _(), gettext вернет ошибку. Как решить эту проблему я описываю в предыдущей статье:

Https://netlabe.com/how-to-create-automatic-data-report-in-multiple-languages-2a53b6417d42

Выводы

Как видите, дуэт Gettext и Localazy - это гибкое решение проблем локализации. Каждый обращается к разным источникам нагрузки и прекрасно дополняет друг друга.

Лучшее в сочетании Gettext и Localazy заключается в том, что если мы создаем новые файлы POT (и, таким образом, теряем ранее переведенные части), Localazy позаботится о их повторном переводе, чтобы не повторять работу без надобности.

использованная литература

GNU Gettext:
https://www.gnu.org/software/gettext/

Localazy:
https://localazy.com/

Streamlit:
https://streamlit.io/