IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

FAQ DelphiConsultez toutes les FAQ

Nombre d'auteurs : 124, nombre de questions : 929, dernière mise à jour : 31 décembre 2023  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums Delphi et Delphi et bases de données de www.developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous souhaitez y apporter des corrections ou la compléter, contactez un responsable (lien au bas de cette page).

Nous espérons que cette FAQ saura répondre à vos attentes. Nous vous en souhaitons une bonne lecture.

L'équipe Delphi de Developpez.com.

SommaireMultilinguisme et Unicode (4)
précédent sommaire
 

Wikipedia fournit une bonne définition : "Unicode est une norme informatique, développée par le Consortium Unicode, qui vise à donner à tout caractère de n'importe quel système d'écriture de langue un nom et un identifiant numérique, et ce de manière unifiée, quelle que soit la plate-forme informatique ou le logiciel."
"Unicode, dont la première publication remonte à 1991, a été développée dans le but de remplacer l'utilisation de pages de code nationales. (ANSI)
Ces pages de code présentaient en effet quelques problèmes. Par exemple lorsqu'était prévu un caractère « signe monétaire », le même texte autorisant aux États-Unis une dépense en dollars pouvait une fois transmis par courrier électronique au Royaume-Uni autoriser la même dépense en livres sterling, sans que quoi que ce soit ait été modifié au texte !"

L'API Win32 est "bimode" c'est-à-dire que tous les appels au système d'exploitation existent en double. Par exemple, SetWindowText() existe en deux versions : SetWindowTextA() pour l'ANSI et SetWindowTextW() pour l'unicode. Lors du développement de la VCL, Borland a choisi les fonctions en "A". À noter que Win95/98/Me ne supportent que les fonctions A. Mais qu'a partir de win2000, les deux sont supportées. Face a ce problème, Microsoft a développé, beaucoup plus tard (2004), MSLU : une couche de l'api win32 permettant de faire fonctionner l'unicode sous win95/98/Me.

Mis à jour le 24 janvier 2014 nut62

La VCL étant développée avec les fonctions ANSI, elle est incompatible avec l'affichage de l'unicode. Et ne permet donc pas d'afficher des caractères différents de ceux du système d'exploitation. Les TCaption ou TStrings de nos composants habituels sont incapables d'afficher de l'unicode. Ceci s'explique par le fait que le type string est une chaine de caractères ANSI. Au contraire, le WideString est une chaine de caractère longue, unicode. Il vous faudra donc remplacer les string par des widestring.
Autre chose a savoir, les RessourceString, bien que prévues pour ça, ne sont malheureusement pas compatibles avec de l'unicode non plus (bien qu'on puisse insérer des ressources de ce type).

La traduction d'un programme existant en langue asiatique (ou russe) semble donc problématique. L'ITE de delphi ( Internationaliser un projet Delphi) s'avère malheureusement inutilisable.

Mis à jour le 24 janvier 2014 nut62

  • .tntunicode : tntunicode est un portage de la VCL en unicode : les même composants, gratuits, avec le code source fourni : http://www.tmssoftware.com/site/tmsuni.asp. Une étude du code vous montrera comment rendre vos propres composants compatibles unicode. A noter que meme les boites de dialogues de la VCL sont incompatibles (showmessage et messagedlg) : il vous faudra utiliser celles de tntunicode. Un assistant de portage est disponible.
  • .GNU Gettext : dxgettext (http://dxgettext.po.dk/) est une solution gratuite de traduction de vos programmes delphi. Les chaines de caractères sont extraites de vos sources (ou même de l'exe) sous forme d'un fichier "po" que vous pouvez transmettre a un traducteur professionnel. dxgettext est, par exemple, utilisé par MySQL pour ses outils de GUI. Le format des fichiers est standard et utilisé par de grands projets opensource. Et la cerise sur le gateau : contrairement a l'ITE, dxgettext supporte l'unicode !

Mis à jour le 24 janvier 2014 nut62

1. Qu'est-ce que c'est ?
La question peut paraître réservée a des spécialistes.
Pourtant, si vous devez traduire une interface en chinois, il vous sera très utile de connaître la réponse !
Il existe deux jeux de caractères pour le chinois : le simplifié et le traditionnel.
Lors de la révolution culturelle chinoise, les caractères traditionnels ont été simplifiés (ils sont plus faciles à dessiner et à lire)
Le chinois simplifié‚ est utilisé‚ en chine alors que le chinois traditionnel reste utilisé à Hong-Kong et Taïwan.
Mais là où l'informatique est très utile, c'est que chaque caractère simplifié‚ a son équivalent en traditionnel.

2. Pourquoi convertir ?
On peut imaginer qu'un traducteur traduise votre interface en chinois simplifié. Seulement, on vous prévient a la dernière minute que votre programme doit être également utilisé a Hong-Kong : aucun problème, vous pouvez tout convertir à la volée. Mieux encore, vous fournissez à votre traducteur un logiciel capable de convertir l'un en l'autre.

3. Comment convertir ?
C'est là que les choses se compliquent. Mais heureusement, windows vient à notre secours avec la fonction LCMapStringW (unité Windows)
Le jeu de caractères simplifiés se nomme GB
Le jeu de caractères traditionnels se nomme big5
On utilise ici des Widestring qui contrairement aux String sont unicode.
Il vous faudra utiliser des composants compatibles unicode (comme TntUnicode) pour que les caractères s'affichent dans votre programme

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function Gb2Big5(Str:Widestring):Widestring; 
begin  
  SetLength(Result,Length(Str)); 
  LCMapStringW($404,LCMAP_TRADITIONAL_CHINESE, 
    PWideChar(Str),Length(Str), 
    PWideChar(Result),Length(Result)); 
  Result:=Result; 
end; 
  
function Big52Gb(Str:Widestring):Widestring; 
begin 
  SetLength(Result,Length(Str)); 
  LCMapStringW($804,LCMAP_SIMPLIFIED_CHINESE, 
    PWideChar(Str),Length(Str), 
    PWideChar(Result),Length(Result)); 
end;
Et voilà, Windows s'occupe du mapping de caractères !

Mis à jour le 24 janvier 2014 nut62

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.