同时对多种语言进行本地化

时间:2011-03-30 12:19:33

标签: c# localization

我有一个转换文件的控制台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中更改文化,但参数已经是本地化的字符串。

1 个答案:

答案 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链下面是最通用的。

我认为所有这些都是肤浅的,但我认为它至少在问题清楚的时候回答了这个问题。