Asp.Net Identity Localization PublicKeyToken

Nie*_*sma 13 .net c# dll asp.net-mvc asp.net-identity

我试图通过使用以下帖子中的建议获取瑞典语为Asp.Net Identity的本地化错误消息:如何本地化ASP.NET Identity UserName和Password错误消息?

使用NuGet我下载了德语语言包,然后在dotPeek中打开\ packages\Microsoft.AspNet.Identity.Core.2.0.0\lib \net45\de\Microsoft.AspNet.Identity.Core.resources.dll,然后将其导出到一个新的VS项目:

https://github.com/nielsbosma/AspNet.Identity.Resources.Swedish/

我已将生成的\ Microsoft.AspNet.Identity.Core.resources.dll复制到\​​ packages\Microsoft.AspNet.Identity.Core.2.0.0\lib \net45\se下的新文件夹.

当我在本地运行我的网站时,我看到Microsoft.AspNet.Identity.Core.resources.dll已被复制到MySite\bin\sv \

但我不能让它工作:(

如果我在我的Web.config中设置:

<system.web>
    ...
    <globalization culture="sv-SE" uiCulture="sv" />
</system.web>
Run Code Online (Sandbox Code Playgroud)

我仍然得到英文默认错误消息.但是,如果我改为德语,我已经从NuGet中包含了我收到德语错误消息.

使用dotPeek我将我的dll与德语进行了比较,除了我的PublicKeyToken = null和德语为"31bf3856ad364e35"之外,它们是相同的.这可能是我无法加载我的dll的原因吗?无论如何为dll设置PublicKeyToken?任何解决方法?

谢谢你的任何指示.

Hao*_*ung 8

除非您拥有Microsoft用于签署dll的私钥.

更新:作为一种解决方法,直到我们添加对您自己的资源插入的支持,您现在可能只使用显式切换包装所有默认标识结果错误消息,应该只有大约10-20个面向用户的错误.

就像是:

public static string Localize(string error) {
     switch (error) {
          case "<english error>": return "<localized version";
     }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

灵感来自彼得的答案我也提出了蹩脚但快速的解决方案.

我需要在默认的AccountController模板中本地化错误,所以我编写了自己的AddLocalizedErrors方法.我正在使用Resources来本地化错误.

    //Original method
    private void AddErrors(IdentityResult result)
    {
        foreach (var error in result.Errors)
        {
            ModelState.AddModelError("", error);
        }
    }
    //My method
    private void AddLocalizedErrors(IdentityResult result, ApplicationUser user)
    {
        foreach (var error in result.Errors)
        {
            var localizedError = error;
            string userName = "";
            string email = "";
            if (user != null) 
            {
                userName = user.UserName;
                email = user.Email;
            }
            //password errors
            localizedError = localizedError.Replace("Passwords must have at least one uppercase ('A'-'Z').", AspNetValidationMessages.password_uppercase);
            localizedError = localizedError.Replace("Passwords must have at least one digit ('0'-'9').", AspNetValidationMessages.password_digit);
            localizedError = localizedError.Replace("Passwords must have at least one lowercase ('a'-'z').", AspNetValidationMessages.password_lowercase);
            localizedError = localizedError.Replace("Passwords must have at least one non letter or digit character.", AspNetValidationMessages.password_nonletter_nondigit);
            localizedError = localizedError.Replace("Passwords must have at least one non letter or digit character.", AspNetValidationMessages.password_nonletter_nondigit); 
            localizedError = localizedError.Replace("Passwords must have at least one non letter or digit character.", AspNetValidationMessages.password_nonletter_nondigit); 
            //register errors
            localizedError = localizedError.Replace("Name "+userName+" is already taken.", AspNetValidationMessages.name_taken.Replace("{0}", userName));
            localizedError = localizedError.Replace("Email '" + email + "' is already taken.", AspNetValidationMessages.email_taken.Replace("{0}", email)); 

            ModelState.AddModelError("", localizedError);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用,string.Replace()因为例如密码错误只是单个密码要求的字符串.

谈到角色的收集,我应该更有创意.可能使用string.Contains().