1

私はWinFormプロジェクトを持っています。文字列拡張メソッド「Translate」を使用して、翻訳ファイルを介してメッセージを翻訳します。

translatedString = myString.Translate()

そのプロジェクトでは、いくつかの WPF コントロールを使用します。

WPF XAML コントロールにこのようなものがあります。

<MenuItem Name="tsmiCopier"
      Header="Copier"
      Command="Copy">

「ヘッダー」のテキストを翻訳する必要があります。そのため、その関数を介してすべての「翻訳可能な」XAML 文字列を渡す必要がありTranslate()ます。

言い換えれば、私はする必要があります
tsmiCopier.Header = tsmiCopier.Header.Translate()が、すべてのメニューアイテムに対して. また、MenuItems だけでなく、XAML のその他の "ヘッダー" についても、ユーザーは GUI で確認できます。

それをより良くする方法は?

おそらく、WPF の変換には他のメカニズムが存在しますが、アプリケーションの残りの部分のために、独自の Translate() メソッドを使用せざるを得ません。

4

2 に答える 2

2

私は、WPF アプリケーションをローカライズする必要がないことを開示して、これに答えています。

役立つ可能性のあるいくつかのオプションを次に示します。

  1. WPF Localization Extensionを見てください。

  2. メソッドを使用する必要がある場合はTranslate()、コンバーターを作成できます。値を変換するには、直接バインドするか、Binding 式をバイパスするパラメーターを使用する方法がいくつかあります。

XAML

<Window x:Class="so.Localization.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Localization="clr-namespace:so.Localization" Title="Tranlate"
        Width="525"
        Height="350"
        WindowStartupLocation="CenterScreen">
    <Window.Resources>
        <Localization:TranslateConverter x:Key="Translater" />
    </Window.Resources>
    <Grid>
        <Menu>
            <MenuItem Header="{Binding Converter={StaticResource Translater}, ConverterParameter='Copier', FallbackValue='Copier'}" />
        </Menu>
    </Grid>
</Window>

コードビハインド

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace so.Localization
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }

    [ValueConversion( typeof( string ), typeof( string ) )]
    public class TranslateConverter : IValueConverter
    {
        #region Implementation of IValueConverter

        public object Convert( object value, Type targetType, object parameter, CultureInfo culture )
        {
            // if using binding
            if( value != null && value is string )
            {
                return ( (string)value ).TranslateBinding();
            }

            // if using a general paramater
            if( parameter != null && parameter is string )
            {
                return ( (string)parameter ).TranslateParameter();
            }

            return DependencyProperty.UnsetValue;
        }

        public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
        {
            throw new NotImplementedException();
        }

        #endregion
    }

    public static class Ext
    {
        public static string TranslateBinding( this string input )
        {
            // translat to whatever...
            return input + " (translated binding)";
        }

        public static string TranslateParameter( this string input )
        {
            // translat to whatever...
            return input + " (translated parameter)";
        }
    }
}
于 2013-02-04T18:24:31.190 に答える
0

a)

  Public Sub TranslateHeaderedItemsLogical(ByVal myFrameworkElement As FrameworkElement)
    For Each element In LogicalTreeHelper.GetChildren(myFrameworkElement)
      If TypeOf element Is HeaderedItemsControl Then
        Dim objHeaderedVisual As HeaderedItemsControl = DirectCast(element, HeaderedItemsControl)
        If (objHeaderedVisual.Header IsNot Nothing) Then
          objHeaderedVisual.Header = objHeaderedVisual.Header.ToString().Translate()
        End If
      End If
    Next element
  End Sub

b)

  Private Sub MyWPFControl_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    TranslateHeaderedItemsLogical(Me.ContextMenu)
  End Sub
于 2013-02-05T08:54:58.173 に答える