2013-06-25 77 views
1

DocumentViewer WPF contorol正在使用System.Windows.SR.Get(string)內部方法將消息顯示給用戶在搜索期間顯示。儘管我的pl-PL設置爲CurrentCultureCurrentUICulture,但這些都沒有本地化。更改DocumentViewer的默認本地化錯誤消息

我調查了一點,System.Windows.SR.Get(string)使用new ResourceManager("ExceptionStringTable", typeof (System.Windows.SR).Assembly)PresentationFramework程序集,它反過來加載ExceptionStringTable.resources文件與這些消息。從我的理解來看,這是跨框架的標準本地化技術。

我的問題是:如何讓WPF顯示我的自定義本地化消息?我已經嘗試使用hacky反射,並且能夠訪問SR類的內部ResourceManager。我是否應該將其包裝在自定義的ResourceManager實施中,還是有更簡單的方法?

回答

1

我決定去反思黑客。你必須使用這個代碼在應用程序啓動時掉在內部.NET SR類使用ResourceDictionary

var assembly = typeof(DocumentViewer).Assembly; 
var sr = assembly.GetType("System.Windows.SR"); 

var field = sr.GetField("_resourceManager", BindingFlags.NonPublic | BindingFlags.Static); 


var resourceManager = (ResourceManager)field.GetValue(null); 
var wrapper = new ResourceManagerWrapper(resourceManager); 


wrapper.SetString("DocumentViewerSearchUpCompleteLabel", "test"); 
wrapper.SetString("DocumentViewerSearchDownCompleteLabel", "test"); 
wrapper.SetString("DocumentViewerSearchCompleteTitle", "test"); 
//And so on... you can find all those messages with dotPeek or similar tool in `DocumentViewer` implementation 

field.SetValue(null, wrapper); 

其資源查找轉發到我的ResourceManager包裝類很簡單:

public class ResourceManagerWrapper : ResourceManager 
{ 
    private Dictionary<string, string> local_ = new Dictionary<string,string>(); 
    private ResourceManager manager_; 
    public ResourceManagerWrapper(ResourceManager manager) 
    { 
     this.manager_ = manager; 
    } 

    public override string GetString(string name) 
    { 
     string value; 
     if(local_.TryGetValue(name, out value)) 
     { 
      return value; 
     } 
     else 
     { 
      return manager_.GetString(name); 
     } 
    } 

    public void SetString(string key, string value) 
    { 
     local_[key] = value; 
    } 
} 
相關問題