SupaMonkey
SupaMonkey

Reputation: 884

Laravel - Translate Model public const Array

I have a model with a public const array in it for static values, ie:

class StudentStatus extends Model
{
public const STATUSES = [
    0  => 'Unknown', // Blank & Other entries
    1  => 'Active', // Activo
    2  => 'Cancelled', // Cancelado
    3  => 'Concluded', // Concluido
];

Until now, I would just translate the end value in a report or something to the desired language. However, I have hit a snag when trying to translate this in a select.

Controller:

$statuses = StudentBursaryStatus::STATUSES; // gets the const and passes it to a view

View:

{!! Form::select('status', [null=>__('Please select one').'...']+$statuses, null, ['class'=>'form-control kt-select2']) !!}

Trying to run __($statuses) expectedly fails ("Illegal offset type") because one is trying to translate an array. Trying to run __() on each value in the model also fails ("Constant expression contains invalid operations"), ie:

public const STATUSES = [
    0  => __('Unknown'), // Blank & Other entries
    1  => __('Active'), // Activo
    2  => __('Cancelled'), // Cancelado
    3  => __('Concluded'), // Concluido
];

Short of looping through the array in the controller to translate each value manually - is there a better method to do this?

Upvotes: 1

Views: 406

Answers (2)

Abd alrhman alshafei
Abd alrhman alshafei

Reputation: 56

protected static $typeStrings = [
    0 => 'Unknown',
    1 => 'Active',
    2 => 'Cancelled',
    3 => 'Concluded',
];


public function getTypeAttribute($val)
{
    if( !isset( static::$typeStrings[ $val ] ) ) {
        //throw an exeption, presumably
    }
    return __('app.'.static::$typeStrings[ $val ]);
}

Upvotes: 0

NoOorZ24
NoOorZ24

Reputation: 3222

You can't use functions to define values in pre-set variables. You could define them in constructor but then it's no a constant anymore.

So I recommend to use function that creates translated array from constant

public static function getStatusesTranslated()
{
    $translatedStatuses = [];
    foreach (self::STATUSES as $key => $status) {
        $translatedStatuses[$key] = __($status);
    }
    
    return $translatedStatuses;
}

Then:

$statuses = StudentBursaryStatus::getStatusesTranslated();

Upvotes: 1

Related Questions