web-dev-qa-db-fra.com

Composant multilingue, la langue n'est pas chargée par manifeste

J'essaie de créer un composant. J'ai le fichier manifeste suivant:

<?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>

Dans le dossier language, j'ai 4 fichiers ini:

  • fr-FR.com_example.ini
  • fr-FR.com_example.sys.ini
  • hu-HU.com_example.ini
  • hu-HU.com_example.sys.ini

et j'ai les constantes COM_EXAMPLE_TITLE et COM_EXAMPLE_DESCRIPTION dans ces fichiers. Je ne souhaite pas utiliser les classes MVC fournies par Joomla et je souhaite réutiliser le dossier src, qui contient mes classes.

Le problème principal est que Joomla ne remplace pas les noms de constantes par les valeurs. Ainsi, lors de l'installation de ce composant, le composant enregistré sera COM_EXAMPLE_TITLE au lieu de example et le nom affiché dans le menu administrateur sera com-example-title au lieu de, par exemple Example Component ou ce que je stocke dans le COM_EXAMPLE_TITLE constant.

Je ne comprends pas pourquoi ça ne marche pas. J'ai essayé avec le <languages> élément aussi et avec en-GB et hu-HU _ sous-dossiers aussi. Rien n'a fonctionné, peu importe ce que j'ai changé. J'ai installé Joomla 3.4.3 sur localhost, mais j'ai la même version sur le serveur de production. Sur le serveur de production avec le <languages> _ élément j'ai réussi à faire ce travail. Existe-t-il une option de configuration ou autre qui désactive l'inclusion de ces constantes? Cette fonctionnalité peut-elle être désactivée ou quelque chose d'autre se passe ici?

modifier:

J'ai vérifié mon ancien code plus ou moins fonctionnel. Y a-t-il une chance que cela n'ait jamais fonctionné correctement? J'ai ces textes multilingues dans les menus administrateur et site, mais lors de l'installation, je ne peux pas avoir, par exemple, le nom et la description de l'extension multilingue. C’est intéressant, puisque cet exemple me dit que c’est possible. Peut-être que par les dernières versions seulement, je ne sais pas.

J'ai testé plus loin, avec le <folder>language</folder> ça marche aussi si les fichiers sont dans le ln-LN _ sous-dossiers, mais le nom et la description du paquet ne fonctionnent pas, juste le menu admin. La même chose se trouve sur le serveur de production, ce n’est donc pas une option de configuration, elle n’est tout simplement pas prise en charge. Probablement la version est trop ancienne.

1
inf3rno

J'ai trouvé la partie pertinente du code dans un exemple du projet 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);
}

Mais il est présent dans le version actuelle de 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);
}

Je pense que le premier code est plus facile à comprendre.

$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";

Le nom de l'extension proviendra donc du fichier manifest.name et non du fichier manifest.library. J'ai changé mon code de

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

à

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

et maintenant cela fonctionne correctement. Il est intéressant de noter que tous les exemples que j'ai lus à propos de manifest.nombibliothèque sont complètement faux à ce sujet. La version actuelle semble avoir le même trait, donc si c'est un bogue, je pense qu'il n'est pas encore corrigé.

Notez que vous n'avez pas besoin du <languages> élément, il s’agit d’une relique de Joomla 1.5 selon la documentation. Il est important de conserver les sous-répertoires et la convention de dénomination. ln-LN/ln-LN.com_example.sys.ini. Le manifeste utilise le *.sys.ini fichier pour les traductions. Je suppose que l'autre fichier ini est utilisé par le composant en cours d'exécution.

Donc, mon fichier manifeste ressemble à ceci:

<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>

et je mets les fichiers de langue dans des sous-dossiers.

1
inf3rno

Les constantes de langue ne sont pas traduites car vous n'avez pas défini vos langues dans le fichier XML.

Vous pouvez faire ça comme ça:

<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>

J'espère que cela t'aides

1
Lodder