Ich habe die ganze Zeit überlegt, wie ich Laravel Eloquent Mehrsprachigkeit beibringen kann. Wer mit Laravel eine internationale Seite umsetzen will, der kennt das Problem. In der Datenbank sind Informationen, die noch zu übersetzen sind. Doch wie funktioniert das eigentlich? Muss ich für jeden Eintrag in der Datenbank auch einen Eintrag in einer Übersetzungsdatei eintragen?
Nein, mit einem Trait für Laravel von Spatie, einer Agentur in Belgien, wird das total einfach. Dabei werden die Übersetzungen als Json gespeichert und zwar ohne zusätzliche Tabelle oder Tabellenfelder.
Laravel Eloquent Mehrsprachigkeit in wenigen einfachen Schritten
Ich benutze dazu Laravel 5.7.22 und erstelle ein neues Projekt
composer create-project laravel/laravel spatie-laravel-translatable
cd spatie-laravel-translatable
composer require spatie/laravel-translatable
php artisan serve
Und die Fallback Sprach Konfiguration kopieren:
php artisan vendor:publish --provider="Spatie\Translatable\TranslatableServiceProvider"
Dort steht dann 'fallback_locale' => 'en',
drin. Wenn du als Ausgangssprache Deutsch benutzt, dann kannst du hier auch de eintragen. Grundsätzlich ist es bei mehrsprachigen Anwendungen aber wohl besser Englisch als Hauptsprache zu nutzen. Schliesslich versteht das dann auch so ziemlich jeder. Auch ohne Übersetzung.
Da ich gerade selbst einen WordPress Clone für mich entwickle, passt das Thema eigentlich ganz gut.
Ich erstelle jetzt eine Post Model mit:
php artisan make:model Post -m
Jetzt habe ich das Model und die Datenbank Migration. In der .env setze ich die Datenbank Verbindung auf sqlite.
DB_CONNECTION=sqlite
Den Rest der DB_ Einträge entferne ich. Dann noch die /database/database.sqlite anlegen.
touch database/database.sqlite // Mac OS und Linux
type nul > database/database.sqlite // Windows
Ich öffne das Model unter /app/Post.php und füge den Trait ein
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Spatie\Translatable\HasTranslations;
class Post extends Model
{
use HasTranslations;
public $translatable = ['title'];
}
Der title soll in meinem Fall übersetzbar sein.
In die Migrationsdatei des Post Models das title Feld hinzufügen.
Schema::create('posts', function (Blueprint $table) {
...
$table->string('title');
...
});
Und mit php artisan migrate
die Datenbank und alle Tabellen erstellen.
Die Magie beginnt
Jetzt kommen wir langsam zur Magie dieser Komponente.
Zu Testzwecken erstelle ich in /routes/web.php eine Dummy Route um die erste Übersetzung einzufügen.
Route::get('/preparetranslation', function() {
$translations = [
'en' => 'Laravel Beginner Tutorial',
'de' => 'Laravel Anfänger Tutorial'
];
$post = new App\Post();
$post->setTranslations('title', $translations);
$post->save();
});
Ich rufe das Projekt jetzt mit http://localhost:8000/preparetranslation auf und bekomme eine weiße Seite. Das ist so gewollt.
Jetzt passe ich noch die andere Route an.
Route::get('/', function () {
$post = App\Post::first();
echo $post->title;
});
Jetzt http://localhost:8000 aufrufen und es erscheint:
Laravel Beginner Tutorial
Wenn ich jetzt in der /config/app.php die locale ändere
'locale' => 'de',
und die Seite noch mal aufrufe, erhalte ich
Wie geil und einfach ist das denn?
Ich werde diese Komponente auf jeden Fall mal näher anschauen. Das ist echt cool. Und diese Laravel Eloquent Mehrsprachigkeit hat mir noch bei meinem Blog Projekt gefehlt.
Danke an Freek Van der Herten und seinen Twitter Post.
Store your translations as json in the db using laravel-translatablehttps://t.co/hGW19mpsrT pic.twitter.com/4LlWfudCZf
— Freek Van der Herten (@freekmurze) 11. Januar 2017
Wenn dir dieser kleine Tipp gefallen hat, dann hinterlass doch einfach einen Kommentar. Ich freue mich. Hast du noch nicht so viel mit Laravel gemacht? Vielleicht kann ich dich für mein Laravel 5 Anfänger Tutorial begeistern.
Coole Sache !
Ich kannte das Package gar nicht , wird auf jeden Fall eingesetzt !
Genau was ich gesucht hatte. Danke!
Aber warum muss die DB-Verbindung auf sqllite und nicht auf mysql gesetzt sein?
Ich benutze gerne die SQLite Datenbank, weil es für Tutorials einfacher ist. Da brauche ich nur eine Datei anlegen und kann direkt loslegen. Nicht immer ist lokal ein MySQL Server vorhanden. Im Produktivsystem setze ich allerdings dann auch auf MySQL.
Hallo Dirk,
ich nutze sonst stets Codeignator. Und habe mir heute mal Dein Tutorial reingezogen. Es ist gut und es hat spaß gemacht. Nun werde ich mal testweise (versuchen) ein altes projekt von mir mit laravel umsetzen.
Ich bin echt einwenig begeistert von dem was ich bis jetzt gelesen haben. coole sache 🙂