質問
っている気がします。するウィットに富んだを使用VirtualPathProvider見局在す。で要求されたビューのパスおよび変更でき後のファイルです。を返します地域に対応した仮想ファイルが見つかり:
public pseudoclass MyFileProvider : VirtualPathProvider
{
bool FileExists(string requestedPath)
{
if (IsLocalizedView(requestedPath))
return true;
return base.FileExists(requestedPath);
}
bool IsLocalizedView(string requestedPath)
{
var uri = requestedUri.AddLocaleByMagic("sv");
if (FileExistsInternal(uri))
return true;
}
//some more stuff to return the actual file
}
問題は取得し、以下の例外:
のVirtualPathProviderを返しますVirtualFileオブジェクトVirtualPath設定'/Views/共有/_Layout.sv.cshtmlくことができるようになり、予想'/Views/共有/_Layout.cshtml'.
いう偽のファイルのパスが作の問題をキャッシュ、異なる局在.でしょ?
誰にもたより良い方法を作成できる局在ょうか。私は使いたいのは、同じビューでリソースの文字列です。こうした意見をも恐ろしいほど泣きいため、ハードを読み出します。
いきものがかりさんかもやってみたい:
/Views/ユーザ/Details.sv.cshtml
Hejsan @Model.FirstName
Detta är en lite rolig text på svenska.
/Views/ユーザ/Details.ています。cshtml
Hello @Model.FirstName
This is a test on english.
コントローラー
public ActionResult Details()
{
return View(new User()); //should automagically use a swedish or english view
}
こういうことができるようにスイッチの景色(局所的に使用CurrentCultureならない手作業できます。
解決
あなたはのCurrentCultureに応じて意見を返すカスタムViewEngineを書くことができます。 これの良い例は、モバイルビューを返しませんスコットHanselman氏のブログ記事で、で見つけることができます要求がモバイルデバイスによって行われている場合は、
他のヒント
この実装です。これがますます重要になっていく。ですが、全て私の条件です。
見えのために専門のビューまたはビュー設定からのみのない言語specfication。
ビュープロセス:
- ます。sv。cshtml
- ます。sv.cshtml
- ます。ています。cshtml
- ます。cshtml
public class LocalizedRazorViewEngine : RazorViewEngine
{
public LocalizedRazorViewEngine()
{
DefaultLanguageCode = "en";
}
public string DefaultLanguageCode { get; set; }
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
var controllerName = (string)controllerContext.RouteData.Values["controller"];
var language = GetLanguage(controllerName, viewName);
if (language != "") language = "." + language;
var masterPath = string.Format("~/Views/Shared/_Layout{0}.cshtml", language);
var uri = string.Format("~/Views/{0}/{1}{2}.cshtml", controllerName, viewName, language);
if (VirtualPathProvider.FileExists(uri))
return new ViewEngineResult(CreateView(controllerContext, uri, masterPath), this);
return base.FindView(controllerContext, viewName, masterName, useCache);
}
private string GetLanguage(string controllerName, string actionName)
{
string format = "~/Views/{0}/{1}.{2}.cshtml";
if (VirtualPathProvider.FileExists(string.Format(format, controllerName, actionName, Thread.CurrentThread.CurrentCulture.Name)))
return Thread.CurrentThread.CurrentCulture.Name;
if (VirtualPathProvider.FileExists(string.Format(format, controllerName, actionName, Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName)))
return Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName;
if (VirtualPathProvider.FileExists(string.Format(format, controllerName, actionName, DefaultLanguageCode)))
return DefaultLanguageCode;
return string.Empty;
}
}
なお、キャッシュは障害者用のアプローチが必要になることがあり自分でキャッシュを取得し、正しい語)
ここでは最も単純などが可能かもしれません)とえばスイッチの見解は以下の条
- MyView.cshtml-デフォルトのもの
- MyView.pl.cshtml-ポーランドのロケール
..など
public class LocalizedRazor : RazorViewEngine
{
public LocalizedRazor()
: base()
{
}
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
var controllerName = (string)controllerContext.RouteData.Values["controller"];
var format = "~/Views/{0}/{1}.{2}.cshtml";
var lang = Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName;
if (VirtualPathProvider.FileExists(string.Format(format, controllerName, viewName, lang)))
return base.FindView(controllerContext, viewName + "." + lang, masterName, useCache);
return base.FindView(controllerContext, viewName, masterName, useCache);
}
}
とです。asax:
protected void Application_Start()
{
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new LocalizedRazor());
}