11

この特定の質問に対する答えを見つけるのは難しいので、ここにポップアップしてください:

完全に言語固有のURLを構築したい、つまり

www.mysite.com/EN

www.mysite.com/DE

これはRouteConfigで行われます

url: "{language}/{controller}/{action}/{id}"

しかし、次に注意が必要な部分は次のとおりです。

www.mysite.com/EN/Categories

www.mysite.com/DE/Kategorien

つまり、コントローラー名を複数の言語で表示しますが、同じコントローラーを指します。これも可能ですか?

4

1 に答える 1

17

まあ、これは部分的に可能です(言語部分のみ)。別の言語でのコントローラー名は確かに興味深い点ですが、それを実現するのは難しいと思います。アラビア語やヘブライ語などのBidi言語でどのように見えるかを考えてください。異なる言語でコントローラーを使用することはおそらく良い考えですが、あなたは自分自身のために大混乱を引き起こし、これを可能にするために基礎となるMVC構造を変更する必要があると私は信じています。

言語変更の部分は簡単で、以下のように行うことができます。

あなたが見たいと思うかもしれないのはグローバリゼーションです。基本的に、言語部分は現在のスレッドUIカルチャに対応しています。必要なものは次のとおりです。

  1. 次のようなルートを定義します。

    var lang = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
    
    routes.MapRoute(
        name: "Default",
        url: "{language}/{controller}/{action}/{id}",
        defaults: new { language = lang, controller = "Home", 
                        action = "Index", id = UrlParameter.Optional }
     );
    
  2. 登録Application_AcquireRequestStateして、次のように定義します。

    protected void Application_AcquireRequestState()
    {
        var routes = RouteTable.Routes;
    
        var httpContext = Request.RequestContext.HttpContext;
        if (httpContext == null) return;
    
        var routeData = routes.GetRouteData(httpContext);
    
        var language = routeData.Values["language"] as string;
        var cultureInfo = new CultureInfo(language);
    
        System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo;
        System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo;
    }
    

    CurrentUICulture言語を切り替えるために必要なのはリソースファイルから情報をロードすることですが、同じに変更する必要もありCurrentCultureますCultureInfo

  3. 最後に、対応するリソースファイルとフォールバックリソースファイルがあることを確認してください。

私はNameのプロパティを使用しCultureInfoたので、ドイツ語はde-DE、英語はen-USなどになります。これでうまくいくはずです。

さらに情報が必要な場合は、サンプルMVCプロジェクトをアップロードして調べることができます。

更新:必要なことを行うための大まかな方法​​の1つは、ルートセグメントの順序を次のように反転することです。

routes.MapRoute(
    name: "NewDefault",
    url: "{language}/{id}/{action}/{controller}",
    defaults: new { language = lang, controller = "Home", action = "Index", id = "Category"}
);

このようにして、次のリクエストを行うことができますhttp://www.your_url.com/de/Kategorien。この場合、Kategorienidはコントローラーではなくマップします。コントローラーは英語またはドイツ語(名前の付け方によって異なります)のままですが、ユーザーには別の言語が表示されます。背景では、ビューは次のようになります。

public ActionResult Index(string id, string categoryName)
{
    // Fetch data based on category name (categoryName)
    return View();
}

追加情報をパラメーターとして渡すこともできますが、ルートを次のように調整する必要があります:{language} / {category} / {subcategory} / {action} / {controller}

これは長期的には首の痛みになる可能性があることを知っておいてください。これを試す場合は、十分に文書化してください。

于 2013-02-21T16:36:22.470 に答える