2008-12-11 91 views
4

我正在.NET環境中工作,系統偶爾會爲客戶生成日誌條目。然後將消息附加到客戶日誌中,稍後可以對其進行審查。本地化系統生成的狀態消息

例如,如果客戶訂閱了新服務,或者客戶的付款嘗試失敗,則這些郵件會附加到客戶日誌中。

目前,所有消息都被硬編碼到代碼中,例如「客戶未能完成XX付款」。

現在的問題是,這些消息需要以一種聰明的方式進行本地化,例如,當英語用戶查看客戶日誌時,他會以英語獲取消息,並且當外國用戶查看日誌時,他會獲取它們用他的語言。

什麼是處理這種情況的最佳方法?

+0

您使用的是文件日誌還是事件日誌? – Treb 2008-12-11 16:12:14

回答

4
  • 記錄事件標識符而不是消息。
  • 捕獲事件特定數據以及事件標識符。
  • 當用戶查看日誌時,根據唯一標識符定位事件消息。

如果您嘗試以會話方式將動態數據插入到消息中,您將遇到的問題是。例如,如果您必須編寫「找不到消息」,而「發現一條消息」與「發現X消息」有問題 - 在英語中,我們有零個,一個和多個不同的複數,但它是不一定像其他語言那樣。諸如數字或日期之類的東西在String中插入的問題較少。格式化表單,但您不希望進入嘗試以本地化方式動態生成真實語言的業務。

我推薦遵循一個很像Windows事件日誌的模式,其中輸出事件ID,基於事件ID的本地化消息,然後捕獲某些「字段」,您將在其中本地化字段名稱和該字段的顯示格式,如「金額:$ 2.00」或其他。這可能不是最好的方法,但除非你有一位專職的語言學家專門研究這一點,並且你打算考慮每種語言的所有細微差別,否則我會用簡單的日誌輸出格式。

在你給出的例子中,你會從上述數據中分離的日誌信息,如:

客戶未能完成付款。
金額:XX

如果客戶未能完成付款,您將記錄消息ID,例如「13579」可能是事件的唯一ID。最後,您可以將該值存儲爲單獨的字段。

如何確定分配給事件的數量字段或如何存儲數據是......這是一個最好留給讀者的練習。

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!" 

對於這一點,你必須存儲的變化數據(「我」,「你」,「我的小兄弟」 ...)在您登錄表連同日誌消息ID一起。 (或者你把它稍微歸一化並放在第三個表中,但這很可能是過早的標準化;-)。