Удобно использовать язык программирования с динамической системой типов. Но удобство имеет свою цену. Поскольку нет компилятора для обнаружения опечаток и других тривиальных ошибок, большие программы, написанные на динамических языках, таких как Python, часто страдают от ошибок, которых можно легко избежать, используя строгую систему типов. Чтобы избежать этих проблем, мы используем подсказки типов Python, mypy, Pylint и другие инструменты. Этот инструмент выявляет большинство опечаток и других ошибок программирования. Однако опечатки в ключах перевода не будут обнаружены.

Перевести все тексты

Для python gettext кажется популярным выбором при выполнении переводов. gettext — отличный выбор при работе с большим количеством переведенного текста. Однако, поскольку у нас не так много текста в нашей маленькой видеоигре reaktron, мы решили использовать там легковесную библиотеку под названием python-i18n. Как и большинство решений i18n, он работает, указав пару ключ-значение в файле, который сопоставляет ключи перевода с переводами:

{
...
 “quit”: “Terminar”,
...
}

Всякий раз, когда текст должен быть загружен в программу, указывается ключ перевода, и библиотека загружает правильный перевод для текущего языка:

i18n.t("ui.quit")

Опечатки забей

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

Пользовательские проверки Pylint

К счастью, Pylint можно легко расширить с помощью пользовательских проверок. Вот проверка на наличие опечаток в ключах перевода:

https://gist.github.com/krinnewitz/8d4581ca32989e20771c300ab07d88f1

Эту проверку можно загрузить, добавив load-plugins=checks.i18n_check в файл .pylintrc, если файл i18n_check.py находится в папке с именем checks. Если эта проверка используется, Pylint проверит все вхождения i18n.t("my.translationskey") и покажет предупреждение, если ключ перевода не существует.