2015-08-25 10 views
6

Когда мы хотим сделать наше приложение для всех пользователей (говорить на разных языках), нам нужна глобальная технология.
В C# мы используем ResourceManager следующим образом:Рекомендации по глобальным ресурсам в C#

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
| --Assembly.en-us.resx
| --Assembly.zh- cn.resx

Затем мы архивируем, чтобы изменить ресурс, изменив thread cultureinfo, чтобы использовать другой ресурс.

Если в приложении много файлов DLL (сборки).
Я хочу иметь одну точку (один файл ресурсов для одного языка) для приложения,
Есть ли хорошее решение для моей идеи?

Перед тем, как просто изменить вид (например, Winform или UserControl) Language для реализации различных пользовательских интерфейсов для соответствующего языка.

ответ

0

Просто постройте интернационализацию на C#, используя описанный вами способ. Но как последний шаг процесса сборки, вы можете запустить Fody.Costura.

Это займет все разные DLL и упакует их в ваше приложение, так что у вас будет только один .exe-файл со всем включенным.

Преимущество в том, что вы можете использовать рамки интернационализации C#, как и предполагалось, без каких-либо взломов, но вы по-прежнему получаете один exe, который вы можете доставить своим клиентам.

0

Я нахожу, что рамки интернационализации 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); 
     } 
    } 
} 

Этот простой класс может быть расширен различными способами. В вызывающих сборках вы можете иметь классы утилиты, которые будут вызывать на основе текущей культуры пользовательского интерфейса или культуры потоков в зависимости от ситуации.

Обратите внимание, что это полностью исключает любые встроенные методы WinForms или WPF i18N.

Для GUI: вы можете сделать утилиту, которая рекурсивно переводит целые формы. Сам поиск может/должен быть расширен с предупреждениями о недостающих ключах, резервными аргументами, префиксами/пространствами имен, если у вас есть тысячи ключей и т. Д.