我只是不能让本地化工作。

我有一个类库。现在我想在那里创建resx文件,并根据线程区域性返回一些值。

我该怎么做呢?


当前回答

一个修复和细化的@Fredrik Mörk答案。

添加一个字符串。resx资源文件到您的项目(或不同的文件名) 将Access Modifier设置为Public(在打开的字符串中)。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 . currentuicculture。它的设置取决于Windows UI语言设置,也可以像本例中那样手动设置。点击这里了解更多。

您可以添加特定国家的资源,如strings.fr-FR.resx或strings.fr-CA.resx。

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

来自特定国家的资源,如strings.fr-CA.resx 从特定于语言的资源,如strings.fr.resx 从默认的strings.resx

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

还可以在这里了解CurrentCulture与CurrentUICulture的不同之处。

其他回答

一个修复和细化的@Fredrik Mörk答案。

添加一个字符串。resx资源文件到您的项目(或不同的文件名) 将Access Modifier设置为Public(在打开的字符串中)。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 . currentuicculture。它的设置取决于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所描述的方式编译程序集。

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

运行以下代码:

Console.WriteLine(Properties.strings.Hello);

它应该打印“Hello”。

现在,添加一个名为“strings.fr.resx”的新资源文件(注意“fr”部分;这个将包含法语的资源)。添加与字符串中同名的字符串资源。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中。

对我来说

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

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

此外,@Fredrik Mörk关于字符串的伟大回答,要添加本地化到一个表单,请执行以下操作:

将表单的属性“Localizable”设置为true 将表单的Language属性更改为您想要的语言(从一个漂亮的下拉菜单中) 翻译这种形式的控件,并在需要时移动它们(把那些非常长的完整的法语句子塞进去!)

编辑:这篇MSDN关于Windows窗体本地化的文章不是我链接的原始文章…但如果需要的话,可能会提供更多线索。(旧的已经被拿走了)