Domanda

La nostra applicazione permette all'utente di cambiare la cultura che corrono sotto e che la cultura può essere diverso da quello del sottostante sistema operativo Cultura. L'unico modo che ho trovato per farlo è impostando Thread.CurrentThread.CurrentCulture e Thread.CurrentThread.CurrentUICulture per ogni thread.

L'unico problema è che dobbiamo impostare la cultura per ogni thread e abbiamo bisogno di ricordarsi di farlo ogni volta che si crea un nuovo thread. Se si imposta un filo a un'altra cultura, quindi creare un nuovo thread, si ottiene la cultura del sistema operativo, non di thread che lo ha creato.

Mi piacerebbe trovare un modo migliore di fare questo. Posso pensare solo a due cose, ma non so se uno sono possibili.

  1. Imposta la cultura a livello di applicazione in modo che tutte le discussioni di default a quella cultura. È possibile?
  2. C'è un evento di creazione filo da nessuna parte che posso sottoscrivere? In questo modo posso impostare un gestore per impostare la cultura sulla creazione di thread.

Tutte le idee o aiuto sarebbe il benvenuto, anche se ho bisogno di PInvoke verso il basso per l'API Win32. Grazie in anticipo.

Modifica è stato trovato questa domanda che è simile, ma nessuna risposta.

È stato utile?

Soluzione 3

Due nuove proprietà sono stati aggiunti alla classe CultureInfo in .NET 4.5, che risolve questo problema, DefaultThreadCurrentCulture e DefaultThreadCurrentUICulture .

Ora è possibile impostare queste due proprietà e tutte le nuove discussioni verrà impostato la lingua predefinita al posto della cultura del sistema. Queste proprietà saranno inoltre impostare la cultura per tutti i thread esistenti che non hanno esplicitamente il loro set cultura.

Altri suggerimenti

non può essere la soluzione esatta, ma come sulla creazione di una classe che responsabile per la vostra creazione discussione?

class MyThreadFactory
{
    public static Thread getThread()
    {
        Thread a = new Thread(..);
        a.CurrentCulture = xxxx;
        return a;
    }
}

Utilizzo:

Thread newThread = MyThreadFactory.getThread();
  1. è possibile inserire tutti i vostri logica della cultura e file di risorse statici nello strato UI / Presentazione e solo preoccuparsi di cultura del thread UI (supponendo che un'applicazione desktop qui). Ciò include eventuali traduzioni che sono file di risorse, alcuna formattazione specifici per la cultura, ecc.
  2. Se la prima idea non può essere attuato, è possibile creare una classe di supporto filo che imposta la cultura per voi quando si creano le discussioni di lunga durata. Sarà inoltre necessario impostare la cultura di tutti i thread pool di thread.

La cultura è un concetto specifico thread in Windows, e fili di Windows sono in realtà agnostico di un processo o appdomain. Non esiste un livello di astrazione tra un filo e il sistema operativo che contiene informazioni cultura (che io sappia), quindi bisogna impostarlo su ogni thread.

Giusto per aggiungere a @ Rob Prouse risposta. Ecco una rapida dimostrazione.

  1. Impostazione della cultura su App intialization:

      if(CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol != "N$")
      {
           CultureInfo customCulture = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
           customCulture.NumberFormat.CurrencySymbol = "N$";
    
           CultureInfo.DefaultThreadCurrentCulture = customCulture;
           CultureInfo.DefaultThreadCurrentUICulture = customCulture;
       }
    
  2. Uso della cultura informazioni sul mio .ToString ().

     .ToString("C", CultureInfo.DefaultThreadCurrentCulture)
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top