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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Phone .NET Discussion :

Internationalisation : mettre en forme du texte dans les fichiers resx


Sujet :

Windows Phone .NET

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 23
    Points : 107
    Points
    107
    Par défaut Internationalisation : mettre en forme du texte dans les fichiers resx
    Bonjour,

    je suis entrain de développer une appli (heu pardon une app ) pour Windows Phone 7.

    Je vais la traduire en au moins 2 langues en plus du Français et je voulais savoir qu'elles étaient les solutions pour mettre en forme du texte.

    Je m'explique : toutes mes infos texte à traduire sont dans des fichiers ressource .resx. Si je veux que le mot "Toto" apparaisse en gras, quelle est la pratique recommandée ?

    Actuellement je songe à implémenter un système de balisage style bbcode :

    Y a t il une meilleure solution ?

    PS pour des raisons évidentes je ne souhaite pas parser le texte à la recherche de "Toto", car il pourrait très bien être écrit "Titi" en Anglais et "Tyty" en Russe ...

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Tu peux mettre du XAML dans ton fichier de ressources, mais après il faut bidouiller un peu pour l'afficher... En gros il faut afficher le texte dans un ContentPresenter, avec un convertisseur qui va parser le XAML. Voilà un convertisseur qui le fait :

    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
        public class RichTextConverter : IValueConverter
        {
     
            #region IValueConverter Members
     
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                string      str    = "<TextBlock TextWrapping=\"WrapWithOverflow\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" TextAlignment=\"Left\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">" + value + "</TextBlock>";
                object      result = value;
     
                try
                {
                    StringReader strreader = new StringReader(str);
                    XmlTextReader xmlreader = new XmlTextReader(strreader);
                    result = XamlReader.Load(xmlreader);
     
                }
                catch (Exception)
                {
                }
                return result;
            }
     
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotSupportedException();
            }
     
            #endregion
        }
    (j'ai utilisé cette solution en WPF, il faudra peut-être l'adapter un peu pour que ça marche avec Windows Phone)

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    En fait j'ai une solution un peu mieux (comprendre : plus flexible), à base de propriété attachée :

    Code C# : 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
    36
    37
    38
    39
    40
    41
        public static class TextBlockBehavior
        {
            public static string GetRichText(TextBlock textBlock)
            {
                return (string)textBlock.GetValue(RichTextProperty);
            }
     
            public static void SetRichText(TextBlock textBlock, string value)
            {
                textBlock.SetValue(RichTextProperty, value);
            }
     
            public static readonly DependencyProperty RichTextProperty =
                DependencyProperty.RegisterAttached(
                  "RichText",
                  typeof(string),
                  typeof(TextBlockBehavior),
                  new UIPropertyMetadata(
                    null,
                    RichTextChanged));
     
            private static void RichTextChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
            {
                TextBlock textBlock = o as TextBlock;
                if (textBlock == null)
                    return;
     
                var newValue = (string)e.NewValue;
     
                textBlock.Inlines.Clear();
                if (newValue != null)
                    AddRichText(textBlock, newValue);
            }
     
            private static void AddRichText(TextBlock textBlock, string richText)
            {
                string xaml = string.Format(@"<Span xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">{0}</Span>", richText);
                var content = (Inline)XamlReader.Parse(xaml);
                textBlock.Inlines.Add(content);
            }
        }

    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBlock bhv:TextBlockBehavior.RichText="{x:Static prop:Resources.LeTexteRicheEnXaml}" />

    Et dans les ressources tu mets une valeur du genre "Hello <Bold>World</Bold>!"

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 23
    Points : 107
    Points
    107
    Par défaut
    Bon ça commence bien ... j'ai rien compris

    Mais ça ne m'aurait pas empêché d'utiliser ton code, si ce n'est que :
    - il n'y a pas de classe XmlTextReader dans System.Xml pour Windows Phone (1er exemple)
    - UIPropertyMetadata n'existe pas dans System.Windows sous Windows Phone et XamlReader n'a pas de méthode Parse() (2ème exemple).

    Il y a donc une grosse différence entre le framework standard et la version "phone". D'ailleurs en parcourant la liste des dll on se rend compte qu'il y en a beaucoup moins dans la version mobile.

    Merci quand même pour ton aide, je vais sans doute me faire un petit parser perso.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 23
    Points : 107
    Points
    107
    Par défaut
    A bien y regarder, il semblerait que je puisse placer mon texte balisé dans une RichTextBox et qu'elle interprète les balises toute seule comme une grande.

    Je vous tiens au courant de mes recherches.

    Edit :
    après test voici les balises que l'on peut inclure dans la RichTextBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <Bold></Bold>
    <Underline></Underline>
    <Italic></Italic>
    <LineBreak/>
    <Hyperlink></Hyperlink>
    Ce qui m'ira très bien. Je marque donc ce sujet comme résolu.
    Merci Tomlev

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 23
    Points : 107
    Points
    107
    Par défaut
    Et bien en fait le problème n'est pas résolu

    Quand je place une balise dans la RichTextBox tout va bien, par contre si la RTB reçoit mon texte balisé depuis le fichier resx, elle n’interprète pas les balises ...

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par AppMaestro Voir le message
    A bien y regarder, il semblerait que je puisse placer mon texte balisé dans une RichTextBox et qu'elle interprète les balises toute seule comme une grande.
    Ouais mais c'est pas vraiment la même chose... une RichTextBox permet d'éditer du texte, pas seulement de l'afficher. Bien sûr tu peux la mettre en lecture seule, mais ça a pas la même apparence qu'un TextBlock. Et c'est aussi nettement plus lourd...

    Citation Envoyé par AppMaestro Voir le message
    - il n'y a pas de classe XmlTextReader dans System.Xml pour Windows Phone (1er exemple)
    Tu peux utiliser XmlReader.Create :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                ...
                try
                {
                    StringReader strreader = new StringReader(str);
                    var xmlreader = XmlReader.Create(strreader);
                    result = XamlReader.Load(xmlreader);
     
                }
                ...

    Citation Envoyé par AppMaestro Voir le message
    - UIPropertyMetadata n'existe pas dans System.Windows sous Windows Phone
    Remplace UIPropertyMetadata par PropertyMetadata, ça devrait le faire

    Citation Envoyé par AppMaestro Voir le message
    XamlReader n'a pas de méthode Parse() (2ème exemple).
    Tu peux utiliser Load comme dans le premier bout de code :

    Au final ça donne ça :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
        public static class TextBlockBehavior
        {
            public static string GetRichText(TextBlock textBlock)
            {
                return (string)textBlock.GetValue(RichTextProperty);
            }
     
            public static void SetRichText(TextBlock textBlock, string value)
            {
                textBlock.SetValue(RichTextProperty, value);
            }
     
            public static readonly DependencyProperty RichTextProperty =
                DependencyProperty.RegisterAttached(
                  "RichText",
                  typeof(string),
                  typeof(TextBlockBehavior),
                  new PropertyMetadata(
                    null,
                    RichTextChanged));
     
            private static void RichTextChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
            {
                TextBlock textBlock = o as TextBlock;
                if (textBlock == null)
                    return;
     
                var newValue = (string)e.NewValue;
     
                textBlock.Inlines.Clear();
                if (newValue != null)
                    AddRichText(textBlock, newValue);
            }
     
            private static void AddRichText(TextBlock textBlock, string richText)
            {
                string xaml = string.Format(@"<Span xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">{0}</Span>", richText);
                using (var sReader = new StringReader(xaml))
                using (var xReader = XmlReader.Create(sReader))
                {
                    var content = (Inline)XamlReader.Load(xReader);
                    textBlock.Inlines.Add(content);
                }
            }
        }

  8. #8
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    Août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    Hello,

    si j'ai bien compris tu veux internationaliser ton application avec des textes modifiables par l'utilisateur (RichTextBox).

    je comprends à quoi ça sert mais bon.

    normalement dans les fichiers ressources tu as une clé pour toutes les valeurs:

    Clé Anglais Français
    TextDeMonTextBlock Hello Bonjour

    ensuite tu bindes la propriété Text du TextBlock sur la clé et la traduction est automatique.


    pour faire de la mise en forme cela se passe dans la définition XAML du TextBlock.

    J'espère t'avoir aidé

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Citation Envoyé par DotNET74 Voir le message
    ensuite tu bindes la propriété Text du TextBlock sur la clé et la traduction est automatique.

    pour faire de la mise en forme cela se passe dans la définition XAML du TextBlock.
    Ca marche pas aussi facilement car par exemple, le mot souligné en abglais n'est pas au même endroit qu'en français... Du coup il est difficile de séparer la présentation de la traduction... (mais le style est séparable)

    Citation Envoyé par AppMaestro Voir le message
    Et bien en fait le problème n'est pas résolu

    Quand je place une balise dans la RichTextBox tout va bien, par contre si la RTB reçoit mon texte balisé depuis le fichier resx, elle n’interprète pas les balises ...
    Ca me semble normal: as-tu pensé à XML-iser la façon d'écrire tes balises? Mettre du XAML dans du resx, c'est du XML dans du XML, il te faut utiliser des caractères spéciaux html à l'intérieur, notamment les caractères '<' et '>'.... Me trompe-je?

  10. #10
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    Août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    J'avais mal compris le besoin !!!

Discussions similaires

  1. Modifier un texte dans les fichiers d'un répertoire
    Par Azenet dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 09/01/2008, 12h43
  2. [DIA] Mauvaise place du texte dans les fichiers exportés EPS PSTricks
    Par mitch007 dans le forum Editeurs / Outils
    Réponses: 0
    Dernier message: 06/12/2007, 11h52
  3. Réponses: 5
    Dernier message: 27/04/2007, 15h06
  4. [access 2007] Mettre en forme du texte dans une requête
    Par kvoskol dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 22/03/2007, 16h35
  5. [WinXP] rechercher du texte dans les fichiers
    Par arcane dans le forum Windows XP
    Réponses: 3
    Dernier message: 05/05/2006, 12h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo