【问题标题】:Localizing system generated status messages本地化系统生成的状态消息
【发布时间】:2010-09-26 11:15:45
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您使用的是文件日志还是事件日志?
  • 目前我们正在将原始文本字符串记录到 SQL 数据库中。

标签: .net localization


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

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

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

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

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

您需要记录一个消息 ID,例如“13579”可能是客户未能完成付款时事件的唯一 ID。最后,您可以将值存储为单独的字段。

如何确定要为事件分配多少字段或如何存储数据……嗯,最好留给读者做练习。

【讨论】:

    【解决方案2】:

    您可以在数据库中定义本地化字符串,并将日志消息的 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 一起存储在日志表中。 (或者你把它归一化一点,然后把它放在第三张表中,但这很可能是过早的归一化;-)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多