[php/mysql] meerdere talen

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Ok, ik zit met het volgende: een applicatie waar meerdere talen op moeten gaan draaien.

Mijn opties:

1) een nl.php | eng.php | de.php bestand waar ik een array of constante defineer, aan de hand van de bezoeker het juiste bestand inladen en de inhoud weergeven.

2) er zijn voor elke pagina templates aanwezig. ik kan natuurlijk voor elke taal, voor elke pagina een template-bestand aanmaken waar ik alles netjes intyp.

Beiden leuke oplossingen, maar het probleem gaat wat dieper.
Het gaat om een site waarbij in de database "pakketten" van trainingen worden opgeslagen.
Deze trainingen hebben een naam ( taalafhankelijk ), een omschrijving ( taalafhankelijk ), etc etc.

De koptekst voor zo'n tabel ( naam, omschrijving ) kan ik makkelijk oplossen dmv optie 1, maar dan vervolgens de inhoud van tabel.naam , bv 'pakket 1' , zal voor engels of duits natuurlijk anders worden.

Nu zat ik te denken aan optie 3)
Per record in de tabel pakketten geef een languageID ( die refereert naar een talen tabel )
En dan vervolgens per taal de bijbehorende records te toe voegen.
Dus als opheldering: voorbeeld: 2 talen, 3 pakketten met een naam

languageID : 1 = nl, 2 = eng

idnaamlanguageID
1pakket X1
2pakket Y1
3packet X2
4packet Y2


En dit zou ik dan voor alle data moeten doen, en dat gaat redelijk rap uit de hand lopen denk ik.
Ik schat zo'n 1.500 records met redelijk ingewikkelde data, en dat dan maal het aantal talen...
daar loop ik dan tegenaan... want 1 wijziging zal dus resulteren in heel wat records aanpassen...

Optie 4 ) geen idee dus. ik loop aardig vast op dit punt.

De conclusie uit dit hele verhaal is dan ook dat een applicatie met meerdere talen die gegevens per taal moet kunnen opslaan in 1 database al snel een zooi wordt.

Wie o wie heeft er iets magisch?

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 17:19

Onbekend

...

Je zal ten eerste eigenlijk een soort woordenboek moeten hebben.

Vervolgens maak je 1 vertaaltabel met op elke regel een woord, en elke kolom een bepaalde taal heeft.
Dit kan je ook met zinnen doen, en dan zal je complete vertaalde zinnen in je database moeten opslaan.

Dit is eigenlijk afhankelijk of je een heel dynamische site hebt, of juist een voornamelijk statische site.

Speel ook Balls Connect en Repeat


  • paulh
  • Registratie: Juli 1999
  • Laatst online: 18-09 20:05
Alle standaard teksten vanuit je properties halen.

Dynamische teksten zoals de trainingen die moeten
wel uit de database komen.

Daarnaast zou ik gewoon korte taalcodes (NL, DE, FR, etc)\
gebruiken als ID voor de taaltabel. Dat maakt het veel leesbaarder.

[ZwareMetalen.com] - [Kom in aktie tegen de CO2 maffia]


Verwijderd

Topicstarter
Een woordenboek is een oplossing zoals optie 1, ipv van db gebruik je dan een array of een stel define's.


En NL,ENG,DE gebruiken ipv van een ID kan altijd, dat maakt opzich niet zoveel uit.

Waar ik op vastloop is het volgende:

stel ik doe per taal, per training, een record aanmaken.
een training heeft een id, naampje, aantal herhalingen, en een taal.

Dan zou ik dus een training gaan koppelen aan een gebruiker, dus bv ID 1 voor pakket 1 in het nederlands... en dan is het niet fijn als de gebruikers engels wilt, dan zal de koppeling moeten omzetten naar bv ID 3 voor packet 1 in het engels.

En dan ook nog als voorbeeld de herhalingen, als ik dit voor 3 talen instel op x herhalingen en ik wil het aanpassen naar y herhalingen, zal ik voor alle talen moeten doen.

Ook bij het toevoegen van een taal zal er een gigantische berg data ingevoerd gekopieerd moeten worden...


Er moet toch wel iets van een oplossing zijn om:

- een training data te geven ( herhalingen, zwaarte, etc ) ( taalonafhankelijk, zijn namelijk nummer )
- de data die per taal afhankelijk is ( naam, niveau, etc etc ) apart op te slaan
- bij aanpassen van herhalingen enkel 1 waarde aan te moeten passen
- bij invoeren van een nieuwe taal enkel de naam, niveau etc op te moeten geven, en niet het aantal herhalingen etc ( want die willen we natuurlijk maar 1 keer opgeven )

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 17:19

Onbekend

...

Ik kom er niet echt uit wat je bedoelt.

Ik begrijp nu het volgende:

Elke gebruiker kan heeft een pakket.
Elk pakket bevat trainingen.
Elke training bevat dus een naam, beschrijving e.d.

De gehele site moet in de taal van de gebruiker zijn.


Dan moet je het volgende hebben:
Gebruikers:
Gebruiker IDNaamPakketNRGewenste taal


Pakketten:
Pakket NRTraining 1 ja/neeTraining 2 ja/neeTraining 3 ja/nee


Trainingen:
Training NRNaamOmschrijving


Talen:
TaalConstanteENNEDUFR

In elke tabel verwijs je eigenlijk naar een andere tabel.
De tabellen worden nooit breder als er iets wordt toegevoegt, met uitzondering van de Pakkettentabel. Deze moet met kolommen worden uitgebreidt als je extra trainingen aanmaakt.

Als dit niet is wat je bedoelt, moet je het misschien op een andere (vergelijkbare) manier opschrijven.

Speel ook Balls Connect en Repeat


Verwijderd

Topicstarter
Ok, I go try.

Er zijn een aantal gebuikers die moeten worden gekoppeld aan een training.
Dit is het probleem niet.

Het probleem ligt aan de training, die heeft zowel 'statische/wil-ik-1-keer-defineren' gegevens ( herhalingen, zwaarte ) en 'dynamische/taalafhankelijke' gegevens ( naam, omschrijving )

training
idherhalingenzwaartenaamomschrijving
1312oefening 1bla bla 1
2519oefening 2bla bla 2


De rode gegevens zijn dus afhankelijk van de taal.

Nu zou ik het volgende kunnen doen:

training
idherhalingenzwaartenaamomschrijvingtaalID
1312oefening 1bla bla 11
2312exercise onebla bla one2
3519oefening 2bla bla 21
4519exercise twobla bla two2


Zo heb ik dus per taal een training, enkel het aantal herhalingen en de zwaarte moet ik voor beiden talen ( 1 en 2 ) dubbel defineren. en dat dus niet de bedoeling...

Ik wil naar een situatie toe waar ik een training dmv van een ID kan benaderen, daar vervolgens de statische gegevens ( herhalingen, zwaarte ) en de taalafhankelijke ( naam, omschrijving ) volgens de opgegeven taal binnen haal.

Het gaat er daarna hierom: een gebruiker koppelen aan een training ( dmv van een agenda tabel ofzo, dit maakt verder niet uit )
Ik wil voor de duitser, nederlander en fransman die allen 'training 1' doen, geen ander trainingID opgeven, dus allemaal gewoon trainingID : 1
En niet zoals in mijn grotere tabel voor verschillende talen andere trainingID's mee moeten geven voor eigenlijk de zelfde training.

dus. lang verhaal. hopelijk duidelijk.

  • DoDo
  • Registratie: Juli 2001
  • Laatst online: 20-09 16:22
Kun je niet gewoon:

code:
1
ID | Herhalingen | Zwaarte | NaamNL | OmschrijvingNL | NaamEN | OmschrijvingEN


En dan je select aanpassen op de taal? Of een stored procedure maken waar je taal in meegeeft?

[ Voor 29% gewijzigd door DoDo op 14-02-2008 23:13 ]


Verwijderd

Topicstarter
DoDo, jouw idee voor naamNL, naamENG heb ik inderdaad op dit moment toegepast.

maar dit werkt niet fijn:
- toevoegen/ verwijderen van een taal, complete tabellen alteren
- invoeren van gegevens ( template systeem ) de constante herhaling van naamNL inputveld, naamENG inputveld aanmaken.. en dit bij toevoegen/verwijderen taal...
( zou opzich wel kunnen lukken met een loop door de talen heen, en dan per loop de velden+NL/ENG/etc invullen )

- bij 20 talen en 25 waardes wordt je tabel errug groot... toch al gauw zo'n 500 kolommen... :|

[ Voor 11% gewijzigd door Verwijderd op 14-02-2008 23:23 ]


  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Je maakt een tabel trainingen:
TrainingID, blabla, TaalIndex

Dan maak je een tabel Engels
TaalIndex, Naam, Omschrijving, bla bla.

Als een gebruik registreerd leg je vast welke taal hij wilt, en die houd je aan.

SELECT * FROM Trainingen LEFT JOIN $lang ON trainingen.taalindex = $lang.TaalIndex.

Om het maar simpel te zeggen dan.

  • Bitage
  • Registratie: April 2006
  • Laatst online: 19-05-2024
Misschien Q'n'D, maar kun je niet gewoon met bijvoorbeeld .htaccess en mod_rewrite bepaalde links laten doorverwijzen naar de setup bestand. Dus http://jouwsite.eu/download/en/setup_en.exe (intern) laten doorverwijzen naar de meest recente versie ervan. Of anders wat parameters doorsturen naar een PHP script die via een query en een HTTP header doorverwijst naar de meest recente versie?

Mijn idee:[list=1]• URL laten doorverwijzen naar script• Script query'en naar meest recente bestand• Script header laten sturen neer de browser naar de locatie van het meest recente bestand
code:
1
2
3
4
5
6
7
# .htaccess

RewriteEngine ON
RewriteBase /

# Zal bv. de URL "/download/en/setup_en.exe" doorverwijzen naar "/download.php?lang=en"
RewriteRule ^download/(.*)/(.*)$ download.php?lang=$1 [L]


MySQL:
1
2
3
4
5
-- Tabel structuur voor 'download_files'

id int(11) NOT NULL auto_increment primary key,
langID varchar(2) NOT NULL,
location text NOT NULL


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
// download.php

// Connectie maken met DB
require('connect.php');

// Query'en naar meest recente versie van het pakket in de gekozen taal
$query = mysql_query("SELECT location FROM download_files WHERE langID = '".$_GET['lang']."' ORDER BY id DESC LIMIT 1");
$latest = mysql_result($query,0);

// HTTP 'Location' header naar de browser sturen
// $latest bevat string, zoals bv.: "/files/en/setup_v.1.2.3alfabeta.exe"
header('Location: '.$latest);

[ Voor 7% gewijzigd door Bitage op 15-02-2008 00:21 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@ bitage, ik neem aan dat je een reply stuurde op een ander topic?

@ megamind

De simpele oplossingen zijn meestal heel erg doeltreffend.
wat ik nu heb geknutseld:

talen
idnaam
1nederlands
2english


traingen
idherhalingenzwaarte
13423
2377263


trainingen_lang
idtrainingIDtaalIDnaam
111training een
212exercise one


en dan een selectje met een join:

SELECT * FROM training LEFT JOIN training_lang ON training.id = training_lang.trainingID WHERE training_lang.taalID = 'x'

waar x de gewenste taal is...

schijnt vooralsnog goed te werken.. ik slaap er even een nachtje over
en dan morgen kijken of dit geen gekke dingen gaat opleveren....

dank :)

Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 18:07
Ik ben ook bezig met een meertalige website. Ik heb nu:
  • een object tabel voor informatie die voor elk brokje content hetzelfde is (object id,aanmaakdatum, gepubliceerd ja/nee, wijzigdatum, gebruiker etc etc)
  • per type content (nieuws,project, tekstpagina) een tabel met de specifieke velden die bij dat type content horen (bv nieuws heeft een object id, titel, samenvatting en een body). Velden die meertalig zijn bevatten geen tekst maar een ID dat verwijst naar...:
  • een tabel text (object_id,content_id,taal,content) die de eigenlijke vertaalde teksten bevat.
Jouw oplossing plaatst alle teksten in een tabel per type informatie (dus tabel nieuws heeft een tabel nieuws_lang). Dat kan ook. Ik heb gekozen voor 1 tabel om full text search makkelijk te maken.

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 20-09 23:58

TeeDee

CQB 241

Het is niet zozeer een simpele oplossing: het is een fatsoenlijke, genormaliseerde oplossing.

De oplossing van bijv. DoDo is leuk, handig en bovenal schattig. Totdat er iemand beslist: hee, we gaan ook Duitse trainingen geven. Zit je met halfbakken datamodel.

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • DamadmOO
  • Registratie: Maart 2005
  • Laatst online: 19-09 19:31
Verwijderd schreef op vrijdag 15 februari 2008 @ 00:18:
schijnt vooralsnog goed te werken.. ik slaap er even een nachtje over
en dan morgen kijken of dit geen gekke dingen gaat opleveren....
Ik zou nog een tabel toevoegen tussen talen en trainingen met daarin de naam. Dan hoef je dat ook nooit meer handmatig of in je business code op te slaan. En mocht een training dan opeens een andere naam krijgen kan je dat ook zo aanpassen.

Acties:
  • 0 Henk 'm!

  • moozzuzz
  • Registratie: Januari 2005
  • Niet online
Een poging:

Taal
idtaal
1nederlands
2english


Training
idgegevens
1...
2...


TrainingText
idtrainingtaalproperty / textbody
111nametraining een
212nameexercise one
311descriptionEen training over ...
412descriptionA training about ...


Op zich lijkt me het ondehoud overigens geen zo'n groot probleem, kwestie van de backoffice te laten werken :^)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@rutgerw : dat is ook een oplossing, weet nog niet of ik het apart ga doen of op jouw manier.

@TeeDee : ik doelde met simpel op het feit dat er slechts 3 tabellen nodig zijn, na wat brainstorm activiteiten gister over dit probleem kwam ik al snel op 6+ tabellen uit.
Het is inderdaad netjes genormaliseerd.

@DamadmOO : ik snap niet precies wat je bedoelt? een extra koppel tabel erbij? wat zou ik hiermee bereiken? wellicht een voorbeeldje voor opheldering?


[edit]
@ moozzuzz : dit is inderdaad het voorbeeld met 1 taal-tabel ipv van meerdere taal-tabellen per training, sport, etc, etc-tabel.

thanks

[ Voor 13% gewijzigd door Verwijderd op 15-02-2008 13:44 ]


Acties:
  • 0 Henk 'm!

  • DamadmOO
  • Registratie: Maart 2005
  • Laatst online: 19-09 19:31
Verwijderd schreef op vrijdag 15 februari 2008 @ 13:30:
@DamadmOO : ik snap niet precies wat je bedoelt? een extra koppel tabel erbij? wat zou ik hiermee bereiken? wellicht een voorbeeldje voor opheldering?
Negeer mijn vorige post maar. Ik had de tabellen anders geintepreteerd dan dat ze daar stonden :P

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Persoonlijk zou ik eerder gaan voor een

Zinnen:
IDTextIDTaalIDBody
111Zinnetje 1
212Sentence One
321Zinnetje 2
422Sentence Two
531klik hier om uit te loggen
632click here to log out


En dan voor training:
Training
idgegevensTextID
1...1
2...2


Hierdoor zou je in principe alle zinnen die van taal veranderen in de tabel kunnen stoppen. Dus ook de text voor uitloggen.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat is inderdaad geen slechte oplossing.
Morgen ga ik weer aan het werk hiermee, dus als dat allemaal beetje werkt post ik hier wel mijn bevindingen :-)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
iets later dan gepland. maar....

ik ben er mee bezig geweest en heb meteen een deel in de applicatie kunnen verweven.
het gaat nu te werk met 2 tabellen. training en training_lang waar in de eerste de statische-niet-taal-afhankelijk-gegevens staan en in de laatste de taal-afhankelijke-gegevens met een referentie naar de eerste tabel en naar de taal tabel :-)

dus. dank allen voor uw input :)
Pagina: 1