Kivy: Rendu de la langue hindi (indienne) incorrecte dans l'application Kivy pour Android

Créé le 14 oct. 2020  ·  23Commentaires  ·  Source: kivy/kivy

Versions du logiciel

Lorsque je rends le texte suivant avec le script google NotoSansfont pour Devanagari dans Kivy Android, je le reçois de manière incorrecte. J'ai vu des messages similaires dans SO pour d'autres langues et il est dit d'utiliser le fournisseur de texte pango, mais il mentionne également qu'il n'est pas disponible pour Android. Existe-t-il une possibilité de rendre la police correctement dans Android dans une application Kivy. Ce sera une réussite ou une rupture pour l'utilisation de kivy comme plate-forme de développement d'applications pour nous, car nous devons prendre en charge les langues indiennes dans notre application mobile.

Exemple de texte Sortie attendue ->
image

Exemple de sortie de rendu de texte ->
image

Cela se produit dans tous les contrôles - Label et TextInputs et nous avons essayé différents fichiers ttf - NotoSans, Akshar, au moins 10 autres fichiers de polices.

La seule police qui fonctionne correctement est GNU Unifont pour nous, mais c'est parce qu'elle contient tous les glyphes et le problème que nous avons est qu'elle n'a pas l'air bien ni lisible bien que ce soit maintenant notre seule option actuelle.

Pouvons-nous obtenir de l'aide ici s'il vous plaît?

exemple de code :
à partir de l'application d'importation kivy.app
à partir de kivy.uix.image importer l'image
de kivy.uix.label import Étiquette
depuis kivy.uix.boxlayout importer BoxLayout
de kivy.uix.button Importer le bouton

classe MainApp (App) :
def build(self):
label = Label(text="अंतरिक्ष", font_name="notosans.ttf", size_hint=(0.5,0.5),pos_hint={'center_x':.5,'center_y':.5})
layout = BoxLayout(padding =10)
layout.add_widget(étiquette)
mise en page de retour

si __name__=='__main__' :
app = MainApp()
app.run()

Lien du fichier de police : https://fonts.google.com/specimen/Noto+Sans?subset=devanagari

Commentaire le plus utile

@kriyanation il est important de garder à l'esprit qu'aucun des développeurs de Kivy n'est payé pour travailler sur Kivy et que nous travaillons sur Kivy pendant notre temps libre et selon nos propres intérêts. Donc, en général, il est considéré comme impoli de pousser les développeurs, qui vous font don de leur temps, à respecter les échéances commerciales, car cela sera probablement contre-productif.

Si une fonctionnalité n'a pas été implémentée, cela signifie que personne n'a jusqu'à présent trouvé le temps ou l'intérêt de l'implémenter, qu'il s'agisse de développeurs ou d'utilisateurs. Le moyen le plus rapide d'obtenir une fonctionnalité, surtout si vous en avez besoin rapidement à des fins professionnelles, est de l'implémenter vous-même et de trouver un core-dev également intéressé par le problème pour vous aider à l'intégrer, ou d'attendre si un core-dev apparaît l'intérêt. Mais si cela ne fonctionne pas pour vous, le logiciel open source peut ne pas correspondre à vos besoins.

Tous les 23 commentaires

Faites-moi savoir si je comprends bien, la police notosans a le glyphe 'क्ष' mais n'est pas affichée lorsque vous l'utilisez pour l'étiquette kivy ? Je vais essayer de regarder ce problème si c'est le cas.

C'est un problème mineur ou un problème avec lequel nous pouvons vivre car le glyphe « क्ष » n'est pas utilisé très fréquemment dans les mots. Le problème majeur est que रि est rendu hors séquence par र et que le glyphe ि vient après la lettre. La séquence est le problème. Cela se produit également pour d'autres langues indiennes comme le tamoul et le bengali. Exemple de problème -> https://stackoverflow.com/questions/63047020/kivy-isnt-showing-bengali-unicode-character-properly

Merci, cette question de débordement de pile est utile. Il y a une longue discussion à ce sujet ici : https://github.com/kivy/kivy/issues/2669. Cette question est toujours ouverte.

Une solution possible est ici : https://github.com/kivy/kivy/issues/4902

Selon #4902 , il suggère d'utiliser pango textprovider qui est possible sous Linux mais je ne pense pas que ce soit possible avec Android ou l'emballage kivy fournit un moyen d'utiliser le moteur de rendu sous Android en utilisant Python pour Android. Alors, concluons-nous que le Kivy ne prend pas en charge les langues indiennes dans Android et allons-nous de l'avant ?

@kriyanation est-ce que votre problème est spécifique à l'hindi ?

Du point de vue des exigences immédiates, oui, mais le problème du mauvais séquençage des glyphes se produit dans de nombreuses langues indiennes, comme mentionné ci-dessus.

Pouvez-vous essayer le remodelage de texte arabe ? https://github.com/mpcabd/python-arabic-reshaper Je pense que j'ai essayé cela une fois et cela a semblé résoudre beaucoup de problèmes pour moi avec l'hindi aussi. Je ne me souviens pas que cela fonctionne avec re particulier. Essaye maintenant pour voir si ça marche

Si le remodelage de texte arabe fonctionne, vous pouvez simplement l'inclure tel quel, car le remodelage de texte arabe et python-bidi sont du python pur et devraient fonctionner tels quels si vous les incluez dans votre dossier app

J'ai essayé votre suggestion. Voici le code avec le remodeleur arabe. Il semble rendre le texte de la même manière. J'espère que je l'ai utilisé de la bonne manière, veuillez également vérifier de votre côté.

from kivy.app import App
from kivy.uix.image import Image
from kivy.uix.label import Label
from kivy.uix.boxlayout import  BoxLayout
from kivy.uix.button import Button
import arabic_reshaper

class MainApp(App):
    def build(self):
        text = "अंतरिक्ष"
        reshaped_text = arabic_reshaper.reshape(text)
        label = Label(text=reshaped_text, font_name="notosans.ttf", size_hint=(0.5,0.5),pos_hint={'center_x':.5,'center_y':.5})
        layout = BoxLayout(padding =10)
        layout.add_widget(label)
        return layout



if __name__=='__main__':
    app = MainApp()
    app.run()

d'ailleurs, le problème n'est pas seulement avec "re", c'est avec tous les alphabets avec l'extension ि. Exemples Mots ci-dessous - En effet la langue devient globalement illisible à cause de ce problème.
| | ??
| | ??
| | ??

d'accord, j'ai essayé

import kivy.app
import kivy.uix.label
import arabic_reshaper
import bidi.algorithm
class TestApp(kivy.app.App):
    def build(self):
        reshaped_text = arabic_reshaper.reshape("अंतरिक्ष")
        bidi_text = bidi.algorithm.get_display(reshaped_text)
        return kivy.uix.label.Label(text=bidi_text, font_name="/Users/quanon/Library/Android/sdk/platforms/android-28/data/fonts/NotoSansDevanagari-Bold.ttf")

testApp = TestApp()
testApp.run()

J'ai le résultat :
Screenshot 2020-10-15 at 12 24 20 AM

D'après ce que j'ai compris, le problème vient d'une mauvaise forme/positionnement plutôt que d'un retour de police, n'est-ce pas ?
Si c'est le cas, devrions-nous pouvoir adapter le remodelage de texte arabe ou le python-bidi à notre objectif ?
En y repensant un peu...

Oui, le positionnement est principalement faux. Si cela peut être fait, cela signifierait pour nous que le monde va de l'avant.

Je regarde https://github.com/python-pillow/Pillow/pull/2576/files, cela semble avoir ajouté la prise en charge du remodelage direct de l'oreiller, ce qui signifierait que nous devrions pouvoir utiliser simplement le fournisseur de texte d'oreiller, bien que juste utiliser KIVY_TEXT=pil ne semble rien résoudre pour moi… nécessite une enquête plus approfondie.

Mise à jour : problème connexe pour référence https://github.com/python-pillow/Pillow/issues/1089

Oui, j'ai également essayé le fournisseur de texte pil sur Android, le fournisseur de texte change avec succès mais le rendu reste le même.

Bien que je sois totalement novice en ce qui concerne l'aspect du rendu des polices et juste un développeur d'applications, j'ai lu dans d'autres articles que harfbuzz a la capacité de rendre des polices complexes.
Je vois que lorsque la version p4a est en cours d'exécution pour Android, il existe maintenant une dépendance de type libre pour mon application après avoir ajouté l'arabic-shaper et dans le journal de construction, je vois quelque chose comme la compilation de type libre avec harfbuzz=No . Est-ce que le changer en harfbuzz=yes nous aiderait? Juste une observation aléatoire, vous pouvez l'ignorer si cela n'a pas de sens.

quelques références supplémentaires https://forums.libsdl.org/viewtopic.php?p=48243
Ce patch semble être une bonne chose à intégrer dans p4a sdl2_ttf en tant que patch….

Mise à jour, p4a inclut déjà harfbuzz. Nous devrions donc juste avoir besoin de mettre à jour sdl2_ttf au plus tard et d'activer harfbuzz au moment de la compilation et d'avoir un remodelage des polices. Théoriquement, cela devrait alors pouvoir être activé par défaut sur toutes les plates-formes, car sdl2 est le fournisseur de texte par défaut.

C'est une bonne discussion. Je laisse également une référence au problème d'oreiller à ce sujet : https://github.com/python-pillow/Pillow/issues/3191

Des suggestions pour une solution rapide? Puis-je faire quelque chose dans mon système de développement qui est Ubuntu où mon build p4a s'exécute pour essayer des choses ? Pour moi, p4a est une boîte noire - donc si vous pouvez m'aider avec quelques instructions, je peux l'essayer dans mon système.

Une mise à jour à ce sujet s'il vous plaît? Nous aurions besoin de prendre une décision sur cette base d'ici la fin de la semaine. Kivy répond à toutes nos exigences et c'est un plaisir de se développer, mais cela peut être un obstacle de notre point de vue commercial. Ainsi, toutes les idées d'aide et d'exploration seront utiles.

J'ai demandé sur le groupe Google des programmeurs sanskrit : https://groups.google.com/g/sanskrit-programmers/c/I57qkxqT-q0/m/EQ69f_TKAAAJ. En espérant obtenir plus de réponse là-bas.

On dirait que ce n'est pas une priorité pour le support ou le développement de Kivy. Nous passerons au développement natif cette semaine. La prise en charge multilingue est désormais une exigence de facto pour les frameworks logiciels de nos jours. Ce serait bien si vous pouviez le prioriser à l'avenir pour que les développeurs l'utilisent davantage.

@kriyanation il est important de garder à l'esprit qu'aucun des développeurs de Kivy n'est payé pour travailler sur Kivy et que nous travaillons sur Kivy pendant notre temps libre et selon nos propres intérêts. Donc, en général, il est considéré comme impoli de pousser les développeurs, qui vous font don de leur temps, à respecter les échéances commerciales, car cela sera probablement contre-productif.

Si une fonctionnalité n'a pas été implémentée, cela signifie que personne n'a jusqu'à présent trouvé le temps ou l'intérêt de l'implémenter, qu'il s'agisse de développeurs ou d'utilisateurs. Le moyen le plus rapide d'obtenir une fonctionnalité, surtout si vous en avez besoin rapidement à des fins professionnelles, est de l'implémenter vous-même et de trouver un core-dev également intéressé par le problème pour vous aider à l'intégrer, ou d'attendre si un core-dev apparaît l'intérêt. Mais si cela ne fonctionne pas pour vous, le logiciel open source peut ne pas correspondre à vos besoins.

Assez juste.Merci.

Cette page vous a été utile?
0 / 5 - 0 notes