4

我在 .NET 环境中工作,系统偶尔会为客户生成日志条目。然后将消息附加到客户日志中,以后可以查看该日志。

例如,如果客户正在订阅一项新服务,或者客户的付款尝试失败,则这些消息会附加到客户日志中。

目前,所有消息都被硬编码到代码中,例如“客户未能完成XX的支付”。

现在的问题是这些消息需要以一种智能的方式进行本地化,这样当一个英语用户查看客户日志时,他会得到英文消息,而当外国用户查看日志时,他会得到他的语言的消息。

处理这种情况的最佳方法是什么?

4

2 回答 2

4
  • 记录事件标识符而不是消息。
  • 捕获事件特定数据以及事件标识符。
  • 当用户查看日志时,根据唯一标识符本地化事件消息。

您将遇到的问题是,如果您尝试以会话方式将动态数据插入到消息中。例如,如果您必须写“未找到消息”与“找到一条消息”与“找到 X 条消息”是有问题的 - 在英语中,我们有不同的复数表示零、一和多于一……但它是不一定像其他语言那样。像数字或日期这样的东西在 String.Format 形式中插入的问题较少,但您不想参与尝试以本地化方式动态生成真实语言的业务。

我建议遵循类似于 Windows 事件日志的模式,您可以在其中输出事件 ID、基于事件 ID 的本地化消息,然后捕获某些“字段”,您将在其中本地化字段名称和显示格式该字段,例如“金额:$ 2.00”或其他。这可能不是最漂亮的方法,但除非你有一个专职的语言学家专门研究这个并且你打算考虑每种语言的所有细微差别,否则我会选择更简单的日志输出格式.

在您给定的示例中,您将日志消息与数据分开,例如:

客户未能完成付款。
金额:XX

You'd log a message ID, like "13579" might be the unique ID for the event when a customer fails to finish a payment. Finally, you could store the value as a separate field.

How you go about figuring out how many fields to allocate to an event or how to store the data is... well, an exercise best left to the reader.

于 2008-12-11T22:18:18.923 回答
1

您可以在数据库中定义本地化字符串,并将日志消息的 id 记录到日志表中。日志消息表还将包含一个指示语言的字段。

如果您要进行大量日志记录,那也会减少日志的大小(即使这可能不相关,考虑到现代计算机中可用的存储空间;-)

该方法有两个问题:

  1. 您需要将应用程序中的日志记录与日志消息表同步。
  2. 您不能记录任何动态数据,例如客户姓名。

第一点可以通过使用具有描述性名称的枚举来处理,例如

enum LogMessages
{
    OutOfDiskSpace = 1;
    OutOfMemory = 2;
    OutOfCoffee = 3;
}

在您的应用程序中,您会这样调用void LogToDatabase(LogMessages)

// forgot to buy coffee again!
Log(OutOfCoffee);

第二个问题需要更多的工作。您可以定义您的字符串,以便您可以使用string.Format()

 string.format("{0} forgot to buy coffee again. Lazy geek!", "I");
// yields: "I forgot to buy coffee again. Lazy geek!"

为此,您必须将变化数据(“I”、“you”、“My little brother”...)与日志消息 ID 一起存储在日志表中。(或者您将其规范化一点并将其放在第三个表中,但这很可能是过早的规范化;-)。

于 2008-12-11T17:08:58.580 回答