2013-09-30 15 views
6

Sto creando un'app con un backend in Laravel. Il back-end deve gestire una raccolta di oggetti che vengono scaricati nell'app. Gli oggetti devono essere localizzati in base alla lingua del dispositivo.Gestione di database multilingua con Laravel

C'è un modo semplice per farlo in Laravel? Forse un eloquente o plugin per Laravel? Mi piacerebbe evitare di scrivere da solo il supporto per la localizzazione.

(il costruito nel localizzazione in laravel è solo per l'interfaccia, che non supporta gli oggetti eloquenti)

risposta

9

Sarà necessario scrivere che da soli. In primo luogo si dovrà modellare le tabelle del database per supportare il contenuto multilingue e poi nel vostro modello si sarà in grado di dire qualcosa del tipo:

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'); 
    } 
} 

e quindi è possibile utilizzarlo come:

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

Glad La risposta di Help sembra perfetta per i siti multilingue con molte lingue. Ho scoperto che è abbastanza goffo farlo quando il tuo sito ha solo due/tre lingue.

Quello che ho fatto è avere due colonne per ogni campo traducibile. per l'attributo title che ho nel database title_en e title_es. Dopodiché, nel controller basta impostare questo metodo per eseguire una traduzione automatica.

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

Ora, quando si chiamano Post::find($id)->title otterrà automaticamente quello per la lingua corrente.

Spero che aiuti. Cheers!

1

In seguito alla risposta @ user1067281 ho trovato un ottimo tutorial avanzato per il sito multilingue.

Si dovrebbe assolutamente controllare questo fuori: https://medium.com/laravel-4/26cdc75e4810

+2

Si prega di aggiungere una spiegazione, non solo un collegamento. – Onik

+0

Nuovo per questo. Grazie per il suggerimento @Onik –

4

ho fatto simile, ma più universale

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(); 
    }); 

Il modello

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

    return $this->{$column}; 
} 

Ora per ogni versione linguistica, così come per ogni campo non prescriverà una funzione specifica e causerà tutto questo:

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