0

インターフェイスのローカリゼーションについて学んでおり、Visual Studio 2008 で WPF を使用しています。私のプログラムの目標は、ユーザーがボタンをクリックしてウィンドウに表示される言語を変更できるようにすることです。ユーザーがボタンをクリックしたときに、コード ビハインド セクションで実行時にリソース ファイルを変更しようとしています。

この質問を読みました: Code Behind でリソース ファイル言語 (resx) をプログラムで変更する

ただし、ボタンクリックイベントで上記の変更を行いたいため、これは私にとっては解決策ではないようです。これをやろうとすると、他の質問の保護された関数がアクションイベント内に入らないため、このソリューションを使用できないようです。

前の質問に基づいて、運が悪かったのは次のとおりです。

/// Change to English-US
        private void Button2_Click(object sender, RoutedEventArgs e)
        {
            protected override void InitializeCulture()
            {
               base.InitializeCulture();
               System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
            }
        }

/// Change to German
        private void Button3_Click(object sender, RoutedEventArgs e)
        {
            protected override void InitializeCulture()
            {
               base.InitializeCulture();
               System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");
            }
        }

私はここ数年、学校や独学でプログラミングを行ってきたので、まったく初心者というわけではありません。ただし、私は C# と WPF に不慣れで、現在取り組んでいるものです。私の知る限り、私のコードのように、関数内に関数を含めることはできません。私がそこに置く唯一の理由は、ボタンクリックイベントで動作する必要があるからです。

これを手伝っていただければ幸いです。

新しいコードは次のとおりです。

namespace LocalizationConcept
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            Properties.Resources.Culture = new CultureInfo(ConfigurationManager.AppSettings["Culture"]);
            ///InitializeComponent();
        }

        /// Exit Button
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            System.Environment.Exit(0);
        }

        private void ChangeCulture(string cultureKey)
        {
            try
            {
                System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureKey);
            }
            catch (Exception err)
            {
                System.Environment.Exit(0);
            }
        }

        private void Button2_Click(object sender, RoutedEventArgs e)
        {
            ChangeCulture("en-US");
        }

        private void Button3_Click(object sender, RoutedEventArgs e)
        {
            ChangeCulture("de-DE");
        }
    }
}
4

2 に答える 2

1

ローカリゼーションとグローバリゼーションについて言えば、WPF は Winforms の同じ機能をサポートしていないようです。実行時に言語をその場で置き換える方法を段階的に示す興味深い記事をいくつか見つけましたが。

  • WPF ローカリゼーション - オンザフライ言語選択:
    • 実行時にオンザフライで言語を置き換えるオプションを提供します
    • 不十分な XML、XPath ベースのバインディング ソリューションよりも優れたパフォーマンスを発揮します。
    • スタイル、コントロール テンプレート、データ テンプレートを介して使用できます。
    • デフォルトおよびカスタムフォーマッタを使用して、フォーマットされたテキストをパラメータで翻訳します
    • エレガントな XAML を記述するための Translate カスタム マークアップ拡張機能を提供します。

  • WPF ランタイムのローカリゼーション
    • 実行時にカルチャを切り替える - すべてのローカライズされた要素を自動的に更新する
    • Visual Studio で維持できる既存のリソース ファイル構造 (*.resx ファイル) を使用する
    • ローカライズされた要素のデザイン時のサポートを Expression Blend (およびできれば他の XAML デザイン アプリケーション) で機能させ続ける
于 2013-07-08T18:28:59.037 に答える
0

独自の機能である必要はありません (そうである可能性はありますが)。次の点を考慮してください。

    private void ChangeCulture(string cultureKey)
    {
        try
        {
            System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureKey);
        }
        catch (Exception err)
        {
            // That culture probably doesn't exist
        }
    }

    private void ButtonA_Click(object sender, EventArgs args)
    {
        ChangeCulture("en-US");
    }

    private void ButtonB_Click(object sender, EventArgs args)
    {
        ChangeCulture("de-DE");
    }

編集:

別の投稿でこれを見つけ、+100 報奨金が授与されたので、これは素晴らしい解決策だと思います。見てみな。

于 2013-07-08T18:30:32.893 に答える