我正在.NET環境中工作,系統偶爾會爲客戶生成日誌條目。然後將消息附加到客戶日誌中,稍後可以對其進行審查。本地化系統生成的狀態消息
例如,如果客戶訂閱了新服務,或者客戶的付款嘗試失敗,則這些郵件會附加到客戶日誌中。
目前,所有消息都被硬編碼到代碼中,例如「客戶未能完成XX付款」。
現在的問題是,這些消息需要以一種聰明的方式進行本地化,例如,當英語用戶查看客戶日誌時,他會以英語獲取消息,並且當外國用戶查看日誌時,他會獲取它們用他的語言。
什麼是處理這種情況的最佳方法?
我正在.NET環境中工作,系統偶爾會爲客戶生成日誌條目。然後將消息附加到客戶日誌中,稍後可以對其進行審查。本地化系統生成的狀態消息
例如,如果客戶訂閱了新服務,或者客戶的付款嘗試失敗,則這些郵件會附加到客戶日誌中。
目前,所有消息都被硬編碼到代碼中,例如「客戶未能完成XX付款」。
現在的問題是,這些消息需要以一種聰明的方式進行本地化,例如,當英語用戶查看客戶日誌時,他會以英語獲取消息,並且當外國用戶查看日誌時,他會獲取它們用他的語言。
什麼是處理這種情況的最佳方法?
如果您嘗試以會話方式將動態數據插入到消息中,您將遇到的問題是。例如,如果您必須編寫「找不到消息」,而「發現一條消息」與「發現X消息」有問題 - 在英語中,我們有零個,一個和多個不同的複數,但它是不一定像其他語言那樣。諸如數字或日期之類的東西在String中插入的問題較少。格式化表單,但您不希望進入嘗試以本地化方式動態生成真實語言的業務。
我推薦遵循一個很像Windows事件日誌的模式,其中輸出事件ID,基於事件ID的本地化消息,然後捕獲某些「字段」,您將在其中本地化字段名稱和該字段的顯示格式,如「金額:$ 2.00」或其他。這可能不是最好的方法,但除非你有一位專職的語言學家專門研究這一點,並且你打算考慮每種語言的所有細微差別,否則我會用簡單的日誌輸出格式。
在你給出的例子中,你會從上述數據中分離的日誌信息,如:
客戶未能完成付款。
金額:XX
如果客戶未能完成付款,您將記錄消息ID,例如「13579」可能是事件的唯一ID。最後,您可以將該值存儲爲單獨的字段。
如何確定分配給事件的數量字段或如何存儲數據是......這是一個最好留給讀者的練習。
您可以在數據庫中定義本地化字符串,並將日誌消息的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一起。 (或者你把它稍微歸一化並放在第三個表中,但這很可能是過早的標準化;-)。
您使用的是文件日誌還是事件日誌? – Treb 2008-12-11 16:12:14