سؤال

ما هو أفضل استخدام لملفات الموارد التالية.

  1. خصائص → موارد (فلم تستخدم هذا المورد للتوطين في DataillAtation)
  2. app_globalresources مجلد
  3. app_localresources مجلد.

أود أيضا أن أعرف ما هو الفرق بين (1) و (2) في تطبيق ASP.NET MVC.

هل كانت مفيدة؟

المحلول

من الواجب ان تتجنب App_GlobalResources و App_LocalResourcesوبعد مثل كريج المذكورة، هناك مشاكل مع App_GlobalResources/App_LocalResources لأنه لا يمكنك الوصول إليهم خارج وقت تشغيل ASP.NET. مثال جيد على كيفية أن يكون هذا مشكلة هو عندما تقوم باختبار وحدة التطبيق الخاصة بك.

K. سكوت ألين مدون حول هذا الوقت منذ فترة. يفعل وظيفة جيدة في شرح المشكلة App_GlobalResources في ASP.NET MVC. هنا.

نصائح أخرى

إذا ذهبت مع الحل الموصى به (1) (أي كما هو الحال في مدونة K. Scott Allen):

بالنسبة لأولئك الذين يحاولون استخدام تعبيرات توطين صريحة (تعبيرات ملزمة الموارد المعلنة المعروفة أدناه)، على سبيل المثال <%$ Resources, MyResource:SomeString %>

public class AppResourceProvider : IResourceProvider
{
    private readonly string _ResourceClassName;
    ResourceManager _ResourceManager = null;

    public AppResourceProvider(string className)
    {
        _ResourceClassName = className;
    }

    public object GetObject(string resourceKey, System.Globalization.CultureInfo culture)
    {
        EnsureResourceManager();
        if (culture == null)
        {
            culture = CultureInfo.CurrentUICulture;
        }
        return _ResourceManager.GetObject(resourceKey, culture);
    }

    public System.Resources.IResourceReader ResourceReader
    {
        get
        {
            // Not needed for global resources
            throw new NotSupportedException();
        }
    }

    private void EnsureResourceManager()
    {
        var assembly = typeof(Resources.ResourceInAppToGetAssembly).Assembly;
        String resourceFullName = String.Format("{0}.Resources.{1}", assembly.GetName().Name, _ResourceClassName);
        _ResourceManager = new global::System.Resources.ResourceManager(resourceFullName, assembly);
        _ResourceManager.IgnoreCase = true;
    }
}

public class AppResourceProviderFactory : ResourceProviderFactory
{
    // Thank you, .NET, for providing no way to override global resource providing w/o also overriding local resource providing
    private static Type ResXProviderType = typeof(ResourceProviderFactory).Assembly.GetType("System.Web.Compilation.ResXResourceProviderFactory");
    ResourceProviderFactory _DefaultFactory;

    public AppResourceProviderFactory()
    {
        _DefaultFactory = (ResourceProviderFactory)Activator.CreateInstance(ResXProviderType);
    }

    public override IResourceProvider CreateGlobalResourceProvider(string classKey)
    {
        return new AppResourceProvider(classKey);
    }

    public override IResourceProvider CreateLocalResourceProvider(string virtualPath)
    {
        return _DefaultFactory.CreateLocalResourceProvider(virtualPath);
    }
}

ثم، أضف هذا إلى Web.config:

    <globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" culture="en-US" uiCulture="en"
                   resourceProviderFactoryType="Vendalism.ResourceProvider.AppResourceProviderFactory" />

خصائص → يمكن رؤية الموارد خارج وجهات نظرك وأنواع قوية يتم إنشاؤها عند ترجمة التطبيق الخاص بك.

يتم تجميع التطبيق_ * * بواسطة ASP.NET، عندما يتم تجميع وجهات نظرك. إنها متاحة فقط في المنظر. يرى هذه الصفحة للعمل العالمي مقابل المحلية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top