Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: 根据显示语言选择字体 #599

Merged
merged 2 commits into from
May 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/Magpie.App/ContentDialogHelper.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "pch.h"
#include "ContentDialogHelper.h"
#include "App.h"

using namespace winrt;
using namespace Windows::UI::Xaml::Controls;
Expand All @@ -11,6 +12,10 @@ static weak_ref<ContentDialog> activeDialog;
IAsyncOperation<ContentDialogResult> ContentDialogHelper::ShowAsync(ContentDialog dialog) {
assert(activeDialog == nullptr);

// 设置 Language 属性帮助 XAML 选择合适的字体
MainPage mainPage = Application::Current().as<App>().MainPage();
dialog.Content().as<FrameworkElement>().Language(mainPage.Language());

activeDialog = dialog;
ContentDialogResult result = co_await dialog.ShowAsync();
activeDialog = nullptr;
Expand Down
9 changes: 7 additions & 2 deletions src/Magpie.App/LocalizationService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,20 +51,25 @@ void LocalizationService::EarlyInitialize() {
}
}

ResourceContext::SetGlobalQualifierValue(L"Language", bestLanguage);
_Language(bestLanguage);
}

void LocalizationService::Initialize() {
AppSettings& settings = AppSettings::Get();

int language = settings.Language();
if (language >= 0) {
ResourceContext::SetGlobalQualifierValue(L"Language", SUPPORTED_LANGUAGES[language]);
_Language(SUPPORTED_LANGUAGES[language]);
}
}

std::span<const wchar_t*> LocalizationService::SupportedLanguages() noexcept {
return SUPPORTED_LANGUAGES;
}

void LocalizationService::_Language(const wchar_t* tag) {
_language = tag;
ResourceContext::SetGlobalQualifierValue(L"Language", tag);
}

}
8 changes: 8 additions & 0 deletions src/Magpie.App/LocalizationService.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,16 @@ class LocalizationService {
// 支持的所有语言的标签,均为小写
static std::span<const wchar_t* > SupportedLanguages() noexcept;

const wchar_t* Language() const noexcept {
return _language;
}

private:
LocalizationService() = default;

void _Language(const wchar_t* tag);

const wchar_t* _language = nullptr;
};

}
4 changes: 4 additions & 0 deletions src/Magpie.App/MainPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "ComboBoxHelper.h"
#include "CommonSharedConstants.h"
#include "ContentDialogHelper.h"
#include "LocalizationService.h"

using namespace winrt;
using namespace Windows::Graphics::Display;
Expand Down Expand Up @@ -48,6 +49,9 @@ MainPage::MainPage() {
auto_revoke, { this, &MainPage::_ProfileService_ProfileRemoved });
_profileMovedRevoker = profileService.ProfileMoved(
auto_revoke, { this, &MainPage::_ProfileService_ProfileReordered });

// 设置 Language 属性帮助 XAML 选择合适的字体,比如繁体中文使用 Microsoft JhengHei UI,日语使用 Yu Gothic UI
Language(LocalizationService::Get().Language());
}

MainPage::~MainPage() {
Expand Down
30 changes: 15 additions & 15 deletions src/Magpie.App/ShortcutControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,24 +70,24 @@ fire_and_forget ShortcutControl::EditButton_Click(IInspectable const&, RoutedEve
co_return;
}

if (!_ShortcutDialog) {
if (!_shortcutDialog) {
// 惰性初始化
_ShortcutDialog = ContentDialog();
_shortcutDialog = ContentDialog();
_ShortcutDialogContent = ShortcutDialog();

_ShortcutDialog.Title(GetValue(TitleProperty));
_ShortcutDialog.Content(_ShortcutDialogContent);
_shortcutDialog.Title(GetValue(TitleProperty));
_shortcutDialog.Content(_ShortcutDialogContent);
ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView();
_ShortcutDialog.PrimaryButtonText(resourceLoader.GetString(L"ShortcutDialog_Save"));
_ShortcutDialog.CloseButtonText(resourceLoader.GetString(L"ShortcutDialog_Cancel"));
_ShortcutDialog.DefaultButton(ContentDialogButton::Primary);
_shortcutDialog.PrimaryButtonText(resourceLoader.GetString(L"ShortcutDialog_Save"));
_shortcutDialog.CloseButtonText(resourceLoader.GetString(L"ShortcutDialog_Cancel"));
_shortcutDialog.DefaultButton(ContentDialogButton::Primary);
// 在 Closing 事件中设置热键而不是等待 ShowAsync 返回
// 这两个时间点有一定间隔,用户在这段时间内的按键不应处理
_ShortcutDialog.Closing({ this, &ShortcutControl::_ShortcutDialog_Closing });
_shortcutDialog.Closing({ this, &ShortcutControl::_ShortcutDialog_Closing });
}

_ShortcutDialog.XamlRoot(XamlRoot());
_ShortcutDialog.RequestedTheme(ActualTheme());
_shortcutDialog.XamlRoot(XamlRoot());
_shortcutDialog.RequestedTheme(ActualTheme());

_that = this;
// 防止钩子冲突
Expand All @@ -103,11 +103,11 @@ fire_and_forget ShortcutControl::EditButton_Click(IInspectable const&, RoutedEve
ShortcutError error = _isError ? ShortcutHelper::CheckShortcut(_previewShortcut) : ShortcutError::NoError;
_ShortcutDialogContent.Keys(ToKeys(_previewShortcut, error != ShortcutError::NoError));
_ShortcutDialogContent.Error(error);
_ShortcutDialog.IsPrimaryButtonEnabled(error == ShortcutError::NoError);
_shortcutDialog.IsPrimaryButtonEnabled(error == ShortcutError::NoError);

_pressedKeys.Clear();

co_await ContentDialogHelper::ShowAsync(_ShortcutDialog);
co_await ContentDialogHelper::ShowAsync(_shortcutDialog);
}

void ShortcutControl::_ShortcutDialog_Closing(ContentDialog const&, ContentDialogClosingEventArgs const& args) {
Expand Down Expand Up @@ -219,7 +219,7 @@ LRESULT ShortcutControl::_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM

_that->_ShortcutDialogContent.Keys(ToKeys(previewShortcut, error != ShortcutError::NoError));
_that->_ShortcutDialogContent.Error(error);
_that->_ShortcutDialog.IsPrimaryButtonEnabled(isPrimaryButtonEnabled);
_that->_shortcutDialog.IsPrimaryButtonEnabled(isPrimaryButtonEnabled);
}

return -1;
Expand All @@ -232,8 +232,8 @@ void ShortcutControl::_OnActionChanged(DependencyObject const& sender, Dependenc

void ShortcutControl::_OnTitleChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const& args) {
ShortcutControl* that = get_self<ShortcutControl>(sender.as<default_interface<ShortcutControl>>());
if (that->_ShortcutDialog) {
that->_ShortcutDialog.Title(args.NewValue());
if (that->_shortcutDialog) {
that->_shortcutDialog.Title(args.NewValue());
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/Magpie.App/ShortcutControl.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ struct ShortcutControl : ShortcutControlT<ShortcutControl> {
WinRTUtils::EventRevoker _shortcutChangedRevoker;

Shortcut _shortcut;
Controls::ContentDialog _ShortcutDialog{ nullptr };
Controls::ContentDialog _shortcutDialog{ nullptr };
Magpie::App::ShortcutDialog _ShortcutDialogContent{ nullptr };

HHOOK _keyboardHook = NULL;
Expand Down
2 changes: 1 addition & 1 deletion src/Magpie.App/ShortcutControl.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<FontIcon FontSize="14"
<FontIcon FontSize="16"
Glyph="&#xE70F;" />
</StackPanel>
</Button>
Expand Down