44 push :
55 tags :
66 - ' v*'
7+ workflow_dispatch :
78
89permissions :
910 contents : write
@@ -28,79 +29,83 @@ jobs:
2829 with :
2930 dotnet-version : ${{ env.DOTNET_VERSION }}
3031
31- - name : Resolve package version
32+ - name : Setup MSBuild
33+ uses : microsoft/setup-msbuild@v2
34+
35+ - name : Resolve release version
3236 shell : pwsh
3337 run : |
3438 $version = "${{ github.ref_name }}"
39+ if ($version -eq "main" -or $version -eq "master") {
40+ $version = "0.0.0-ci"
41+ }
3542 if ($version.StartsWith("v")) {
3643 $version = $version.Substring(1)
3744 }
3845
3946 "PACKAGE_VERSION=$version" >> $env:GITHUB_ENV
47+ "RELEASE_TAG=${{ github.ref_name }}" >> $env:GITHUB_ENV
4048
41- - name : Restore
49+ - name : Restore solution
4250 run : dotnet restore Lizerium.Localization.Toolkit.sln
4351
44- - name : Build Core
45- run : dotnet build src/ Lizerium.Localization.Core/Lizerium.Localization.Core.csproj -c ${{ env.CONFIGURATION }} --no-restore
52+ - name : Build solution
53+ run : dotnet build Lizerium.Localization.Toolkit.sln -c ${{ env.CONFIGURATION }} --no-restore
4654
47- - name : Build Generator
48- run : dotnet build src/Lizerium.Localization.Generator/Lizerium.Localization.Generator.csproj -c ${{ env.CONFIGURATION }} --no-restore
55+ - name : Test AI localization
56+ run : >
57+ dotnet test src/Lizerium.AI.LocalizationAssistant.Tests/Lizerium.AI.LocalizationAssistant.Tests.csproj
58+ -c ${{ env.CONFIGURATION }}
59+ --no-restore
60+ --no-build
4961
50- - name : Build Analyzer
51- run : dotnet build src/Lizerium.Localization.Analyzer/Lizerium.Localization.Analyzer.csproj -c ${{ env.CONFIGURATION }} --no-restore
62+ - name : Pack NuGet packages
63+ shell : pwsh
64+ run : |
65+ New-Item -ItemType Directory -Force artifacts/nuget | Out-Null
5266
53- - name : Build GUI
54- run : dotnet build src/Lizerium.Localization.GUI/Lizerium.Localization.GUI.csproj -c ${{ env.CONFIGURATION }} --no-restore
67+ $projects = @(
68+ "src/Lizerium.Localization.Core/Lizerium.Localization.Core.csproj",
69+ "src/Lizerium.AI.LocalizationAssistant.Core/Lizerium.AI.LocalizationAssistant.Core.csproj",
70+ "src/Lizerium.Localization.Generator/Lizerium.Localization.Generator.csproj",
71+ "src/Lizerium.Localization.Analyzer/Lizerium.Localization.Analyzer.csproj",
72+ "src/Lizerium.Localization.Ai.Analyzer/Lizerium.Localization.Ai.Analyzer.csproj",
73+ "src/Lizerium.Localization.Toolkit/Lizerium.Localization.Toolkit.csproj",
74+ "src/Lizerium.Localization.GUI/Lizerium.Localization.GUI.csproj"
75+ )
76+
77+ foreach ($project in $projects) {
78+ dotnet pack $project `
79+ -c $env:CONFIGURATION `
80+ -p:Version=$env:PACKAGE_VERSION `
81+ -p:PackageVersion=$env:PACKAGE_VERSION `
82+ -o artifacts/nuget `
83+ --no-restore `
84+ --no-build
85+ }
5586
56- - name : Build Sample
57- run : dotnet build samples/WpfSampleApp/WpfSampleApp.csproj -c ${{ env.CONFIGURATION }} --no-restore
87+ - name : Build VSIX
88+ shell : pwsh
89+ run : |
90+ New-Item -ItemType Directory -Force artifacts/vsix | Out-Null
91+
92+ msbuild src/Lizerium.Localization.Xaml.Vsix/Lizerium.Localization.Xaml.Vsix.csproj `
93+ /t:Build `
94+ /p:Configuration=$env:CONFIGURATION `
95+ /p:RestorePackages=false `
96+ /p:Version=$env:PACKAGE_VERSION `
97+ /v:minimal
98+
99+ Copy-Item `
100+ src/Lizerium.Localization.Xaml.Vsix/bin/$env:CONFIGURATION/net472/Lizerium.Localization.Xaml.Vsix.vsix `
101+ artifacts/vsix/Lizerium.Localization.Xaml.Vsix-$env:RELEASE_TAG.vsix `
102+ -Force
58103
59104 - name : Restore publish projects
60105 run : |
61106 dotnet restore src/Lizerium.Localization.GUI/Lizerium.Localization.GUI.csproj -r ${{ env.RID }}
62107 dotnet restore samples/WpfSampleApp/WpfSampleApp.csproj -r ${{ env.RID }}
63108
64- - name : Pack NuGet packages
65- shell : pwsh
66- run : |
67- New-Item -ItemType Directory -Force artifacts/nuget | Out-Null
68-
69- dotnet pack src/Lizerium.Localization.Core/Lizerium.Localization.Core.csproj `
70- -c $env:CONFIGURATION `
71- -p:Version=$env:PACKAGE_VERSION `
72- -p:PackageVersion=$env:PACKAGE_VERSION `
73- -o artifacts/nuget `
74- --no-restore
75-
76- dotnet pack src/Lizerium.Localization.Generator/Lizerium.Localization.Generator.csproj `
77- -c $env:CONFIGURATION `
78- -p:Version=$env:PACKAGE_VERSION `
79- -p:PackageVersion=$env:PACKAGE_VERSION `
80- -o artifacts/nuget `
81- --no-restore
82-
83- dotnet pack src/Lizerium.Localization.Analyzer/Lizerium.Localization.Analyzer.csproj `
84- -c $env:CONFIGURATION `
85- -p:Version=$env:PACKAGE_VERSION `
86- -p:PackageVersion=$env:PACKAGE_VERSION `
87- -o artifacts/nuget `
88- --no-restore
89-
90- dotnet pack src/Lizerium.Localization.Toolkit/Lizerium.Localization.Toolkit.csproj `
91- -c $env:CONFIGURATION `
92- -p:Version=$env:PACKAGE_VERSION `
93- -p:PackageVersion=$env:PACKAGE_VERSION `
94- -o artifacts/nuget `
95- --no-restore
96-
97- dotnet pack src/Lizerium.Localization.GUI/Lizerium.Localization.GUI.csproj `
98- -c $env:CONFIGURATION `
99- -p:Version=$env:PACKAGE_VERSION `
100- -p:PackageVersion=$env:PACKAGE_VERSION `
101- -o artifacts/nuget `
102- --no-restore
103-
104109 - name : Publish GUI
105110 run : >
106111 dotnet publish src/Lizerium.Localization.GUI/Lizerium.Localization.GUI.csproj
@@ -130,7 +135,7 @@ jobs:
130135 - name : Pack release assets
131136 shell : pwsh
132137 run : |
133- $tag = "${{ github.ref_name }}"
138+ $tag = $env:RELEASE_TAG
134139 $prefix = "${{ env.ARTIFACT_PREFIX }}"
135140 New-Item -ItemType Directory -Force artifacts/release | Out-Null
136141
@@ -154,83 +159,81 @@ jobs:
154159 -DestinationPath "artifacts/release/$prefix-SampleSource-$tag.zip" `
155160 -Force
156161
162+ Copy-Item artifacts/vsix/*.vsix artifacts/release/ -Force
163+
157164 Get-ChildItem artifacts/release -File |
158165 Get-FileHash -Algorithm SHA256 |
159166 ForEach-Object { "$($_.Hash) $(Split-Path $_.Path -Leaf)" } |
160167 Set-Content "artifacts/release/SHA256SUMS.txt" -Encoding UTF8
161168
162- $releaseNotes = @'
163- ## Lizerium.Localization.Toolkit __TAG__
164-
165- A localization workflow for .NET/WPF projects based on `.resx` files.
166-
167- Рабочий набор локализации для .NET/WPF проектов на основе `.resx` файлов.
169+ $releaseNotes = @"
170+ ## Lizerium.Localization.Toolkit $tag
168171
169- ---
172+ A release for the `.resx` localization workflow: runtime, source generator, analyzers, AI translation helpers, GUI editor, sample app, and Visual Studio XAML VSIX.
170173
171- ### Included in this release
174+ ### Included
172175
173- - NuGet packages for Toolkit, Core, Generator, Analyzer, and GUI
176+ - NuGet packages: Toolkit, Core, AI Core, Generator, Analyzer, AI Analyzer, GUI
177+ - Visual Studio 2022 VSIX: `Lizerium.Localization.Xaml.Vsix-$tag.vsix`
174178 - Windows x64 standalone GUI editor
175179 - Windows x64 published WPF sample application
176180 - Sample project source archive
177181 - SHA-256 checksums
178182
179- ### Что входит в релиз
183+ ### VSIX
180184
181- - NuGet-пакеты для Toolkit, Core, Generator, Analyzer и GUI
182- - Самостоятельная Windows x64 сборка GUI-редактора
183- - Опубликованная Windows x64 сборка WPF sample-приложения
184- - Архив исходников sample-проекта
185- - SHA-256 checksums
185+ The VSIX is a standalone Visual Studio editor extension. It is not a runtime dependency of target applications.
186186
187- ---
187+ It converts WPF XAML literals into localization markup, writes `Resources/Localization/Strings.en.resx` and `Strings.ru.resx`, and generates translations through Ollama with LibreTranslate fallback.
188188
189- ### Install package
189+ Runtime behavior:
190190
191- ```powershell
192- dotnet nuget add source .\packages -n LizeriumLocal
193- dotnet add path\to\YourProject.csproj package Lizerium.Localization.Toolkit --version __VERSION__ --source .\packages
194- ```
191+ - If the target project already has `LocExtension`, the VSIX reuses it.
192+ - If the target project has no `LocExtension`, the VSIX adds a small source-only runtime under `LizeriumGenerated/Localization`.
193+ - Generated keys are ASCII and stable; translated text is written only into RESX values.
195194
196- ### Установка пакета
195+ ### NuGet Compatibility
197196
198- ```powershell
199- dotnet nuget add source .\packages -n LizeriumLocal
200- dotnet add path\to\YourProject.csproj package Lizerium.Localization.Toolkit --version __VERSION__ --source .\packages
201- ```
197+ The VSIX does not conflict with `Lizerium.Localization.Toolkit`.
202198
203- ---
199+ With the NuGet package installed, the project already has runtime localization support, generator, and analyzers. The VSIX only edits XAML and RESX files. It does not add a PackageReference and does not replace the NuGet runtime.
204200
205- ### GUI usage
206-
207- Download the GUI archive, extract it, and run:
201+ ### Install NuGet From The Release Archive
208202
209203 ```powershell
210- .\Lizerium.Localization.GUI.exe
204+ Expand-Archive .\$prefix-NuGet-$tag.zip .\packages
205+ dotnet nuget add source .\packages -n LizeriumLocal
206+ dotnet add path\to\YourProject.csproj package Lizerium.Localization.Toolkit --version $env:PACKAGE_VERSION --source .\packages
211207 ```
212208
213- The editor can be registered in Visual Studio through `Tools -> External Tools...` with `$(ProjectDir)` as the argument.
209+ ### Install VSIX
214210
215- ### Использование GUI
211+ Download `Lizerium.Localization.Xaml.Vsix-$tag.vsix`, close Visual Studio, install it, then reopen Visual Studio.
216212
217- Скачай архив GUI, распакуй его и запусти:
213+ ### GUI Usage
214+
215+ Download the GUI archive, extract it, and run:
218216
219217 ```powershell
220218 .\Lizerium.Localization.GUI.exe
221219 ```
220+ "@
222221
223- Редактор можно добавить в Visual Studio через `Tools -> External Tools...`, передав `$(ProjectDir)` как аргумент.
224- '@
225-
226- $releaseNotes = $releaseNotes.Replace("__TAG__", $tag).Replace("__VERSION__", $env:PACKAGE_VERSION)
227222 $releaseNotes | Set-Content "artifacts/release/RELEASE_NOTES.md" -Encoding UTF8
228223
229- - name : Upload Release
224+ - name : Upload build artifacts
225+ uses : actions/upload-artifact@v4
226+ with :
227+ name : release-assets-${{ github.ref_name }}
228+ path : artifacts/release/*
229+
230+ - name : Upload GitHub Release
231+ if : startsWith(github.ref, 'refs/tags/')
230232 uses : softprops/action-gh-release@v2
231233 with :
232234 generate_release_notes : true
233235 body_path : artifacts/release/RELEASE_NOTES.md
234236 files : |
235237 artifacts/release/*.zip
238+ artifacts/release/*.vsix
236239 artifacts/release/SHA256SUMS.txt
0 commit comments