2015-12-18 13 views
8

Supponiamo che il modulo installato sia un repository con compositore. La struttura del modulo è simile a questo:Ignora percorso di traduzione del modulo su yii2

cartella
- Foo 
|- models 
|- controllers 
|- views 
|- messages 
|- config 

Messages di Foo contiene file di traduzione del modulo. Ora voglio scavalcare alcune stringhe di traduzione di Foo. Da Yii2 i18n Documentation Ho provato a utilizzare la proprietà fileMap sulla configurazione del componente di traduzione per mappare la categoria bar su bar.php (anziché leggere da app\modules\Foo\messages), ma non ha alcun effetto sulle traduzioni. La mia configurazione del componente i18n è:

'i18n' => [ 
    'translations' => [ 
     '*' => [ 
      'class' => 'yii\i18n\PhpMessageSource', 
      'fileMap' => [ 
       'bar' => 'bar.php' 
      ], 
     ], 
    ], 
], 

Come raggiungere il mio obiettivo?

+0

Vi preghiamo di mostrare come questo modulo registrato le traduzioni – soju

risposta

2

Se si desidera avere traduzioni per ciascun modulo contenuto nel modulo, è necessario registrare le traduzioni per quel modulo. Non può essere fatto semplicemente dal file di configurazione. Probabilmente lo hai già nel tuo file del modulo, includo solo per completezza. Il codice viene copiato dalla documentazione, e ha bisogno di essere nel file del modulo, quindi in app/modules/Foo.php

<?php 

namespace app\modules\foo; 

use Yii; 

class Module extends \yii\base\Module 
{ 
    public $controllerNamespace = 'app\modules\foo\controllers'; 

    public function init() 
    { 
     parent::init(); 
    /** Register custom translations for this module **/ 
     $this->registerTranslations(); 
    } 

    public function registerTranslations() 
    { 

    /**This registers translations for the Foo module **/ 
     Yii::$app->i18n->translations['modules/foo/*'] = [ 
      'class' => 'yii\i18n\PhpMessageSource', 
      'sourceLanguage' => 'en-US', 
      'basePath' => '@app/modules/foo/messages', 

    /**Tells yii where to find the translations for validation and form categories **/ 
      'fileMap' => [ 
       'modules/foo/validation' => 'validation.php', 
       'modules/foo/form' => 'form.php', 
       ... 
      ], 
     ]; 
    } 

    public static function t($category, $message, $params = [], $language = null) 
    { 
     return Yii::t('modules/users/' . $category, $message, $params, $language); 
    } 

} 

Nel tuo caso non sembra che tu abbia bisogno di fornire file di mapping.You potrebbe semplicemente utilizzare questo formato per i tuoi file

[[basePath]]/LanguageID/CategoryName.php 

Purtroppo non riesco a trovare un elenco delle categorie disponibili.

Se si desidera eseguire l'override di alcune delle traduzioni del modulo, è necessario specificare la categoria da utilizzare, come questa nel file di configurazione. In particolare sovrascrive la categoria moduli/foo/bar.

'i18n' => [ 
    'translations' => [ 
     'modules/foo*' => [ 
      'class' => 'yii\i18n\PhpMessageSource', 
      'basePath' => '@app/messages', 
     ], 
    ], 
], 

Il file di traduzione ha bisogno di seguire una struttura di cartelle come quella nella descrizione di traduzione, così nell'esempio di cui sopra sarebbe

app/messages/ [language code] /modules/foo/bar.php 

otherise, è possibile utilizzare fileMap per mappare in posizioni diverse, come se il file bar.php si trova in app/messaggi/[codice lingua]

'fileMap' => [ 
'modules/foo/bar' => 'bar.php' 
] 
+0

Joe, grazie per y la nostra risposta completa !. Solo la nota che ho usato l'id del modulo come chiave nella configurazione. Ti suggerirò qualche modifica sulla tua risposta, se vedi che la modifica è corretta, è un piacere applicarla;). – meysam

+0

Ci dispiace, ma la modifica suggerita non funzionerà per l'esempio che ho suggerito. Il tuo caso d'uso potrebbe essere stato diverso, ma perché la risposta abbia senso, deve rimanere com'è! Grazie per il suggerimento però @meysam –

+0

OK, grazie ancora;). – meysam

Problemi correlati