WPF国际化
环境:
VisualStudio2022
ResXManager 1.84.6269.0
实现方法
step1:安装VisualStudio扩展工具 - ResXManager
step2:创建资源文件
step3:设置访问级别
step4:打开 ResXManager
step5:设置/添加语言
step6:添加语言管理类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| public class LanguageManager : INotifyPropertyChanged { private readonly ResourceManager _resourceManager;
private static readonly Lazy<LanguageManager> _lazy = new Lazy<LanguageManager>(() => new LanguageManager()); public static LanguageManager Instance => _lazy.Value; public event PropertyChangedEventHandler PropertyChanged;
public LanguageManager() { _resourceManager = new ResourceManager("WpfAppZBC.Resources.lang", typeof(LanguageManager).Assembly); }
public string this[string name] { get { if (name == null) { throw new ArgumentNullException(nameof(name)); } return _resourceManager.GetString(name); } }
public void ChangeLanguage(CultureInfo cultureInfo) { CultureInfo.CurrentCulture = cultureInfo; CultureInfo.CurrentUICulture = cultureInfo; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("item[]")); } }
|
step7:在xaml中引用资源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| <Window x:Class="WpfAppZBC.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfAppZBC" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="{Binding [mainWindow], Source={x:Static local:LanguageManager.Instance}}" Width="800" Height="450" mc:Ignorable="d"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="auto" /> <RowDefinition /> </Grid.RowDefinitions> <Menu> <MenuItem Header="{Binding [file], Source={x:Static local:LanguageManager.Instance}}"> <MenuItem Header="{Binding [open], Source={x:Static local:LanguageManager.Instance}}" /> <MenuItem Header="{Binding [save], Source={x:Static local:LanguageManager.Instance}}" /> <MenuItem Header="{Binding [saveAs], Source={x:Static local:LanguageManager.Instance}}" /> <MenuItem Header="{Binding [exit], Source={x:Static local:LanguageManager.Instance}}" /> </MenuItem> <MenuItem Header="{Binding [edit], Source={x:Static local:LanguageManager.Instance}}"> <MenuItem Header="{Binding [cut], Source={x:Static local:LanguageManager.Instance}}" /> <MenuItem Header="{Binding [copy], Source={x:Static local:LanguageManager.Instance}}" /> <MenuItem Header="{Binding [paste], Source={x:Static local:LanguageManager.Instance}}" /> <MenuItem Header="{Binding [delete], Source={x:Static local:LanguageManager.Instance}}" /> </MenuItem> <MenuItem Header="{Binding [system], Source={x:Static local:LanguageManager.Instance}}"> <MenuItem Header="{Binding [internationalization], Source={x:Static local:LanguageManager.Instance}}"> <MenuItem x:Name="menuItemZHCN" Click="menuItemZHCN_Click" Header="中文简体" /> <MenuItem x:Name="menuItemZHHANT" Click="menuItemZHHANT_Click" Header="中文繁体" /> <MenuItem x:Name="menuItemEN" Click="menuItemEN_Click" Header="English" /> </MenuItem> </MenuItem> </Menu> <TextBlock Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="65" Text="{Binding [contentText], Source={x:Static local:LanguageManager.Instance}}" /> </Grid> </Window>
|
step8:语言切换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); }
private void menuItemZHCN_Click(object sender, RoutedEventArgs e) { LanguageManager.Instance.ChangeLanguage(new CultureInfo("zh-CN")); }
private void menuItemZHHANT_Click(object sender, RoutedEventArgs e) { LanguageManager.Instance.ChangeLanguage(new CultureInfo("zh-Hant")); }
private void menuItemEN_Click(object sender, RoutedEventArgs e) { LanguageManager.Instance.ChangeLanguage(new CultureInfo("en")); } }
|
源码仓库
WineMonk/ResXManagerStudy: WPF国际化 (github.com)