Skip to content

Commit f65de92

Browse files
committed
feat: Add i18n for WinUI
1 parent 105168d commit f65de92

19 files changed

+511
-105
lines changed

.github/workflows/CI.yaml

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,29 @@ jobs:
5656

5757
- name: Build
5858
shell: pwsh
59-
run: .\build.ps1
59+
run: |
60+
.\build.ps1
61+
.\build.WinUI.ps1 x64
62+
.\build.WinUI.ps1 arm64
6063
6164
- name: Upload
6265
uses: actions/upload-artifact@v3
6366
with:
6467
name: ${{ env.ProjectName }}
6568
path: ${{ env.ProjectName }}\bin\${{ env.Configuration }}\${{ env.NET_TFM }}\generic\publish\
6669

70+
- name: Upload WinUI x64
71+
uses: actions/upload-artifact@v3
72+
with:
73+
name: ${{ env.ProjectName }}.WinUI.x64
74+
path: ${{ env.ProjectName }}.WinUI\bin\x64\${{ env.Configuration }}\${{ env.NET_TFM }}\win-x64\publish\
75+
76+
- name: Upload WinUI arm64
77+
uses: actions/upload-artifact@v3
78+
with:
79+
name: ${{ env.ProjectName }}.WinUI.arm64
80+
path: ${{ env.ProjectName }}.WinUI\bin\arm64\${{ env.Configuration }}\${{ env.NET_TFM }}\win-arm64\publish\
81+
6782
nuget:
6883
needs: [test, check_format]
6984
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
@@ -102,6 +117,16 @@ jobs:
102117
name: ${{ env.ProjectName }}
103118
path: ${{ env.ProjectName }}
104119

120+
- uses: actions/download-artifact@v3
121+
with:
122+
name: ${{ env.ProjectName }}.WinUI.x64
123+
path: ${{ env.ProjectName }}.WinUI.x64
124+
125+
- uses: actions/download-artifact@v3
126+
with:
127+
name: ${{ env.ProjectName }}.WinUI.arm64
128+
path: ${{ env.ProjectName }}.WinUI.arm64
129+
105130
- name: Get tag
106131
id: tag
107132
uses: dawidd6/action-get-tag@v1
@@ -114,6 +139,20 @@ jobs:
114139
7z a -mx9 "$zip_path" ${{ env.ProjectName }}
115140
echo "GENERIC_SHA256=$((Get-FileHash $zip_path -Algorithm SHA256).Hash)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
116141
142+
- name: Package WinUI x64
143+
shell: pwsh
144+
run: |
145+
$zip_path = "builtfiles/$env:ProjectName-${{ steps.tag.outputs.tag }}-x64.7z"
146+
7z a -mx9 "$zip_path" ${{ env.ProjectName }}.WinUI.x64
147+
echo "X64_SHA256=$((Get-FileHash $zip_path -Algorithm SHA256).Hash)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
148+
149+
- name: Package WinUI arm64
150+
shell: pwsh
151+
run: |
152+
$zip_path = "builtfiles/$env:ProjectName-${{ steps.tag.outputs.tag }}-arm64.7z"
153+
7z a -mx9 "$zip_path" ${{ env.ProjectName }}.WinUI.arm64
154+
echo "ARM64_SHA256=$((Get-FileHash $zip_path -Algorithm SHA256).Hash)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
155+
117156
- name: Create a new GitHub release
118157
uses: ncipollo/release-action@v1
119158
with:
@@ -126,3 +165,5 @@ jobs:
126165
| Filename | SHA-256 |
127166
| :- | :- |
128167
| <sub>${{ env.ProjectName }}-${{ steps.tag.outputs.tag }}.7z</sub> | <sub>${{ env.GENERIC_SHA256 }}</sub> |
168+
| <sub>${{ env.ProjectName }}-${{ steps.tag.outputs.tag }}-x64.7z</sub> | <sub>${{ env.X64_SHA256 }}</sub> |
169+
| <sub>${{ env.ProjectName }}-${{ steps.tag.outputs.tag }}-arm64.7z</sub> | <sub>${{ env.ARM64_SHA256 }}</sub> |

NatTypeTester.WinUI/Extensions/ContentDialogExtensions.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,21 @@ internal static class ContentDialogExtensions
44
{
55
public static async ValueTask HandleExceptionWithContentDialogAsync(this Exception ex, XamlRoot root)
66
{
7+
ResourceLoader resourceLoader = ResourceLoader.GetForViewIndependentUse();
78
ContentDialog dialog = new();
89
try
910
{
1011
dialog.XamlRoot = root;
1112
dialog.Title = nameof(NatTypeTester);
12-
dialog.Content = ex.Message;
13-
dialog.PrimaryButtonText = @"OK";
13+
14+
string content = resourceLoader.GetString(ex.Message);
15+
if (string.IsNullOrEmpty(content))
16+
{
17+
content = ex.Message;
18+
}
19+
dialog.Content = content;
20+
21+
dialog.PrimaryButtonText = resourceLoader.GetString(@"OK");
1422

1523
await dialog.ShowAsync();
1624
}

NatTypeTester.WinUI/MainWindow.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public MainWindow()
99
Title = nameof(NatTypeTester);
1010
ExtendsContentIntoTitleBar = true;
1111

12-
AppWindow.Resize(new SizeInt32(500, 590));
12+
AppWindow.Resize(new SizeInt32(500, 560));
1313
AppWindow.SetIcon(@"Assets\icon.ico");
1414

1515
// CenterScreen

NatTypeTester.WinUI/NatTypeTesterModule.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
global using Volo.Abp.Autofac;
2121
global using Volo.Abp.DependencyInjection;
2222
global using Volo.Abp.Modularity;
23+
global using Windows.ApplicationModel.Resources;
2324
global using Windows.Graphics;
2425
global using Windows.System;
2526

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<root>
3+
<!--
4+
Microsoft ResX Schema
5+
6+
Version 2.0
7+
8+
The primary goals of this format is to allow a simple XML format
9+
that is mostly human readable. The generation and parsing of the
10+
various data types are done through the TypeConverter classes
11+
associated with the data types.
12+
13+
Example:
14+
15+
... ado.net/XML headers & schema ...
16+
<resheader name="resmimetype">text/microsoft-resx</resheader>
17+
<resheader name="version">2.0</resheader>
18+
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
19+
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
20+
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
21+
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
22+
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
23+
<value>[base64 mime encoded serialized .NET Framework object]</value>
24+
</data>
25+
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
26+
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
27+
<comment>This is a comment</comment>
28+
</data>
29+
30+
There are any number of "resheader" rows that contain simple
31+
name/value pairs.
32+
33+
Each data row contains a name, and value. The row also contains a
34+
type or mimetype. Type corresponds to a .NET class that support
35+
text/value conversion through the TypeConverter architecture.
36+
Classes that don't support this are serialized and stored with the
37+
mimetype set.
38+
39+
The mimetype is used for serialized objects, and tells the
40+
ResXResourceReader how to depersist the object. This is currently not
41+
extensible. For a given mimetype the value must be set accordingly:
42+
43+
Note - application/x-microsoft.net.object.binary.base64 is the format
44+
that the ResXResourceWriter will generate, however the reader can
45+
read any of the formats listed below.
46+
47+
mimetype: application/x-microsoft.net.object.binary.base64
48+
value : The object must be serialized with
49+
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
50+
: and then encoded with base64 encoding.
51+
52+
mimetype: application/x-microsoft.net.object.soap.base64
53+
value : The object must be serialized with
54+
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
55+
: and then encoded with base64 encoding.
56+
57+
mimetype: application/x-microsoft.net.object.bytearray.base64
58+
value : The object must be serialized into a byte array
59+
: using a System.ComponentModel.TypeConverter
60+
: and then encoded with base64 encoding.
61+
-->
62+
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
63+
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
64+
<xsd:element name="root" msdata:IsDataSet="true">
65+
<xsd:complexType>
66+
<xsd:choice maxOccurs="unbounded">
67+
<xsd:element name="metadata">
68+
<xsd:complexType>
69+
<xsd:sequence>
70+
<xsd:element name="value" type="xsd:string" minOccurs="0" />
71+
</xsd:sequence>
72+
<xsd:attribute name="name" use="required" type="xsd:string" />
73+
<xsd:attribute name="type" type="xsd:string" />
74+
<xsd:attribute name="mimetype" type="xsd:string" />
75+
<xsd:attribute ref="xml:space" />
76+
</xsd:complexType>
77+
</xsd:element>
78+
<xsd:element name="assembly">
79+
<xsd:complexType>
80+
<xsd:attribute name="alias" type="xsd:string" />
81+
<xsd:attribute name="name" type="xsd:string" />
82+
</xsd:complexType>
83+
</xsd:element>
84+
<xsd:element name="data">
85+
<xsd:complexType>
86+
<xsd:sequence>
87+
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
88+
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
89+
</xsd:sequence>
90+
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
91+
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
92+
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
93+
<xsd:attribute ref="xml:space" />
94+
</xsd:complexType>
95+
</xsd:element>
96+
<xsd:element name="resheader">
97+
<xsd:complexType>
98+
<xsd:sequence>
99+
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
100+
</xsd:sequence>
101+
<xsd:attribute name="name" type="xsd:string" use="required" />
102+
</xsd:complexType>
103+
</xsd:element>
104+
</xsd:choice>
105+
</xsd:complexType>
106+
</xsd:element>
107+
</xsd:schema>
108+
<resheader name="resmimetype">
109+
<value>text/microsoft-resx</value>
110+
</resheader>
111+
<resheader name="version">
112+
<value>2.0</value>
113+
</resheader>
114+
<resheader name="reader">
115+
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
116+
</resheader>
117+
<resheader name="writer">
118+
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
119+
</resheader>
120+
<data name="BindingTestTextBox.Header" xml:space="preserve">
121+
<value>Binding test</value>
122+
</data>
123+
<data name="FilteringBehaviorTextBox.Header" xml:space="preserve">
124+
<value>Filtering behavior</value>
125+
</data>
126+
<data name="LocalEndComboBox.Header" xml:space="preserve">
127+
<value>Local end</value>
128+
</data>
129+
<data name="LocalEndComboBox.PlaceholderText" xml:space="preserve">
130+
<value>Any</value>
131+
</data>
132+
<data name="MappingBehaviorTextBox.Header" xml:space="preserve">
133+
<value>Mapping behavior</value>
134+
</data>
135+
<data name="NoProxy.Content" xml:space="preserve">
136+
<value>Don't use Proxy</value>
137+
</data>
138+
<data name="OK" xml:space="preserve">
139+
<value>OK</value>
140+
</data>
141+
<data name="ProxyPasswordTextBox.Header" xml:space="preserve">
142+
<value>Password</value>
143+
</data>
144+
<data name="ProxyRadioButtons.Header" xml:space="preserve">
145+
<value>Proxy</value>
146+
</data>
147+
<data name="ProxyServerTextBox.Header" xml:space="preserve">
148+
<value>Server</value>
149+
</data>
150+
<data name="ProxyUsernameTextBox.Header" xml:space="preserve">
151+
<value>Username</value>
152+
</data>
153+
<data name="PublicEndTextBox.Header" xml:space="preserve">
154+
<value>Public end</value>
155+
</data>
156+
<data name="RFC3489NatTypeTextBox.Header" xml:space="preserve">
157+
<value>NAT type</value>
158+
</data>
159+
<data name="RFC3489Warning.Message" xml:space="preserve">
160+
<value>This protocol is obsoleted and may not be suitable for modern routers or NAT.</value>
161+
</data>
162+
<data name="ServersComboBox.Header" xml:space="preserve">
163+
<value>STUN Server</value>
164+
</data>
165+
<data name="SOCKS5Proxy.Content" xml:space="preserve">
166+
<value>SOCKS5</value>
167+
</data>
168+
<data name="TestButton.Content" xml:space="preserve">
169+
<value>Test</value>
170+
</data>
171+
<data name="Unknown proxy address" xml:space="preserve">
172+
<value>Unknown proxy address</value>
173+
</data>
174+
<data name="Wrong STUN Server!" xml:space="preserve">
175+
<value>Wrong STUN Server!</value>
176+
</data>
177+
</root>

0 commit comments

Comments
 (0)