Вынесенная в заголовок задача не столь уж редко встает перед джумловодами. То свой текст нужно добавить, то изменить корявый или неинформативный (и зачастую еще - изобилующий ошибками) текст, составленный разрабами сторонних расширений. В Менеджере языков административного раздела сайта имеется достаточно вразумительный интерфейс для переопределения констант (Решение 2), и им, в принципе, можно бы и ограничиться. Но если вам, как и мне, интересно разобраться досконально в языковой структуре Joomla, то эта статья для вас.

В статье о замене устаревшей капчи компонента JComments на reCAPTCHA v2 (NO CAPTCHA) от Google описаны изменения в коде компонента. При этом, поскольку ввод новой капчи не требует вводить буквенно-цифровой код с картинки, потребовалось также заменить сообщение об ошибке. Оригинальное сообщение для русского языка загружалось из языкового файла компонента посредством константы:

ERROR_CAPTCHA="Пожалуйста, введите код изображенный на картинке!"

Новый текст, в полном соответствии с гугловским, должен быть таким: "Пожалуйста, подтвердите, что вы не робот!".

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

Решение 1. На уровне шаблона

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

В Joomla 1.5 языковые файлы шаблона (как, впрочем, и всех прочих расширений) при установке копировались в подпапки системных папок language - для сайта и administrator/language - для админки. Начиная с версии 1.6 появилась возможность использовать файлы языков напрямую из папки расширения. При этом для обратной совместимости разработчиками Джумлы была сохранена поддержка файлов из системных папок. Движок проверяет, имеется ли соответствующий файл в папке

[корень сайта](/administrator)/language/[тег языка],

и в случае наличия загружает его. Если же он там файлов не находит, то проверяет языковую папку расширения. Для шаблона это будет фолдер:

[корень сайта]/templates/[имя активного шаблона](/administrator)/language/[тег языка],

а стандартный формат имени самого файла -

[тег языка].[тип расширения]_[имя расширения](.sys).ini

Тег языка - полное пятисимвольное название языка (en-GB для британского английского, ru-RU для русского и т.д.).

Вернемся к нашей качпе. Рассматривать будем случай: язык - русский, часть сайта - пользовательская, имя шаблона - my_template. Префикс [тип расширения] для шаблонов - tpl. Путь к поддиректории языка в системной папке будет таким:

[корень сайта]/language/ru-RU,

а к таковой в директории шаблона -

[корень сайта]/templates/my_template/language/ru-RU.

Имена файлов будут одинаковыми:

ru-RU.tpl_my_template.ini.

Если ваш шаблон при установке скопировал языковый файл из своей языковой папки в системную, работайте с файлом в системной папке. Если же вы его там не нашли - редактируйте, соответственно, файл в папке самого шаблона.

Давайте попробуем добавить константу ERROR_CAPTCHA:

ERROR_CAPTCHA="Пожалуйста, подтвердите, что вы не робот!"

Сохраним языковый файл, протестируем и обнаружим, что текст сообщения не изменился. Это свидетельствует о том, что константа была загружена компонентом JComments раньше, чем шаблоном. Соответственно, на уровне шаблона нет возможности переопределить значение константы, заданное в языковом файле другого расширения. (Для JСomments это файл ru-RU.com_jcomments.ini).

Если же в коде JComments заменить имя константы с ERROR_CAPTCHA на новое - ERROR_RECAPTCHA_V2, а в языковом файле шаблона добавить строку:

ERROR_RECAPTCHA_V2="Пожалуйста, подтвердите, что вы не робот!"

..., то сообщение поменяется на требуемое.

Вывод. На уровне шаблона можно лишь добавлять свои языковые константы. Переопределять те, которые уже заданы в языковых файлах других расширений, не позволяет движок. Метод имеет весьма ограниченное применение: его целесообразно использовать в случае, когда сайт использует больше одного шаблона, а некая константа в каждом из шаблонов должна иметь разные значения. При этом рассмотреть этот вариант мне показалось полезным для полного понимания механизма подключения языковых файлов и загрузки языковых констант.

Решение 2. На уровне всего сайта 

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

  1. В админке открываем Расширения | Extensions - Менеджер языков | Language(s) - Переопределение констант | Overrides:

    Joomla: как добавить свои языковые константы или переопределить существующие - 1

    Попадаем в соответствующий раздел:

    Joomla: как добавить свои языковые константы или переопределить существующие - 2

    У меня, как видите, уже имеется пара переопределенных констант. Добавим в список еще одну.

  2. Поскольку мы работаем с русским языком и пользовательской частью сайта, значение Russian - Сайт поля Фильтр | Filter нам подходит по умолчанию. Жмем кнопку Создать | New. Попадаем на страницу Переопределение языковой константы | Edit Override.
  3. Разработчики Джумлы предоставили нам возможность проверить, существует ли константа в одном или нескольких языковых файлах. Поиск можно проводить как по имени константы, так и по ее значению.

    Введем в поле поиска имя константы ERROR_CAPTCHA. В выпадающем списке Искать | Search For выберем опцию Константа | Constant. Кликнем на кнопку Найти | Search. Получим результаты поиска:

    Joomla: как добавить свои языковые константы или переопределить существующие - 3

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

    Joomla: как добавить свои языковые константы или переопределить существующие - 4

    Joomla: как добавить свои языковые константы или переопределить существующие - 5

    Итак, константу ERROR_CAPTCHA используют два компонента: AcyMailing и JComments. Переопределение существующей константы изменит ее значение для обоих компонентов. В случае с капчей можно на это пойти, поскольку сообщение "Пожалуйста, подтвердите, что вы не робот!" универсально для любого типа капчи. Но наша исходная цель - изменить текст сообщения только для JComments, не затронув прочие существующие расширения. Возможно также, что в будущем вы установите и другие расширения, использующие то же имя. Введение собственной константы снижает риск неконтролируемых побочных эффектов. Конечно, у медали есть и обратная сторона: приходится вносить изменения в код расширения и сохранять их при обновлениях версий.

    Тот факт, что внедрение reCAPTCHA v2 (NO CAPTCHA) в JComments по-любому сопровождается кастомизацией кода компонента, явился для меня решающим аргументом в пользу добавления новой константы - ERROR_RECAPTCHA_V2. Последующие действия как раз иллюстрируют этот процесс.

  5. Можно кликнуть по одной из существующих констант в списке результатов поиска. Как написано в голубенькой справке, поля Языковая константа | Language Constant и Текст | Text автоматически заполнятся именем и значением константы, после чего можно отредактировать содержимое обоих полей. Либо же просто введем имя и значение в пустые поля. Результат в любом случае будет таким:

    Joomla: как добавить свои языковые константы или переопределить существующие - 6

  6. Сохраняем. Константа добавлена. Можно протестировать и убедиться, что сообщение теперь выглядит как надо.

Но мы ведь ребята продвинутые и на этом не останавливаемся. Нам интересно, куда физически добавились наша константа и ее значение. В том же окне внизу слева имеется поле Файл | File. При наведении курсора на заголовок нам дают понять, что:

Joomla: как добавить свои языковые константы или переопределить существующие - 7

Однако содержимое поля не редактируется, а значение не помещается в статический прямоугольник элемента ввода текста. Но если кликнуть на нем мышью и нажать сочетание клавиш Ctrl+A, а затем Ctrl+C, содержимое поля скопируeтся в буфер обмена. Вставив его в любой текстовый документ, можно увидеть всю строку и убедиться, что введенная нами информация сохранилась в файле

[корень сайта]/language/overrides/ru-RU.override.ini.

Найдя этот файл и открыв его на редактирование, можно увидеть, что он содержит все добавленные или переопределенные константы:

ERROR_RECAPTCHA_V2="Пожалуйста, подтвердите, что вы не робот!"
COM_CONTENT_REGISTER_TO_READ_MORE="Зарегистрируйтесь, чтобы прочесть полностью..."
COM_CONTENT_READ_MORE_TITLE="Читать полностью..."

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

Таким образом, мы выяснили, что существует ручной способ для осуществления цели, вынесенной в заголовок статьи. Для файлов русского языка административного раздела - всё то же самое, только путь к файлу был бы:

[корень сайта]/administrator/language/overrides/ru-RU.override.ini.

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

[корень сайта](/administrator)/overrides/language/[тег языка].override.ini

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

Подытожим

Надеюсь, все эти многабукафф помогли вам разобраться в языковом механизме нашей любимой CMS. Позвольте напоследок вычленить основной принцип этого механизма. Он заключается в последовательности подключения языковых файлов движком Джумлы, и эта последовательность такова:

  1. Файлы в папках overrides;
  2. Файлы расширений из системных языковых папок;
  3. Файлы расширений из языковых папок самих расширений;
  4. Файлы активного шаблона из системных языковых папок;
  5. Файлы активного шаблона из языковых папок самого шаблона.

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

Главный же практический вывод: не следует редактировать языковые файлы расширений. Переопределяйте их константы (или вводите свои) в соответствии с описанными здесь методиками.

Добавить комментарий