2015-08-25 16 views
6

Quando vogliamo rendere la nostra applicazione per tutti gli utenti (parlare lingue diverse), abbiamo bisogno di una tecnologia globale.
In C# usiamo ResourceManager come segue:Best practice per le risorse globali 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! 

L'assemblea hanno due o più risorse linguistiche:
Assembly
| --Assembly.en-us.resx
| --Assembly.zh- cn.resx

Quindi archiviamo per modificare la risorsa modificando thread cultureinfo per utilizzare risorse diverse.

Se l'applicazione ha molti file di dll (assemblaggio).
Voglio avere un singolo punto (un file di risorse per una lingua) per l'applicazione,
C'è una buona soluzione per la mia idea?

Prima di modificare solo la vista (ad esempio, WInform o UserControl) Language per implementare UI diverse per la lingua corrispondente.

risposta

0

Basta costruire l'internazionalizzazione in C# come descritto. Ma come ultima fase del processo di compilazione, è possibile eseguire Fody.Costura.

Questo prenderà tutte le dll diverse e le impacchetterà nell'applicazione in modo da avere un solo file .exe con tutto incluso.

Il vantaggio è che è possibile utilizzare i framework di internazionalizzazione C# come previsto senza alcuno hack, ma si ottiene comunque un singolo exe che è possibile recapitare ai propri clienti.

0

Trovo che i framework di internazionalizzazione C# siano molto carenti, quindi di solito faccio un assembly per le risorse e il riferimento degli altri progetti da . I file di risorse vengono generati da alcuni strumenti (DB, Excel, file di testo) e conservano sia i dati di origine che i file di risorse sotto il controllo della versione.

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

La classe di risorsa possono caricare tutti i diversi gruppi

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

Questo semplice tipo possono essere estese in vari modi. Negli assembly chiamanti è possibile avere classi di utilità che chiameranno in base alla cultura dell'interfaccia utente corrente o alla cultura del thread in base alla situazione.

Si noti che questo elimina completamente i metodi WinForms o WPF i18N.

Per la GUI: s è possibile creare un'utilità che traduca in modo ricorsivo forme intere. La ricerca stessa può/deve essere estesa con avvisi per chiavi mancanti, argomenti di fallback, prefissi/spazi dei nomi se si hanno migliaia di chiavi e così via.