2017-07-03 1 views
0

J'ai créé le plugin ContentManager pour mes applications cakephp (3.2). Il a le fichier de traduction de base dans /plugins/ContentManager/src/Locale/ru/content_manager.po.Localisation du plugin CakePHP dans différents fichiers

Maintenant, je veux ajouter quelques ajouts de traductions au niveau de l'application. J'ai donc besoin d'un fichier supplémentaire po pour mon plugin. Si je mets un autre fichier content_manager.po dans le dossier app\src\Locale\ru, il remplace le fichier de base.

Est-il possible d'ajouter un fichier comme content_manager.0.po, content_manager.base.po ou quelque chose, et de faire travailler ensemble? Quoi qu'il en soit, j'ai besoin d'étendre les transitions de plugin en quelque sorte.

fichier de base

contient des chaînes comme celles-ci

msgid "tab_MenuItems" 
msgid "content.type.News" 
msgid "users.role.admin" 

et ainsi de suite.
fichier supplémentaire contient des chaînes spécifiques à l'application comme:

msgid "content.type.Products" 
msgid "content.type.Orders" 
msgid "users.role.manager" 
plug-in

lui-même utilise les traductions comme (exemple, smarty) ceci:

{foreach $registered_types as $ct} 
<li>{__d("content_manager", "content.type.$ct")}</li> 
{/foreach} 

Répondre

1

Vous pouvez ajouter un fichier default.po dans vos applications ru locale dossier, ce fichier sera par défaut utilisé par le "chargeur de secours", qui sera utilisé dans le cas où l'ID de message demandé ne peut pas être trouvé dans le domaine primaire, par exemple content_manager.po.

Si vous avez besoin plus de contrôle, vous pouvez toujours construire des chargeurs/packages personnalisés, comme par exemple:

use Cake\I18n\I18n; 
use Cake\I18n\MessagesFileLoader; 

I18n::config('content_manager', function ($name, $locale) { 
    $fileLoader = new MessagesFileLoader('content_manager', $locale, 'po'); 

    /* @var $package \Aura\Intl\Package */ 
    $package = $fileLoader(); 
    $package->setFallback('content_manager.base'); 

    return $package; 
}); 

Cela créerait un chargeur qui en interne pré-charge les messages de domaine par défaut content_manager et définissez la fallback loader domain to content_manager.base, afin qu'il essaie de charger des messages à partir de votre fichier content_manager.base.po dans le cas où il n'y a pas de traduction présente dans le domaine par défaut.

Et n'oubliez pas de vider le cache (tmp/cache/persistent) après avoir ajouté/modifié des traductions/chargeurs.

Voir aussi

+0

oui, que je peux utiliser 'default.po', mais ce n'est pas une bonne solution dans mon cas, comme il est utilisé pour d'autres traductions ations et je ne veux pas les mélanger. J'ai lu un peu sur le fallback, mais je n'ai pas encore essayé de l'utiliser. Merci, je vais vérifier demain – teran

+0

hm, en utilisant ce code, le chargeur essaie de trouver le fichier 'base' dans le dossier' src/Locale', et ne cherche pas dans le dossier des plugins. – teran

+0

il me semble que je devrais implémenter ma propre classe 'MessagesFileLoad' pour le domaine de traduction' base' et remplacer la méthode 'translationsFolders' – teran