feat: implement locale switch.
This commit is contained in:
parent
6459a8be1b
commit
82f284b5fa
@ -1,9 +1,10 @@
|
|||||||
<Application
|
<Application
|
||||||
x:Class="Semi.Avalonia.Demo.App"
|
x:Class="Semi.Avalonia.Demo.App"
|
||||||
xmlns="https://github.com/avaloniaui"
|
xmlns="https://github.com/avaloniaui"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:semi="https://irihi.tech/semi">
|
||||||
<Application.Styles>
|
<Application.Styles>
|
||||||
<StyleInclude Source="avares://Semi.Avalonia/Themes/Index.axaml" />
|
<semi:SemiTheme Locale="zh-CN"/>
|
||||||
<StyleInclude Source="avares://Semi.Avalonia.DataGrid/Index.axaml" />
|
<StyleInclude Source="avares://Semi.Avalonia.DataGrid/Index.axaml" />
|
||||||
<StyleInclude Source="avares://Semi.Avalonia.ColorPicker/Index.axaml" />
|
<StyleInclude Source="avares://Semi.Avalonia.ColorPicker/Index.axaml" />
|
||||||
</Application.Styles>
|
</Application.Styles>
|
||||||
|
4
src/Semi.Avalonia/AssemblyInfo.cs
Normal file
4
src/Semi.Avalonia/AssemblyInfo.cs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
using Avalonia.Metadata;
|
||||||
|
|
||||||
|
[assembly:XmlnsPrefix("https://irihi.tech/semi", "semi")]
|
||||||
|
[assembly:XmlnsDefinition("https://irihi.tech/semi", "Semi.Avalonia")]
|
@ -80,11 +80,11 @@
|
|||||||
<TextBox
|
<TextBox
|
||||||
IsVisible="{Binding !SelectingFolder}"
|
IsVisible="{Binding !SelectingFolder}"
|
||||||
Text="{Binding FileName}"
|
Text="{Binding FileName}"
|
||||||
Watermark="File name" />
|
Watermark="{DynamicResource STRING_CHOOSER_FILE_NAME}" />
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
<CheckBox
|
<CheckBox
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Content="Show hidden files"
|
Content="{DynamicResource STRING_CHOOSER_SHOW_HIDDEN_FILES}"
|
||||||
DockPanel.Dock="Left"
|
DockPanel.Dock="Left"
|
||||||
IsChecked="{Binding ShowHiddenFiles}" />
|
IsChecked="{Binding ShowHiddenFiles}" />
|
||||||
<UniformGrid
|
<UniformGrid
|
||||||
@ -94,15 +94,13 @@
|
|||||||
<Button
|
<Button
|
||||||
Margin="8,0,0,0"
|
Margin="8,0,0,0"
|
||||||
Classes="Primary"
|
Classes="Primary"
|
||||||
Command="{Binding Ok}">
|
Command="{Binding Ok}"
|
||||||
OK
|
Content="{DynamicResource STRING_CHOOSER_DIALOG_OK}" />
|
||||||
</Button>
|
|
||||||
<Button
|
<Button
|
||||||
Margin="8,0,0,0"
|
Margin="8,0,0,0"
|
||||||
Classes="Danger"
|
Classes="Danger"
|
||||||
Command="{Binding Cancel}">
|
Command="{Binding Cancel}"
|
||||||
Cancel
|
Content="{DynamicResource STRING_CHOOSER_DIALOG_CANCEL}" />
|
||||||
</Button>
|
|
||||||
</UniformGrid>
|
</UniformGrid>
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
<Border
|
<Border
|
||||||
|
7
src/Semi.Avalonia/Locale/en-us.axaml
Normal file
7
src/Semi.Avalonia/Locale/en-us.axaml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<ResourceDictionary xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||||
|
<x:String x:Key="STRING_CHOOSER_FILE_NAME">File name</x:String>
|
||||||
|
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">Show hidden flies</x:String>
|
||||||
|
<x:String x:Key="STRING_CHOOSER_DIALOG_OK">OK</x:String>
|
||||||
|
<x:String x:Key="STRING_CHOOSER_DIALOG_CANCEL">Cancel</x:String>
|
||||||
|
</ResourceDictionary>
|
7
src/Semi.Avalonia/Locale/zh-cn.axaml
Normal file
7
src/Semi.Avalonia/Locale/zh-cn.axaml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<ResourceDictionary xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||||
|
<x:String x:Key="STRING_CHOOSER_FILE_NAME">文件名</x:String>
|
||||||
|
<x:String x:Key="STRING_CHOOSER_SHOW_HIDDEN_FILES">显示隐藏文件</x:String>
|
||||||
|
<x:String x:Key="STRING_CHOOSER_DIALOG_OK">确认</x:String>
|
||||||
|
<x:String x:Key="STRING_CHOOSER_DIALOG_CANCEL">取消</x:String>
|
||||||
|
</ResourceDictionary>
|
@ -1,4 +1,4 @@
|
|||||||
<Styles xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
<Styles x:Class="Semi.Avalonia.SemiTheme" xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||||
<Styles.Resources>
|
<Styles.Resources>
|
||||||
<ResourceDictionary>
|
<ResourceDictionary>
|
||||||
<ResourceDictionary.ThemeDictionaries>
|
<ResourceDictionary.ThemeDictionaries>
|
||||||
@ -9,6 +9,7 @@
|
|||||||
<ResourceInclude Source="avares://Semi.Avalonia/Controls/_index.axaml" />
|
<ResourceInclude Source="avares://Semi.Avalonia/Controls/_index.axaml" />
|
||||||
<ResourceInclude Source="avares://Semi.Avalonia/Themes/Base.axaml" />
|
<ResourceInclude Source="avares://Semi.Avalonia/Themes/Base.axaml" />
|
||||||
<ResourceInclude Source="avares://Semi.Avalonia/Themes/Shared/_index.axaml" />
|
<ResourceInclude Source="avares://Semi.Avalonia/Themes/Shared/_index.axaml" />
|
||||||
|
<ResourceInclude Source="avares://Semi.Avalonia/Locale/zh-cn.axaml" />
|
||||||
</ResourceDictionary.MergedDictionaries>
|
</ResourceDictionary.MergedDictionaries>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
</Styles.Resources>
|
</Styles.Resources>
|
||||||
|
55
src/Semi.Avalonia/Themes/Index.axaml.cs
Normal file
55
src/Semi.Avalonia/Themes/Index.axaml.cs
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Markup.Xaml;
|
||||||
|
using Avalonia.Styling;
|
||||||
|
|
||||||
|
namespace Semi.Avalonia;
|
||||||
|
|
||||||
|
public class SemiTheme: Styles
|
||||||
|
{
|
||||||
|
private static readonly Dictionary<CultureInfo, string> _localeToResource = new()
|
||||||
|
{
|
||||||
|
{ new CultureInfo("zh-CN"), "avares://Semi.Avalonia/Locale/zh-CN.axaml" },
|
||||||
|
{ new CultureInfo("en-US"), "avares://Semi.Avalonia/Locale/en-US.axaml" },
|
||||||
|
};
|
||||||
|
|
||||||
|
private readonly IServiceProvider? sp;
|
||||||
|
public SemiTheme(IServiceProvider? provider = null)
|
||||||
|
{
|
||||||
|
sp = provider;
|
||||||
|
AvaloniaXamlLoader.Load(provider, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private CultureInfo? _locale;
|
||||||
|
public CultureInfo? Locale
|
||||||
|
{
|
||||||
|
get => _locale;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_locale = value;
|
||||||
|
var resource = TryGetLocaleResource(value);
|
||||||
|
var d = AvaloniaXamlLoader.Load(sp, new Uri(resource)) as ResourceDictionary;
|
||||||
|
if (d is null) return;
|
||||||
|
foreach (var kv in d)
|
||||||
|
{
|
||||||
|
this.Resources.Add(kv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string TryGetLocaleResource(CultureInfo? locale)
|
||||||
|
{
|
||||||
|
if (locale is null)
|
||||||
|
{
|
||||||
|
return _localeToResource[new CultureInfo("zh-CN")];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_localeToResource.TryGetValue(locale, out var resource))
|
||||||
|
{
|
||||||
|
return resource;
|
||||||
|
}
|
||||||
|
return _localeToResource[new CultureInfo("zh-CN")];
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user