Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel - specify a default/fallback string for multi-language

I am starting to add multi-language to a site that uses Laravel for frontend.

However, due to lack of resources at the moment, I am translating the strings as I go. It will be a while before whole site is translated.

The only challenge is that if a text is not translated what get displayed is the key. I would like to specify a default/fallback string for such.

e.g.

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

If I pass 'Business' as $name and there' no translation for 'Business' in site.php lang file I end up with site.Business on the frontend. This messes up everything. In the worst case, if there's no site.Business, Laravel should output Business.

Even better it should provide an option for default/fallback string.

Is this possible?

On a side note is there a free translation for common words? This will save time having to translate everything myself.

Thanks.

like image 656
Mugoma J. Okomba Avatar asked Jun 18 '16 21:06

Mugoma J. Okomba


People also ask

What is {{ __ }} In laravel?

Laravel 5 Translation Using the Double Underscore (__) Helper Function. The __ helper function can be used to retrieve lines of text from language files.

What is @lang in laravel?

Laravel-lang is a collection of over 68 language translations for Laravel by developer Fred Delrieu (caouecs), including authentication, pagination, passwords, and validation rules. This package also includes JSON files for many languages.


1 Answers

The fallback language is what you should be using. See the docs

You may also configure a "fallback language", which will be used when the active language does not contain a given language line. Like the default language, the fallback language is also configured in the app/config/app.php configuration file:

'fallback_locale' => 'en',

It will surely take you just as much time writing in a fallback inline as it would simply writing in the fallback in a parallel translation file as you write in the translation key. The time spent thinking of an alternate way versus just doing it is going to be negligible in the end.

If you really want an inline fallback, then you need to create a new helper method that does something different. So prepare yourself for some home brewed awesomeness.

Let's create a new function that we can use in any view. I will use the method described by Joseph Sibler. Create a file called helpers.php inside app. Then add this to your composer.json in the autoload object under a files array as "app/helpers.php". Not sure what I mean? See his answer. After adding, run composer dump-autoload.

Now, let's add a trans_fb() method that will take all the parameters of the trans() method, but with a fallback as well. I will define this method such that the first two arguments are required, (the key, and the fallback).

If Laravel cannot find the translation key (it searches in resources/lang/en/auth.php for example auth.failed as a key) it will use the fallback instead, and pass any other optional arguments for the original method.

<?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;
    }
}

You can then use this in a template like so:

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

like image 153
Jonathan Avatar answered Oct 19 '22 11:10

Jonathan