Traduire les éléments d'un menu généré depuis le plugin StaticPages

Traduire les éléments d'un menu généré depuis le plugin StaticPages

Les menus créés avec le plugin RainLab.Pages ne sont pas traduisible. Afin d'outrepasser cette limitation, Marc Jauvin vous propose d'utiliser une technique très simple.

Lors de la création du menu, utiliser en tant que titre pour le lien du menu une chaîne de caractères identifiant une traduction, par exemple author.plugin::lang.menu.menuName

Ensuite lors de la génération du menu, utiliser le filtre | trans sur le titre du lien précédemment passé:

<ul>
{% for item in items if not item.viewBag.isHidden %}
    <li>{{ item.title | trans }}</li>
{% endfor %}
</ul>

Évidemment, il vous faut aussi créé les différents textes de traduction dans le dossier lang de votre plugin.

Astuce initialement publié par Marc Jauvin sur OctoberTricks

25 juillet 2020

Poster un commentaire

Marc Jauvin, le 2020-08-05 19:19:06 a écrit:

Bientôt disponible directement par le biais du plugin Rainlab.Translate...

Marc Jauvin, le 2020-07-31 15:10:09 a écrit:

Voici une autre méthode plus pratique:

    Event::listen('backend.form.extendFieldsBefore', function ($widget) {
        if ($widget->model instanceof \RainLab\Pages\Classes\MenuItem) {
            $originalFields = $widget->fields;

            $widget->fields = [];
            foreach ($originalFields as $field => $definition) {
                $widget->fields[$field] = $definition;
                if ($field === 'type') {
                    $titleStr = trans('Title');
                    $defaultLocale = Locale::getDefault();
                    foreach (Locale::listAvailable() as $code => $locale) {
                        if ($code !== $defaultLocale->code) {
                            $fieldName = sprintf('viewBag[localeTitle.%s]', $code);
                            $widget->fields[$fieldName] = [
                                'label' => sprintf("%s [%s]", $titleStr, $locale),
                            ];
                        }
                    }
                }
            }
        }
    });

    Event::listen('pages.menu.referencesGenerated', function (&$items) {
        $iterator = function ($menuItems) use (&$iterator) {
            $result = [];
            $locale = App::getLocale();
            foreach ($menuItems as $item) {
                if ($title = array_get($item->viewBag, "localeTitle.$locale")) {
                    $item->title = $title;
                }

                if ($item->items) {
                    $item->items = $iterator($item->items);
                }
                $result[] = $item;
            }
            return $result;
        };
        $items = $iterator($items);
    });

Ce site utilise des cookies

Ils permettent de vous fournir la meilleur expérience visiteur possible.

En poursuivant la navigation sur ce site, vous acceptez l'utilisation de ces cookies.