Laravel Intl Translator uses php-intl extension to provide translation for your application.
Please mind that this package breaks framework default behaviour for validators.
Due to MessageFormatter::formatMessage
method, Validator::replacer
method should return array of parameters as key-value pair, instead replacing placeholders in message.
Besides that app('translator')->get($key)
always returns message in raw format (unparsed). Translated messages are returned by:
app('translator')->trans($key)
app('translator')->formatMessage($locale, $message, $params)
- Laravel 6
- php-intl extension installed
Please feel free to contribute to this package for other Laravel versions support!
If you do not have php-intl extension you can install it by following command (Ubuntu, Debian)
$ sudo apt-get install php-intl
If you have other OS, you can use it's respective package manager
In your config/app.php
providers
Remove line
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class,
And add line:
Skysplit\Laravel\Translation\TranslationServiceProvider::class,
Skysplit\Laravel\Translation\ValidationServiceProvider::class,
Be careful! This will override your existing
resources/lang/{lang}
files! Check Currently adapted locales table to see which files could be overriden.
php artisan vendor:publish --provider="Skysplit\Laravel\Translation\TranslationServiceProvider" --force
If you would like to publish only config
php artisan vendor:publish --provider="Skysplit\Laravel\Translation\TranslationServiceProvider" --tag=config
If you would like to publish only one language files set
php artisan vendor:publish --provider="Skysplit\Laravel\Translation\TranslationServiceProvider" --force --tag="lang.{locale}[,lang.{other_locale}]"
Locale | Published files |
---|---|
en | auth.php , validation.php |
pl | auth.php , pagination.php , passwords.php , validation.php |
Both trans()
and trans_choice()
helper functions use this translator, so the only thing you have to change is your language files.
For detailed documentation please visit php's MessageFormatter docs and links related there
app/resources/lang/en/custom.php
return [
'placeholder' => 'Hello there, {username}!'
]
view.blade.php
{{ trans('custom.placeholder', ['username' => 'Jane']); }}
Returns
Hello there, Jane!
app/resources/lang/en/custom.php
return [
'select' => '{gender, select, male{He} female{She} other{It}} has two legs and is {gender}!'
]
view.blade.php
{{ trans('custom.select', ['gender' => 'male']); }}
{{ trans('custom.select', ['gender' => 'female']); }}
{{ trans('custom.select', ['gender' => 'penguin']); }}
Returns
He has two legs and is male!
She has two legs and is female!
It has two legs and is penguin!
app/resources/lang/en/custom.php
return [
'plural' => 'Jon has {n, plural, =0{no apples} one{# apple} other{# apples}}'
]
view.blade.php
{{ trans_choice('custom.plural', 0); }}
{{ trans_choice('custom.plural', 1); }}
{{ trans_choice('custom.plural', 2); }}
Returns
Jon has no apples
Jon has 1 apples
Jon has 2 apples
Instead of trans_choice()
you can you use trans()
helper as well.
resources/lang/en/custom.php
return [
'custom.plural' => 'Jon has {0, plural, =0{no apples} one{# apple} other{# apples}}, {grapes, plural, =0{no grapes} one{# grape} other{# grapes} and {oranges, plural, =0{no oranges} one{# orange} other{# oranges}}'
];
view.blade.php
{{ trans('custom.plural', [3, 'grapes' => 1, 'oranges' => 0]) }}
Returns
Jon has 3 apples, 1 grape and no oranges
As you can see, the only thing trans_choice()
do is passing first argument as n
parameter to trans()
helper.
You can set offset for your plural rules. Consider this example:
You {n, plural, offset:1 =0{do not like this yet} =1{liked this} one{and one other person liked this} other{and # others liked this}}
Result:
You do not like this yet // n = 0
You liked this // n = 1
You and one other person liked this // n = 2
You and 2 others liked this // n = 3
You and 3 others liked this // n = 4
Plural rule are often very complex for languages. Intl does handle it for you.
For example in Polish few
rule is applied when n % 10 = 2..4 and n % 100 != 12..14
, while many
rule is applied when n != 1 and n % 10 = 0..1
or n % 10 = 5..9
or n % 100 = 12..14
.
In Serbian =1
will match when n = 1
, but one
will apply when n = 1, 21, 31, 41
etc.
Remember! You always have to provide
other
rule for plural translations.
For more details about pluralization please visit CLDR Plural Rules specificaton and CLDR Language plural rules.
PHP's MessageFormatter also supports ordinal, spellout, number, date, time and duration formatting.
For detailed information please visit this great Yii2 Framework i18n Guide which covers every intl topic wonderfully.