এটি একটি পুরানো প্রশ্ন, তবে আমি মনে করি এটি একটি খুব সাধারণ সমস্যা, এবং এখানে এমভিসি 3 তে আমার সমাধান রয়েছে।
প্রথমত, বাজে স্ট্রিংগুলি এড়ানোর জন্য ধ্রুবক তৈরি করতে একটি টি 4 টেম্পলেট প্রয়োজন। আমাদের কাছে একটি সংস্থান ফাইল রয়েছে 'Labels.resx' সমস্ত লেবেল স্ট্রিং ধারণ করে। সুতরাং T4 টেমপ্লেট সরাসরি রিসোর্স ফাইলটি ব্যবহার করে,
<#@ template debug="True" hostspecific="True" language="C#" #>
<#@ output extension=".cs" #>
<#@ Assembly Name="C:\Project\trunk\Resources\bin\Development\Resources.dll" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Globalization" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Resources" #>
<#
var resourceStrings = new List<string>();
var manager = Resources.Labels.ResourceManager;
IDictionaryEnumerator enumerator = manager.GetResourceSet(CultureInfo.CurrentCulture, true, true)
.GetEnumerator();
while (enumerator.MoveNext())
{
resourceStrings.Add(enumerator.Key.ToString());
}
#>
// This file is generated automatically. Do NOT modify any content inside.
namespace Lib.Const{
public static class LabelNames{
<#
foreach (String label in resourceStrings){
#>
public const string <#=label#> = "<#=label#>";
<#
}
#>
}
}
তারপরে, 'ডিসপ্লেনাম' স্থানীয়করণের জন্য একটি এক্সটেনশন পদ্ধতি তৈরি হবে,
using System.ComponentModel.DataAnnotations;
using Resources;
namespace Web.Extensions.ValidationAttributes
{
public static class ValidationAttributeHelper
{
public static ValidationContext LocalizeDisplayName(this ValidationContext context)
{
context.DisplayName = Labels.ResourceManager.GetString(context.DisplayName) ?? context.DisplayName;
return context;
}
}
}
'Label.resx' থেকে স্বয়ংক্রিয়ভাবে পড়তে 'ডিসপ্লেনাম' বৈশিষ্ট্যটি 'ডিসপ্লে লেবেল' বৈশিষ্ট্য দ্বারা প্রতিস্থাপন করা হয়েছে,
namespace Web.Extensions.ValidationAttributes
{
public class DisplayLabelAttribute :System.ComponentModel.DisplayNameAttribute
{
private readonly string _propertyLabel;
public DisplayLabelAttribute(string propertyLabel)
{
_propertyLabel = propertyLabel;
}
public override string DisplayName
{
get
{
return _propertyLabel;
}
}
}
}
এই সমস্ত প্রস্তুতি কাজ করার পরে, সেই ডিফল্ট বৈধতা বৈশিষ্ট্যগুলিকে স্পর্শ করার সময়। আমি উদাহরণ হিসাবে 'প্রয়োজনীয়' বৈশিষ্ট্যটি ব্যবহার করছি,
using System.ComponentModel.DataAnnotations;
using Resources;
namespace Web.Extensions.ValidationAttributes
{
public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute
{
public RequiredAttribute()
{
ErrorMessageResourceType = typeof (Errors);
ErrorMessageResourceName = "Required";
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
return base.IsValid(value, validationContext.LocalizeDisplayName());
}
}
}
এখন, আমরা আমাদের মডেলগুলিতে এই বৈশিষ্ট্যগুলি প্রয়োগ করতে পারি,
using Web.Extensions.ValidationAttributes;
namespace Web.Areas.Foo.Models
{
public class Person
{
[DisplayLabel(Lib.Const.LabelNames.HowOldAreYou)]
public int Age { get; set; }
[Required]
public string Name { get; set; }
}
}
ডিফল্টরূপে, সম্পত্তি নামটি 'Label.resx' দেখার জন্য কী হিসাবে ব্যবহৃত হয়, তবে আপনি যদি এটি 'ডিসপ্লে লেবেল'-এর মাধ্যমে সেট করেন তবে এটি পরিবর্তে এটি ব্যবহার করবে।