如何在C#中使用本地化
我似乎无法使本地化工作。
我有一个类库。 现在我想在那里创建resx文件,并返回一些基于线程文化的值。
我怎样才能做到这一点?
- 通过执行以下操作,将资源文件添加到项目中(可以将其称为“strings.resx”):
右键单击项目中的Properties ,在上下文菜单中选择Add – > New Item … ,然后在Visual C#项目列表中选择“Resources file”,并将其命名为strings.resx
。 - 在resx文件中添加一个字符串资源并给它一个好名字(例如:将它命名为“Hello”,并赋予它“Hello”值)
- 保存资源文件( 注意:这将是默认的资源文件,因为它没有双字母语言代码)
- 添加对程序的引用:
System.Threading
和System.Globalization
运行这个代码:
Console.WriteLine(Properties.strings.Hello);
它应该打印“你好”。
现在,添加一个名为“strings.fr.resx”的新资源文件(注意“fr”部分;这将包含法语资源)。 添加与strings.resx中的名称相同的字符串资源,但使用法语(Name =“Hello”,Value =“Salut”)中的值。 现在,如果你运行下面的代码,它应该打印Salut:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR"); Console.WriteLine(Properties.strings.Hello);
会发生什么情况是系统将寻找“fr-FR”的资源。 它不会找到一个(因为我们在你的文件中指定了“fr”),然后回退到检查它找到(和使用)的“fr”。
以下代码将打印出“Hello”:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); Console.WriteLine(Properties.strings.Hello);
那是因为它没有找到任何“en-US”资源,也没有“en”资源,所以它会回退到默认值,这是我们从一开始就添加的。
如果需要,您可以创建具有更多特定资源的文件(例如分别在法国和加拿大的法语中为strings.fr-FR.resx和strings.fr-CA.resx)。 在每个这样的文件中,您将需要为那些不同于它将回退的资源的字符串添加资源。 因此,如果法国和加拿大的文本相同,则可以将其放在strings.fr.resx中,而加拿大法语中的不同字符串可以放入strings.fr-CA.resx中。
实际上这很简单。 创建一个新的资源文件,例如Strings.resx
。 将Access Modifier
设置为Public
。 使用apprioriate文件模板,Visual Studio会自动生成一个访问器类(在这种情况下名字将是Strings
)。 这是您的默认语言。
现在,当你想添加德语本地化时,添加一个本地化的resx文件。 在这种情况下,这通常是Strings.de.resx
。 如果您想为奥地利添加额外的本地化,您还需要创建一个Strings.de-AT.resx
。
现在去创建一个字符串 – 让我们说一个名字为HelloWorld
的字符串。 在您的Strings.resx
,添加值为“Hello,world!”的字符串。 在Strings.de.resx
,添加“Hallo,Welt!”。 在Strings.de-AT.resx
中添加“Servus,Welt!”。 这是迄今为止。
现在你有了这个生成的Strings
类,它有一个getter HelloWorld
的属性。 获得这个属性将加载“Servus,Welt!” 当你的语言环境是de-AT的时候,“当你的语言环境是其他语言环境(包括de-DE和de-CH),Hallo,Welt!和当你的语言环境是其他任何东西时,”Hello,World!在本地化版本中缺失,资源管理器将自动从最专业的资源向不变的资源上链。
您可以使用ResourceManager
类来获得更多关于如何加载内容的控件。 生成的Strings
类也使用它。
另外@FredrikMörk对字符串的很好的回答,为表单添加本地化,请执行以下操作:
- 将表单的属性
"Localizable"
为true
- 将窗体的
Language
属性更改为所需的语言(从一个很好的下拉菜单中选择) - 翻译这种形式的控件,如果需要的话移动它们(把那些真正长的完整的法语句子压扁!)
本地化Windows窗体上的MSDN文章提供了一些更多的信息。
F.Mörk很好的回答。 但是,如果您想更新翻译,或者在应用程序发布后添加新的语言,那么您会遇到困难,因为您总是需要重新编译才能生成resources.dll。
这是一个手动编译资源DLL的解决方案。 它使用resgen.exe和al.exe工具(与sdk一起安装)。
假设你有一个Strings.fr.resx资源文件,你可以用下面的批量编译一个资源dll:
resgen.exe /compile Strings.fr.resx,WpfRibbonApplication1.Strings.fr.resources Al.exe /t:lib /embed:WpfRibbonApplication1.Strings.fr.resources /culture:"fr" /out:"WpfRibbonApplication1.resources.dll" del WpfRibbonApplication1.Strings.fr.resources pause
一定要保留文件名中的原始名称空间(这里是“WpfRibbonApplication1”)
修复和@FredrikMörk答案的阐述。
- 将
Strings.resx
资源文件添加到您的项目(或不同的文件名) - 将
Access Modifier
设置为Public
(在打开的Strings.resx
文件选项卡中) - 在resx文件中添加一个字符串资源:(例如:name
Hello
,valueHello
) - 保存资源文件
Visual Studio自动生成一个相应的Strings
类,它实际上被放置在Strings.Designer.cs
。 这个类与你期望新创建的.cs
文件放在同一个命名空间中。
此代码总是打印Hello
,因为这是默认资源,并且不提供特定于语言的资源:
Console.WriteLine(Strings.Hello);
现在添加一个新的语言特定的资源:
- 添加
Strings.fr.resx
(用于法语) - 添加一个与以前名字相同的字符串,但是不同的值:(name
Hello
,valueSalut
)
以下代码打印Salut
:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR"); Console.WriteLine(Strings.Hello);
什么资源被使用取决于Thread.CurrentThread.CurrentUICulture
。 它根据Windows UI语言设置进行设置,或者可以像本例中那样手动设置。 在这里了解更多。
您可以添加特定于国家/地区的资源,如Strings.fr-FR.resx
或Strings.fr-CA.resx
。
要使用的字符串按以下优先顺序确定:
- 来自特定于国家/地区的资源,如
Strings.fr-CA.resx
- 从特定于语言的资源(如
Strings.fr.resx
- 从默认的
Strings.resx
请注意,语言特定的资源会生成附属程序集 。
还要了解CurrentCulture
与CurrentUICulture
不同之处。
除了@Eric Bole-Feysot答案:
感谢卫星程序集,可以基于.dll / .exe文件创建本地化。 这条路:
- 源代码(VS项目)可以从语言项目中分离出来,
- 添加新的语言不需要重新编译项目,
- 翻译甚至可以由最终用户进行。
有一个叫做LSACreator (免费用于非商业用途或购买选项)的小知名工具,它允许您创建基于.dll / .exe文件的本地化。 实际上,在内部(在语言项目的目录中),它创建/管理resx文件的本地化版本,并按照与@Eric Bole-Feysot所述类似的方式编译程序集。
在我的情况
[assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]
在AssemblyInfo.cs阻止事情照常工作。