Skip to content

Commit 56b47ff

Browse files
kmahonestefansjfw
andauthored
[MRTCore] Add Microsoft.Windows.Globalization.ApplicationLanguages class (#4523)
Co-authored-by: Stefan Markovic <[email protected]>
1 parent e5367c8 commit 56b47ff

11 files changed

+136
-10
lines changed

BuildAll.ps1

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ Try {
332332
Copy-Item -path "BuildOutput\$configurationForMrtAndAnyCPU\$platformToRun\Microsoft.Windows.ApplicationModel.Resources.Projection\Microsoft.Windows.ApplicationModel.Resources.Projection.dll" -destination "$BasePath\lib\net6.0-windows10.0.17763.0" -force
333333
Copy-Item -path "BuildOutput\$configurationForMrtAndAnyCPU\$platformToRun\Microsoft.Windows.ApplicationModel.Resources.Projection\Microsoft.Windows.ApplicationModel.Resources.Projection.pdb" -destination "$BasePath\lib\net6.0-windows10.0.17763.0" -force
334334
Copy-Item -path "BuildOutput\$configurationForMrtAndAnyCPU\$platformToRun\Microsoft.Windows.ApplicationModel.Resources\Microsoft.Windows.ApplicationModel.Resources.winmd" -destination "$BasePath\lib\uap10.0" -force
335+
Copy-Item -path "BuildOutput\$configurationForMrtAndAnyCPU\$platformToRun\Microsoft.Windows.ApplicationModel.Resources\Microsoft.Windows.Globalization.winmd" -destination "$BasePath\lib\uap10.0" -force
335336
}
336337
}
337338

build/NuSpecs/AppxManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<ActivatableClass ActivatableClassId="Microsoft.Windows.ApplicationModel.Resources.ResourceCandidate" ThreadingModel="both" />
2323
<ActivatableClass ActivatableClassId="Microsoft.Windows.ApplicationModel.Resources.ResourceLoader" ThreadingModel="both" />
2424
<ActivatableClass ActivatableClassId="Microsoft.Windows.ApplicationModel.Resources.ResourceManager" ThreadingModel="both" />
25+
<ActivatableClass ActivatableClassId="Microsoft.Windows.Globalization.ApplicationLanguages" ThreadingModel="both" />
2526
</InProcessServer>
2627
</Extension>
2728
<Extension Category="windows.activatableClass.inProcessServer">

dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/projection/Microsoft.Windows.ApplicationModel.Resources.Projection.csproj

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<TargetFramework>net6.0-windows10.0.17763.0</TargetFramework>
44
<TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
@@ -21,7 +21,7 @@
2121
</ItemGroup>
2222

2323
<PropertyGroup>
24-
<CSWinRTIncludes>Microsoft.Windows.ApplicationModel.Resources</CSWinRTIncludes>
24+
<CSWinRTIncludes>Microsoft.Windows.Globalization;Microsoft.Windows.ApplicationModel.Resources</CSWinRTIncludes>
2525
<CSWinRTWindowsMetadata>10.0.17763.0</CSWinRTWindowsMetadata>
2626
<NoWarn>MSB3271</NoWarn>
2727
</PropertyGroup>
@@ -30,10 +30,11 @@
3030
<PropertyGroup Condition="'$(Configuration)'=='Release'">
3131
<DebugType>pdbonly</DebugType>
3232
<DebugSymbols>true</DebugSymbols>
33-
</PropertyGroup>
33+
</PropertyGroup>
3434

3535
<ItemGroup>
3636
<CsWinRTInputs Include="$(OutDir)/**/*.winmd" />
37+
<CsWinRTInputs Include="$(BaseOutputPath)/Microsoft.Windows.ApplicationModel.Resources/Microsoft.Windows.Globalization.winmd" />
3738
</ItemGroup>
3839

3940
<ItemGroup>
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// Copyright (c) Microsoft Corporation and Contributors.
2+
// Licensed under the MIT License.
3+
4+
#include "pch.h"
5+
#include "ApplicationLanguages.h"
6+
#include "Microsoft.Windows.Globalization.ApplicationLanguages.g.cpp"
7+
8+
#include <bcp47mrm.h>
9+
#include <winrt/Windows.Globalization.h>
10+
11+
#include <AppModel.Identity.h>
12+
13+
namespace winrt::Microsoft::Windows::Globalization::implementation
14+
{
15+
hstring ApplicationLanguages::m_language;
16+
wil::srwlock ApplicationLanguages::m_lock;
17+
18+
19+
winrt::Windows::Foundation::Collections::IVectorView<hstring> ApplicationLanguages::Languages()
20+
{
21+
return winrt::Windows::Globalization::ApplicationLanguages::Languages();
22+
}
23+
24+
winrt::Windows::Foundation::Collections::IVectorView<hstring> ApplicationLanguages::ManifestLanguages()
25+
{
26+
if (AppModel::Identity::IsPackagedProcess())
27+
{
28+
return winrt::Windows::Globalization::ApplicationLanguages::ManifestLanguages();
29+
}
30+
else
31+
{
32+
return {};
33+
}
34+
}
35+
36+
hstring ApplicationLanguages::PrimaryLanguageOverride()
37+
{
38+
auto criticalSection{ m_lock.lock_shared() };
39+
return m_language;
40+
}
41+
42+
void ApplicationLanguages::PrimaryLanguageOverride(hstring const& language)
43+
{
44+
bool isValidLanguageTag = IsWellFormedTag(language.c_str());
45+
46+
THROW_HR_IF_MSG(E_INVALIDARG, !isValidLanguageTag, "The parameter is incorrect");
47+
48+
auto criticalSection {m_lock.lock_exclusive()};
49+
m_language = language;
50+
51+
if (AppModel::Identity::IsPackagedProcess())
52+
{
53+
winrt::Windows::Globalization::ApplicationLanguages::PrimaryLanguageOverride(language);
54+
}
55+
}
56+
} // namespace winrt::Microsoft::Windows::Globalization::implementation
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright (c) Microsoft Corporation and Contributors.
2+
// Licensed under the MIT License.
3+
4+
#pragma once
5+
#include "Microsoft.Windows.Globalization.ApplicationLanguages.g.h"
6+
7+
namespace winrt::Microsoft::Windows::Globalization::implementation
8+
{
9+
struct ApplicationLanguages
10+
{
11+
ApplicationLanguages() = delete;
12+
13+
static winrt::Windows::Foundation::Collections::IVectorView<hstring> Languages();
14+
static winrt::Windows::Foundation::Collections::IVectorView<hstring> ManifestLanguages();
15+
static hstring PrimaryLanguageOverride();
16+
static void PrimaryLanguageOverride(hstring const& language);
17+
18+
private:
19+
static hstring m_language;
20+
static wil::srwlock m_lock;
21+
};
22+
} // namespace winrt::Microsoft::Windows::Globalization::implementation
23+
24+
namespace winrt::Microsoft::Windows::Globalization::factory_implementation
25+
{
26+
struct ApplicationLanguages : ApplicationLanguagesT<ApplicationLanguages, implementation::ApplicationLanguages>
27+
{
28+
};
29+
} // namespace winrt::Microsoft::Windows::Globalization::factory_implementation

dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/src/Microsoft.Windows.ApplicationModel.Resources.idl

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
// Copyright (c) Microsoft Corporation and Contributors.
1+
// Copyright (c) Microsoft Corporation and Contributors.
22
// Licensed under the MIT License.
33

44
namespace Microsoft.Windows.ApplicationModel.Resources
55
{
6-
[contractversion(1)]
6+
[contractversion(2)]
77
apicontract MrtCoreContract{};
88

99
[contract(MrtCoreContract, 1)]
@@ -114,3 +114,15 @@ namespace Microsoft.Windows.ApplicationModel.Resources
114114
static String Theme { get; };
115115
}
116116
} // namespace Microsoft.Windows.ApplicationModel.Resources
117+
118+
namespace Microsoft.Windows.Globalization
119+
{
120+
[contract(Microsoft.Windows.ApplicationModel.Resources.MrtCoreContract, 2)]
121+
runtimeclass ApplicationLanguages
122+
{
123+
static IVectorView<String> Languages { get; };
124+
static IVectorView<String> ManifestLanguages { get; };
125+
static String PrimaryLanguageOverride;
126+
}
127+
128+
} // namespace Microsoft.Windows.Globalization

dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/src/Microsoft.Windows.ApplicationModel.Resources.vcxproj

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<DefaultLanguage>en-US</DefaultLanguage>
1818
<MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
1919
<Keyword>Win32Proj</Keyword>
20-
<WindowsTargetPlatformVersion Condition=" '$(WindowsTargetPlatformVersion)' == '' ">10.0.18362.0</WindowsTargetPlatformVersion>
20+
<WindowsTargetPlatformVersion Condition=" '$(WindowsTargetPlatformVersion)' == '' ">10.0.20348.0</WindowsTargetPlatformVersion>
2121
<WindowsTargetPlatformMinVersion>10.0.17134.0</WindowsTargetPlatformMinVersion>
2222
<!-- Need to add this otherwise the ADO build won't copy mrm.dll to output directory, and eventually the file will miss in ManagedTest.build.appxrecipe and make
2323
the tests fail to run in ADO pipeline -->
@@ -90,12 +90,13 @@
9090
</DisableSpecificWarnings>
9191
<PreprocessorDefinitions>_WINRT_DLL;WIN32_LEAN_AND_MEAN;WINRT_LEAN_AND_MEAN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
9292
<AdditionalUsingDirectories>$(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)</AdditionalUsingDirectories>
93+
<AdditionalIncludeDirectories>$(RepoRoot)\dev\Common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
9394
</ClCompile>
9495
<Link>
9596
<SubSystem>Console</SubSystem>
9697
<GenerateWindowsMetadata>false</GenerateWindowsMetadata>
9798
<ModuleDefinitionFile>Microsoft.Windows.ApplicationModel.Resources.def</ModuleDefinitionFile>
98-
<AdditionalDependencies>$(OutDir)..\mrm\MRM.lib;onecoreuap.lib;%(AdditionalDependencies)</AdditionalDependencies>
99+
<AdditionalDependencies>$(OutDir)..\mrm\MRM.lib;onecoreuap.lib;bcp47mrm.lib;%(AdditionalDependencies)</AdditionalDependencies>
99100
</Link>
100101
</ItemDefinitionGroup>
101102
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
@@ -109,6 +110,7 @@
109110
</ClCompile>
110111
</ItemDefinitionGroup>
111112
<ItemGroup>
113+
<ClInclude Include="ApplicationLanguages.h" />
112114
<ClInclude Include="Helper.h" />
113115
<ClInclude Include="KnownResourceQualifierName.h" />
114116
<ClInclude Include="pch.h" />
@@ -120,6 +122,7 @@
120122
<ClInclude Include="ResourceNotFoundEventArgs.h" />
121123
</ItemGroup>
122124
<ItemGroup>
125+
<ClCompile Include="ApplicationLanguages.cpp" />
123126
<ClCompile Include="Helper.cpp" />
124127
<ClCompile Include="KnownResourceQualifierName.cpp" />
125128
<ClCompile Include="pch.cpp">
@@ -140,7 +143,7 @@
140143
<None Include="Microsoft.Windows.ApplicationModel.Resources.def" />
141144
</ItemGroup>
142145
<ItemGroup>
143-
<ResourceCompile Include="Microsoft.Windows.ApplicationModel.Resources.rc">
146+
<ResourceCompile Include="Microsoft.Windows.ApplicationModel.Resources.rc">
144147
<AdditionalIncludeDirectories>$(RepoRoot);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
145148
</ResourceCompile>
146149
</ItemGroup>
@@ -171,6 +174,7 @@
171174
<Import Project="$(NugetPackageDirectory)\Microsoft.SourceLink.Common.$(MicrosoftSourceLinkCommonVersion)\build\Microsoft.SourceLink.Common.targets" Condition="Exists('$(NugetPackageDirectory)\Microsoft.SourceLink.Common.$(MicrosoftSourceLinkCommonVersion)\build\Microsoft.SourceLink.Common.targets')" />
172175
<Import Project="$(NugetPackageDirectory)\Microsoft.Build.Tasks.Git.$(MicrosoftBuildTasksGitVersion)\build\Microsoft.Build.Tasks.Git.targets" Condition="Exists('$(NugetPackageDirectory)\Microsoft.Build.Tasks.Git.$(MicrosoftBuildTasksGitVersion)\build\Microsoft.Build.Tasks.Git.targets')" />
173176
<Import Project="$(NugetPackageDirectory)\Microsoft.SourceLink.GitHub.$(MicrosoftSourceLinkGitHubVersion)\build\Microsoft.SourceLink.GitHub.targets" Condition="Exists('$(NugetPackageDirectory)\Microsoft.SourceLink.GitHub.$(MicrosoftSourceLinkGitHubVersion)\build\Microsoft.SourceLink.GitHub.targets')" />
177+
<Import Project="$(NugetPackageDirectory)\Microsoft.Windows.ImplementationLibrary.$(MicrosoftWindowsImplementationLibraryVersion)\build\native\Microsoft.Windows.ImplementationLibrary.targets" Condition="Exists('$(NugetPackageDirectory)\Microsoft.Windows.ImplementationLibrary.$(MicrosoftWindowsImplementationLibraryVersion)\build\native\Microsoft.Windows.ImplementationLibrary.targets')" />
174178
</ImportGroup>
175179
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
176180
<PropertyGroup>
@@ -185,5 +189,6 @@
185189
<Error Condition="!Exists('$(NugetPackageDirectory)\Microsoft.Build.Tasks.Git.$(MicrosoftBuildTasksGitVersion)\build\Microsoft.Build.Tasks.Git.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(NugetPackageDirectory)\Microsoft.Build.Tasks.Git.$(MicrosoftBuildTasksGitVersion)\build\Microsoft.Build.Tasks.Git.targets'))" />
186190
<Error Condition="!Exists('$(NugetPackageDirectory)\Microsoft.SourceLink.GitHub.$(MicrosoftSourceLinkGitHubVersion)\build\Microsoft.SourceLink.GitHub.props')" Text="$([System.String]::Format('$(ErrorText)', '$(NugetPackageDirectory)\Microsoft.SourceLink.GitHub.$(MicrosoftSourceLinkGitHubVersion)\build\Microsoft.SourceLink.GitHub.props'))" />
187191
<Error Condition="!Exists('$(NugetPackageDirectory)\Microsoft.SourceLink.GitHub.$(MicrosoftSourceLinkGitHubVersion)\build\Microsoft.SourceLink.GitHub.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(NugetPackageDirectory)\Microsoft.SourceLink.GitHub.$(MicrosoftSourceLinkGitHubVersion)\build\Microsoft.SourceLink.GitHub.targets'))" />
192+
<Error Condition="!Exists('$(NugetPackageDirectory)\Microsoft.Windows.ImplementationLibrary.$(MicrosoftWindowsImplementationLibraryVersion)\build\native\Microsoft.Windows.ImplementationLibrary.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(NugetPackageDirectory)\Microsoft.Windows.ImplementationLibrary.$(MicrosoftWindowsImplementationLibraryVersion)\build\native\Microsoft.Windows.ImplementationLibrary.targets'))" />
188193
</Target>
189-
</Project>
194+
</Project>

dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/src/Microsoft.Windows.ApplicationModel.Resources.vcxproj.filters

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
<ClCompile Include="KnownResourceQualifierName.cpp">
3030
<Filter>Source Files</Filter>
3131
</ClCompile>
32+
<ClCompile Include="ApplicationLanguages.cpp">
33+
<Filter>Source Files</Filter>
34+
</ClCompile>
3235
</ItemGroup>
3336
<ItemGroup>
3437
<ClInclude Include="pch.h">
@@ -58,6 +61,9 @@
5861
<ClInclude Include="KnownResourceQualifierName.h">
5962
<Filter>Header Files</Filter>
6063
</ClInclude>
64+
<ClInclude Include="ApplicationLanguages.h">
65+
<Filter>Header Files</Filter>
66+
</ClInclude>
6167
</ItemGroup>
6268
<ItemGroup>
6369
<Midl Include="Microsoft.Windows.ApplicationModel.Resources.idl" />
@@ -75,4 +81,7 @@
7581
<UniqueIdentifier>{54696afe-f42a-494a-bc24-3fd0d4192122}</UniqueIdentifier>
7682
</Filter>
7783
</ItemGroup>
84+
<ItemGroup>
85+
<ResourceCompile Include="Microsoft.Windows.ApplicationModel.Resources.rc" />
86+
</ItemGroup>
7887
</Project>

dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/src/ResourceContext.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88

99
const wchar_t c_languageQualifierName[] = L"Language";
1010

11+
#include "ApplicationLanguages.h"
12+
13+
using namespace winrt::Microsoft::Windows::Globalization;
14+
1115
namespace winrt::Microsoft::Windows::ApplicationModel::Resources::implementation
1216
{
1317
void ResourceContext::InitializeQualifierNames()
@@ -97,6 +101,10 @@ void ResourceContext::Apply()
97101
winrt::check_hresult(MrmSetQualifier(m_resourceContext, eachValue.Key().c_str(), eachValue.Value().c_str()));
98102
}
99103
}
104+
if (!ApplicationLanguages::PrimaryLanguageOverride().empty())
105+
{
106+
winrt::check_hresult(MrmSetQualifier(m_resourceContext, c_languageQualifierName, ApplicationLanguages::PrimaryLanguageOverride().c_str()));
107+
}
100108
}
101109

102110
hstring ResourceContext::GetLangugageContext()

dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/src/packages.config

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@
44
<package id="Microsoft.SourceLink.Common" version="1.1.1" targetFramework="native" developmentDependency="true" />
55
<package id="Microsoft.SourceLink.GitHub" version="1.1.1" targetFramework="native" developmentDependency="true" />
66
<package id="Microsoft.Windows.CppWinRT" version="2.0.230706.1" targetFramework="native" />
7-
</packages>
7+
<package id="Microsoft.Windows.ImplementationLibrary" version="1.0.220914.1" targetFramework="native" />
8+
</packages>

0 commit comments

Comments
 (0)