2011-07-26 7 views
4

ASP.NETアプリケーション(MVCまたはWebフォームは問題ありません)をローカライズするとき、リソースファイルでHTML文字列をどのように処理しますか?特に、埋め込まれたダイナミックリンクを持つ段落のようなものをどう扱うのですか?これまでの私の戦略では、href属性の値に何らかのプレースホルダーを使用し、実行時に実際のURLに置き換えることが行われていましたが、これはせいぜい厄介なようです。一例として、ASP.NETローカライゼーション

、私のコピーがあるとします

シンプル何ができるか、MVC(レイザー)を使用して
Thank you for registering. Click 
<a href="{prefs_url}">here</a> 
to update your preferences. 
To login and begin using the app, click 
<a href="{login_url}">here</a>. 

<p>@Resources.Strings.ThankYouMessage</p> 

は今、それはだ

<p>@Resources.Strings.ThankYouMessage 
    .Replace("{prefs_url}", Url.Action("Preferences", "User")) 
    .Replace("{login_url}", Url.Action("Login", "User"))</p> 

に変身恐ろしいことではありませんが、もっと良い方法があるのだろうかと思っています。

+0

これまでMVCで、私はここで見つかったHtmlHelperを調整しました:http://www.eworldui.net/blog/post/2008/05/ASPNET-MVC---Localization.aspxこれはかなりうまくいっています。代わりに通常のString形式のプレースホルダを使用することができました。欠点は、文字列置換よりも許容度が低いことです。 –

答えて

1

実際には構文やパフォーマンスの調整を超えて、より良い方法はありません。たとえば、キャッシュレイヤーを追加して、すべての要求に対してこれらの文字列操作を実行しないようにすることができます。このような何か:このように、おそらく関数を呼び出す

<p>@Resources.LocalizedStrings.ThankYouMessage</p> 

//use Hashtable instead of Dictionary<> because DictionaryBase is not thread safe. 
private static System.Collections.Hashtable _cache = 
    System.Collections.Hashtable.Synchronized(new Hashtable()); 

public static string Localize(string resourceName, string resourceContent) { 
    string cultureName = System.Threading.Thread.CurrentThread.CurrentCulture.Name; 

    if (string.IsNullOrEmpty(resourceName)) 
     throw new ArgumentException("'resourceName' is null or empty."); 

    string cacheKey = resourceName + "/" + cultureName; 

    object o = _cache[cacheKey]; 

    if (null == o) { //first generation; add it to the cache. 
     _cache[cacheKey] = o = ReplaceTokensWithValues(resourceContent); 
    } 

    return o as string; 
} 

お知らせReplaceTokensWithValues()への呼び出し:リソース+文化のハッシュテーブルルックアップを行い

Localize("ThankYouMessage", Resources.Strings.ThankYouMessage) 

。の寿命のためのリソースごとに、上記のように、キャッシング・アプローチを使用することにより

public static string ReplaceTokensWithValues(string s) { 
    return s.Replace("{prefs_url}", Url.Action("Preferences", "User")) 
     .Replace("{login_url}", Url.Action("Login", "User") 
     .Replace("{any_other_stuff}", "random stuff"); 
} 

ReplaceTokensWithValues()のみ文化あたり一度と呼ばれている:それはすべて「恐ろしいない」文字列の置換fifferyが含まれている機能がありますアプリケーション - リソースコールごとに1回ずつ。差は、100万対100万のオーダーである可能性がある。

関連する問題