2011-03-30 48 views
1

我有一個用於轉換文件的控制檯MEF應用程序。有一些類用於記錄警告和錯誤,每個類都在單獨的程序集中。每一條我想記錄的信息都會傳送到LoggerProxy類,並從它傳送到所有相關的記錄器。我使用強類型資源名稱,例如Message.NoFilesFound。這是我的問題 - 我的字符串必須是英文或德文,但文件所有者的信息必須用他的語言。這意味着Message.NoFilesFound在控制檯和日誌文件中應該是德語,但例如意大利人在郵件爲客戶。同時對多種語言進行本地化

如何爲系統設置任務?

現在我有:

class Main() 
{ 
    Message.Culture = new CultureInfo("it"); 
    LoggerProxy.Write(Destination.Console|Destination.Customer, Message.NoFilesFound); 
} 

class LoggerProxy 
{ 

    [ImportMany] 
    Lazy<ILogger,ILoggerMetadata>[] Loggers { get; set; } 

    public void Write(Destination dest, string msg) 
    { 
     foreach (var logger in Loggers) 
      if ((logger.Metadata.Destination & dest) != 0) 
       logger.Value.Write(msg); 
    } 
} 

我想在LoggerProxy.Write的文化變革,但參數已經是本地化的字符串。

+0

Windows應用程序,網絡應用程序? – balexandre 2011-03-30 12:22:34

+0

如果參數已經本地化,那麼我不知道你的期望。你可以祈禱函數'relocalize'來,但請參閱http://en.wikipedia.org/wiki/Entropy。請告訴我們它是什麼_exactly_你期望/要求 – sehe 2011-03-30 12:23:04

+0

balexandre:控制檯MEF應用程序 – Gabriel 2011-03-30 14:08:24

回答

0

我想說的日誌(Message.FileNotFound),並且對控制檯「Datei nicht gefunden」,在日誌文件中相同的行一行,但在郵件中對我們在意大利的「文件不TROVATO」客戶。我們無法用意大利語閱讀日誌文件,並且並非所有客戶都可以用德語/英語閱讀郵件。 - Gabriel Gnatowski 2分鐘前

您需要重構接口,以便顯示的Write方法獲得未定位的消息ID(Message.NoFilesFound)。

然後有兩種方法。記錄器(記錄器)有一個成員可描述記錄器使用的區域ID,或者可以自動將該ID轉換爲消息(可能根本沒有任何翻譯,當登錄到數據庫時,您可以稍後以您的首選語言查看日誌,或者僅用於壓縮目的)。

我沒有意識到任何插值字符串,但懷疑你有它們(例如「Fichier {0} nontrouvé」),所以你需要能夠傳遞這些字符串。 A params string[]在調用站點(LoggerProxy.Write)上是整齊的,但IEnumerable鏈下面是最通用的。

我想這一切都很膚淺,但我認爲它至少回答了這個問題,只要我明確問題的答案。

+0

這當然是最簡單的解決方案(我們用於舊的Delphi應用程序),但我希望找到集成在.NET中的東西。有了這個解決方案,我可以忘記從resx文件自動生成強類型的資源。 – Gabriel 2011-03-30 15:06:42

+0

如果你可以解釋爲什麼你認爲這是_a給定_也許我們可以找到_真正的問題_ – sehe 2011-03-30 18:03:39

+0

我找到了resx的解決方案: Message.NoFilesFound代表字符串「NoFilesFound」。 LoggerProxy從ResourceManager獲取每個記錄器正確的本地化消息。所以我強烈地鍵入了消息,並可以爲每個輸出更改它們。 – Gabriel 2011-04-01 11:51:40