Skip to content

Commit b9143c8

Browse files
committed
1.0.1.vsix.ai
1 parent 509b614 commit b9143c8

17 files changed

Lines changed: 670 additions & 243 deletions

File tree

‎.github/workflows/release.yml‎

Lines changed: 95 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ on:
44
push:
55
tags:
66
- 'v*'
7+
workflow_dispatch:
78

89
permissions:
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

‎samples/WpfSampleApp/MainWindow.xaml.cs‎

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,5 @@ private void Render()
4444
{
4545
TitleText.Text = L.MainWindow.Title();
4646
MessageText.Text = L.MainWindow.Log.DirectoryCorrect(AppContext.BaseDirectory);
47-
48-
// These calls demonstrate CodeFix-generated keys for parameterless and parameterized values.
49-
var msgLog = L.MainWindow.TestMsgLog();
50-
var paramMsgLog = L.MainWindow.TestParam.CreateValue(AppContext.BaseDirectory, "param2", 5);
51-
var test = L.MainWindow.Render.Text2();
52-
var testParams = L.MainWindow.Render.Text1(AppContext.BaseDirectory, 5);
53-
var test2 = L.MainWindow.Render.Text3();
54-
var test3 = L.MainWindow.Render.Text4(AppContext.BaseDirectory);
55-
var test4 = L.MainWindow.Render.Text5();
56-
var test5Params = L.MainWindow.Render.Text6(AppContext.BaseDirectory);
57-
var test6 = L.MainWindow.Render.Text7();
58-
var test7Param = L.MainWindow.Render.Text8(AppContext.BaseDirectory);
59-
MessageText.Text = test7Param;
6047
}
6148
}

‎samples/WpfSampleApp/Resources/Localization/Strings.en.resx‎

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -120,40 +120,10 @@
120120
<data name="MainWindow_Title" xml:space="preserve">
121121
<value>Lizerium localization sample</value>
122122
</data>
123-
<data name="MainWindow_TestMsgLog" xml:space="preserve">
124-
<value>TODO</value>
125-
</data>
126-
<data name="MainWindow_TestParam_CreateValue_Format" xml:space="preserve">
127-
<value>TODO {0} {1} {2}</value>
128-
</data>
129123
<data name="MainWindow_Log_DirectoryCorrect_Format" xml:space="preserve">
130124
<value>Directory is correct: {0}</value>
131125
</data>
132-
<data name="MainWindow_Render_Text1_Format" xml:space="preserve">
133-
<value>Log directory: {0} | {1}</value>
134-
</data>
135-
<data name="MainWindow_Render_Text2" xml:space="preserve">
136-
<value>Hello World</value>
137-
</data>
138-
<data name="MainWindow_Render_Text3" xml:space="preserve">
139-
<value>string</value>
140-
</data>
141-
<data name="MainWindow_Render_Text4_Format" xml:space="preserve">
142-
<value>Test string with parameter {0}</value>
143-
</data>
144-
<data name="MainWindow_Render_Text5" xml:space="preserve">
145-
<value>Hi, how are you?</value>
146-
</data>
147-
<data name="MainWindow_Render_Text6_Format" xml:space="preserve">
148-
<value>Hello {0}</value>
149-
</data>
150126
<data name="MainWindow_Button_Content_English" xml:space="preserve">
151127
<value>English</value>
152128
</data>
153-
<data name="MainWindow_Render_Text7" xml:space="preserve">
154-
<value>I love Kariana</value>
155-
</data>
156-
<data name="MainWindow_Render_Text8_Format" xml:space="preserve">
157-
<value>I love Karianna very much: {0}</value>
158-
</data>
159129
</root>

‎samples/WpfSampleApp/Resources/Localization/Strings.ru.resx‎

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -120,40 +120,10 @@
120120
<data name="MainWindow_Title" xml:space="preserve">
121121
<value>Пример локализации Lizerium</value>
122122
</data>
123-
<data name="MainWindow_TestMsgLog" xml:space="preserve">
124-
<value>TODO</value>
125-
</data>
126-
<data name="MainWindow_TestParam_CreateValue_Format" xml:space="preserve">
127-
<value>TODO {0} {1} {2}</value>
128-
</data>
129123
<data name="MainWindow_Log_DirectoryCorrect_Format" xml:space="preserve">
130124
<value>Директория корректна: {0}</value>
131125
</data>
132-
<data name="MainWindow_Render_Text1_Format" xml:space="preserve">
133-
<value>Папка логов: {0} | {1}</value>
134-
</data>
135-
<data name="MainWindow_Render_Text2" xml:space="preserve">
136-
<value>Привет世界</value>
137-
</data>
138-
<data name="MainWindow_Render_Text3" xml:space="preserve">
139-
<value>строка для тестирования</value>
140-
</data>
141-
<data name="MainWindow_Render_Text4_Format" xml:space="preserve">
142-
<value>Тестирование строки с параметром {0}</value>
143-
</data>
144-
<data name="MainWindow_Render_Text5" xml:space="preserve">
145-
<value>Привет, как дела?</value>
146-
</data>
147-
<data name="MainWindow_Render_Text6_Format" xml:space="preserve">
148-
<value>Привет {0}</value>
149-
</data>
150126
<data name="MainWindow_Button_Content_English" xml:space="preserve">
151127
<value>Английский</value>
152128
</data>
153-
<data name="MainWindow_Render_Text7" xml:space="preserve">
154-
<value>Я люблю Карину</value>
155-
</data>
156-
<data name="MainWindow_Render_Text8_Format" xml:space="preserve">
157-
<value>Я люблю карину очень сильно: {0}</value>
158-
</data>
159129
</root>

‎src/Lizerium.AI.LocalizationAssistant.Core/Clients/Libre/LibreTranslateClient.cs‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@
66
* Version: 1.0.8
77
*/
88

9-
using System.Text.Json;
10-
119
using Lizerium.AI.LocalizationAssistant.Core.Components.Ollama;
10+
using Lizerium.AI.LocalizationAssistant.Core.Services;
1211

1312
namespace Lizerium.AI.LocalizationAssistant.Core.Clients.Libre
1413
{
@@ -44,8 +43,9 @@ public async Task<string> TranslateAsync(
4443

4544
var json = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
4645

47-
var doc = JsonDocument.Parse(json);
48-
return doc.RootElement.GetProperty("translatedText").GetString() ?? text;
46+
return SimpleJson.TryGetString(json, "translatedText", out var translated)
47+
? translated
48+
: text;
4949
}
5050
}
5151
}

0 commit comments

Comments
 (0)