我只是不能让本地化工作。
我有一个类库。现在我想在那里创建resx文件,并根据线程区域性返回一些值。
我该怎么做呢?
我只是不能让本地化工作。
我有一个类库。现在我想在那里创建resx文件,并根据线程区域性返回一些值。
我该怎么做呢?
当前回答
对我来说
[assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]
在AssemblyInfo.cs中阻止事情正常工作。
其他回答
除了@Eric Bole-Feysot的回答:
由于卫星程序集,本地化可以基于.dll/.exe文件创建。这种方式:
源代码(VS项目)可以与语言项目分离, 添加新语言不需要重新编译项目, 甚至最终用户也可以进行翻译。
有一个鲜为人知的工具叫做LSACreator(非商业用途免费或购买选项),它允许您基于.dll/.exe文件创建本地化。事实上,它在内部(在语言项目的目录中)创建/管理resx文件的本地化版本,并以类似于@Eric Bole-Feysot所描述的方式编译程序集。
其实很简单。创建一个新的资源文件,例如Strings.resx。“访问修饰符”设置为“公共”。使用适当的文件模板,这样Visual Studio将自动生成一个访问器类(在本例中,名称为Strings)。这是您的默认语言。
现在,当你想添加,比如说,德语本地化,添加一个本地化的resx文件。在本例中,这通常是string .de.resx。如果你想为奥地利添加额外的本地化,你需要额外创建一个Strings.de-AT.resx。
现在去创建一个字符串——假设一个名为HelloWorld的字符串。在你的弦里。resx,添加值为“Hello, world!”的字符串。在Strings.de.resx中添加“Hallo, Welt!”在Strings.de-AT.resx中添加“Servus, Welt!”到目前为止就是这样。
现在你有了这个生成的Strings类,它有一个属性和getter HelloWorld。获取此属性将加载“Servus, Welt!”当您的locale为de-AT时,“Hallo, Welt!”当你的locale是任何其他de locale(包括de- de和de- ch)时,和“Hello, World!”当你的locale是任何其他地方时。如果本地化版本中缺少一个字符串,资源管理器将自动沿着链向上走,从最专门化的资源到不变的资源。
你可以使用ResourceManager类来控制你如何加载东西。生成的Strings类也使用它。
通常你把翻译放在资源文件中,例如resources.resx。
每个特定区域性都有不同的名称,例如resources.nl。Resx, resources.fr.resx, resources.de.resx,…
现在解决方案中最重要的部分是维护您的翻译。 在Visual Studio中安装Microsoft MAT工具:多语言应用程序工具包(MAT)。 工作与winforms, wpf, asp.net(核心),uwp,…
一般来说,例如对于WPF解决方案,在WPF项目中
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.
您将看到将创建一个名为“MultilingualResources”的新文件夹,其中包含一个....nl。xlf文件。
你现在要做的唯一一件事是:
将翻译添加到默认资源中。resx文件(在我的例子中是英文) 通过点击.xlf文件(不是.resx文件)进行翻译,因为.xlf文件将生成/更新.resx文件。
(.xlf文件应该用“多语言编辑器”打开,如果不是这样,鼠标右键单击。xlf文件,选择“用…打开”,然后选择“多语言编辑器”。
玩得开心!现在你还可以看到没有翻译的内容,用XLF导出翻译到外部翻译公司,再次导入,从其他项目回收翻译等等……
更多信息:
使用多语言App Toolkit 4.0: https://learn.microsoft.com/windows/uwp/design/globalizing/use-mat 多语言App Toolkit博客,请访问: http://aka.ms/matblog 多语言App Toolkit用户语音功能投票网站,访问: http://aka.ms/matvoice
一个修复和细化的@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的不同之处。
对我来说
[assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]
在AssemblyInfo.cs中阻止事情正常工作。