web-dev-qa-db-ja.com

MVC4ローカリゼーション。ビューからresxにアクセスする

私の見解では、そのファイルの特定のローカルリソースからリソース文字列にアクセスしたいと思います。Webフォームからわかるように:

(string)GetLocalResource("Title");

痛みがなくスムーズ。フレームワークは、カルチャ情報コード拡張子(.en-EN.resx)から取得する.resxファイルを処理します。

RazoreビューのMVC4でそれは可能ですか?そしてどうやって?

.resxファイルのCustom ToolプロパティをPublicResXFileCodeGeneratorに設定できることに気づきました。そうすれば、ビューからアクセスできます。例:私はindex.cshtmlに対して2つのリソースファイルをデンマーク語と英語で作成しました。私がウェブフォームでするように。これが私が書きたいものです(Custom Tool Nameプロパティを 'ViewResource'に設定):

@ViewResource.Title

バム。現在の文化がデンマーク語の場合、タイトルは「Forside」、英語の場合は「Home」になります。しかし、代わりに私が与えられる唯一のオプションは、特定のファイルを選択することです。そして、そこから目的の文字列を選択します。

@ViewResource.Index_cshtml_en-EN_resx.Title

それは動的ではありません。それで、en-EN/da-DKをどうにかして置き換える拡張クラスを作成できると思いました。しかし、それは本当に「単純な」何かのための比較的多くの作業のようであり、すでに十分に簡単にWebフォームに統合されているようです。別の方法が必要です。確かに、MVCチームは他のすべてのように私たちのためにいくつかのスマートなメカニズムを持っています:)

15
Kasper Skov

特別な.NETフォルダーApp_LocalResourcesを使用しました。

手順は次のとおりです

そのフォルダーに.resxファイルを追加します(例:Resource.resxResource.es-ES.resx

.resxファイルを右クリックしてpropertiesを選択し、以下が選択されていることを確認します

Build Action: Embedded Resource 
Custom Tool: PublicResXFileCodeGenerator
Custom Tool Namespace: Resources

次に、ビューでResources名前空間を使用して.resxファイルのテキストにアクセスできます

<h2>@Resources.Resource.Global_Title<h2>

@Resourcesは、Custom Tool Namespaceおよび.Resourceで指定した名前であるため、.resxファイルの名前です。

また、リソースがPublicに設定されていることを確認してください

任意のモデルからリソースにアクセスするには、1行追加するだけです

using Resources;  //<<-- This line

namespace Concordia_CRM.Models
{
    public class SolicitudDemo
    {
        [Required]
        [Display(Name = "SD_NombreEmpresa", ResourceType = typeof(Resource))]
        public string NombreEmpresa { get; set; }

...
}

詳細については、この post を参照してください。

上部のVisual Studioのリソースデザイナーには、ラベル:アクセス修飾子のコンボボックスがあります。

9
phykas

F.exというフォルダを作成した場合。 「リソース」と2つのファイルIndex.resxとIndex.da-DK.resxを追加します。カミソリビューでこのようにアクセスできるはずです。

@Resources.Index.Title

次に、現在のスレッドカルチャに応じて、正しいファイルからテキストを選択します

7
terjetyl

terjetylは私を正しい道に導きましたが、それを機能させるためにいくつかの "コーディング"(まあ)を行う必要がありました。私のセットアップはVisual Studio 2013、MVC 5、Razorです。

  1. ビューを含むフォルダーを右クリックし、[追加]> [ASP.NETフォルダーの追加]> [App_LocalResources]を選択します。

  2. ここに2つのリソースファイルを追加します。Index.cshtml.resxとIndex.cshtml .fr-FR。resx(ビューの名前が「Index」で、フランス語の翻訳が必要であると想定しています)。ファイルのプロパティを確認し、それらが_Build Action=Content_およびCustom Tool=(blank)に設定されていることを確認します

  3. Resxファイルをダブルクリックし、キー/値を入力します

  4. HtmlHelper拡張メソッドを作成します。


_public static class HtmlExtensions
{
    public static MvcHtmlString Translate(this HtmlHelper htmlHelper, string key)
    {
        var viewPath = ((System.Web.Mvc.RazorView)htmlHelper.ViewContext.View).ViewPath;
        var culture = System.Threading.Thread.CurrentThread.CurrentCulture;

        var httpContext = htmlHelper.ViewContext.HttpContext;
        var val = (string)httpContext.GetLocalResourceObject(viewPath, key, culture);

        return MvcHtmlString.Create(val);
    }
}
_

  1. ビューで拡張機能を使用します。

    <p>@Html.Translate("MyKey")</p>

説明のために、ヘルパーはビューの仮想パスを取得し、それをHttpContext.GetLocalResourceObject()に渡します。HttpContext.GetLocalResourceObject()は、どのリソースファイルを使用するかを決定します(そして、正常に低下します)。

最後に、これがweb.configにあることを確認してください:

_<system.web>
    <globalization culture="auto" uiCulture="auto" enableClientBasedCulture="true" />
    ...
_

私はこれをできるだけ簡単にしようと努めました。ただし、この例を使用すると、fr-FR以外のフランスの文化(たとえば、fr-CA)はデフォルトでベースresxになることに注意してください。これより賢くしたい場合は、より多くのコードが必要です-リクエストに応じて含めることができます。

3
Dunc

うまくいきませんでした。 .netフォルダ「App_LocalResources」を使用してしまいました。

2
Kasper Skov

@MyApp.Resources.Resources.Titleを使用して機能させました。

0
tonjo