Локализация gettext для тем дизайна

Михаил Ушенин

В версии 1.13 фреймворка Webasyst мы добавили возможность локализации тем дизайна с помощью механизма gettext. Этот способ локализации работает так же, как и для приложений, плагинов и виджетов.

Ознакомительная обновлённая версия фреймворка для разработчиков выгружена на GitHub в ветку dev.

Для чего это нужно

Локализация с использованием gexttext удобна тем, что с её помощью проще использовать слова во множественном числе. До внедрения поддержки gettext каждому разработчику приходилось писать в HTML-шаблонах своей темы дизайна дополнительный многословный код Smarty, который формировал множественное число.

Как использовать gettext в теме дизайна

Для этого добавьте в состав темы дизайна директорию с файлами локализации — так же, как для приложения, плагина или виджета.

Пример структуры директории с файлами локализации

  • wa-apps
    • shop
      • themes
        • default
          • locale
            • en_US
              • LC_MESSAGES
                • shop_themes_default.mo — скомпилированный файл локализации
                • shop_themes_default.po — исходный файл с ключами локализации и их переводами
            • ru_RU
              • LC_MESSAGES
                • shop_themes_default.mo
                • shop_themes_default.po

Как вызывать строки локализации в файлах HTML-шаблонов

Единственное число

[`My text`] — этот формат работает одинаково и для локализации через gettext, и для локализации из манифеста theme.xml.

Множественное число

{_wp('%d product', '%d products', $products|count)} — этот формат перевода строк локализации с использованием множественного числа начнёт работать после перевода темы дизайна на использование gettext и обновления фреймворка Webasyst до версии не ниже 1.13.

Автоматическая сборка ключей локализации для gettext

Для того чтобы быстро сформировать файлы локализации темы дизайна с ключами для перевода строк, выполните в консоли сервера команду wa.php locale с помощью строки вида

php wa.php locale app_id/themes/theme_id

Пример для темы default приложения shop:

php wa.php locale shop/themes/default

Эта команда добавит в файлы с расширением .po все ключи локализации темы дизайна, которых в этих файлах ещё нет. Если таких файлов в составе темы дизайна ещё нет, то команда создаст их автоматически.

Как перейти на локализацию темы дизайна через gettext

Это удобно сделать с помощью команды wa.php locale:

  1. Соберите все ключи локализации с помощью консольной команды.
  2. Перенесите переводы из манифеста theme.xml в файлы локализации с расширением .po. Файл для локали en_US можно оставить без изменений, потому что строки этой локали используются по умолчанию в качестве ключей локализации для всех остальных локалей.
  3. Удалите строки с локализацией из манифеста темы.
  4. С помощью приложения Poedit скомпилируйте из файлов локализации с расширением .po файлы с расширением .mo.
7 ноября 2019
  • Nichikov Eugen 11 ноября 2019 13:15

    Вот тут не опечатка?

    {_wp('%d product', '%d products', $products|count)}

  • Михаил Ушенин 13 ноября 2019 11:17

    Да, верно, исправили. Спасибо!

  • outcast 26 ноября 2019 15:22

    Правильно ли я понимаю что, чтобы полноценно перевести магазин на другой язык, кроме локализации темы дизайна, нужно еще локализовать приложение shop и сам фреймворк? Если с первыми двумя более-менее понятно, то как правильно добавить новый язык в Вебасист, чтоб не затерлось при обновлении?

  • Михаил Ушенин 26 ноября 2019 18:11

    Попробуйте использовать приложение «My Lang: Лайт».

  • Так и не смог завести перевод множественных строк.

    wa.php locale не создает запись в po файле для строки {_wp('%d product', '%d products', $products|count)}

    wa.php locale создаст запись в po файле для строки {_wp('%d test', '%d tests', $products|count)} вида:

    msgid "%d test"
    msgid_plural "%d tests"
    msgstr[0] "тест"
    msgstr[1] "теста"
    msgstr[2] "тестов"

    Работать это не будет. Во всяком случае у меня не работает. В документации по локализации указано без %d, но так тоже не работает.

    И наконец для строки {_wp('test', 'tests', $products|count)} будет работать перевод, но без множественного числа. 

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

  • Anton F 4 октября 2021 21:18

    @Алексей Александрович

    попробуйте через

    https://cloud.mail.ru/public/4...

    если не поможет, то просто посмотрите wa-system/webasyst/lib/cli/webasystLocale.cli.php

  • Михаил, мне удалось вывести множественный перевод только таким образом:

    {_wp('product', 'product', 3)}

    Похоже это была не опечатка. И %d подстановка не работает. 

  • Михаил Ушенин 5 октября 2021 10:14

    Похоже на ошибку. Передал разработчикам — посмотрим, в чём там дело. Спасибо за то, что сообщили!

  • Anton F 7 октября 2021 05:00

    множественная форма в темах

    {wa_t message="%d car" message2="%d cars" n=$cnt}

  • Так действительно работает. Спасибо за подсказку.

  • Anton F 7 октября 2021 22:12

    да и первый вариант тоже..

  • Алексей Александрович 18 октября 2021 23:16

    Тут еще интересный момент нашелся. При клонировании темы дизайна через админку, файлы po/mo не переименовываются. Соотв. локализация перестает работать. Переименовал вручную файлы, заработало.

    • site_themes_ahead.po -> site_themes_ahead_translate_test.po
    • site_themes_ahead.mo -> site_themes_ahead_translate_test.mo
  • Михаил Ушенин 19 октября 2021 10:02

    Передал информацию разработчикам. Спасибо!

  • Алексей Александрович 14 декабря 2021 11:09

    Хотелось бы узнать про подвижки в исправлении ошибки локализации? Приходится объяснять пользователям как это делать. А если они в облаке, то с переименованием возникают проблемы.

  • Михаил Ушенин 14 декабря 2021 14:06

    Работа ведётся. Если не помешают какие-то чрезвычайные обстоятельства, где-то в начале года, скорее всего, обновим фреймворк с этими исправлениями.

  • Михаил Ушенин 1 марта 2022 15:54
    Так и не смог завести перевод множественных строк.

    В последней опубликованной версии фреймворка этот механизм должен теперь работать правильно — проверьте, пожалуйста.

  • Добрый день. Так и не поправили ошибку с копированием файлов локализаций при клонировании темы дизайна...

  • Михаил Ушенин 26 апреля 2022 09:01

    В ближайшем обновлении эта ошибка будет устранена.

  • Сергей Правдин 12 сентября 2023 20:31

    Как правильно отредактировать файл?

    Я скал приложение Poedit открыл и откорректировал файл, сохранил его и в po и в mo, загружаю обратно на сервер, и ничего не меняется.

    Хочу откорректировать текущий перевод.

  • Михаил Ушенин 13 сентября 2023 10:17

    Очистите кеш в настройках Webasyst — возможно, поэтому у вас визуально ничего не изменилось.

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

Добавление новых комментариев к этой теме отключено.