Многоязычный компонент, язык не загружается манифестом

Я пытаюсь создать компонент. У меня есть следующий файл манифеста:

<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.4" method="upgrade">

    <name>COM_EXAMPLE_TITLE</name>
    <libraryname>example</libraryname>
    <creationDate>January 2017</creationDate>
    <author>inf3rno</author>
    <authorEmail>[email protected]</authorEmail>
    <license>MIT</license>
    <version>0.0.1</version>
    <description>COM_EXAMPLE_DESCRIPTION</description>

    <scriptfile>installer.php</scriptfile>

    <files>
        <filename>example.php</filename>
        <folder>views</folder>
        <folder>src</folder>
        <folder>language</folder>
        <folder>media</folder>
    </files>

    <administration>
        <menu link="option=com_example">COM_EXAMPLE_TITLE</menu>
        <files>
            <filename>example.php</filename>
            <folder>src</folder>
            <folder>language</folder>
            <folder>media</folder>
        </files>
    </administration>

</extension>

В языковой папке у меня есть 4 ini-файла:

  • ан-GB.com_example.ini
  • ан-GB.com_example.sys.ini
  • ху-HU.com_example.ini
  • ху-HU.com_example.sys.ini

и у меня есть константы COM_EXAMPLE_TITLE и COM_EXAMPLE_DESCRIPTION в этих файлах. Я не хочу использовать классы MVC, предоставляемые Joomla, и я хочу повторно использовать папку src, содержащую мои классы.

Основная проблема, что Joomla не заменяет имена констант на значения, поэтому, когда я устанавливаю этот компонент, зарегистрированный компонент будет COM_EXAMPLE_TITLE вместо example, а имя, отображаемое в меню администратора, будет com-example-title вместо, например, Example Component или что-то, что я храню в COM_EXAMPLE_TITLE константа.

Я не понимаю, почему это не работает. Я попробовал элемент <languages> и с помощью en-GB и hu-HU. Ничего не изменилось, как бы я ни изменился. Я установил Joomla 3.4.3 на localhost, но у меня такая же версия на производственном сервере. На рабочем сервере с элементом <languages> мне удалось выполнить эту работу. Есть ли опция конфигурации или что-то, что отключило включение этих констант? Можно ли отключить эту функцию или что-то еще происходит здесь?

изменить

Я проверил свой старый более или менее рабочий код. Есть ли шанс, что он никогда не работал должным образом? У меня эти многоязычные тексты в меню администратора и в меню сайта, но при установке я не могу иметь, например, многоязычное имя и описание расширения. Теперь это интересно, поскольку этот пример говорит мне, что это возможное. Может быть, по более поздним версиям, я не знаю.

Я тестировал дальше, с <folder>language</folder> он работает, если файлы находятся в ln-LN, но имя и описание пакета не работают, просто меню администратора. То же самое происходит на производственном сервере, поэтому это не вариант конфигурации, он просто не поддерживается. Вероятно, версия слишком старая.

1 голос | спросил inf3rno 7 FebruaryEurope/MoscowbTue, 07 Feb 2017 08:50:55 +0300000000amTue, 07 Feb 2017 08:50:55 +030017 2017, 08:50:55

2 ответа


2

Я нашел соответствующую часть кода в пример проекта joomla .

public function loadLanguage($path = null)
{
    $source = $this->parent->getPath('source');
    if (!$source)
    {
        $this->parent->setPath('source', JPATH_PLATFORM . '/' . $this->parent->extension->element);
    }
    $this->manifest = $this->parent->getManifest();
    $extension = 'lib_' . strtolower(JFilterInput::getInstance()->clean((string) $this->manifest->name, 'cmd'));
    $name = strtolower((string) $this->manifest->libraryname);
    $lang = JFactory::getLanguage();
    $source = $path ? $path : JPATH_PLATFORM . "/$name";
    $lang->load($extension . '.sys', $source, null, false, false)
        || $lang->load($extension . '.sys', JPATH_SITE, null, false, false)
        || $lang->load($extension . '.sys', $source, $lang->getDefault(), false, false)
        || $lang->load($extension . '.sys', JPATH_SITE, $lang->getDefault(), false, false);
}

Но он присутствует в текущей версии joomla .

public function loadLanguage($path = null)
{
    $source = $this->parent->getPath('source');
    if (!$source)
    {
        $this->parent->setPath('source', JPATH_PLATFORM . '/' . $this->getElement());
    }
    $extension = 'lib_' . $this->getElement();
    $librarypath = (string) $this->getManifest()->libraryname;
    $source = $path ?: JPATH_PLATFORM . '/' . $librarypath;
    $this->doLoadLanguage($extension, $source, JPATH_SITE);
}

Я думаю, что первый код легче понять.

$extension = 'lib_' . strtolower(JFilterInput::getInstance()->clean((string) $this->manifest->name, 'cmd'));
$name = strtolower((string) $this->manifest->libraryname);
$lang = JFactory::getLanguage();
$source = $path ? $path : JPATH_PLATFORM . "/$name";

Таким образом, имя расширения будет выводиться из файла manifest.name, а не из manifest.libraryname. Я изменил свой код с

<name>COM_EXAMPLE_TITLE</name>
<libraryname>example</libraryname>

к

<name>example</name>
<libraryname>COM_EXAMPLE_TITLE</libraryname>

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

Обратите внимание, что вам не нужен элемент <languages>, это реликвия Joomla 1.5 в соответствии с документацией. Важно сохранить подкаталоги и соглашение об именах. ln-LN/ln-LN.com_example.sys.ini. В манифесте используется файл *.sys.ini для переводов. Я предполагаю, что другой файл ini используется работающим компонентом.

Итак, файл манифеста выглядит так:

<extension type="component" version="3.4" method="upgrade">

    <name>example</name>
    <libraryname>COM_EXAMPLE_TITLE</libraryname>
    <creationDate>January 2017</creationDate>
    <author>inf3rno</author>
    <authorEmail>[email protected]</authorEmail>
    <license>MIT</license>
    <version>0.0.9</version>
    <description>COM_EXAMPLE_DESCRIPTION</description>

    <scriptfile>installer.php</scriptfile>

    <files>
        <filename>example.php</filename>
        <folder>views</folder>
        <folder>src</folder>
        <folder>media</folder>
        <folder>language</folder>
    </files>

    <administration>
        <menu>COM_EXAMPLE_TITLE</menu>
        <files>
            <filename>example.php</filename>
            <folder>src</folder>
            <folder>media</folder>
            <folder>language</folder>
        </files>
    </administration>

</extension>

, и я поместил языковые файлы в подпапки.

ответил inf3rno 8 FebruaryEurope/MoscowbWed, 08 Feb 2017 03:43:03 +0300000000amWed, 08 Feb 2017 03:43:03 +030017 2017, 03:43:03
2

Языковые константы не переводятся, потому что вы не определили свои языки в файле XML.

Вы можете сделать это так:

<files>
    <folder>language</folder>    <<< You don't need this
</files>

// Site languages
<languages folder="site/language">
    <language tag="en-GB">en-GB/en-GB.com_example.ini</language>
    <language tag="en-GB">en-GB/en-GB.com_example.sys.ini</language>
    <language tag="hu-HU">hu-HU/hu-HU.com_example.ini</language>
    <language tag="hu-HU">hu-HU/hu-HU.com_example.sys.ini</language>
</languages>

// Admin languages
<administration>
    <languages folder="admin/language">
        <language tag="en-GB">en-GB/en-GB.com_example.ini</language>
        <language tag="en-GB">en-GB/en-GB.com_example.sys.ini</language>
        <language tag="hu-HU">hu-HU/hu-HU.com_example.ini</language>
        <language tag="hu-HU">hu-HU/hu-HU.com_example.sys.ini</language>
    </languages>
</administration>

Надеюсь, что это поможет

ответил Lodder 7 FebruaryEurope/MoscowbTue, 07 Feb 2017 12:13:39 +0300000000pmTue, 07 Feb 2017 12:13:39 +030017 2017, 12:13:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132