2015-08-25 17 views
6

Wenn wir unsere Anwendung für alle Benutzer (sprechen verschiedene Sprachen) machen wollen, brauchen wir eine globale Technologie.
In C# verwenden wir ResourceManager wie folgt:Best Practices für globale Ressourcen in 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! 

Die Anordnung von zwei oder mehr Sprachressourcen haben:
Assembly
| --Assembly.en-US.resx
| --Assembly.zh- cn.resx

Dann archivieren wir, um die Ressource zu ändern, indem wir Thread cultureinfo ändern, um eine andere Ressource zu verwenden.

Wenn die Anwendung viele DLL (Assembly) -Dateien haben.
Ich möchte einen einzigen Punkt (eine Ressourcendatei für eine Sprache) für die Anwendung haben,
Gibt es eine gute Lösung für meine Idee?

Bevor ich nur die Ansicht (zB Winform oder UserControl) Language ändern, um verschiedene UI für die entsprechende Sprache zu implementieren.

Antwort

0

Erstellen Sie einfach die Internationalisierung in C# auf die von Ihnen beschriebene Weise. Aber als letzten Schritt des Build-Prozesses können Sie Fody.Costura ausführen.

Dies wird alle verschiedenen DLLs nehmen und sie in Ihre Anwendung packen, so dass Sie nur eine einzige .exe-Datei mit allem enthalten haben.

Der Vorteil ist, dass Sie die C# Internationalisierungs-Frameworks wie vorgesehen ohne jegliche Hacks verwenden können, aber Sie erhalten immer noch eine einzige exe, die Sie an Ihre Kunden liefern können.

0

Ich finde die C# Internationalisierung Frameworks sehr fehlen, so dass ich normalerweise eine Baugruppe für Ressourcen und Referenz von den anderen Projekten machen. Die Ressourcendateien, die ich aus einem Tool (DB, Excel, Textdatei) erzeuge, behalten sowohl die Quelldaten als auch die Ressourcendateien unter Versionskontrolle.

MyApp.sln 
    ResourceProject.csproj 
    Resources.resx 
    Resources.ru.resx 
    Resources.de.resx 
    Resource.cs 
    Core.csproj 
    UI.csproj 

Die Ressourcenklasse können die verschiedenen Baugruppen laden

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); 
     } 
    } 
} 

Diese einfache Klasse auf verschiedene Weise erweitert werden kann. In den aufrufenden Assemblys können Sie Dienstprogrammklassen verwenden, die je nach Situation basierend auf der aktuellen Benutzeroberflächenkultur oder Threadkultur aufgerufen werden.

Beachten Sie, dass dies alle integrierten WinForms- oder WPF i18N-Methoden vollständig umgeht.

Für GUI: s können Sie ein Dienstprogramm erstellen, das ganze Formulare rekursiv übersetzt. Die Suche selbst kann/sollte mit Warnungen für fehlende Schlüssel, Fallbackargumente, Präfixe/Namespaces erweitert werden, wenn Sie Tausende von Schlüsseln haben, und so weiter.