2011-12-15 3 views
1

Est-il possible de contrôler explicitement la culture des contrôles afin de définir de quelles ressources (.resx)/culture extraire ses valeurs? Supposons que la culture d'application globale soit "en-US" mais je souhaite que certains contrôles soient dans "sv-SE". Dans mon projet, j'ai un resource.resx et un fichier resource.sv-se.resx. Cela fonctionne bien pour changer de culture/langue pour l'application entière, mais je ne peux pas comprendre comment commander ceci au niveau par-contrôle. J'aurais espéré que le réglage Language="sv-SE" aurait suffi, mais le TextBlock prend toujours sa valeur du fichier de resourses anglais.Ressources WPF: Localisation explicite de contrôles individuels

<Windows 
    xmlns:resx="clr-namespace:MyApplication.Localization" 
    ... 
    > 


    <TextBlock x:Name="TextInEnglish" Text="{x:Static resx:Resources.MyText}" /> 

    <TextBlock x:Name="TextInSwedish" Language="sv-SE" Text="{x:Static resx:Resources.MyText}" /> 
    ... 

Comment est-ce que je ferais cela?

+0

2 Idées: 1) utiliser un convertisseur de valeur et un multiliaison sur langue et texte. 2), ignorez la propriété language et créez une propriété jointe pour la langue et le loca id de texte, qui écoute les modifications et met à jour le texte (ou une autre propriété) en conséquence. Mais je suppose qu'il existe de bien meilleurs moyens de résoudre ce problème. – dowhilefor

+0

@ shadowhilefor: Merci pour votre contribution. J'ai effectivement commencé avec un convertisseur de valeur mais je n'ai pas aimé à la fin. Ca a été un peu brouillon. La 2ème idée semble intéressante mais je pense que je devrais voir dans le code pour bien le comprendre, je pense. À votre santé! –

Répondre

3

La classe ResourceManager ne prend pas en compte la propriété Language, elle utilise uniquement le CurrentUICulture. Mais vous pouvez créer une extension de balisage où vous pouvez spécifier la culture:

public class LocalizedResourceExtension : MarkupExtension 
{ 
    [ConstructorArgument("resourceKey")] 
    public string ResourceKey { get; set; } 

    public CultureInfo Culture { get; set; } 

    public LocalizedResourceExtension() 
    { 
    } 

    public LocalizedResourceExtension(string resourceKey) 
    { 
     this.ResourceKey = resourceKey; 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (string.IsNullOrEmpty(ResourceKey)) 
      throw new InvalidOperationException("ResourceKey must be set"); 

     return Properties.Resources.ResourceManager.GetObject(
      ResourceKey, 
      Culture ?? CultureInfo.CurrentUICulture); 
    } 
} 

Vous pouvez l'utiliser dans votre code comme ceci:

<TextBlock x:Name="TextInEnglish" Text="{loc:LocalizedResource MyText}" /> 

<TextBlock x:Name="TextInSwedish" Text="{loc:LocalizedResource MyText, Culture=sv-SE}"/> 
+0

+1 Superbe réponse et solution! Je vous remercie! –

+0

@AvadaKedavra, vous avez raison, je l'ai réparé –

+0

+1 ainsi, j'aime cette idée. Solution parfaite pour une extension de balisage personnalisée. – dowhilefor

Questions connexes