1

ローカライズしようとしているアプリケーションは、いくつかのホストされたWPFユーザーコントロール(ElementHost WinFormsコントロールでホストされているWPFユーザーコントロール)を持つWinFormsアプリケーションです。

私はresxファイルを使用してWinFormsをローカライズします。これは、VS2008が非常にうまく管理します。

LocBamlメソッドを使用してWPFパーツをローカライズしようとすると、問題が発生します。

ソリューションをビルドすると、Visual Studioによってサテライトアセンブリが自動的に生成されますが、resxファイルのWinFormsリソースに対してのみ生成されます。次に、LocBamlコマンドラインツールを使用すると、サテライトアセンブリが生成されますが、xamlファイルのWPFリソースに対してのみ生成されます。

結果として得られる2つのDLL(WPFとWinForms)を単一の衛星アセンブリにマージする方法がわかりません。

4

3 に答える 3

3

Blech...WPF チームは、ローカリゼーション ソリューションに何かを残していたようです。さて、価値のあることとして、これが私がやってきたことです(公平を期すために、私は実際にこのアイデアをCodeProjectのJecho Jekovから借りてきました):

まず、Localization MarkupExtension クラスを作成 (または借用) する必要があります。Jecho は彼の LocExtension を呼び出します。私は自分の i18nExtension を呼び出しましたが、それは Loc よりも少し説明的であると感じたこと以外の理由はありません。このマークアップ拡張機能が行うことは、リソース ファイル内の特定のリソース キーを検索することです。すべてのリソースを Properties/Resources.resx ファイルに配置したい場合、これは非常にシンプルで簡単にコーディングできるクラスです。

最終的には、xaml で次のようなものになります。

<UserControl ... >
    ...
    <TextBox Text="{i18n HelloWorld}"/>
    ...
</UserControl>

WinForms デザイナーで許可されているように、UserControl/Window ごとに個別の resx ファイルが必要な場合は、MarkupExtension をもう少しクリエイティブにして、そのコンテキストを把握できるようにする必要があります。

最終的には、カルチャごとに 1 つのサテライト アセンブリができあがります。頭に浮かぶ1つの注意点は、これがオンザフライの文化/言語の変化にどのように対処するかがわからないということです. 少なくとも、ウィンドウ/コントロールをリロードする必要があります。

于 2009-03-12T04:32:10.967 に答える
0

複数のリソースセットを単一の衛星アセンブリにマージする方法

正しい方法は、AL.exe(アセンブリリンカーツール)を使用して、Windowsフォームの.resourcesファイルとLocBamlによって生成された.resourcesの両方を単一のサテライトアセンブリに埋め込むことです(デフォルトでは、WinFormsリソースのみを含む元のビルドを置き換えます)。

ハイブリッドアプリを構築する手順は次のとおりです。

  1. ソリューションを構築します(WinFormsのみの.resourceファイルとsatellite dllを生成します)。
  2. locBamlツールを使用してXAML.resourceファイルを生成します
  3. AL.exeを使用して、両方の.resourceファイルのセットを新しいハイブリッドサテライトdllにリンクし、手順1の元のファイルを置き換えます。プロジェクトを再構築するには、xamlリソースを再統合するために、手順2と3を繰り返す必要があるため、おそらく自動化する必要があります。これをビルドステップまたはターゲットとして追加します。

使用例:

Al.exe /out:MyApp.resources.dll /culture:es-ES /embed:MyApp.Form1.es-ES.resources /embed:MyAppWpf.g.es-ES.resources

詳細情報(ハイブリッドアプリケーションのローカライズ)http://msdn.microsoft.com/en-us/library/ms754231.aspx

于 2012-06-28T18:48:47.223 に答える
0

メソッド DustyburwellがWinForms に埋め込まれた WPF ユーザー コントロールで動作するようにするには、WinForms フォーム コンストラクターで InitializeComponent() を呼び出した後にカルチャをユーザー コントロールに設定し、値を更新する必要があります。

  1. WinForms フォームを宣言します。
  2. ElementHost (elementHost1) を追加します。
  3. elementHost1 (userControl1) に WPF UserControl を追加します。
  4. フォームのコードを開きます。次のコードを記述します。
    public Form1()
    {
        InitializeComponent();

        WpfLocalization.LocalizationScope.SetCulture(userControl1, System.Threading.Thread.CurrentThread.CurrentCulture);
        WpfLocalization.LocalizationScope.SetUICulture(userControl1, System.Threading.Thread.CurrentThread.CurrentCulture);
        WpfLocalization.LocalizationManager.UpdateValues();
    }

CurrentCulture が変更されるたびに、WinForms に埋め込まれた WPF ユーザー コントロールごとにこの 3 行を呼び出す必要があります。

于 2011-12-09T15:34:03.023 に答える