Изменение ResourceManager (сделать его обновляемым) - PullRequest
2 голосов
/ 17 октября 2011

У меня есть проект в MVC 3 (Razor). Для локализации мы используем строго типизированные ресурсы. Мы хотим иметь возможность обновлять уже существующий перевод "онлайн". Это означает, что на сайте должна быть возможность редактировать перевод. (Например, если в URL есть такой параметр, как «translateLanguage = on») В принципе, это невозможно сделать с текущим решением, потому что, если ресурс был изменен, он должен быть перекомпилирован.

Конечно, мы можем написать наш собственный Resource Manager, который будет использовать базу данных, но тогда нам придется переписать все наши переводы в базу данных, и это займет много времени. Это также означало бы, что нам придется изменить весь наш код, чтобы отразить этот «новый» менеджер ресурсов.

Было бы сложно реализовать это во всех вещах. Теперь мы можем использовать его в атрибутах например,

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

Как и в коде:

 string translatedResource = _SomeResource.SomeResourceElement;

Не могли бы вы предоставить мне некоторую информацию, как это сделать в MVC 3?

1 Ответ

2 голосов
/ 08 января 2014

Обычно файл ресурсов состоит из двух частей: xml + автоматически сгенерированный 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 ("Ключ")

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 в своем бритвенном представлении (чтобы запустить это базовое представление, вам нужно изменить web.config из папки Views)

И тогда высможет после редактирования xml доступа к данным ресурса.

...