如何在C#中使用本地化

我似乎无法使本地化工作。

我有一个类库。 现在我想在那里创建resx文件,并返回一些基于线程文化的值。

我怎样才能做到这一点?

  • 通过执行以下操作,将资源文件添加到项目中(可以将其称为“strings.resx”):
    右键单击项目中的Properties ,在上下文菜单中选择Add – > New Item … ,然后在Visual C#项目列表中选择“Resources file”,并将其命名为strings.resx
  • 在resx文件中添加一个字符串资源并给它一个好名字(例如:将它命名为“Hello”,并赋予它“Hello”值)
  • 保存资源文件( 注意:这将是默认的资源文件,因为它没有双字母语言代码)
  • 添加对程序的引用: System.ThreadingSystem.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 ,value Hello
  • 保存资源文件

Visual Studio自动生成一个相应的Strings类,它实际上被放置在Strings.Designer.cs 。 这个类与你期望新创建的.cs文件放在同一个命名空间中。

此代码总是打印Hello ,因为这是默认资源,并且不提供特定于语言的资源:

 Console.WriteLine(Strings.Hello); 

现在添加一个新的语言特定的资源:

  • 添加Strings.fr.resx (用于法语)
  • 添加一个与以前名字相同的字符串,但是不同的值:(name Hello ,value Salut

以下代码打印Salut

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

什么资源被使用取决于Thread.CurrentThread.CurrentUICulture 。 它根据Windows UI语言设置进行设置,或者可以像本例中那样手动设置。 在这里了解更多。

您可以添加特定于国家/地区的资源,如Strings.fr-FR.resxStrings.fr-CA.resx

要使用的字符串按以下优先顺序确定:

  • 来自特定于国家/地区的资源,如Strings.fr-CA.resx
  • 从特定于语言的资源(如Strings.fr.resx
  • 从默认的Strings.resx

请注意,语言特定的资源会生成附属程序集 。

还要了解CurrentCultureCurrentUICulture不同之处。

除了@Eric Bole-Feysot答案:

感谢卫星程序集,可以基于.dll / .exe文件创建本地化。 这条路:

  • 源代码(VS项目)可以从语言项目中分离出来,
  • 添加新的语言不需要重新编译项目,
  • 翻译甚至可以由最终用户进行。

有一个叫做LSACreator (免费用于非商业用途或购买选项)的小知名工具,它允许您创建基于.dll / .exe文件的本地化。 实际上,在内部(在语言项目的目录中),它创建/管理resx文件的本地化版本,并按照与@Eric Bole-Feysot所述类似的方式编译程序集。

在我的情况

 [assembly: System.Resources.NeutralResourcesLanguage("ru-RU")] 

在AssemblyInfo.cs阻止事情照常工作。