2009-06-25 7 views
1

Je suis confronté à un problème qui semble ne pas avoir de solution raisonnable/traitable avec laquelle je suis satisfait. Silverlight et l'internationalisation - un bourbier en devenir.Silverlight - Valeurs de ressources paramétrées pour l'internationalisation

J'ai un ensemble de fichiers de ressources qui contiennent des chaînes traduites.

Dans le cas simple, je peux déclarer la ressource de langue etc. et lier le contenu/texte d'une valeur dans la ressource fortement typée. Thats bien - beaucoup d'exemples de cela posté autour.

Un cas moins simple est que les chaînes peuvent avoir un paramètre, j'ai donc besoin d'injecter une valeur dans la chaîne pour l'afficher, ce qui en soi peut être une liaison de données.

Le scénario le plus complexe est une chaîne avec plusieurs paramètres. Vous pouvez argumenter que la machine virtuelle devrait fournir cette capacité, mais je suis mécontent de cela car elle brise le fossé entre le concepteur UX et le développeur, exigeant que le développeur implémente une propriété/méthode sur la machine virtuelle pour supporter chaque chaîne l'interface utilisateur nécessite. Par exemple: Le concepteur décide après les commentaires de l'utilisateur d'ajouter une info-bulle personnalisée avec plus d'informations à ce sujet. L'info-bulle est faite de manière déclarative et combine une meilleure explication avec les valeurs du datacontext. L'explication est stockée dans les ressources et les valeurs utilisées proviennent soit d'un contexte de données existant, soit d'un élément à une liaison d'élément.

Si je dois exécuter chaque chaîne via la machine virtuelle, l'ajout de quelque chose comme ceci nécessite des changements de machine virtuelle. De même, si la source des paramètres provient d'autres éléments, la machine virtuelle n'est pas nécessairement en mesure de fournir la chaîne formatée.

Comment les gens ont-ils contourné/abordé ce problème?

A.

Répondre

0

Cette question est plus complexe que je ne peux pas répondre pleinement, mais si vous voulez des liaisons d'envisager une localisation spécifique, vous devez définir la propriété de la langue de l'interface utilisateur conteneur (peut-être votre classe UserControl de haut niveau). Après cela, toutes les liaisons doivent utiliser la localisation demandée. Consultez cet article, qui concerne WPF mais utilise des techniques qui semblent s'appliquer à Silverlight: http://www.west-wind.com/weblog/posts/796725.aspx

0

Je ne sais pas exactement ce que vous voulez faire mais vous avez plusieurs solutions.

  • Créer une nouvelle chaîne dans votre machine virtuelle et le rendre INotifyPropertyChanged-mesure

    public string MyTranslatedString 
    { 
        get 
        { 
         return string.Format("{0} Someone", LocalizedResource.Hello; 
        } 
    }; 
    

Et puis écouter les événements de changement de localisation (à partir de votre application)

  • Créer plusieurs blocs de texte et lier les éléments localisés:

    <TextBlock HorizontalAlignment="Stretch" Foreground="Black" Text="{Binding Path=Resource.CurrentlyLoggedInAs, Source={StaticResource LocalizedStrings }}" VerticalAlignment="Center" Margin="0,0,5,0" /> 
    <TextBlock HorizontalAlignment="Stretch" Foreground="Black" Text="{Binding Path=Username}" VerticalAlignment="Center" Margin="0,0,5,0" /> 
    <Button Commands:Click.Command="{Binding Path=LogOutCommand}" Commands:Click.CommandParameter="" Content="{Binding Path=Resource.LogOut, Source={StaticResource LocalizedStrings }}" /> 
    

Vous devez ajouter dans votre application principale:

<Application.Resources> 
    <local:LocalizedStrings 
     xmlns:local="clr-namespace:Localization.Silverlight;assembly=Localization.Silverlight" 
     x:Key="LocalizedStrings" /> 
</Application.Resources> 

Ce sont les approches les plus faciles, je suis venu avec mais je suis très heureux d'avoir quelque chose qui me procure quelque chose de plus simple.

+0

Cette solution remet tout dans la machine virtuelle qui est le problème original et ce que je souhaite éviter. Whist une machine virtuelle devrait être consciente qu'elle va être consommée par une vue, pour que chaque chaîne de chaque vue consommant la machine virtuelle sortant de la machine virtuelle soit impraticable, et tout élément à la liaison d'élément qui ne provient pas de la machine virtuelle pouvoir être utilisé. par exemple. Un bloc de texte indiquant "La valeur actuelle est {0}" et l'espace réservé provenant d'un curseur sur la vue. la VM peut ne pas avoir connaissance du curseur car c'est un morceau UX pur qui n'est pas persistant (disons le niveau de zoom actuel.) – Andrew

+0

J'ai essayé votre solution mais j'ai aussi un ResourceDictionary dans mon ayant mon défaut feuille de style. À cause de cela, je reçois une erreur "Le type" ResourceDictionary "est dans un ResourceDictionary et n'a pas de clé." Savez-vous ce que je pourrais faire pour résoudre ce problème, parce que quand je mets une clé je ne suis pas capable d'utiliser le style à travers les applications. J'utilise les étapes décrites sur http://msdn.microsoft.com/en-us/library/dd882554(VS.96).aspx – Nordes

+0

Les styles doivent être inclus en tant que dictionnaire. Pour moi, cela signifie que la section des ressources qui ressemble à: R4cOON

Questions connexes