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

Silverlight Discussion :

Navigation application silverlight et multi langue


Sujet :

Silverlight

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 110
    Par défaut Navigation application silverlight et multi langue
    Bonjour à tous,

    j'ai pour projet de migrer l'intranet de mon entreprise actuellement en webdev vers un site dotnet et j'aurai aimé le faire en silverlight 3.

    En faisant certains test de comparaison avec le site actuel, je me retrouve confronté à un problème d'ordre majeur. L'intranet est actuellement disponible sous plusieurs langues (Français par défaut, Espagnol, Italien) et en voulant mettre cela en place en Silverlight je n'y arrive pas.

    J'ai procédé de 2 méthodes :
    - La première avec des fichiers Ressources (.resx), un fichier pour chaque langue. Le premier fichier étant la langue par défaut c'est celui qui possède le constructeur.

    J'ai réussi à lié les différentes propriétés (text, content) avec les valeurs du fichier ressource par défaut mais je n'arrive pas à changer de fichier ressource quand je sélectionne une autre langue sur la page de démarrage, si je sélectionne le fichier espagnol c'est toujours la langue française à l'affichage.


    - La deuxième méthode que j'ai essayé a été d'utiliser des dictionnaires de ressources pour chaque langue et de renseigner dans le fichier app.xaml celui qui correspond à la langue par défaut. Mais le problème que je retrouve, c'est que je n'arrive pas à changer de fichier de ressource au moment de la sélection d'une autre langue.

    J'ai utilisé ces deux méthodes en WPF, je me retrouve bloqué avec la première mais la seconde fonctionne très bien. Pour la deuxième, la différence qui se fait est avec la fonction LoadComponent() de App qui, en WPF prend 1 paramètre mais en Silverlight en prend 2.

    Voilà le problème auquel je suis confronté, avez vous eu le même problème et surtout avez une solution ?

    Merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 056
    Par défaut
    Je pense que ce billet va t'aider .

    http://blogs.microsoft.co.il/blogs/a...resources.aspx

    Sinon je suppose que le framework .net 4 n'est pas installé sur le serveur de prod, et donc impossible de faire du SL 4 ?

  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 : 43
    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
    Par défaut
    Citation Envoyé par micka132 Voir le message
    Sinon je suppose que le framework .net 4 n'est pas installé sur le serveur de prod, et donc impossible de faire du SL 4 ?
    Silverlight n'a pas besoin de composants installés sur le serveur... tu peux déployer des applis Silverlight sur un serveur Linux/Apache si ça t'amuse.

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Il est vrai que vouloir faire du Silverlight 3 aujourd'hui c'est quand même se tirer une balle dans le pied
    Il n'y a plus les SDK trouvables facilement et la doc est que pour le 4!

    Pour ma part, au boulot je suis en SL4 et .Net 3.5

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 110
    Par défaut
    Merci ça correspond à ce que je veux mettre en place, je vais étudier ça de plus près.

    Par contre, je ne suis pas encore décidé sur la version de Silverlight, le framework qui est installé sur le serveur de prod est le 3.5 et il n'est pas prévus pour le moment d'installer le framework 4 tant que nous avons pas fait une étude par rapport à l'existant se trouvant sur le serveur, notamment au niveau de sql server qui lui est en version 2005 sp3.

    En tout cas merci pour les réponses

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 110
    Par défaut
    j'ai essayé d'adapter le code du liens ci-dessus pour mon application mais lorsque j'exécute le projet, la page web s'ouvre bien mais j'ai une erreur sur l'initialisation du constructeur :
    Aucun constructeur correspondant n'a été trouvé sur le type "applicationtest.Lang"
    Pourtant j'ai bien tout déclaré dans la page au niveau du xaml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:local="clr-namespace:applicationtest"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <navigation:Page.Resources>
            <local:Lang x:Key="LangStr"/>
    </navigation:Page.Resources>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button Margin="50,5,0,5" Width="100" Content="{Binding ButtonEnter, Source={StaticResource LangStr}}"/>
    Le binding fonctionne bien puisque le text dans le bouton s'affiche en mode création.

    J'ai bien mit en public le fichier de ressource qui contient le fichier Designer.

    Quelqu'un a une idée ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 110
    Par défaut
    Alors j'ai trouvé d'où venait le problème, le fait de changer le modificateur d'accès de internal en public du fichier ressource ne fonctionne pas à 100% car le constructeur reste lui en internal, il faut donc le modifier manuellement et je pense que j'ai le problème depuis le début d'où ma présence sur le forum ^^.

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par Ornitho76 Voir le message
    Merci ça correspond à ce que je veux mettre en place, je vais étudier ça de plus près.

    Par contre, je ne suis pas encore décidé sur la version de Silverlight, le framework qui est installé sur le serveur de prod est le 3.5 et il n'est pas prévus pour le moment d'installer le framework 4 tant que nous avons pas fait une étude par rapport à l'existant se trouvant sur le serveur, notamment au niveau de sql server qui lui est en version 2005 sp3.

    En tout cas merci pour les réponses
    Comme je te l'ai dit plus haut, au boulot on tourne avec Silverlight 4 et .NET 3.5 donc rien ne t'empeche d'avoir Silverlight 4.

  9. #9
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 056
    Par défaut
    Citation Envoyé par Ornitho76 Voir le message
    Alors j'ai trouvé d'où venait le problème, le fait de changer le modificateur d'accès de internal en public du fichier ressource ne fonctionne pas à 100% car le constructeur reste lui en internal, il faut donc le modifier manuellement et je pense que j'ai le problème depuis le début d'où ma présence sur le forum ^^.
    Oui c'est marqué dans le tuto.
    Hum oui vu que Silverlight est détaché du framework .net on fait ce qu'on veut au final.

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 110
    Par défaut
    Après plusieurs test, je m'aperçois que quand je change la culture du thread afin de changer le langage d'affichage, cela ne fait rien, le fichier de ressource ne change pas et le texte non plus pourtant en testant sur une application WPF le changement de la culture se fait bien ainsi que le changement du fichier de ressource.

    Sur mon interface j'ai 3 contrôles :
    - 2 radiobutton permettant de changer la langue
    - 1 button dont le texte change en sélectionnant un langue

    Rien de bien compliqué sauf que seul le texte par défaut s'affiche et reste affiché.

  11. #11
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Sur developpez on trouve un excellent article sur le sujet, écrit par Benjamin Roux.

    Cela devrait t'aider je pense :

    http://broux.developpez.com/articles...-localisation/

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 110
    Par défaut
    Merci pour ce lien,
    c'est très bien expliqué mais j'ai quand même une question comment utiliser la méthode ChangeCulture() de la classe LangHelper ? car là je ne vois pas et en instanciant un nouvel objet dans le code behind ça ne fonctionne pas donc j'ai sûrement oublié quelque chose.

  13. #13
    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 : 43
    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
    Par défaut
    Citation Envoyé par Ornitho76 Voir le message
    comment utiliser la méthode ChangeCulture() de la classe LangHelper ? car là je ne vois pas et en instanciant un nouvel objet dans le code behind ça ne fonctionne pas donc j'ai sûrement oublié quelque chose.
    Récupère l'instance de LangHelper dans les ressources:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LangHelper helper = (LangHelper)Resources["Lang"];
    helper.ChangeCulture("en-US");
    Sinon, perso j'aurais implémenté ça différemment, avec une méthode statique :

    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
    public class LangHelper : INotifyPropertyChanged
    {
        private static Language mResource = new Language();
        private static List<LangHelper> _instances = new List<LangHelper>();
     
        public LangHelper()
        {
            _instances.Add(this);
        }
     
        public Language Resource
        {
            get { return mResource; }
        }
     
        public static void ChangeCulture(string culture)
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo(culture);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
            NotifyAllInstances();
        }
     
        private static NotifyAllInstances()
        {
            foreach (var helper in _instances)
            {
                helper.NotifyPropertyChanged("Resource");
            }
        }
     
        #region INotifyPropertyChanged Members
     
        public event PropertyChangedEventHandler PropertyChanged;
     
        private void NotifyPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
     
        #endregion
    }
    Comme ça il suffit d'appeler LangHelper.ChangeCulture, et toutes les instances de LangHelper mettent à jour les contrôles liés

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 38
    Par défaut
    Et on l'appelrais ou LangHelper.ChangeCulture ? je vois pas !

  15. #15
    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 : 43
    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
    Par défaut
    Citation Envoyé par jorrie Voir le message
    Et on l'appelrais ou LangHelper.ChangeCulture ? je vois pas !
    Bah à l'endroit où tu veux changer la langue, par exemple dans le code du clic d'un bouton qui valide le choix de la langue...

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 38
    Par défaut
    Moi si je clique sur mon bouton il ne se passe rien dynamiquement.

    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
    Namespace Helper
        Public Class LangHelper
            Implements INotifyPropertyChanged
     
            Private mResource As New Languages.Language
            Private _instances As New List(Of LangHelper)
     
            Public ReadOnly Property Resource As Languages.Language
                Get
                    Return mResource
                End Get
            End Property
     
            Public Sub New()
                _instances.Add(Me)
            End Sub
     
            Private Sub NotifyAllInstances()
                For Each Helper As LangHelper In _instances
                    Helper.NotifyPropertyChanged("Resource")
                Next
            End Sub
     
            Public Sub ChangeCulture(culture As String)
                Thread.CurrentThread.CurrentCulture = New CultureInfo(culture)
                Thread.CurrentThread.CurrentUICulture = New CultureInfo(culture)
                NotifyPropertyChanged("Resource")
            End Sub
     
    #Region "INotifyPropertyChanged Members"
     
            Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
     
            Private Sub NotifyPropertyChanged(name As String)
                RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name))
            End Sub
    #End Region
        End Class
    End Namespace

    Et voici le code de mon bouton, je comprend pas ce qui cloche pourtant si je modifie mon URL en ajoutant ?lang=en-US cela fonctionne


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Dim res As New Helper.LangHelper
            res.ChangeCulture("fr-FR")

    Code de chargement de mon projet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     Private Sub Application_Startup(ByVal o As Object, ByVal e As StartupEventArgs) Handles Me.Startup
            If (HtmlPage.Document.QueryString.Keys.Contains("lang")) Then
                Dim lang As String = HtmlPage.Document.QueryString("lang")
                Thread.CurrentThread.CurrentCulture = New CultureInfo(lang)
                Thread.CurrentThread.CurrentUICulture = New CultureInfo(lang)
            End If
     
            Me.RootVisual = New MainPage()
        End Sub

  17. #17
    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 : 43
    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
    Par défaut
    Moi si je clique sur mon bouton il ne se passe rien dynamiquement.
    Bah c'est normal, c'est à cause de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Dim res As New Helper.LangHelper
            res.ChangeCulture("fr-FR")
    Tu ne changes pas la culture sur le LangHelper qui est utilisé dans ton appli, mais sur une nouvelle instance de LangHelper, donc ça n'a aucun effet...

    D'autre part, ta classe LangHelper semble être un mélange de la classe de l'article et de la variante que j'avais proposée... Dans ma version la méthode ChangeCulture est statique (Shared en VB) et appelle NotifyAllInstances, pas OnPropertyChanged. Et dans ce cas pas besoin d'avoir une instance de LangHelper, il suffit de faire LangHelper.ChangeCulture("fr-FR")

Discussions similaires

  1. Réponses: 8
    Dernier message: 22/01/2013, 23h49
  2. Bien créer une application multi-langues ? Unicode ou non ?
    Par Maxime Abbey dans le forum Composants VCL
    Réponses: 28
    Dernier message: 10/09/2007, 17h20
  3. Application multi-langue [Delphi 7]
    Par guence dans le forum Delphi
    Réponses: 3
    Dernier message: 05/09/2006, 12h43
  4. Application multi-langue
    Par JerBi dans le forum EDI
    Réponses: 2
    Dernier message: 15/09/2005, 02h22
  5. [Application multi-langues] Compilateur ou fichier lng ?
    Par Teb dans le forum Composants VCL
    Réponses: 5
    Dernier message: 16/08/2005, 16h48

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