У меня есть модель под названием «сотрудники», у которой есть имя на латыни и арабском языке, поэтому я использовал это в своей миграции:
public function up()
{
Schema::create('employees', function (Blueprint $table) {
$table->id();
$table->string('picture');
$table->string('name');
$table->string('name_ar');
$table->string('name_fr');
$table->string('position');
$table->string('position_ar');
$table->string('position_fr');
$table->timestamps();
});
}
И я хочу отображать правильное имя на языке в зависимости от локализации, например, если локализация 'fr', я должен отображать name_fr или name_ar для 'ar', я использую пакет локализации .
На данный момент я придумал это:
@if (Lang::locale() == 'ar')
<h4 class = "text-white"> {{ $employee->name_ar }} </h4>
<div class = "flex items-center gap-x-1">
<img src = "{{ asset('assets/eye-icon.svg') }}" alt = "eye">
<p class = "text-white text-sm">{{ $employee->position_ar }}</p>
</div>
@elseif (Lang::locale() == 'fr')
<h4 class = "text-white"> {{ $employee->name_fr }} </h4>
<div class = "flex items-center gap-x-1">
<img src = "{{ asset('assets/eye-icon.svg') }}" alt = "eye">
<p class = "text-white text-sm">{{ $employee->position_fr }}</p>
</div>
@else
<h4 class = "text-white"> {{ $employee->name }} </h4>
<div class = "flex items-center gap-x-1">
<img src = "{{ asset('assets/eye-icon.svg') }}" alt = "eye">
<p class = "text-white text-sm">{{ $employee->position }}</p>
</div>
@endif
Есть ли лучший способ отобразить имя на правильном языке, например, в контроллере или в каталоге Lang?.
То, что у вас есть сейчас, функционально, но пакет, который вы используете, предназначен для переводов Laravel (то есть вещей, найденных в папках resources/lang/{locale}), а не для переводов моделей. github.com/Astrotomic/laravel-translatable или github.com/spatie/laravel-translatable — распространенные пакеты для правильной обработки этого.
Вы могли бы добиться этого с помощью одной строки, подобной этой
{{ $employee->{'name_' . app()->getLocale()} ?? $employee->name }}
Спасибо @Tim Lewis за упоминание об этом.
В миграции, если вы проверите после name, это name_ar и name_fr, а также в лезвии он должен перевести имя, а не столбец имени
Кроме того, $employee[name_.Lang::locale()] является синтаксической ошибкой; name_ не определен, . является неожиданным токеном и т. д. Правильным синтаксисом будет {{ $employee->{'name_' . app()->locale()} }} (или аналогичный)
Я обновил свой ответ, теперь он должен работать
{locale}
принесет ar
или fr
, тогда имя станет таким name_ar
или name_fr
таким образом, чтобы он мог использовать вот так в лезвии `{{$employee->name}}
Вот что я сделал, вдохновившись вашим решением @MohammadEdrisRaufi: {{ $employee->{Lang::locale() == 'en' ? 'name' : 'name_' . Lang::locale()} }}
Не делайте эту проверку на доступность ключа, потому что, если в будущем, если у вас будет язык, отличный от вашего кода, он сломается, используйте ответ, он проверит, доступен ли ключ, он покажет, иначе он покажет только имя
Laravel допускает локализацию строк, которая может быть полезна для меток и системных сообщений, вы можете посмотреть здесь laravel.com/docs/9.x/localization