Opzet meerdere talen uit database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Crispijn -

Crispijn -

27/09/2006 23:28:00
Quote Anchor link
Ha allemaal,

Ik ben bezig een site te vernieuwen en ik wil er graag een cms achter hangen zodat de site door meerdere mensen onderhouden kan worden.

Alle tekst moet dus uit de database gehaald worden. Geen probleem. Alleen nu moet alle content in minimaal 2 talen gepubliceerd worden.

Nu heb ik zitten denken hoe ik de tabellen het beste kan indelen alleen ik ben er nog niet over uit. Qua overzicht is dit het makkelijkst:

id|nltitel|nlcontent|detitel|decontent|entitel|encontent

maar is het toch verstandig om te kiezen voor iets anders? en zoja, dat dan precies?

Ik ben benieuwd naar jullie suggesties
 
PHP hulp

PHP hulp

18/11/2024 12:45:17
 
M Ypma

M Ypma

27/09/2006 23:32:00
Quote Anchor link
ik zou de talen als ik jou was in apparte tabbelen houden...
 
Crispijn -

Crispijn -

27/09/2006 23:38:00
Quote Anchor link
dus een tabel nl, een tabel de en bijvoorbeeld een tabel en?

Dan ook nog een speciale tabel om de boel te linken? menu-item en bijbehorend taal id voor de betreffende content?
 
Robert Deiman

Robert Deiman

27/09/2006 23:39:00
Quote Anchor link
Wat het gemakkelijkst te doen is, is voor elke taal een andere tabel aanmaken, waarom -> Stel dat je ooit Frans als taal toe wilt voegen, dat is niet gemakkelijk bij de huidige opzet.

Stel je hebt een pagina nieuws.php, die uit de tabel nieuws wat op zou halen, de gebruiker heeft als taal Engels (en) ingesteld, de taalsessie variabele heb je opgeslagen in $taal. (bevat dus en)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?
$table
=$taal.'nieuws';
$query = "SELECT * from $table";
?>


Qua onderhoud is het gemakkelijker, je houd nog veel meer overzicht, omdat niet alle talen bij elkaar in die 1e tabel staan.

(wanneer je wilt gaan bewerken, kan je ook voor elke taal een tekstvak maken, als je de talen in een array hebt staan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$talen
=array("nl","en","de");
$editpage=$_GET['edit'];//bevat de naam van de te bewerken tabel
foreach($talen as $tekstlang){
  $createlang=$tekstlang.$editpage;
  echo '<textarea name="'.$createlang.'"></textarea>';
  }

?>


Snap je het?

Edit:
typo
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
 
Crispijn -

Crispijn -

27/09/2006 23:44:00
Quote Anchor link
Ik snap het. Alleen dit niet:

Quote:
(wanneer je wilt gaan bewerken, kan je ook voor elke taal een tekstvak maken, als je de talen in een array hebt staan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$talen
=array("nl","en","de");
$editpage='$_GET['edit'];//bevat de naam van de te bewerken tabel
foreach($talen as $tekstlang){
  $createlang=$tekstlang.$editpage;
  echo '
<textarea name="'.$createlang.'"></textarea>';
  }

?>



Snap je het?


En: Ik moet er dan dus wel op een een of andere manier voor zorgen dat altijd de juiste tekst wordt opgehaald wanneer een menuitem gekozen wordt. Ik MOET er dus voor zorgen dat de id's van de content van elke taal hetzelfde is, of moet ik dit nog netjes aan elkaar koppelen met een aparte tabel?
 
Robert Deiman

Robert Deiman

27/09/2006 23:50:00
Quote Anchor link
het scriptje wat je niet snapt, maakt op je edit pagina, waar je in je url de naam hebt van de te bewerken tabel, bijvoorbeeld [taalnaam]."nieuws". (alleen nieuws staat dan in de url, omdat die alle talen moet kunnen bewerken he ;)

Stel je hebt http://url.nl/?edit=nieuws

Dan maakt die voor elke taal een aparte textarea aan, waarin je dan nieuws kan toevoegen in een taal. ;)

(hoop dat dat wat duidelijker is)


VRAAG 2:
Neej, niks geen gekoppel, je tabelopzet is voor de talen overal hetzelfde (in nieuws verwacht ik bijv wel een datumveld)
Elke tabel, is dan hetzelfde als het origineel, alleen bevat het een andere taal..

Jouw voorbeeld er even bij pakkende:

id|nltitel|nlcontent|detitel|decontent|entitel|encontent

zou dan zo worden (caps -> tabeltitel):
NLTITEL
id|titel|content

ENTITEL
id|titel|content

DETITEL
id|titel|content
 
Crispijn -

Crispijn -

27/09/2006 23:56:00
Quote Anchor link
Hmmm, oke. Ik kan dan dus ook per taal een UPDATE query uitvoeren en kijken wie wanneer het laatst geupdate heeft.

Dat heeft voordelen inderdaad. Wel is het dan noodzaak dat elke content hetzelfde id heeft maar dat tegen te gaan/op te lossen.

Bedankt Robert! Ik ga even wat opzetten!
 
M Ypma

M Ypma

28/09/2006 00:00:00
Quote Anchor link
om op je site bij te houden welke taal hij steeds moet gebruiken kan je gebruik maken van $_SESSION['lang'] waarin je de taal zet.
en als je van taal wil switchen vervang je dan simpelweg de waarde in die session
 
Robert Deiman

Robert Deiman

28/09/2006 00:03:00
Quote Anchor link
Crispijn:
Hmmm, oke. Ik kan dan dus ook per taal een UPDATE query uitvoeren en kijken wie wanneer het laatst geupdate heeft.

Dat heeft voordelen inderdaad. Wel is het dan noodzaak dat elke content hetzelfde id heeft maar dat tegen te gaan/op te lossen.

Bedankt Robert! Ik ga even wat opzetten!


Wat is dat toch met de ID? Als je ervoor zorgt dat je bij een aantal dingen een datum hebt staan.. en als je voor de links wil, zorg dan dat je overal een naam hebt voor die link (bijvoorbeeld home, of pics) die in elke tabel weer hetzelfde is, dat scheelt onderhoud.. VEEL onderhoud..
 
Robert Deiman

Robert Deiman

28/09/2006 00:05:00
Quote Anchor link
Overigens:

Als je na de 1e update dit doete

$id=last_insert_id();
(ik geloof dat het zo was)
dan kan je $id gebruiken om die andere tabellen te maken ;)
 
Klaasjan Boven

Klaasjan Boven

28/09/2006 08:03:00
Quote Anchor link
Robert:
Overigens:

Als je na de 1e update dit doete

$id=last_insert_id();
(ik geloof dat het zo was)
dan kan je $id gebruiken om die andere tabellen te maken ;)


Volgens mij heet het
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
mysql_insert_id()
?>
Gewijzigd op 01/01/1970 01:00:00 door Klaasjan Boven
 
Robert Deiman

Robert Deiman

28/09/2006 09:52:00
Quote Anchor link
Dank klaasjan, dit was uit mijn hoofd, maar het is inderdaad mysql_insert_id();
 
Crispijn -

Crispijn -

04/10/2006 16:10:00
Quote Anchor link
Ik ben nu bezig met het deel dat ik nieuwe teksten kan toevoegen.

Ik kan het al prima in één tabel prakken alleen nu wil ik het graag in twee tabellen tegelijk zetten. Ik heb het volgende gedaan alleen dan krijg ik een foutmelding:

databases:

content_nl
content_de

query:

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
16
17
18
19
20
<?php

$sql_nc
= "INSERT INTO content_nl AND content_de
            (
                id,
                titel,
                content,
                last_date,
                user
            )
            VALUES
            (
                '',
                '$titel',
                '$tekst',
                NOW(),
                '"
.$_SESSION['ID']."'
            )
            "
;
?>


Op deze manier kan ik dus de id's overal het zelfde houden van de nederlandse, en duitse content.

Wie o wie?

edit: typo in query
Gewijzigd op 01/01/1970 01:00:00 door Crispijn -
 
Robert Deiman

Robert Deiman

04/10/2006 16:36:00
Quote Anchor link
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
16
17
18
19
20
21
22
23
<?php
$tables
=array('content_nl','content_de');

foreach($tables as $inserttable){

$sql_nc = "INSERT INTO ".$inserttable."
            (
                id,
                titel,
                content,
                last_date,
                user
            )
            VALUES
            (
                '',
                '$titel',
                '$tekst',
                NOW(),
                '"
.$_SESSION['ID']."'
            )
            "
;
?>
 
Frank -

Frank -

04/10/2006 16:37:00
Quote Anchor link
taal:
id
iso_code

tekst
id
id_taal (foreignkey met tabel taal)
titel
tekst
etc

koppeltabel:
id_tekst_origineel(foreignkey met tabel tekst)
id_tekst_vertaling (foreignkey met tabel tekst)
UNIQUE (id_tekst_origineel, id_tekst_vertaling)

Met dit datamodel kun je het aantal talen onbeperkt uitbreiden zonder dat je ooit een wijziging in het datamodel hoeft te maken. Alle teksten (in de verschillende talen) staan in 1 tabel, die zijn gekoppeld aan de taal en via de koppeltabel aan elkaar zijn gekoppeld. Zo kun je zien dat record 1 (nl) bij record 23 (engels) en record 48 (russisch) hoort.

Wil je het goed doen, zorg dan ook voor een constraint die een verband legt tussen de taal, het origineel en de vertaling. Dan kun je nooit 1 origineel krijgen met 2 vertalingen in dezelfde taal.

Uiteraard gebruik je de innoDB-engine van MySQL of stap je over op PostgreSQL.
 
Crispijn -

Crispijn -

04/10/2006 16:43:00
Quote Anchor link
Hmm, de site hoeft maar in 2 talen te verschijnen. Ik heb de oplossing nu gevonden en ik kan hier goed op doorborduren.

Ik ga je oplossing nog wel even doorspitten frank! Ziet er iig profi uit :D
 
Frank -

Frank -

04/10/2006 16:53:00
Quote Anchor link
Quote:
Ik ga je oplossing nog wel even doorspitten frank! Ziet er iig profi uit :D
Zo profi is het niet, wanneer je gaat normaliseren kom je gewoon op dit model uit. Weinig keuze dus.

Het gegeven 'titel' sla je op in de kolom 'titel'. Dat de tekst in verschillende talen kan worden genoteerd, staat daar los van. Wanneer je 'titel' zou vervangen door 'voornaam', ga je toch ook niet voor iedere verschillende voornaam een andere tabel aanmaken?

En dat er dankzij de vertalingen een verband zit tussen de verschillende records, dat los je standaard op met een koppeltabel. Wanneer je 2 personen met elkaar zou willen verbinden, bv. spelers in een elftal, dan los je dat ook op met een koppeltabel.

Kortom, het zijn standaard oplosingen. Tevens heeft het tot voordeel dat de database sneller is te doorzoeken. Je gebruikt tenslotte minder kolommen met dezelfde soort gegevens waardoor de indexen efficienter worden gebruikt.
 
Crispijn -

Crispijn -

04/10/2006 16:57:00
Quote Anchor link
@Frank

Klopt. Hier zat ik ook aan te denken. Vandaar ook mijn eerste posts. Toen werd 't me afgeraden het met koppeltabellen te doen...

Ik moet toegeven dat ik in eerste instantie dacht aan de oplossing voor elke taal een tabel maar toen kwam die tutorial over het normaliseren en begon ik te twijfelen. Ik zie dat ik me daar toch eens wat meer in moet verdiepen.

Maar zoals net gezegt werd Frank, dat je met een 1 taal 1 tabel oplossing minder onderhoud hebt t.o.v. jouw oplossing >>> Klopt dat dan ook?
 
Frank -

Frank -

04/10/2006 17:21:00
Quote Anchor link
Ik zie niet in wat het probleem met onderhoud is, hooguit dat de opzet van Robert juist meer onderhoud vereist. In zijn opzet kun je onmogelijk een extra taal in de database wegschrijven en vervolgens de vertalingen gaan inkloppen. Hij zal eerst een nieuwe release van zijn script moeten gaan schrijven voordat een extra taal kan worden geintroduceerd. Dat lijkt mij niet de meest handige opzet.

De opzet die ik je heb gegeven, geeft je de mogelijkheid om een nieuw record toe te voegen aan de tabel 'taal' en klaar is kees. Daarmee krijg je direct de mogelijkheid om nieuwe vertalingen aan te maken en deze te koppelen aan de bestaande teksten. Tegen de tijd dat hij klaar is met zijn script, heb jij alle vertalingen al klaar...
 
Crispijn -

Crispijn -

04/10/2006 17:52:00
Quote Anchor link
Klopt, dat is zeker een feit dat waar is. Wat ik al zei, ik ga me er in verdiepen.

Bedankt iig voor je uitleg. Het wonder 'normaliseren' begint me steeds duidelijker te worden!

Cris
 
Robert Deiman

Robert Deiman

04/10/2006 18:00:00
Quote Anchor link
Frank:
Ik zie niet in wat het probleem met onderhoud is, hooguit dat de opzet van Robert juist meer onderhoud vereist. In zijn opzet kun je onmogelijk een extra taal in de database wegschrijven en vervolgens de vertalingen gaan inkloppen. Hij zal eerst een nieuwe release van zijn script moeten gaan schrijven voordat een extra taal kan worden geintroduceerd. Dat lijkt mij niet de meest handige opzet.

De opzet die ik je heb gegeven, geeft je de mogelijkheid om een nieuw record toe te voegen aan de tabel 'taal' en klaar is kees. Daarmee krijg je direct de mogelijkheid om nieuwe vertalingen aan te maken en deze te koppelen aan de bestaande teksten. Tegen de tijd dat hij klaar is met zijn script, heb jij alle vertalingen al klaar...


Frank, ik heb het allemaal een beetje gevolgd, ik moet zeggen dat jouw oplossing inderdaad een hele goede is. (veel beter dan die van mij)
Het toevoegen van een nieuwe taal is helemaal niet zoveel werk als je voor doet komen, maar het is bij jouw opzet nog veel gemakkelijker.. AND THAT'S THE POINT!! :)

DAnkjewel Frank voor deze oplossing.
 



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.