我似乎无法让本地化工作 .
我有一个类库 . 现在我想在那里创建resx文件,并根据线程文化返回一些值 .
我怎样才能做到这一点?
通过执行以下操作,将资源文件添加到项目中(可以将其命名为"strings.resx"):右键单击项目中的 Properties ,在上下文菜单中选择 Add -> New Item... ,然后在 Visual C# Items 选择 "Resources file" 列表中,并将其命名为 strings.resx .
strings.resx
在resx文件中添加一个字符串资源并给它一个好名字(例如:将其命名为"Hello"并给它赋值"Hello")
保存资源文件( note: 这将是 default 资源文件,因为它没有双字母语言代码)
添加对程序的引用: System.Threading 和 System.Globalization
System.Threading
System.Globalization
运行此代码:
Console.WriteLine(Properties.strings.Hello);
它应该打印“你好” .
现在,添加一个名为“strings.fr.resx”的新资源文件(注意“fr”部分;这个文件将包含法语资源) . 添加一个字符串资源,其名称与strings.resx中的名称相同,但值为French(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 ) . 这是您的默认语言 .
Strings.resx
Access Modifier
Public
Strings
现在,当您想添加德语本地化时,添加本地化的resx文件 . 在这种情况下,这通常是 Strings.de.resx . 如果您想为奥地利添加其他本地化,您还需要创建一个 Strings.de-AT.resx .
Strings.de.resx
Strings.de-AT.resx
现在去创建一个字符串 - 让我们说一个名为 HelloWorld 的字符串 . 在 Strings.resx 中,使用值"Hello, world!"添加此字符串 . 在 Strings.de.resx 中,添加"Hallo, Welt!" . 在 Strings.de-AT.resx 中,添加"Servus, Welt!" . 到目前为止就是这样 .
HelloWorld
现在你有了这个生成的 Strings 类,它有一个带有getter HelloWorld 的属性 . 获取此属性将在您的语言环境为de-AT时加载"Servus, Welt!","Hallo, Welt! when your locale is any other de locale (including de-DE and de-CH), and " Hello,World!“当您的语言环境是其他任何内容时 . 如果本地化版本中缺少字符串,资源管理器将自动从链中向上走专门针对不变资源 .
您可以使用 ResourceManager 类来更好地控制加载内容的准确程度 . 生成的 Strings 类也使用它 .
ResourceManager
另外@FredrikMörk对字符串的答案非常好,要添加 localization to a form ,请执行以下操作:
将表单的属性 "Localizable" 设置为 true
"Localizable"
true
将表单的 Language 属性更改为您想要的语言(从一个漂亮的下拉列表中全部输入)
Language
翻译该表格中的控件并在必要时移动它们(压缩那些真正长满的法语句子!)
这个MSDN article on Localizing Windows Forms提供了更多信息 .
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”)
修复和阐述 @Fredrik Mörk 答案 .
将 strings.resx 资源文件添加到项目中(或其他文件)文件名)
将 Access Modifier 设为 Public (在打开的 strings.resx 文件标签中)
在resx文件中添加字符串资源:(示例:name Hello ,value Hello )
Hello
保存资源文件
Visual Studio自动生成相应的 strings 类,实际上放在 strings.Designer.cs 中 . 该类与您期望将新创建的 .cs 文件放在同一名称空间中 .
strings
strings.Designer.cs
.cs
此代码始终打印 Hello ,因为这是默认资源,并且没有特定于语言的资源:
Console.WriteLine(strings.Hello);
现在添加一个新的语言特定资源:
添加 strings.fr.resx (法语)
strings.fr.resx
添加一个与之前名称相同的字符串,但值不同:(名称 Hello ,值 Salut )
Salut
以下代码打印 Salut :
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR"); Console.WriteLine(strings.Hello);
使用什么资源取决于 Thread.CurrentThread.CurrentUICulture . 它根据Windows UI语言设置进行设置,或者可以像本例中一样手动设置 . 了解有关此here的更多信息 .
Thread.CurrentThread.CurrentUICulture
您可以添加特定于国家/地区的资源,例如 strings.fr-FR.resx 或 strings.fr-CA.resx .
strings.fr-FR.resx
strings.fr-CA.resx
要使用的字符串按此优先级顺序确定:
来自特定国家/地区的资源,例如 strings.fr-CA.resx
来自特定语言的资源,如 strings.fr.resx
来自默认 strings.resx
请注意,特定于语言的资源会生成satellite assemblies .
另请参阅 CurrentCulture 与 CurrentUICulture here的区别 .
CurrentCulture
CurrentUICulture
除了@Eric Bole-Feysot回答:
由于附属程序集,可以基于 .dll/.exe 文件创建本地化 . 这条路:
源代码(VS项目)可以与语言项目分开,
添加新语言不需要重新编译项目,甚至最终用户也可以进行
翻译 .
有一个名为LSACreator的小工具(免费用于非商业用途或购买选项),它允许您基于.dll / .exe文件创建本地化 . 事实上,在内部(在语言项目的目录中),它创建/管理resx文件的本地化版本,并以与@Eric Bole-Feysot描述的方式类似的方式编译程序集 .
就我而言
[assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]
在AssemblyInfo.cs中,事情无法正常工作 .
7 回答
通过执行以下操作,将资源文件添加到项目中(可以将其命名为"strings.resx"):
右键单击项目中的 Properties ,在上下文菜单中选择 Add -> New Item... ,然后在 Visual C# Items 选择 "Resources file" 列表中,并将其命名为
strings.resx
.在resx文件中添加一个字符串资源并给它一个好名字(例如:将其命名为"Hello"并给它赋值"Hello")
保存资源文件( note: 这将是 default 资源文件,因为它没有双字母语言代码)
添加对程序的引用:
System.Threading
和System.Globalization
运行此代码:
它应该打印“你好” .
现在,添加一个名为“strings.fr.resx”的新资源文件(注意“fr”部分;这个文件将包含法语资源) . 添加一个字符串资源,其名称与strings.resx中的名称相同,但值为French(Name =“Hello”,Value =“Salut”) . 现在,如果您运行以下代码,它应该打印Salut:
会发生什么是系统将寻找“fr-FR”的资源 . 它找不到一个(因为我们在你的文件中指定了“fr”) . 然后它会回到检查它找到(并使用)的“fr” .
以下代码将打印“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
类,它有一个带有getterHelloWorld
的属性 . 获取此属性将在您的语言环境为de-AT时加载"Servus, Welt!","Hallo, Welt! when your locale is any other de locale (including de-DE and de-CH), and " Hello,World!“当您的语言环境是其他任何内容时 . 如果本地化版本中缺少字符串,资源管理器将自动从链中向上走专门针对不变资源 .您可以使用
ResourceManager
类来更好地控制加载内容的准确程度 . 生成的Strings
类也使用它 .另外@FredrikMörk对字符串的答案非常好,要添加 localization to a form ,请执行以下操作:
将表单的属性
"Localizable"
设置为true
将表单的
Language
属性更改为您想要的语言(从一个漂亮的下拉列表中全部输入)翻译该表格中的控件并在必要时移动它们(压缩那些真正长满的法语句子!)
这个MSDN article on Localizing Windows Forms提供了更多信息 .
F.Mörk的精彩回答 . 但是如果你想要在应用程序发布后更新翻译或添加新语言,那么你就会陷入困境,因为你总是需要重新编译它来生成resources.dll .
这是手动编译资源dll的解决方案 . 它使用resgen.exe和al.exe工具(随sdk一起安装) .
假设您有一个Strings.fr.resx资源文件,您可以使用以下批处理编译资源dll:
确保将原始命名空间保留在文件名中(此处为“WpfRibbonApplication1”)
修复和阐述 @Fredrik Mörk 答案 .
将
strings.resx
资源文件添加到项目中(或其他文件)文件名)将
Access Modifier
设为Public
(在打开的strings.resx
文件标签中)在resx文件中添加字符串资源:(示例:name
Hello
,valueHello
)保存资源文件
Visual Studio自动生成相应的
strings
类,实际上放在strings.Designer.cs
中 . 该类与您期望将新创建的.cs
文件放在同一名称空间中 .此代码始终打印
Hello
,因为这是默认资源,并且没有特定于语言的资源:现在添加一个新的语言特定资源:
添加
strings.fr.resx
(法语)添加一个与之前名称相同的字符串,但值不同:(名称
Hello
,值Salut
)以下代码打印
Salut
:使用什么资源取决于
Thread.CurrentThread.CurrentUICulture
. 它根据Windows UI语言设置进行设置,或者可以像本例中一样手动设置 . 了解有关此here的更多信息 .您可以添加特定于国家/地区的资源,例如
strings.fr-FR.resx
或strings.fr-CA.resx
.要使用的字符串按此优先级顺序确定:
来自特定国家/地区的资源,例如
strings.fr-CA.resx
来自特定语言的资源,如
strings.fr.resx
来自默认
strings.resx
请注意,特定于语言的资源会生成satellite assemblies .
另请参阅
CurrentCulture
与CurrentUICulture
here的区别 .除了@Eric Bole-Feysot回答:
由于附属程序集,可以基于 .dll/.exe 文件创建本地化 . 这条路:
源代码(VS项目)可以与语言项目分开,
添加新语言不需要重新编译项目,
甚至最终用户也可以进行
翻译 .
有一个名为LSACreator的小工具(免费用于非商业用途或购买选项),它允许您基于.dll / .exe文件创建本地化 . 事实上,在内部(在语言项目的目录中),它创建/管理resx文件的本地化版本,并以与@Eric Bole-Feysot描述的方式类似的方式编译程序集 .
就我而言
在AssemblyInfo.cs中,事情无法正常工作 .