Probleempje met het localizeren van teksten in Laravel
Sinds vandaag gebruik ik de standaard functionaliteit van Laravel Localization.
Werkt prima zoals dat moet, ipv json bestanden gebruik laravel gewoon php bestanden in mapjes per landcode. En kan ik in de html gewoon `{{ __('message.welcome') }}` doen wat in NL bijvoorbeeld `Hallo` is en in het EN 'Hello'.
Je kan gewoon heel makkelijk laten bepalen welke taal de pagina moet laden door na bijvoorbeeld `/contact`,`/{locale}` te zetten. Contact is een beetje een slecht voorbeeld, maar wat nou als ik de pagina heb, Over ons, in het Engels moet het dan About Us zijn in de url dus over-ons word dan about-us. Heeft iemand enig idee hoe ik dus urls kan vertalen?
Localization routes Laravel zoek kom ik een hoop dingen tegen.
Als ik op Gewijzigd op 29/06/2020 18:55:19 door - Ariën -
Toevoeging op 29/06/2020 19:23:56:
Want ik wil van /about /over-ons maken en niet /nl/about als je begrijpt wat ik bedoel
En wat je wilt is nu nog niet zo heel speciaal? Je maakt gewoon gebruik van dezelfde route. Maar hoe ga je dat dan met /contact doen?
Gewijzigd op 29/06/2020 21:18:14 door - Ariën -
Je zou het eigenlijk om moeten draaien: kijk eerst wat het beste werkt / hoe anderen dit aanpakken, en zoek dan (pas) een technische oplossing/implementatie hiervoor.
Toevoeging op 30/06/2020 22:11:15:
Heb alles werkend gekregen met een package via composer, werkt super fijn!
Toevoeging op 01/07/2020 18:04:52:
Het vertalen van de data en urls etc. Is gelukt, nu kom ik alleen aan op een ander puntje. Stel je site is in het engels en in het nederlands. dan wil ik dat je met 1 html formulier een bericht in beide talen kan invullen. Met laravel ziet dat er dan zo uit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
public function store(Request $request){
$post = new Post();
$post->lang = 'NL';
$post->name = $request->name_nl;
$post->text = $request->text_nl;
$post->save();
$post = new Post();
$post->lang = 'EN';
$post->name = $request->name_en;
$post->text = $request->text_en;
$post->save();
}
$post = new Post();
$post->lang = 'NL';
$post->name = $request->name_nl;
$post->text = $request->text_nl;
$post->save();
$post = new Post();
$post->lang = 'EN';
$post->name = $request->name_en;
$post->text = $request->text_en;
$post->save();
}
Zodat elke vertaling zijn eigen rij in de database tabel heeft. Ze krijgen standaard van laravel wel een uniek id per rij mee, maar ik wil iets van een post_id maken, die voor zowel engels en nederlands hetzelfde is, zodat ik aan de hand van een query met het post id en lang code het juiste bericht in de juiste taal tevoorschijn tover.
Maar hoe zorg ik er voor dat hij bijvoorbeeld bij de allereerste post een id aan beide talen meegeeft, en bij de volgende keer dat je wat toevoegt, dat het dan weer verder telt?
Maak gewoon een overkoepelende entiteit als placeholder voor de verschillende talen? Dit is de kapstok waar je dan de artikelen/posts in een specifieke taal aan ophangt.
Maar een overkoepelende entiteit is wel netter, zeker als je Post later verder gaat uitbreiden met attributen die niet afhankelijk zijn van een taal.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
public function store(Request $request){
$post = Post::create();
$data = [
'title' => $request->title,
'content' => $request->content,
'lang_id' => $request->lang_id,
'post_id' => $post->id,
];
Translation::create($data);
}
$post = Post::create();
$data = [
'title' => $request->title,
'content' => $request->content,
'lang_id' => $request->lang_id,
'post_id' => $post->id,
];
Translation::create($data);
}
Toevoeging op 06/07/2020 01:26:54:
Heb dit zo werkend gekregen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public function store(Request $request)
{
$post = Post::create();
$validatedData = $this->validatedData();
$translation = new PostTranslation();
$translation->post_id = $post->id;
$translation->lang_id = $request->lang_id;
$translation->title = $request->name;
$translation->content = $request->text;
$translation->save();
return redirect('/posts');
}
{
$post = Post::create();
$validatedData = $this->validatedData();
$translation = new PostTranslation();
$translation->post_id = $post->id;
$translation->lang_id = $request->lang_id;
$translation->title = $request->name;
$translation->content = $request->text;
$translation->save();
return redirect('/posts');
}
Kan deze code eventueel ook nog netter?
Toevoeging op 06/07/2020 13:45:15:
Ik had ook nog begrepen dat dit alles korter kan, iets in deze richting?
Code (php)
1
2
3
4
5
2
3
4
5
//maakt een post aan met id em timestamps
$post = Post::create();
//maakt een vertaling aan gekoppeld aan de zojuist gemaakte post
$post->translations()->create($this->validateData());
$post = Post::create();
//maakt een vertaling aan gekoppeld aan de zojuist gemaakte post
$post->translations()->create($this->validateData());
Nu kan ik dus een vertaling aanmaken, en eventueel één extra toevoegen aan een post met het zoeken naar het juiste post id.
Nu vraag ik me af, ik kan in de html heel makkelijk de vertalingen oproepen per post door `$post->translations` te foreachen. Maar als ik bijvoorbeeld
heb. Hoe zorg ik er dan voor dat aan de hand van de juiste locale (actieve taal op de pagina). De juiste vertaling wordt getoond? PS. Ik gebruik https://github.com/mcamara/laravel-localization voor vertalingen, misschien dat ik iets met een bepaalde variabel in de controller de juiste taal kan ophalen uit de database om zo de juiste vertaling te pakken?
Gewijzigd op 08/07/2020 16:26:12 door Jorn Reed