全球资源在c#中的最佳实践
当我们想要为所有用户提供应用程序(说不同的语言)时,我们需要一种全球技术。
在C#中,我们使用ResourceManager如下:
using System;
using System.Reflection;
using System.Resources;
public class Example
{
public static void Main()
{
// Retrieve the resource.
ResourceManager rm = new ResourceManager("ExampleResources" ,
typeof(Example).Assembly);
string greeting = rm.GetString("Greeting");
Console.Write("Enter your name: ");
string name = Console.ReadLine();
Console.WriteLine("{0} {1}!", greeting, name);
}
}
// The example produces output similar to the following:
// Enter your name: John
// Hello John!
该程序集有两个或更多语言资源:
部件
| --Assembly.en-us.resx
| --Assembly.zh-cn.resx
然后我们通过更改线程cultureinfo来使用不同的资源来存档以更改资源。
如果应用程序有很多dll(汇编)文件。
我想要为应用程序提供单点(一种语言的一个资源文件)
我的想法有没有很好的解决方案?
在我改变View(例如Winform或UserControl)的Language
,为相应的语言实现不同的UI。
只需使用您描述的方式在C#中建立国际化。 但作为构建过程的最后一步,您可以运行Fody.Costura。
这将采取所有不同的dll并将它们打包到您的应用程序中,以便您只有一个包含所有内容的.exe文件。
好处是您可以按照预期使用C#国际化框架,而不会受到任何攻击,但您仍然可以获得一个可以交付给客户的单个exe文件。
我发现C#国际化框架非常缺乏,所以我通常会为其他项目的资源和参考做一个汇编。 我从某些工具(DB,excel,textfile)生成的资源文件,并将源数据和资源文件都保存在版本控制之下。
MyApp.sln
ResourceProject.csproj
Resources.resx
Resources.ru.resx
Resources.de.resx
Resource.cs
Core.csproj
UI.csproj
资源类可以加载所有不同的程序集
namespace MyApp.Resources
{
public static class Resource
{
private static ResourceManager manager;
static Resource()
{
manager = new ResourceManager("MyApp.Resources", Assembly.GetAssembly(typeof(Resource)));
}
public static string GetString(string key, string culture)
{
return GetString(key, new CultureInfo(culture));
}
public static string GetString(string key, CultureInfo culture)
{
return manager.GetString(key, culture);
}
}
}
这个简单的类可以以各种方式扩展。 在调用程序集中,您可以拥有实用程序类,这些实用程序将根据当前情况根据当前的UI文化或线索文化进行调用。
请注意,这完全避开了任何内置的WinForms或WPF i18N方法。
对于GUI:您可以制作一个递归翻译整个表单的实用工具。 查找本身可以/应该扩展为缺少关键字的警告,备用参数,前缀/命名空间(如果有成千上万个键等)。
链接地址: http://www.djcxy.com/p/23719.html上一篇: Best practices for global resources in c#
下一篇: How can I get the web application assembly in ASP.NET without Global.asax?