005 Управление языками при создании компонента в Joomla 4.x
Предыдущая статья: Добавление типа меню для фронтенда в компоненте Joomla 4.
- Основы создания мультиязычного компонента в Joomla 4
- Содержимое файлов компонента для Joomla 4.x
- Тестирование компонента в Joomla 4 в режиме мультиязычности
Основы создания мультиязычного компонента в Joomla 4
В этой статье мы добавим управление языковыми строками в наш новый компонент. Возможно, вы заметили в последней статье, что, когда мы добавили ссылку меню к компоненту, мы жестко прописали английские слова в ссылку:
<?xml version="1.0" encoding="utf-8"?>
<metadata>
<layout title="Hello World!">
<message><![CDATA[My first Joomla! page]]></message>
</layout>
</metadata>
Это хорошо в качестве начального теста, но жестко привязывать один язык в систему управления контентом сайта - плохая идея. Прежде чем мы зайдем слишком далеко в создании страниц и форм, мы должны добавить в наш компонент поддержку нескольких языков.
Даже если у вас лично нет ресурсов для самостоятельного выполнения переводов, мы настоятельно рекомендуем вам внимательно относиться к правильному управлению языковыми строками внутри компонента. Даже, если изначально компонент рассчитан для работы только на одном языке! Компоненты с открытым исходным кодом могут быть переведены членами сообщества, а конечные пользователи могут создавать свои собственные, если они того пожелают. Таким образом, внедрение поддержки нескольких языков может послужить очень хорошую службу, как в развитии самого компонента, так и в его распространении.
Давайте создадим языковые файлы и обновим манифест, чтобы ссылаться на них:
- Новый файл:
admin/language/en-GB/en-GB.com_helloworld.ini- Файл с языковыми константами компонента для панели администратора
- Новый файл:
admin/language/en-GB/en-GB.com_helloworld.sys.ini- Файл с языковыми константами компонента с переводом сообщений в системе
- Новый файл:
site/language/en-GB/en-GB.com_helloworld.ini- Файл с языковыми константами компонента для фронтенда (сайта)
- Обновления:
helloworld.xml- Необходимо добавить языковые файлы в манифест компонента
- Обновления:
admin/tmpl/hello/default.php- Замена жестко прописанных строк на языковые константы
- Обновления:
site/tmpl/hello/default.php- Замена жестко прописанных строк на языковые константы
- Обновления:
site/tmpl/hello/default.xml
- Замена жестко прописанных строк на языковые константы
Содержимое файлов компонента для Joomla 4.x
admin/language/en-GB/en-GB.com_helloworld.ini
Этот файл содержит языковые строки, используемые на страницах компонента в панели администратора Joomla 4.
; Hello World Admin Strings ; Copyright (C) 2021 John Smith. All rights reserved. COM_HELLOWORLD_MSG_HELLO_WORLD="Hello World!"
admin/language/en-GB/en-GB.com_helloworld.sys.ini
Этот файл содержит языковые строки, используемые в системе Joomla 4 за пределами собственных страниц компонента. Например, строки нашего пункта меню принадлежат этому компоненту, но используются Joomla в меню системы админки, а не на наших собственных страницах, поэтому они должны быть прописаны в этом файле.
; Hello World Sys.ini ; Copyright (C) 2020 John Smith. All rights reserved. COM_HELLOWORLD_MENU_HELLO_WORLD_TITLE="Hello World!" COM_HELLOWORLD_MENU_HELLO_WORLD_DESC="My first Joomla! page"
site/language/en-GB/en-GB.com_helloworld.ini
Этот файл содержит языковые строки, используемые на "общедоступных" страницах компонента (страницах на сайте (фронтенде)). Следует отметить несколько вещей, которые являются общими для всех языковых файлов, которые вы создадите. Во-первых, языковые строки хранятся в общем формате INI, и имя каждого свойства начинается с системного имени компонента: com_helloworld. Также принято, что все языковые константы записываются в верхнем регистре.
Вы также заметите, что и папка, и сам языковой файл содержат код локали языка для этих строк "en-GB". Для каждой языковой локали, которую вы хотите поддерживать, вам понадобится новый набор файлов с соответствующими строками.
; Hello World Public Site Strings ; Copyright (C) 2020 John Smith. All rights reserved. COM_HELLOWORLD_MSG_HELLO_WORLD="Hello World!"
helloworld.xml
Как и прежде, нам нужно добавить новые папки language с файлами языковых констант в манифест, чтобы Joomla знала, как скопировать их в нужное место файловой системы сайта. Кроме того, нам нужно сообщить Joomla, что у нас есть языковые файлы, где их найти и какие языковые локали они поддерживают. Это делается с добавлением двух XML-блоков <language />, по одному для каждой части компонента (как для админки, так и для фронтенда).
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" method="upgrade">
<!-- атрибут 'version' для тега расширения больше не используется -->
<name>Hello World</name>
<!-- Следующие элементы являются необязательными и не содержат ограничений на форматирование -->
<creationDate>May 2021</creationDate>
<!-- Фиктивный автор, не стесняйтесь заменять его в любом месте, где вы его видите -->
<author>John Smith</author>
<authorUrl>https://mb4.ru</authorUrl>
<copyright>Пётр Васечкин</copyright>
<license>GPL v3</license>
<!-- Строка 'version' записывается в таблицу компонентов -->
<version>0.0.4</version>
<!-- Описание является необязательным и по умолчанию используется имя сомпонента -->
<description>
A hello world component!
</description>
<!-- Это пространство имен PHP, в котором организован
код расширения. Он должен следовать этому формату:
Vendor\Component\ComponentName
"Vendor" может быть названией компании или вашим собственным именем
Раздел "ComponentName" ДОЛЖЕН соответствовать имени, используемому
везде для вашего компонента. Каким бы ни было имя этого XML-файла,
пространство имен должно совпадать (заглавные/прописные буквы не учитываются).
-->
<namespace path="src/">JohnSmith\Component\HelloWorld</namespace>
<files folder="site/">
<folder>language</folder>
<folder>src</folder>
<folder>tmpl</folder>
</files>
<languages>
<language tag="en-GB">site/language/en-GB/en-GB.com_helloworld.ini</language>
</languages>
<administration>
<!-- Ссылка, которая появится в меню админки Joomla "Components" -->
<menu link="index.php?option=com_helloworld">Hello World</menu>
<!-- Список файлов и папок для копирования.
Обратите внимание на атрибут "folder".
Это имя папки в пакете компонентов для копирования в CMS Joomla 4. -->
<files folder="admin/">
<folder>language</folder>
<folder>services</folder>
<folder>src</folder>
<folder>tmpl</folder>
</files>
<languages>
<language tag="en-GB">admin/language/en-GB/en-GB.com_helloworld.ini</language>
<language tag="en-GB">admin/language/en-GB/en-GB.com_helloworld.sys.ini</language>
</languages>
</administration>
</extension>
Обратите внимания на строки:
- стр.14 — обновление версии компонента Joomla 4
- стр.34 — добавление папки
languageс языковыми константами для сайта компонента Joomla 4 - стр.39..41 — добавление описаний, где брать языковые константы для фронтенда сайта компонента Joomla 4
- стр.50 — добавление папки
languageс языковыми константами для админки компонента Joomla 4 - стр.56..59 — добавление описаний, где брать языковые константы для админки сайта и системы компонента Joomla 4
admin/tmpl/hello/default.php
Замените жестко прописанные английские строки новыми свойствами языка. Мы используем класс Joomla\CMS\Language\Text для вывода наших языковых констант на страницу в нужных местах. Если конечный пользователь использует другой язык, поддерживаемый в нашем компоненте, этот класс автоматически извлекает правильные строки для этого языка и выводит их вместо языковых констант.
<?php
use Joomla\CMS\Language\Text;
/**
* @package Joomla.Administrator
* @subpackage com_helloworld
*
* @copyright Copyright (C) 2021 John Smith. All rights reserved.
* @license GNU General Public License version 3; see LICENSE
*/
// Нет прямого доступа к этому файлу
defined('_JEXEC') or die('Всем кыш! =D');
?>
<h2><?= Text::_('COM_HELLOWORLD_MSG_HELLO_WORLD') ?></h2>
Обратите внимания на строки:
- стр.3 — добавление класса
Joomla\CMS\Language\Textдля вывода наших языковых констант - стр.16 — замена жёстко прописанной фразы её языковой константой, хранящейся в файле с её значением
site/tmpl/hello/default.php
Наши шаблоны страниц сайта тоже надо поправить, поэтому необходимые замены похожи тем, что мы сделали с файлами админской части шаблона. Удалите жестко прописанные фразы и замените их вызовом языковых констант.
<?php
use Joomla\CMS\Language\Text;
/**
* @package Joomla.Administrator
* @subpackage com_helloworld
*
* @copyright Copyright (C) 2021 John Smith. All rights reserved.
* @license GNU General Public License version 3; see LICENSE
*/
// Не дать прямого доступа к выполнению PHP-кода в файле
defined('_JEXEC') or die('Но пасаран! =)');
?>
<h2><?= Text::_('COM_HELLOWORLD_MSG_HELLO_WORLD') ?></h2>
Обратите внимания на строки:
- стр.3 — добавление класса
Joomla\CMS\Language\Textдля вывода наших языковых констант - стр.16 — замена жёстко прописанной фразы её языковой константой, хранящейся в файле с её значением
site/tmpl/hello/default.xml
Так же, как и файлы шаблонов PHP, нам нужно заменить жестко прописанные фразы в этом файле созданными языковыми константами. Однако, в отличие от файлов PHP, нам не нужен никакой дополнительный код для этого - просто замените английские строки именами языковых свойств, и Joomla достаточно умна, чтобы подставить их при выводе этого шаблона.
Напоминалочка: поскольку эти строки используются Joomla в ее собственной системе (за пределами страниц нашего компонента), они находятся в специальном файле admin/language/en-GB/en-GB.com_helloworld.sys.ini.
<?xml version="1.0" encoding="utf-8"?>
<metadata>
<layout title="COM_HELLOWORLD_MENU_HELLO_WORLD_TITLE">
<message><![CDATA[COM_HELLOWORLD_MENU_HELLO_WORLD_DESC]]></message>
</layout>
</metadata>
Обратите внимания на строки:
- стр.3..4 — мы просто заменили текст на языковые константы, вместо которых будут подставляться их значения из файлов языков.
Тестирование компонента в Joomla 4 в режиме мультиязычности
Как и раньше, заархивируйте новую версию компонента и загрузите ее в панель администратора установки Joomla. Как только он будет установлен, обойдите его и убедитесь, что ваши страницы и ссылки на меню отображаются точно так же, как и раньше. Если все работает правильно, не должно быть никаких изменений вообще.
В следующей части рассмотрим: Добавление модели фронтенда в наш компонент для Joomla 4.