全球资源在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?