7

Ho appena effettuato l'aggiornamento a Rc2 e quello che prima non funzionava più. Ho un paio di file resx in un progetto separato e utilizzo una classe personalizzata per accedere ai dati. Ora ottengo il seguente errore durante l'esecuzione:Localizzazione in un progetto separato Asp.net Core MVC

MissingManifestResourceException: Impossibile trovare le risorse appropriate per la cultura specificata o la cultura neutra. Assicurati che "GarageWeb.Core.CoreResources.resources" sia stato correttamente incorporato o collegato all'assembly "GarageWeb.Core" in fase di compilazione, o che tutti gli assembly satellite richiesti siano caricabili e firmati.

EDIT: ho semplificato questo e creare una console app che è spogliato di tutto, ma ciò che è necessario per riprodurre l'errore qui: https://github.com/GarageWeb/ResourceTest

Ecco la classe che accede alle risorse:

public class ResourceService : IResourceService 
{ 
    private readonly ILoggingService _loggingService; 
    private readonly ICoreGlobalResourceService _coreGlobalResources; 
    private readonly ISiteGlobalResourceService _siteGlobalResources; 
    public ResourceService(ILoggingService loggingService, ICoreGlobalResourceService coreGlobalResourceService, ISiteGlobalResourceService siteGlobalResources) 
    { 
     _loggingService = loggingService; 
     _coreGlobalResources = coreGlobalResourceService; 
     _siteGlobalResources = siteGlobalResources; 
    } 
    public string GetGlobalText(string resourceKey, bool includeBrackets = true) 
    { 
     var localizedString = _coreGlobalResources.ResourceManager.GetString(resourceKey); 
     if (string.IsNullOrEmpty(localizedString)) 
     { 
      localizedString = _siteGlobalResources.ResourceManager.GetString(resourceKey); 
     } 
     if (string.IsNullOrEmpty(localizedString) && includeBrackets) 
     { 
      _loggingService.LogInvalidResource(resourceKey); 
     } 

     if (includeBrackets) 
     { 
      return localizedString ?? "[" + resourceKey + "]"; 
     } 
     return localizedString ?? resourceKey; 
    } 

    public string BuildMessageFromResource(string resourceKey, string placeHolderResourceKey1, 
     bool includeBrackets = true) 
    { 
     var errorString = string.Format(CultureInfo.CurrentCulture, GetGlobalText(resourceKey, includeBrackets), 
      GetGlobalText(placeHolderResourceKey1, includeBrackets)); 
     return errorString; 
    } 

    public string BuildMessageFromResourceAndArray(string resourceKey, string[] arrayOfValues, 
     bool includeBrackets = true) 
    { 
     var placeHolderValue = ""; 

     for (var i = 0; i < arrayOfValues.Length; i++) 
     { 
      if (i + 1 == arrayOfValues.Length) 
      { 
       placeHolderValue += GetGlobalText(arrayOfValues[i], includeBrackets); 
      } 
      else 
      { 
       placeHolderValue += GetGlobalText(arrayOfValues[i], includeBrackets) + ", "; 
      } 
     } 

     var errorString = string.Format(CultureInfo.CurrentCulture, GetGlobalText(resourceKey, includeBrackets), 
      placeHolderValue); 
     return errorString; 
    } 

    public string BuildMessageFromResourceAndTwoArrays(string resourceKey, string[] firstArrayOfValues, 
     string[] secondArrayOfValues, 
     bool includeBrackets = true) 
    { 
     var placeHolderOneValue = ""; 
     var placeHolderTwoValue = ""; 

     for (var i = 0; i < firstArrayOfValues.Length; i++) 
     { 
      if (i + 1 == firstArrayOfValues.Length) 
      { 
       placeHolderOneValue += GetGlobalText(firstArrayOfValues[i], includeBrackets); 
      } 
      else 
      { 
       placeHolderOneValue += GetGlobalText(firstArrayOfValues[i], includeBrackets) + ", "; 
      } 
     } 
     for (var i = 0; i < secondArrayOfValues.Length; i++) 
     { 
      if (i + 1 == secondArrayOfValues.Length) 
      { 
       placeHolderTwoValue += GetGlobalText(secondArrayOfValues[i], includeBrackets); 
      } 
      else 
      { 
       placeHolderTwoValue += GetGlobalText(secondArrayOfValues[i], includeBrackets) + ", "; 
      } 
     } 
     var errorString = string.Format(CultureInfo.CurrentCulture, GetGlobalText(resourceKey, includeBrackets), 
      placeHolderOneValue, placeHolderTwoValue); 
     return errorString; 
    } 

    public string BuildMessageFromResource(string resourceKey, string placeHolderResourceKey1, 
     string placeHolderResourceKey2, bool includeBrackets = true) 
    { 
     var errorString = string.Format(CultureInfo.CurrentCulture, GetGlobalText(resourceKey, includeBrackets), 
      GetGlobalText(placeHolderResourceKey1, includeBrackets), 
      GetGlobalText(placeHolderResourceKey2, includeBrackets)); 
     return errorString; 
    } 

    public string BuildMessageFromResource(string resourceKey, string placeHolderResourceKey1, 
     string placeHolderResourceKey2, string placeHolderResourceKey3, 
     bool includeBrackets = true) 
    { 
     var errorString = string.Format(CultureInfo.CurrentCulture, GetGlobalText(resourceKey, includeBrackets), 
      GetGlobalText(placeHolderResourceKey1, includeBrackets), 
      GetGlobalText(placeHolderResourceKey2, includeBrackets), 
      GetGlobalText(placeHolderResourceKey3, includeBrackets)); 
     return errorString; 
    } 
} 

Fallisce qui: var localizedString = _coreGlobalResources.ResourceManager.GetString (resourceKey);

Qualche idea? C'è un nuovo modo per incorporare queste risorse?

+0

Hai incorporato i file di risorse [come descritto qui] (https://github.com/aspnet/Announcements/issues/175)? – poke

+0

L'ho fatto, senza fortuna. – mrfleck

+0

'" buildOptions ": { " embed ": { " includeFiles ": [" Risorse/CoreResources.resx "," Risorse/Risorse del sito.resx "] } } } Questo è il punto in cui ho incorporato i file. Questo è nel progetto di riferimento.json – mrfleck

risposta

6

Quindi, se sposto i file .resx nella radice del progetto anziché in una sottocartella, funziona come previsto. Ho provato ogni modo per incorporare da una sottocartella e non funziona più. Per ora userò questa soluzione alternativa, ma sospetto che si tratti di un bug in RC2.

+0

Hai segnalato al team AspNetCore? –

+1

Ho aggiunto un problema qui: https://github.com/aspnet/Localization/issues/245 sembra che l'abbiano registrato come un problema di strumenti qui: https://github.com/aspnet/Tooling/issues/532 – mrfleck

3

Come hai detto, credo anche che questo sia un bug. Credo che sia così lungo che il bug si trova nello strumento di generazione automatica di Designer. Per motivi dispari e perché la soluzione funziona, lo strumento presuppone che tutti i file resx vengano inseriti nella directory principale dell'applicazione.

Ecco un esempio di output dello strumento:

[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 
    public static global::System.Resources.ResourceManager ResourceManager { 
     get { 
      if (object.ReferenceEquals(resourceMan, null)) { 
       global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Cosmos.ViewModels.Default", typeof(Default).GetTypeInfo().Assembly); 
       resourceMan = temp; 
      } 
      return resourceMan; 
     } 
    } 

Dove, Cosmos.ViewModels, è il nome di montaggio, ma i file RESX sono tutti riuniti a (per la nostra soluzione attuale) il Resources.da spazio dei nomi, dare uno spazio dei nomi completo di Cosmos.ViewModels.Resources.da.

Con questo in mente, è possibile mantenere i file di cui si desidera, e quindi modificare la stringa hardcoded di Cosmos.ViewModels.Default per Cosmos.ViewModels.Resources.da.Default.

Naturalmente con il rischio che lo strumento rimuova accidentalmente di nuovo le modifiche.

Spero che Microsoft risolverà questo problema. Ho creato un problema su github, ma penso che il problema dovrebbe essere nel core cli.

MissingManifestResourceException from included assembly although present #1534

0

Sto usando MVC Nucleo 1.1.0, sono in grado di aggiungere il file di risorse nella sottocartella. quando si tenta di modificare lo spazio dei nomi del file di risorse senza sottocartella, viene generato un errore. Quindi lo spazio dei nomi del file delle risorse è lo stesso di quando è stato generato.

Problemi correlati