我在.NET环境中工作,系统偶尔会为客户生成日志条目。然后将消息附加到客户日志中,以便稍后查看。
例如,如果客户订阅了新服务,或者客户的付款尝试失败,则这些消息会附加到客户日志中。
目前,所有邮件都被硬编码到代码中,例如“客户未能完成XX的付款”。
现在的问题是这些消息需要以智能方式进行本地化,这样当英语用户查看客户日志时,他会用英语获取消息,当外国用户查看日志时,他会将其输入他的语言。
处理这种情况的最佳方法是什么?
答案 0 :(得分:4)
如果您尝试以对话方式将动态数据插入到消息中,那么您将遇到的问题。例如,如果你必须写“找不到消息”而不是“找到一条消息”与“找到的X消息”有问题 - 在英语中我们有零,一和多个不同的多个......但它是不一定像其他语言那样。以String.Format形式插入数字或日期等问题的问题较少,但您不希望尝试以本地化方式动态生成真实语言。
我建议遵循一个类似于Windows事件日志的模式,您可以在其中输出事件ID,基于事件ID的本地化消息,然后捕获某些“字段”,您将在其中本地化字段名称和字段的显示格式,如“金额:$ 2.00”或其他。它可能不是最漂亮的方式,但除非你有一个全职的语言专家致力于这个并且你打算考虑每种语言的所有细微差别,我会用更简单的日志输出格式
在您给出的示例中,您将日志消息与数据分开,例如:
客户未能完成付款 金额:XX
您将记录消息ID,例如“13579”可能是客户未能完成付款时事件的唯一ID。最后,您可以将值存储为单独的字段。
如何确定要分配给事件的字段数量或如何存储数据......好吧,最好留给读者练习。
答案 1 :(得分:1)
您可以在数据库中定义本地化字符串,只需将日志消息的ID记录到日志表中。日志消息表还包含一个用于指示语言的字段。
如果您正在进行大量日志记录,那么这也会减少日志的大小(即使这可能不相关,考虑到现代计算机中可用的存储空间; - )
该方法有两个问题:
第一点可以通过使用带有描述性名称的枚举来处理,例如
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!"
为此,您必须将变体数据(“我”,“你”,“我的小弟弟......”)与日志消息ID一起存储在您的日志表中。 (或者你将它标准化一点并将其放在第三个表中,但这很可能是过早的标准化; - )。