OVH Cloud OVH Cloud

internationalisation (gestion des langues)

4 réponses
Avatar
yvon.thoravalNO-SPAM
je développe une appli avec java-swing, pour la partie interface
graphique la gestion des langues fait partie intégrante de java, donc
pas de pb, mais, pour la bd, il faudra bien un jour que je traduise
certains termes, ne serait-ce que les noms de pays.

comment gérez-vous les différentes versions d'un texte, en fonction de
la langue ? je pense proposer, outre le français, : anglais, allemand et
italien.

je cherche un système souple où l'on puisse entre, dans le désordre
complet, les différentes traductions dans différentes langues.

par exemple, j'ai une table, en français, t_vine_plant_vp qui donne pour
un cépage donné les textes suivants :

les synonymes ;
l'origine du cépage ;
des notes diverses sur ses propriétés.

ce que j'ai envie de faire, c'est créer, dans ce cas, en parallèle sur
la table t_vine_plant_vp (français par défaut) des tables
t_vine_plant_vp_en, t_vine_plant_vp_de, etc...

dont l'id sera le même que celui de la table originale t_vine_plant_vp
avec les règles suivantes :

si l'id n'est pas trouvé dans la table *_en, on prend le français, s'il
existe et que la colonne est à NULL, on prend le français, l'anglais
dans ce cas sinon.

Qu'en pensez-vous ?
--
yt

4 réponses

Avatar
Ph. B.
Yvon Thoraval a écrit:

je développe une appli avec java-swing, pour la partie interface
graphique la gestion des langues fait partie intégrante de java, donc
pas de pb, mais, pour la bd, il faudra bien un jour que je traduise
certains termes, ne serait-ce que les noms de pays.

comment gérez-vous les différentes versions d'un texte, en fonction de
la langue ? je pense proposer, outre le français, : anglais, allemand et
italien.

je cherche un système souple où l'on puisse entre, dans le désordre
complet, les différentes traductions dans différentes langues.

par exemple, j'ai une table, en français, t_vine_plant_vp qui donne pour
un cépage donné les textes suivants :

les synonymes ;
l'origine du cépage ;
des notes diverses sur ses propriétés.

ce que j'ai envie de faire, c'est créer, dans ce cas, en parallèle sur
la table t_vine_plant_vp (français par défaut) des tables
t_vine_plant_vp_en, t_vine_plant_vp_de, etc...

dont l'id sera le même que celui de la table originale t_vine_plant_vp
avec les règles suivantes :

si l'id n'est pas trouvé dans la table *_en, on prend le français, s'il
existe et que la colonne est à NULL, on prend le français, l'anglais
dans ce cas sinon.

Qu'en pensez-vous ?



Autre piste:

Tu stockes dans tes tables l'Id d'un texte et tu as une table où tu stockes tous
tes labels avec leur id de langue

T_LIBELLE
(
LBL_ID INTEGER IDENTITY (1, 1) NOT NULL, // Clé primaire
LNG_ID INTEGER NOT NULL, // Clé étrangère langues
LBL_REF INTEGER NOT NULL, // Id du libellé indépendamment de la langue
LBL CAPTION VARCHAR(64) NOT NULL // Le libellé dans la langue considérée
)

TR_LANGUE_LNG
(
LNG_ID INTEGER IDENTITY (1, 1) NOT NULL, // Clé primaire
LNG_NOM VARCHAR(32) // Nom de la langue
)

Avec la table de ta question précédente, cela donne:

T_APPELLATION
(
APP_ID INTEGER IDENTITY (1, 1) NOT NULL,
APP_BG INTEGER NOT NULL,
APP_BD INTEGER NOT NULL,
APP_NIVEAU INTEGER NOT NULL,
LBL_REF INTEGER NOT NULL, // "Pointeur" vers le libellé
TYP_ID INTEGER NOT NULL // Clé étrangère pour le type d'appellation
)

Une requete avec une jointure vers ta table de libellés et hop ! :-)

--
Philippe.
Avatar
yvon.thoravalNO-SPAM
Ph. B. wrote:

T_LIBELLE
(
LBL_ID INTEGER IDENTITY (1, 1) NOT NULL, // Clé primaire
LNG_ID INTEGER NOT NULL, // Clé étrangère langues
LBL_REF INTEGER NOT NULL, // Id du libellé indépendamment de la langue
LBL CAPTION VARCHAR(64) NOT NULL // Le libellé dans la langue considérée
)

TR_LANGUE_LNG
(
LNG_ID INTEGER IDENTITY (1, 1) NOT NULL, // Clé primaire
LNG_NOM VARCHAR(32) // Nom de la langue
)

Avec la table de ta question précédente, cela donne:

T_APPELLATION
(
APP_ID INTEGER IDENTITY (1, 1) NOT NULL,
APP_BG INTEGER NOT NULL,
APP_BD INTEGER NOT NULL,
APP_NIVEAU INTEGER NOT NULL,
LBL_REF INTEGER NOT NULL, // "Pointeur" vers le libellé
TYP_ID INTEGER NOT NULL // Clé étrangère pour le type d'appellation
)



bien vu, il faut seulement gérer, à part, le pointeur du libellé, en
fait c'est ce que tu dis ou dans la table des libelle, donner aussi la
colonne et la table de ref... mais bon ta méthode est plus élégante car
elle permet de retrouver le libelle directement en sql, dans ma version
il fallait faire des tests (longs + coût cpu)

une jointure seule ne marche qu'à condition que tout soit traduit, amha,
je veux proposer au moins le français si non traduit (comme en java avec
l'anglais...)
--
yt
Avatar
Fred BROUARD - SQLpro
Ne pas oublier le cas ou le libellé n'est pas traduit (oubli)...

Si libellé conçu en français... et traduit en moldave :

SELECT COALESCE(

SELECT COALESCE(LBL2.LBL_CAPTION, LBL1.LBL_CAPTION, '') AS CAPTION

FROM T_LIBELLE LBL1

INNER JOIN TR_LANGUE_LNG LNG1
ON LBL.LNG_ID = LNG1.LNG_ID AND LNG1.LLNG_NOM = 'français'

LEFT OUTER JOIN T_LIBELLE LBL2
ON LBL1.LBL_ID = LBL2.LBL_ID

LEFT OUTER JOIN TR_LANGUE_LNG LNG2
ON LBL2.LNG_ID = LNG2.LNG_ID AND LNG2.LNG_NOM = 'moldave'

WHERE LBL1.LBL_ID = ...

A +





Yvon Thoraval a écrit:
Ph. B. wrote:


T_LIBELLE
(
LBL_ID INTEGER IDENTITY (1, 1) NOT NULL, // Clé primaire
LNG_ID INTEGER NOT NULL, // Clé étrangère langues
LBL_REF INTEGER NOT NULL, // Id du libellé indépendamment de la langue
LBL CAPTION VARCHAR(64) NOT NULL // Le libellé dans la langue considérée
)

TR_LANGUE_LNG
(
LNG_ID INTEGER IDENTITY (1, 1) NOT NULL, // Clé primaire
LNG_NOM VARCHAR(32) // Nom de la langue
)

Avec la table de ta question précédente, cela donne:

T_APPELLATION
(
APP_ID INTEGER IDENTITY (1, 1) NOT NULL,
APP_BG INTEGER NOT NULL,
APP_BD INTEGER NOT NULL,
APP_NIVEAU INTEGER NOT NULL,
LBL_REF INTEGER NOT NULL, // "Pointeur" vers le libellé
TYP_ID INTEGER NOT NULL // Clé étrangère pour le type d'appellation
)




bien vu, il faut seulement gérer, à part, le pointeur du libellé, en
fait c'est ce que tu dis ou dans la table des libelle, donner aussi la
colonne et la table de ref... mais bon ta méthode est plus élégante car
elle permet de retrouver le libelle directement en sql, dans ma version
il fallait faire des tests (longs + coût cpu)

une jointure seule ne marche qu'à condition que tout soit traduit, amha,
je veux proposer au moins le français si non traduit (comme en java avec
l'anglais...)



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
yvon.thoravalNO-SPAM
Fred BROUARD - SQLpro wrote:

Ne pas oublier le cas ou le libellé n'est pas traduit (oubli)...



Ce n'est pas qu'une question d'oubli d'ailleurs, surtout de boulot je
dirais, il faut bien évidemment que la base soit fonctionnelle même si
tout n'est pas traduit...

--
yt