12

Laravel 5 provides translations using the @lang helper

<!-- file: template.blade.php -->
@lang('some text')

Laravel 5 also has the possibility to pluralize strings depending on a variable.

// file: controller.php
echo trans_choice('messages.apples', 10);

The translation file would then contain the following line to translate apples:

// file: /resources/lang/en
'apples' => 'There is one apple|There are many apples',

Now, I would like to use pluralization inside a blade template and I cannot find out how to use this. I tried the following:

<!-- file: template.blade.php -->
Course duration: {{ $course.days }} @lang('day|days', $course.days)

which feels to be the logical syntax to me, but this only give me an error about input argument 2 needing to be an array. I also tried this:

<!-- file: template.blade.php -->
Course duration: {{ $course.days }} @lang('day|days', [$course.days])

And this:

<!-- file: template.blade.php -->
Course duration: {{ $course.days }} @lang(['day|days', $course.days])
Hendrik Jan
  • 4,396
  • 8
  • 39
  • 75

3 Answers3

26

There is a @choice blade directive for this.

Course duration: {{ $course->days }} @choice('day|days', $course->days)
Jerodev
  • 32,252
  • 11
  • 87
  • 108
  • Is that included by default? I thought something like that would be useful but never found it in documentations... – D. Petrov Sep 03 '18 at 10:24
  • This works great. I combined it with the answer of D. Petrov. ```@choice('plurals.days', $course->days)``` – Hendrik Jan Sep 03 '18 at 10:33
  • It would be interesting if you could choose between two translations ;) – b00sted 'snail' Mar 07 '19 at 12:54
  • On Laravel 7, using the resources/lang/lang.json I use: @choice('day',2) and this choice means get the string after the pipe so it shows 'days' on the translation language – gtamborero Apr 05 '20 at 20:56
  • Laravel 8.69.0, `@choice` directive doesn't work ? Always returns first parameter before pipe, any idea ?? – TDk Nov 05 '21 at 14:43
6

You can use it with variables like this

//plurals.php
'day' => 'one day| :n days',

you can do this in blade file:

{{ trans_choice('plurals.day', $course->days), ['n' => $course->days] }} 

you can even use this

{{ trans_choice('plurals.like', $post->likes), ['n' => $post->likes] }} 
'like' => '{0} Nobody likes this|[1,19] :n users like this|[20,*] Many users like this'
imaginabit
  • 409
  • 4
  • 9
1

You'll have to register a new keyed entry in one of your translation files, let's say plurals.php. Then the proper approach would be:

//in plurals.php
//...
'day' => 'day|days',
//...

Then you can retrieve the entry like

{{trans_choice('plurals.day', $course->days)}} //assuming the arrow syntax is how you retrieve a property in php :P
D. Petrov
  • 1,147
  • 15
  • 27