2016-06-18 1 views
4

Je commence à ajouter multi-langue à un site qui utilise Laravel pour frontend.Laravel - spécifier une chaîne par défaut/fallback pour multi-langue

Cependant, en raison du manque de ressources pour le moment, je traduis les chaînes comme je vais. Il faudra un certain temps avant que le site entier soit traduit.

Le seul défi est que si un texte n'est pas traduit ce qui est affiché est la clé. Je voudrais spécifier une chaîne par défaut/fallback pour tel.

par exemple.

{{ trans('site.'.$name) }} 

Si je passe « affaires » comme nom de $ et il n'y a pas de traduction pour « Business » dans site.php fichier lang je me retrouve avec site.Business sur le frontend. Cela chamboule tout. Dans le pire des cas, s'il n'y a pas de site.Business, Laravel devrait afficher Business.

Encore mieux, il devrait fournir une option pour la chaîne par défaut/de secours.

Est-ce possible?

Sur une note de côté, y a-t-il une traduction libre pour des mots communs? Cela vous fera gagner du temps à tout traduire moi-même.

Merci.

Répondre

2

La langue de remplacement est ce que vous devriez utiliser. Voir la docs

Vous pouvez également configurer un « langage de secours », qui sera utilisé lorsque la langue active ne contient pas une ligne de langue donnée. Comme la langue par défaut , la langue de repli est également configuré dans le fichier de configuration app/config/app.php:

'fallback_locale' => 'en',

Il va sûrement vous prendre autant de temps à écrire dans une solution de repli en ligne comme il écrit simplement le repli dans un fichier de traduction parallèle lorsque vous écrivez dans la clé de traduction. Le temps passé à penser d'une manière alternative par rapport à simplement le faire va être négligeable à la fin.

Si vous voulez vraiment un retour en ligne, alors vous devez créer une nouvelle méthode d'assistance qui fait quelque chose de différent. Préparez-vous donc pour une certaine maison brassée awesomeness. Créons une nouvelle fonction que nous pouvons utiliser dans n'importe quelle vue.

Je vais utiliser la méthode décrite par Joseph Sibler. Créez un fichier appelé helpers.php à l'intérieur de app. Puis ajoutez ceci à votre composer.json dans l'objet autoload sous un tableau files en tant que "app/helpers.php". Vous ne savez pas ce que je veux dire? Voir sa réponse. Après l'ajout, exécutez composer dump-autoload.

Maintenant, ajoutons une méthode trans_fb() qui prendra tous les paramètres de la méthode trans(), mais avec un repli aussi. Je vais définir cette méthode de manière à ce que les deux premiers arguments soient obligatoires (la clé et le repli).Si Laravel ne trouve pas la clé de traduction (il recherche resources/lang/en/auth.php par exemple auth.failed en tant que clé), il utilisera fallback à la place, et passera tout autre argument optionnel pour la méthode originale.

<?php 

if (! function_exists('trans_fb')) { 
    /** 
    * Translate the given message with a fallback string if none exists. 
    * 
    * @param string $id 
    * @param string $fallback 
    * @param array $parameters 
    * @param string $domain 
    * @param string $locale 
    * @return \Symfony\Component\Translation\TranslatorInterface|string 
    */ 
    function trans_fb($id, $fallback, $parameters = [], $domain = 'messages', $locale = null) 
    { 
     return ($id === ($translation = trans($id, $parameters, $domain, $locale))) ? $fallback : $translation; 
    } 
} 

Vous pouvez alors l'utiliser dans un modèle comme ceci:

{{ trans_fb("i.love.laravel", "I love Laravel!") }}

+0

J'avais déjà prêt sur la langue de repli mais ne pas l'air viable dans ma situation. Je vais essayer d'utiliser une autre fonction d'assistance comme suggéré. Merci. –

+0

Si ce n'était pas viable alors cela devrait être tout ce dont vous avez besoin :) Bonne chance. – Jonathan

+1

Génial. Utiliser la fonction d'aide fait la magie. Merci. –