2011-03-30 46 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