Avatar billede AnyFellow Mester
28. august 2017 - 14:18 Der er 3 kommentarer og
1 løsning

Hent alle poster,

Jeg har en tabel indeholdende tekster i forskellige sprog til en hjemmeside. Standardsproget er engelsk. Skulle der ved en fejl mangle en enkelt tekst på f.eks. dansk, ønsker jeg at teksten vises på standardsproget.

Jeg har en sprogtabel, der f.eks. kan indeholde følgende:

--------------------------------------------
| id | page | language | text  | value    |
--------------------------------------------
|  1 | test | en      | submit | Submit  |
|  2 | test | en      | cancel | Cancel  |
|  3 | test | en      | login  | Login    |
|  4 | test | en      | logout | Logout  |
|  5 | test | dk      | submit | Send    |
|  6 | test | dk      | cancel | Annuller |
|  7 | test | dk      | login  | Log ind  |


Mangler en text i et sprog, ønsker jeg at teksten hentes i den engelske udgave, således at et udtræk på sproget dansk vil indeholde følgende:

--------------------------------------------
| id | page | language | text  | value    |
--------------------------------------------
|  4 | test | en      | logout | Logout  |
|  5 | test | dk      | submit | Send    |
|  6 | test | dk      | cancel | Annuller |
|  7 | test | dk      | login  | Log ind  |


Kan dette gøres i et enkelt udtræk?
Avatar billede garrett Seniormester
28. august 2017 - 15:01 #1
Om dette er den optimale løsning skal jeg ikke kunne sige, men umiddelbart ser den ud til at virke:

SELECT DISTINCT T1.text, IFNULL(T2.value, T3.value)
FROM Table1 T1

LEFT JOIN (SELECT text, value FROM Table1 WHERE page = 'test' AND language = 'dk') T2
ON T1.text = T2.text
LEFT JOIN (SELECT text, value FROM Table1 WHERE page = 'test' AND language = 'en') T3
ON T1.Text = T3.text

Leg evt. selv videre her:
http://sqlfiddle.com/#!9/50e5e8/19
Avatar billede jakobdo Ekspert
28. august 2017 - 20:52 #2
Nu er du begyndt på en måde.
Du kunne også tage en mere generel anvendt metode: http://php.net/manual/en/book.gettext.php

Den ville defaulte til engelsk, hvis ikke noget er angivet i dansk.
Dit system, vil blive tungt, da den skal trække alt fra db.
Avatar billede arne_v Ekspert
29. august 2017 - 04:43 #3
Lidt blandede kommentarer:

1) hvis en altid forfindes saa maa

SELECT DISTINCT COALESCE(dk.text, en.text) AS text, COALESCE(dk.value, en.value) AS value
FROM Table1 dk RIGHT JOIN Table1 en ON dk.page = en.page AND dk.text = en.text AND dk.language

goere det samme som ovenfor.

2) eksempel output har ogsaa id og language - er de noedvendige?

3) jakobdo har ret - medmindre du cacher i applikationen saa vil det her vaere tungere en traditionel i18n
Avatar billede AnyFellow Mester
29. august 2017 - 15:48 #4
Kender godt gettext, men det er ikke installeret på kundens webhotel, og da det ikke er en option for kunden at skifte, har det ikke været med i overvejelserne.

Jeg vil arbejde videre med det sidste forslag (pkt. 1).

Tak for hjælpen.
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

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