[Alg] Generiek multi-language systeem

Pagina: 1
Acties:
  • 214 views sinds 30-01-2008
  • Reageer

  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Ik moet een applicatie bouwen en die applicatie moet meerdere talen ondersteunen.
De applicatie haalt gegevens op uit een databank en deze gegevens moeten -afhankelijk van de vooraf gekozen taal- in het NL, ENG, DUI, FR, ... of een andere mogelijke taal getoond worden. Al deze teksten zitten dus zowel in het EN, NL, ... in de db.

Nu, hoe design je zo iets het best? Momenteel hebben we een volgend systeem in gedachten:

Een tabel waarin alle teksten staan in de gekende talen. Die tabel zal er ong. als volgt uit zien:
code:
1
2
3
4
5
6
7
Table: tblTeksten
----------------------
TekstId :  int, pk
TekstNL:  varchar
TekstFR:   varchar
TekstEN:  varchar
TekstGER: varchar


De inhoud kan dus als volgt zijn:
code:
1
2
3
TekstId    TekstNL             TekstFR        TekstEN      
1              Categorie          Catégorie     Categorie
...


Let wel, ik heb het hier over teksten, maar eigenlijk zullen dat in principe hooguit een paar woorden zijn, geen volledige lappen tekst dus

De databank bevat dan ook een aantal tabellen die dan de eigenlijke structuur van de gegevens representeren.
Bv:
code:
1
2
3
4
5
Table Categories
---------------------
CategorieId             int, pk
CategorieName       int
CategorieDescr       int


Merk op dat de velden CategorieName en CategorieDescr dus geen tekst-velden zijn, maar integervelden. Ze bevatten nl. een verwijzing (FK) naar het passende record in de tabel tblTeksten.

Nu had ik gedacht om voor iedere soort gegevens een class aan te maken die inherited van een abstracte class. Die abstracte class bevat virtual functions voor het saven en het loaden van de data.

Bv: een class Categorie die inherited van de base-class ziet er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
class Categorie : BaseClass
{
   private int CategorieId;
   private string CategorieName;
   private string CategorieDesc;
   
   public override void Save ();

}

Die save-method zal dus ieder string-veld een record moeten aanmaken in de tabel 'tblTeksten' en de PK van dat record in het juiste veld moeten saven in de tabel Categories.
Dit zou ik als volgt kunnen doen:
code:
1
2
3
4
5
6
7
8
public override void Save()
{
    CatNaamId = SaveInTeksten (CategorieName, TaalCode);
    CatDescId   = SaveInTeksten (CategorieDesc, TaalCode);
   
    INSERT INTO tblCategories (CategorieName, CategorieDesc) 
    VALUES (CatNaamId, CatDescId);
}

IMHO is dit redelijk generiek, want, mocht er later eventueel een taal bijkomen, dan hoef ik enkel de tabel tblTeksten aan te passen (een column erbij) en eventueel de method SaveInTeksten aan te passen.

Nu, wat is jullie mening over dit systeem? Vinden jullie dat goed? Niet goed? Kan het beter? Waar kan het beter?
Ikzelf denk dat er teveel toegang naar de databank zal zijn (per record zal er 1 insert statement nodig zijn + voor ieder tekstveld is er een insert nodig).

Ik hoop dat jullie een beetje snappen wat ik bedoel

https://fgheysels.github.io/


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Je zou ook es een blik op GNU Gettext kunnen werpen, dat is er expliciet voor bedoeld, ik zou alleen niet weten of het samen wil en/of kan werken met je database.

http://www.gnu.org/manual...apter/gettext_1.html#SEC2

  • Scare360
  • Registratie: Juli 2001
  • Laatst online: 18-05 23:36
Ik heb de ervaring dat dit een enorme systeem belasting tot gevolg heeft, zeker bij rijke interfaces (de init methode kraakt SQL Server). Is wel gedistribueerd trouwens.

Ik zal eens meedenken, want een goede oplossing heb ik ook nog niet gevonden

  • Juicy
  • Registratie: December 2000
  • Laatst online: 08:17
Wat is het voor een applicatie en waar ga je hem in bouwen ?

-


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23-05 18:13
Als je toch een TekstId hebt, kun je misschien beter een tabel maken met kolommen voor de TekstId, TaalId en feitelijke Tekst. Op die manier hoef je niet van te voren vast te stellen welke talen je gaat ondersteunen.

De queries worden er trouwens wel iets ingewikkelder op, maar je kan wel meer functies door de database server laten afhandelen (zoals het sorteren op talen en dergelijke).

  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
[nohtml]
Soultaker schreef op 19 september 2002 @ 22:14:
Als je toch een TekstId hebt, kun je misschien beter een tabel maken met kolommen voor de TekstId, TaalId en feitelijke Tekst. Op die manier hoef je niet van te voren vast te stellen welke talen je gaat ondersteunen.
Hmmm... Ja, is ook een manier...

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

ps: het engelse Category schrijf je met een y op het eind ;)

(ik hoop niet dat je nu een refactoring tool nodig hebt... :P)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
.oisyn schreef op 19 september 2002 @ 22:43:
ps: het engelse Category schrijf je met een y op het eind ;)

(ik hoop niet dat je nu een refactoring tool nodig hebt... :P)


miereneuker.

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker



ieder z'n pleziertjes :+

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Volgens de nieuwe spelling is het miereNneuker.

O-)

Professionele website nodig?


  • Juicy
  • Registratie: December 2000
  • Laatst online: 08:17
Beste WhoAmI, als je een antwoord wil hebben op je vraag, dan kun je beter on-topic reageren op de wedervragen die gesteld worden.

-


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

offtopic:
Niet teveel aanstoot nemen aan onvriendelijkheden tussen de /14 regulars, we zijn wat van mekaar gewend, zelfs al vergeet men op een gegeven moment per ongeluk een smiley :)

Professionele website nodig?


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 06:53

gorgi_19

Kruimeltjes zijn weer op :9

curry684 schreef op 20 september 2002 @ 00:34:
offtopic:
Niet teveel aanstoot nemen aan onvriendelijkheden tussen de /14 regulars, we zijn wat van mekaar gewend, zelfs al vergeet men op een gegeven moment per ongeluk een smiley :)
offtopic:
Het zijn niet alleen regulars, het zijn zelfs lite-mods... :+


En nu on-topic:
Ik weet niet precies in welke taal je wilt ontwikkelen, maar zijn eventueel resourcefiles geen optie in plaats van een database? Zeker als je zegt dat het een beperkt aantal teksten zijn (waaruit ik opmaak dat deze in principe niet gewijzigd worden)

Voor een applicatie die ik gebouwd heb. Vaststaande gegevens, zoals de namen hoofdmenu, inloggen, uitloggen, etc, heb ik vastgelegd in een resourcefile.

Wisselende content (het was een CMS), werd gewoon opgeslagen in de DB.

Persoonlijk heb ik een voorkeur voor de methode van Soultaker; hierbij zit je niet gekoppeld aan een vast aantal talen. (je hoeft dus geen tabelwijzigingen door te voeren bij het toevoegen van een taal)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Zie antwoord Soultaker, zie ook [rml]MrX in "[ technisch ontwerp] meertalige versie w"[/rml]

Toch maar eens de search gebruiken ;)

offtopic:
Hoe link je in vredesnaam direct naar een bepaalde reactie in een post? Staat niet in de FAQ en krijg het ook niet voor elkaar :(


edit:

Joy! Het werkt! Thanx Feyd-Rautha ... :)

Oh, ook nog maar even post waarnaa ik verwijs gewijzigd, zal nu pas in 1 slag op mijn oog dat ik er nog een herhalende groep in had zitten ... nou ja zeg!

[ Voor 0% gewijzigd door Verwijderd op 20-09-2002 08:34 . Reden: Het werkt! ]


  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
offtopic:
wijs eens met uw muis-cursor naar de datum van de post ... :)

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


  • elmer25
  • Registratie: Februari 2002
  • Laatst online: 01-12-2021

elmer25

ooit was ik 25

volgens mij kun je de database indeling nog een stuk generieker maken, op de volgende manier:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Table Categories
---------------------
CategorieId             int, pk


Table Teksten
---------------------
CategorieId             int, pk
LanguageId             varchar(3), pk
CategorieName       int
CategorieDescr       int


Table Languages
---------------------
LanguageId             varchar(3), pk
LanguageDescr        varchar(32)


Je hebt dus 3 tabellen, 1 voor de categorien, 1 voor de teksten en 1 voor de talen waarin ze voor kunnen komen. Wanneer je nu een taal wilt toevoegen, hoef je die alleen maar aan de tabel Languages toe te voegen. En als je de code erachter wat slim in elkaar zet, dan loopt het hele systeem gewoon door!

edit:
mmm, ik geloof dat Soultaker het antwoord al gegeven had...

  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Juicy schreef op 20 september 2002 @ 00:24:
[...]


Beste WhoAmI, als je een antwoord wil hebben op je vraag, dan kun je beter on-topic reageren op de wedervragen die gesteld worden.


Waarin het systeem ontwikkeld wordt, doet er niet zozeer toe.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
[nohtml]
gorgi_19 schreef op 20 september 2002 @ 00:41:
[...]


En nu on-topic:
Ik weet niet precies in welke taal je wilt ontwikkelen, maar zijn eventueel resourcefiles geen optie in plaats van een database? Zeker als je zegt dat het een beperkt aantal teksten zijn (waaruit ik opmaak dat deze in principe niet gewijzigd worden)
Neen, want het is wel degelijk 'content' die in de verschillende talen moet opgeslagen worden.

https://fgheysels.github.io/


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09:13

Janoz

Moderator Devschuur®

!litemod

Soultaker schreef op 19 september 2002 @ 22:14:
Als je toch een TekstId hebt, kun je misschien beter een tabel maken met kolommen voor de TekstId, TaalId en feitelijke Tekst. Op die manier hoef je niet van te voren vast te stellen welke talen je gaat ondersteunen.

De queries worden er trouwens wel iets ingewikkelder op, maar je kan wel meer functies door de database server laten afhandelen (zoals het sorteren op talen en dergelijke).


Dat ingewikkelder worden van de queries valt wel mee. Zeker als je het vergelijkt met het verschil in werk van het later toch nog toevoegen van een extra taal :).

Het enige probleem dat op zou kunnen treden bij zo'n koppel tabel is dat de DB neit meer controleerd of er in een bepaalde taal wel een veld in die taal beschikbaar is.

Ikzelf heb wel eens over zo'n systeem nagedacht (was een meertalige website van Waxle) en bedacht dat je bij het ophalen wel een soort ranking kon gebruiken. Zoiets als "Ik heb het liefst belgische benamingen, maar doe anders maar gewoon nederlands, en als die er niet is, nou geef me dan maar de engelse naam". Dat was redelijk simpel te doen met een speciale ORDER BY clausule en het telkens pakken van het eerste record.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Janoz schreef op 20 september 2002 @ 12:11:
[nohtml]
[...]
[/nohtml]

Ikzelf heb wel eens over zo'n systeem nagedacht (was een meertalige website van Waxle) en bedacht dat je bij het ophalen wel een soort ranking kon gebruiken. Zoiets als "Ik heb het liefst belgische benamingen, maar doe anders maar gewoon nederlands, en als die er niet is, nou geef me dan maar de engelse naam". Dat was redelijk simpel te doen met een speciale ORDER BY clausule en het telkens pakken van het eerste record.



Dat is iets wat ik wel zou kunnen inbouwen (in een latere versie dan wel). Alleszins een goed idee!

https://fgheysels.github.io/


Verwijderd

Hmmm ... lijkt mij zinvoller om gewoon de LanguageID in je sessie bij te houden. Voor een anonymous user wordt die op een default gezet, als je inlogt wordt die gezet op de door de user geprefereerde taal, en je kan ergens een link aanbieden om van taal te switchen, waardoor de ID in de sessie natuurlijk wordt aangepast en de pagina wordt herladen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Verwijderd schreef op 20 september 2002 @ 12:54:
Hmmm ... lijkt mij zinvoller om gewoon de LanguageID in je sessie bij te houden. Voor een anonymous user wordt die op een default gezet, als je inlogt wordt die gezet op de door de user geprefereerde taal, en je kan ergens een link aanbieden om van taal te switchen, waardoor de ID in de sessie natuurlijk wordt aangepast en de pagina wordt herladen.


Ik denk dat Janoz iets anders bedoeld....

Stel je hebt in je settings oid als preference de taal Nederlands gekozen. Je haalt een record op, en er is geen Nederlandse waarde voor dat record maar wel een engelse en een duitse. Als je in uw 'ranking' oid Engels als 2de taal hebt gekozen, wordt het engelse record getoond.

(Althans, zo heb ik het begrepen).

https://fgheysels.github.io/


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 22:59

Reptile209

- gers -

Je zou inderdaad ook een aparte dir aan kunnen maken met voor iedere taal die je ondersteunt een resource bestandje als dit:
code:
1
2
3
4
5
6
7
Taal="Nederlands"
TaalID=1
Font="Arial"
... (enz)
String1="..."
String2="..."
...

Dan laat je je programma bij het opstarten indexeren wat er aan talen beschikbaar is, de gebruiker kiest er eentje en dan is dat het enige wat je in hoef te lezen. Alleen latere wijzgingen (bijvoorbeeld in string23 :) ) zijn lastig, want dan moet je al die bestandjes doorspitten.

Nog een aanvulling op je database-idee: voeg een "DefaultFont" toe: als je ooit russisch, grieks of wat dan ook moet hebben, dan heb je het juiste font er al bij!

Zo scherp als een voetbal!


Verwijderd

whoami schreef op 20 september 2002 @ 13:01:

[...]


Ik denk dat Janoz iets anders bedoeld....

Stel je hebt in je settings oid als preference de taal Nederlands gekozen. Je haalt een record op, en er is geen Nederlandse waarde voor dat record maar wel een engelse en een duitse. Als je in uw 'ranking' oid Engels als 2de taal hebt gekozen, wordt het engelse record getoond.

(Althans, zo heb ik het begrepen).
Idd, sorry, was geblaat van mij (in die context anyway). |:(

Je zou inderdaad een 'default' taal moeten hebben als er geen tekst in de gewenste taal is, en zo'n order zou leuk zijn, maar maakt het mijns inziens wel zeer heavy, als je dit met veel of alle teksten op je website zou moeten doen.

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Database design en multi language is altijd lastig, als basis principe zou je een soort globale siteid kunnen hanteren die je waar nodig in je tabellen opneemt.

Let goed op bij je database ontwerp dat je niet in problemen komt met zoeken, 1 keer die fout gemaakt om verschillende talen in zelfde velden te zetten :(

  • Basszje
  • Registratie: Augustus 2000
  • Nu online

Basszje

Reisvaap!]

heb je al gedacht aan XML :? . Ik gebruik XML voor losse woorden als taalinstelling e.d. en die kan je makkelijk per categorie ( xml file ) orderenen :) .

En het scheelt een hoop gequery en database gedoe. Slechts een snel XML scripts dat de juist tag opzoekt :)

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Ik zie hier het nut, of het extra voordeel dat XML voor deze situatie kan bieden niet in.

Ik denk dat ik gewoon bij m'n eerste idee blijf, maar dan wel met de aanpassingen van Soultaker. (Dat ik daar zelf niet op gedacht had....).

Ondertussen heb ik ook al een idee voor m'n classes. Ik heb één abstracte class met 2 pure virtuele functies erin en 2 andere functies. Alle andere classes die 'multi-language support' moeten hebben, moeten afgeleid worden van die ene class.

Die basis class ziet er ongeveer zo uit:

code:
1
2
3
4
5
6
7
8
abstract class BaseObject
{
  abstract void Save();
  abstract void Load();

  protected int SaveVertaalbaarItem (string text, string taalcode);
  protected string LoadVertaalbaarItem (int Id, string taalcode);
}


De SaveVertaalbaarItem en LoadVertaalbaarItem functies zorgen ervoor dat de tekst in de 'tekstentabel' wordt opgeslagen. SaveVertaalbaarItem geeft het Id terug waaronder de tekst terug te vinden is in de tabel en LoadVertaalbaarItem geeft de string terug van de op te halen tekst.
Iedere class moet dan zijn eigen Save en Load implementeren die voor ieder vertaalbaaritem de SaveVertaalbaarItem cq LoadVertaalbaarItem functie oproept en alle nodige gegevens dan in de juiste tabel wegschrijft.

https://fgheysels.github.io/


  • Basszje
  • Registratie: Augustus 2000
  • Nu online

Basszje

Reisvaap!]

whoami schreef op 21 september 2002 @ 10:20:
Ik zie hier het nut, of het extra voordeel dat XML voor deze situatie kan bieden niet in.
Het is sneller dan querien en bovendien kan je lijsten gegevens makkelijker opslaan met alle attributen :)

Ik vind dat een database altijd zo onoverzichtelijk wordt met meerdere talen enzo . Je kan weliswaar niet alles in de XML sheets kwijt, maar wel de taal informatie voor de interface e.d. :)

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Basszje schreef op 23 september 2002 @ 10:17:
[...]


Het is sneller dan querien en bovendien kan je lijsten gegevens makkelijker opslaan met alle attributen :)
Dat betwijfel ik sterk. Een databank die goed ontworpen is en met de juiste indexen is supersnel.
Ik vind dat een database altijd zo onoverzichtelijk wordt met meerdere talen enzo . Je kan weliswaar niet alles in de XML sheets kwijt, maar wel de taal informatie voor de interface e.d. :)

Qua onderhoudbaarheid ed is een databank hier echt wel de beste optie. Het gaat om het opslaan van content in verschillende talen. Niet over het bijhouden van de gewenste taal enzo.

https://fgheysels.github.io/

Pagina: 1