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/