Tue, November 30, 2004, 11:45 AM under
MobileAndEmbedded
One of the FAQs on the CF newsgroup is regarding changing the
Thread.CurrentThread.CurrentCulture. The answer is that it is not supported. Instead, the user must change the language on the device and restart your application for changes to take effect
[Not restarting the application is possible by reloading ALL resources but the approach is dirty and is as good as restarting the app anyway, so there is no point going through the hassle to do it - trust me].
If your app is running in kiosk mode (or for whatever other reason you wish that the user changes the language through your UI), it is easy to set a dialog up for the said purpose. Just list the languages in a combobox associating with each comboxitem a
LCID; when the user selects the language and confirms their selection, you have to change the system language via the
SetUserDefaultLCID API (and restart your app). Some devices support MUI, so in those cases you also have to call the
SetUserDefaultUILanguage API (and reset/restart the unit).
To finish the story on language change, on our platform I don't go through the APIs but instead apply the changes via the registry (the API is the way to go, but I am not doing that for our own historical reasons - not relevant here). In case it helps someone, these are the registry entries (shouldn't be too different to others):
-HKLM\nls\DefaultLCID
-HKLM\nls\overrides\LCID
-HKLM\SOFTWARE\Microsoft\International\LCID
-HKLM\MUI\SysLang
-HKCU\MUI\CurLang
As you'd expect, I set the LCID in each one of these DWORD values, flush the registry (
RegFlushKey) and perform a soft reset (
KernelIOControl\
IOCTL_HAL_REBOOT).
After your app restarts you may want to know what the locale is. You may do this through CultureInfo.
CurrentCultre (and CultureInfo.
CurrentUICultre).
Note that sometimes you just need to perform some formatting based on a locale other than the system-wide one e.g. the French decimal point is comma "," and you may want to parse a string containing doubles that come from a network where dot "." is the decimal point. In those cases you have to use overloads of the framework's methods that can accept a CultureInfo (or any other
IFormatProvider object) as a parameter, e.g.
Double.Parse or
DateTime.ParseNext we look at resources in
satellite assemblies.