Spring + Thymeleaf - wielojęzyczny serwis z wielojęzyczną bazą danych

1

W jaki sposób tworzy się serwis, który posiada wielojęzyczną bazę danych? Np. mamy tabelę z nazwami ptaków

id   pl       en          weight
1    kura     chicken     2.5
2    kaczka   duck        3.0

Użytkownik po wybraniu języka dostaje dane odpowiednie dla swojego języka (czyli w Polsce: Kura: 2.5, w UK: Chicken: 2.5). Oczywiście tabela jest przykładowa i nie jest obowiązkowa (chodzi mi o to, że być może każdy język powinien mieć swoją tabelę, lub w ogóle każdy język powinien mieć swoją bazę danych). Oczywiście część danych jest obowiązkowo wspólna np. dane dotyczące kont userów itp.

EDIT: rozróżnijmy też dwa przypadki 1) dane nie są edytowane przez userów 2) dane mogą być edytowane i dodawane przez userów

0

Jeśli chodzi o bazę danych, zrób sobie coś takiego:

  CREATE TABLE "BIRDS" 
   (	"ID" NUMBER, 
	"WEIGHT" NUMBER(6,2)
   );

  CREATE TABLE "BIRDS_NAME" 
   (	"ID" NUMBER, 
	"BIRDS_ID" NUMBER, 
	"NAME" VARCHAR2(30), 
	"LANGUAGE" VARCHAR2(2)
   );

  ALTER TABLE "BIRDS_NAME" ADD CONSTRAINT "BIRDS_NAME_FK1" FOREIGN KEY ("BIRDS_ID")
	  REFERENCES "BIRDS" ("ID") ON DELETE CASCADE ENABLE

Insert into BIRDS (ID,WEIGHT) values ('1','2,5');
Insert into BIRDS (ID,WEIGHT) values ('2','3');

Insert into BIRDS_NAME (ID,BIRDS_ID,NAME,LANGUAGE) values ('1','1','kura','PL');
Insert into BIRDS_NAME (ID,BIRDS_ID,NAME,LANGUAGE) values ('2','1','chicken','EN');
Insert into BIRDS_NAME (ID,BIRDS_ID,NAME,LANGUAGE) values ('3','2','kaczka','PL');
Insert into BIRDS_NAME (ID,BIRDS_ID,NAME,LANGUAGE) values ('4','2','duck','EN');

Czyli dodatkowa tabela, która trzyma nazwy w różnych językach. Możesz wyciągać teraz ptaki takim zapytaniem:

SELECT b.id, bn.name, b.weight
FROM birds b
INNER JOIN birds_name bn
ON b.id = bn.birds_id
WHERE UPPER(bn.language) = 'PL';

        ID NAME                               WEIGHT
---------- ------------------------------ ----------
         1 kura                                  2,5
         2 kaczka                                  3

Zmieniasz tylko wartość języka w klauzuli WHERE.

Zaletą tego rozwiązania jest to, że przy dodawaniu kolejnego języka dodajesz tylko rekordy w tabeli językowej. Przy Twoim rozwiązaniu musiałbyś pewnie zmieniać wszędzie kod, a wtedy idzie się powiesić.

Sam decydujesz, czy użytkownik może edytować wartości w tabeli językowej.

Co do springa, wielojęzycznego frontu, to poszukaj spring thymeleaf internationalization, nie mam w tym doświadczenia, ale zapewne sprowadza się to do plików językowych .properties z odpowiednim przyrostkiem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1