Есть в Virtuemart некоторые мелкие, но неприятные проблемы, которые кочуют из года в год, из версии в версию.
Это именно проблемы, не ошибки. Связаны они в первую очередь с особенностями языков и принципов работы интернет-магазинов в разных странах.
Сегодня рассмотрим быстрое решение такой проблемы, как непонятные для русского человека заголовки писем, которые Virtuemart отправляет продавцу и покупателю при оформлении заказа и смене его статуса. Этот кейс, на сегодняшний день, приходится применять при каждой чистой установке Virtuemart.
Быстрое решение далее.
Содержание
Проблема, и почему она не баг?
Проблема с заголовками – не баг, а неизменно кривой перевод на русский язык, который переходит от версии к версии.
Все заголовки писем хранятся в языковых константах Virtuemart (если вы не знаете, что такое языковые константы, советую, для начала, прочитать эту статью ).
Фактически, языковая константа – это переменная, в которую для разных языков записываются разные переводы. Давайте посмотрим, как выглядят константы заголовков писем в Virtuemart на английском:
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_C="[%3$s], Confirmed order at %1$s, total %2$s"
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_D="[%3$s], Denied order at %1$s, total %2$s"
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_F="[%3$s], Completed order at %1$s, total %2$s"
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_P="[%3$s], Order is pending at %1$s, total %2$s"
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_R="[%3$s], Refunded order by %1$s, total %2$s"
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_S="[%3$s], Shipped order from %1$s, total %2$s"
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_U="[%3$s], Order received by %1$s, total %2$s"
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_X="[%3$s], Cancelled order by %1$s, total %2$s"
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_C="[%3$s], Confirmed order by %1$s, total %2$s"
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_D="[%3$s], Denied order by %1$s, total %2$s"
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_F="[%3$s], Completed order by %1$s, total %2$s"
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_P="[%3$s], Pending order by %1$s, total %2$s"
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_R="[%3$s], Refunded order for %1$s, total %2$s"
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_S="[%3$s], Shipped order for %1$s, total %2$s"
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_U="[%3$s], Order placed by %1$s, total %2$s"
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_X="[%3$s], Cancelled order for %1$s, total %2$s"
Здесь есть некоторые непонятные кусочки, начинающиеся со знака процента. Они означают подстановку значений из параметров заказа (фактически, это тоже переменные):
- %1$s – имя покупателя/название магазина
- %2$s – сумма заказа
- %3$s – номер заказа
Стоит признать, что даже в оригинальной английской версии, если подставить значения, заголовки получатся так себе… А теперь давайте посмотрим на перевод в локализации на русский:
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_C="[%3$s], подтвердил/а заказ в %1$s, на сумму %2$s"
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_D="[%3$s], Отказано в %1$s, всего %2$s"
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_F="[%3$s], Завершенный заказ %1$s, всего %2$s"
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_P="[%3$s], Заказ отложен до %1$s, всего %2$s"
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_R="[%3$s], Возвращены деньги за заказ, сделанный %1$s, всего %2$s"
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_S="[%3$s], Заказ отправлен из %1$s, всего %2$s"
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_U="[%3$s], Заказов получено от %1$s, всего %2$s"
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_X="[%3$s], Заказ отменил %1$s, всего %2$s"
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_C="[%3$s], Заказ подтвердил %1$s, сумма: %2$s"
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_D="[%3$s], Отказано упорядочить по %1$s, всего %2$s"
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_F="[%3$s], Заказ выполнен %1$s, сумма: %2$s"
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_P="[%3$s], Заказ отложил %1$s, всего %2$s"
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_R="[%3$s], Заказ возвращен для %1$s, всего %2$s"
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_S="[%3$s], Заказ отправлен для %1$s, всего %2$s"
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_U="[%3$s], Товаров размещено %1$s, всего %2$s"
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_X="[%3$s], Заказ отменен для %1$s, всего %2$s"
Выглядит это так, как будто локализатор не разобрался в том, что это вообще такое и просто перевел текст как через переводчик. В частном случае получается что-то вроде:
[34J93f], подтвердил/а заказ в НАЗВАНИЕ_МАГАЗИНА, на сумму 100р.
В общем, получается что-то не очень понятное для русского человека.
Решение
Для создания корректных заголовков нам нужно переопределить показанные выше языковые константы. Это можно сделать через админку, в разделе Менеджер языков -> Переопределение констант или напрямую в файлах. Поскольку констант много, то в файлах будет гораздо быстрее.
Открываем:
- /language/overrides/ru-RU.override.ini
- /administrator/language/overrides/ru-RU.override.ini
Если файлов не существует – создаем их (или достаточно добавить хотя бы одно переопределение через менеджер языков, чтобы файл создался самостоятельно).
В эти файлы добавляем (можно просто скопировать и вставить):
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_F = "%1$s. Заказ №%3$s на сумму %2$s завершен."
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_S = "%1$s. Заказ №%3$s на сумму %2$s отправлен."
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_R = "%1$s. Заказ №%3$s на сумму %2$s возвращен."
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_X = "%1$s. Заказ №%3$s на сумму %2$s отменен."
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_C = "%1$s. Заказ №%3$s на сумму %2$s подтвержден магазином."
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_U = "%1$s. Заказ №%3$s на сумму %2$s подтвержден покупателем."
COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_P = "%1$s. Заказ №%3$s на сумму %2$s ожидает оплаты."
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_F = "Заказ №[%3$s] на сумму %2$s завершен."
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_S = "Заказ №[%3$s] на сумму %2$s отправлен."
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_R = "Заказ №[%3$s] на сумму %2$s возвращен."
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_X = "Заказ №[%3$s] на сумму %2$s отменен."
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_C = "Заказ №[%3$s] на сумму %2$s подтвержден магазином."
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_U = "Заказ №[%3$s] на сумму %2$s подтвержден покупателем."
COM_VIRTUEMART_MAIL_SUBJ_VENDOR_P = "Заказ №[%3$s] на сумму %2$s ожидает оплаты."
Если все сделано правильно, то после добавления констант в файл, вы сможете увидеть их в админке, в разделе Менеджер языков -> Переопределение констант.
Почему мы добавляем константы два раза? Вообще, первый файл содержит переопределения констант фронтенда, а второй – админки. Но в Virtuemart все запутано. Часть из этих констант берется из первого файла, а часть из второго. Мне проще вставить переопределенные константы в оба файла, чем разбираться какую из них в какой файл вставлять. Проблем это не создаст, а время сэкономит.
Если все сделано правильно, письма теперь будут приходить примерно такие:
НАЗВАНИЕ_МАГАЗИНА . Заказ 34J93f на сумму 100р подтвержден магазином.
Если вдруг вам не нравится моя версия перевода, то можете подправить переопределенные константы под себя.
Добавление нового статуса заказа в Virtuemart
Рассмотрим еще один распространенный случай. Иногда требуется создать новые статусы заказов в Virtuemart, отличные от уже существующих.
Делается это в админке, в разделе Статусы заказов. Если вы добавляете новый статус, то должны будете задать ему букву латинского алфавита. Зачем это нужно? Как раз для того чтобы можно было создать для этого статуса новые уникальные заголовки писем.
По умолчанию для нового статуса заказа константы будут такими:
- COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_Z
- COM_VIRTUEMART_MAIL_SUBJ_VENDOR_Z
В этом примере Z – буква, выбранная для нового статуса. Если вы выбрали другую букву, то и константы будут именно с ней на конце.
Далее вы должны добавить значения для таких констант в указанные выше файлы переопределений. По тому же принципу. И только после этого заголовки писем с новыми статусами примут нормальный вид.
Заключение
Для чего вообще этот кейс? Чтобы не придумывать каждый раз нормальный перевод для заголовков писем, а просто зайти сюда и скопировать его.
Вы можете спросить – почему бы не отправить нормальный перевод в локализацию, чтобы он был включен в Virtuemart сразу после ее (локализации) установки?
Я пробовал подавать заявку на добавление в команду локализации Virtuemart – очень уж много в переводе попадается некорректных названий. Но заявка так и осталась заявкой – никто на нее не ответил. Потому и появился данный кейс =).
То что надо!