Localization in ASP.NET MVC 4 using App_GlobalResources

回眸只為那壹抹淺笑 提交于 2019-12-03 07:31:02

I figured this one out myself. If you are trying to accomplish the above you must separate the localized error messages.

Create a *.resx file for the other error messages fx "PropertyValueRequired" and set the Build Action to “Embedded”, set the Copy to Output Directory to “Do no Copy”, set the Custom Tool to “PublicResXFileCodeGenerator” and set the Custom Tool Namespace to “Resources”.

In my case I have moved "PropertyValueRequired" to a file called LocalDanish.resx (still in the App_GlobalResources folder) and changed the line in my "MyRequiredAttributeAdapter" from

attribute.ErrorMessageResourceType = typeof(Resources.WebResources);

to

attribute.ErrorMessageResourceType = typeof(Resources.LocalDanish);

In order to get the "built in" error messages to work, you must create two *.resx files. I have created WebResources.resx and WebResources.da.resx. Do NOT change anything, leave the settings on them on default (Build Action to "Content", etc.). I guess the website automatically looks for the *.da.resx files in my case because I have set the globalization in my WebConfig:

<globalization uiCulture="da-DK" culture="da-DK"/>

Hope this helps anybody.

Best regards, Andreas

I have made some minor additions to the original post, which didn't translate all messages in my case. (String length and invalid property values)

Follow the above steps, to create the *.resx files, set their properties, and then set the locale in web.config, as described by Andreas.

Then create a couple of adapters:

// As described in original post:
public class LocalizedRequiredAttributeAdapter : RequiredAttributeAdapter
{
    public LocalizedRequiredAttributeAdapter(
        ModelMetadata metadata,
        ControllerContext context,
        RequiredAttribute attribute
    )
        : base(metadata, context, attribute)
    {
        if (attribute.ErrorMessageResourceType == null)
            attribute.ErrorMessageResourceType = typeof(Resources.Resources);
        if (attribute.ErrorMessageResourceName == null)
            attribute.ErrorMessageResourceName = "PropertyValueRequired";
    }
}

// Addition to original post:
public class LocalizedStringLengthAttributeAdapter : StringLengthAttributeAdapter
{
    public LocalizedStringLengthAttributeAdapter(
        ModelMetadata metadata,
        ControllerContext context,
        StringLengthAttribute attribute
    )
        : base(metadata, context, attribute)
    {
        if (attribute.ErrorMessageResourceType == null)
            attribute.ErrorMessageResourceType = typeof(Resources.Resources);
        if (attribute.ErrorMessageResourceName == null)
            attribute.ErrorMessageResourceName = "StringLengthAttribute_ValidationError";
    }
}

And in Global.asax.cx:

// Addition to original post: (Used for "PropertyValueInvalid")
DefaultModelBinder.ResourceClassKey = "Resources";

// As described in original post:
ClientDataTypeModelValidatorProvider.ResourceClassKey = "Resources";
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredAttribute), typeof(LocalizedRequiredAttributeAdapter));
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(StringLengthAttribute), typeof(LocalizedStringLengthAttributeAdapter));
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!