7

Tôi vừa nâng cấp lên Rc2 và những gì được sử dụng để làm việc không còn nữa. Tôi có một vài tệp resx trong một dự án riêng và tôi sử dụng một lớp tùy chỉnh để truy cập dữ liệu. Bây giờ tôi nhận được lỗi sau khi chạy nó:Bản địa hóa trong dự án riêng biệt Asp.net Core MVC

MissingManifestResourceException: Không thể tìm thấy bất kỳ tài nguyên nào phù hợp với văn hóa được chỉ định hoặc văn hóa trung tính. Hãy chắc chắn rằng "GarageWeb.Core.CoreResources.resources" đã được nhúng chính xác hoặc được liên kết vào assembly "GarageWeb.Core" tại thời gian biên dịch, hoặc tất cả các cụm vệ tinh yêu cầu có thể tải và được ký đầy đủ.

EDIT: Tôi đơn giản này và tạo ra một ứng dụng giao diện điều khiển được tước tất cả mọi thứ nhưng những gì là cần thiết để tạo lại lỗi ở đây: https://github.com/GarageWeb/ResourceTest

Đây là lớp học mà truy cập vào các nguồn tài nguyên:

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

Nó không thành công ở đây: var localizedString = _coreGlobalResources.ResourceManager.GetString (resourceKey);

Bất kỳ ý tưởng nào? Có cách nào mới để nhúng các tài nguyên này không?

+0

Bạn đã nhúng các tệp tài nguyên [như được nêu ở đây] (https://github.com/aspnet/Announcements/issues/175)? – poke

+0

Tôi đã làm, không may mắn. – mrfleck

+0

'" buildOptions ": { " nhúng ": { " includeFiles ": [" Tài nguyên/CoreResources.resx "," Tài nguyên/SiteResources.resx "] } }' Đây là nơi tôi nhúng các tệp. Đây là nơi được tham chiếu project.json – mrfleck

Trả lời

6

Vì vậy, nếu tôi di chuyển tệp .resx vào thư mục gốc của dự án thay vì trong một thư mục con, nó hoạt động như mong đợi. Tôi đã thử mọi cách để nhúng từ một thư mục con và nó không còn hoạt động nữa. Bây giờ tôi sẽ sử dụng cách giải quyết này, nhưng tôi nghi ngờ đây là một lỗi trong RC2.

+0

Bạn đã báo cáo cho nhóm AspNetCore chưa? –

+1

Tôi đã thêm một vấn đề ở đây: https://github.com/aspnet/Localization/issues/245 trông giống như họ đã đăng nhập nó như là một vấn đề dụng cụ ở đây: https://github.com/aspnet/Tooling/issues/532 – mrfleck

3

Như bạn đã đề cập, tôi cũng tin rằng đây là lỗi. Tôi sẽ đoán quá lâu, rằng lỗi nằm trong công cụ thiết kế tự động tạo. Vì lý do kỳ lạ và lý do giải pháp của bạn hoạt động, công cụ giả định rằng bạn đặt tất cả các tệp resx trong thư mục gốc của ứng dụng của bạn.

Dưới đây là một ví dụ về đầu ra của công cụ:

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

đâu, Cosmos.ViewModels, là tên lắp ráp, nhưng các tập tin Resx đều tập trung tại (đối với giải pháp hiện tại của chúng tôi) không gian tên Resources.da, cung cấp một không gian tên đầy đủ của Cosmos.ViewModels.Resources.da.

Với ý nghĩ này, bạn có thể giữ các tệp mà bạn muốn, sau đó thay đổi chuỗi được mã cứng là Cosmos.ViewModels.Default thành Cosmos.ViewModels.Resources.da.Default.

Tất nhiên với nguy cơ công cụ vô tình xóa các thay đổi của bạn một lần nữa.

Tôi hy vọng Microsoft sẽ sửa lỗi này. Tôi đã tạo ra một vấn đề trên github, nhưng tôi nghĩ rằng vấn đề thực sự nên được trong lõi cli.

MissingManifestResourceException from included assembly although present #1534

0

Tôi đang sử dụng MVC Lõi 1.1.0, tôi có thể thêm các tập tin tài nguyên trong thư mục phụ. khi bạn cố gắng thay đổi không gian tên của tệp tài nguyên mà không có thư mục con, thì nó sẽ phát ra lỗi. Vì vậy, không gian tên tập tin tài nguyên giống như khi nó được tạo ra.

Các vấn đề liên quan