Avatar billede razmuz_dk Nybegynder
07. september 2005 - 10:01 Der er 11 kommentarer og
1 løsning

Flere sprog - performance

Hej Eksperter,

Jeg sidder med en stor side, med relativt meget forskellig "dynamisk" tekst. Denne side vil jeg inden så længe gerne have gjort flersproget. I den forbindelse kunne jeg godt tænke mig, at lave den absolut bedste løsning performance-mæssigt.

Det jeg efterspørger er den bedste metode til at gemme/hente forskellige sprogpakker? En mulighed er at lave en mysql-tabel:
tekst:
lang_id | key | text
eller:
key |

Denne tabel kunne man så evt. lave til en HEAP-tabel for at gøre den hurtigere - der vil jo forekomme relativt mange kald til sprog-tabellen.

En anden mulighed er define(), som fx phpmyadmin vidst nok bruger. Er den bedre/hurtigere? Problemet med denne er umiddelbart, at et HELT sprog skal include's hver gang selvom man fx kun skal bruge ordet "Ja" - eller opfatter jeg det forkert?

Andre alternativer er naturligvis meget velkomen... tak.

mvh. Rasmus
Avatar billede showsource Seniormester
07. september 2005 - 10:12 #1
Den ene gang jeg har lavet en side med flere sprog, valgte jeg at have tabeller i DB'en med teksten, dk, eng, starte med at tjekke om der er en cookie["lang"] og så hent ud fra det.
Tabeller i DB'en var så navngivet med "lang",
dk_forside, eng_forside
dk_galleri, eng_galleri

$langs = array("dk", "eng");
if(isset($_COOKIE["lang"]) && in_array($_COOKIE["lang"], $langs)) {
$sprog = $_COOKIE["lang"];
}else{
$sprog = "dk";
}

SELECT FROM ". $sprog ."_forside

Ved ikke hvad som egentlig er bedst/optimalt?
Avatar billede razmuz_dk Nybegynder
07. september 2005 - 10:37 #2
Det vil slet ikke virke i mit tilfælde da jeg har MANGE sider og dynamiske tekster. Det vil resultere i mange hundrede tabeller. Hvorfor også lave så mange tabeller når du kan have dem i en?
Avatar billede razmuz_dk Nybegynder
07. september 2005 - 10:39 #3
Btw - selve "vælgeren" af de forskellige sprog behøves jeg ikke hjælp til ;)
Avatar billede showsource Seniormester
07. september 2005 - 10:47 #4
:O) Det kan du jo have ret!
I mit tilfælde, var det fordi jeg brugte mod_rewrite, så hvis siden der blev vist f.eks. var domain.dk/kontakt blev det viste indhold hentet fra tabellen $sprog. "_kontakt"
Avatar billede jokkejensen Novice
07. september 2005 - 11:09 #5
Kan du ikke gemme dem i databasen.. og hvergang du laver ændringer i denne gennem dit cms, så generere du xml filer der repræsenterer ALT sprog.. xml er oplagt til sådan noget..
Avatar billede mr_chaos Praktikant
07. september 2005 - 11:09 #6
OsCommerce har valgt at alle sider har en parallel include fil i et lang bibliotek, som kun indeholder de tekster der bruges på siden.

Hvis siden hedder \cgibin\frontpage.php så ligger der følgende fil \languages\dk\cgibin\frontpage.php som så indeholder de danske tekster.

Alle tingene er sat vha. konstanter, så hvis en tekst ikke er oversat så skriver konstanten bare istedet.

Ved ikke hvor pænt det er, men der er god performance i det.

Man kunne evt. udvide og lave en fil de indeholdt de mest normale ord (Ja, Nej, osv), som altid var included.
Avatar billede razmuz_dk Nybegynder
07. september 2005 - 12:06 #7
God idé mr chaos! Men hvad mener du med
"Alle tingene er sat vha. konstanter, så hvis en tekst ikke er oversat så skriver konstanten bare istedet."

Du mener at det hele er sat via define() ikke? - Men hvis noget IKKE er definet, fx konstanten "WELCOME_MSG" - så indeholder den jo ingenting. I tilfælde af at noget ikke er oversat vil den derfor udskrive "ingenting"... Eller er jeg forkert på den?
Avatar billede mr_chaos Praktikant
07. september 2005 - 12:19 #8
Yeps, mener sat vha. defines.

Hvis en konstant ikke er defineret, så skrives navnet bare ud, fx.

printf('Er du sikker %s/%s', YES, NO);

Hvis de ikke er defineret, så skrives der YES/NO.

Så en god ide kunne være at lave alle tekster på engelsk, så det er default sprog, en ulempe er selvfølgelig at konstanter bør være med store bogstaver for at hjælpe med læsbarhed.
Avatar billede razmuz_dk Nybegynder
07. september 2005 - 12:54 #9
Arh okay! - smart! :) Jeg lader lige spørgsmålet stå lidt - det kunne være der var andre, der havde ENDNU bedre idéer! ;)
Avatar billede coderdk Praktikant
08. september 2005 - 00:51 #10
Det med ikke satte konstanter er ikke særligt pænt :P
Der er flere måder at gøre det på, du kan bruge GNU GetText http://dk2.php.net/gettext og poEdit: http://poedit.sf.net/ - Det er relativt omstændigt, men det virker og er ret hurtigt!
Alternativt kan du lave en variant af det som showsource skrev. To tabeller "pages" og "items". Pages har bare en record for hver side, items refererer til en page og kan have mange i. Items har ydermere en indikator for sprog (helst en int! evt lav også en sprogtabel), så kan du f.eks. definere at engelsk skal være default, og så kan du lave en LEFT OUTER JOIN når du henter ud:

SELECT
  def.label
  ,def.teksten AS uktext
  ,t.teksten
FROM
  items AS def
INNER JOIN
  pages AS p
ON
  def.pageid = p.pageid
LEFT OUTER JOIN
  items AS t
ON
  t.label = def.label
  AND t.languageid = 2
WHERE
  p.pagename = 'forside'
  AND def.languageid = 1

Her antager jeg at languageid 1 er engelsk, og languageid 2 er dansk. Nu vil du få alle items ud i både dansk og engelsk - De steder hvor der ikke er en dansk oversættelse, vil "tekst" være null, og så kan du bruge uktext i stedet.
Det kræver at du har nogle gode indexer ;)

Et andet alternativ er at have en fil for hver... Her er engelsk:

<?php

  $item['YesNo'] = 'Yes/No';
  $item['AreYouSure'] = 'Are you sure?';
  $item['Vodka'] = 'Wonderful drink!';

?>

Og den danske:

<?php

  $item['YesNo'] = 'Ja/Nej';
  $item['AreYouSure'] = 'Er du sikker?';

?>

Hvis brugeren skal se dansk, starter du med at require den engelske, og derefter den danske, som så vil overskrive de variable der er i. 'Vodka' vil stadig være der, blot kun på engelsk ;)

Nå, jeg er træt og vil i seng ;)
Avatar billede coderdk Praktikant
08. september 2005 - 00:52 #11
Select'en burde faktisk se sådan ud:

SELECT
  def.label
  ,def.teksten AS uktext
  ,t.teksten
FROM
  items AS def
INNER JOIN
  pages AS p
ON
  def.pageid = p.pageid
LEFT OUTER JOIN
  items AS t
ON
  t.label = def.label
  AND t.pageid = p.pageid
  AND t.languageid = 2
WHERE
  p.pagename = 'forside'
  AND def.languageid = 1
Avatar billede razmuz_dk Nybegynder
16. oktober 2005 - 00:00 #12
Tak for hjælpen alle :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester