2013-09-30 18 views
6

Tworzę aplikację z backendem w Laravel. Backend musi zarządzać kolekcją obiektów, które są pobierane do aplikacji. Obiekty muszą być zlokalizowane w zależności od języka urządzenia.Wielojęzyczne zarządzanie bazą danych za pomocą Laravel

Czy istnieje prosty sposób, aby to zrobić w Laravel? Być może wymowny lub wtyczka Laravel? Chciałbym uniknąć pisania wsparcia dotyczącego lokalizacji samemu.

(Wbudowany lokalizacji w laravel jest tylko dla interfejsu, nie obsługuje on wymowny obiektów)

Odpowiedz

9

Trzeba napisać, że na własną rękę. Najpierw trzeba modelować swoje tabele bazy danych do obsługi wielojęzycznych treści, a następnie w modelu będzie można powiedzieć coś takiego:

class Content extends Eloquent 
{ 

    public function scopeEnglish($query) 
    { 
      return $query->where('language', '=', 'en'); 
    } 

    public function scopeSpanish($query) 
    { 
     return $query->where('language', '=', 'es'); 
    } 
} 


class Post extends Eloquent 
{ 
    public function content() 
    { 
    return $this->hasMany('Content'); 
    } 
} 

i wtedy można go używać jak:

$englishContent = Posts::find($id)->content->english()->get(); 
$spanishContent = Posts::find($id)->content->spanish()->get(); 
6

Glad Pomocna odpowiedź wydaje się idealna dla wielojęzycznej witryny z wieloma językami. Dowiedziałem się, że jest to trochę niestosowne, gdy twoja witryna ma tylko dwa/trzy języki.

To, co zrobiłem, to posiadanie dwóch kolumn dla każdego pola tłumaczenia. dla atrybutu title Mam w bazie danych title_en i title_es. Następnie w sterowniku wystarczy ustawić tę metodę, aby wykonać automatyczne tłumaczenie.

public function getTitleAttribute() 
{ 
    $locale = App::getLocale(); 
    $column = "title_" . $locale; 
    return $this->{$column}; 
} 

Teraz kiedy zadzwonić Post::find($id)->title zostanie ona automatycznie uzyskać jedną dla bieżącego języka.

Mam nadzieję, że to pomaga. Pozdrawiam!

1

Po otrzymaniu odpowiedzi @ user1067281 znalazłem świetny zaawansowany samouczek dla witryny z wieloma językami.

Należy całkowicie to sprawdzić: https://medium.com/laravel-4/26cdc75e4810

+2

Proszę rozważyć dodanie wyjaśnienia, a nie tylko linku. – Onik

+0

Nowość w tym. Dzięki za podpowiedź @Onik –

4

Zrobiłem podobny, ale bardziej uniwersalne

Schema::create('index', function(Blueprint $table) { 
     $table->increments('id'); 
     $table->string('title_uk'); 
     $table->string('title_ru'); 
     $table->string('title_en'); 
     $table->string('heading_uk'); 
     $table->string('heading_ru'); 
     $table->string('heading_en'); 
     $table->string('photo'); 
     $table->timestamps(); 
    }); 

Model

public function TextTrans($text) 
{ 
    $locale=App::getLocale(); 
    $column=$text.'_'.$locale; 

    return $this->{$column}; 
} 

Teraz dla każdej wersji językowej, jak również dla każdego pola nie określi konkretnej funkcji i spowoduje to wszystko:

$text=Index::find('1'); $text->TextTrans('title'); $text->TextTrans('heading');

Powiązane problemy