المجلدات الفرعية في App_GlobalResources (ASP.NET)
-
23-09-2019 - |
سؤال
هل من الممكن وضع ملفات الموارد (.resx) داخل المجلدات الفرعية داخل App_GlobalResources؟
فمثلا:
/app_globalresources/someresources/myfile.resx
/app_globalresources/someresources/myfile.fr-fr.resx
/app_globalresources/othereresources/otherfile.resx
/app_globalresources/othereresources/otherfile.fr-fr.resx
أم هل يتم وضع جميع ملفات .resx مباشرة داخل App_globalResources؟
إذا كان من الممكن استخدام المجلدات الفرعية ، فكيف يمكنك الوصول إلى الموارد برمجيًا داخل المجلدات الفرعية؟
المحلول
من الناحية الفنية ، نعم هذا ممكن ولكن هناك بعض المزالق. أولاً ، اسمحوا لي أن أريكم مثالاً. افترض بلدي App_GlobalResources
المجلد يبدو هكذا:
/App_GlobalResources
/Test
TestSubresource.resx
TestResource.resx
يحتوي كل ملف مورد على إدخال واحد يسمى "TestString". أضفت كل ملف مورد باستخدام قائمة Visual Studio حتى قام بإنشاء فئة لي. بشكل افتراضي ، تمت إضافة جميع الفئات إلى App_GlobalResources
سيكون لدى المجلد نفس مساحة الاسم Resource
. لذا ، إذا أردت استخدام مولد الفصل وأريده Test
في مساحة الاسم ، أحتاج إلى الذهاب إلى ملف TestSubResource.designer.cs وتغيير مساحة الاسم يدويًا. بمجرد أن أفعل ذلك ، يمكنني القيام بما يلي:
var rootResource = Resources.TestResource.TestString;
var subResource = Resources.Test.TestSubResource.TestString;
يمكنني أيضًا الرجوع إليهم باستخدام GetGlobalResourceObject
:
var rootResource = GetGlobalResourceObject( "TestResource", "TestString" );
var subResource1 = GetGlobalResourceObject( "TestSubresource", "TestString" );
لاحظ أنني ما زلت أستخدم "TestSubresource" كوسيلة للرجوع إلى الموارد في هذا الملف على الرغم من أنها في مقلع فرعي. الآن ، أحد المصيد ، هو أن جميع الملفات يجب أن تكون فريدة من نوعها في جميع المجلدات في App_GlobalResources
أو سوف يرمي مشروعك خطأ في وقت التشغيل. إذا قمت بإضافة مورد يسمى "TestResource.resx" إلى /اختبار ، فسيتم رمي خطأ وقت التشغيل التالي:
لا يمكن استخدام ملف المورد '/app_globalresources/testresource.resx ، لأنه يتعارض مع ملف آخر بنفس الاسم.).
هذا صحيح حتى لو قمت بتغيير مساحة الاسم على المورد الجديد.
لذلك ، في الختام ، نعم ، هذا ممكن ، لكنك تزيد من احتمالات الحصول على خطأ في وقت التشغيل بسبب ملفين مورد متشابه في أجزاء مختلفة من App_GlobalResources
هيكل المجلد الذي يسمح به نظام الملفات ولكن ليس بواسطة .NET.
نصائح أخرى
انه ممكن. على الأقل ، تمكنت من القيام بذلك.
ضمن موقع ويب أضفت مجلد App_GlobalResources. داخلها قمت بإنشاء مجلد آخر "MyFolder" ووضعت ملف myResource.resx في الداخل. يحتوي ملف Resx على زوج واحد mykey1 - myValue1.
باستخدام GetResource
طريقة الفئة التالية التي استخرجتها بنجاح "myValue1" for name = "myKey1"
static class Class1 {
static Assembly FindGlobalResAssembly() {
foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) {
if(asm.FullName.StartsWith("App_GlobalResources."))
return asm;
}
return null;
}
public static object GetResource(string name) {
Assembly asm = FindGlobalResAssembly();
if(asm == null)
return null;
return new ResourceManager("Resources.MyResource", asm).GetObject(name);
}
}
هذا النهج يعمل في ثقة متوسطة أيضا.
يبدو أن المجلدات لا تحدث فرقًا عند الوصول إلى الموارد من الكود.