7

Я только что обновился до Rc2, и то, что раньше работало, больше не работает. У меня есть несколько файлов resx в отдельном проекте, и я использую специальный класс для доступа к данным. Теперь я получаю следующую ошибку при ее запуске:Локализация в отдельном проекте Asp.net Core MVC

MissingManifestResourceException: Не удалось найти ресурсы, подходящие для указанной культуры или нейтральной культуры. Убедитесь, что «GarageWeb.Core.CoreResources.resources» был правильно встроен или подключен к сборке «GarageWeb.Core» во время компиляции или что все необходимые спутниковые сборки являются загружаемыми и полностью подписанными.

EDIT: Я упростили это и создание консольного приложения, которое раздели все, кроме того, что требуется для воспроизведения ошибки здесь: https://github.com/GarageWeb/ResourceTest

Вот класс, который получает доступ к ресурсам:

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

Здесь это не работает: var localizedString = _coreGlobalResources.ResourceManager.GetString (resourceKey);

Любые идеи? Есть ли новый способ встраивания этих ресурсов?

+0

Вы встроили файлы ресурсов [как указано здесь] (https://github.com/aspnet/Announcements/issues/175)? – poke

+0

Я сделал, не повезло. – mrfleck

+0

'" buildOptions ": { " embed ": { " includeFiles ": [" Resources/CoreResources.resx "," Ресурсы/SiteResources.resx "] } }' Здесь я вложил файлы. Это в ссылочном проекте.json – mrfleck

ответ

6

Итак, если я перемещаю файлы .resx в корень проекта, а не в подпапку, он работает так, как ожидалось. Я пробовал каждый способ встраивания из подпапки, и он больше не работает. Пока я буду использовать это обходное решение, но я подозреваю, что это ошибка в RC2.

+0

Вы сообщили об этом команде AspNetCore? –

+1

Я добавил здесь проблему: https://github.com/aspnet/Localization/issues/245 похоже, что они зарегистрировали ее как проблему с инструментами: https://github.com/aspnet/Tooling/issues/532 – mrfleck

3

Как вы упомянули, я также считаю, что это ошибка. Я бы догадался так долго, что ошибка находится в автоматическом создании инструмента Designer. По непонятным причинам, и почему ваш метод обхода работы, инструмент предполагает, что вы поместите все resx-файлы в корень вашего приложения.

Вот пример вывода инструмента:

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

Где, Cosmos.ViewModels, это имя сборки, но .resx файлы все собраны в (для нашего текущего решения) в Resources.da пространстве имен, предоставляя полное пространство имен Cosmos.ViewModels.Resources.da.

Имея это в виду, вы можете сохранить файлы, где вы хотите, а затем изменить жёстко прописанные строку Cosmos.ViewModels.Default в Cosmos.ViewModels.Resources.da.Default.

Конечно, с риском того, что инструмент случайно удалит ваши изменения.

Надеюсь, Microsoft исправит это. Я создал проблему для github, но я думаю, что проблема должна быть в основном cli.

MissingManifestResourceException from included assembly although present #1534

0

Я использую MVC Ядро 1.1.0, я могу добавить файл ресурсов в подпапке. при попытке изменить пространство имен файла ресурсов без подпапки, оно вызывает ошибку. Таким образом, пространство пространства имен файлов ресурсов будет таким же, как и при создании.

Смежные вопросы