王占山,济南优化网站厂家,邮箱登录,g3云推广官网目录
一、多语言切换#xff08;需重启#xff09;
1、配置文件添加Key
2、新增附加属性当前选择语言
3、创建资源文件 4、初始化多语言集合
5、切换多语言并更新配置文件
6、应用程序启动根据配置切换多语言 7、使用
二、多语言切换#xff08;无需重启#xff09;…目录
一、多语言切换需重启
1、配置文件添加Key
2、新增附加属性当前选择语言
3、创建资源文件 4、初始化多语言集合
5、切换多语言并更新配置文件
6、应用程序启动根据配置切换多语言 7、使用
二、多语言切换无需重启
1、创建多语言标记扩展基类
2、添加资源转换器
3、创建资源文件
4、继承基类创建指定资源文件扩展
5、添加资源文件管理
6、切换语言
7、使用
8、后台使用多语言
①获取多语言资源字符串
②后台绑定 一、多语言切换需重启
1、配置文件添加Key appSettingsadd keylanguage valuezh-CN//appSettings
2、新增附加属性当前选择语言 public CultureInfo SelectLanguage{get (CultureInfo)GetValue(SelectLanguageProperty);set SetValue(SelectLanguageProperty, value);}public static readonly DependencyProperty SelectLanguageProperty DependencyProperty.Register(SelectLanguage, typeof(CultureInfo), typeof(MainWindow));
3、创建资源文件 4、初始化多语言集合 public ObservableCollectionCultureInfo CultureInfos { get; private set; } new ObservableCollectionCultureInfo();private void Window_Loaded(object sender, RoutedEventArgs e){var dir Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);var curs CultureInfo.GetCultures(CultureTypes.AllCultures);foreach (CultureInfo cur in curs){if (string.IsNullOrWhiteSpace(cur.Name)) continue;string landir Path.Combine(dir, cur.Name);if (Directory.Exists(landir)) CultureInfos.Add(cur);}if (CultureInfos.Any(cur cur.Name.Equals(zh-CN, StringComparison.OrdinalIgnoreCase)) is false){var cur curs.FirstOrDefault(c c.Name.Equals(zh-CN, StringComparison.OrdinalIgnoreCase));if (cur ! null) CultureInfos.Add(cur);}SelectLanguage Thread.CurrentThread.CurrentCulture;}
5、切换多语言并更新配置文件 protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e){base.OnPropertyChanged(e);if (e.Property SelectLanguageProperty){if (SelectLanguage Thread.CurrentThread.CurrentCulture) return;Configuration config ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);if (ConfigurationManager.AppSettings[language] is null)config.AppSettings.Settings.Add(language, SelectLanguage.Name);elseconfig.AppSettings.Settings[language].Value SelectLanguage.Name;config.Save();ConfigurationManager.RefreshSection(appSettings);}}
6、应用程序启动根据配置切换多语言 /// summary/// App.xaml 的交互逻辑/// /summarypublic partial class App : Application{protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);var lan ConfigurationManager.AppSettings[language];if (!string.IsNullOrWhiteSpace(lan)){CultureInfo culture new CultureInfo(lan);Thread.CurrentThread.CurrentCulture culture;Thread.CurrentThread.CurrentUICulture culture;}}} 7、使用
①映射命名空间
xmlns:rsclr-namespace:WpfApp8.Resources
②示例 GridGroupBox x:NamegboxGridButton Width100Height80BackgroundLightGrayContent{x:Static rs:SRS.TestLan} /ComboBox Width150Height50HorizontalAlignmentLeftVerticalContentAlignmentCenterDisplayMemberPathNativeNameItemsSource{Binding PathCultureInfos, ElementNameMW}SelectedItem{Binding PathSelectLanguage, ElementNameMW} //Grid/GroupBox/Grid 二、多语言切换无需重启
安装Nuget包WpfExtensions.Xaml
1、创建多语言标记扩展基类 /// summary/// 多语言绑定扩展基类 /// /summary/// typeparam nameT多语言文件资源类/typeparam[MarkupExtensionReturnType(typeof(object))]public class LanguageExtensionBaseT : MarkupExtension where T : class{private static readonly ResourceConverter ResourceConverter new ResourceConverter();[ConstructorArgument(Key)]public ComponentResourceKey Key { get; set; }public LanguageExtensionBase(string key){Key new ComponentResourceKey(typeof(T), key);}public override object ProvideValue(IServiceProvider serviceProvider){if (Key null){throw new NullReferenceException(Key cannot be null at the same time.);}IProvideValueTarget provideValueTarget serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;if (provideValueTarget null){throw new ArgumentException(The serviceProvider must implement IProvideValueTarget interface.);}if (provideValueTarget.TargetObject?.GetType().FullName System.Windows.SharedDp){return this;}return new Binding(Value){Source new I18nSource(Key, provideValueTarget.TargetObject),Mode BindingMode.OneWay,Converter ResourceConverter}.ProvideValue(serviceProvider);}}
2、添加资源转换器 /// summary/// 资源转换器/// /summarypublic class ResourceConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){Bitmap val (Bitmap)((value is Bitmap) ? value : null);if (val null){Icon val2 (Icon)((value is Icon) ? value : null);if (val2 ! null){return ToBitmapSource(val2.ToBitmap());}return value;}return ToBitmapSource(val);}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}[DllImport(gdi32)]private static extern int DeleteObject(IntPtr o);public ImageSource ToBitmapSource(Bitmap bitmap){IntPtr ptr bitmap.GetHbitmap(); //obtain the HbitmapBitmapSource bitmapSource Imaging.CreateBitmapSourceFromHBitmap(ptr, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());DeleteObject(ptr); //release the HBitmapreturn bitmapSource;}}
3、创建资源文件 4、继承基类创建指定资源文件扩展 /// summary/// 多语言绑定扩展/// /summary[MarkupExtensionReturnType(typeof(object))]internal class LanguageExtension : LanguageExtensionBaseDefaultLanguage{public LanguageExtension(string key) : base(key){}}
5、添加资源文件管理
try
{I18nManager.Instance.Add(Resource.ResourceManager);
}
catch (ArgumentException)
{
}
6、切换语言
var culture new CultureInfo(en-US);
I18nManager.Instance.CurrentUICulture culture;
System.Threading.Thread.CurrentThread.CurrentCulture culture;
7、使用
①映射命名空间到XAML
xmlns:Lanclr-namespace:SqlSugarTest.Lan ②资源文件中添加多语言资源 ③示例 GroupBox Header多语言测试Menu HeightNaN HorizontalAlignmentCenterVerticalAlignmentCenterBackground{x:Null}FontSize12 FontWeightBoldMenuItem Margin3 Padding10,8HorizontalAlignmentCenterHorizontalContentAlignmentCenterHeader{Lan:Language MultiLanguage}MenuItem Margin3 Padding10,5ClickMenuItem_Click_CN HeaderCN-中 /MenuItem Margin3 Padding10,5ClickButton_Click_EN HeaderUS-英 /MenuItem Margin3 Padding10,5HeaderTestMenuItem Margin3 Padding10,5Header111 /MenuItem Margin3 Padding10,5Header222 //MenuItem/MenuItem/Menu/GroupBox
8、后台使用多语言
①获取多语言资源字符串 /// summary/// 获取Key资源/// /summary/// param namekey/param/// param nameresource/param/// returns/returnspublic static string GetString(string key, ResourceManager resource null){if (resource null)return DefaultLanguage.ResourceManager.GetString(key, I18nManager.Instance.CurrentUICulture);elsereturn resource.GetString(key, I18nManager.Instance.CurrentUICulture);}
MessageBox.Show(GetString(nameof(DefaultLanguage.Test))); ②后台绑定 static readonly ResourceConverter converter new ResourceConverter();/// summary/// 按自定义数据绑定多语言/// /summary/// typeparam nameT自定义数据源/typeparam/// param namekey数据关键字/param/// returns/returnspublic static BindingBase GetBindingT(string key, object element null){var Key new ComponentResourceKey(typeof(T), key);return new Binding(Value){Source new I18nSource(Key, element),Mode BindingMode.OneWay,Converter converter};} menu_Test.SetBinding(MenuItem.HeaderProperty, GetBindingDefaultLanguage(nameof(DefaultLanguage.Test)));