46 votes

La césure dans Android

Dans le cadre de l'internationalisation d'une application Android, j'ai été confronté à la nécessité de mettre dynamiquement en forme les mots ou les traits d'union à la bonne position.

Toutes mes chaînes de caractères sont externalisées dans des fichiers strings.xml mais je n'ai trouvé aucune documentation sur la césure dans Android.

J'aimerais pouvoir suggérer des positions de césure, comme je peux le faire dans LaTeX :

http://en.wikipedia.org/wiki/Hyphenation_algorithm

Mais je n'ai pas trouvé d'indication si cela est possible. Y a-t-il quelque chose dans le cadre que j'ai manqué ? Que font les autres personnes, par exemple avec les chaînes de caractères japonaises qui n'ont pas de position évidente pour interrompre une phrase ? Ajoutez-vous simplement des espaces aux positions correctes ?

Je pourrais modifier dynamiquement la taille de la police pour l'adapter à certaines mises en page, mais cela ne fonctionne pas pour les messages plus longs qui s'étendent sur plusieurs lignes. Que faire ?

2 votes

Android respecte-t-il le caractère soft-hyphen ? (U+00AD)

0 votes

J'ai eu des problèmes similaires avec le coréen et d'autres langues où les mots isolés sont énormes. Je suis donc intéressé par une réponse. Une question pourrait être : est-il acceptable de briser le mot en premier lieu ?

0 votes

@anon oui, un caractère de trait d'union doux pourrait être intéressant. Je vais vérifier cela.

13voto

Athul Points 468

C'est une nouveauté d'Android 6 Marshmellow.

Essayez d'ajouter ceci à votre TextView xml

android:hyphenationFrequency="none"

7voto

La gestion des ruptures de ligne peut être un véritable casse-tête. La meilleure option est d'utiliser des caractères de contrôle modificateurs de saut de ligne UTF, car Android prend en charge l'UTF complet.

Je sais que quelqu'un a mentionné le "soft-hyphen", mais il y en a bien d'autres.

Vous pouvez également utiliser le "Zero Width Space" entre les mots dans les langues qui n'ont pas d'espaces, afin de ne pas avoir à vous fier à l'interprétation du dictionnaire. Vous pouvez également l'utiliser comme trait d'union dans les langues qui autorisent la coupure de certains mots par des lignes à certains endroits.

Lorsque vous utilisez un mot composé que vous ne voulez pas casser, mais que vous voulez que le système Text To Speech le reconnaisse correctement, vous devez utiliser le caractère "Word Separator". N'utilisez pas le caractère "Zero Width Non Breaking Space" car il a été déprécié en raison de son utilisation comme BOM.

Enfin, si vous voulez un espace mais pas de saut de ligne, utilisez un simple espace insécable.

7 votes

Utilisé avec succès \u200b pour cela dans le fichier de ressources xml avec des chaînes de caractères

1 votes

Les tirets doux sont un outil extrêmement utile et ont fonctionné dans Android en ciblant l'API 21 -. \u00AD fr.wikipedia.org/wiki/Soft_hyphen

0 votes

Comme pour toutes les plates-formes, la disponibilité des raccourcis "&" utilisés en HTML dépend de l'endroit où ils sont utilisés dans l'application.

6voto

OneWorld Points 6140

Tiret doux a fonctionné sur un appareil Samsung Galaxy à partir d'Android 4.3.

<!-- key combination to enter soft hyphen: [Alt Gr]+[-] or [Alt]+240 on German PC, see https://de.wikipedia.org/wiki/Weiches_Trennzeichen#Darstellung_auf_Computersystemen -->
<string name="no_connection">Nicht ver-bund-en</string>

enter image description here

Comme mon cas d'utilisation était assez restreint, j'ai utilisé un seul trait d'union dans le mot "verbunden". L'Unicode \u00ad n'a eu aucun effet.

5voto

bluejamesbond Points 1937

La bibliothèque suivante prend en charge la césure. Elle effectue tous les types d'alignement de texte (gauche/droite/centre/justifié) et la césure pour vous. Toutes les langues n'ont pas été ajoutées mais peuvent l'être si nécessaire. Cette bibliothèque utilise PAS DE VIDÉOS WEB y SUPPORTS SPANNABLES et permet TEXTE LONG .

BIBLIOTHEQUE : https://github.com/bluejamesbond/TextJustify-Android

Android : 2.2 à 5.X

SETUP

DocumentView documentView = addDocumentView(new StringBuilder("Your long text content"), DocumentView.PLAIN_TEXT);
documentView.getDocumentLayoutParams().setTextAlignment(TextAlignment.JUSTIFIED);
documentView.getDocumentLayoutParams().setHyphenator(new Hyphenator(HyphenPattern.PT));
documentView.getDocumentLayoutParams().setHyphenated(true);

3voto

user1519979 Points 613

La question est ancienne mais je viens de trouver la meilleure solution pour moi :

Je dois dire que je programme en Xamarin, donc le code est en C# mais cela ne devrait pas être un problème de le porter en Java.

J'ai utilisé la logique de NHyphenator ( https://github.com/alkozko/NHyphenator ) pour l'insertion de SoftHyphens(UTF8 Symbol - 0x00AD) afin que le Textview fasse la césure au bon endroit.

Pour obtenir la césure pour d'autres langues, j'ai utilisé les dictionnaires d'openoffice. Par exemple, j'ai dû obtenir la césure pour la langue germano-suisse.

http://extensions.openoffice.org/en/search?f[0]=balises_de_projet%3A157 1. Télécharger l'extension 2. Décompressez-la avec Winrar ou autre. 3. Copiez le fichier hyph_xx_xx/hyph_xx_xx.dic. 4. Ajouter une nouvelle langue à la classe Hyphenator

Les fichiers de ressources NHyphernator sont déclarés comme : hyph-xx-xx.pat.txt --> contenu du fichier dic sans commentaires hyph-xx-xx.hyp.txt --> fichier contenant les mots-exceptions pour lesquels la logique de césure ne donne pas de résultats corrects.

Si quelqu'un veut la bibliothèque portable pour Xamarin, dites-le moi, je peux la télécharger.

EDIT :

La stratégie de rupture doit être définie comme équilibrée dans TExtview. Niveau API > 23, sinon n'utilisez pas de stratégie de rupture.

EDIT :

Voici le code mono/xamarin : https://github.com/sma84/NHyphenator-Mono

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X