改变Asp.net MVC项目的当前本地化

时间:2016-01-13 13:03:18

标签: asp.net asp.net-mvc localization

我正在开发一个Asp.net mvc webSite,其要求是用户应该能够更改语言并且页面内容应该自动翻译。 问题是:我在我的模型中使用自定义属性来显示本地化,如下所示:[CommonCustomAttributes.LocalizedDisplayName(" Register"," UserEmail")]。

LocalizedIdsplayname实现如下:[AttributeUsageAttribute(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter,AllowMultiple = false)]         public sealed class LocalizedDisplayNameAttribute:DisplayNameAttribute         {             public LocalizedDisplayNameAttribute(string resourceFileName,string keyName)                 :base(GetMessageFromResource(resourceFileName,keyName))             {}

        private static string GetMessageFromResource(string resourceFileName, string keyName)
        {
            try
            {
                return CustomLocalizationUtility.GetKeyValue(HttpContext.Current, resourceFileName, keyName);
            }
            catch (Exception)
            {
                return "";
            }

        }
    }

因此,当我在语言之间切换时,它不会改变。我的意思是使用它的模型的显示名称,如@ Html.LabelFor(m => m.UserEmailAddress,new {@class =" col- md-3 control-label"})。

但是在我使用@placeholder = @ CustomLocalizationUtility.GetKeyValue(" Register"," EnterEmail")的.cshtml中,当我改变语言时,它可以正常工作。我错过了什么严肃吗?我已经使用Cookie来设置当前文化,我也在基础控制器中覆盖了BeginExecuteCore方法。我已经从Action方法设置了当前文化的Cookie。我们是否需要根据当前的文化变化为JQuery Obstrusive验证和模型Displayname更改添加额外的javascript?

2 个答案:

答案 0 :(得分:0)

除非您在更改lang时以及在调用上述标签之前更改应用程序中的区域性,否则它将无法工作,即UserEmailAddress。您可以创建一个actionfilter属性并在控制器中调用它。

这是我的应用程序中的代码

   public static List<languages> Availablelanguages = new List<languages>() 
    {
        new languages{ LangFullNmae="English" , LangCultureName="en" },
        new languages{ LangFullNmae="دری" , LangCultureName="prs-AF" },
        new languages{ LangFullNmae="پښتو" , LangCultureName="ps-AF" }
    };

    public static string GetDefaultlanguage()
    {
        string lang = Availablelanguages[0].LangCultureName;
        var cultureInfo = new CultureInfo(lang);
        Thread.CurrentThread.CurrentUICulture = cultureInfo;
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
    //    HttpCookie langCookie = new HttpCookie("culture", lang);
    //    langCookie.Expires = DateTime.Now.AddDays(2);
        return lang;
    }

这些资源可以提供进一步的帮助

讨论你可以设置文化的所有地方

Best place to set CurrentCulture for multilingual ASP.NET MVC web applications

另一个

Set Culture in an ASP.Net MVC app

更新

 <tr>
            <td>
                @Resource.DeputyMinisterText
            </td>
            <td>

                @Html.EditorFor(model => model.DeputyMinister
  , new { htmlAttributes = new { style = "dir:ltr;text-align:left" } })
                @Html.ValidationMessageFor(model => model.DeputyMinister)
            </td>
        </tr>

答案 1 :(得分:0)

用于本地化

1)制作资源文件并添加键值对。

例如

 Resources.resx //Make this file Public
 Resources.fr.resx

2)设置语言的文化(用lang语言,您必须通过LanguageCulture)

    public string SetLanguage(string lang)
    {
        try
        {
            if (!isLanguageAvailable(lang))
            {
                lang = getDefaultLanguage();
            }
       
          var cultureinfo = new CultureInfo(lang);

          Thread.CurrentThread.CurrentUICulture = cultureinfo;
Thread.CurrentThread.CurrentCulture=CultureInfo.CreateSpecificCulture(cultureinfo.Name);
             
          HttpCookie langCookie = new HttpCookie("culture", lang);

          langCookie.Expires = DateTime.Now.AddYears(1);

          HttpContext.Current.Response.Cookies.Add(langCookie);

        }
        catch (Exception)
        { 
        
        }
        return lang;
    }

3)现在您可以在视图中调用资源 这是使用键值调用资源的两种方式

  @{Resources.Add_Value
   ResourcesIndex.ResourceManager.GetString("Add_Value")
   }