mirror of
https://github.com/sourcegit-scm/sourcegit.git
synced 2024-12-28 21:37:19 -08:00
Merge branch 'develop' into custom
This commit is contained in:
commit
e7ac482490
15 changed files with 321 additions and 16 deletions
|
@ -292,3 +292,8 @@ indent_size = 2
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
[*.{cmd,bat}]
|
[*.{cmd,bat}]
|
||||||
end_of_line = crlf
|
end_of_line = crlf
|
||||||
|
|
||||||
|
# YAML files
|
||||||
|
[*.{yml,yaml}]
|
||||||
|
indent_size = 2
|
||||||
|
end_of_line = lf
|
||||||
|
|
42
.github/workflows/localization-check.yml
vendored
Normal file
42
.github/workflows/localization-check.yml
vendored
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
name: Localization Check
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ develop ]
|
||||||
|
paths:
|
||||||
|
- 'src/Resources/Locales/**'
|
||||||
|
- 'README.md'
|
||||||
|
workflow_dispatch:
|
||||||
|
workflow_call:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
localization-check:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20.x'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm install fs-extra@11.2.0 path@0.12.7 xml2js@0.6.2
|
||||||
|
|
||||||
|
- name: Run localization check
|
||||||
|
run: node build/scripts/localization-check.js
|
||||||
|
|
||||||
|
- name: Commit changes
|
||||||
|
run: |
|
||||||
|
git config --global user.name 'github-actions[bot]'
|
||||||
|
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
|
||||||
|
if [ -n "$(git status --porcelain)" ]; then
|
||||||
|
git add README.md TRANSLATION.md
|
||||||
|
git commit -m 'doc: Update translation status and missing keys'
|
||||||
|
git push
|
||||||
|
else
|
||||||
|
echo "No changes to commit"
|
||||||
|
fi
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
6
.gitignore
vendored
6
.gitignore
vendored
|
@ -23,6 +23,10 @@ ehthumbs_vista.db
|
||||||
|
|
||||||
bin/
|
bin/
|
||||||
obj/
|
obj/
|
||||||
|
# ignore ci node files
|
||||||
|
node_modules/
|
||||||
|
package.json
|
||||||
|
package-lock.json
|
||||||
|
|
||||||
build/resources/
|
build/resources/
|
||||||
build/SourceGit/
|
build/SourceGit/
|
||||||
|
@ -32,4 +36,4 @@ build/*.tar.gz
|
||||||
build/*.deb
|
build/*.deb
|
||||||
build/*.rpm
|
build/*.rpm
|
||||||
build/*.AppImage
|
build/*.AppImage
|
||||||
SourceGit.app/
|
SourceGit.app/
|
||||||
|
|
|
@ -41,6 +41,10 @@
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> **Linux** only tested on **Debian 12** on both **X11** & **Wayland**.
|
> **Linux** only tested on **Debian 12** on both **X11** & **Wayland**.
|
||||||
|
|
||||||
|
## Translation Status
|
||||||
|
|
||||||
|
[![en_US](https://img.shields.io/badge/en__US-100%25-brightgreen)](TRANSLATION.md) [![de__DE](https://img.shields.io/badge/de__DE-98.95%25-yellow)](TRANSLATION.md) [![fr__FR](https://img.shields.io/badge/fr__FR-90.36%25-yellow)](TRANSLATION.md) [![pt__BR](https://img.shields.io/badge/pt__BR-93.52%25-yellow)](TRANSLATION.md) [![ru__RU](https://img.shields.io/badge/ru__RU-98.80%25-yellow)](TRANSLATION.md) [![zh__CN](https://img.shields.io/badge/zh__CN-99.10%25-yellow)](TRANSLATION.md) [![zh__TW](https://img.shields.io/badge/zh__TW-99.70%25-yellow)](TRANSLATION.md)
|
||||||
|
|
||||||
## How to Use
|
## How to Use
|
||||||
|
|
||||||
**To use this tool, you need to install Git(>=2.23.0) first.**
|
**To use this tool, you need to install Git(>=2.23.0) first.**
|
||||||
|
|
|
@ -16,6 +16,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{
|
||||||
.github\workflows\ci.yml = .github\workflows\ci.yml
|
.github\workflows\ci.yml = .github\workflows\ci.yml
|
||||||
.github\workflows\package.yml = .github\workflows\package.yml
|
.github\workflows\package.yml = .github\workflows\package.yml
|
||||||
.github\workflows\release.yml = .github\workflows\release.yml
|
.github\workflows\release.yml = .github\workflows\release.yml
|
||||||
|
.github\workflows\localization-check.yml = .github\workflows\localization-check.yml
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{49A7C2D6-558C-4FAA-8F5D-EEE81497AED7}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{49A7C2D6-558C-4FAA-8F5D-EEE81497AED7}"
|
||||||
|
|
183
TRANSLATION.md
Normal file
183
TRANSLATION.md
Normal file
|
@ -0,0 +1,183 @@
|
||||||
|
### de_DE.axaml: 98.95%
|
||||||
|
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Missing Keys</summary>
|
||||||
|
|
||||||
|
- Text.Configure.Git.EnableSignOff
|
||||||
|
- Text.Configure.IssueTracker.AddSampleGitLabIssue
|
||||||
|
- Text.Configure.IssueTracker.AddSampleGitLabMergeRequest
|
||||||
|
- Text.Preference.Advanced
|
||||||
|
- Text.Preference.AI.AnalyzeDiffPrompt
|
||||||
|
- Text.Preference.AI.GenerateSubjectPrompt
|
||||||
|
- Text.WorkingCopy.ConfirmCommitWithoutFiles
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### fr_FR.axaml: 90.36%
|
||||||
|
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Missing Keys</summary>
|
||||||
|
|
||||||
|
- Text.About.Chart
|
||||||
|
- Text.AIAssistant
|
||||||
|
- Text.AIAssistant.Tip
|
||||||
|
- Text.CherryPick.AppendSourceToMessage
|
||||||
|
- Text.CherryPick.Mainline
|
||||||
|
- Text.CherryPick.Mainline.Tips
|
||||||
|
- Text.CommitCM.CherryPickMultiple
|
||||||
|
- Text.CommitCM.SquashCommitsSinceThis
|
||||||
|
- Text.CommitDetail.Info.WebLinks
|
||||||
|
- Text.Configure.Git.DefaultRemote
|
||||||
|
- Text.Configure.Git.EnableSignOff
|
||||||
|
- Text.Configure.IssueTracker.AddSampleGitLabIssue
|
||||||
|
- Text.Configure.IssueTracker.AddSampleGitLabMergeRequest
|
||||||
|
- Text.ConfigureWorkspace
|
||||||
|
- Text.ConfigureWorkspace.Color
|
||||||
|
- Text.ConfigureWorkspace.Restore
|
||||||
|
- Text.ConventionalCommit
|
||||||
|
- Text.ConventionalCommit.BreakingChanges
|
||||||
|
- Text.ConventionalCommit.ClosedIssue
|
||||||
|
- Text.ConventionalCommit.Detail
|
||||||
|
- Text.ConventionalCommit.Scope
|
||||||
|
- Text.ConventionalCommit.ShortDescription
|
||||||
|
- Text.ConventionalCommit.Type
|
||||||
|
- Text.Diff.IgnoreWhitespace
|
||||||
|
- Text.Discard.IncludeIgnored
|
||||||
|
- Text.FileHistory.FileChange
|
||||||
|
- Text.GitLFS.Locks.OnlyMine
|
||||||
|
- Text.Histories.Header.AuthorTime
|
||||||
|
- Text.Histories.Tips
|
||||||
|
- Text.Histories.Tips.MacOS
|
||||||
|
- Text.Histories.Tips.Prefix
|
||||||
|
- Text.Hotkeys.Repo.CommitWithAutoStage
|
||||||
|
- Text.Hotkeys.Repo.DiscardSelected
|
||||||
|
- Text.MoveRepositoryNode
|
||||||
|
- Text.MoveRepositoryNode.Target
|
||||||
|
- Text.Preference.Advanced
|
||||||
|
- Text.Preference.AI
|
||||||
|
- Text.Preference.AI.AnalyzeDiffPrompt
|
||||||
|
- Text.Preference.AI.ApiKey
|
||||||
|
- Text.Preference.AI.GenerateSubjectPrompt
|
||||||
|
- Text.Preference.AI.Model
|
||||||
|
- Text.Preference.AI.Server
|
||||||
|
- Text.Preference.General.ShowAuthorTime
|
||||||
|
- Text.Preference.Integration
|
||||||
|
- Text.Preference.Shell
|
||||||
|
- Text.Preference.Shell.Type
|
||||||
|
- Text.Preference.Shell.Path
|
||||||
|
- Text.Repository.AutoFetching
|
||||||
|
- Text.Repository.EnableReflog
|
||||||
|
- Text.Repository.Search.InCurrentBranch
|
||||||
|
- Text.ScanRepositories
|
||||||
|
- Text.ScanRepositories.RootDir
|
||||||
|
- Text.Squash.Into
|
||||||
|
- Text.Stash.OnlyStagedChanges
|
||||||
|
- Text.Stash.TipForSelectedFiles
|
||||||
|
- Text.Statistics.Overview
|
||||||
|
- Text.TagCM.CopyMessage
|
||||||
|
- Text.Welcome.Move
|
||||||
|
- Text.Welcome.ScanDefaultCloneDir
|
||||||
|
- Text.WorkingCopy.CommitTip
|
||||||
|
- Text.WorkingCopy.CommitWithAutoStage
|
||||||
|
- Text.WorkingCopy.ConfirmCommitWithoutFiles
|
||||||
|
- Text.Workspace
|
||||||
|
- Text.Workspace.Configure
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### pt_BR.axaml: 93.52%
|
||||||
|
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Missing Keys</summary>
|
||||||
|
|
||||||
|
- Text.About.Chart
|
||||||
|
- Text.AIAssistant
|
||||||
|
- Text.AIAssistant.Tip
|
||||||
|
- Text.CherryPick.AppendSourceToMessage
|
||||||
|
- Text.CherryPick.Mainline
|
||||||
|
- Text.CherryPick.Mainline.Tips
|
||||||
|
- Text.CommitCM.CherryPickMultiple
|
||||||
|
- Text.CommitCM.SquashCommitsSinceThis
|
||||||
|
- Text.CommitDetail.Info.ContainsIn
|
||||||
|
- Text.CommitDetail.Info.ContainsIn.Title
|
||||||
|
- Text.CommitDetail.Info.WebLinks
|
||||||
|
- Text.Configure.Git.DefaultRemote
|
||||||
|
- Text.Configure.Git.EnableSignOff
|
||||||
|
- Text.Configure.IssueTracker.AddSampleGitLabIssue
|
||||||
|
- Text.Configure.IssueTracker.AddSampleGitLabMergeRequest
|
||||||
|
- Text.ConfigureWorkspace
|
||||||
|
- Text.ConfigureWorkspace.Color
|
||||||
|
- Text.ConfigureWorkspace.Restore
|
||||||
|
- Text.ConventionalCommit
|
||||||
|
- Text.ConventionalCommit.BreakingChanges
|
||||||
|
- Text.ConventionalCommit.ClosedIssue
|
||||||
|
- Text.ConventionalCommit.Detail
|
||||||
|
- Text.ConventionalCommit.Scope
|
||||||
|
- Text.ConventionalCommit.ShortDescription
|
||||||
|
- Text.ConventionalCommit.Type
|
||||||
|
- Text.CopyAllText
|
||||||
|
- Text.Discard.IncludeIgnored
|
||||||
|
- Text.FileHistory.FileContent
|
||||||
|
- Text.FileHistory.FileChange
|
||||||
|
- Text.GitLFS.Locks.OnlyMine
|
||||||
|
- Text.MoveRepositoryNode
|
||||||
|
- Text.MoveRepositoryNode.Target
|
||||||
|
- Text.Preference.Advanced
|
||||||
|
- Text.Push.CheckSubmodules
|
||||||
|
- Text.Squash.Into
|
||||||
|
- Text.Stash.OnlyStagedChanges
|
||||||
|
- Text.Stash.TipForSelectedFiles
|
||||||
|
- Text.Statistics.Overview
|
||||||
|
- Text.TagCM.CopyMessage
|
||||||
|
- Text.WorkingCopy.Staged.UnstageAll
|
||||||
|
- Text.WorkingCopy.Unstaged
|
||||||
|
- Text.WorkingCopy.Unstaged.Stage
|
||||||
|
- Text.WorkingCopy.Unstaged.StageAll
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### ru_RU.axaml: 98.80%
|
||||||
|
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Missing Keys</summary>
|
||||||
|
|
||||||
|
- Text.Configure.Git.EnableSignOff
|
||||||
|
- Text.Configure.IssueTracker.AddSampleGitLabIssue
|
||||||
|
- Text.Configure.IssueTracker.AddSampleGitLabMergeRequest
|
||||||
|
- Text.Preference.Advanced
|
||||||
|
- Text.Preference.AI.AnalyzeDiffPrompt
|
||||||
|
- Text.Preference.AI.GenerateSubjectPrompt
|
||||||
|
- Text.Repository.EnableReflog
|
||||||
|
- Text.WorkingCopy.ConfirmCommitWithoutFiles
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### zh_CN.axaml: 99.10%
|
||||||
|
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Missing Keys</summary>
|
||||||
|
|
||||||
|
- Text.Preference.AI
|
||||||
|
- Text.Preference.AI.AnalyzeDiffPrompt
|
||||||
|
- Text.Preference.AI.ApiKey
|
||||||
|
- Text.Preference.AI.GenerateSubjectPrompt
|
||||||
|
- Text.Preference.AI.Model
|
||||||
|
- Text.Preference.AI.Server
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### zh_TW.axaml: 99.70%
|
||||||
|
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Missing Keys</summary>
|
||||||
|
|
||||||
|
- Text.Preference.AI.AnalyzeDiffPrompt
|
||||||
|
- Text.Preference.AI.GenerateSubjectPrompt
|
||||||
|
|
||||||
|
</details>
|
59
build/scripts/localization-check.js
Normal file
59
build/scripts/localization-check.js
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
const fs = require('fs-extra');
|
||||||
|
const path = require('path');
|
||||||
|
const xml2js = require('xml2js');
|
||||||
|
|
||||||
|
const repoRoot = path.join(__dirname, '../../');
|
||||||
|
const localesDir = path.join(repoRoot, 'src/Resources/Locales');
|
||||||
|
const enUSFile = path.join(localesDir, 'en_US.axaml');
|
||||||
|
const outputFile = path.join(repoRoot, 'TRANSLATION.md');
|
||||||
|
const readmeFile = path.join(repoRoot, 'README.md');
|
||||||
|
|
||||||
|
const parser = new xml2js.Parser();
|
||||||
|
|
||||||
|
async function parseXml(filePath) {
|
||||||
|
const data = await fs.readFile(filePath);
|
||||||
|
return parser.parseStringPromise(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function calculateTranslationRate() {
|
||||||
|
const enUSData = await parseXml(enUSFile);
|
||||||
|
const enUSKeys = new Set(enUSData.ResourceDictionary['x:String'].map(item => item.$['x:Key']));
|
||||||
|
|
||||||
|
const translationRates = [];
|
||||||
|
const badges = [];
|
||||||
|
|
||||||
|
const files = (await fs.readdir(localesDir)).filter(file => file !== 'en_US.axaml' && file.endsWith('.axaml'));
|
||||||
|
|
||||||
|
// Add en_US badge first
|
||||||
|
badges.push(`[![en_US](https://img.shields.io/badge/en__US-100%25-brightgreen)](TRANSLATION.md)`);
|
||||||
|
|
||||||
|
for (const file of files) {
|
||||||
|
const filePath = path.join(localesDir, file);
|
||||||
|
const localeData = await parseXml(filePath);
|
||||||
|
const localeKeys = new Set(localeData.ResourceDictionary['x:String'].map(item => item.$['x:Key']));
|
||||||
|
|
||||||
|
const missingKeys = [...enUSKeys].filter(key => !localeKeys.has(key));
|
||||||
|
const translationRate = ((enUSKeys.size - missingKeys.length) / enUSKeys.size) * 100;
|
||||||
|
|
||||||
|
translationRates.push(`### ${file}: ${translationRate.toFixed(2)}%\n`);
|
||||||
|
translationRates.push(`<details>\n<summary>Missing Keys</summary>\n\n${missingKeys.map(key => `- ${key}`).join('\n')}\n\n</details>`);
|
||||||
|
|
||||||
|
// Add badges
|
||||||
|
const locale = file.replace('.axaml', '').replace('_', '__');
|
||||||
|
const badgeColor = translationRate === 100 ? 'brightgreen' : translationRate >= 75 ? 'yellow' : 'red';
|
||||||
|
badges.push(`[![${locale}](https://img.shields.io/badge/${locale}-${translationRate.toFixed(2)}%25-${badgeColor})](TRANSLATION.md)`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(translationRates.join('\n\n'));
|
||||||
|
|
||||||
|
await fs.writeFile(outputFile, translationRates.join('\n\n') + '\n', 'utf8');
|
||||||
|
|
||||||
|
// Update README.md
|
||||||
|
let readmeContent = await fs.readFile(readmeFile, 'utf8');
|
||||||
|
const badgeSection = `## Translation Status\n\n${badges.join(' ')}`;
|
||||||
|
console.log(badgeSection);
|
||||||
|
readmeContent = readmeContent.replace(/## Translation Status\n\n.*\n\n/, badgeSection + '\n\n');
|
||||||
|
await fs.writeFile(readmeFile, readmeContent, 'utf8');
|
||||||
|
}
|
||||||
|
|
||||||
|
calculateTranslationRate().catch(err => console.error(err));
|
|
@ -493,7 +493,6 @@
|
||||||
<x:String x:Key="Text.RemoteCM.Fetch" xml:space="preserve">Fetch</x:String>
|
<x:String x:Key="Text.RemoteCM.Fetch" xml:space="preserve">Fetch</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">Im Browser öffnen</x:String>
|
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">Im Browser öffnen</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">Prune</x:String>
|
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">Prune</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.Prune.Target" xml:space="preserve">Ziel:</x:String>
|
|
||||||
<x:String x:Key="Text.RemoveWorktree" xml:space="preserve">Bestätige das entfernen des Worktrees</x:String>
|
<x:String x:Key="Text.RemoveWorktree" xml:space="preserve">Bestätige das entfernen des Worktrees</x:String>
|
||||||
<x:String x:Key="Text.RemoveWorktree.Force" xml:space="preserve">Aktiviere `--force` Option</x:String>
|
<x:String x:Key="Text.RemoveWorktree.Force" xml:space="preserve">Aktiviere `--force` Option</x:String>
|
||||||
<x:String x:Key="Text.RemoveWorktree.Target" xml:space="preserve">Ziel:</x:String>
|
<x:String x:Key="Text.RemoveWorktree.Target" xml:space="preserve">Ziel:</x:String>
|
||||||
|
|
|
@ -402,6 +402,7 @@
|
||||||
<x:String x:Key="Text.Period.LastYear" xml:space="preserve">Last year</x:String>
|
<x:String x:Key="Text.Period.LastYear" xml:space="preserve">Last year</x:String>
|
||||||
<x:String x:Key="Text.Period.YearsAgo" xml:space="preserve">{0} years ago</x:String>
|
<x:String x:Key="Text.Period.YearsAgo" xml:space="preserve">{0} years ago</x:String>
|
||||||
<x:String x:Key="Text.Preference" xml:space="preserve">Preference</x:String>
|
<x:String x:Key="Text.Preference" xml:space="preserve">Preference</x:String>
|
||||||
|
<x:String x:Key="Text.Preference.Advanced" xml:space="preserve">Advanced Options</x:String>
|
||||||
<x:String x:Key="Text.Preference.AI" xml:space="preserve">OPEN AI</x:String>
|
<x:String x:Key="Text.Preference.AI" xml:space="preserve">OPEN AI</x:String>
|
||||||
<x:String x:Key="Text.Preference.AI.AnalyzeDiffPrompt" xml:space="preserve">Analyze Diff Prompt</x:String>
|
<x:String x:Key="Text.Preference.AI.AnalyzeDiffPrompt" xml:space="preserve">Analyze Diff Prompt</x:String>
|
||||||
<x:String x:Key="Text.Preference.AI.ApiKey" xml:space="preserve">API Key</x:String>
|
<x:String x:Key="Text.Preference.AI.ApiKey" xml:space="preserve">API Key</x:String>
|
||||||
|
@ -496,7 +497,6 @@
|
||||||
<x:String x:Key="Text.RemoteCM.Fetch" xml:space="preserve">Fetch</x:String>
|
<x:String x:Key="Text.RemoteCM.Fetch" xml:space="preserve">Fetch</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">Open In Browser</x:String>
|
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">Open In Browser</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">Prune</x:String>
|
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">Prune</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.Prune.Target" xml:space="preserve">Target:</x:String>
|
|
||||||
<x:String x:Key="Text.RemoveWorktree" xml:space="preserve">Confirm to Remove Worktree</x:String>
|
<x:String x:Key="Text.RemoveWorktree" xml:space="preserve">Confirm to Remove Worktree</x:String>
|
||||||
<x:String x:Key="Text.RemoveWorktree.Force" xml:space="preserve">Enable `--force` Option</x:String>
|
<x:String x:Key="Text.RemoveWorktree.Force" xml:space="preserve">Enable `--force` Option</x:String>
|
||||||
<x:String x:Key="Text.RemoveWorktree.Target" xml:space="preserve">Target:</x:String>
|
<x:String x:Key="Text.RemoveWorktree.Target" xml:space="preserve">Target:</x:String>
|
||||||
|
|
|
@ -453,7 +453,6 @@
|
||||||
<x:String x:Key="Text.RemoteCM.Fetch" xml:space="preserve">Fetch</x:String>
|
<x:String x:Key="Text.RemoteCM.Fetch" xml:space="preserve">Fetch</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">Open In Browser</x:String>
|
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">Open In Browser</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">Prune</x:String>
|
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">Prune</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.Prune.Target" xml:space="preserve">Target:</x:String>
|
|
||||||
<x:String x:Key="Text.RemoveWorktree" xml:space="preserve">Confirm to Remove Worktree</x:String>
|
<x:String x:Key="Text.RemoveWorktree" xml:space="preserve">Confirm to Remove Worktree</x:String>
|
||||||
<x:String x:Key="Text.RemoveWorktree.Force" xml:space="preserve">Enable `--force` Option</x:String>
|
<x:String x:Key="Text.RemoveWorktree.Force" xml:space="preserve">Enable `--force` Option</x:String>
|
||||||
<x:String x:Key="Text.RemoveWorktree.Target" xml:space="preserve">Target:</x:String>
|
<x:String x:Key="Text.RemoveWorktree.Target" xml:space="preserve">Target:</x:String>
|
||||||
|
|
|
@ -467,7 +467,6 @@
|
||||||
<x:String x:Key="Text.RemoteCM.Edit" xml:space="preserve">Editar...</x:String>
|
<x:String x:Key="Text.RemoteCM.Edit" xml:space="preserve">Editar...</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.Fetch" xml:space="preserve">Buscar</x:String>
|
<x:String x:Key="Text.RemoteCM.Fetch" xml:space="preserve">Buscar</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">Abrir no Navegador</x:String>
|
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">Abrir no Navegador</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.Prune.Target" xml:space="preserve">Alvo:</x:String>
|
|
||||||
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">Podar</x:String>
|
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">Podar</x:String>
|
||||||
<x:String x:Key="Text.RemoveWorktree.Force" xml:space="preserve">Habilitar Opção `--force`</x:String>
|
<x:String x:Key="Text.RemoveWorktree.Force" xml:space="preserve">Habilitar Opção `--force`</x:String>
|
||||||
<x:String x:Key="Text.RemoveWorktree.Target" xml:space="preserve">Alvo:</x:String>
|
<x:String x:Key="Text.RemoveWorktree.Target" xml:space="preserve">Alvo:</x:String>
|
||||||
|
|
|
@ -494,7 +494,6 @@
|
||||||
<x:String x:Key="Text.RemoteCM.Fetch" xml:space="preserve">Извлечь</x:String>
|
<x:String x:Key="Text.RemoteCM.Fetch" xml:space="preserve">Извлечь</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">Открыть в браузере</x:String>
|
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">Открыть в браузере</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">Удалить</x:String>
|
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">Удалить</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.Prune.Target" xml:space="preserve">Цель:</x:String>
|
|
||||||
<x:String x:Key="Text.RemoveWorktree" xml:space="preserve">Подтвердить удаление рабочего дерева</x:String>
|
<x:String x:Key="Text.RemoveWorktree" xml:space="preserve">Подтвердить удаление рабочего дерева</x:String>
|
||||||
<x:String x:Key="Text.RemoveWorktree.Force" xml:space="preserve">Включить опцию `--force`</x:String>
|
<x:String x:Key="Text.RemoveWorktree.Force" xml:space="preserve">Включить опцию `--force`</x:String>
|
||||||
<x:String x:Key="Text.RemoveWorktree.Target" xml:space="preserve">Цель:</x:String>
|
<x:String x:Key="Text.RemoveWorktree.Target" xml:space="preserve">Цель:</x:String>
|
||||||
|
|
|
@ -404,6 +404,7 @@
|
||||||
<x:String x:Key="Text.Period.LastYear" xml:space="preserve">一年前</x:String>
|
<x:String x:Key="Text.Period.LastYear" xml:space="preserve">一年前</x:String>
|
||||||
<x:String x:Key="Text.Period.YearsAgo" xml:space="preserve">{0}年前</x:String>
|
<x:String x:Key="Text.Period.YearsAgo" xml:space="preserve">{0}年前</x:String>
|
||||||
<x:String x:Key="Text.Preference" xml:space="preserve">偏好设置</x:String>
|
<x:String x:Key="Text.Preference" xml:space="preserve">偏好设置</x:String>
|
||||||
|
<x:String x:Key="Text.Preference.Advanced" xml:space="preserve">高级设置</x:String>
|
||||||
<x:String x:Key="Text.Preference.Appearance" xml:space="preserve">外观配置</x:String>
|
<x:String x:Key="Text.Preference.Appearance" xml:space="preserve">外观配置</x:String>
|
||||||
<x:String x:Key="Text.Preference.Appearance.DefaultFont" xml:space="preserve">缺省字体</x:String>
|
<x:String x:Key="Text.Preference.Appearance.DefaultFont" xml:space="preserve">缺省字体</x:String>
|
||||||
<x:String x:Key="Text.Preference.Appearance.DefaultFontSize" xml:space="preserve">默认字体大小</x:String>
|
<x:String x:Key="Text.Preference.Appearance.DefaultFontSize" xml:space="preserve">默认字体大小</x:String>
|
||||||
|
|
|
@ -404,6 +404,7 @@
|
||||||
<x:String x:Key="Text.Period.LastYear" xml:space="preserve">一年前</x:String>
|
<x:String x:Key="Text.Period.LastYear" xml:space="preserve">一年前</x:String>
|
||||||
<x:String x:Key="Text.Period.YearsAgo" xml:space="preserve">{0} 年前</x:String>
|
<x:String x:Key="Text.Period.YearsAgo" xml:space="preserve">{0} 年前</x:String>
|
||||||
<x:String x:Key="Text.Preference" xml:space="preserve">偏好設定</x:String>
|
<x:String x:Key="Text.Preference" xml:space="preserve">偏好設定</x:String>
|
||||||
|
<x:String x:Key="Text.Preference.Advanced" xml:space="preserve">進階選項</x:String>
|
||||||
<x:String x:Key="Text.Preference.AI" xml:space="preserve">OpenAI</x:String>
|
<x:String x:Key="Text.Preference.AI" xml:space="preserve">OpenAI</x:String>
|
||||||
<x:String x:Key="Text.Preference.AI.Server" xml:space="preserve">伺服器</x:String>
|
<x:String x:Key="Text.Preference.AI.Server" xml:space="preserve">伺服器</x:String>
|
||||||
<x:String x:Key="Text.Preference.AI.ApiKey" xml:space="preserve">API 金鑰</x:String>
|
<x:String x:Key="Text.Preference.AI.ApiKey" xml:space="preserve">API 金鑰</x:String>
|
||||||
|
@ -496,7 +497,6 @@
|
||||||
<x:String x:Key="Text.RemoteCM.Fetch" xml:space="preserve">提取 (fetch) 更新</x:String>
|
<x:String x:Key="Text.RemoteCM.Fetch" xml:space="preserve">提取 (fetch) 更新</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">在瀏覽器中存取網址</x:String>
|
<x:String x:Key="Text.RemoteCM.OpenInBrowser" xml:space="preserve">在瀏覽器中存取網址</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">清理遠端已刪除分支</x:String>
|
<x:String x:Key="Text.RemoteCM.Prune" xml:space="preserve">清理遠端已刪除分支</x:String>
|
||||||
<x:String x:Key="Text.RemoteCM.Prune.Target" xml:space="preserve">目標:</x:String>
|
|
||||||
<x:String x:Key="Text.RemoveWorktree" xml:space="preserve">刪除工作區操作確認</x:String>
|
<x:String x:Key="Text.RemoveWorktree" xml:space="preserve">刪除工作區操作確認</x:String>
|
||||||
<x:String x:Key="Text.RemoveWorktree.Force" xml:space="preserve">啟用 [--force] 選項</x:String>
|
<x:String x:Key="Text.RemoveWorktree.Force" xml:space="preserve">啟用 [--force] 選項</x:String>
|
||||||
<x:String x:Key="Text.RemoveWorktree.Target" xml:space="preserve">目標工作區:</x:String>
|
<x:String x:Key="Text.RemoveWorktree.Target" xml:space="preserve">目標工作區:</x:String>
|
||||||
|
|
|
@ -465,7 +465,7 @@
|
||||||
<TextBlock Classes="bold" Margin="4,0,0,0" Text="{DynamicResource Text.Preference.AI}"/>
|
<TextBlock Classes="bold" Margin="4,0,0,0" Text="{DynamicResource Text.Preference.AI}"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<Rectangle Margin="0,8" Fill="{DynamicResource Brush.Border2}" Height=".6" HorizontalAlignment="Stretch"/>
|
<Rectangle Margin="0,8" Fill="{DynamicResource Brush.Border2}" Height=".6" HorizontalAlignment="Stretch"/>
|
||||||
<Grid Margin="8,0,0,0" RowDefinitions="32,32,32,128,128">
|
<Grid Margin="8,0,0,0" RowDefinitions="32,32,32,32,Auto,Auto">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="Auto" SharedSizeGroup="IntegrationLabel"/>
|
<ColumnDefinition Width="Auto" SharedSizeGroup="IntegrationLabel"/>
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
|
@ -499,29 +499,39 @@
|
||||||
PasswordChar="*"
|
PasswordChar="*"
|
||||||
Text="{Binding OpenAIApiKey, Mode=TwoWay}"/>
|
Text="{Binding OpenAIApiKey, Mode=TwoWay}"/>
|
||||||
|
|
||||||
<TextBlock Grid.Row="3" Grid.Column="0"
|
<ToggleButton Grid.Row="3" Grid.Column="1" Classes="group_expander" x:Name="OpenAIAdvancedOptions" HorizontalAlignment="Right">
|
||||||
|
<TextBlock Margin="0" Text="{DynamicResource Text.Preference.Advanced}"/>
|
||||||
|
</ToggleButton>
|
||||||
|
|
||||||
|
<TextBlock Grid.Row="4" Grid.Column="0"
|
||||||
Text="{DynamicResource Text.Preference.AI.AnalyzeDiffPrompt}"
|
Text="{DynamicResource Text.Preference.AI.AnalyzeDiffPrompt}"
|
||||||
HorizontalAlignment="Right"
|
HorizontalAlignment="Right"
|
||||||
Margin="0,0,16,0"/>
|
Margin="0,0,16,0"
|
||||||
<TextBox Grid.Row="3" Grid.Column="1"
|
IsVisible="{Binding #OpenAIAdvancedOptions.IsChecked}"/>
|
||||||
|
<TextBox Grid.Row="4" Grid.Column="1"
|
||||||
Height="120"
|
Height="120"
|
||||||
|
Margin="0,2"
|
||||||
CornerRadius="3"
|
CornerRadius="3"
|
||||||
VerticalContentAlignment="Top"
|
VerticalContentAlignment="Top"
|
||||||
Text="{Binding OpenAIAnalyzeDiffPrompt, Mode=TwoWay}"
|
Text="{Binding OpenAIAnalyzeDiffPrompt, Mode=TwoWay}"
|
||||||
AcceptsReturn="true"
|
AcceptsReturn="true"
|
||||||
TextWrapping="Wrap"/>
|
TextWrapping="Wrap"
|
||||||
|
IsVisible="{Binding #OpenAIAdvancedOptions.IsChecked}"/>
|
||||||
|
|
||||||
<TextBlock Grid.Row="4" Grid.Column="0"
|
<TextBlock Grid.Row="5" Grid.Column="0"
|
||||||
Text="{DynamicResource Text.Preference.AI.GenerateSubjectPrompt}"
|
Text="{DynamicResource Text.Preference.AI.GenerateSubjectPrompt}"
|
||||||
HorizontalAlignment="Right"
|
HorizontalAlignment="Right"
|
||||||
Margin="0,0,16,0"/>
|
Margin="0,0,16,0"
|
||||||
<TextBox Grid.Row="4" Grid.Column="1"
|
IsVisible="{Binding #OpenAIAdvancedOptions.IsChecked}"/>
|
||||||
|
<TextBox Grid.Row="5" Grid.Column="1"
|
||||||
Height="120"
|
Height="120"
|
||||||
|
Margin="0,2"
|
||||||
CornerRadius="3"
|
CornerRadius="3"
|
||||||
VerticalContentAlignment="Top"
|
VerticalContentAlignment="Top"
|
||||||
Text="{Binding OpenAIGenerateSubjectPrompt, Mode=TwoWay}"
|
Text="{Binding OpenAIGenerateSubjectPrompt, Mode=TwoWay}"
|
||||||
AcceptsReturn="true"
|
AcceptsReturn="true"
|
||||||
TextWrapping="Wrap"/>
|
TextWrapping="Wrap"
|
||||||
|
IsVisible="{Binding #OpenAIAdvancedOptions.IsChecked}"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
Loading…
Reference in a new issue