Existe-t-il un moyen de définir la culture pour toute une application? Tous les fils actuels et nouveaux fils?
Nous avons le nom de la culture stocké dans une base de données, et lorsque notre application démarre, nous faisons
CultureInfo ci = new CultureInfo(theCultureString);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
Mais, bien sûr, cela se «perd» lorsque nous voulons faire quelque chose dans un nouveau fil. Existe-t-il un moyen de définir cela CurrentCulture
et CurrentUICulture
pour l'ensemble de l'application? Alors que les nouveaux fils obtiennent également cette culture? Ou est-ce un événement déclenché chaque fois qu'un nouveau fil est créé auquel je peux me connecter?
c#
multithreading
cultureinfo
Svish
la source
la source
Réponses:
Dans .NET 4.5, vous pouvez utiliser la
CultureInfo.DefaultThreadCurrentCulture
propriété pour modifier la culture d'un AppDomain.Pour les versions antérieures à 4.5, vous devez utiliser la réflexion pour manipuler la culture d'un AppDomain. Il existe un champ statique privé sur
CultureInfo
(m_userDefaultCulture
dans .NET 2.0 mscorlib,s_userDefaultCulture
dans .NET 4.0 mscorlib) qui contrôle ce quiCurrentCulture
revient si un thread n'a pas défini cette propriété sur lui-même.Cela ne modifie pas les paramètres régionaux du thread natif et ce n'est probablement pas une bonne idée d'envoyer du code qui change la culture de cette façon. Cela peut être utile pour les tests.
la source
Cela est souvent demandé. En gros, non, pas pour .NET 4.0. Vous devez le faire manuellement au début de chaque nouveau thread (ou
ThreadPool
fonction). Vous pouvez peut-être stocker le nom de la culture (ou simplement l'objet de culture) dans un champ statique pour éviter d'avoir à accéder à la base de données, mais c'est à peu près tout.la source
Si vous utilisez des ressources, vous pouvez le forcer manuellement en:
Dans le gestionnaire de ressources, il existe un code généré automatiquement qui se présente comme suit:
Désormais, chaque fois que vous faites référence à votre chaîne individuelle dans cette ressource, elle remplace la culture (thread ou processus) par la resourceCulture spécifiée.
Vous pouvez soit spécifier la langue comme dans «fr», «de» etc. ou mettre le code de langue comme dans 0x0409 pour en-US ou 0x0410 pour it-IT. Pour une liste complète des codes de langue, veuillez vous référer à: Identificateurs de langue et paramètres régionaux
la source
Resource1.Culture = Null;
Pour .net 4.5 et supérieur, vous devez utiliser
la source
En fait, vous pouvez définir la culture de thread et la culture d'interface utilisateur par défaut, mais uniquement avec Framework 4.5+
J'ai mis dans ce constructeur statique
et mettez un point d'arrêt dans la méthode Convert d'un ValueConverter pour voir ce qui est arrivé à l'autre extrémité. CultureInfo.CurrentUICulture a cessé d'être en-US et est devenu à la place en-AU complet avec mon petit hack pour le faire respecter les paramètres régionaux de ShortTimePattern.
Hourra, tout va bien dans le monde! Ou pas. Le paramètre de culture passé à la méthode Convert est toujours en-US. Euh, WTF?! Mais c'est un début. Au moins de cette façon
CultureInfo.CurrentUICulture
string.Format("{0}", DateTime.Now)
utilisera vos paramètres régionaux personnalisésSi vous ne pouvez pas utiliser la version 4.5 du framework, abandonnez la définition de CurrentUICulture en tant que propriété statique de CultureInfo et définissez-la comme propriété statique de l'une de vos propres classes. Cela ne corrigera pas le comportement par défaut de string.Format ou ne fera pas fonctionner StringFormat correctement dans les liaisons, puis parcourez l'arborescence logique de votre application pour recréer toutes les liaisons dans votre application et définir leur culture de convertisseur.
la source
Pour ASP.NET5, c'est-à-dire ASPNETCORE, vous pouvez effectuer les opérations suivantes dans
configure
:Voici une série d'articles de blog qui donnent plus d'informations.
la source
Cette réponse est un peu d'expansion pour la grande réponse de @ rastating. Vous pouvez utiliser le code suivant pour toutes les versions de .NET sans aucun souci:
la source
DefaultThreadCurrentCulture
etDefaultThreadCurrentUICulture
sont également présents dans Framework 4.0, mais ils sont privés. En utilisant Reflection, vous pouvez facilement les définir. Cela affectera tous les threads oùCurrentCulture
n'est pas explicitement défini (les threads en cours d'exécution aussi).la source
Voici la solution pour c # MVC:
Premièrement: créez un attribut personnalisé et une méthode de remplacement comme celle-ci:
Deuxièmement: dans App_Start, recherchez FilterConfig.cs, ajoutez cet attribut. (cela fonctionne pour toute l'application)
C'est tout !
Si vous souhaitez définir la culture pour chaque contrôleur / action au lieu de l'application entière, vous pouvez utiliser cet attribut comme ceci:
Ou:
la source
Solution de travail pour définir CultureInfo pour tous les threads et fenêtres.
la source