[Yii2] Problema Traduzione

Ciao a tutti, sto facendo qualche prova con il sistema di traduzione

ho configurato di default la lingua italiana dentro web.php


$config = [

    'language' => 'it',



e verificato che Yii lo avesse memorizzato, tramite un


echo Yii::$app->language;

Poi ho editato il layout main.php sostituendo


['label' => 'Contact', 'url' => ['/site/contact']],

con questo codice


['label' => Yii::t('app', 'Contact'), 'url' => ['/site/contact']],

Infine ho editato yii.php nella cartella vendor/yiisoft/yii2/messages/it

aggiungendo una riga banale


'Contact' => 'Contatti',

Salvato tutto, ho aggiornato la pagina ma non c’è stata traduzione…

Ho perso un po’ di tempo cercando di debuggare, e l’unica cosa che ho notato è che dentro MessageSource.php verso la riga 55 c’è una funzione stranamente vuota:




    /**

     * Loads the message translation for the specified language and category.

     * If translation for specific locale code such as `en-US` isn't found it

     * tries more generic `en`.

     *

     * @param string $category the message category

     * @param string $language the target language

     * @return array the loaded messages. The keys are original messages, and the values

     * are translated messages.

     */

    protected function loadMessages($category, $language)

    {

        return [];

    }



Ora mi chiedo, ho sbagliato/dimenticato qualche passaggio, oppure potrebbe esserci un bug?

grazie per l’aiuto

Ciao, provo a risponderti ma non sono sicurissimo perché non ho verificato.

la directory messages deve stare nella root della tua app, tutt quello che sta dentro vendor/* è bene non modificarlo mai a mano.

Quando richiami una traduzione con


Yii::t('app', 'Contact')

stai ricercando la stringa Contact nella categoria app, devi quindi creare dentro messages una dir it e dentro la dir it il file app.php, cioè la categoria che stai usando.

quidni avrai


messages/it/app.php

in app.php avrai




<?php


return ['Contact' => 'Contatti'];

Ti consiglio comunque di verificare tutte le opzioni possibili nella documentazione

Perfetto, funziona!

Grazie 1.000, mi mancava proprio di creare la cartella nella root della mia applicazione.

salve anch’io sto cercando di tradurre la mia prima web app con yii2 ho copiato la cartella messages nella root…ho modificato il file config/main.php inserendo

‘language’ => ‘it’

perchè il file web.php non lo trovo…

e fatto gli stessi passaggi di federico ma nada :(

Io uso il template BASIC.

nella <root>/config/web.php


$config = [

    ...

    'language' => 'it',

    'components' => [

        'i18n' => [

            'translations' => [

                'app' => [

                    'class' => 'yii\i18n\PhpMessageSource',

                    'basePath' => '@app/messages', // example: @app/messages/fr/user.php


                ],

            ],

        ],

        ...



quindi il sistema si aspetta di trovare ad esempio per le lingue italiano ed inglese, i seguenti file:

<root>/messages/en/app.php che conterrà ad esempio


'Iscrizione' => 'Sign Up',

<root>/messages/it/app.php che conterrà ad esempio


'Action' => 'Azioni',

A questo punto, in qualunque punto della tua applicazione, basterà usare il comando:


Yii::t("app", "Action")

se language=it cercherà dentro la directory it/app.php e ritornerà la stringa ‘Azioni’


Yii::t("app", "Iscrizione")

se language=en cercherà dentro la directory en/app.php e ritornerà la stringa ‘Sign Up’

Ovviamente la lingua nel mio esempio viene pre-settata nel web.php, ma può essere anche settata dinamicamente con il comando


Yii::$app->language

in qualunque punto del programma.

P.S.: se ti può interessare x la selezione della lingua io mi trovo molto bene con questo componente: Yii2-Language-Picker

ciao grazie innannzitutto!

ho provato ma proprio niente :(

ho impostato nel main sia nel config/main.php che in frontend/config/main.php

‘language’ => ‘it’,

      'i18n' =&gt; [


        'translations' =&gt; [


            'app' =&gt; [


                'class' =&gt; 'yii&#092;i18n&#092;PhpMessageSource',


                'basePath' =&gt; '@app/messages', // example: @app/messages/fr/user.php





            ],


        ],


    ],

la cartella messages sta nella sotto la root dunque in linea con backend, frontend, common…

è generato un otutput di esempio come Yii::t("app", "Action")

l’output di Yii::$app->language è it :angry:

ok risolto, temevo fosse un problema di mia configurazione, ho dovuto impostare come

<?= Yii::t(‘yii’,‘Yes’) ?> perche il mio file sotto la cartella it era yii.php

E confermo questa configurazione per il template advanced:

<?php

return [

'vendorPath' =&gt; dirname(dirname(__DIR__)) . '/vendor',


'language' =&gt; 'it',


'components' =&gt; [


    'cache' =&gt; [


        'class' =&gt; 'yii&#092;caching&#092;FileCache',


    ],


              'i18n' =&gt; [


        'translations' =&gt; [


            'app' =&gt; [


                'class' =&gt; 'yii&#092;i18n&#092;PhpMessageSource',


                'basePath' =&gt; '@app/messages',





            ],


        ],


    ],


],

];

nel file /advanced/common/config/main.php e posizionamento della cartella messages sotto la root

Grazie ragazzi per il supporto

ho due domande a proposito delle traduzioni…

come posso mappare per ciascun file e come mai non trovo la cartella en? qual’è quella di default?