Jag håller på med en webbshop som kommer finnas på engelska och svenska. Alla applikationstexter lagrar jag i separata filer men produkterna lagrar jag i en databas (även översättningen alltså).
Databasstrukturen ser ut ungefär så här:
ID
name_sv
name_eng
price_sv
price_eng
Och så hämtar jag en produkt så här:
<?php
$SQL_item = mysql_query('SELECT colID, colName_'.$_lang.', colPrice_'.$_lang.' FROM products WHERE colID=1') or die (mysql_error());
if (mysql_num_rows($SQL_item)){
$id = mysql_result ($SQL_item, 0, 0);
$name = mysql_result ($SQL_item, 0, 1);
$price = mysql_result ($SQL_item, 0, 2);
}
?>
<h1><?php echo $name; ?></h1>
<b><?php echo $price ; ?></b>
Finns det något smidigare sätt att lagra eller hämta produkterna?
Jag brukar göra så att jag kopplar språk till produkt. Det finns säkert bättre lösningar, men det blir ganska greppbart om man gör så. När du hämtar en produkt ser du till att query-strängen JOINar till den tabell som innehåller det språk du vill ha.
Jag gillar inte tanken på att ha olika kolumner för olika språk i min databas. Om du nu ska bygga ut din webbshop och vill ha in ytterligare ett språk, hur skulle du göra då? Jag har gjort så att jag har ett fält som definierar språket för varje rad, vilket gör att det blir utbyggbart. Det här var dock en nödlösning, men hittills har den fungerat bra. Det tråkiga är ju dock att det blir duplicerad data i databasen.
Exempel:
Products
--------
id productname category price language
1 Såg 2 149 swedish
2 Saw 2 149 english
3 Säge 2 149 german
...
Jag gillar inte tanken på att ha olika kolumner för olika språk i min databas. Om du nu ska bygga ut din webbshop och vill ha in ytterligare ett språk, hur skulle du göra då?
Jo, det är naturligtvis nackdelen. Inom överskådlig framtid kommer det bara att finnas två språk och skulle det tillkomma ytterligare ett språk blir det ju till att strukturera om databasen och editera alla produkter. Inte smidigt men inte omöjligt heller.
Det som jag tycker är minst smidigt med min lösning är att jag måste skicka med språker flera gånger i min SQL-fråga och att jag inte kan (på något enkelt sätt i alla fall) använda kolumnnamnet senare i koden:
//I dagsläget
$name = mysql_result ($SQL_item, 0, 1);
// Jag skulle vilja ha typ
$name = mysql_result ($SQL_item, 0, 'colName');
Kolla strukturen för en befintlig webshop, exempelvis oscommerce. Där ligger produktnamn och beskrivning i en egen tabell som är kopplad till språk och övriga produktdata i en annan tabell.
products
id price weight
1 129 1
products_description
id name description language
1 Prod 1 Produkt nr 1 1
1 Article 1 Article no 1 2
Så har jag också gjort i nästa version av XodaGallery, var det smidigaste sätt jag kunde komma på så där kom vi fram till samma sak.
Kategorier, Bilder, Sidor har var för sig två tabeller - en med metadata och en med innehållet. Inehållstabellen är sedan kopplad till en tabell med Språk. Själva gränssnitts-språket är däremot i .mo-filer som Wordpress och många använder. Har valt att dela upp det så för att användaren med en språkfil ska kunna installera nya språk och bara översätta sitt eget innehåll.
144 ms totalt · 3 externa anrop · v20260731065814-full.55e59744