mirror of
https://github.com/microsoft/terminal.git
synced 2025-12-10 18:43:54 -06:00
Add support for language override to unpackaged/portable builds (#18684)
It turns out that we *can* support language overrides--fairly easily, in fact!--by simply changing the default Language qualifier. I elected not to change how packaged language override works until we are certain this works properly everywhere. Consider it a healthy distrust of the Windows App Platform. Closes #18419 Closes #18336 Closes #17619
This commit is contained in:
parent
f023b3bfd2
commit
7d8f7eb429
@ -331,8 +331,16 @@ namespace winrt::TerminalApp::implementation
|
|||||||
void AppLogic::_ApplyLanguageSettingChange() noexcept
|
void AppLogic::_ApplyLanguageSettingChange() noexcept
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
const auto language = _settings.GlobalSettings().Language();
|
||||||
|
|
||||||
if (!IsPackaged())
|
if (!IsPackaged())
|
||||||
{
|
{
|
||||||
|
if (!language.empty())
|
||||||
|
{
|
||||||
|
// We cannot use the packaged app API, PrimaryLanguageOverride, but we *can* tell the resource loader
|
||||||
|
// to set the Language for all loaded resources to the user's preferred language.
|
||||||
|
winrt::Windows::ApplicationModel::Resources::Core::ResourceContext::SetGlobalQualifierValue(L"Language", language);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -340,8 +348,6 @@ namespace winrt::TerminalApp::implementation
|
|||||||
|
|
||||||
// NOTE: PrimaryLanguageOverride throws if this instance is unpackaged.
|
// NOTE: PrimaryLanguageOverride throws if this instance is unpackaged.
|
||||||
const auto primaryLanguageOverride = ApplicationLanguages::PrimaryLanguageOverride();
|
const auto primaryLanguageOverride = ApplicationLanguages::PrimaryLanguageOverride();
|
||||||
const auto language = _settings.GlobalSettings().Language();
|
|
||||||
|
|
||||||
if (primaryLanguageOverride != language)
|
if (primaryLanguageOverride != language)
|
||||||
{
|
{
|
||||||
ApplicationLanguages::PrimaryLanguageOverride(language);
|
ApplicationLanguages::PrimaryLanguageOverride(language);
|
||||||
|
|||||||
@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include <winrt/Windows.ApplicationModel.h>
|
#include <winrt/Windows.ApplicationModel.h>
|
||||||
#include <winrt/Windows.ApplicationModel.DataTransfer.h>
|
#include <winrt/Windows.ApplicationModel.DataTransfer.h>
|
||||||
|
#include <winrt/Windows.ApplicationModel.Resources.Core.h>
|
||||||
#include <winrt/Windows.Foundation.h>
|
#include <winrt/Windows.Foundation.h>
|
||||||
#include <winrt/Windows.Foundation.Collections.h>
|
#include <winrt/Windows.Foundation.Collections.h>
|
||||||
#include <winrt/Windows.Foundation.Metadata.h>
|
#include <winrt/Windows.Foundation.Metadata.h>
|
||||||
|
|||||||
@ -140,8 +140,7 @@
|
|||||||
</local:SettingContainer>
|
</local:SettingContainer>
|
||||||
|
|
||||||
<!-- Language -->
|
<!-- Language -->
|
||||||
<local:SettingContainer x:Uid="Globals_Language"
|
<local:SettingContainer x:Uid="Globals_Language">
|
||||||
Visibility="{x:Bind ViewModel.LanguageSelectorAvailable}">
|
|
||||||
<ComboBox ItemsSource="{x:Bind ViewModel.LanguageList}"
|
<ComboBox ItemsSource="{x:Bind ViewModel.LanguageList}"
|
||||||
SelectedItem="{x:Bind ViewModel.CurrentLanguage, Mode=TwoWay}"
|
SelectedItem="{x:Bind ViewModel.CurrentLanguage, Mode=TwoWay}"
|
||||||
Style="{StaticResource ComboBoxSettingStyle}">
|
Style="{StaticResource ComboBoxSettingStyle}">
|
||||||
|
|||||||
@ -82,16 +82,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
return language.NativeName();
|
return language.NativeName();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns whether the language selector is available/shown.
|
|
||||||
//
|
|
||||||
// winrt::Windows::Globalization::ApplicationLanguages::PrimaryLanguageOverride()
|
|
||||||
// doesn't work for unpackaged applications. The corresponding code in TerminalApp is disabled.
|
|
||||||
// It would be confusing for our users if we presented a dysfunctional language selector.
|
|
||||||
bool LaunchViewModel::LanguageSelectorAvailable()
|
|
||||||
{
|
|
||||||
return IsPackaged();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns the list of languages the user may override the application language with.
|
// Returns the list of languages the user may override the application language with.
|
||||||
// The returned list are BCP 47 language tags like {"und", "en-US", "de-DE", "es-ES", ...}.
|
// The returned list are BCP 47 language tags like {"und", "en-US", "de-DE", "es-ES", ...}.
|
||||||
// "und" is short for "undefined" and is synonymous for "Use system language" in this code.
|
// "und" is short for "undefined" and is synonymous for "Use system language" in this code.
|
||||||
@ -102,12 +92,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
return _languageList;
|
return _languageList;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!LanguageSelectorAvailable())
|
|
||||||
{
|
|
||||||
_languageList = {};
|
|
||||||
return _languageList;
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order to return the language list this code does the following:
|
// In order to return the language list this code does the following:
|
||||||
// [1] Get all possible languages we want to allow the user to choose.
|
// [1] Get all possible languages we want to allow the user to choose.
|
||||||
// We have to acquire languages from multiple sources, creating duplicates. See below at [1].
|
// We have to acquire languages from multiple sources, creating duplicates. See below at [1].
|
||||||
@ -179,19 +163,24 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
return _currentLanguage;
|
return _currentLanguage;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!LanguageSelectorAvailable())
|
winrt::hstring currentLanguage;
|
||||||
|
if (IsPackaged())
|
||||||
{
|
{
|
||||||
_currentLanguage = {};
|
// NOTE: PrimaryLanguageOverride throws if this instance is unpackaged.
|
||||||
return _currentLanguage;
|
currentLanguage = winrt::Windows::Globalization::ApplicationLanguages::PrimaryLanguageOverride();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_Settings.GlobalSettings().HasLanguage())
|
||||||
|
{
|
||||||
|
currentLanguage = _Settings.GlobalSettings().Language();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: PrimaryLanguageOverride throws if this instance is unpackaged.
|
|
||||||
auto currentLanguage = winrt::Windows::Globalization::ApplicationLanguages::PrimaryLanguageOverride();
|
|
||||||
if (currentLanguage.empty())
|
if (currentLanguage.empty())
|
||||||
{
|
{
|
||||||
currentLanguage = systemLanguageTag;
|
currentLanguage = systemLanguageTag;
|
||||||
}
|
}
|
||||||
|
|
||||||
_currentLanguage = winrt::box_value(currentLanguage);
|
_currentLanguage = winrt::box_value(currentLanguage);
|
||||||
return _currentLanguage;
|
return _currentLanguage;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,7 +20,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||||||
// "Deutsch (Deutschland)". This works independently of the user's locale.
|
// "Deutsch (Deutschland)". This works independently of the user's locale.
|
||||||
static winrt::hstring LanguageDisplayConverter(const winrt::hstring& tag);
|
static winrt::hstring LanguageDisplayConverter(const winrt::hstring& tag);
|
||||||
|
|
||||||
bool LanguageSelectorAvailable();
|
|
||||||
winrt::Windows::Foundation::Collections::IObservableVector<winrt::hstring> LanguageList();
|
winrt::Windows::Foundation::Collections::IObservableVector<winrt::hstring> LanguageList();
|
||||||
winrt::Windows::Foundation::IInspectable CurrentLanguage();
|
winrt::Windows::Foundation::IInspectable CurrentLanguage();
|
||||||
void CurrentLanguage(const winrt::Windows::Foundation::IInspectable& tag);
|
void CurrentLanguage(const winrt::Windows::Foundation::IInspectable& tag);
|
||||||
|
|||||||
@ -10,7 +10,6 @@ namespace Microsoft.Terminal.Settings.Editor
|
|||||||
runtimeclass LaunchViewModel : Windows.UI.Xaml.Data.INotifyPropertyChanged
|
runtimeclass LaunchViewModel : Windows.UI.Xaml.Data.INotifyPropertyChanged
|
||||||
{
|
{
|
||||||
static String LanguageDisplayConverter(String tag);
|
static String LanguageDisplayConverter(String tag);
|
||||||
Boolean LanguageSelectorAvailable { get; };
|
|
||||||
Windows.Foundation.Collections.IObservableVector<String> LanguageList { get; };
|
Windows.Foundation.Collections.IObservableVector<String> LanguageList { get; };
|
||||||
IInspectable CurrentLanguage;
|
IInspectable CurrentLanguage;
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user