186 votes

Paramètre CurrentCulture et CurrentUICulture d’une application

Est-il un moyen de réglage de la culture pour l'ensemble de l'application? Tous les threads en cours et de nouveaux threads?

Nous avons le nom de la culture stockées dans une base de données, et lorsque notre application démarre, nous ne

CultureInfo ci = new CultureInfo(theCultureString);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;

Mais, bien sûr, ce choix est "perdu" quand nous voulons faire quelque chose dans un nouveau thread. Est-il un moyen de réglage que CurrentCulture et CurrentUICulture pour l'ensemble de l'application? De sorte que de nouveaux threads obtient également que la culture? Ou est-ce un événement déclenché à chaque fois qu'un nouveau thread est créé que je peux brancher jusqu'à?

207voto

Austin Points 793

Dans .NET 4.5, vous pouvez utiliser le CultureInfo.DefaultThreadCurrentCulture la propriété de changer la culture d'un domaine d'application.

Pour les versions antérieures à la version 4.5, vous devez utiliser la réflexion pour manipuler la culture d'un domaine d'application. Il ya une salle de champ statique sur CultureInfo (m_userDefaultCulture .NET 2.0 mscorlib, s_userDefaultCulture .NET 4.0 mscorlib) qui contrôle ce CurrentCulture retourne si un fil n'a pas défini cette propriété sur lui-même.

Cela ne change pas le thread natif locale et il n'est probablement pas une bonne idée de livrer code qui modifie la culture de cette façon. Il peut être utile pour les tests.

36voto

Marc Gravell Points 482669

Ceci obtient posé beaucoup. Fondamentalement, n’est pas pas là. Vous devez le faire manuellement au début de chaque nouveau thread (ou `` fonction). Vous pouvez peut-être stocker le nom de culture (ou simplement l’objet de culture) dans un champ statique pour enregistrer après avoir frappé la DB, mais qu’elle à ce sujet.

19voto

Reza Sanaie Points 2930

Si vous utilisez des ressources, vous pouvez forcer manuellement par:

Resource1.Culture = new System.Globalization.CultureInfo("fr"); 

Dans le gestionnaire de ressources, il y a une génération automatique de code est comme suit:

/// <summary>
///   Overrides the current thread's CurrentUICulture property for all
///   resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
    get {
        return resourceCulture;
    }
    set {
        resourceCulture = value;
    }
}

Maintenant, chaque fois que vous vous référez à votre chaîne à l'intérieur de cette ressource, elle remplace la culture (thread ou processus) avec le resourceCulture.

Vous pouvez spécifier la langue comme dans "fr", "de", etc. ou mettre le code de la langue comme dans 0x0409 pour fr-fr ou 0x0410-IL. Pour une liste complète des codes de langue, voir: Identificateurs de Langue et les paramètres régionaux

15voto

rastating Points 567

Comme déjà mentionné que cela peut se faire par réflexion. Si quelqu'un veut un exemple et une explication de comment faire cela dans la réflexion, consultez ce lien : http://blog.rastating.com/setting-default-currentculture-in-all-versions-of-net/

6voto

Peter Wone Points 7672

En fait, vous pouvez définir la valeur par défaut thread de la culture et de la culture de l'INTERFACE utilisateur, mais seulement avec le Framework 4.5+

J'ai mis dans ce constructeur statique

static MainWindow()
{
  CultureInfo culture = CultureInfo
    .CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
  var dtf = culture.DateTimeFormat;
  dtf.ShortTimePattern = (string)Microsoft.Win32.Registry.GetValue(
    "HKEY_CURRENT_USER\\Control Panel\\International", "sShortTime", "hh:mm tt");
  CultureInfo.DefaultThreadCurrentUICulture = culture;
}

et mettre un point d'arrêt dans le Convertir méthode de ValueConverter pour voir ce qui est arrivé à l'autre extrémité. CultureInfo.CurrentUICulture a cessé de l'être en NOUS et qu'il est devenu au lieu fr-AU complet avec mon petit hack pour faire respecter les paramètres régionaux pour ShortTimePattern.

Ca y est, tout est bien dans le monde! Ou pas. La culture paramètre passé à la Convertir méthode est encore en-US. Euh, WTF?! Mais c'est un début. Au moins de cette façon

  • vous pouvez corriger la culture de l'INTERFACE utilisateur une fois lors de votre app charges
  • il est toujours accessible à partir de CultureInfo.CurrentUICulture
  • string.Format("{0}", DateTime.Now) de l'utilisation de vos personnalisée paramètres régionaux

Si vous ne pouvez pas utiliser la version 4.5 du cadre puis abandonner sur le réglage de CurrentUICulture comme une propriété statique de CultureInfo et de le définir comme une propriété statique de l'un de vos propres classes. Ce ne sera pas corrigé le comportement par défaut de la chaîne.Format ou faire StringFormat fonctionner correctement dans les liaisons ensuite à pied de votre application logique de l'arbre de recréer toutes les liaisons dans votre application et définir leur convertisseur de culture.

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