How to use localization in C#

后端 未结 9 2475
栀梦
栀梦 2020-11-22 02:59

I just can\'t seem to get localization to work.

I have a class library. Now I want to create resx files in there, and return some values based on the threa

相关标签:
9条回答
  • 2020-11-22 03:24
    • Add a Resource file to your project (you can call it "strings.resx") by doing the following:
      Right-click Properties in the project, select Add -> New Item... in the context menu, then in the list of Visual C# Items pick "Resources file" and name it strings.resx.
    • Add a string resouce in the resx file and give it a good name (example: name it "Hello" with and give it the value "Hello")
    • Save the resource file (note: this will be the default resource file, since it does not have a two-letter language code)
    • Add references to your program: System.Threading and System.Globalization

    Run this code:

    Console.WriteLine(Properties.strings.Hello);
    

    It should print "Hello".

    Now, add a new resource file, named "strings.fr.resx" (note the "fr" part; this one will contain resources in French). Add a string resource with the same name as in strings.resx, but with the value in French (Name="Hello", Value="Salut"). Now, if you run the following code, it should print Salut:

    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
    Console.WriteLine(Properties.strings.Hello);
    

    What happens is that the system will look for a resource for "fr-FR". It will not find one (since we specified "fr" in your file"). It will then fall back to checking for "fr", which it finds (and uses).

    The following code, will print "Hello":

    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
    Console.WriteLine(Properties.strings.Hello);
    

    That is because it does not find any "en-US" resource, and also no "en" resource, so it will fall back to the default, which is the one that we added from the start.

    You can create files with more specific resources if needed (for instance strings.fr-FR.resx and strings.fr-CA.resx for French in France and Canada respectively). In each such file you will need to add the resources for those strings that differ from the resource that it would fall back to. So if a text is the same in France and Canada, you can put it in strings.fr.resx, while strings that are different in Canadian french could go into strings.fr-CA.resx.

    0 讨论(0)
  • 2020-11-22 03:24

    In general you put your translations in resource files, e.g. resources.resx.

    Each specific culture has a different name, e.g. resources.nl.resx, resources.fr.resx, resources.de.resx, …

    Now the most important part of a solution is to maintain your translations. In Visual Studio install the Microsoft MAT tool: Multilingual App Toolkit (MAT). Works with winforms, wpf, asp.net (core), uwp, …

    In general, e.g. for a WPF solution, in the WPF project

    • Install the Microsoft MAT extension for Visual Studio.
    • In the Solution Explorer, navigate to your Project > Properties > AssemblyInfo.cs
    • Add in AssemblyInfo.cs your default, neutral language (in my case English): [assembly: System.Resources.NeutralResourcesLanguage("en")]
    • Select your project in Solution Explorer and in Visual Studio, from the top menu, click "Tools" > "Multilingual App Toolkit" > "Enable Selection", to enable MAT for the project.
      • Now Right mouse click on the project in Solution Explorer, select "Multilingual App Toolkit" > "Add translation languages…" and select the language that you want to add translations for. e.g. Dutch.

    What you will see is that a new folder will be created, called "MultilingualResources" containing a ....nl.xlf file.

    The only thing you now have to do is:

    1. add your translation to your default resources.resx file (in my case English)
    2. Translate by clicking the .xlf file (NOT the .resx file) as the .xlf files will generate/update the .resx files.

    (the .xlf files should open with the "Multilingual Editor", if this is not the case, right mouse click on the .xlf file, select "Open With…" and select "Multilingual Editor".

    Have fun! now you can also see what has not been translated, export translations in xlf to external translation companies, import them again, recycle translations from other projects etc...

    More info:

    • Using the Multilingual App Toolkit 4.0: https://docs.microsoft.com/windows/uwp/design/globalizing/use-mat
    • Multilingual App Toolkit blog, visit: http://aka.ms/matblog
    • Multilingual App Toolkit User Voice feature voting site, visit: http://aka.ms/matvoice
    0 讨论(0)
  • 2020-11-22 03:33

    It's quite simple, actually. Create a new resource file, for example Strings.resx. Set Access Modifier to Public. Use the apprioriate file template, so Visual Studio will automatically generate an accessor class (the name will be Strings, in this case). This is your default language.

    Now, when you want to add, say, German localization, add a localized resx file. This will be typically Strings.de.resx in this case. If you want to add additional localization for, say, Austria, you'll additionally create a Strings.de-AT.resx.

    Now go create a string - let's say a string with the name HelloWorld. In your Strings.resx, add this string with the value "Hello, world!". In Strings.de.resx, add "Hallo, Welt!". And in Strings.de-AT.resx, add "Servus, Welt!". That's it so far.

    Now you have this generated Strings class, and it has a property with a getter HelloWorld. Getting this property will load "Servus, Welt!" when your locale is de-AT, "Hallo, Welt! when your locale is any other de locale (including de-DE and de-CH), and "Hello, World!" when your locale is anything else. If a string is missing in the localized version, the resource manager will automatically walk up the chain, from the most specialized to the invariant resource.

    You can use the ResourceManager class for more control about how exactly you are loading things. The generated Strings class uses it as well.

    0 讨论(0)
提交回复
热议问题