4

私は WPF ウィンドウを翻訳中です。私はWPF Localize Extensionを使用しています。これまでのところ、ファイルにはテスト目的のスペイン語翻訳しかありません<Resource>.es.resx。設計時に翻訳が機能します。だから私は正しい軌道に乗っていると思います。

実行時に GUI を動的に変換するためのメニュー項目を含めました。最初に、この(素朴な)コマンドを試しました...

public class CmdTranslateUI : ICommand
{
    bool ICommand.CanExecute(object parameter)
    {
        // TODO: Query available translations
        return true;
    }

    public event EventHandler CanExecuteChanged;

    void ICommand.Execute(object parameter)
    {
        LocalizeDictionary.Instance.Culture = new CultureInfo(
            (string) parameter);
    }
}

...そして、各言語のメニュー項目は、この方法で XAML にバインドされます。

<MenuItem Header="Español" CommandParameter="es-ES">
    <MenuItem.Command>
        <l:CmdTranslateUI />
    </MenuItem.Command>
</MenuItem>

事実、そのようなアプローチは機能していません。Culture info は"en-US"とにかく に設定されたままです。LocalizeDictionary.Instance.Culture設定するとトリガーされると読んだDictionaryEventので、これによりGUIが自動的に更新されると思いました。明らかに私は間違っています。

一方、現在のスレッドの文化もライブラリの動作に影響を与えないようです。

だから私は尋ねます...

Q:

  • WPF Localize Extensionを使用して実行時にウィンドウを変換するための推奨されるアプローチは何ですか?
  • 利用可能な翻訳を一覧表示するにはどうすればよいですか?

前もって感謝します 。

4

3 に答える 3

5

前回ライブラリをコンパイルしたときに誤ってタイプミスをしたようです (または、HDD / CPU にゴーストがありました)。設定後、言語切り替えが機能するようになりましたLocalizeDictionary.Instance.SetCurrentThreadCulture

記録のために、これは上記のコマンドクラスがどのように見えるべきかです

public class CmdTranslateUI : ICommand
{
    bool ICommand.CanExecute(object parameter)
    {
        CultureInfo ci = new CultureInfo((string)parameter);

        foreach (CultureInfo c in ResxLocalizationProvider.Instance.AvailableCultures)
        {
            if (ci.Name == c.Name)
                return true;
            else if (ci.Parent.Name == c.Name)
                return true;
        }
        return false;
    }

    public event EventHandler CanExecuteChanged;

    void ICommand.Execute(object parameter)
    {
        LocalizeDictionary.Instance.SetCurrentThreadCulture = true;
        LocalizeDictionary.Instance.Culture = new CultureInfo(
            (string) parameter);
    }
}

... 少なくとも、リソース ファイル l10n プロバイダーがアクティブである限り機能する単純なアプローチです。

于 2013-02-04T07:37:45.393 に答える
1

のプロパティは、スレッド UI カルチャから独立していますLocalizeExtensionCultureスレッドの文化は多くのことに影響するため、これが望ましい場合もあります。私たちは独自のプロジェクトで拡張機能を使用しており、スレッドのカルチャを手動で設定してLocalizeDictionaryのカルチャに一致させています。

通常、これにより UI が自動的に更新されます。LocTextXAML でマークアップ拡張機能を使用していることを確認してください。

<TextBlock Text="{lex:LocText Bla:Bla:Bla}" />

更新: 利用可能な翻訳のリストを取得するには、これを試してください:

.resx ファイル グループから利用可能なすべてのカルチャを取得する

ただし、コードで言語の修正リストを提供するか、IoC コンテナーを使用している場合は、そこに使用可能な言語を登録することをお勧めします。

于 2013-02-03T02:07:28.563 に答える