18

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

(string)GetLocalResource("Title");

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

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

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

@ViewResource.Title

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

@ViewResource.Index_cshtml_en-EN_resx.Title

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

4

6 に答える 6

41

特別な.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; }

...
}

詳細については、この投稿をご覧ください。

于 2015-06-22T15:38:41.650 に答える
10

上部のVisualStudioのResourcesDesignerには、:Access Modifierというラベルの付いたコンボボックスがあります。通常は:internalに設定され、動作させるために:Publicに設定されます。

于 2014-08-13T18:44:45.050 に答える
7

f.exというフォルダを作成する場合。「リソース」と2つのファイルIndex.resxとIndex.da-DK.resxを追加すると、かみそりのビューでこのようにアクセスできるはずです。

@Resources.Index.Title

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

于 2013-02-24T01:12:13.953 に答える
3

terjetylは私を正しい道に導いてくれましたが、それを機能させるためにいくつかの「コーディング」(ああ、ナッツ)をしなければなりませんでした。私のセットアップはVisualStudio2013、MVC 5、Razorです。

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

  2. ここに2つのリソースファイルを追加します:Index.cshtml.resxとIndex.cshtml。fr-FR .resx(ビューが「インデックス」と呼ばれ、フランス語の翻訳が必要であると想定)。ファイルのプロパティをチェックし、それらがとに設定されていることを確認し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()に渡します。これにより、使用するリソースファイルが決定されます(正常に機能が低下します)。

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

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

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

于 2015-03-27T17:23:39.233 に答える
2

私はそれを機能させることができませんでした。.netフォルダー「App_LocalResources」を使用することになりました。

于 2013-03-22T12:56:47.347 に答える
0

を使用して動作させまし @MyApp.Resources.Resources.Titleた。

于 2016-02-23T14:09:30.917 に答える