我有一个转换文件的控制台MEF应用程序。有一些用于记录警告和错误的类,每个类都在单独的程序集中。我要记录的每条消息都转到LoggerProxy类,然后转到所有相关的记录器。我正在使用强类型资源名称,例如Message.NoFilesFound。这是我的问题 - 我的字符串必须是英文或德文,但文件所有者的信息必须使用他的语言。这意味着Message.NoFilesFound应该在控制台和日志文件中使用德语,但是例如意大利邮箱为客户。
如何为thist任务设置系统?
现在我有:
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 :(得分:0)
我想说Log(Message.FileNotFound)并且在控制台“Datei nicht gefunden”上有一行,在logfile中有相同的行,但在我们的意大利客户的邮件中“File non trovato”。我们无法阅读意大利语中的日志文件,并非所有客户都能阅读德语/英语信息。 - Gabriel Gnatowski 2分钟前
您需要重构接口,以便显示的Write方法获取未定位的消息ID(Message.NoFilesFound)。
然后有两种方法。 Logger(记录器)有一个成员描述记录器要使用的区域设置ID,或者能够自动将ID转换为消息(当登录到数据库时,可能根本没有翻译,所以你可以稍后以您的首选语言查看日志,或仅用于压缩目的。)
我不知道任何插值字符串,但怀疑你有它们(例如,“Fichier {0}非故障”),所以你也需要能够传递它们。呼叫站点(LoggerProxy.Write)上的params string[]
很整洁,但是在IEnumerable链下面是最通用的。
我认为所有这些都是肤浅的,但我认为它至少在问题清楚的时候回答了这个问题。