Probleempje met het localizeren van teksten in Laravel

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jorn Reed

Jorn Reed

29/06/2020 17:40:19
Quote Anchor link
Hoi allemaal,

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?
 
PHP hulp

PHP hulp

19/03/2024 11:33:37
 
- Ariën  -
Beheerder

- Ariën -

29/06/2020 18:54:48
Quote Anchor link
Als ik op Localization routes Laravel zoek kom ik een hoop dingen tegen.
Gewijzigd op 29/06/2020 18:55:19 door - Ariën -
 
Jorn Reed

Jorn Reed

29/06/2020 19:20:29
Quote Anchor link
Ik had er ook al veel gezien, de meeste plakken er alleen /en /nl voor in de routes maar met puur laravel kan dat al

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
 
- Ariën  -
Beheerder

- Ariën -

29/06/2020 21:17:10
Quote Anchor link
Met welke reden wil je geen taal in de URL?

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 -
 
Thomas van den Heuvel

Thomas van den Heuvel

29/06/2020 23:05:12
Quote Anchor link
Misschien is het handiger om je te verdiepen in de "best practises" van meertalige sites, zonder je in eerste instantie te committeren tot het gebruik van een bepaalde techniek.

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.
 
Jorn Reed

Jorn Reed

30/06/2020 21:29:39
Quote Anchor link
Dat er bijvoorbeeld `/en/contact` staat is geen probleem, maar stel je hebt `/en/over-ons` dan zie je in de url wel "oh dit is een engelse pagina" alleen is de naam van de pagina nog in het nederlands in de url.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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();
}


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?
 
Gerhard l

gerhard l

03/07/2020 12:30:18
Quote Anchor link
Wellicht zoiets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
// Last post_id + 1
$oLatestPost = Post::order_by('post_id', 'desc')->first();
$iPostId = $oLatestPost ? $oLatestPost->post_id + 1 : 1;

// ...
$post->post_id = $iPostId;
$post->save();
 
Thomas van den Heuvel

Thomas van den Heuvel

03/07/2020 15:54:49
Quote Anchor link
Het bovenstaande is een handmatige implementatie van een auto-increment id?

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.
 
Gerhard l

gerhard l

03/07/2020 16:54:10
Quote Anchor link
Soort van, je genereert eenmalig een ID wat je bij meerdere Posts tegelijk kan opslaan, op basis van de vraag van OP.

Maar een overkoepelende entiteit is wel netter, zeker als je Post later verder gaat uitbreiden met attributen die niet afhankelijk zijn van een taal.
 
Jorn Reed

Jorn Reed

05/07/2020 23:09:59
Quote Anchor link
Ik had als advies gekregen, dat als ik een vertaling wil aanmaken dat je automatisch ook de post zelf maakt, dus dat je dan dit doet
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
}
In het voorbeeld ontbreekt wel de validatie, maar ik vroeg me af of dit de juiste manier is om een oneToMany relatie op te slaan? Post zelf heeft alleen een auto_increment id en timestamps. dus vandaar dat de create functie geen parameters heeft.

Toevoeging op 06/07/2020 01:26:54:

Heb dit zo werkend gekregen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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');
    }

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
$post = new Post();
$data = $this->validate();
$post->translations()->save($data);
 
Jorn Reed

Jorn Reed

08/07/2020 16:19:34
Quote Anchor link
Ik heb nu:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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());


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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
public function show(Post $post){
...
}

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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.