public class LocalizationAttribute : ActionFilterAttribute
{
private readonly string _defaultLanguage;
public LocalizationAttribute(string defaultLanguage)
{
_defaultLanguage = defaultLanguage;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string lang = (string)filterContext.RouteData.Values["lang"] ?? _defaultLanguage;
if (lang != null)
{
try
{
Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
}
catch (Exception)
{
throw new NotSupportedException($"Invalid language code '{lang}'.");
}
}
}
}
App_Start의 폴더에 FilterConfig의에 클래스를 추가하고, LocalizationAttribute 을 생성합니다.
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new LocalizationAttribute("en"), 0);
}
}
언어 정보가 필요한 모든 컨트롤러에서[Localization]속성을사용하십시오.
[Localization("en")]
public class DefaultController : Controller
{
public ActionResult Index()
{
return View();
}
}
3. Create translation resources
3.1 App_LocalResources folder 추가
Asp_Net 폴더App_LocalResources를 프로젝트에추가합니다.리소스 파일이 여기에 배치됩니다.
3.2 Add resource files
기본 언어(내 경우 영어)에 대한언어 리소스 파일GlobalRes.resx와 GlobalRes와 같은 다른 언어에 대한 파일을 추가합니다.ru.resx를 App_LocalResources 폴더로 이동합니다.파일 이름의 두 글자는RegionInfo.TwoLetterISORegionName Property 에정의된 대로 지역 정보 ISO(국가 코드)여야합니다.지역 코드의 전체 목록은 Wikipedia 페이지ISO 3166-1 alpha-2에서 찾을 수 있습니다.
3.3 Set resource files properties
리소스 유형: 문자열
빌드 작업: 포함된 리소스
사용자 지정 도구: PublicResXFileCodeGenerator
액세스 수정자: 공개
3.4 Add translations for all string resources
3.5 Add reference to resource namespace to Razor in web.config
이 네임스페이스를표준 ~/Web.config 파일이 아닌~/Views/web.config파일에추가했는지 확인하십시오.
라우팅을 기반으로 언어 링크를 생성하는 다음 도우미 클래스를 사용합니다.UrlHelper확장 메소드를생성합니다.
public static class LanguageHelper
{
public static MvcHtmlString LangSwitcher(this UrlHelper url, string Name, RouteData routeData, string lang)
{
var liTagBuilder = new TagBuilder("li");
var aTagBuilder = new TagBuilder("a");
var routeValueDictionary = new RouteValueDictionary(routeData.Values);
if (routeValueDictionary.ContainsKey("lang"))
{
if (routeData.Values["lang"] as string == lang)
{
liTagBuilder.AddCssClass("active");
}
else
{
routeValueDictionary["lang"] = lang;
}
}
aTagBuilder.MergeAttribute("href", url.RouteUrl(routeValueDictionary));
aTagBuilder.SetInnerText(Name);
liTagBuilder.InnerHtml = aTagBuilder.ToString();
return new MvcHtmlString(liTagBuilder.ToString());
}
}