Bonjour à tous,
Je souhaite créer une fonction pour connaitre la langue d'un texte spécifique en se basant sur les caractères du texte fourni.
Bonjour à tous,
Je souhaite créer une fonction pour connaitre la langue d'un texte spécifique en se basant sur les caractères du texte fourni.
Comme d'habitude vous ne fournissez pas la moitié des informations nécessaires (ne serait-ce que votre version de Delphi) et je comprend la réaction de Paul !
La formulation de la question est vraiment ambigüe, un caractère ne peut pas indiquer une langue : le 'a' est-il anglais ? si, effectivement, ß tendrait à penser que le texte est en allemand tout les textes en allemand ne contiennent pas forcément ce caractère.
bon plus sérieusement et mieux exprimé, grâce à ma boule de cristal, je pense que vous voulez savoir si une chaine contient des caractères arabe ?
Même si, détecter une langue est possible (mais pas totalement gratuit) avec des requêtes sur le NET (REST API i.e https://languagelayer.com/ ou https://detectlanguage.com/ ) c'est une tout autre approche ( légèrement dépendante de votre version de Delphi) donc commencez par répondre à cette question sur ce que vous voulez vraiment.
S'il s'agit de ma première hypothèse allez faire un tour dans mon tutoriel sur les grilles FMX, dans ce chapitre j'essaye de détecter si le texte est Right To Left ou non, j'en discute plus longuement ici
Reste à votre charge de retoquer le tableau de caractères (inclure le farsi ou non, retirer l'hébreux etc...)
Pourrait-on avoir votre étude préliminaire ?
Des essais d'analyse du CharSet par exemple en déduisant la langue à partir de la table de caractère UTF8/Unicode utilisé.
Avez-vous étudié la piste de la fréquence des lettres qui permet aussi d'en déduire un ensemble de langue ?
Avez-vous prévu un dictionnaire des langues gérées ?
Avez-vous commencé un projet d'étude de faisabilité ?
S'il s'agit de langue, une preuve que cela peut fonctionner avec REST
(bien sûr n'est pas affichée ma clé API )
Il est possible d'avoir plusieurs résultats auquel cas les valeurs "isreliable" et "confidence" seront des critères déterminants (encore que ..)
exemple :
à mon humble avis, ce site recherche les termes dans un dictionnaire pour identifier à quels langues appartiennent les mots...et l'encodage du texte est imposé (je suppose)...si on prend un fichier donné, il faut déjà déterminé s'il est en ANSI, en Unicode, voir dans une table de caractère autre (EBCDIC). Si on considère un fichier ASCII il faut vérifier ce qu'il donne dans différentes pages de code, car la signification des caractères > #127 n'est pas la même en fonction de la page de code ... bref la question est vaste.
Certainement, en tout cas j'ai détecté de l'arabe, de l'hébreux et du russe (merci google trad) sans difficulté
Même quand il y a des fôtes sur certains mots ça semble fonctionner
Bonjour,
J'ai une application qui peut être exécutée avec plusieurs langue (Français,Arabe, Tamazight) et le problème et que au niveau de l'impression dans le cas de langue arabe j'ai l'inversion du texte
texte initiale:'السلطة النهائية'
texte à l'impression:'النهائية السلطة'
Je travail avec delphi xe2 avec Ravereport.
Bonjour,
Je ne suis pas familier de la langue arabe : dans ton exemple, les mots semblent inversés, mais pas les lettres ?
Une notion lue ici :Cela a-t-il un lien ?Envoyé par https://fr.wikipedia.org/wiki/Alphabet_arabe
Autre chose :
j'ai modifié le texte français pour que les deux lignes soient bien alignées, c'est mieux pour les comparaisons, et j'ai augmenté la taille de la police, c'est mieux pour les détails.
Ensuite j'ai copié/collé la ligne 2 en ligne 3, j'envisageais de la bidouiller pour voir ce que ça donnerait, mais je ne sais pas où je vais, pour obtenir l'image qu'on voit, je suis allé à la fin de la ligne 3 avec la touche "Fin" puis j'ai appuyé sur Shift Ctrl flèche-à-gauche pour sélectionner le premier caractère à gauche et ça m'a sélectionné tout ce que vous voyez en bleu.
Comme je ne sais pas quoi faire de plus, j'abandonne.
PS : je travaille avec Linux et son petit bloc-note Leafpad, mais ça ne change rien au principe.
Donc, une fois encore on n'avait que la moitié des informations.
A priori il s'agit bien de ma première hypothése, à savoir, détecter si on doit écrire de gauche à droite ou de droite à gauche en fonction des caractères
Pour détecter l'arabe c'est simple je vous ai déjà fourni un code
pour le Tamazight il faut charger le tableau https://fr.wikipedia.org/wiki/Table_..._Unicode/U2D30 selon le même principe mais ne devrait pas poser de problème même si cela s'écrit de gauche à droite (encore un non dit )
Par contre la partie Ravereport (qui n'avait pas été mentionné au départ) va certainement poser des sérieuses difficultés.
Si j'en crois ce post cela dépend de la version de Rave DONC ENCORE UNE QUESTION QUELLE EST VOTRE VERSION DE RAVE
En tout cas rien à voir avec les REST API, je ne suis pas sûr qu'il y existe un dictionnaire Tamazight
bonjour,
pour la version rave c'est 10.0
j'ai crée une petite fonction pour inverser les mots dans les phrases
Mais le probléme est comment savoir que le texte fournie à la fonction est de l'arabe? pour la solution de sergio je ne l'ai pas compris.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 function inverse(s: UNICODEstring): UNICODEstring; var i, l: byte; j: UNICODEstring; k: array [1 .. 30] of UNICODEstring; begin /// showmessage(s); for i := 1 to 30 do k[i] := ''; j := ''; l := 1; for i := 1 to length(s) do begin if s[i] = ' ' then begin /// / SHOWMESSAGE(s+#13+j); k[l] := j; j := ''; l := l + 1; end else begin j := j + s[i]; end; end; k[l] := j; j := ''; for i := 30 downto 1 do if k[i] <> '' then j := j + ' ' + k[i]; inverse := j; end;
Ce n'est pourtant pas compliqué le but est de charger un tableau de caractères rempli par ces 2 lignes
puis d'utiliser la fonction WideStrUtils.inOpArray pour savoir si le caractère est contenu dans le tableau
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SetLength(carray,$6ff-$590); for I := $590 to $6ff do carray[i-$590]:=Char(I);
si oui cela implique que c'est de l'arabe (ou de l'hébreu inclus dans la plage unicode)
il vous faut juste changer le resultat de la fonction en un boolean
Bien sûr ici, je ne teste que le premier caractère mais libre à vous d'en tester d'avantage au sein d'une boucle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 function checkRtl (S : string; E : String = '' ) : boolean; var carray : array of WideChar; i : int64; ws : String; begin result:=false; // ôte les chiffre for I := 0 to 9 do S:=StringReplace(S,i.ToString,'',[rfReplaceAll]); // supprime autres caractères spéciaux S:=StringReplace(S,'(','',[rfReplaceAll]); S:=StringReplace(S,')','',[rfReplaceAll]); S:=StringReplace(S,'"','',[rfReplaceAll]); S:=StringReplace(S,'''','',[rfReplaceAll]); S:=StringReplace(S,'-','',[rfReplaceAll]); // caracteres à ne pas prendre en compte if not E.IsEmpty then begin for I := 1 to Length(E) do S:=StringReplace(S,E[i],'',[rfReplaceAll]); end; S:=Trim(S); if S.IsEmpty then exit; // arabe + hébreux SetLength(carray,$6ff-$590); for I := $590 to $6ff do carray[i-$590]:=Char(I); if inOpArray(S[1],carray) then result:=False; end;
mais peut-être n'avez vous pas compris où j'étais aller chercher les valeurs $590 - $6FF c'est une conversion de U+0590 à U+06FF
pour uniquement l'arabe il faut commencer à $0600
à cela il faudrait ajouter les caractères de U+0750 à U+077F (farsi ?)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SetLength(carray,$6ff-$600); for I := $600 to $6ff do carray[i-$600]:=Char(I);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SetLength(carray,($6ff-$600)+($77F-$750)); for I := $600 to $6ff do carray[i-$600]:=Char(I); for I := $750 to $77F do carray[i-($6ff+($750-$6FF))]:=Char[i]; // j'ai un léger doute sur le calcul de l'indice du tableau i-($6ff+($750-$6FF))
Moi j'aurais simplement remplacer les espaces par un espace ponctuation ou U+200F qui est la "marque droite à gauche"j'ai crée une petite fonction pour inverser les mots dans les phrases
à essayer et voir le résultat dans rave
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 If CheckRTL(texte) then texte:=StringReplace(texte,' ',char($2000),[rfReplaceAll]); // ou If CheckRTL(texte) then texte:=StringReplace(texte,' ',char($200F),[rfReplaceAll]);
Bonjour,
j'ai modifié la fonction que sergio ma proposé de cette façon
vu que la liste des caractères à saisir en arabe est limitée à la liste ci-dessus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 function siara(S : string) : boolean; var const carara : array[1..39] of Widechar = ( 'ء', 'ا', 'ب', 'ج','ح', 'خ', 'ض', 'ص', 'ث','ق', 'ف' , 'غ', 'ع', 'ه','خ', 'ح', 'ج', 'د', 'ذ','ط', 'ك' , 'م', 'ن', 'ت','ا', 'ل', 'ي', 'ي', 'س','ش', 'ظ', 'ز', 'و', 'ة','ى', 'ل','ر', 'ؤ', 'ئ') ; begin if inOpArray(S[1],carara) then result:=true; end;
Moui, ça évidemment, n'écrivant pas l'arabe, je ne peux pas me battre sur ce tableau, moi, j'ai appliqué la définition de l'unicode
par contre j'aurai écrit
sinon le résultat de la fonction sera inconnue dans le cas d'un caractère non arabe
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 function siara(S : string) : boolean; var const carara : array[1..39] of Widechar = ( 'ء', 'ا', 'ب', 'ج','ح', 'خ', 'ض', 'ص', 'ث','ق', 'ف' , 'غ', 'ع', 'ه','خ', 'ح', 'ج', 'د', 'ذ','ط', 'ك' , 'م', 'ن', 'ت','ا', 'ل', 'ي', 'ي', 'س','ش', 'ظ', 'ز', 'و', 'ة','ى', 'ل','ر', 'ؤ', 'ئ') ; begin result:=inOpArray(S[1],carara); end;
Et, il m'intéresserait de savoir si ma suggestion
est efficace appliquée à RaveReport ?Envoyé par sergiomaster
Bonjour,
J'ai pas encore testé tous les cas, mais le texte seulement sans chiffres ni autre langue ça marche .Envoyé par SergioMaster
J'ai remarqué qu'on vous a déjà répondu sur cette question mais il semble que vous n'avez pas vu le massage ..
https://www.developpez.net/forums/d1.../#post10066571
Par curiosité je l'ai testé sur D2009 et rave 7.. et ca a bien marché.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 RvSystem1.SystemFiler.AccuracyMethod:=amAppearance; RvProject.Execute;
Bien vu et cela mérite un de ma part.
Je n'avais pas pensé à un rapprochement entre la discussion pointée avec ce titre "Changer le charset d'un projet" et le sujet
Le pire c'est que Checkal, auteur de cette question, à ré-itéré il y a peu avec celle-ci "inversion de l'affichage dans l'application"
pour finir par ressortir votre solution de 2018
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager