Furkan Gözükara
Furkan Gözükara

Reputation: 23870

How to set default culture info for entire c# application?

I want to set default culture info for specific class or for entire application.

For example in Turkey 3,2 = in English 3.2

So application uses my local culture but I want it to use as default:

System.Globalization.CultureInfo.InvariantCulture

How can I set it to that as default for that specific class or for entire application?

Upvotes: 73

Views: 154575

Answers (4)

Amit Joshi
Amit Joshi

Reputation: 16409

Find the method below which will set culture information for all threads and also for newly created threads.

This works for .NET Framework 4.5 and above. This also works for .NET Core 3.1. Not tested for next versions.

Use any culture you want to set as default. I am using "en-US" for example.

Call following method at your application start-up.

public static void SetDefaultCulture()
{
    CultureInfo cultureInfo = CultureInfo.CreateSpecificCulture("en-US");
    Thread.CurrentThread.CurrentCulture = cultureInfo;
    Thread.CurrentThread.CurrentUICulture = cultureInfo;
    CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
    CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;

    Type type = typeof(CultureInfo);
    type.InvokeMember("s_userDefaultCulture",
                        BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                        null,
                        cultureInfo,
                        new object[] { cultureInfo });

    type.InvokeMember("s_userDefaultUICulture",
                        BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                        null,
                        cultureInfo,
                        new object[] { cultureInfo });
}

Upvotes: 0

Renzo Ciot
Renzo Ciot

Reputation: 3846

If you use a Language Resource file to set the labels in your application you need to set the its value:

CultureInfo customCulture = new CultureInfo("en-US");
Languages.Culture = customCulture;

Upvotes: 1

Eric MSFT
Eric MSFT

Reputation: 3276

With 4.0, you will need to manage this yourself by setting the culture for each thread as Alexei describes. But with 4.5, you can define a culture for the appdomain and that is the preferred way to handle this. The relevant apis are CultureInfo.DefaultThreadCurrentCulture and CultureInfo.DefaultThreadCurrentUICulture.

Upvotes: 60

Alexei Levenkov
Alexei Levenkov

Reputation: 100630

Not for entire application or particular class.

CurrentUICulture and CurrentCulture are settable per thread as discussed here Is there a way of setting culture for a whole application? All current threads and new threads?. You can't change InvariantCulture at all.

Sample code to change cultures for current thread:

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

For class you can set/restore culture inside critical methods, but it would be significantly safe to use appropriate overrides for most formatting related methods that take culture as one of arguments:

(3.3).ToString(new CultureInfo("fr-FR"))

Upvotes: 74

Related Questions