Chinese language treatment for WinUI bug.

This commit is contained in:
Burak Kaan Köse
2026-04-18 01:39:25 +02:00
parent 9e735c911c
commit 3caecc5a9c
16 changed files with 93 additions and 59 deletions
@@ -60,7 +60,7 @@ public partial class CalendarItemCommandBarFlyout : CommandBarFlyout
if (menuItem.HasChildren) if (menuItem.HasChildren)
{ {
var flyout = new MenuFlyout(); var flyout = new WinoMenuFlyout();
PopulateMenuFlyoutItems(flyout.Items, menuItem.Children); PopulateMenuFlyoutItems(flyout.Items, menuItem.Children);
button.Flyout = flyout; button.Flyout = flyout;
} }
@@ -0,0 +1,23 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml.Controls;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
namespace Wino.Mail.WinUI.Controls;
internal static class MenuFlyoutLanguageHelper
{
private const string ChineseLanguageTag = "zh-CN";
public static void Apply(MenuFlyoutItemBase item)
{
if (WinoApplication.Current.Services.GetRequiredService<IPreferencesService>().CurrentLanguage == AppLanguage.Chinese)
{
item.Language = ChineseLanguageTag;
}
else
{
item.ClearValue(MenuFlyoutItemBase.LanguageProperty);
}
}
}
@@ -0,0 +1,32 @@
using Microsoft.UI.Xaml.Controls;
namespace Wino.Mail.WinUI.Controls;
public partial class WinoMenuFlyout : MenuFlyout
{
public WinoMenuFlyout()
{
Opening += OnOpening;
}
private void OnOpening(object? sender, object e)
{
foreach (var item in Items)
{
ApplyLanguage(item);
}
}
private static void ApplyLanguage(MenuFlyoutItemBase item)
{
MenuFlyoutLanguageHelper.Apply(item);
if (item is MenuFlyoutSubItem subItem)
{
foreach (var childItem in subItem.Items)
{
ApplyLanguage(childItem);
}
}
}
}
@@ -9,7 +9,7 @@ using Wino.Helpers;
namespace Wino.MenuFlyouts; namespace Wino.MenuFlyouts;
public partial class AccountSelectorFlyout : MenuFlyout, IDisposable public partial class AccountSelectorFlyout : WinoMenuFlyout, IDisposable
{ {
private readonly IEnumerable<MailAccount> _accounts; private readonly IEnumerable<MailAccount> _accounts;
private readonly Func<MailAccount, Task> _onItemSelection; private readonly Func<MailAccount, Task> _onItemSelection;
@@ -9,7 +9,7 @@ using Wino.Helpers;
namespace Wino.MenuFlyouts; namespace Wino.MenuFlyouts;
public partial class FilterMenuFlyout : MenuFlyout public partial class FilterMenuFlyout : WinoMenuFlyout
{ {
public static readonly DependencyProperty SelectedFilterChangedCommandProperty = DependencyProperty.Register(nameof(SelectedFilterChangedCommand), typeof(IRelayCommand<FilterOption>), typeof(FilterMenuFlyout), new PropertyMetadata(null)); public static readonly DependencyProperty SelectedFilterChangedCommandProperty = DependencyProperty.Register(nameof(SelectedFilterChangedCommand), typeof(IRelayCommand<FilterOption>), typeof(FilterMenuFlyout), new PropertyMetadata(null));
public static readonly DependencyProperty FilterOptionsProperty = DependencyProperty.Register(nameof(FilterOptions), typeof(List<FilterOption>), typeof(FilterMenuFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnOptionsChanged))); public static readonly DependencyProperty FilterOptionsProperty = DependencyProperty.Register(nameof(FilterOptions), typeof(List<FilterOption>), typeof(FilterMenuFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnOptionsChanged)));
@@ -1,27 +0,0 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.UI.Xaml.Controls;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.Menus;
namespace Wino.MenuFlyouts.Context;
public partial class MailOperationFlyout : WinoOperationFlyout<MailOperationMenuItem>
{
public MailOperationFlyout(IEnumerable<MailOperationMenuItem> availableActions, TaskCompletionSource<MailOperationMenuItem> completionSource) : base(availableActions, completionSource)
{
if (AvailableActions == null) return;
foreach (var action in AvailableActions)
{
if (action.Operation == MailOperation.Seperator)
Items.Add(new MenuFlyoutSeparator());
else
{
var menuFlyoutItem = new MailOperationMenuFlyoutItem(action, (c) => MenuItemClicked(c));
Items.Add(menuFlyoutItem);
}
}
}
}
@@ -5,6 +5,7 @@ using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;
using Windows.Foundation; using Windows.Foundation;
using Wino.Core.Domain.Entities.Mail; using Wino.Core.Domain.Entities.Mail;
using Wino.Mail.WinUI.Controls;
namespace Wino.MenuFlyouts; namespace Wino.MenuFlyouts;
@@ -13,7 +14,7 @@ public class MoveButtonMenuItemClickedEventArgs
public Guid ClickedFolderId { get; set; } public Guid ClickedFolderId { get; set; }
} }
public partial class MoveButtonFlyout : MenuFlyout public partial class MoveButtonFlyout : WinoMenuFlyout
{ {
public event TypedEventHandler<MoveButtonFlyout, MoveButtonMenuItemClickedEventArgs> MenuItemClick = delegate { }; public event TypedEventHandler<MoveButtonFlyout, MoveButtonMenuItemClickedEventArgs> MenuItemClick = delegate { };
public static readonly DependencyProperty FoldersProperty = DependencyProperty.Register(nameof(Folders), typeof(List<MailItemFolder>), typeof(MoveButtonFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnFoldersChanged))); public static readonly DependencyProperty FoldersProperty = DependencyProperty.Register(nameof(Folders), typeof(List<MailItemFolder>), typeof(MoveButtonFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnFoldersChanged)));
@@ -30,8 +31,6 @@ public partial class MoveButtonFlyout : MenuFlyout
{ {
menu.InitializeMenu(); menu.InitializeMenu();
} }
} }
private void InitializeMenu() private void InitializeMenu()
@@ -1,11 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.UI.Xaml.Controls; using Wino.Mail.WinUI.Controls;
namespace Wino.MenuFlyouts; namespace Wino.MenuFlyouts;
public partial class WinoOperationFlyout<TActionType> : MenuFlyout, IDisposable where TActionType : class public partial class WinoOperationFlyout<TActionType> : WinoMenuFlyout, IDisposable where TActionType : class
{ {
public TActionType ClickedOperation { get; set; } = null!; public TActionType ClickedOperation { get; set; } = null!;
@@ -3,8 +3,8 @@ using Microsoft.UI.Xaml.Controls;
using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Folders; using Wino.Core.Domain.Models.Folders;
using Wino.Core.Domain.Models.Menus; using Wino.Core.Domain.Models.Menus;
using Wino.Mail.WinUI.Controls;
using Wino.Helpers; using Wino.Helpers;
using Wino.Mail.WinUI.Controls;
namespace Wino.MenuFlyouts; namespace Wino.MenuFlyouts;
@@ -18,6 +18,8 @@ public partial class WinoOperationFlyoutItem<TOperationMenuItem> : MenuFlyoutIte
Operation = operationMenuItem; Operation = operationMenuItem;
IsEnabled = operationMenuItem.IsEnabled; IsEnabled = operationMenuItem.IsEnabled;
MenuFlyoutLanguageHelper.Apply(this);
if (Operation is FolderOperationMenuItem folderOperationMenuItem) if (Operation is FolderOperationMenuItem folderOperationMenuItem)
{ {
var internalOperation = folderOperationMenuItem.Operation; var internalOperation = folderOperationMenuItem.Operation;
@@ -535,7 +535,7 @@
<ToolTip Content="{x:Bind FileName}" /> <ToolTip Content="{x:Bind FileName}" />
</ToolTipService.ToolTip> </ToolTipService.ToolTip>
<Grid.ContextFlyout> <Grid.ContextFlyout>
<MenuFlyout Placement="Right"> <coreControls:WinoMenuFlyout Placement="Right">
<MenuFlyoutItem <MenuFlyoutItem
Click="OpenCalendarAttachment_Click" Click="OpenCalendarAttachment_Click"
CommandParameter="{x:Bind}" CommandParameter="{x:Bind}"
@@ -552,7 +552,7 @@
<PathIcon Data="{StaticResource SaveAttachmentPathIcon}" /> <PathIcon Data="{StaticResource SaveAttachmentPathIcon}" />
</MenuFlyoutItem.Icon> </MenuFlyoutItem.Icon>
</MenuFlyoutItem> </MenuFlyoutItem>
</MenuFlyout> </coreControls:WinoMenuFlyout>
</Grid.ContextFlyout> </Grid.ContextFlyout>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="40" /> <ColumnDefinition Width="40" />
+2 -2
View File
@@ -35,7 +35,7 @@
Background="Transparent" Background="Transparent"
ColumnSpacing="3"> ColumnSpacing="3">
<Grid.ContextFlyout> <Grid.ContextFlyout>
<MenuFlyout> <coreControls:WinoMenuFlyout>
<MenuFlyoutItem <MenuFlyoutItem
Click="OpenAttachment_Click" Click="OpenAttachment_Click"
CommandParameter="{x:Bind}" CommandParameter="{x:Bind}"
@@ -44,7 +44,7 @@
Click="SaveAttachment_Click" Click="SaveAttachment_Click"
CommandParameter="{x:Bind}" CommandParameter="{x:Bind}"
Text="{x:Bind domain:Translator.Buttons_Save}" /> Text="{x:Bind domain:Translator.Buttons_Save}" />
</MenuFlyout> </coreControls:WinoMenuFlyout>
</Grid.ContextFlyout> </Grid.ContextFlyout>
<ToolTipService.ToolTip> <ToolTipService.ToolTip>
<ToolTip Content="{x:Bind FileName}" /> <ToolTip Content="{x:Bind FileName}" />
@@ -27,6 +27,7 @@ using Wino.Core.Domain.Models.Navigation;
using Wino.Mail.ViewModels.Data; using Wino.Mail.ViewModels.Data;
using Wino.Mail.ViewModels.Messages; using Wino.Mail.ViewModels.Messages;
using Wino.Mail.WinUI; using Wino.Mail.WinUI;
using Wino.Mail.WinUI.Controls;
using Wino.Mail.WinUI.Controls.ListView; using Wino.Mail.WinUI.Controls.ListView;
using Wino.Mail.WinUI.Helpers; using Wino.Mail.WinUI.Helpers;
using Wino.Mail.WinUI.Interfaces; using Wino.Mail.WinUI.Interfaces;
@@ -318,7 +319,7 @@ public sealed partial class MailListPage : MailListPageAbstract,
double y) double y)
{ {
var source = new TaskCompletionSource<MailContextAction?>(); var source = new TaskCompletionSource<MailContextAction?>();
var flyout = new MenuFlyout(); var flyout = new WinoMenuFlyout();
foreach (var action in availableActions) foreach (var action in availableActions)
{ {
@@ -80,7 +80,7 @@
<ToolTip Content="{x:Bind FileName}" /> <ToolTip Content="{x:Bind FileName}" />
</ToolTipService.ToolTip> </ToolTipService.ToolTip>
<Grid.ContextFlyout> <Grid.ContextFlyout>
<MenuFlyout Placement="Right"> <coreControls:WinoMenuFlyout Placement="Right">
<MenuFlyoutItem <MenuFlyoutItem
Click="OpenAttachment_Click" Click="OpenAttachment_Click"
CommandParameter="{x:Bind}" CommandParameter="{x:Bind}"
@@ -97,7 +97,7 @@
<PathIcon Data="{StaticResource SaveAttachmentPathIcon}" /> <PathIcon Data="{StaticResource SaveAttachmentPathIcon}" />
</MenuFlyoutItem.Icon> </MenuFlyoutItem.Icon>
</MenuFlyoutItem> </MenuFlyoutItem>
</MenuFlyout> </coreControls:WinoMenuFlyout>
</Grid.ContextFlyout> </Grid.ContextFlyout>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="40" /> <ColumnDefinition Width="40" />
@@ -80,7 +80,12 @@
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}" BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
BorderThickness="1" BorderThickness="1"
CornerRadius="8"> CornerRadius="8">
<StackPanel Spacing="10"> <Grid RowSpacing="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackPanel Spacing="2"> <StackPanel Spacing="2">
<TextBlock FontWeight="SemiBold" Text="{x:Bind domain:Translator.AccountCreation_InitialSynchronization_Title}" /> <TextBlock FontWeight="SemiBold" Text="{x:Bind domain:Translator.AccountCreation_InitialSynchronization_Title}" />
<TextBlock <TextBlock
@@ -90,31 +95,29 @@
TextWrapping="WrapWholeWords" /> TextWrapping="WrapWholeWords" />
</StackPanel> </StackPanel>
<ListView <GridView
Grid.Row="1"
HorizontalAlignment="Center" HorizontalAlignment="Center"
HorizontalContentAlignment="Stretch"
ItemsSource="{x:Bind ViewModel.InitialSynchronizationRanges, Mode=OneWay}" ItemsSource="{x:Bind ViewModel.InitialSynchronizationRanges, Mode=OneWay}"
SelectedItem="{x:Bind ViewModel.SelectedInitialSynchronizationRange, Mode=TwoWay}"> SelectedItem="{x:Bind ViewModel.SelectedInitialSynchronizationRange, Mode=TwoWay}">
<ListView.ItemsPanel> <GridView.ItemTemplate>
<ItemsPanelTemplate>
<ItemsStackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate x:DataType="accounts:InitialSynchronizationRangeOption"> <DataTemplate x:DataType="accounts:InitialSynchronizationRangeOption">
<Grid Padding="12">
<TextBlock Text="{x:Bind DisplayText}" /> <TextBlock Text="{x:Bind DisplayText}" />
</Grid>
</DataTemplate> </DataTemplate>
</ListView.ItemTemplate> </GridView.ItemTemplate>
</ListView> </GridView>
<muxc:InfoBar <muxc:InfoBar
Title="{x:Bind domain:Translator.GeneralTitle_Warning}" Title="{x:Bind domain:Translator.GeneralTitle_Warning}"
Grid.Row="2"
Margin="0,2,0,0" Margin="0,2,0,0"
IsOpen="True" IsOpen="True"
Message="{x:Bind domain:Translator.AccountCreation_InitialSynchronization_EverythingWarning}" Message="{x:Bind domain:Translator.AccountCreation_InitialSynchronization_EverythingWarning}"
Severity="Warning" Severity="Warning"
Visibility="{x:Bind ViewModel.IsInitialSynchronizationWarningVisible, Mode=OneWay}" /> Visibility="{x:Bind ViewModel.IsInitialSynchronizationWarningVisible, Mode=OneWay}" />
</StackPanel> </Grid>
</Border> </Border>
<!-- Provider List --> <!-- Provider List -->
@@ -5,6 +5,7 @@
xmlns:abstract="using:Wino.Views.Abstract" xmlns:abstract="using:Wino.Views.Abstract"
xmlns:controls="using:CommunityToolkit.WinUI.Controls" xmlns:controls="using:CommunityToolkit.WinUI.Controls"
xmlns:controls1="using:Wino.Controls" xmlns:controls1="using:Wino.Controls"
xmlns:coreControls="using:Wino.Mail.WinUI.Controls"
xmlns:coreSelectors="using:Wino.Mail.WinUI.Selectors" xmlns:coreSelectors="using:Wino.Mail.WinUI.Selectors"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:data="using:Wino.Core.ViewModels.Data" xmlns:data="using:Wino.Core.ViewModels.Data"
@@ -56,7 +57,7 @@
CornerRadius="6" CornerRadius="6"
RowSpacing="0"> RowSpacing="0">
<Grid.ContextFlyout> <Grid.ContextFlyout>
<MenuFlyout Placement="BottomEdgeAlignedRight"> <coreControls:WinoMenuFlyout Placement="BottomEdgeAlignedRight">
<MenuFlyoutItem <MenuFlyoutItem
Command="{Binding ElementName=root, Path=ViewModel.DeleteCustomThemeCommand}" Command="{Binding ElementName=root, Path=ViewModel.DeleteCustomThemeCommand}"
CommandParameter="{x:Bind}" CommandParameter="{x:Bind}"
@@ -65,7 +66,7 @@
<SymbolIcon Symbol="Delete" /> <SymbolIcon Symbol="Delete" />
</MenuFlyoutItem.Icon> </MenuFlyoutItem.Icon>
</MenuFlyoutItem> </MenuFlyoutItem>
</MenuFlyout> </coreControls:WinoMenuFlyout>
</Grid.ContextFlyout> </Grid.ContextFlyout>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="125" /> <RowDefinition Height="125" />
+1 -1
View File
@@ -534,7 +534,7 @@ public sealed partial class WinoAppShell : Views.Abstract.WinoAppShellAbstract,
args.Handled = true; args.Handled = true;
var flyout = new MenuFlyout(); var flyout = new WinoMenuFlyout();
var manageAccountSettingsItem = new MenuFlyoutItem var manageAccountSettingsItem = new MenuFlyoutItem
{ {