ResourceManager carica automaticamente tutte le culture?
-
12-12-2019 - |
Domanda
Ho una biblioteca di classe - chiamalo quadro. Nell'assembleaNFo.cs, ho:
[assembly: NeutralResourcesLanguage("en-US")]
.
Sotto una directory \ risorse \, ho frameworkresources.resx e frameworkresources.fr-fr.resx
In una classe Helper, sto usando questo come My Resource Manager:
.
private static ResourceManager manager = new ResourceManager("Framework.Resources.FrameworkResources", Assembly.GetExecutingAssembly());
In codice, se faccio qualcosa del genere:
.
String message = manager.GetString("ArgumentNullExceptionMessage", CultureInfo.CurrentCulture);
Posso eseguire il debug e il passaggio del mouse sull'attualeCultura e (e l'uicella) sono impostati su FR-FR, ma questo riporta sempre il mio messaggio predefinito, inglese, non il messaggio francese dal file di risorsa FR-FR.
Se il ResourceManager dovrebbe bloccarlo automaticamente, o dovrei scrivere il codice per interrogare la cultura corrente, quindi aprire il file giusto? Sono errato nel presumere che il gestore di risorse saprà per ottenere la stringa FR-FR, perché questa è la cultura attuale?
Non sono sicuro del perché questo non funziona.
Aggiornamento:
Ho gruppi satellitari, quindi credo che la parte di compilazione stia andando bene. Penso che il problema sia nel mio gestore di risorse. Ho provato a utilizzare Risorset e usando ResourceManager esplicitamente come questo:
.
ResourceManager manager =
new ResourceManager("Framework.Resources.FrameworkResources",
Assembly.GetExecutingAssembly());
Debug.WriteLine("de-DE : " + manager.GetString(resourceName, new CultureInfo("de-DE")));
Debug.WriteLine("el : " + manager.GetString(resourceName, new CultureInfo("el")));
Debug.WriteLine("es-MX : " + manager.GetString(resourceName, new CultureInfo("es-MX")));
Debug.WriteLine("fr-FR : " + manager.GetString(resourceName, new CultureInfo("fr-FR")));
Debug.WriteLine("hi : " + manager.GetString(resourceName, new CultureInfo("hi")));
Debug.WriteLine("zh-CN : " + manager.GetString(resourceName, new CultureInfo("zh-CN")));
che si traduce in questo:
..de-DE : Argument '%ArgumentName%' cannot be null or empty. el : Argument '%ArgumentName%' cannot be null or empty. es-MX : Argument '%ArgumentName%' cannot be null or empty. fr-FR : Argument '%ArgumentName%' cannot be null or empty. hi : Argument '%ArgumentName%' cannot be null or empty. zh-CN : Argument '%ArgumentName%' cannot be null or empty.
Quindi, anche se tutto è in atto, il mio gestore di risorse semplicemente non sta cercando di guardare in quei gruppi satelliti. E per essere chiari, in quelle assemblee, ho la versione tradotta della stringa sopra - quindi stabilmente leggendo dal mio file FrameworkResources.resx predefinito, anziché quelli specifici della cultura.
Soluzione
L'ho capito (grazie a più sgrassarsi sull'interweb).Stava eseguendo il codice dei test dell'unità, e in modo appetitoso Mstems non "distribuisce" le assemblee satellite.Se vado nelle impostazioni del test e disattiva "Distribuzione", tutto funziona come previsto.Ugh!