2015-12-18 26 views
8

Załóżmy, że zainstalowałem moduł Foo tworząc repozytorium z kompozytorem. Modułowa budowa jest tak:Zastąp ścieżkę tłumaczenia modułu na Yii2

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

Messages folder Foo zawiera pliki translacji modułu. Teraz chcę zastąpić niektóre ciągi tłumaczenia Foo. Od Yii2 i18n Documentation Próbowałem użyć właściwości fileMap w konfiguracji komponentu tłumaczeniowego do odwzorowania kategorii bar na bar.php (zamiast czytania z app\modules\Foo\messages), ale nie ma to wpływu na tłumaczenia. Moja konfiguracja komponentu i18n to:

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

Jak osiągnąć mój cel?

+0

Proszę pokazać nam, jak ten moduł zarejestrować swoje tłumaczenia – soju

Odpowiedz

2

Jeśli chcesz mieć tłumaczenie dla każdego modułu zawartego w module, musisz zarejestrować tłumaczenia dla tego modułu. Nie można tego zrobić po prostu z pliku konfiguracyjnego. Prawdopodobnie masz już to w swoim pliku modułu, po prostu dołączam do kompletności. Kod jest kopiowany z dokumentacją, i musi być w pliku modułu, więc w 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); 
    } 

} 

w twoim przypadku to nie wygląda jak trzeba dostarczyć plik mapping.You może po prostu użyć tego formatu Twoje pliki:

[[basePath]]/LanguageID/CategoryName.php 

Niestety nie mogę znaleźć listy dostępnych kategorii.

Jeśli chcesz przesłonić niektóre tłumaczenia modułów, musisz określić kategorię, która ma zostać użyta, np. W pliku konfiguracyjnym. W szczególności nadpisuje kategorię moduły/foo/bar.

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

Plik tłumaczenie musi śledzić strukturę folderów podobnie jak w opisie tłumaczeń, więc w powyższym przykładzie byłoby

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

Otherise, można użyć fileMap mapować do różnych miejsc, jak jeśli plik bar.php jest w app/wiadomości/[kod języka]

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

Joe, dzięki za y nasza kompleksowa odpowiedź !. Właśnie uwaga, że ​​użyłem identyfikatora modułu jako klucza podczas konfiguracji. Proponuję trochę zmodyfikować twoją odpowiedź, jeśli widzisz, że edycja jest poprawna, to przyjemność ją zastosować;). – meysam

+0

Przepraszamy, ale sugerowana przez Ciebie zmiana nie będzie działać zgodnie z przykładem, który zasugerowałem. Twój własny przypadek użycia może być inny, ale aby odpowiedź miała sens, musi pozostać taka jaka jest! Dzięki za sugestię @meysam –

+0

OK, jeszcze raz dziękuję;). – meysam