The words you're using have different meanings in different contexts so I'm a little unclear what you are trying to ask.
An Exception
is used to report an error. It is a programmer to programmer construct. It is not designed for users to see (although many people do anyway). Therefore the locale (e.g. English) doesn't really matter as far as error reporting/handling goes.
Having said that ultimately an exception just takes a string. If you need your exception messages (which you really shouldn't be showing to the user) to be localized to the user's system then you need to bring in a resource manager such as ResourceManager. You then use the RM to retrieve the exception message to be used by the exception rather than using a string literal.
//Using a string literal
throw new Exception("Something went wrong");
//Using a localized string
throw new Exception(Resources.Error_SomethingWentWrong);
The assumption here is that you added all your exception messages to your application's resources (via the Resources
tab of the project). The Resources
auto-generated class uses the RM to get the string localized for the user. If you don't want to use the auto-generated stuff then you have to create your own RM instance and pass it around. How you would do that is documented in the link I gave earlier.
Of course for any of this to work you must also create separate resource assemblies for each language you want to localize your application to. If the system doesn't find a localized version of the value it is looking for then it will return the original string (English most likely).
As for your question "does a project where user can choose the language" it doesn't make sense to me. The only user who works with a project would be a developer and therefore the language they choose is the programing language. Error messages are not specific to programming languages so that wouldn't matter.
In terms of how you change the language I assume you mean for the program's UI. That is determined by CultureInfo.CurrentUICulture and is set to the locale that Windows itself runs under. If the application is running on a Spanish Windows system then the UI culture is set to the Spanish-equivalent culture. Your app can change that by setting the earlier mentioned property. But note that just because you change the UI culture of your program doesn't mean suddenly it'll start using that new language. Windows itself doesn't install all UI cultures so changing from English to German won't have any noticeable impact unless the user has also installed the German language pack on Windows. You would also need to have provided your own German resource assembly so your application can use the localized resources. .NET Framework is also localized but the language packs are not installed for other languages. If you need to support multiple languages on the same machine you need to install the language pack for .NET as well otherwise .NET messages will be in English. The current language packs are here.
Lastly note that there is also a CurrentCulture
value that is independent of the UI. The UI culture is used for UI stuff like dialog text, formatting of date/times, etc. The culture is for everything else. Generally you need to set both to the same value otherwise you might see odd behavior.