更改ResourceManager(使其可更新)

时间:2011-10-16 20:51:58

标签: c# asp.net-mvc resources resource-management

我在MVC 3(Razor)中有一个项目对于本地化,我们使用强类型资源。 我们希望有可能更新已经“在线”存在的翻译。这意味着,应该可以在网站上编辑翻译。 (例如,如果在url中有像“translateLanguage = on”这样的参数)基本上,使用当前解决方案无法做到这一点,因为如果资源已经更改,那么必须重新编译它。

当然,我们可以编写自己的资源管理器来使用数据库,但是我们必须将所有翻译重写到数据库中,这将非常耗时。这也意味着我们必须更改所有代码以反映这个“新”资源管理器。

在所有事情上都很难实现它。现在,我们可以在属性中使用它 e.g。

[Required(ErrorMessageResourceType = typeof(_SomeResource), ErrorMessageResourceName = "SomeResouceElement") 
  SomeProperty

以及代码:

 string translatedResource = _SomeResource.SomeResourceElement;

你能否告诉我如何在mvc 3中做到这一点?

1 个答案:

答案 0 :(得分:2)

通常资源文件由xml + autogenerated cs代码两部分组成。如果您打开资源设计器文件,您将看到

 /// <summary>
        ///   Looks up a localized string similar to About project.
        /// </summary>
        public static string about_project {
            get {
                return ResourceManager.GetString("about_project", resourceCulture);
            }
        }

所以你可以做的就是使用ResourceManager.GetString(“Key”)

Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureName);
            var t = Resources.ResourceManager.GetResourceSet(new CultureInfo(cultureName), true, true);

为了使其更加智能,您可以重写BaseView

public abstract class ViewBase<TModel> : System.Web.Mvc.WebViewPage<TModel>
{
    public string GetTranslation(string key)
    {
        return _rManager.GetString(key);
    }

    private ResourceManager _rManager;
    protected ViewBase()
    {
        _rManager = Resources.ResourceManager.GetResourceSet(new CultureInfo(cultureName), true, true);
    }


}

然后您就可以在剃须刀视图中使用GetTranslation(要运行此基本视图,您需要从Views文件夹修改web.config)

然后,您可以在编辑xml访问资源数据之后。