4

システムが顧客のログエントリをときどき生成する.NET環境で作業しています。その後、メッセージは顧客ログに追加され、後で確認できます。

たとえば、顧客が新しいサービスに加入している場合、または顧客が支払いの試みに失敗した場合、これらのメッセージは顧客ログに追加されます。

現時点では、すべてのメッセージがコードにハードコードされています。たとえば、「顧客はXXの支払いを完了できませんでした」などです。

問題は、これらのメッセージをスマートな方法でローカライズする必要があることです。たとえば、英語のユーザーが顧客ログを確認すると英語でメッセージを取得し、外国のユーザーがログを確認すると自分の言語でメッセージを取得します。

このシナリオを処理するための最良の方法は何でしょうか?

4

2 に答える 2

4
  • メッセージではなく、イベント識別子をログに記録します。
  • イベント識別子とともにイベント固有のデータをキャプチャします。
  • ユーザーがログを表示するときに、一意の識別子に基づいてイベント メッセージをローカライズします。

会話形式で動的データをメッセージに挿入しようとすると、問題が発生します。たとえば、「メッセージが見つかりません」対「1 つのメッセージが見つかりました」対「X 件のメッセージが見つかりました」と書かなければならない場合、問題があります。他の言語では必ずしもそうではありません。数値や日付などを String.Format フォームに挿入することはそれほど問題はありませんが、ローカライズされた方法で実際の言語を動的に生成しようとするビジネスに参加したくはありません。

イベント ID、イベント ID に基づいてローカライズされたメッセージを出力する Windows イベント ログによく似たパターンに従い、フィールド名と表示形式をローカライズする特定の「フィールド」をキャプチャすることをお勧めします。 「金額:$ 2.00」などのフィールド。これは最善の方法ではないかもしれませんが、これに専念するフルタイムの言語学者がいて、すべての言語の細かいニュアンスをすべて説明するつもりでない限り、私はパントしてより単純なログ出力形式を使用します. .

与えられた例では、次のようにログ メッセージをデータから分離します。

お客様が支払いを完了できませんでした。
金額:○○

「13579」のようなメッセージ ID をログに記録すると、顧客が支払いを完了できなかった場合のイベントの一意の ID になる可能性があります。最後に、値を別のフィールドとして保存できます。

イベントに割り当てるフィールドの数やデータの保存方法をどのように判断するかは、読者に任せるのが最善の方法です。

于 2008-12-11T22:18:18.923 に答える
1

データベースでローカライズされた文字列を定義し、ログ メッセージの ID をログ テーブルに記録するだけです。ログ メッセージ テーブルには、言語を示すフィールドも含まれます。

多くのロギングを行っている場合は、ログのサイズも縮小されます (最新のコンピューターで利用可能なストレージ スペースを考えると、おそらく関係ないかもしれませんが ;-)

この方法には 2 つの問題があります。

  1. アプリケーションのロギングをログ メッセージ テーブルと同期する必要があります。
  2. 動的データ (顧客名など) をログに記録することはできません。

最初のポイントは、わかりやすい名前の列挙型を使用して処理できます。

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

アプリでは、次void LogToDatabase(LogMessages)のように呼び出します。

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

2 番目の問題は、さらに作業が必要です。使用できるように文字列を定義できますstring.Format()

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

このためには、バリエーション データ (「私」、「あなた」、「私の弟」など) をログ メッセージ ID と共にログ テーブルに保存する必要があります。(または、もう少し正規化して 3 番目のテーブルに入れますが、それは正規化が時期尚早である可能性があります ;-)。

于 2008-12-11T17:08:58.580 に答える