Локализация аддонов Blender – через API

Классический способ локализации аддона Blender (перевода аддона на разные языки) удобен тем, что для него требуется всего лишь одно обращение к Blender python API – получение текущей используемой локали. Он хорош своей независимостью, однако Blender не был бы Blender-ом, если бы не предоставил пользователям возможность локализации аддонов через свой API.

Принцип создания мультиязычных аддонов с использованием Blender python API по сути мало отличается от классического. Нам точно так же необходимо создать словарь со всеми вариантами перевода текстовых строк, используемых в нашем аддоне, и в дальнейшем пользоваться им для перевода.

Для разбора на практике возьмем все тот же код простейшего аддона.

И сделаем для него локализацию с использованием Blender python API.

Для начала создадим словарь со всеми вариантами перевода текстовых строк, используемых в аддоне.

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

В качестве первого ключа здесь необходимо использовать текстовое обозначение локали. Обратите внимание, что указывать отдельно вариант перевода на английский язык (локаль по умолчанию) нет необходимости.

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

Первый элемент – контекст использования данного перевода. Он указывается, если одно понятие имеет различные переводы в зависимости от того, где оно используется. Например, одно и то же название, если оно используется как имя оператора может иметь один перевод, и совершенно другой, если оно используется, например в нодах шейдеров. Если перевод не зависит от контекста, в качестве значения нужно указывать “*”.

Второй элемент – собственно исходная текстовая строка на языке по умолчанию (обычно на английском). Именно эту строку и именно на этом языке вы должны будете использовать в дальнейшем в коде вашего аддона.

Значением элемента словаря, описанного таким составным ключом, будет перевод строки текста на язык указанной в верхнем ключе локали.

Например так будет выглядеть словарь переводов для одной текстовой строки “Test text in Blender UI” на испанский и японский языки:

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

Однако API Blender избавляет нас от необходимости дальнейшего обращения к словарю переводов напрямую.

Для того, чтобы API Blender получил доступ к предоставленному нами словарю и мог им пользоваться для переводов, наш словарь необходимо просто зарегистрировать в API.

Для этого внутри функции “register”, там где регистрируются все классы нашего аддона, необходимо добавить регистрацию словаря при помощи следующей команды:

где “langs” – имя созданного нами словаря переводов.

Для корректной работы API словарь так же необходимо разрегистрировать по окончании работы аддона в функции “unregister”:

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

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

Однако для вызовов в коде, например в функции “print”, или для перевода строк с форматированием, как и в классической локализации, нужно присваивание текстовой константы в коде заменить на вызов специальной функции API – “pgettext”.

Например указание строки внутри функции “print”:

нужно заменить на вызов функции:

Добавим для каждой текстовой строки нашего аддона переводы в словарь, сделанный в соответствии с требованиями API:

Также поменяем код присваивания текстовых строк на вызов функции, только там, где это необходимо.

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

Финальный код:

В отличие от рассмотренного ранее классического метода локализации, данный метод имеет более жесткие требования к организации словаря переводов и больше обращений к API, однако он удобнее тем, что не везде для перевода нужно явно вызывать специальную функцию, а весь интерфейс теперь переводится “на лету”, включая названия операторов и заголовки панелей.

Исходные файлы для этого урока доступны на Patreon.

0 0 голоса
Article Rating
Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии