Skip to content

Commit 4f8a3d1

Browse files
committed
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 (cherry picked from commit 7d8f7eb) Service-Card-Id: PVTI_lADOAF3p4s4AxadtzgYVTtY Service-Version: 1.23
1 parent 38783fa commit 4f8a3d1

File tree

6 files changed

+21
-28
lines changed

6 files changed

+21
-28
lines changed

src/cascadia/TerminalApp/AppLogic.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,17 +333,23 @@ namespace winrt::TerminalApp::implementation
333333
void AppLogic::_ApplyLanguageSettingChange() noexcept
334334
try
335335
{
336+
const auto language = _settings.GlobalSettings().Language();
337+
336338
if (!IsPackaged())
337339
{
340+
if (!language.empty())
341+
{
342+
// We cannot use the packaged app API, PrimaryLanguageOverride, but we *can* tell the resource loader
343+
// to set the Language for all loaded resources to the user's preferred language.
344+
winrt::Windows::ApplicationModel::Resources::Core::ResourceContext::SetGlobalQualifierValue(L"Language", language);
345+
}
338346
return;
339347
}
340348

341349
using ApplicationLanguages = winrt::Windows::Globalization::ApplicationLanguages;
342350

343351
// NOTE: PrimaryLanguageOverride throws if this instance is unpackaged.
344352
const auto primaryLanguageOverride = ApplicationLanguages::PrimaryLanguageOverride();
345-
const auto language = _settings.GlobalSettings().Language();
346-
347353
if (primaryLanguageOverride != language)
348354
{
349355
ApplicationLanguages::PrimaryLanguageOverride(language);

src/cascadia/TerminalApp/pch.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
#include <winrt/Windows.ApplicationModel.h>
2929
#include <winrt/Windows.ApplicationModel.DataTransfer.h>
30+
#include <winrt/Windows.ApplicationModel.Resources.Core.h>
3031
#include <winrt/Windows.Foundation.h>
3132
#include <winrt/Windows.Foundation.Collections.h>
3233
#include <winrt/Windows.Foundation.Metadata.h>

src/cascadia/TerminalSettingsEditor/Launch.xaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,7 @@
140140
</local:SettingContainer>
141141

142142
<!-- Language -->
143-
<local:SettingContainer x:Uid="Globals_Language"
144-
Visibility="{x:Bind ViewModel.LanguageSelectorAvailable}">
143+
<local:SettingContainer x:Uid="Globals_Language">
145144
<ComboBox ItemsSource="{x:Bind ViewModel.LanguageList}"
146145
SelectedItem="{x:Bind ViewModel.CurrentLanguage, Mode=TwoWay}"
147146
Style="{StaticResource ComboBoxSettingStyle}">

src/cascadia/TerminalSettingsEditor/LaunchViewModel.cpp

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -80,16 +80,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
8080
return language.NativeName();
8181
}
8282

83-
// Returns whether the language selector is available/shown.
84-
//
85-
// winrt::Windows::Globalization::ApplicationLanguages::PrimaryLanguageOverride()
86-
// doesn't work for unpackaged applications. The corresponding code in TerminalApp is disabled.
87-
// It would be confusing for our users if we presented a dysfunctional language selector.
88-
bool LaunchViewModel::LanguageSelectorAvailable()
89-
{
90-
return IsPackaged();
91-
}
92-
9383
// Returns the list of languages the user may override the application language with.
9484
// The returned list are BCP 47 language tags like {"und", "en-US", "de-DE", "es-ES", ...}.
9585
// "und" is short for "undefined" and is synonymous for "Use system language" in this code.
@@ -100,12 +90,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
10090
return _languageList;
10191
}
10292

103-
if (!LanguageSelectorAvailable())
104-
{
105-
_languageList = {};
106-
return _languageList;
107-
}
108-
10993
// In order to return the language list this code does the following:
11094
// [1] Get all possible languages we want to allow the user to choose.
11195
// We have to acquire languages from multiple sources, creating duplicates. See below at [1].
@@ -177,19 +161,24 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
177161
return _currentLanguage;
178162
}
179163

180-
if (!LanguageSelectorAvailable())
164+
winrt::hstring currentLanguage;
165+
if (IsPackaged())
181166
{
182-
_currentLanguage = {};
183-
return _currentLanguage;
167+
// NOTE: PrimaryLanguageOverride throws if this instance is unpackaged.
168+
currentLanguage = winrt::Windows::Globalization::ApplicationLanguages::PrimaryLanguageOverride();
169+
}
170+
else
171+
{
172+
if (_Settings.GlobalSettings().HasLanguage())
173+
{
174+
currentLanguage = _Settings.GlobalSettings().Language();
175+
}
184176
}
185177

186-
// NOTE: PrimaryLanguageOverride throws if this instance is unpackaged.
187-
auto currentLanguage = winrt::Windows::Globalization::ApplicationLanguages::PrimaryLanguageOverride();
188178
if (currentLanguage.empty())
189179
{
190180
currentLanguage = systemLanguageTag;
191181
}
192-
193182
_currentLanguage = winrt::box_value(currentLanguage);
194183
return _currentLanguage;
195184
}

src/cascadia/TerminalSettingsEditor/LaunchViewModel.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
1919
// "Deutsch (Deutschland)". This works independently of the user's locale.
2020
static winrt::hstring LanguageDisplayConverter(const winrt::hstring& tag);
2121

22-
bool LanguageSelectorAvailable();
2322
winrt::Windows::Foundation::Collections::IObservableVector<winrt::hstring> LanguageList();
2423
winrt::Windows::Foundation::IInspectable CurrentLanguage();
2524
void CurrentLanguage(const winrt::Windows::Foundation::IInspectable& tag);

src/cascadia/TerminalSettingsEditor/LaunchViewModel.idl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ namespace Microsoft.Terminal.Settings.Editor
1212
LaunchViewModel(Microsoft.Terminal.Settings.Model.CascadiaSettings settings);
1313

1414
static String LanguageDisplayConverter(String tag);
15-
Boolean LanguageSelectorAvailable { get; };
1615
Windows.Foundation.Collections.IObservableVector<String> LanguageList { get; };
1716
IInspectable CurrentLanguage;
1817

0 commit comments

Comments
 (0)