7

バックグラウンド

私たちのサイトはプレスサイトであり、世界中の多くの人々に閲覧されています。これは明らかに、サイトをできるだけ多くの言語にローカライズすることを意味します。言語ごとにプロの翻訳者が雇われます。

当サイトの現在の仕組み

これを行うために計画した方法は、Guid によってリンクされたデータベースにページの各要素の翻訳を格納することです。そのため、ページが読み込まれると、Guid とユーザーの言語設定を使用して、文字列がデータベースから取り出されます。

私たちのプロジェクトには、英語の翻訳を含むいくつかのドキュメントがあります。このような:

public class StandardButtonToken : LocalisationToken
{
    protected StandardButtonToken(string defaultText, Guid key) : base(defaultText, key)
    {
    }

    public static readonly LocalisationToken Update = new StandardButtonToken("Update", Guid.Parse("8a999f5b-7ca1-466d-93ca-377321e6de00"));
    public static readonly LocalisationToken Go = new StandardButtonToken("Go", Guid.Parse("7a013ecc-0772-4f87-9f1f-da6a878a3c99"));
    public static readonly LocalisationToken Edit = new StandardButtonToken("Edit", Guid.Parse("c31be427-5016-475d-997a-96fa5ff8b51f"));
    public static readonly LocalisationToken New = new StandardButtonToken("New", Guid.Parse("f72d365c-b18f-4f01-a6e4-b0cd930dc730"));
    public static readonly LocalisationToken More = new StandardButtonToken("More", Guid.Parse("bd4da7df-afd2-481e-b6b6-b4a989324758"));
    public static readonly LocalisationToken Delete = new StandardButtonToken("Delete", Guid.Parse("ab00ec14-4414-4cda-a8e2-4f03c9e7c5a8"));
    public static readonly LocalisationToken Add = new StandardButtonToken("Add", Guid.Parse("01e44600-a556-4a07-8a2a-e69a1ea79629"));
    public static readonly LocalisationToken Confirm = new StandardButtonToken("Confirm", Guid.Parse("4c50e91e-3e2f-42fa-97aa-9f1f6f077f09"));
    public static readonly LocalisationToken Send = new StandardButtonToken("Send", Guid.Parse("24121766-f424-4d73-ac58-76f90d58b95c"));
    public static readonly LocalisationToken Continue = new StandardButtonToken("Continue", Guid.Parse("dd2ca0e5-8a35-4128-b2e8-db68a64a6fe5"));
    public static readonly LocalisationToken OK = new StandardButtonToken("OK", Guid.Parse("9a359f93-7c23-44ad-b863-e53c5eadce90"));
    public static readonly LocalisationToken Accept = new StandardButtonToken("Accept", Guid.Parse("3206a76b-1cd7-4dc3-9fff-61dfb0992c75"));
    public static readonly LocalisationToken Reject = new StandardButtonToken("Reject", Guid.Parse("f99c6a9c-6a55-4f55-ac4b-9581e56d18d3"));
    public static readonly LocalisationToken RequestMoreInfo = new StandardButtonToken("Request more info", Guid.Parse("19f3d76b-dafa-47ae-8416-b7d61546b03d"));
    public static readonly LocalisationToken Cancel = new StandardButtonToken("Cancel", Guid.Parse("75617287-5418-466b-9373-cc36f8298859"));
    public static readonly LocalisationToken Publish = new StandardButtonToken("Publish", Guid.Parse("efd87fd4-e7f1-4071-9d26-a622320c366b"));
    public static readonly LocalisationToken Remove = new StandardButtonToken("Remove", Guid.Parse("f7db5d81-5af8-42bf-990f-778df609948e"));
}

ページを作成するたびに、手動でテキストを記述する代わりに、ボタンがこれらのトークンを使用するようにします。したがって、新しいボタンが必要であると判断した場合は、下のファイルに新しいトークンを追加し、サイトが初めて実行されるときにデータベースに存在するかどうかを確認し、存在しない場合は作成されます。

したがって、翻訳に関しては、これらのトークンを翻訳者に送信し、翻訳者はテキストのみを変更します。これは関連する言語でサイトに追加され、ページは選択された言語に応じて正しい翻訳を呼び出します。

問題/質問

私たちの翻訳トークンにはデフォルトのテキストが文字列として含まれていますが、起動時にサーバーがこれらすべてのテキスト文字列をメモリにロードする必要があることを懸念しています。実際には、翻訳をデータベースに保存するためにのみ使用され、それ以外の方法でコードで使用されることはないため、少し無駄になると思います。代わりに、必要に応じてこれらの変換を個別に呼び出すことができると思います。おそらく、メモリ内にない何らかのルックアップ テーブルから呼び出すことができます。

そこで質問です。現在これを行っている方法では、パフォーマンスの問題が発生しますか?

もしそうなら、誰かがより良い解決策を提案できますか?

私たちのサイトには合計で 1000 のこれらのトークンがあります。

今回、Google はあまり役に立たなかったので、アドバイスをいただければ幸いです。私はこれが理にかなっているように、これを表現するためにできる限りの努力をしました。説明するのは簡単ではありません。

人々が提供できる助けを前もって感謝します。

4

2 に答える 2

3

私は現在、同様の状況にあったプロジェクトのチームと協力しています。私たちのプロジェクトは、クライアント/サーバー ベースのアプリケーションです。翻訳を含むデータベースはサーバー上にあり、すべてのコントロールにはデフォルトの英語の値があります。当初、新しいウィンドウが開かれたときに、データベースを読み取り、必要な翻訳を引き出して、コントロールを翻訳しました。このようにして、必要な値のみがメモリ内のどこで変換され、そのウィンドウがそれらを必要としている間だけ変換されます。ウィンドウが閉じられると、ガベージ コレクションを使用してメモリが再利用されます。

私たちが発見したのは、すべてのボタン、ラベル、列ヘッダーなどのすべての翻訳でさえ、システム全体が数百 K しか処理していないメモリにロードされていたことです。

  1. ユーザーがログオンします。
    • デフォルトで英語以外の言語に設定されている場合、データ テーブルがメモリ内に設定され、サーバーからシステム内のすべてのユーザー コントロールの翻訳が取り込まれます。
    • このデータ テーブルには、それに対するクエリを改善するのに役立つ主キーが与えられます。アプリが開いている限り、このデータ テーブルは存在します。
    • ユーザー コントロールがインスタンス化されるたびに、翻訳を検索して適用するメソッドが実行されます。

ユーザーのログインにかかる時間は増加しましたが、平均で数ミリ秒しか増加しませんでした。

とはいえ、似たようなデザインを使っていただけないでしょうか。このアイデアにより、サーバーはセッションごとに翻訳を追跡する必要がなくなります。ページをユーザーにフィードするだけです。

  1. ユーザーのログイン:
    • データテーブル オブジェクトには、サイトのすべての翻訳が入力されます
    • WriteXML() が呼び出されます
    • 結果の XML がクライアントに送信されます
  2. ユーザーが新しいページに移動すると:
    • XML を使用してクライアント マシン上のページを変換するクライアント側スクリプトが呼び出されます。

キャッシュを追加して、サイトが更新されたときにのみ XML が置き換えられるようにするか、ログオン時に毎回各ユーザーに XML をダウンロードさせることができます。いずれにせよ、サーバーの負荷が軽減されます。

于 2012-07-18T17:56:24.317 に答える
3

他の実装を無視して、使用しているセットアップに集中すると、答えは「はい」と「いいえ」です。

はい、受信リクエストの数が増え、特にトークンの数が増えると、従っている方法でパフォーマンスの問題が発生する可能性があります。この関係は、次のように簡単に説明できます。「リクエストが多ければ多いほど、サーバーはより多くの作業を行う必要があります。存在するトークンが多いほど、サーバーはより多くの作業を行う必要があります。リクエストとトークンの両方が増加すると、爆発します。サーバーがしなければならない仕事の量。」

「いいえ」は、現在のソリューションに追加することで実現できます。サーバーがデータベースにクエリを実行したり、要求ごとに各ページを翻訳したりする必要がないように、翻訳されたページを保存するキャッシュを設定に追加できます。たとえば、mypage.aspx20 個の翻訳可能なトークンを含む 1 つのページがある場合、最初はサーバーに翻訳させてから、翻訳されたファイルを、たとえば/localized/mypage.EN.html今後のすべてのリクエストとして保存します (元のページが変更されていない場合、または新しいトークンが変更されていない場合)。追加されていません) は、毎回再翻訳するのではなく、キャッシュされたページのみが送信されます。

さらに、クライアントのリクエストが来るのを待つ代わりに、ページが更新されたとき、またはトークンが更新されたときに、サーバーにすべての翻訳を生成させることができます。

于 2012-07-16T14:56:12.593 に答える