Skip to content

Commit 387b68c

Browse files
committed
Merge branch 'release/v2025.14'
2 parents 61a1b13 + 550c108 commit 387b68c

File tree

166 files changed

+3257
-1339
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

166 files changed

+3257
-1339
lines changed

.github/workflows/build.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ jobs:
5858
if: ${{ matrix.runtime == 'linux-arm64' }}
5959
run: |
6060
sudo apt-get update
61-
sudo apt-get install -y llvm gcc-aarch64-linux-gnu zlib1g-dev:arm64
61+
sudo apt-get install -y llvm gcc-aarch64-linux-gnu
6262
- name: Build
6363
run: dotnet build -c Release
6464
- name: Publish

.github/workflows/localization-check.yml

+2-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ on:
44
branches: [ develop ]
55
paths:
66
- 'src/Resources/Locales/**'
7-
- 'README.md'
87
workflow_dispatch:
98
workflow_call:
109

@@ -32,8 +31,8 @@ jobs:
3231
git config --global user.name 'github-actions[bot]'
3332
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
3433
if [ -n "$(git status --porcelain)" ]; then
35-
git add README.md TRANSLATION.md
36-
git commit -m 'doc: Update translation status and missing keys'
34+
git add TRANSLATION.md src/Resources/Locales/*.axaml
35+
git commit -m 'doc: Update translation status and sort locale files'
3736
git push
3837
else
3938
echo "No changes to commit"

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* Supports Windows/macOS/Linux
1212
* Opensource/Free
1313
* Fast
14-
* Deutsch/English/Español/Français/Italiano/Português/Русский/简体中文/繁體中文/日本語/தமிழ் (Tamil)
14+
* Deutsch/English/Español/Français/Italiano/Português/Русский/Українська/简体中文/繁體中文/日本語/தமிழ் (Tamil)
1515
* Built-in light/dark themes
1616
* Customize theme
1717
* Visual commit graph
@@ -35,6 +35,7 @@
3535
* Revision Diffs
3636
* Branch Diff
3737
* Image Diff - Side-By-Side/Swipe/Blend
38+
* Git command logs
3839
* Search commits
3940
* GitFlow
4041
* Git LFS

TRANSLATION.md

+103-18
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@ This document shows the translation status of each locale file in the repository
66

77
### ![en_US](https://img.shields.io/badge/en__US-%E2%88%9A-brightgreen)
88

9-
### ![de__DE](https://img.shields.io/badge/de__DE-97.34%25-yellow)
9+
### ![de__DE](https://img.shields.io/badge/de__DE-96.19%25-yellow)
1010

1111
<details>
1212
<summary>Missing keys in de_DE.axaml</summary>
1313

1414
- Text.BranchUpstreamInvalid
15+
- Text.CommitCM.CopyAuthor
16+
- Text.CommitCM.CopyCommitter
17+
- Text.CommitCM.CopySubject
18+
- Text.CommitMessageTextBox.SubjectCount
1519
- Text.Configure.CustomAction.WaitForExit
1620
- Text.Configure.Git.PreferredMergeMode
1721
- Text.Configure.IssueTracker.AddSampleAzure
@@ -25,7 +29,12 @@ This document shows the translation status of each locale file in the repository
2529
- Text.Preferences.AI.Streaming
2630
- Text.Preferences.Appearance.EditorTabWidth
2731
- Text.Preferences.General.ShowTagsInGraph
32+
- Text.Repository.ViewLogs
2833
- Text.StashCM.SaveAsPatch
34+
- Text.ViewLogs
35+
- Text.ViewLogs.Clear
36+
- Text.ViewLogs.CopyLog
37+
- Text.ViewLogs.Delete
2938
- Text.WorkingCopy.ConfirmCommitWithFilter
3039
- Text.WorkingCopy.Conflicts.OpenExternalMergeTool
3140
- Text.WorkingCopy.Conflicts.OpenExternalMergeToolAllConflicts
@@ -34,34 +43,41 @@ This document shows the translation status of each locale file in the repository
3443

3544
</details>
3645

37-
### ![es__ES](https://img.shields.io/badge/es__ES-98.67%25-yellow)
46+
### ![es__ES](https://img.shields.io/badge/es__ES-98.95%25-yellow)
3847

3948
<details>
4049
<summary>Missing keys in es_ES.axaml</summary>
4150

42-
- Text.Configure.Git.PreferredMergeMode
43-
- Text.ConfirmEmptyCommit.Continue
44-
- Text.ConfirmEmptyCommit.NoLocalChanges
45-
- Text.ConfirmEmptyCommit.StageAllThenCommit
46-
- Text.ConfirmEmptyCommit.WithLocalChanges
47-
- Text.WorkingCopy.ConfirmCommitWithFilter
48-
- Text.WorkingCopy.Conflicts.OpenExternalMergeTool
49-
- Text.WorkingCopy.Conflicts.OpenExternalMergeToolAllConflicts
50-
- Text.WorkingCopy.Conflicts.UseMine
51-
- Text.WorkingCopy.Conflicts.UseTheirs
51+
- Text.CommitCM.CopyAuthor
52+
- Text.CommitCM.CopyCommitter
53+
- Text.CommitCM.CopySubject
54+
- Text.Repository.ViewLogs
55+
- Text.ViewLogs
56+
- Text.ViewLogs.Clear
57+
- Text.ViewLogs.CopyLog
58+
- Text.ViewLogs.Delete
5259

5360
</details>
5461

55-
### ![fr__FR](https://img.shields.io/badge/fr__FR-98.67%25-yellow)
62+
### ![fr__FR](https://img.shields.io/badge/fr__FR-97.51%25-yellow)
5663

5764
<details>
5865
<summary>Missing keys in fr_FR.axaml</summary>
5966

67+
- Text.CommitCM.CopyAuthor
68+
- Text.CommitCM.CopyCommitter
69+
- Text.CommitCM.CopySubject
70+
- Text.CommitMessageTextBox.SubjectCount
6071
- Text.Configure.Git.PreferredMergeMode
6172
- Text.ConfirmEmptyCommit.Continue
6273
- Text.ConfirmEmptyCommit.NoLocalChanges
6374
- Text.ConfirmEmptyCommit.StageAllThenCommit
6475
- Text.ConfirmEmptyCommit.WithLocalChanges
76+
- Text.Repository.ViewLogs
77+
- Text.ViewLogs
78+
- Text.ViewLogs.Clear
79+
- Text.ViewLogs.CopyLog
80+
- Text.ViewLogs.Delete
6581
- Text.WorkingCopy.ConfirmCommitWithFilter
6682
- Text.WorkingCopy.Conflicts.OpenExternalMergeTool
6783
- Text.WorkingCopy.Conflicts.OpenExternalMergeToolAllConflicts
@@ -70,18 +86,27 @@ This document shows the translation status of each locale file in the repository
7086

7187
</details>
7288

73-
### ![it__IT](https://img.shields.io/badge/it__IT-98.40%25-yellow)
89+
### ![it__IT](https://img.shields.io/badge/it__IT-97.24%25-yellow)
7490

7591
<details>
7692
<summary>Missing keys in it_IT.axaml</summary>
7793

94+
- Text.CommitCM.CopyAuthor
95+
- Text.CommitCM.CopyCommitter
96+
- Text.CommitCM.CopySubject
97+
- Text.CommitMessageTextBox.SubjectCount
7898
- Text.Configure.Git.PreferredMergeMode
7999
- Text.ConfirmEmptyCommit.Continue
80100
- Text.ConfirmEmptyCommit.NoLocalChanges
81101
- Text.ConfirmEmptyCommit.StageAllThenCommit
82102
- Text.ConfirmEmptyCommit.WithLocalChanges
83103
- Text.CopyFullPath
84104
- Text.Preferences.General.ShowTagsInGraph
105+
- Text.Repository.ViewLogs
106+
- Text.ViewLogs
107+
- Text.ViewLogs.Clear
108+
- Text.ViewLogs.CopyLog
109+
- Text.ViewLogs.Delete
85110
- Text.WorkingCopy.ConfirmCommitWithFilter
86111
- Text.WorkingCopy.Conflicts.OpenExternalMergeTool
87112
- Text.WorkingCopy.Conflicts.OpenExternalMergeToolAllConflicts
@@ -90,18 +115,27 @@ This document shows the translation status of each locale file in the repository
90115

91116
</details>
92117

93-
### ![ja__JP](https://img.shields.io/badge/ja__JP-98.40%25-yellow)
118+
### ![ja__JP](https://img.shields.io/badge/ja__JP-97.24%25-yellow)
94119

95120
<details>
96121
<summary>Missing keys in ja_JP.axaml</summary>
97122

123+
- Text.CommitCM.CopyAuthor
124+
- Text.CommitCM.CopyCommitter
125+
- Text.CommitCM.CopySubject
126+
- Text.CommitMessageTextBox.SubjectCount
98127
- Text.Configure.Git.PreferredMergeMode
99128
- Text.ConfirmEmptyCommit.Continue
100129
- Text.ConfirmEmptyCommit.NoLocalChanges
101130
- Text.ConfirmEmptyCommit.StageAllThenCommit
102131
- Text.ConfirmEmptyCommit.WithLocalChanges
103132
- Text.Repository.FilterCommits
104133
- Text.Repository.Tags.OrderByNameDes
134+
- Text.Repository.ViewLogs
135+
- Text.ViewLogs
136+
- Text.ViewLogs.Clear
137+
- Text.ViewLogs.CopyLog
138+
- Text.ViewLogs.Delete
105139
- Text.WorkingCopy.ConfirmCommitWithFilter
106140
- Text.WorkingCopy.Conflicts.OpenExternalMergeTool
107141
- Text.WorkingCopy.Conflicts.OpenExternalMergeToolAllConflicts
@@ -110,7 +144,7 @@ This document shows the translation status of each locale file in the repository
110144

111145
</details>
112146

113-
### ![pt__BR](https://img.shields.io/badge/pt__BR-89.76%25-yellow)
147+
### ![pt__BR](https://img.shields.io/badge/pt__BR-88.71%25-yellow)
114148

115149
<details>
116150
<summary>Missing keys in pt_BR.axaml</summary>
@@ -125,10 +159,14 @@ This document shows the translation status of each locale file in the repository
125159
- Text.BranchCM.MergeMultiBranches
126160
- Text.BranchUpstreamInvalid
127161
- Text.Clone.RecurseSubmodules
162+
- Text.CommitCM.CopyAuthor
163+
- Text.CommitCM.CopyCommitter
164+
- Text.CommitCM.CopySubject
128165
- Text.CommitCM.Merge
129166
- Text.CommitCM.MergeMultiple
130167
- Text.CommitDetail.Files.Search
131168
- Text.CommitDetail.Info.Children
169+
- Text.CommitMessageTextBox.SubjectCount
132170
- Text.Configure.CustomAction.Scope.Branch
133171
- Text.Configure.CustomAction.WaitForExit
134172
- Text.Configure.Git.PreferredMergeMode
@@ -177,6 +215,7 @@ This document shows the translation status of each locale file in the repository
177215
- Text.Repository.Tags.OrderByNameDes
178216
- Text.Repository.Tags.Sort
179217
- Text.Repository.UseRelativeTimeInHistories
218+
- Text.Repository.ViewLogs
180219
- Text.SetUpstream
181220
- Text.SetUpstream.Local
182221
- Text.SetUpstream.Unset
@@ -185,6 +224,10 @@ This document shows the translation status of each locale file in the repository
185224
- Text.Stash.AutoRestore
186225
- Text.Stash.AutoRestore.Tip
187226
- Text.StashCM.SaveAsPatch
227+
- Text.ViewLogs
228+
- Text.ViewLogs.Clear
229+
- Text.ViewLogs.CopyLog
230+
- Text.ViewLogs.Delete
188231
- Text.WorkingCopy.CommitToEdit
189232
- Text.WorkingCopy.ConfirmCommitWithFilter
190233
- Text.WorkingCopy.Conflicts.OpenExternalMergeTool
@@ -195,26 +238,68 @@ This document shows the translation status of each locale file in the repository
195238

196239
</details>
197240

198-
### ![ru__RU](https://img.shields.io/badge/ru__RU-%E2%88%9A-brightgreen)
241+
### ![ru__RU](https://img.shields.io/badge/ru__RU-98.82%25-yellow)
199242

200-
### ![ta__IN](https://img.shields.io/badge/ta__IN-98.67%25-yellow)
243+
<details>
244+
<summary>Missing keys in ru_RU.axaml</summary>
245+
246+
- Text.CommitCM.CopyAuthor
247+
- Text.CommitCM.CopyCommitter
248+
- Text.CommitCM.CopySubject
249+
- Text.CommitMessageTextBox.SubjectCount
250+
- Text.Repository.ViewLogs
251+
- Text.ViewLogs
252+
- Text.ViewLogs.Clear
253+
- Text.ViewLogs.CopyLog
254+
- Text.ViewLogs.Delete
255+
256+
</details>
257+
258+
### ![ta__IN](https://img.shields.io/badge/ta__IN-97.51%25-yellow)
201259

202260
<details>
203261
<summary>Missing keys in ta_IN.axaml</summary>
204262

263+
- Text.CommitCM.CopyAuthor
264+
- Text.CommitCM.CopyCommitter
265+
- Text.CommitCM.CopySubject
266+
- Text.CommitMessageTextBox.SubjectCount
205267
- Text.Configure.Git.PreferredMergeMode
206268
- Text.ConfirmEmptyCommit.Continue
207269
- Text.ConfirmEmptyCommit.NoLocalChanges
208270
- Text.ConfirmEmptyCommit.StageAllThenCommit
209271
- Text.ConfirmEmptyCommit.WithLocalChanges
272+
- Text.Repository.ViewLogs
210273
- Text.UpdateSubmodules.Target
274+
- Text.ViewLogs
275+
- Text.ViewLogs.Clear
276+
- Text.ViewLogs.CopyLog
277+
- Text.ViewLogs.Delete
211278
- Text.WorkingCopy.Conflicts.OpenExternalMergeTool
212279
- Text.WorkingCopy.Conflicts.OpenExternalMergeToolAllConflicts
213280
- Text.WorkingCopy.Conflicts.UseMine
214281
- Text.WorkingCopy.Conflicts.UseTheirs
215282

216283
</details>
217284

285+
### ![uk__UA](https://img.shields.io/badge/uk__UA-98.69%25-yellow)
286+
287+
<details>
288+
<summary>Missing keys in uk_UA.axaml</summary>
289+
290+
- Text.CommitCM.CopyAuthor
291+
- Text.CommitCM.CopyCommitter
292+
- Text.CommitCM.CopySubject
293+
- Text.CommitMessageTextBox.SubjectCount
294+
- Text.ConfigureWorkspace.Name
295+
- Text.Repository.ViewLogs
296+
- Text.ViewLogs
297+
- Text.ViewLogs.Clear
298+
- Text.ViewLogs.CopyLog
299+
- Text.ViewLogs.Delete
300+
301+
</details>
302+
218303
### ![zh__CN](https://img.shields.io/badge/zh__CN-%E2%88%9A-brightgreen)
219304

220305
### ![zh__TW](https://img.shields.io/badge/zh__TW-%E2%88%9A-brightgreen)

VERSION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2025.13
1+
2025.14

build/scripts/localization-check.js

+32-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,22 @@ async function parseXml(filePath) {
1414
return parser.parseStringPromise(data);
1515
}
1616

17+
async function filterAndSortTranslations(localeData, enUSKeys, enUSData) {
18+
const strings = localeData.ResourceDictionary['x:String'];
19+
// Remove keys that don't exist in English file
20+
const filtered = strings.filter(item => enUSKeys.has(item.$['x:Key']));
21+
22+
// Sort based on the key order in English file
23+
const enUSKeysArray = enUSData.ResourceDictionary['x:String'].map(item => item.$['x:Key']);
24+
filtered.sort((a, b) => {
25+
const aIndex = enUSKeysArray.indexOf(a.$['x:Key']);
26+
const bIndex = enUSKeysArray.indexOf(b.$['x:Key']);
27+
return aIndex - bIndex;
28+
});
29+
30+
return filtered;
31+
}
32+
1733
async function calculateTranslationRate() {
1834
const enUSData = await parseXml(enUSFile);
1935
const enUSKeys = new Set(enUSData.ResourceDictionary['x:String'].map(item => item.$['x:Key']));
@@ -33,6 +49,21 @@ async function calculateTranslationRate() {
3349
const localeKeys = new Set(localeData.ResourceDictionary['x:String'].map(item => item.$['x:Key']));
3450
const missingKeys = [...enUSKeys].filter(key => !localeKeys.has(key));
3551

52+
// Sort and clean up extra translations
53+
const sortedAndCleaned = await filterAndSortTranslations(localeData, enUSKeys, enUSData);
54+
localeData.ResourceDictionary['x:String'] = sortedAndCleaned;
55+
56+
// Save the updated file
57+
const builder = new xml2js.Builder({
58+
headless: true,
59+
renderOpts: { pretty: true, indent: ' ' }
60+
});
61+
let xmlStr = builder.buildObject(localeData);
62+
63+
// Add an empty line before the first x:String
64+
xmlStr = xmlStr.replace(' <x:String', '\n <x:String');
65+
await fs.writeFile(filePath, xmlStr + '\n', 'utf8');
66+
3667
if (missingKeys.length > 0) {
3768
const progress = ((enUSKeys.size - missingKeys.length) / enUSKeys.size) * 100;
3869
const badgeColor = progress >= 75 ? 'yellow' : 'red';
@@ -41,7 +72,7 @@ async function calculateTranslationRate() {
4172
lines.push(`<details>\n<summary>Missing keys in ${file}</summary>\n\n${missingKeys.map(key => `- ${key}`).join('\n')}\n\n</details>`)
4273
} else {
4374
lines.push(`### ![${locale}](https://img.shields.io/badge/${locale}-%E2%88%9A-brightgreen)`);
44-
}
75+
}
4576
}
4677

4778
const content = lines.join('\n\n');

src/App.axaml

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
<ResourceInclude x:Key="fr_FR" Source="/Resources/Locales/fr_FR.axaml"/>
1717
<ResourceInclude x:Key="it_IT" Source="/Resources/Locales/it_IT.axaml"/>
1818
<ResourceInclude x:Key="pt_BR" Source="/Resources/Locales/pt_BR.axaml"/>
19+
<ResourceInclude x:Key="uk_UA" Source="/Resources/Locales/uk_UA.axaml"/>
1920
<ResourceInclude x:Key="ru_RU" Source="/Resources/Locales/ru_RU.axaml"/>
2021
<ResourceInclude x:Key="zh_CN" Source="/Resources/Locales/zh_CN.axaml"/>
2122
<ResourceInclude x:Key="zh_TW" Source="/Resources/Locales/zh_TW.axaml"/>

0 commit comments

Comments
 (0)