1

我有一个 WinForm 项目。我们使用字符串扩展方法“翻译”通过翻译文件翻译我们的消息。

translatedString = myString.Translate()

在那个项目中,我们使用了一些 WPF 控件。

我在 WPF XAML 控件中有类似的东西。

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

我需要翻译“标题”中的文本。所以我需要通过该Translate()函数传递所有“可翻译”的 XAML 字符串。

换句话说,我需要做
tsmiCopier.Header = tsmiCopier.Header.Translate(),但对于所有的 menuItems。也许不仅是 MenuItems,还有 XAML 中的其他“标题”,用户可以在 GUI 中看到。

如何做得更好?

也许 WPF 翻译还有其他机制,但由于应用程序的其余部分,我们被迫使用独特的 Translate() 方法。

4

2 回答 2

2

我通过披露不必本地化 WPF 应用程序来回答这个问题。

以下是一些可能有帮助的选项:

  1. 看看WPF 本地化扩展

  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

一个)

  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 回答