Ответы пользователя по тегу Интернационализация и локализация
  • Как сделать мультиязычный сайт на laravel 5?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Как правильно реализовать локализацию БД в laravel?
    Вот про локализацию БД.

    https://laravel.ru/docs/v5/localization
    Вот про локализацию самого сайта (строк).
    Ответ написан
  • Как правильно реализовать локализацию БД в laravel?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    На мой взгляд использование пакетов для этой цели нецелесообразно.
    Обычная полиморфическая связь подойдет.

    И так, давайте представим что основной контент статьи на русском языке.
    Во первых, создадим модель нашей локализации:
    php artisan make:model Localization

    Укажем что это полиморфическая связь:
    protected $table = 'localization';
    
    public function lozalizable()
      {
          return $this->morphTo();
      }


    В нашей модели статей привяжем свежесозданную модель в качестве связи:
    public function lozalization(){
    	    return $this->morphOne('App\Localization', 'lozalizable');
    	}


    И создадим миграцию для модели Lozalizable:
    Schema::create('localization', function (Blueprint $table) {
            $table->increments('id');
            $table->string('field');
            $table->string('language');
            $table->string('value');
            $table->string('lozalizable_type');
            $table->integer('lozalizable_id');
            $table->timestamps();
          });


    Теперь, для создания локализации статьи с языком en выполним следующий код:
    $article = Article::create($Atricle);
    
    $localization = new Localization;
    $localization->language = 'en';
    $localization->field = 'content';
    $localization->value = 'Znachenye na english yazike';
    $article->localization()->save($localization); //привязываем к свежесозданному объекту Article новую локализацию


    С помощью scope функций в модели можно без особых проблем реализовать более удобное выдергивание нужного значения и языка:
    public function scopeGetLocalize($language, $field){
         return $this->localization()->where(['language' => $language, 'field' => $field])-> firstOrFail()->value;
    }


    В таком случае, скажем, поле title для локализации en можно выдергивать так:
    $article->getLocalize('en', 'title')
    Ответ написан