mirror of
https://fastgit.cc/github.com/sourcegit-scm/sourcegit
synced 2026-04-23 10:22:13 +08:00
Merge branch 'release/v2025.37'
This commit is contained in:
27
README.md
27
README.md
@@ -11,7 +11,7 @@
|
||||
* Supports Windows/macOS/Linux
|
||||
* Opensource/Free
|
||||
* Fast
|
||||
* Deutsch/English/Español/Bahasa Indonesia/Français/Italiano/Português/Русский/Українська/简体中文/繁體中文/日本語/தமிழ் (Tamil)
|
||||
* Deutsch/English/Español/Bahasa Indonesia/Français/Italiano/Português/Русский/Українська/简体中文/繁體中文/日本語/தமிழ் (Tamil)/한국어
|
||||
* Built-in light/dark themes
|
||||
* Customize theme
|
||||
* Visual commit graph
|
||||
@@ -43,7 +43,9 @@
|
||||
* Issue Link
|
||||
* Workspace
|
||||
* Custom Action
|
||||
* Create PR on GitHub/Gitlab/Gitea/Gitee/Bitbucket...
|
||||
* Using AI to generate commit message (C# port of [anjerodev/commitollama](https://github.com/anjerodev/commitollama))
|
||||
* Built-in conventional commit message helper.
|
||||
|
||||
> [!WARNING]
|
||||
> **Linux** only tested on **Debian 12** on both **X11** & **Wayland**.
|
||||
@@ -155,7 +157,7 @@ This app supports open repository in external tools listed in the table below.
|
||||
| Cursor | YES | YES | YES |
|
||||
| Fleet | YES | YES | YES |
|
||||
| Sublime Text | YES | YES | YES |
|
||||
| Zed | NO | YES | YES |
|
||||
| Zed | YES | YES | YES |
|
||||
| Visual Studio | YES | NO | NO |
|
||||
|
||||
> [!NOTE]
|
||||
@@ -172,6 +174,27 @@ This app supports open repository in external tools listed in the table below.
|
||||
> [!NOTE]
|
||||
> This app also supports a lot of `JetBrains` IDEs, installing `JetBrains Toolbox` will help this app to find them.
|
||||
|
||||
## Conventional Commit Helper
|
||||
|
||||
You can define your own conventional commit types (per-repository) by following steps:
|
||||
|
||||
1. Create a json file with your own conventional commit type definitions. For example:
|
||||
```json
|
||||
[
|
||||
{
|
||||
"Name": "New Feature",
|
||||
"Type": "Feature",
|
||||
"Description": "Adding a new feature"
|
||||
},
|
||||
{
|
||||
"Name": "Bug Fixes",
|
||||
"Type": "Fix",
|
||||
"Description": "Fixing a bug"
|
||||
}
|
||||
]
|
||||
```
|
||||
2. Configure the `Conventional Commit Types` in repository configuration window.
|
||||
|
||||
## Screenshots
|
||||
|
||||
* Dark Theme
|
||||
|
||||
@@ -7,7 +7,7 @@ The project uses the following third-party libraries or assets
|
||||
### AvaloniaUI
|
||||
|
||||
- **Source**: https://github.com/AvaloniaUI/Avalonia
|
||||
- **Version**: 11.3.7
|
||||
- **Version**: 11.3.8
|
||||
- **License**: MIT License
|
||||
- **License Link**: https://github.com/AvaloniaUI/Avalonia/blob/master/licence.md
|
||||
|
||||
|
||||
108
TRANSLATION.md
108
TRANSLATION.md
@@ -8,9 +8,20 @@ This document shows the translation status of each locale file in the repository
|
||||
|
||||
### 
|
||||
|
||||
### 
|
||||
### 
|
||||
|
||||
### 
|
||||
<details>
|
||||
<summary>Missing keys in es_ES.axaml</summary>
|
||||
|
||||
- Text.Blame.BlameOnPreviousRevision
|
||||
- Text.Configure.CommitMessageTemplate.BuiltinVars
|
||||
- Text.Configure.Git.ConventionalTypesOverride
|
||||
- Text.ConfigureCustomActionControls.StringValue.Tip
|
||||
- Text.Launcher.OpenRepository
|
||||
|
||||
</details>
|
||||
|
||||
### 
|
||||
|
||||
<details>
|
||||
<summary>Missing keys in fr_FR.axaml</summary>
|
||||
@@ -30,6 +41,9 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.Bisect.Good
|
||||
- Text.Bisect.Skip
|
||||
- Text.Bisect.WaitingForRange
|
||||
- Text.Blame.BlameOnPreviousRevision
|
||||
- Text.BranchCM.CreatePR
|
||||
- Text.BranchCM.CreatePRForUpstream
|
||||
- Text.BranchCM.ResetToSelectedCommit
|
||||
- Text.BranchCM.SwitchToWorktree
|
||||
- Text.BranchTree.Ahead
|
||||
@@ -77,6 +91,7 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.Configure.CustomAction.InputControls.Edit
|
||||
- Text.Configure.CustomAction.Scope.Remote
|
||||
- Text.Configure.CustomAction.Scope.Tag
|
||||
- Text.Configure.Git.ConventionalTypesOverride
|
||||
- Text.Configure.Git.PreferredMergeMode
|
||||
- Text.Configure.IssueTracker.AddSampleGerritChangeIdCommit
|
||||
- Text.Configure.IssueTracker.Share
|
||||
@@ -89,6 +104,7 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.ConfigureCustomActionControls.Label
|
||||
- Text.ConfigureCustomActionControls.Options
|
||||
- Text.ConfigureCustomActionControls.Options.Tip
|
||||
- Text.ConfigureCustomActionControls.StringValue.Tip
|
||||
- Text.ConfigureCustomActionControls.Type
|
||||
- Text.ConfirmEmptyCommit.Continue
|
||||
- Text.ConfirmEmptyCommit.NoLocalChanges
|
||||
@@ -122,10 +138,10 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.ExecuteCustomAction.Repository
|
||||
- Text.GitFlow.FinishWithPush
|
||||
- Text.GitFlow.FinishWithSquash
|
||||
- Text.Hotkeys.Global.SwitchWorkspace
|
||||
- Text.Hotkeys.Global.SwitchTab
|
||||
- Text.Hotkeys.TextEditor.OpenExternalMergeTool
|
||||
- Text.InteractiveRebase.ReorderTip
|
||||
- Text.Launcher.OpenRepository
|
||||
- Text.Launcher.Pages
|
||||
- Text.Launcher.Workspaces
|
||||
- Text.Merge.Edit
|
||||
@@ -144,6 +160,8 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.Push.New
|
||||
- Text.Push.Revision
|
||||
- Text.Push.Revision.Title
|
||||
- Text.PushToNewBranch
|
||||
- Text.PushToNewBranch.Title
|
||||
- Text.RemoteCM.CustomAction
|
||||
- Text.Repository.BranchSort
|
||||
- Text.Repository.BranchSort.ByCommitterDate
|
||||
@@ -217,25 +235,37 @@ This document shows the translation status of each locale file in the repository
|
||||
|
||||
</details>
|
||||
|
||||
### 
|
||||
### 
|
||||
|
||||
<details>
|
||||
<summary>Missing keys in id_ID.axaml</summary>
|
||||
|
||||
- Text.About.ReleaseNotes
|
||||
- Text.Blame.BlameOnPreviousRevision
|
||||
- Text.BranchCM.CreatePR
|
||||
- Text.BranchCM.CreatePRForUpstream
|
||||
- Text.CommitCM.Drop
|
||||
- Text.Configure.CommitMessageTemplate.BuiltinVars
|
||||
- Text.Configure.Git.ConventionalTypesOverride
|
||||
- Text.ConfigureCustomActionControls.StringValue.Tip
|
||||
- Text.DropHead
|
||||
- Text.DropHead.Commit
|
||||
- Text.DropHead.NewHead
|
||||
- Text.Launcher.OpenRepository
|
||||
- Text.PushToNewBranch
|
||||
- Text.PushToNewBranch.Title
|
||||
|
||||
</details>
|
||||
|
||||
### 
|
||||
### 
|
||||
|
||||
<details>
|
||||
<summary>Missing keys in it_IT.axaml</summary>
|
||||
|
||||
- Text.About.ReleaseNotes
|
||||
- Text.Blame.BlameOnPreviousRevision
|
||||
- Text.BranchCM.CreatePR
|
||||
- Text.BranchCM.CreatePRForUpstream
|
||||
- Text.BranchCM.SwitchToWorktree
|
||||
- Text.BranchTree.Ahead
|
||||
- Text.BranchTree.AheadBehind
|
||||
@@ -247,6 +277,9 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.CommitDetail.Info.CopyName
|
||||
- Text.CommitDetail.Info.CopyNameAndEmail
|
||||
- Text.CommitMessageTextBox.PasteAndReplaceAll
|
||||
- Text.Configure.CommitMessageTemplate.BuiltinVars
|
||||
- Text.Configure.Git.ConventionalTypesOverride
|
||||
- Text.ConfigureCustomActionControls.StringValue.Tip
|
||||
- Text.Diff.Image.Difference
|
||||
- Text.DirtyState.HasLocalChanges
|
||||
- Text.DirtyState.HasPendingPullOrPush
|
||||
@@ -254,12 +287,15 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.DropHead
|
||||
- Text.DropHead.Commit
|
||||
- Text.DropHead.NewHead
|
||||
- Text.Launcher.OpenRepository
|
||||
- Text.Preferences.AI.ReadApiKeyFromEnv
|
||||
- Text.Preferences.Appearance.UseAutoHideScrollBars
|
||||
- Text.Preferences.General.EnableCompactFolders
|
||||
- Text.Preferences.General.ShowChangesPageByDefault
|
||||
- Text.Preferences.General.ShowChangesTabInCommitDetailByDefault
|
||||
- Text.Preferences.General.UseGitHubStyleAvatar
|
||||
- Text.PushToNewBranch
|
||||
- Text.PushToNewBranch.Title
|
||||
- Text.ScanRepositories.UseCustomDir
|
||||
- Text.WorkingCopy.ClearCommitHistories
|
||||
- Text.WorkingCopy.ClearCommitHistories.Confirm
|
||||
@@ -268,7 +304,7 @@ This document shows the translation status of each locale file in the repository
|
||||
|
||||
</details>
|
||||
|
||||
### 
|
||||
### 
|
||||
|
||||
<details>
|
||||
<summary>Missing keys in ja_JP.axaml</summary>
|
||||
@@ -288,7 +324,10 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.Bisect.Good
|
||||
- Text.Bisect.Skip
|
||||
- Text.Bisect.WaitingForRange
|
||||
- Text.Blame.BlameOnPreviousRevision
|
||||
- Text.BranchCM.CompareWithCurrent
|
||||
- Text.BranchCM.CreatePR
|
||||
- Text.BranchCM.CreatePRForUpstream
|
||||
- Text.BranchCM.ResetToSelectedCommit
|
||||
- Text.BranchCM.SwitchToWorktree
|
||||
- Text.BranchTree.Ahead
|
||||
@@ -336,6 +375,7 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.Configure.CustomAction.InputControls.Edit
|
||||
- Text.Configure.CustomAction.Scope.Remote
|
||||
- Text.Configure.CustomAction.Scope.Tag
|
||||
- Text.Configure.Git.ConventionalTypesOverride
|
||||
- Text.Configure.Git.PreferredMergeMode
|
||||
- Text.Configure.IssueTracker.AddSampleGerritChangeIdCommit
|
||||
- Text.Configure.IssueTracker.Share
|
||||
@@ -348,6 +388,7 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.ConfigureCustomActionControls.Label
|
||||
- Text.ConfigureCustomActionControls.Options
|
||||
- Text.ConfigureCustomActionControls.Options.Tip
|
||||
- Text.ConfigureCustomActionControls.StringValue.Tip
|
||||
- Text.ConfigureCustomActionControls.Type
|
||||
- Text.ConfirmEmptyCommit.Continue
|
||||
- Text.ConfirmEmptyCommit.NoLocalChanges
|
||||
@@ -381,10 +422,10 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.ExecuteCustomAction.Repository
|
||||
- Text.GitFlow.FinishWithPush
|
||||
- Text.GitFlow.FinishWithSquash
|
||||
- Text.Hotkeys.Global.SwitchWorkspace
|
||||
- Text.Hotkeys.Global.SwitchTab
|
||||
- Text.Hotkeys.TextEditor.OpenExternalMergeTool
|
||||
- Text.InteractiveRebase.ReorderTip
|
||||
- Text.Launcher.OpenRepository
|
||||
- Text.Launcher.Pages
|
||||
- Text.Launcher.Workspaces
|
||||
- Text.Merge.Edit
|
||||
@@ -403,6 +444,8 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.Push.New
|
||||
- Text.Push.Revision
|
||||
- Text.Push.Revision.Title
|
||||
- Text.PushToNewBranch
|
||||
- Text.PushToNewBranch.Title
|
||||
- Text.RemoteCM.CustomAction
|
||||
- Text.Repository.BranchSort
|
||||
- Text.Repository.BranchSort.ByCommitterDate
|
||||
@@ -475,7 +518,25 @@ This document shows the translation status of each locale file in the repository
|
||||
|
||||
</details>
|
||||
|
||||
### 
|
||||
### 
|
||||
|
||||
<details>
|
||||
<summary>Missing keys in ko_KR.axaml</summary>
|
||||
|
||||
- Text.Blame.BlameOnPreviousRevision
|
||||
- Text.Blame.TypeNotSupported
|
||||
- Text.BranchCM.CreatePR
|
||||
- Text.BranchCM.CreatePRForUpstream
|
||||
- Text.Configure.Git.ConventionalTypesOverride
|
||||
- Text.ConfigureCustomActionControls.StringValue.Tip
|
||||
- Text.Launcher.OpenRepository
|
||||
- Text.PushToNewBranch
|
||||
- Text.PushToNewBranch.Title
|
||||
- Text.Submodule.Status.Unmerged
|
||||
|
||||
</details>
|
||||
|
||||
### 
|
||||
|
||||
<details>
|
||||
<summary>Missing keys in pt_BR.axaml</summary>
|
||||
@@ -501,6 +562,9 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.Bisect.Good
|
||||
- Text.Bisect.Skip
|
||||
- Text.Bisect.WaitingForRange
|
||||
- Text.Blame.BlameOnPreviousRevision
|
||||
- Text.BranchCM.CreatePR
|
||||
- Text.BranchCM.CreatePRForUpstream
|
||||
- Text.BranchCM.CustomAction
|
||||
- Text.BranchCM.MergeMultiBranches
|
||||
- Text.BranchCM.ResetToSelectedCommit
|
||||
@@ -557,6 +621,7 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.Configure.CustomAction.Scope.Remote
|
||||
- Text.Configure.CustomAction.Scope.Tag
|
||||
- Text.Configure.CustomAction.WaitForExit
|
||||
- Text.Configure.Git.ConventionalTypesOverride
|
||||
- Text.Configure.Git.PreferredMergeMode
|
||||
- Text.Configure.IssueTracker.AddSampleGerritChangeIdCommit
|
||||
- Text.Configure.IssueTracker.AddSampleGiteeIssue
|
||||
@@ -571,6 +636,7 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.ConfigureCustomActionControls.Label
|
||||
- Text.ConfigureCustomActionControls.Options
|
||||
- Text.ConfigureCustomActionControls.Options.Tip
|
||||
- Text.ConfigureCustomActionControls.StringValue.Tip
|
||||
- Text.ConfigureCustomActionControls.Type
|
||||
- Text.ConfirmEmptyCommit.Continue
|
||||
- Text.ConfirmEmptyCommit.NoLocalChanges
|
||||
@@ -613,7 +679,6 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.GitFlow.FinishWithPush
|
||||
- Text.GitFlow.FinishWithSquash
|
||||
- Text.Hotkeys.Global.Clone
|
||||
- Text.Hotkeys.Global.SwitchWorkspace
|
||||
- Text.Hotkeys.Global.SwitchTab
|
||||
- Text.Hotkeys.TextEditor.OpenExternalMergeTool
|
||||
- Text.InProgress.CherryPick.Head
|
||||
@@ -621,6 +686,7 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.InProgress.Rebase.StoppedAt
|
||||
- Text.InProgress.Revert.Head
|
||||
- Text.InteractiveRebase.ReorderTip
|
||||
- Text.Launcher.OpenRepository
|
||||
- Text.Launcher.Pages
|
||||
- Text.Launcher.Workspaces
|
||||
- Text.Merge.Edit
|
||||
@@ -650,6 +716,8 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.Push.New
|
||||
- Text.Push.Revision
|
||||
- Text.Push.Revision.Title
|
||||
- Text.PushToNewBranch
|
||||
- Text.PushToNewBranch.Title
|
||||
- Text.RemoteCM.CustomAction
|
||||
- Text.Repository.BranchSort
|
||||
- Text.Repository.BranchSort.ByCommitterDate
|
||||
@@ -741,7 +809,7 @@ This document shows the translation status of each locale file in the repository
|
||||
|
||||
### 
|
||||
|
||||
### 
|
||||
### 
|
||||
|
||||
<details>
|
||||
<summary>Missing keys in ta_IN.axaml</summary>
|
||||
@@ -761,7 +829,10 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.Bisect.Good
|
||||
- Text.Bisect.Skip
|
||||
- Text.Bisect.WaitingForRange
|
||||
- Text.Blame.BlameOnPreviousRevision
|
||||
- Text.BranchCM.CompareWithCurrent
|
||||
- Text.BranchCM.CreatePR
|
||||
- Text.BranchCM.CreatePRForUpstream
|
||||
- Text.BranchCM.ResetToSelectedCommit
|
||||
- Text.BranchCM.SwitchToWorktree
|
||||
- Text.BranchTree.Ahead
|
||||
@@ -809,6 +880,7 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.Configure.CustomAction.InputControls.Edit
|
||||
- Text.Configure.CustomAction.Scope.Remote
|
||||
- Text.Configure.CustomAction.Scope.Tag
|
||||
- Text.Configure.Git.ConventionalTypesOverride
|
||||
- Text.Configure.Git.PreferredMergeMode
|
||||
- Text.Configure.IssueTracker.AddSampleGerritChangeIdCommit
|
||||
- Text.Configure.IssueTracker.Share
|
||||
@@ -821,6 +893,7 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.ConfigureCustomActionControls.Label
|
||||
- Text.ConfigureCustomActionControls.Options
|
||||
- Text.ConfigureCustomActionControls.Options.Tip
|
||||
- Text.ConfigureCustomActionControls.StringValue.Tip
|
||||
- Text.ConfigureCustomActionControls.Type
|
||||
- Text.ConfirmEmptyCommit.Continue
|
||||
- Text.ConfirmEmptyCommit.NoLocalChanges
|
||||
@@ -854,10 +927,10 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.ExecuteCustomAction.Repository
|
||||
- Text.GitFlow.FinishWithPush
|
||||
- Text.GitFlow.FinishWithSquash
|
||||
- Text.Hotkeys.Global.SwitchWorkspace
|
||||
- Text.Hotkeys.Global.SwitchTab
|
||||
- Text.Hotkeys.TextEditor.OpenExternalMergeTool
|
||||
- Text.InteractiveRebase.ReorderTip
|
||||
- Text.Launcher.OpenRepository
|
||||
- Text.Launcher.Pages
|
||||
- Text.Launcher.Workspaces
|
||||
- Text.Merge.Edit
|
||||
@@ -876,6 +949,8 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.Push.New
|
||||
- Text.Push.Revision
|
||||
- Text.Push.Revision.Title
|
||||
- Text.PushToNewBranch
|
||||
- Text.PushToNewBranch.Title
|
||||
- Text.RemoteCM.CustomAction
|
||||
- Text.Repository.BranchSort
|
||||
- Text.Repository.BranchSort.ByCommitterDate
|
||||
@@ -947,7 +1022,7 @@ This document shows the translation status of each locale file in the repository
|
||||
|
||||
</details>
|
||||
|
||||
### 
|
||||
### 
|
||||
|
||||
<details>
|
||||
<summary>Missing keys in uk_UA.axaml</summary>
|
||||
@@ -967,6 +1042,9 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.Bisect.Good
|
||||
- Text.Bisect.Skip
|
||||
- Text.Bisect.WaitingForRange
|
||||
- Text.Blame.BlameOnPreviousRevision
|
||||
- Text.BranchCM.CreatePR
|
||||
- Text.BranchCM.CreatePRForUpstream
|
||||
- Text.BranchCM.ResetToSelectedCommit
|
||||
- Text.BranchCM.SwitchToWorktree
|
||||
- Text.BranchTree.Ahead
|
||||
@@ -1014,6 +1092,7 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.Configure.CustomAction.InputControls.Edit
|
||||
- Text.Configure.CustomAction.Scope.Remote
|
||||
- Text.Configure.CustomAction.Scope.Tag
|
||||
- Text.Configure.Git.ConventionalTypesOverride
|
||||
- Text.Configure.IssueTracker.AddSampleGerritChangeIdCommit
|
||||
- Text.Configure.IssueTracker.Share
|
||||
- Text.ConfigureCustomActionControls
|
||||
@@ -1025,6 +1104,7 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.ConfigureCustomActionControls.Label
|
||||
- Text.ConfigureCustomActionControls.Options
|
||||
- Text.ConfigureCustomActionControls.Options.Tip
|
||||
- Text.ConfigureCustomActionControls.StringValue.Tip
|
||||
- Text.ConfigureCustomActionControls.Type
|
||||
- Text.ConfigureWorkspace.Name
|
||||
- Text.ConfirmRestart.Title
|
||||
@@ -1055,10 +1135,10 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.ExecuteCustomAction.Repository
|
||||
- Text.GitFlow.FinishWithPush
|
||||
- Text.GitFlow.FinishWithSquash
|
||||
- Text.Hotkeys.Global.SwitchWorkspace
|
||||
- Text.Hotkeys.Global.SwitchTab
|
||||
- Text.Hotkeys.TextEditor.OpenExternalMergeTool
|
||||
- Text.InteractiveRebase.ReorderTip
|
||||
- Text.Launcher.OpenRepository
|
||||
- Text.Launcher.Pages
|
||||
- Text.Launcher.Workspaces
|
||||
- Text.Merge.Edit
|
||||
@@ -1077,6 +1157,8 @@ This document shows the translation status of each locale file in the repository
|
||||
- Text.Push.New
|
||||
- Text.Push.Revision
|
||||
- Text.Push.Revision.Title
|
||||
- Text.PushToNewBranch
|
||||
- Text.PushToNewBranch.Title
|
||||
- Text.RemoteCM.CustomAction
|
||||
- Text.Repository.BranchSort
|
||||
- Text.Repository.BranchSort.ByCommitterDate
|
||||
|
||||
@@ -65,6 +65,8 @@ namespace SourceGit
|
||||
[JsonSerializable(typeof(Models.ThemeOverrides))]
|
||||
[JsonSerializable(typeof(Models.Version))]
|
||||
[JsonSerializable(typeof(Models.RepositorySettings))]
|
||||
[JsonSerializable(typeof(List<Models.ConventionalCommitType>))]
|
||||
[JsonSerializable(typeof(List<Models.LFSLock>))]
|
||||
[JsonSerializable(typeof(List<Models.VisualStudioInstance>))]
|
||||
[JsonSerializable(typeof(ViewModels.Preferences))]
|
||||
internal partial class JsonCodeGen : JsonSerializerContext { }
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
<ResourceInclude x:Key="es_ES" Source="/Resources/Locales/es_ES.axaml"/>
|
||||
<ResourceInclude x:Key="ja_JP" Source="/Resources/Locales/ja_JP.axaml"/>
|
||||
<ResourceInclude x:Key="ta_IN" Source="/Resources/Locales/ta_IN.axaml"/>
|
||||
<ResourceInclude x:Key="ko_KR" Source="/Resources/Locales/ko_KR.axaml"/>
|
||||
</ResourceDictionary>
|
||||
</Application.Resources>
|
||||
|
||||
|
||||
@@ -262,7 +262,7 @@ namespace SourceGit
|
||||
}
|
||||
}
|
||||
|
||||
public static void SetFonts(string defaultFont, string monospaceFont, bool onlyUseMonospaceFontInEditor)
|
||||
public static void SetFonts(string defaultFont, string monospaceFont)
|
||||
{
|
||||
if (Current is not App app)
|
||||
return;
|
||||
@@ -285,7 +285,7 @@ namespace SourceGit
|
||||
if (!string.IsNullOrEmpty(defaultFont))
|
||||
{
|
||||
monospaceFont = $"fonts:SourceGit#JetBrains Mono,{defaultFont}";
|
||||
resDic.Add("Fonts.Monospace", new FontFamily(monospaceFont));
|
||||
resDic.Add("Fonts.Monospace", FontFamily.Parse(monospaceFont));
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -293,20 +293,7 @@ namespace SourceGit
|
||||
if (!string.IsNullOrEmpty(defaultFont) && !monospaceFont.Contains(defaultFont, StringComparison.Ordinal))
|
||||
monospaceFont = $"{monospaceFont},{defaultFont}";
|
||||
|
||||
resDic.Add("Fonts.Monospace", new FontFamily(monospaceFont));
|
||||
}
|
||||
|
||||
if (onlyUseMonospaceFontInEditor)
|
||||
{
|
||||
if (string.IsNullOrEmpty(defaultFont))
|
||||
resDic.Add("Fonts.Primary", new FontFamily("fonts:Inter#Inter"));
|
||||
else
|
||||
resDic.Add("Fonts.Primary", new FontFamily(defaultFont));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!string.IsNullOrEmpty(monospaceFont))
|
||||
resDic.Add("Fonts.Primary", new FontFamily(monospaceFont));
|
||||
resDic.Add("Fonts.Monospace", FontFamily.Parse(monospaceFont));
|
||||
}
|
||||
|
||||
if (resDic.Count > 0)
|
||||
@@ -383,7 +370,7 @@ namespace SourceGit
|
||||
|
||||
SetLocale(pref.Locale);
|
||||
SetTheme(pref.Theme, pref.ThemeOverrides);
|
||||
SetFonts(pref.DefaultFontFamily, pref.MonospaceFontFamily, pref.OnlyUseMonoFontInEditor);
|
||||
SetFonts(pref.DefaultFontFamily, pref.MonospaceFontFamily);
|
||||
}
|
||||
|
||||
public override void OnFrameworkInitializationCompleted()
|
||||
@@ -676,9 +663,8 @@ namespace SourceGit
|
||||
if (string.IsNullOrEmpty(t))
|
||||
continue;
|
||||
|
||||
// Collapse multiple spaces into single space
|
||||
var prevChar = '\0';
|
||||
var sb = new StringBuilder();
|
||||
var prevChar = '\0';
|
||||
|
||||
foreach (var c in t)
|
||||
{
|
||||
@@ -689,14 +675,16 @@ namespace SourceGit
|
||||
}
|
||||
|
||||
var name = sb.ToString();
|
||||
if (name.Contains('#'))
|
||||
try
|
||||
{
|
||||
if (!name.Equals("fonts:Inter#Inter", StringComparison.Ordinal) &&
|
||||
!name.Equals("fonts:SourceGit#JetBrains Mono", StringComparison.Ordinal))
|
||||
continue;
|
||||
var fontFamily = FontFamily.Parse(name);
|
||||
if (fontFamily.FamilyTypefaces.Count > 0)
|
||||
trimmed.Add(name);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Ignore exceptions.
|
||||
}
|
||||
|
||||
trimmed.Add(name);
|
||||
}
|
||||
|
||||
return trimmed.Count > 0 ? string.Join(',', trimmed) : string.Empty;
|
||||
|
||||
@@ -72,5 +72,20 @@ namespace SourceGit.Commands
|
||||
Args = $"checkout --no-overlay {revision} -- {file.Quoted()}";
|
||||
return await ExecAsync().ConfigureAwait(false);
|
||||
}
|
||||
|
||||
public async Task<bool> MultipleFilesWithRevisionAsync(List<string> files, string revision)
|
||||
{
|
||||
var builder = new StringBuilder();
|
||||
builder
|
||||
.Append("checkout --no-overlay ")
|
||||
.Append(revision)
|
||||
.Append(" --");
|
||||
|
||||
foreach (var f in files)
|
||||
builder.Append(' ').Append(f.Quoted());
|
||||
|
||||
Args = builder.ToString();
|
||||
return await ExecAsync().ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,13 +3,14 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace SourceGit.Commands
|
||||
{
|
||||
public class CountLocalChangesWithoutUntracked : Command
|
||||
public class CountLocalChanges : Command
|
||||
{
|
||||
public CountLocalChangesWithoutUntracked(string repo)
|
||||
public CountLocalChanges(string repo, bool includeUntracked)
|
||||
{
|
||||
var option = includeUntracked ? "-uall" : "-uno";
|
||||
WorkingDirectory = repo;
|
||||
Context = repo;
|
||||
Args = "--no-optional-locks status -uno --ignore-submodules=all --porcelain";
|
||||
Args = $"--no-optional-locks status {option} --ignore-submodules=all --porcelain";
|
||||
}
|
||||
|
||||
public async Task<int> GetResultAsync()
|
||||
@@ -1,16 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Text.Json;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SourceGit.Commands
|
||||
{
|
||||
public partial class LFS : Command
|
||||
public class LFS : Command
|
||||
{
|
||||
[GeneratedRegex(@"^(.+)\s+([\w.]+)\s+\w+:(\d+)$")]
|
||||
private static partial Regex REG_LOCK();
|
||||
|
||||
public LFS(string repo)
|
||||
{
|
||||
WorkingDirectory = repo;
|
||||
@@ -60,30 +56,23 @@ namespace SourceGit.Commands
|
||||
|
||||
public async Task<List<Models.LFSLock>> GetLocksAsync(string remote)
|
||||
{
|
||||
Args = $"lfs locks --remote={remote}";
|
||||
Args = $"lfs locks --json --remote={remote}";
|
||||
|
||||
var rs = await ReadToEndAsync().ConfigureAwait(false);
|
||||
var locks = new List<Models.LFSLock>();
|
||||
|
||||
if (rs.IsSuccess)
|
||||
{
|
||||
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
|
||||
foreach (var line in lines)
|
||||
try
|
||||
{
|
||||
var match = REG_LOCK().Match(line);
|
||||
if (match.Success)
|
||||
{
|
||||
locks.Add(new Models.LFSLock()
|
||||
{
|
||||
File = match.Groups[1].Value,
|
||||
User = match.Groups[2].Value,
|
||||
ID = long.Parse(match.Groups[3].Value),
|
||||
});
|
||||
}
|
||||
var locks = JsonSerializer.Deserialize(rs.StdOut, JsonCodeGen.Default.ListLFSLock);
|
||||
return locks;
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Ignore exceptions.
|
||||
}
|
||||
}
|
||||
|
||||
return locks;
|
||||
return [];
|
||||
}
|
||||
|
||||
public async Task<bool> LockAsync(string remote, string file)
|
||||
|
||||
59
src/Commands/QueryRepositoryStatus.cs
Normal file
59
src/Commands/QueryRepositoryStatus.cs
Normal file
@@ -0,0 +1,59 @@
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SourceGit.Commands
|
||||
{
|
||||
public partial class QueryRepositoryStatus : Command
|
||||
{
|
||||
[GeneratedRegex(@"ahead\s(\d+)")]
|
||||
private static partial Regex REG_AHEAD();
|
||||
|
||||
[GeneratedRegex(@"behind\s(\d+)")]
|
||||
private static partial Regex REG_BEHIND();
|
||||
|
||||
public QueryRepositoryStatus(string repo)
|
||||
{
|
||||
WorkingDirectory = repo;
|
||||
RaiseError = false;
|
||||
}
|
||||
|
||||
public async Task<Models.RepositoryStatus> GetResultAsync()
|
||||
{
|
||||
Args = "branch -l -v --format=\"%(refname:short)%00%(HEAD)%00%(upstream:track,nobracket)\"";
|
||||
var rs = await ReadToEndAsync().ConfigureAwait(false);
|
||||
if (!rs.IsSuccess)
|
||||
return null;
|
||||
|
||||
var status = new Models.RepositoryStatus();
|
||||
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
|
||||
foreach (var line in lines)
|
||||
{
|
||||
var parts = line.Split('\0');
|
||||
if (parts.Length != 3 || !parts[1].Equals("*", StringComparison.Ordinal))
|
||||
continue;
|
||||
|
||||
status.CurrentBranch = parts[0];
|
||||
if (!string.IsNullOrEmpty(parts[2]))
|
||||
ParseTrackStatus(status, parts[2]);
|
||||
}
|
||||
|
||||
status.LocalChanges = await new CountLocalChanges(WorkingDirectory, true) { RaiseError = false }
|
||||
.GetResultAsync()
|
||||
.ConfigureAwait(false);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
private void ParseTrackStatus(Models.RepositoryStatus status, string input)
|
||||
{
|
||||
var aheadMatch = REG_AHEAD().Match(input);
|
||||
if (aheadMatch.Success)
|
||||
status.Ahead = int.Parse(aheadMatch.Groups[1].Value);
|
||||
|
||||
var behindMatch = REG_BEHIND().Match(input);
|
||||
if (behindMatch.Success)
|
||||
status.Behind = int.Parse(behindMatch.Groups[1].Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,9 +5,6 @@ namespace SourceGit.Converters
|
||||
{
|
||||
public static class BoolConverters
|
||||
{
|
||||
public static readonly FuncValueConverter<bool, double> ToPageTabWidth =
|
||||
new FuncValueConverter<bool, double>(x => x ? 200 : double.NaN);
|
||||
|
||||
public static readonly FuncValueConverter<bool, FontWeight> IsBoldToFontWeight =
|
||||
new FuncValueConverter<bool, FontWeight>(x => x ? FontWeight.Bold : FontWeight.Regular);
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace SourceGit.Models
|
||||
|
||||
public bool HasWorktree => !IsCurrent && !string.IsNullOrEmpty(WorktreePath);
|
||||
public string FriendlyName => IsLocal ? Name : $"{Remote}/{Name}";
|
||||
public bool IsTrackStatusVisible => Ahead.Count + Behind.Count > 0;
|
||||
public bool IsTrackStatusVisible => Ahead.Count > 0 || Behind.Count > 0;
|
||||
|
||||
public string TrackStatusDescription
|
||||
{
|
||||
|
||||
@@ -22,9 +22,6 @@ namespace SourceGit.Models
|
||||
{
|
||||
if (remote.TryGetVisitURL(out var link))
|
||||
{
|
||||
if (link.EndsWith(".git"))
|
||||
link = link.Substring(0, link.Length - 4);
|
||||
|
||||
var uri = new Uri(link, UriKind.Absolute);
|
||||
var host = uri.Host;
|
||||
var route = uri.AbsolutePath.TrimStart('/');
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace SourceGit.Models
|
||||
{
|
||||
@@ -8,26 +10,39 @@ namespace SourceGit.Models
|
||||
public string Type { get; set; }
|
||||
public string Description { get; set; }
|
||||
|
||||
public static readonly List<ConventionalCommitType> Supported = [
|
||||
new("Features", "feat", "Adding a new feature"),
|
||||
new("Bug Fixes", "fix", "Fixing a bug"),
|
||||
new("Work In Progress", "wip", "Still being developed and not yet complete"),
|
||||
new("Reverts", "revert", "Undoing a previous commit"),
|
||||
new("Code Refactoring", "refactor", "Restructuring code without changing its external behavior"),
|
||||
new("Performance Improvements", "perf", "Improves performance"),
|
||||
new("Builds", "build", "Changes that affect the build system or external dependencies"),
|
||||
new("Continuous Integrations", "ci", "Changes to CI configuration files and scripts"),
|
||||
new("Documentations", "docs", "Updating documentation"),
|
||||
new("Styles", "style", "Elements or code styles without changing the code logic"),
|
||||
new("Tests", "test", "Adding or updating tests"),
|
||||
new("Chores", "chore", "Other changes that don't modify src or test files"),
|
||||
];
|
||||
|
||||
public ConventionalCommitType(string name, string type, string description)
|
||||
{
|
||||
Name = name;
|
||||
Type = type;
|
||||
Description = description;
|
||||
}
|
||||
|
||||
public static List<ConventionalCommitType> Load(string storageFile)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrEmpty(storageFile) && File.Exists(storageFile))
|
||||
return JsonSerializer.Deserialize(File.ReadAllText(storageFile), JsonCodeGen.Default.ListConventionalCommitType) ?? [];
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Ignore errors.
|
||||
}
|
||||
|
||||
return new List<ConventionalCommitType> {
|
||||
new("Features", "feat", "Adding a new feature"),
|
||||
new("Bug Fixes", "fix", "Fixing a bug"),
|
||||
new("Work In Progress", "wip", "Still being developed and not yet complete"),
|
||||
new("Reverts", "revert", "Undoing a previous commit"),
|
||||
new("Code Refactoring", "refactor", "Restructuring code without changing its external behavior"),
|
||||
new("Performance Improvements", "perf", "Improves performance"),
|
||||
new("Builds", "build", "Changes that affect the build system or external dependencies"),
|
||||
new("Continuous Integrations", "ci", "Changes to CI configuration files and scripts"),
|
||||
new("Documentations", "docs", "Updating documentation"),
|
||||
new("Styles", "style", "Elements or code styles without changing the code logic"),
|
||||
new("Tests", "test", "Adding or updating tests"),
|
||||
new("Chores", "chore", "Other changes that don't modify src or test files"),
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,22 @@
|
||||
namespace SourceGit.Models
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace SourceGit.Models
|
||||
{
|
||||
public class LFSLockOwner
|
||||
{
|
||||
[JsonPropertyName("name")]
|
||||
public string Name { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public class LFSLock
|
||||
{
|
||||
public string File { get; set; } = string.Empty;
|
||||
public string User { get; set; } = string.Empty;
|
||||
public long ID { get; set; } = 0;
|
||||
[JsonPropertyName("id")]
|
||||
public string ID { get; set; } = string.Empty;
|
||||
|
||||
[JsonPropertyName("path")]
|
||||
public string Path { get; set; } = string.Empty;
|
||||
|
||||
[JsonPropertyName("owner")]
|
||||
public LFSLockOwner Owner { get; set; } = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ namespace SourceGit.Models
|
||||
new Locale("繁體中文", "zh_TW"),
|
||||
new Locale("日本語", "ja_JP"),
|
||||
new Locale("தமிழ் (Tamil)", "ta_IN"),
|
||||
new Locale("한국어", "ko_KR"),
|
||||
};
|
||||
|
||||
public Locale(string name, string key)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Web;
|
||||
|
||||
namespace SourceGit.Models
|
||||
{
|
||||
@@ -65,7 +66,6 @@ namespace SourceGit.Models
|
||||
|
||||
if (URL.StartsWith("http", StringComparison.Ordinal))
|
||||
{
|
||||
// Try to remove the user before host and `.git` extension.
|
||||
var uri = new Uri(URL.EndsWith(".git", StringComparison.Ordinal) ? URL.Substring(0, URL.Length - 4) : URL);
|
||||
if (uri.Port != 80 && uri.Port != 443)
|
||||
url = $"{uri.Scheme}://{uri.Host}:{uri.Port}{uri.LocalPath}";
|
||||
@@ -84,5 +84,56 @@ namespace SourceGit.Models
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool TryGetCreatePullRequestURL(out string url, string mergeBranch)
|
||||
{
|
||||
url = null;
|
||||
|
||||
if (!TryGetVisitURL(out var baseURL))
|
||||
return false;
|
||||
|
||||
var uri = new Uri(baseURL);
|
||||
var host = uri.Host;
|
||||
var route = uri.AbsolutePath.TrimStart('/');
|
||||
var encodedBranch = HttpUtility.UrlEncode(mergeBranch);
|
||||
|
||||
if (host.Contains("github.com", StringComparison.Ordinal))
|
||||
{
|
||||
url = $"{baseURL}/compare/{encodedBranch}?expand=1";
|
||||
return true;
|
||||
}
|
||||
|
||||
if (host.Contains("gitlab", StringComparison.Ordinal))
|
||||
{
|
||||
url = $"{baseURL}/-/merge_requests/new?merge_request%5Bsource_branch%5D={encodedBranch}";
|
||||
return true;
|
||||
}
|
||||
|
||||
if (host.Equals("gitee.com", StringComparison.Ordinal))
|
||||
{
|
||||
url = $"{baseURL}/pulls/new?source={encodedBranch}";
|
||||
return true;
|
||||
}
|
||||
|
||||
if (host.Equals("bitbucket.org", StringComparison.Ordinal))
|
||||
{
|
||||
url = $"{baseURL}/pull-requests/new?source={encodedBranch}";
|
||||
return true;
|
||||
}
|
||||
|
||||
if (host.Equals("gitea.org", StringComparison.Ordinal))
|
||||
{
|
||||
url = $"{baseURL}/compare/{encodedBranch}";
|
||||
return true;
|
||||
}
|
||||
|
||||
if (host.Contains("azure.com", StringComparison.Ordinal))
|
||||
{
|
||||
url = $"{baseURL}/pullrequestcreate?sourceRef={encodedBranch}";
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -236,6 +236,12 @@ namespace SourceGit.Models
|
||||
set;
|
||||
} = string.Empty;
|
||||
|
||||
public string ConventionalTypesOverride
|
||||
{
|
||||
get;
|
||||
set;
|
||||
} = string.Empty;
|
||||
|
||||
public Dictionary<string, FilterMode> CollectHistoriesFilters()
|
||||
{
|
||||
var map = new Dictionary<string, FilterMode>();
|
||||
|
||||
29
src/Models/RepositoryStatus.cs
Normal file
29
src/Models/RepositoryStatus.cs
Normal file
@@ -0,0 +1,29 @@
|
||||
namespace SourceGit.Models
|
||||
{
|
||||
public class RepositoryStatus
|
||||
{
|
||||
public string CurrentBranch { get; set; } = string.Empty;
|
||||
public int Ahead { get; set; } = 0;
|
||||
public int Behind { get; set; } = 0;
|
||||
public int LocalChanges { get; set; } = 0;
|
||||
|
||||
public bool IsTrackingStatusVisible
|
||||
{
|
||||
get
|
||||
{
|
||||
return Ahead > 0 || Behind > 0;
|
||||
}
|
||||
}
|
||||
|
||||
public string TrackingDescription
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Ahead > 0)
|
||||
return Behind > 0 ? $"{Ahead}↑ {Behind}↓" : $"{Ahead}↑";
|
||||
|
||||
return Behind > 0 ? $"{Behind}↓" : string.Empty;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
@@ -349,14 +350,10 @@ namespace SourceGit.Models
|
||||
private delegate string VariableGetter(Context context);
|
||||
|
||||
private static readonly IReadOnlyDictionary<string, VariableGetter> s_variables = new Dictionary<string, VariableGetter>() {
|
||||
// legacy variables
|
||||
{"branch_name", GetBranchName},
|
||||
{"files_num", GetFilesCount},
|
||||
{"files", GetFiles},
|
||||
//
|
||||
{"BRANCH", GetBranchName},
|
||||
{"FILES_COUNT", GetFilesCount},
|
||||
{"FILES", GetFiles},
|
||||
{"pure_files", GetPureFiles},
|
||||
};
|
||||
|
||||
private static string GetBranchName(Context context)
|
||||
@@ -377,13 +374,19 @@ namespace SourceGit.Models
|
||||
return string.Join(", ", paths);
|
||||
}
|
||||
|
||||
private static string GetPureFiles(Context context)
|
||||
{
|
||||
var names = new List<string>();
|
||||
foreach (var c in context.changes)
|
||||
names.Add(Path.GetFileName(c.Path));
|
||||
return string.Join(", ", names);
|
||||
}
|
||||
|
||||
private delegate string VariableSliceGetter(Context context, int count);
|
||||
|
||||
private static readonly IReadOnlyDictionary<string, VariableSliceGetter> s_slicedVariables = new Dictionary<string, VariableSliceGetter>() {
|
||||
// legacy variables
|
||||
{"files", GetFilesSliced},
|
||||
//
|
||||
{"FILES", GetFilesSliced},
|
||||
{"pure_files", GetPureFilesSliced}
|
||||
};
|
||||
|
||||
private static string GetFilesSliced(Context context, int count)
|
||||
@@ -400,5 +403,20 @@ namespace SourceGit.Models
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
private static string GetPureFilesSliced(Context context, int count)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
var names = new List<string>();
|
||||
var max = Math.Min(count, context.changes.Count);
|
||||
for (int i = 0; i < max; i++)
|
||||
names.Add(Path.GetFileName(context.changes[i].Path));
|
||||
|
||||
sb.AppendJoin(", ", names);
|
||||
if (max < context.changes.Count)
|
||||
sb.Append($" and {context.changes.Count - max} other files");
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +57,11 @@ namespace SourceGit.Native
|
||||
finder.Fleet(() => FindJetBrainsFleet(localAppDataDir));
|
||||
finder.FindJetBrainsFromToolbox(() => Path.Combine(localAppDataDir, "JetBrains/Toolbox"));
|
||||
finder.SublimeText(() => FindExecutable("subl"));
|
||||
finder.Zed(() => FindExecutable("zeditor"));
|
||||
finder.Zed(() =>
|
||||
{
|
||||
var exec = FindExecutable("zeditor");
|
||||
return string.IsNullOrEmpty(exec) ? FindExecutable("zed") : exec;
|
||||
});
|
||||
return finder.Tools;
|
||||
}
|
||||
|
||||
@@ -130,7 +134,8 @@ namespace SourceGit.Native
|
||||
return test;
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
var local = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".local", "bin", filename);
|
||||
return File.Exists(local) ? local : string.Empty;
|
||||
}
|
||||
|
||||
private string FindJetBrainsFleet(string localAppDataDir)
|
||||
|
||||
@@ -144,7 +144,7 @@ namespace SourceGit.Native
|
||||
break;
|
||||
|
||||
var binDir = Path.GetDirectoryName(OS.GitExecutable)!;
|
||||
var bash = Path.Combine(binDir, "bash.exe");
|
||||
var bash = Path.GetFullPath(Path.Combine(binDir, "..", "git-bash.exe"));
|
||||
if (!File.Exists(bash))
|
||||
break;
|
||||
|
||||
@@ -187,10 +187,11 @@ namespace SourceGit.Native
|
||||
finder.VSCode(FindVSCode);
|
||||
finder.VSCodeInsiders(FindVSCodeInsiders);
|
||||
finder.VSCodium(FindVSCodium);
|
||||
finder.Cursor(FindCursor);
|
||||
finder.Cursor(() => Path.Combine(localAppDataDir, @"Programs\Cursor\Cursor.exe"));
|
||||
finder.Fleet(() => Path.Combine(localAppDataDir, @"Programs\Fleet\Fleet.exe"));
|
||||
finder.FindJetBrainsFromToolbox(() => Path.Combine(localAppDataDir, @"JetBrains\Toolbox"));
|
||||
finder.SublimeText(FindSublimeText);
|
||||
finder.Zed(FindZed);
|
||||
FindVisualStudio(finder);
|
||||
return finder.Tools;
|
||||
}
|
||||
@@ -415,16 +416,20 @@ namespace SourceGit.Native
|
||||
}
|
||||
}
|
||||
|
||||
private string FindCursor()
|
||||
private string FindZed()
|
||||
{
|
||||
var cursorPath = Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
|
||||
"Programs",
|
||||
"Cursor",
|
||||
"Cursor.exe");
|
||||
var currentUser = Microsoft.Win32.RegistryKey.OpenBaseKey(
|
||||
Microsoft.Win32.RegistryHive.CurrentUser,
|
||||
Microsoft.Win32.RegistryView.Registry64);
|
||||
|
||||
if (File.Exists(cursorPath))
|
||||
return cursorPath;
|
||||
// NOTE: this is the official Zed Preview reg data.
|
||||
var preview = currentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{F70E4811-D0E2-4D88-AC99-D63752799F95}_is1");
|
||||
if (preview != null)
|
||||
return preview.GetValue("DisplayIcon") as string;
|
||||
|
||||
var findInPath = new StringBuilder("zed.exe", 512);
|
||||
if (PathFindOnPath(findInPath, null))
|
||||
return findInPath.ToString();
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
<StreamGeometry x:Key="Icons.Compare">M645 448l64 64 220-221L704 64l-64 64 115 115H128v90h628zM375 576l-64-64-220 224L314 960l64-64-116-115H896v-90H262z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.Conflict">M608 0q48 0 88 23t63 63 23 87v70h55q35 0 67 14t57 38 38 57 14 67V831q0 34-14 66t-38 57-57 38-67 13H426q-34 0-66-13t-57-38-38-57-14-66v-70h-56q-34 0-66-14t-57-38-38-57-13-67V174q0-47 23-87T109 23 196 0h412m175 244H426q-46 0-86 22T278 328t-26 85v348H608q47 0 86-22t63-62 25-85l1-348m-269 318q18 0 31 13t13 31-13 31-31 13-31-13-13-31 13-31 31-13m0-212q13 0 22 9t11 22v125q0 14-9 23t-22 10-23-7-11-22l-1-126q0-13 10-23t23-10z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.Copy">M896 811l-128 0c-23 0-43-19-43-43 0-23 19-43 43-43l107 0c13 0 21-9 21-21L896 107c0-13-9-21-21-21L448 85c-13 0-21 9-21 21l0 21c0 23-19 43-43 43-23 0-43-19-43-43L341 85c0-47 38-85 85-85l469 0c47 0 85 38 85 85l0 640C981 772 943 811 896 811zM683 299l0 640c0 47-38 85-85 85L128 1024c-47 0-85-38-85-85L43 299c0-47 38-85 85-85l469 0C644 213 683 252 683 299zM576 299 149 299c-13 0-21 9-21 21l0 597c0 13 9 21 21 21l427 0c13 0 21-9 21-21L597 320C597 307 589 299 576 299z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.CreatePR">M339 297c17-23 25-51 25-83 2-42-12-79-43-108S255 62 215 65c-32 0-60 8-84 25s-42 39-54 67-15 56-10 86 19 55 40 76c21 21 47 35 76 41v303c-30 6-55 20-76 41-21 21-35 47-40 76-5 30-2 58 10 86s30 50 54 67 52 25 83 25 59-8 84-25c25-17 45-39 57-67 6-19 10-39 10-61 0-30-8-57-25-83-21-34-52-55-92-64v-299l25-6c28-13 50-32 67-57zm-45 471c8 15 12 30 11 46-1 16-6 31-16 46-10 15-23 25-40 32s-34 8-51 5-32-11-46-24-22-28-24-45c-6-28-1-53 18-75s41-33 68-33c17 0 32 4 46 13 14 8 25 20 33 35zM167 288c-15-11-26-24-33-41-7-17-10-34-6-51 3-17 11-32 24-45s28-21 46-25 36-3 53 5c17 7 30 18 40 32 10 14 15 29 16 46 1 17-3 33-11 48-8 15-20 27-33 35-14 8-29 13-46 13s-33-5-48-16zm615 45c2-19-1-38-10-57-11-28-29-50-54-67s-53-25-83-25h-111l76-76-45-41-127 127v41l127 127 45-41-76-76h111c23 0 44 8 62 25 18 17 27 38 27 64v89h57V332zm0 449H960v-61H782V542h-61v178H543v61h178v178h61V781z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.Cut">M280 145l243 341 0-0 45 63-0 0 79 110a143 143 0 11-36 75l-88-123-92 126c1 4 1 9 1 13l0 5a143 143 0 11-36-95l82-113L221 188l60-43zm473 541a70 70 0 100 140 70 70 0 000-140zm-463 0a70 70 0 100 140 70 70 0 000-140zM772 145l59 43-232 319-45-63L772 145z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.Detached">M128 183C128 154 154 128 183 128h521c30 0 55 26 55 55v38c0 17-17 34-34 34s-34-17-34-34v-26H196v495h26c17 0 34 17 34 34s-17 34-34 34h-38c-30 0-55-26-55-55V183zM380 896h-34c-26 0-47-21-47-47v-90h68V828h64V896H380c4 0 0 0 0 0zM759 828V896h90c26 0 47-21 47-47v-90h-68V828h-68zM828 435H896V346c0-26-21-47-47-47h-90v68H828v68zM435 299v68H367V439H299V346C299 320 320 299 346 299h90zM367 649H299v-107h68v107zM546 367V299h107v68h-107zM828 546H896v107h-68v-107zM649 828V896h-107v-68h107zM730 508v188c0 17-17 34-34 34h-188c-17 0-34-17-34-34s17-34 34-34h102l-124-124c-13-13-13-34 0-47 13-13 34-13 47 0l124 124V512c0-17 17-34 34-34 21-4 38 9 38 30z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.Detail">M889 0H135c-32 0-59 26-59 59v906c0 32 26 59 59 59h753c32 0 59-26 59-59v-906c1-33-26-59-58-59zm-165 177c31 0 56 25 56 56s-25 56-56 56-56-25-56-56 25-56 56-56zm-212 0c31 0 56 25 56 56S543 288 512 288s-56-25-56-56S481 177 512 177zm-212 0c31 0 56 25 56 56s-25 56-56 56-56-25-56-56 25-56 56-56zm209 606H285c-25 0-44-20-44-44 0-25 20-44 44-44h224c25 0 44 20 44 44 0 24-20 44-44 44zm230-212H285c-25 0-44-20-44-44 0-25 20-44 44-44h453c25 0 44 20 44 44 1 24-20 44-44 44z</StreamGeometry>
|
||||
@@ -58,6 +59,7 @@
|
||||
<StreamGeometry x:Key="Icons.GitFlow.Release">M884 159l-18-18a43 43 0 00-38-12l-235 43a166 166 0 00-101 60L400 349a128 128 0 00-148 47l-120 171a21 21 0 005 29l17 12a128 128 0 00178-32l27-38 124 124-38 27a128 128 0 00-32 178l12 17a21 21 0 0029 5l171-120a128 128 0 0047-148l117-92A166 166 0 00853 431l43-235a43 43 0 00-12-38zm-177 249a64 64 0 110-90 64 64 0 010 90zm-373 312a21 21 0 010 30l-139 139a21 21 0 01-30 0l-30-30a21 21 0 010-30l139-139a21 21 0 0130 0z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.GitHub">M525 0C235 0 0 235 0 525c0 232 150 429 359 498 26 5 36-11 36-25 0-12-1-54-1-97-146 31-176-63-176-63-23-61-58-76-58-76-48-32 3-32 3-32 53 3 81 54 81 54 47 80 123 57 153 43 4-34 18-57 33-70-116-12-239-57-239-259 0-57 21-104 54-141-5-13-23-67 5-139 0 0 44-14 144 54 42-11 87-17 131-17s90 6 131 17C756 203 801 217 801 217c29 72 10 126 5 139 34 37 54 83 54 141 0 202-123 246-240 259 19 17 36 48 36 97 0 70-1 127-1 144 0 14 10 30 36 25 209-70 359-266 359-498C1050 235 814 0 525 0z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.GitIgnore">M590 74 859 342V876c0 38-31 68-68 68H233c-38 0-68-31-68-68V142c0-38 31-68 68-68h357zm-12 28H233a40 40 0 00-40 38L193 142v734a40 40 0 0038 40L233 916h558a40 40 0 0040-38L831 876V354L578 102zM855 371h-215c-46 0-83-36-84-82l0-2V74h28v213c0 30 24 54 54 55l2 0h215v28zM57 489m28 0 853 0q28 0 28 28l0 284q0 28-28 28l-853 0q-28 0-28-28l0-284q0-28 28-28ZM157 717c15 0 29-6 37-13v-51h-41v22h17v18c-2 2-6 3-10 3-21 0-30-13-30-34 0-21 12-34 28-34 9 0 15 4 20 9l14-17C184 610 172 603 156 603c-29 0-54 21-54 57 0 37 24 56 54 56zM245 711v-108h-34v108h34zm69 0v-86H341V603H262v22h28V711h24zM393 711v-108h-34v108h34zm66 6c15 0 29-6 37-13v-51h-41v22h17v18c-2 2-6 3-10 3-21 0-30-13-30-34 0-21 12-34 28-34 9 0 15 4 20 9l14-17C485 610 474 603 458 603c-29 0-54 21-54 57 0 37 24 56 54 56zm88-6v-36c0-13-2-28-3-40h1l10 24 25 52H603v-108h-23v36c0 13 2 28 3 40h-1l-10-24L548 603H523v108h23zM677 717c30 0 51-22 51-57 0-36-21-56-51-56-30 0-51 20-51 56 0 36 21 57 51 57zm3-23c-16 0-26-12-26-32 0-19 10-31 26-31 16 0 26 11 26 31S696 694 680 694zm93 17v-38h13l21 38H836l-25-43c12-5 19-15 19-31 0-26-20-34-44-34H745v108h27zm16-51H774v-34h15c16 0 25 4 25 16s-9 18-25 18zM922 711v-22h-43v-23h35v-22h-35V625h41V603H853v108h68z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.GotoParent">M727 641c-78 0-142 55-157 128H256V320h251c16 108 108 192 221 192 124 0 224-100 224-224S851 64 727 64c-113 0-205 84-221 192H96c-18 0-32 14-32 32s14 32 32 32h96v482c0 18 14 32 32 32h347c15 73 79 128 157 128 88 0 160-72 160-160s-72-160-160-160zm0 256c-53 0-96-43-96-96s43-96 96-96 96 43 96 96-43 96-96 96z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.Grid">M30 271l241 0 0-241-241 0 0 241zM392 271l241 0 0-241-241 0 0 241zM753 30l0 241 241 0 0-241-241 0zM30 632l241 0 0-241-241 0 0 241zM392 632l241 0 0-241-241 0 0 241zM753 632l241 0 0-241-241 0 0 241zM30 994l241 0 0-241-241 0 0 241zM392 994l241 0 0-241-241 0 0 241zM753 994l241 0 0-241-241 0 0 241z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.Hash">M566 585l37-146-145 0-37 146 145 0zM1005 297l-32 128q-4 14-18 14l-187 0-37 146 178 0q9 0 14 7 6 8 3 16l-32 128q-3 14-18 14l-187 0-46 187q-4 14-18 14l-128 0q-9 0-15-7-5-7-3-16l45-178-145 0-46 187q-4 14-18 14l-129 0q-9 0-14-7-5-7-3-16l45-178-178 0q-9 0-14-7-5-7-3-16l32-128q4-14 18-14l187 0 37-146-178 0q-9 0-14-7-6-8-3-16l32-128q3-14 18-14l187 0 46-187q4-14 18-14l128 0q9 0 14 7 5 7 3 16l-45 178 145 0 46-187q4-14 18-14l128 0q9 0 14 7 5 7 3 16l-45 178 178 0q9 0 14 7 5 7 3 16z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.Head">M0 512M1024 512M512 0M512 1024M955 323q0 23-16 39l-414 414-78 78q-16 16-39 16t-39-16l-78-78-207-207q-16-16-16-39t16-39l78-78q16-16 39-16t39 16l168 169 375-375q16-16 39-16t39 16l78 78q16 16 16 39z</StreamGeometry>
|
||||
@@ -87,7 +89,6 @@
|
||||
<StreamGeometry x:Key="Icons.Minus">M0 512M1024 512M512 0M512 1024M64 576h896V448H64z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.Modified">M896 64H128C96 64 64 96 64 128v768c0 32 32 64 64 64h768c32 0 64-32 64-64V128c0-32-32-64-64-64z m-64 736c0 16-17 32-32 32H224c-18 0-32-12-32-32V224c0-16 16-32 32-32h576c15 0 32 16 32 32v576zM512 384c-71 0-128 57-128 128s57 128 128 128 128-57 128-128-57-128-128-128z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.More">M0 512M1024 512M512 0M512 1024M813 448c-46 0-83 37-83 83 0 46 37 83 83 83 46 0 83-37 83-83 0-46-37-83-83-83zM211 448C165 448 128 485 128 531c0 46 37 83 83 83 46 0 83-37 83-83 0-46-37-83-83-83zM512 448c-46 0-83 37-83 83 0 46 37 83 83 83 46 0 83-37 83-83C595 485 558 448 512 448z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.Move">M299 811 299 725 384 725 384 811 299 811M469 811 469 725 555 725 555 811 469 811M640 811 640 725 725 725 725 811 640 811M299 640 299 555 384 555 384 640 299 640M469 640 469 555 555 555 555 640 469 640M640 640 640 555 725 555 725 640 640 640M299 469 299 384 384 384 384 469 299 469M469 469 469 384 555 384 555 469 469 469M640 469 640 384 725 384 725 469 640 469M299 299 299 213 384 213 384 299 299 299M469 299 469 213 555 213 555 299 469 299M640 299 640 213 725 213 725 299 640 299Z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.MoveTo">M64 363l0 204 265 0L329 460c0-11 6-18 14-20C349 437 355 437 362 441c93 60 226 149 226 149 33 22 34 60 0 82 0 0-133 89-226 149-14 9-32-3-32-18l-1-110L64 693l0 117c0 41 34 75 75 75l746 0c41 0 75-34 75-74L960 364c0-0 0-1 0-1L64 363zM64 214l0 75 650 0-33-80c-16-38-62-69-103-69l-440 0C97 139 64 173 64 214z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.OpenWith">M683 409v204L1024 308 683 0v191c-413 0-427 526-427 526c117-229 203-307 427-307zm85 492H102V327h153s38-63 114-122H51c-28 0-51 27-51 61v697c0 34 23 61 51 61h768c28 0 51-27 51-61V614l-102 100v187z</StreamGeometry>
|
||||
<StreamGeometry x:Key="Icons.OrderByName">M841 627A43 43 0 00811 555h-299v85h196l-183 183A43 43 0 00555 896h299v-85h-196l183-183zM299 170H213v512H85l171 171 171-171H299zM725 128h-85c-18 0-34 11-40 28l-117 313h91L606 384h154l32 85h91l-117-313A43 43 0 00725 128zm-88 171 32-85h26l32 85h-90z</StreamGeometry>
|
||||
|
||||
@@ -56,11 +56,14 @@
|
||||
<x:String x:Key="Text.Bisect.Skip">Überspringen</x:String>
|
||||
<x:String x:Key="Text.Bisect.WaitingForRange">Bisecting. Aktuellen Commit als gut oder schlecht markieren und einen anderen auschecken.</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">Blame</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">BLAME WIRD BEI DIESER DATEI NICHT UNTERSTÜTZT!!!</x:String>
|
||||
<x:String x:Key="Text.Blame.BlameOnPreviousRevision" xml:space="preserve">Blame auf vorheriger Revision</x:String>
|
||||
<x:String x:Key="Text.Blame.TypeNotSupported" xml:space="preserve">BLAME WIRD BEI DIESER DATEI NICHT UNTERSTÜTZT!!!</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Checkout" xml:space="preserve">Auschecken von ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithCurrent" xml:space="preserve">Mit ${0}$ vergleichen</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithWorktree" xml:space="preserve">Mit Worktree vergleichen</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CopyName" xml:space="preserve">Branch-Namen kopieren</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CreatePR" xml:space="preserve">PR erstellen...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CreatePRForUpstream" xml:space="preserve">PR für Upstream ${0}$ erstellen...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CustomAction" xml:space="preserve">Benutzerdefinierte Aktion</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Delete" xml:space="preserve">Lösche ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.DeleteMultiBranches" xml:space="preserve">Lösche alle ausgewählten {0} Branches</x:String>
|
||||
@@ -186,7 +189,14 @@
|
||||
<x:String x:Key="Text.CommitMessageTextBox.SubjectPlaceholder" xml:space="preserve">Commit-Nachricht</x:String>
|
||||
<x:String x:Key="Text.Configure" xml:space="preserve">Repository Einstellungen</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate" xml:space="preserve">COMMIT TEMPLATE</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.BuiltinVars" xml:space="preserve">Du kannst ${files_num}, ${branch_name}, ${files} und ${files:N} verwenden, wobei N die maximale Anzahl an auszugebenden Dateipfaden ist.</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.BuiltinVars" xml:space="preserve">Vordefinierte Parameter:
|
||||
|
||||
${branch_name} Name des aktuellen lokalen Branches.
|
||||
${files_num} Anzahl der geänderten Dateien
|
||||
${files} Pfade der geänderten Dateien
|
||||
${files:N} Maximale Anzahl N an Pfaden geänderter Dateien
|
||||
${pure_files} Wie ${files}, aber nur die reinen Dateinamen
|
||||
${pure_files:N} Wie ${files:N}, aber ohne Ordner</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Content" xml:space="preserve">Template Inhalt:</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Name" xml:space="preserve">Template Name:</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction" xml:space="preserve">BENUTZERDEFINIERTE AKTION</x:String>
|
||||
@@ -217,6 +227,7 @@
|
||||
<x:String x:Key="Text.Configure.Git" xml:space="preserve">GIT</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.AutoFetch" xml:space="preserve">Remotes automatisch fetchen</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.AutoFetchIntervalSuffix" xml:space="preserve">Minute(n)</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.ConventionalTypesOverride" xml:space="preserve">Typen für konventionellen Commit</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.DefaultRemote" xml:space="preserve">Standard Remote</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.PreferredMergeMode" xml:space="preserve">Bevorzugter Merge Modus</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker" xml:space="preserve">TICKETSYSTEM</x:String>
|
||||
@@ -250,6 +261,7 @@
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Label" xml:space="preserve">Bezeichnung:</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Options" xml:space="preserve">Einträge:</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Options.Tip" xml:space="preserve">Nutze '|', um Einträge zu trennen</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.StringValue.Tip" xml:space="preserve">Die vordefinierten Parameter ${REPO}, ${REMOTE}, ${BRANCH}, ${BRANCH_FRIENDLY_NAME}, ${SHA}, and ${TAG} bleiben hier verwendbar</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Type" xml:space="preserve">Typ:</x:String>
|
||||
<x:String x:Key="Text.ConfigureWorkspace" xml:space="preserve">Arbeitsplätze</x:String>
|
||||
<x:String x:Key="Text.ConfigureWorkspace.Color" xml:space="preserve">Farbe</x:String>
|
||||
@@ -463,7 +475,6 @@
|
||||
<x:String x:Key="Text.Hotkeys.Global.GotoPrevTab" xml:space="preserve">Zum vorherigen Tab wechseln</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.NewTab" xml:space="preserve">Neuen Tab erstellen</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.OpenPreferences" xml:space="preserve">Einstellungen öffnen</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchWorkspace" xml:space="preserve">Aktiven Arbeitsplatz wechseln</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchTab" xml:space="preserve">Aktiven Tab wechseln</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">REPOSITORY</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">Gestagte Änderungen committen</x:String>
|
||||
@@ -506,6 +517,7 @@
|
||||
<x:String x:Key="Text.IssueLinkCM.OpenInBrowser" xml:space="preserve">In Browser öffnen</x:String>
|
||||
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">FEHLER</x:String>
|
||||
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">INFO</x:String>
|
||||
<x:String x:Key="Text.Launcher.OpenRepository" xml:space="preserve">Repositorys öffnen</x:String>
|
||||
<x:String x:Key="Text.Launcher.Pages" xml:space="preserve">Tabs</x:String>
|
||||
<x:String x:Key="Text.Launcher.Workspaces" xml:space="preserve">Arbeitsplätze</x:String>
|
||||
<x:String x:Key="Text.Merge" xml:space="preserve">Branch mergen</x:String>
|
||||
@@ -563,11 +575,9 @@
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Default" xml:space="preserve">Standard</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Editor" xml:space="preserve">Texteditor</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.MonospaceFont" xml:space="preserve">Monospace-Schriftart</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.OnlyUseMonoFontInEditor" xml:space="preserve">Verwende die Monospace-Schriftart nur im Texteditor</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.Theme" xml:space="preserve">Design</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.ThemeOverrides" xml:space="preserve">Design-Anpassungen</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseAutoHideScrollBars" xml:space="preserve">Scrollbars automatisch ausblenden</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseFixedTabWidth" xml:space="preserve">Fixe Tab-Breite in Titelleiste</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseNativeWindowFrame" xml:space="preserve">Verwende nativen Fensterrahmen</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge" xml:space="preserve">DIFF/MERGE TOOL</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge.Path" xml:space="preserve">Installationspfad</x:String>
|
||||
@@ -642,6 +652,8 @@
|
||||
<x:String x:Key="Text.PushTag.PushAllRemotes" xml:space="preserve">Zu allen Remotes pushen</x:String>
|
||||
<x:String x:Key="Text.PushTag.Remote" xml:space="preserve">Remote:</x:String>
|
||||
<x:String x:Key="Text.PushTag.Tag" xml:space="preserve">Tag:</x:String>
|
||||
<x:String x:Key="Text.PushToNewBranch" xml:space="preserve">Push zu NEUEM Branch</x:String>
|
||||
<x:String x:Key="Text.PushToNewBranch.Title" xml:space="preserve">Eingabe des Namens des neuen Remote-Branch:</x:String>
|
||||
<x:String x:Key="Text.Quit" xml:space="preserve">Schließen</x:String>
|
||||
<x:String x:Key="Text.Rebase" xml:space="preserve">Aktuellen Branch rebasen</x:String>
|
||||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">Lokale Änderungen stashen & wieder anwenden</x:String>
|
||||
|
||||
@@ -52,11 +52,14 @@
|
||||
<x:String x:Key="Text.Bisect.Skip">Skip</x:String>
|
||||
<x:String x:Key="Text.Bisect.WaitingForRange">Bisecting. Mark current commit as good or bad and checkout another one.</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">Blame</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">BLAME ON THIS FILE IS NOT SUPPORTED!!!</x:String>
|
||||
<x:String x:Key="Text.Blame.BlameOnPreviousRevision" xml:space="preserve">Blame on Previous Revision</x:String>
|
||||
<x:String x:Key="Text.Blame.TypeNotSupported" xml:space="preserve">BLAME ON THIS FILE IS NOT SUPPORTED!!!</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Checkout" xml:space="preserve">Checkout ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithCurrent" xml:space="preserve">Compare with ${0}$</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithWorktree" xml:space="preserve">Compare with Worktree</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CopyName" xml:space="preserve">Copy Branch Name</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CreatePR" xml:space="preserve">Create PR...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CreatePRForUpstream" xml:space="preserve">Create PR for upstream ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CustomAction" xml:space="preserve">Custom Action</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Delete" xml:space="preserve">Delete ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.DeleteMultiBranches" xml:space="preserve">Delete selected {0} branches</x:String>
|
||||
@@ -182,7 +185,14 @@
|
||||
<x:String x:Key="Text.CommitMessageTextBox.SubjectPlaceholder" xml:space="preserve">Enter commit subject</x:String>
|
||||
<x:String x:Key="Text.Configure" xml:space="preserve">Repository Configure</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate" xml:space="preserve">COMMIT TEMPLATE</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.BuiltinVars" xml:space="preserve">You can use ${files_num}, ${branch_name}, ${files} and ${files:N} where N is the max number of file paths to output.</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.BuiltinVars" xml:space="preserve">Built-in parameters:
|
||||
|
||||
${branch_name} Current local branch name.
|
||||
${files_num} Number of changed files
|
||||
${files} Paths of changed files
|
||||
${files:N} Max N number of paths of changed files
|
||||
${pure_files} Likes ${files}, but only pure file names
|
||||
${pure_files:N} Likes ${files:N}, but without folders</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Content" xml:space="preserve">Template Content:</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Name" xml:space="preserve">Template Name:</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction" xml:space="preserve">CUSTOM ACTION</x:String>
|
||||
@@ -212,6 +222,7 @@
|
||||
<x:String x:Key="Text.Configure.Git" xml:space="preserve">GIT</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.AutoFetch" xml:space="preserve">Fetch remotes automatically</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.AutoFetchIntervalSuffix" xml:space="preserve">Minute(s)</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.ConventionalTypesOverride" xml:space="preserve">Conventional Commit Types</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.DefaultRemote" xml:space="preserve">Default Remote</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.PreferredMergeMode" xml:space="preserve">Preferred Merge Mode</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker" xml:space="preserve">ISSUE TRACKER</x:String>
|
||||
@@ -245,6 +256,7 @@
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Label" xml:space="preserve">Label:</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Options" xml:space="preserve">Options:</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Options.Tip" xml:space="preserve">Use '|' as delimiter for options</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.StringValue.Tip" xml:space="preserve">The built-in variables ${REPO}, ${REMOTE}, ${BRANCH}, ${BRANCH_FRIENDLY_NAME}, ${SHA}, and ${TAG} remain available here</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Type" xml:space="preserve">Type:</x:String>
|
||||
<x:String x:Key="Text.ConfigureWorkspace" xml:space="preserve">Workspaces</x:String>
|
||||
<x:String x:Key="Text.ConfigureWorkspace.Color" xml:space="preserve">Color</x:String>
|
||||
@@ -458,7 +470,6 @@
|
||||
<x:String x:Key="Text.Hotkeys.Global.GotoPrevTab" xml:space="preserve">Go to previous tab</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.NewTab" xml:space="preserve">Create new tab</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.OpenPreferences" xml:space="preserve">Open Preferences dialog</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchWorkspace" xml:space="preserve">Switch active workspace</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchTab" xml:space="preserve">Switch active tab</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">REPOSITORY</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">Commit staged changes</x:String>
|
||||
@@ -501,6 +512,7 @@
|
||||
<x:String x:Key="Text.IssueLinkCM.OpenInBrowser" xml:space="preserve">Open in Browser</x:String>
|
||||
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">ERROR</x:String>
|
||||
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">NOTICE</x:String>
|
||||
<x:String x:Key="Text.Launcher.OpenRepository" xml:space="preserve">Open Repositories</x:String>
|
||||
<x:String x:Key="Text.Launcher.Pages" xml:space="preserve">Tabs</x:String>
|
||||
<x:String x:Key="Text.Launcher.Workspaces" xml:space="preserve">Workspaces</x:String>
|
||||
<x:String x:Key="Text.Merge" xml:space="preserve">Merge Branch</x:String>
|
||||
@@ -558,11 +570,9 @@
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Default" xml:space="preserve">Default</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Editor" xml:space="preserve">Editor</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.MonospaceFont" xml:space="preserve">Monospace Font</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.OnlyUseMonoFontInEditor" xml:space="preserve">Use monospace font only in text editor</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.Theme" xml:space="preserve">Theme</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.ThemeOverrides" xml:space="preserve">Theme Overrides</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseAutoHideScrollBars" xml:space="preserve">Use auto-hide scrollbars</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseFixedTabWidth" xml:space="preserve">Use fixed tab width in titlebar</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseNativeWindowFrame" xml:space="preserve">Use native window frame</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge" xml:space="preserve">DIFF/MERGE TOOL</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge.Path" xml:space="preserve">Install Path</x:String>
|
||||
@@ -637,6 +647,8 @@
|
||||
<x:String x:Key="Text.PushTag.PushAllRemotes" xml:space="preserve">Push to all remotes</x:String>
|
||||
<x:String x:Key="Text.PushTag.Remote" xml:space="preserve">Remote:</x:String>
|
||||
<x:String x:Key="Text.PushTag.Tag" xml:space="preserve">Tag:</x:String>
|
||||
<x:String x:Key="Text.PushToNewBranch" xml:space="preserve">Push to a NEW branch</x:String>
|
||||
<x:String x:Key="Text.PushToNewBranch.Title" xml:space="preserve">Input name of the new remote branch:</x:String>
|
||||
<x:String x:Key="Text.Quit" xml:space="preserve">Quit</x:String>
|
||||
<x:String x:Key="Text.Rebase" xml:space="preserve">Rebase Current Branch</x:String>
|
||||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">Stash & reapply local changes</x:String>
|
||||
|
||||
@@ -56,11 +56,13 @@
|
||||
<x:String x:Key="Text.Bisect.Skip">Saltar</x:String>
|
||||
<x:String x:Key="Text.Bisect.WaitingForRange">Bisecting. Marcar el commit actual como bueno o malo y revisar otro.</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">Blame</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">¡BLAME EN ESTE ARCHIVO NO SOPORTADO!</x:String>
|
||||
<x:String x:Key="Text.Blame.TypeNotSupported" xml:space="preserve">¡BLAME EN ESTE ARCHIVO NO SOPORTADO!</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Checkout" xml:space="preserve">Checkout ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithCurrent" xml:space="preserve">Comparar con ${0}$</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithWorktree" xml:space="preserve">Comparar con Worktree</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CopyName" xml:space="preserve">Copiar Nombre de la Rama</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CreatePR" xml:space="preserve">Crear PR...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CreatePRForUpstream" xml:space="preserve">Crear PR para upstream ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CustomAction" xml:space="preserve">Acción personalizada</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Delete" xml:space="preserve">Eliminar ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.DeleteMultiBranches" xml:space="preserve">Eliminar {0} ramas seleccionadas</x:String>
|
||||
@@ -186,7 +188,6 @@
|
||||
<x:String x:Key="Text.CommitMessageTextBox.SubjectPlaceholder" xml:space="preserve">Introducir asunto del commit</x:String>
|
||||
<x:String x:Key="Text.Configure" xml:space="preserve">Configurar Repositorio</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate" xml:space="preserve">PLANTILLA DE COMMIT</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.BuiltinVars" xml:space="preserve">Puedes usar ${files_num}, ${branch_name}, ${files} y ${files:N} donde N es el número máximo de rutas de archivo a la salida.</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Content" xml:space="preserve">Contenido de la Plantilla:</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Name" xml:space="preserve">Nombre de la Plantilla:</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction" xml:space="preserve">ACCIÓN PERSONALIZADA</x:String>
|
||||
@@ -462,7 +463,6 @@
|
||||
<x:String x:Key="Text.Hotkeys.Global.GotoPrevTab" xml:space="preserve">Ir a la página anterior</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.NewTab" xml:space="preserve">Crear nueva página</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.OpenPreferences" xml:space="preserve">Abrir diálogo de preferencias</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchWorkspace" xml:space="preserve">Cambiar espacio de trabajo activo</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchTab" xml:space="preserve">Cambiar página activa</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">REPOSITORIO</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">Commit cambios staged</x:String>
|
||||
@@ -562,11 +562,9 @@
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Default" xml:space="preserve">Por defecto</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Editor" xml:space="preserve">Editor</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.MonospaceFont" xml:space="preserve">Fuente Monospace</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.OnlyUseMonoFontInEditor" xml:space="preserve">Usar solo fuente monospace en el editor de texto</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.Theme" xml:space="preserve">Tema</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.ThemeOverrides" xml:space="preserve">Sobreescritura de temas</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseAutoHideScrollBars" xml:space="preserve">Usar barras de desplazamiento que se oculten automáticamente</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseFixedTabWidth" xml:space="preserve">Usar ancho de pestaña fijo en la barra de título</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseNativeWindowFrame" xml:space="preserve">Usar marco de ventana nativo</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge" xml:space="preserve">HERRAMIENTA DIFF/MERGE</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge.Path" xml:space="preserve">Ruta de instalación</x:String>
|
||||
@@ -641,6 +639,8 @@
|
||||
<x:String x:Key="Text.PushTag.PushAllRemotes" xml:space="preserve">Push a todos los remotos</x:String>
|
||||
<x:String x:Key="Text.PushTag.Remote" xml:space="preserve">Remoto:</x:String>
|
||||
<x:String x:Key="Text.PushTag.Tag" xml:space="preserve">Etiqueta:</x:String>
|
||||
<x:String x:Key="Text.PushToNewBranch" xml:space="preserve">Push a una NUEVA rama</x:String>
|
||||
<x:String x:Key="Text.PushToNewBranch.Title" xml:space="preserve">Nombre de entrada de la nueva rama remota:</x:String>
|
||||
<x:String x:Key="Text.Quit" xml:space="preserve">Salir</x:String>
|
||||
<x:String x:Key="Text.Rebase" xml:space="preserve">Rebase Rama Actual</x:String>
|
||||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">Stash & reaplicar cambios locales</x:String>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">Rafraîchir</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">FICHIER BINAIRE NON SUPPORTÉ !!!</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">Blâme</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">LE BLÂME SUR CE FICHIER N'EST PAS SUPPORTÉ!!!</x:String>
|
||||
<x:String x:Key="Text.Blame.TypeNotSupported" xml:space="preserve">LE BLÂME SUR CE FICHIER N'EST PAS SUPPORTÉ!!!</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Checkout" xml:space="preserve">Récupérer ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithCurrent" xml:space="preserve">Comparer avec ${0}$</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithWorktree" xml:space="preserve">Comparer avec le worktree</x:String>
|
||||
@@ -436,10 +436,8 @@
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Default" xml:space="preserve">Défaut</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Editor" xml:space="preserve">Éditeur</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.MonospaceFont" xml:space="preserve">Police monospace</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.OnlyUseMonoFontInEditor" xml:space="preserve">N'utiliser que des polices monospace pour l'éditeur de texte</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.Theme" xml:space="preserve">Thème</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.ThemeOverrides" xml:space="preserve">Dérogations de thème</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseFixedTabWidth" xml:space="preserve">Utiliser des onglets de taille fixe dans la barre de titre</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseNativeWindowFrame" xml:space="preserve">Utiliser un cadre de fenêtre natif</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge" xml:space="preserve">OUTIL DIFF/MERGE</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge.Path" xml:space="preserve">Chemin d'installation</x:String>
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<x:String x:Key="Text.Bisect.Skip">Lewati</x:String>
|
||||
<x:String x:Key="Text.Bisect.WaitingForRange">Bisect berjalan. Tandai commit saat ini sebagai baik atau buruk dan checkout yang lain.</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">Blame</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">BLAME PADA BERKAS INI TIDAK DIDUKUNG!!!</x:String>
|
||||
<x:String x:Key="Text.Blame.TypeNotSupported" xml:space="preserve">BLAME PADA BERKAS INI TIDAK DIDUKUNG!!!</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Checkout" xml:space="preserve">Checkout ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithCurrent" xml:space="preserve">Bandingkan dengan ${0}$</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithWorktree" xml:space="preserve">Bandingkan dengan Worktree</x:String>
|
||||
@@ -184,7 +184,6 @@
|
||||
<x:String x:Key="Text.CommitMessageTextBox.SubjectPlaceholder" xml:space="preserve">Masukkan subjek commit</x:String>
|
||||
<x:String x:Key="Text.Configure" xml:space="preserve">Konfigurasi Repositori</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate" xml:space="preserve">TEMPLATE COMMIT</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.BuiltinVars" xml:space="preserve">Anda dapat menggunakan ${files_num}, ${branch_name}, ${files} dan ${files:N} dimana N adalah jumlah maksimal jalur berkas yang ditampilkan.</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Content" xml:space="preserve">Konten Template:</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Name" xml:space="preserve">Nama Template:</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction" xml:space="preserve">AKSI KUSTOM</x:String>
|
||||
@@ -457,7 +456,6 @@
|
||||
<x:String x:Key="Text.Hotkeys.Global.GotoPrevTab" xml:space="preserve">Ke tab sebelumnya</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.NewTab" xml:space="preserve">Buat tab baru</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.OpenPreferences" xml:space="preserve">Buka dialog Preferensi</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchWorkspace" xml:space="preserve">Ganti workspace aktif</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchTab" xml:space="preserve">Ganti tab aktif</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">REPOSITORI</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">Commit perubahan yang di-stage</x:String>
|
||||
@@ -557,11 +555,9 @@
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Default" xml:space="preserve">Default</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Editor" xml:space="preserve">Editor</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.MonospaceFont" xml:space="preserve">Font Monospace</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.OnlyUseMonoFontInEditor" xml:space="preserve">Gunakan font monospace hanya di text editor</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.Theme" xml:space="preserve">Tema</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.ThemeOverrides" xml:space="preserve">Override Tema</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseAutoHideScrollBars" xml:space="preserve">Gunakan scrollbar auto-hide</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseFixedTabWidth" xml:space="preserve">Gunakan lebar tab tetap di titlebar</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseNativeWindowFrame" xml:space="preserve">Gunakan frame window native</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge" xml:space="preserve">DIFF/MERGE TOOL</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge.Path" xml:space="preserve">Jalur Instalasi</x:String>
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<x:String x:Key="Text.Bisect.Skip" xml:space="preserve">Salta</x:String>
|
||||
<x:String x:Key="Text.Bisect.WaitingForRange" xml:space="preserve">Bisecando. Marca il commit corrente come buono o cattivo e fai checkout di un altro.</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">Attribuisci</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">L'ATTRIBUZIONE SU QUESTO FILE NON È SUPPORTATA!!!</x:String>
|
||||
<x:String x:Key="Text.Blame.TypeNotSupported" xml:space="preserve">L'ATTRIBUZIONE SU QUESTO FILE NON È SUPPORTATA!!!</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Checkout" xml:space="preserve">Checkout ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithCurrent" xml:space="preserve">Confronta con ${0}$</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithWorktree" xml:space="preserve">Confronta con Worktree</x:String>
|
||||
@@ -174,7 +174,6 @@
|
||||
<x:String x:Key="Text.CommitMessageTextBox.SubjectPlaceholder" xml:space="preserve">Inserisci l'oggetto del commit</x:String>
|
||||
<x:String x:Key="Text.Configure" xml:space="preserve">Configura Repository</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate" xml:space="preserve">TEMPLATE DI COMMIT</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.BuiltinVars" xml:space="preserve">Puoi usare ${files_num}, ${branch_name}, ${files} e ${files:N} dove N è il numero massimo di percorsi di file da mostrare.</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Content" xml:space="preserve">Contenuto Template:</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Name" xml:space="preserve">Nome Template:</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction" xml:space="preserve">AZIONE PERSONALIZZATA</x:String>
|
||||
@@ -443,7 +442,6 @@
|
||||
<x:String x:Key="Text.Hotkeys.Global.GotoPrevTab" xml:space="preserve">Vai alla pagina precedente</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.NewTab" xml:space="preserve">Crea una nuova pagina</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.OpenPreferences" xml:space="preserve">Apri la finestra delle preferenze</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchWorkspace" xml:space="preserve">Cambia workspace attivo</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchTab" xml:space="preserve">Cambia scheda attiva</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">REPOSITORY</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">Committa le modifiche in tsage</x:String>
|
||||
@@ -542,10 +540,8 @@
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Default" xml:space="preserve">Dimensione Font Predefinita</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Editor" xml:space="preserve">Dimensione Font Editor</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.MonospaceFont" xml:space="preserve">Font Monospaziato</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.OnlyUseMonoFontInEditor" xml:space="preserve">Usa solo font monospaziato nell'editor</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.Theme" xml:space="preserve">Tema</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.ThemeOverrides" xml:space="preserve">Sostituzioni Tema</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseFixedTabWidth" xml:space="preserve">Usa larghezza fissa per i tab nella barra del titolo</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseNativeWindowFrame" xml:space="preserve">Usa cornice finestra nativa</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge" xml:space="preserve">STRUMENTO DI DIFFERENZA/UNIONE</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge.Path" xml:space="preserve">Percorso Installazione</x:String>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">更新</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">バイナリファイルはサポートされていません!!!</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">Blame</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">BLAMEではこのファイルはサポートされていません!!!</x:String>
|
||||
<x:String x:Key="Text.Blame.TypeNotSupported" xml:space="preserve">BLAMEではこのファイルはサポートされていません!!!</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Checkout" xml:space="preserve">${0}$ をチェックアウトする...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithWorktree" xml:space="preserve">ワークツリーと比較</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CopyName" xml:space="preserve">ブランチ名をコピー</x:String>
|
||||
@@ -435,10 +435,8 @@
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Default" xml:space="preserve">デフォルト</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Editor" xml:space="preserve">エディタ</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.MonospaceFont" xml:space="preserve">等幅フォント</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.OnlyUseMonoFontInEditor" xml:space="preserve">テキストエディタでは等幅フォントのみを使用する</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.Theme" xml:space="preserve">テーマ</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.ThemeOverrides" xml:space="preserve">テーマの上書き</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseFixedTabWidth" xml:space="preserve">タイトルバーの固定タブ幅を使用</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseNativeWindowFrame" xml:space="preserve">ネイティブウィンドウフレームを使用</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge" xml:space="preserve">差分/マージ ツール</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge.Path" xml:space="preserve">インストール パス</x:String>
|
||||
|
||||
899
src/Resources/Locales/ko_KR.axaml
Normal file
899
src/Resources/Locales/ko_KR.axaml
Normal file
@@ -0,0 +1,899 @@
|
||||
<ResourceDictionary xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
|
||||
<x:String x:Key="Text.About" xml:space="preserve">정보</x:String>
|
||||
<x:String x:Key="Text.About.Menu" xml:space="preserve">SourceGit 정보</x:String>
|
||||
<x:String x:Key="Text.About.ReleaseNotes" xml:space="preserve">릴리스 노트</x:String>
|
||||
<x:String x:Key="Text.About.SubTitle" xml:space="preserve">오픈소스 & 무료 Git GUI 클라이언트</x:String>
|
||||
<x:String x:Key="Text.AddToIgnore" xml:space="preserve">무시할 파일 추가</x:String>
|
||||
<x:String x:Key="Text.AddToIgnore.Pattern" xml:space="preserve">패턴:</x:String>
|
||||
<x:String x:Key="Text.AddToIgnore.Storage" xml:space="preserve">저장 파일:</x:String>
|
||||
<x:String x:Key="Text.AddWorktree" xml:space="preserve">워크트리 추가</x:String>
|
||||
<x:String x:Key="Text.AddWorktree.Location" xml:space="preserve">위치:</x:String>
|
||||
<x:String x:Key="Text.AddWorktree.Location.Placeholder" xml:space="preserve">이 워크트리의 경로입니다. 상대 경로를 지원합니다.</x:String>
|
||||
<x:String x:Key="Text.AddWorktree.Name" xml:space="preserve">브랜치 이름:</x:String>
|
||||
<x:String x:Key="Text.AddWorktree.Name.Placeholder" xml:space="preserve">선택 사항. 기본값은 대상 폴더 이름입니다.</x:String>
|
||||
<x:String x:Key="Text.AddWorktree.Tracking" xml:space="preserve">추적할 브랜치:</x:String>
|
||||
<x:String x:Key="Text.AddWorktree.Tracking.Toggle" xml:space="preserve">원격 브랜치 추적</x:String>
|
||||
<x:String x:Key="Text.AddWorktree.WhatToCheckout" xml:space="preserve">체크아웃할 대상:</x:String>
|
||||
<x:String x:Key="Text.AddWorktree.WhatToCheckout.CreateNew" xml:space="preserve">새 브랜치 생성</x:String>
|
||||
<x:String x:Key="Text.AddWorktree.WhatToCheckout.Existing" xml:space="preserve">기존 브랜치</x:String>
|
||||
<x:String x:Key="Text.AIAssistant" xml:space="preserve">AI 어시스턴트</x:String>
|
||||
<x:String x:Key="Text.AIAssistant.Regen" xml:space="preserve">재생성</x:String>
|
||||
<x:String x:Key="Text.AIAssistant.Tip" xml:space="preserve">AI를 사용하여 커밋 메시지 생성</x:String>
|
||||
<x:String x:Key="Text.AIAssistant.Use" xml:space="preserve">커밋 메시지로 적용</x:String>
|
||||
<x:String x:Key="Text.App.Hide" xml:space="preserve">SourceGit 숨기기</x:String>
|
||||
<x:String x:Key="Text.App.ShowAll" xml:space="preserve">모두 보기</x:String>
|
||||
<x:String x:Key="Text.Apply" xml:space="preserve">패치</x:String>
|
||||
<x:String x:Key="Text.Apply.File" xml:space="preserve">패치 파일:</x:String>
|
||||
<x:String x:Key="Text.Apply.File.Placeholder" xml:space="preserve">적용할 .patch 파일을 선택하세요</x:String>
|
||||
<x:String x:Key="Text.Apply.IgnoreWS" xml:space="preserve">공백 변경 사항 무시</x:String>
|
||||
<x:String x:Key="Text.Apply.Title" xml:space="preserve">패치 적용</x:String>
|
||||
<x:String x:Key="Text.Apply.WS" xml:space="preserve">공백:</x:String>
|
||||
<x:String x:Key="Text.ApplyStash" xml:space="preserve">스태시 적용</x:String>
|
||||
<x:String x:Key="Text.ApplyStash.DropAfterApply" xml:space="preserve">적용 후 삭제</x:String>
|
||||
<x:String x:Key="Text.ApplyStash.RestoreIndex" xml:space="preserve">인덱스의 변경 사항 복원</x:String>
|
||||
<x:String x:Key="Text.ApplyStash.Stash" xml:space="preserve">스태시:</x:String>
|
||||
<x:String x:Key="Text.Archive" xml:space="preserve">아카이브...</x:String>
|
||||
<x:String x:Key="Text.Archive.File" xml:space="preserve">아카이브 저장 위치:</x:String>
|
||||
<x:String x:Key="Text.Archive.File.Placeholder" xml:space="preserve">아카이브 파일 경로 선택</x:String>
|
||||
<x:String x:Key="Text.Archive.Revision" xml:space="preserve">리비전:</x:String>
|
||||
<x:String x:Key="Text.Archive.Title" xml:space="preserve">아카이브</x:String>
|
||||
<x:String x:Key="Text.Askpass" xml:space="preserve">SourceGit Askpass</x:String>
|
||||
<x:String x:Key="Text.Askpass.Passphrase" xml:space="preserve">암호 입력:</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged" xml:space="preserve">변경되지 않음으로 간주된 파일</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Empty" xml:space="preserve">변경되지 않음으로 간주된 파일 없음</x:String>
|
||||
<x:String x:Key="Text.Avatar.Load" xml:space="preserve">이미지 불러오기...</x:String>
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">새로 고침</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">바이너리 파일은 지원되지 않습니다!!!</x:String>
|
||||
<x:String x:Key="Text.Bisect">이진 탐색</x:String>
|
||||
<x:String x:Key="Text.Bisect.Abort">중단</x:String>
|
||||
<x:String x:Key="Text.Bisect.Bad">나쁨</x:String>
|
||||
<x:String x:Key="Text.Bisect.Detecting">이진 탐색 중. 현재 HEAD가 '좋음' 상태입니까, '나쁨' 상태입니까?</x:String>
|
||||
<x:String x:Key="Text.Bisect.Good">좋음</x:String>
|
||||
<x:String x:Key="Text.Bisect.Skip">건너뛰기</x:String>
|
||||
<x:String x:Key="Text.Bisect.WaitingForRange">이진 탐색 중. 현재 커밋을 '좋음' 또는 '나쁨'으로 표시하고 다른 커밋을 체크아웃하세요.</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">블레임</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Checkout" xml:space="preserve">${0}$ 체크아웃...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithCurrent" xml:space="preserve">${0}$와(과) 비교</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithWorktree" xml:space="preserve">워크트리와 비교</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CopyName" xml:space="preserve">브랜치 이름 복사</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CustomAction" xml:space="preserve">사용자 지정 작업</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Delete" xml:space="preserve">${0}$ 삭제...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.DeleteMultiBranches" xml:space="preserve">선택한 {0}개의 브랜치 삭제</x:String>
|
||||
<x:String x:Key="Text.BranchCM.FastForward" xml:space="preserve">${0}$(으)로 Fast-Forward</x:String>
|
||||
<x:String x:Key="Text.BranchCM.FetchInto" xml:space="preserve">${0}$에서 ${1}$(으)로 Fetch...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Finish" xml:space="preserve">Git Flow - ${0}$ 완료</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Merge" xml:space="preserve">${0}$을(를) ${1}$(으)로 병합...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.MergeMultiBranches" xml:space="preserve">선택한 {0}개의 브랜치를 현재 브랜치로 병합</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Pull" xml:space="preserve">${0}$ Pull</x:String>
|
||||
<x:String x:Key="Text.BranchCM.PullInto" xml:space="preserve">${0}$에서 ${1}$(으)로 Pull...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Push" xml:space="preserve">${0}$ Push</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Rebase" xml:space="preserve">${1}$을(를) 기반으로 ${0}$ 리베이스...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Rename" xml:space="preserve">${0}$ 이름 바꾸기...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.ResetToSelectedCommit" xml:space="preserve">${0}$을(를) ${1}$(으)로 리셋...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.SwitchToWorktree" xml:space="preserve">${0}$(워크트리)로 전환</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Tracking" xml:space="preserve">추적 브랜치 설정...</x:String>
|
||||
<x:String x:Key="Text.BranchCompare" xml:space="preserve">브랜치 비교</x:String>
|
||||
<x:String x:Key="Text.BranchTree.Ahead" xml:space="preserve">{0}개 커밋 앞섬</x:String>
|
||||
<x:String x:Key="Text.BranchTree.AheadBehind" xml:space="preserve">{0}개 커밋 앞섬, {1}개 커밋 뒤처짐</x:String>
|
||||
<x:String x:Key="Text.BranchTree.Behind" xml:space="preserve">{0}개 커밋 뒤처짐</x:String>
|
||||
<x:String x:Key="Text.BranchTree.InvalidUpstream" xml:space="preserve">유효하지 않음</x:String>
|
||||
<x:String x:Key="Text.BranchTree.Remote" xml:space="preserve">원격</x:String>
|
||||
<x:String x:Key="Text.BranchTree.Status" xml:space="preserve">상태</x:String>
|
||||
<x:String x:Key="Text.BranchTree.Tracking" xml:space="preserve">추적 중</x:String>
|
||||
<x:String x:Key="Text.BranchTree.URL" xml:space="preserve">URL</x:String>
|
||||
<x:String x:Key="Text.BranchTree.Worktree" xml:space="preserve">워크트리</x:String>
|
||||
<x:String x:Key="Text.Cancel" xml:space="preserve">취소</x:String>
|
||||
<x:String x:Key="Text.ChangeCM.CheckoutFirstParentRevision" xml:space="preserve">부모 리비전으로 리셋</x:String>
|
||||
<x:String x:Key="Text.ChangeCM.CheckoutThisRevision" xml:space="preserve">이 리비전으로 리셋</x:String>
|
||||
<x:String x:Key="Text.ChangeCM.GenerateCommitMessage" xml:space="preserve">커밋 메시지 생성</x:String>
|
||||
<x:String x:Key="Text.ChangeDisplayMode" xml:space="preserve">표시 모드 변경</x:String>
|
||||
<x:String x:Key="Text.ChangeDisplayMode.Grid" xml:space="preserve">파일 및 디렉터리 목록으로 보기</x:String>
|
||||
<x:String x:Key="Text.ChangeDisplayMode.List" xml:space="preserve">경로 목록으로 보기</x:String>
|
||||
<x:String x:Key="Text.ChangeDisplayMode.Tree" xml:space="preserve">파일 시스템 트리로 보기</x:String>
|
||||
<x:String x:Key="Text.ChangeSubmoduleUrl" xml:space="preserve">서브모듈 URL 변경</x:String>
|
||||
<x:String x:Key="Text.ChangeSubmoduleUrl.Submodule" xml:space="preserve">서브모듈:</x:String>
|
||||
<x:String x:Key="Text.ChangeSubmoduleUrl.URL" xml:space="preserve">URL:</x:String>
|
||||
<x:String x:Key="Text.Checkout" xml:space="preserve">브랜치 체크아웃</x:String>
|
||||
<x:String x:Key="Text.Checkout.Commit" xml:space="preserve">커밋 체크아웃</x:String>
|
||||
<x:String x:Key="Text.Checkout.Commit.Target" xml:space="preserve">커밋:</x:String>
|
||||
<x:String x:Key="Text.Checkout.Commit.Warning" xml:space="preserve">경고: 커밋 체크아웃을 하면, HEAD가 분리됩니다(detached)</x:String>
|
||||
<x:String x:Key="Text.Checkout.LocalChanges" xml:space="preserve">로컬 변경 사항:</x:String>
|
||||
<x:String x:Key="Text.Checkout.LocalChanges.Discard" xml:space="preserve">폐기</x:String>
|
||||
<x:String x:Key="Text.Checkout.LocalChanges.StashAndReply" xml:space="preserve">스태시 & 재적용</x:String>
|
||||
<x:String x:Key="Text.Checkout.RecurseSubmodules" xml:space="preserve">모든 서브모듈 업데이트</x:String>
|
||||
<x:String x:Key="Text.Checkout.Target" xml:space="preserve">브랜치:</x:String>
|
||||
<x:String x:Key="Text.Checkout.WarnLostCommits" xml:space="preserve">현재 HEAD에 브랜치/태그에 연결되지 않은 커밋이 있습니다! 계속하시겠습니까?</x:String>
|
||||
<x:String x:Key="Text.Checkout.WithFastForward" xml:space="preserve">체크아웃 & Fast-Forward</x:String>
|
||||
<x:String x:Key="Text.Checkout.WithFastForward.Upstream" xml:space="preserve">Fast-Forward 대상:</x:String>
|
||||
<x:String x:Key="Text.CherryPick" xml:space="preserve">체리픽</x:String>
|
||||
<x:String x:Key="Text.CherryPick.AppendSourceToMessage" xml:space="preserve">커밋 메시지에 원본 추가</x:String>
|
||||
<x:String x:Key="Text.CherryPick.Commit" xml:space="preserve">커밋:</x:String>
|
||||
<x:String x:Key="Text.CherryPick.CommitChanges" xml:space="preserve">모든 변경 사항 커밋</x:String>
|
||||
<x:String x:Key="Text.CherryPick.Mainline" xml:space="preserve">메인라인:</x:String>
|
||||
<x:String x:Key="Text.CherryPick.Mainline.Tips" xml:space="preserve">어느 쪽을 메인라인으로 간주해야 할지 알 수 없기 때문에 일반적으로 병합(merge)을 체리픽할 수 없습니다. 이 옵션을 사용하면 지정된 부모를 기준으로 변경 사항을 다시 적용할 수 있습니다.</x:String>
|
||||
<x:String x:Key="Text.ClearStashes" xml:space="preserve">모든 스태시 지우기</x:String>
|
||||
<x:String x:Key="Text.ClearStashes.Message" xml:space="preserve">모든 스태시를 지우려고 합니다. 계속하시겠습니까?</x:String>
|
||||
<x:String x:Key="Text.Clone" xml:space="preserve">원격 저장소 복제</x:String>
|
||||
<x:String x:Key="Text.Clone.AdditionalParam" xml:space="preserve">추가 파라미터:</x:String>
|
||||
<x:String x:Key="Text.Clone.AdditionalParam.Placeholder" xml:space="preserve">저장소 복제 시 추가 인수. 선택 사항.</x:String>
|
||||
<x:String x:Key="Text.Clone.LocalName" xml:space="preserve">로컬 이름:</x:String>
|
||||
<x:String x:Key="Text.Clone.LocalName.Placeholder" xml:space="preserve">저장소 이름. 선택 사항.</x:String>
|
||||
<x:String x:Key="Text.Clone.ParentFolder" xml:space="preserve">상위 폴더:</x:String>
|
||||
<x:String x:Key="Text.Clone.RecurseSubmodules" xml:space="preserve">서브모듈 초기화 & 업데이트</x:String>
|
||||
<x:String x:Key="Text.Clone.RemoteURL" xml:space="preserve">저장소 URL:</x:String>
|
||||
<x:String x:Key="Text.Close" xml:space="preserve">닫기</x:String>
|
||||
<x:String x:Key="Text.CodeEditor" xml:space="preserve">에디터</x:String>
|
||||
<x:String x:Key="Text.CommitCM.Checkout" xml:space="preserve">커밋 체크아웃</x:String>
|
||||
<x:String x:Key="Text.CommitCM.CherryPick" xml:space="preserve">커밋 체리픽</x:String>
|
||||
<x:String x:Key="Text.CommitCM.CherryPickMultiple" xml:space="preserve">체리픽...</x:String>
|
||||
<x:String x:Key="Text.CommitCM.CompareWithHead" xml:space="preserve">HEAD와 비교</x:String>
|
||||
<x:String x:Key="Text.CommitCM.CompareWithWorktree" xml:space="preserve">워크트리와 비교</x:String>
|
||||
<x:String x:Key="Text.CommitCM.CopyAuthor" xml:space="preserve">작성자</x:String>
|
||||
<x:String x:Key="Text.CommitCM.CopyCommitMessage" xml:space="preserve">메시지</x:String>
|
||||
<x:String x:Key="Text.CommitCM.CopyCommitter" xml:space="preserve">커밋터</x:String>
|
||||
<x:String x:Key="Text.CommitCM.CopySHA" xml:space="preserve">SHA</x:String>
|
||||
<x:String x:Key="Text.CommitCM.CopySubject" xml:space="preserve">제목</x:String>
|
||||
<x:String x:Key="Text.CommitCM.CustomAction" xml:space="preserve">사용자 지정 작업</x:String>
|
||||
<x:String x:Key="Text.CommitCM.Drop" xml:space="preserve">커밋 삭제</x:String>
|
||||
<x:String x:Key="Text.CommitCM.InteractiveRebase" xml:space="preserve">대화형 리베이스</x:String>
|
||||
<x:String x:Key="Text.CommitCM.InteractiveRebase.Drop" xml:space="preserve">삭제(Drop)...</x:String>
|
||||
<x:String x:Key="Text.CommitCM.InteractiveRebase.Edit" xml:space="preserve">수정(Edit)...</x:String>
|
||||
<x:String x:Key="Text.CommitCM.InteractiveRebase.Fixup" xml:space="preserve">부모에 합치기(Fixup)...</x:String>
|
||||
<x:String x:Key="Text.CommitCM.InteractiveRebase.Manually" xml:space="preserve">${1}$을(를) 기반으로 ${0}$ 대화형 리베이스</x:String>
|
||||
<x:String x:Key="Text.CommitCM.InteractiveRebase.Reword" xml:space="preserve">메시지 수정(Reword)...</x:String>
|
||||
<x:String x:Key="Text.CommitCM.InteractiveRebase.Squash" xml:space="preserve">부모에 합치기(Squash)...</x:String>
|
||||
<x:String x:Key="Text.CommitCM.Merge" xml:space="preserve">${0}$(으)로 병합</x:String>
|
||||
<x:String x:Key="Text.CommitCM.MergeMultiple" xml:space="preserve">병합...</x:String>
|
||||
<x:String x:Key="Text.CommitCM.PushRevision" xml:space="preserve">${0}$을(를) ${1}$(으)로 푸시</x:String>
|
||||
<x:String x:Key="Text.CommitCM.Rebase" xml:space="preserve">${1}$을(를) 기반으로 ${0}$ 리베이스</x:String>
|
||||
<x:String x:Key="Text.CommitCM.Reset" xml:space="preserve">${0}$을(를) ${1}$(으)로 리셋</x:String>
|
||||
<x:String x:Key="Text.CommitCM.Revert" xml:space="preserve">커밋 되돌리기</x:String>
|
||||
<x:String x:Key="Text.CommitCM.Reword" xml:space="preserve">메시지 수정</x:String>
|
||||
<x:String x:Key="Text.CommitCM.SaveAsPatch" xml:space="preserve">패치로 저장...</x:String>
|
||||
<x:String x:Key="Text.CommitCM.Squash" xml:space="preserve">부모에 합치기</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Changes" xml:space="preserve">변경 사항</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Changes.Count" xml:space="preserve">변경된 파일</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Changes.Search" xml:space="preserve">변경 사항 검색...</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Files" xml:space="preserve">파일</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Files.LFS" xml:space="preserve">LFS 파일</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Files.Search" xml:space="preserve">파일 검색...</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Files.Submodule" xml:space="preserve">서브모듈</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info" xml:space="preserve">정보</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.Author" xml:space="preserve">작성자</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.Children" xml:space="preserve">자식</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.Committer" xml:space="preserve">커밋터</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.ContainsIn" xml:space="preserve">이 커밋을 포함하는 ref 확인</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.ContainsIn.Title" xml:space="preserve">커밋 포함 REF</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.CopyEmail" xml:space="preserve">이메일 복사</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.CopyName" xml:space="preserve">이름 복사</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.CopyNameAndEmail" xml:space="preserve">이름 & 이메일 복사</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.GotoChangesPage" xml:space="preserve">처음 100개의 변경 사항만 표시합니다. 모든 변경 사항은 '변경 사항' 탭에서 확인하세요.</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.Key" xml:space="preserve">키:</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.Message" xml:space="preserve">메시지</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.Parents" xml:space="preserve">부모</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.Refs" xml:space="preserve">REFS</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.SHA" xml:space="preserve">SHA</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.Signer" xml:space="preserve">서명자:</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.WebLinks" xml:space="preserve">브라우저에서 열기</x:String>
|
||||
<x:String x:Key="Text.CommitMessageTextBox.MessagePlaceholder" xml:space="preserve">설명</x:String>
|
||||
<x:String x:Key="Text.CommitMessageTextBox.PasteAndReplaceAll" xml:space="preserve">붙여넣기 (모두 바꾸기)</x:String>
|
||||
<x:String x:Key="Text.CommitMessageTextBox.SubjectCount" xml:space="preserve">제목</x:String>
|
||||
<x:String x:Key="Text.CommitMessageTextBox.SubjectPlaceholder" xml:space="preserve">커밋 제목 입력</x:String>
|
||||
<x:String x:Key="Text.Configure" xml:space="preserve">저장소 설정</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate" xml:space="preserve">커밋 템플릿</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.BuiltinVars" xml:space="preserve">${files_num}, ${branch_name}, ${files} 및 ${files:N} (N은 출력할 최대 파일 경로 수)을(를) 사용할 수 있습니다.</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Content" xml:space="preserve">템플릿 내용:</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Name" xml:space="preserve">템플릿 이름:</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction" xml:space="preserve">사용자 지정 작업</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.Arguments" xml:space="preserve">인수:</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.Arguments.Tip" xml:space="preserve">내장 파라미터:
|
||||
|
||||
${REPO} 저장소 경로
|
||||
${REMOTE} 선택한 원격 또는 선택한 브랜치의 원격
|
||||
${BRANCH} 선택한 브랜치 (원격 브랜치의 경우 ${REMOTE} 부분 제외)
|
||||
${BRANCH_FRIENDLY_NAME} 선택한 브랜치의 식별하기 쉬운 이름 (원격 브랜치의 경우 ${REMOTE} 부분 포함)
|
||||
${SHA} 선택한 커밋의 해시
|
||||
${TAG} 선택한 태그
|
||||
$1, $2 ... 입력 컨트롤 값</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.Executable" xml:space="preserve">실행 파일:</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.InputControls" xml:space="preserve">입력 컨트롤:</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.InputControls.Edit" xml:space="preserve">편집</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.Name" xml:space="preserve">이름:</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.Scope" xml:space="preserve">범위:</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.Scope.Branch" xml:space="preserve">브랜치</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.Scope.Commit" xml:space="preserve">커밋</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.Scope.Remote" xml:space="preserve">원격</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.Scope.Repository" xml:space="preserve">저장소</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.Scope.Tag" xml:space="preserve">태그</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.WaitForExit" xml:space="preserve">작업이 끝날 때까지 대기</x:String>
|
||||
<x:String x:Key="Text.Configure.Email" xml:space="preserve">이메일 주소</x:String>
|
||||
<x:String x:Key="Text.Configure.Email.Placeholder" xml:space="preserve">이메일 주소</x:String>
|
||||
<x:String x:Key="Text.Configure.Git" xml:space="preserve">GIT</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.AutoFetch" xml:space="preserve">원격 자동 Fetch</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.AutoFetchIntervalSuffix" xml:space="preserve">분</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.DefaultRemote" xml:space="preserve">기본 원격</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.PreferredMergeMode" xml:space="preserve">선호하는 병합 모드</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker" xml:space="preserve">이슈 트래커</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker.AddSampleAzure" xml:space="preserve">Azure DevOps 규칙 추가</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker.AddSampleGerritChangeIdCommit" xml:space="preserve">Gerrit Change-Id 커밋 규칙 추가</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker.AddSampleGiteeIssue" xml:space="preserve">Gitee 이슈 규칙 추가</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker.AddSampleGiteePullRequest" xml:space="preserve">Gitee Pull Request 규칙 추가</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker.AddSampleGitHub" xml:space="preserve">GitHub 규칙 추가</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker.AddSampleGitLabIssue" xml:space="preserve">GitLab 이슈 규칙 추가</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker.AddSampleGitLabMergeRequest" xml:space="preserve">GitLab Merge Request 규칙 추가</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker.AddSampleJira" xml:space="preserve">Jira 규칙 추가</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker.NewRule" xml:space="preserve">새 규칙</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker.Regex" xml:space="preserve">이슈 정규식:</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker.RuleName" xml:space="preserve">규칙 이름:</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker.Share" xml:space="preserve">.issuetracker 파일에 이 규칙 공유</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate" xml:space="preserve">결과 URL:</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker.URLTemplate.Tip" xml:space="preserve">정규식 그룹 값에 접근하려면 $1, $2를 사용하세요.</x:String>
|
||||
<x:String x:Key="Text.Configure.OpenAI" xml:space="preserve">AI</x:String>
|
||||
<x:String x:Key="Text.Configure.OpenAI.Preferred" xml:space="preserve">선호하는 서비스:</x:String>
|
||||
<x:String x:Key="Text.Configure.OpenAI.Preferred.Tip" xml:space="preserve">'선호하는 서비스'가 설정되면, SourceGit은 이 저장소에서 해당 서비스만 사용합니다. 그렇지 않고 사용 가능한 서비스가 두 개 이상인 경우, 하나를 선택할 수 있는 컨텍스트 메뉴가 표시됩니다.</x:String>
|
||||
<x:String x:Key="Text.Configure.Proxy" xml:space="preserve">HTTP 프록시</x:String>
|
||||
<x:String x:Key="Text.Configure.Proxy.Placeholder" xml:space="preserve">이 저장소에서 사용하는 HTTP 프록시</x:String>
|
||||
<x:String x:Key="Text.Configure.User" xml:space="preserve">사용자 이름</x:String>
|
||||
<x:String x:Key="Text.Configure.User.Placeholder" xml:space="preserve">이 저장소의 사용자 이름</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls" xml:space="preserve">사용자 지정 작업 컨트롤 편집</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.CheckedValue" xml:space="preserve">선택 시 값:</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.CheckedValue.Tip" xml:space="preserve">선택 시, 이 값이 명령줄 인수로 사용됩니다</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Description" xml:space="preserve">설명:</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.DefaultValue" xml:space="preserve">기본값:</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.IsFolder" xml:space="preserve">폴더 여부:</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Label" xml:space="preserve">레이블:</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Options" xml:space="preserve">옵션:</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Options.Tip" xml:space="preserve">옵션 구분자로 '|'를 사용하세요</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Type" xml:space="preserve">유형:</x:String>
|
||||
<x:String x:Key="Text.ConfigureWorkspace" xml:space="preserve">작업 공간</x:String>
|
||||
<x:String x:Key="Text.ConfigureWorkspace.Color" xml:space="preserve">색상</x:String>
|
||||
<x:String x:Key="Text.ConfigureWorkspace.Name" xml:space="preserve">이름</x:String>
|
||||
<x:String x:Key="Text.ConfigureWorkspace.Restore" xml:space="preserve">시작 시 탭 복원</x:String>
|
||||
<x:String x:Key="Text.ConfirmEmptyCommit.Continue" xml:space="preserve">계속</x:String>
|
||||
<x:String x:Key="Text.ConfirmEmptyCommit.NoLocalChanges" xml:space="preserve">빈 커밋이 감지되었습니다! 계속하시겠습니까 (--allow-empty)?</x:String>
|
||||
<x:String x:Key="Text.ConfirmEmptyCommit.StageAllThenCommit" xml:space="preserve">모두 스테이징 & 커밋</x:String>
|
||||
<x:String x:Key="Text.ConfirmEmptyCommit.WithLocalChanges" xml:space="preserve">빈 커밋이 감지되었습니다! 계속하시겠습니까 (--allow-empty) 아니면 모두 스테이징 후 커밋하시겠습니까?</x:String>
|
||||
<x:String x:Key="Text.ConfirmRestart.Title" xml:space="preserve">재시작 필요</x:String>
|
||||
<x:String x:Key="Text.ConfirmRestart.Message" xml:space="preserve">변경 사항을 적용하려면 앱을 다시 시작해야 합니다.</x:String>
|
||||
<x:String x:Key="Text.ConventionalCommit" xml:space="preserve">Conventional Commit 도우미</x:String>
|
||||
<x:String x:Key="Text.ConventionalCommit.BreakingChanges" xml:space="preserve">주요 변경 사항(Breaking Change):</x:String>
|
||||
<x:String x:Key="Text.ConventionalCommit.ClosedIssue" xml:space="preserve">종료된 이슈:</x:String>
|
||||
<x:String x:Key="Text.ConventionalCommit.Detail" xml:space="preserve">상세 변경 내역:</x:String>
|
||||
<x:String x:Key="Text.ConventionalCommit.Scope" xml:space="preserve">범위:</x:String>
|
||||
<x:String x:Key="Text.ConventionalCommit.ShortDescription" xml:space="preserve">간단한 설명:</x:String>
|
||||
<x:String x:Key="Text.ConventionalCommit.Type" xml:space="preserve">변경 유형:</x:String>
|
||||
<x:String x:Key="Text.Copy" xml:space="preserve">복사</x:String>
|
||||
<x:String x:Key="Text.CopyAllText" xml:space="preserve">전체 텍스트 복사</x:String>
|
||||
<x:String x:Key="Text.CopyFullPath" xml:space="preserve">전체 경로 복사</x:String>
|
||||
<x:String x:Key="Text.CopyPath" xml:space="preserve">경로 복사</x:String>
|
||||
<x:String x:Key="Text.CreateBranch" xml:space="preserve">브랜치 생성...</x:String>
|
||||
<x:String x:Key="Text.CreateBranch.BasedOn" xml:space="preserve">기준:</x:String>
|
||||
<x:String x:Key="Text.CreateBranch.Checkout" xml:space="preserve">생성된 브랜치로 체크아웃</x:String>
|
||||
<x:String x:Key="Text.CreateBranch.LocalChanges" xml:space="preserve">로컬 변경 사항:</x:String>
|
||||
<x:String x:Key="Text.CreateBranch.LocalChanges.Discard" xml:space="preserve">폐기</x:String>
|
||||
<x:String x:Key="Text.CreateBranch.LocalChanges.StashAndReply" xml:space="preserve">스태시 & 재적용</x:String>
|
||||
<x:String x:Key="Text.CreateBranch.Name" xml:space="preserve">새 브랜치 이름:</x:String>
|
||||
<x:String x:Key="Text.CreateBranch.Name.Placeholder" xml:space="preserve">브랜치 이름을 입력하세요.</x:String>
|
||||
<x:String x:Key="Text.CreateBranch.Title" xml:space="preserve">로컬 브랜치 생성</x:String>
|
||||
<x:String x:Key="Text.CreateBranch.OverwriteExisting" xml:space="preserve">기존 브랜치 덮어쓰기</x:String>
|
||||
<x:String x:Key="Text.CreateTag" xml:space="preserve">태그 생성...</x:String>
|
||||
<x:String x:Key="Text.CreateTag.BasedOn" xml:space="preserve">태그 생성 위치:</x:String>
|
||||
<x:String x:Key="Text.CreateTag.GPGSign" xml:space="preserve">GPG 서명</x:String>
|
||||
<x:String x:Key="Text.CreateTag.Message" xml:space="preserve">태그 메시지:</x:String>
|
||||
<x:String x:Key="Text.CreateTag.Message.Placeholder" xml:space="preserve">선택 사항.</x:String>
|
||||
<x:String x:Key="Text.CreateTag.Name" xml:space="preserve">태그 이름:</x:String>
|
||||
<x:String x:Key="Text.CreateTag.Name.Placeholder" xml:space="preserve">권장 형식: v1.0.0-alpha</x:String>
|
||||
<x:String x:Key="Text.CreateTag.PushToAllRemotes" xml:space="preserve">생성 후 모든 원격에 푸시</x:String>
|
||||
<x:String x:Key="Text.CreateTag.Title" xml:space="preserve">새 태그 생성</x:String>
|
||||
<x:String x:Key="Text.CreateTag.Type" xml:space="preserve">종류:</x:String>
|
||||
<x:String x:Key="Text.CreateTag.Type.Annotated" xml:space="preserve">주석 태그</x:String>
|
||||
<x:String x:Key="Text.CreateTag.Type.Lightweight" xml:space="preserve">경량 태그</x:String>
|
||||
<x:String x:Key="Text.CtrlClickTip" xml:space="preserve">Ctrl을 누른 채 클릭하면 바로 시작합니다</x:String>
|
||||
<x:String x:Key="Text.Cut" xml:space="preserve">잘라내기</x:String>
|
||||
<x:String x:Key="Text.DeinitSubmodule" xml:space="preserve">서브모듈 초기화 해제</x:String>
|
||||
<x:String x:Key="Text.DeinitSubmodule.Force" xml:space="preserve">로컬 변경 사항이 있어도 강제로 초기화 해제합니다.</x:String>
|
||||
<x:String x:Key="Text.DeinitSubmodule.Path" xml:space="preserve">서브모듈:</x:String>
|
||||
<x:String x:Key="Text.DeleteBranch" xml:space="preserve">브랜치 삭제</x:String>
|
||||
<x:String x:Key="Text.DeleteBranch.Branch" xml:space="preserve">브랜치:</x:String>
|
||||
<x:String x:Key="Text.DeleteBranch.IsRemoteTip" xml:space="preserve">원격 브랜치를 삭제하려고 합니다!!!</x:String>
|
||||
<x:String x:Key="Text.DeleteBranch.WithTrackingRemote" xml:space="preserve">원격 브랜치 ${0}$도 함께 삭제</x:String>
|
||||
<x:String x:Key="Text.DeleteMultiBranch" xml:space="preserve">여러 브랜치 삭제</x:String>
|
||||
<x:String x:Key="Text.DeleteMultiBranch.Tip" xml:space="preserve">한 번에 여러 브랜치를 삭제하려고 합니다. 실행하기 전에 다시 한번 확인하세요!</x:String>
|
||||
<x:String x:Key="Text.DeleteMultiTags" xml:space="preserve">여러 태그 삭제</x:String>
|
||||
<x:String x:Key="Text.DeleteMultiTags.DeleteFromRemotes" xml:space="preserve">원격 저장소에서도 삭제</x:String>
|
||||
<x:String x:Key="Text.DeleteMultiTags.Tip" xml:space="preserve">한 번에 여러 태그를 삭제하려고 합니다. 실행하기 전에 다시 한번 확인하세요!</x:String>
|
||||
<x:String x:Key="Text.DeleteRemote" xml:space="preserve">원격 삭제</x:String>
|
||||
<x:String x:Key="Text.DeleteRemote.Remote" xml:space="preserve">원격:</x:String>
|
||||
<x:String x:Key="Text.DeleteRepositoryNode.Path" xml:space="preserve">경로:</x:String>
|
||||
<x:String x:Key="Text.DeleteRepositoryNode.Target" xml:space="preserve">대상:</x:String>
|
||||
<x:String x:Key="Text.DeleteRepositoryNode.TipForGroup" xml:space="preserve">모든 하위 항목이 목록에서 제거됩니다.</x:String>
|
||||
<x:String x:Key="Text.DeleteRepositoryNode.TipForRepository" xml:space="preserve">목록에서만 제거되며, 디스크에서 삭제되지 않습니다!</x:String>
|
||||
<x:String x:Key="Text.DeleteRepositoryNode.TitleForGroup" xml:space="preserve">그룹 삭제 확인</x:String>
|
||||
<x:String x:Key="Text.DeleteRepositoryNode.TitleForRepository" xml:space="preserve">저장소 삭제 확인</x:String>
|
||||
<x:String x:Key="Text.DeleteSubmodule" xml:space="preserve">서브모듈 삭제</x:String>
|
||||
<x:String x:Key="Text.DeleteSubmodule.Path" xml:space="preserve">서브모듈 경로:</x:String>
|
||||
<x:String x:Key="Text.DeleteTag" xml:space="preserve">태그 삭제</x:String>
|
||||
<x:String x:Key="Text.DeleteTag.Tag" xml:space="preserve">태그:</x:String>
|
||||
<x:String x:Key="Text.DeleteTag.WithRemote" xml:space="preserve">원격 저장소에서도 삭제</x:String>
|
||||
<x:String x:Key="Text.Diff.Binary" xml:space="preserve">바이너리 비교</x:String>
|
||||
<x:String x:Key="Text.Diff.FileModeChanged" xml:space="preserve">파일 모드 변경됨</x:String>
|
||||
<x:String x:Key="Text.Diff.First" xml:space="preserve">첫 번째 차이점</x:String>
|
||||
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">모든 공백 변경 사항 무시</x:String>
|
||||
<x:String x:Key="Text.Diff.Image.Blend" xml:space="preserve">혼합</x:String>
|
||||
<x:String x:Key="Text.Diff.Image.Difference" xml:space="preserve">차이점</x:String>
|
||||
<x:String x:Key="Text.Diff.Image.SideBySide" xml:space="preserve">나란히 보기</x:String>
|
||||
<x:String x:Key="Text.Diff.Image.Swipe" xml:space="preserve">스와이프</x:String>
|
||||
<x:String x:Key="Text.Diff.Last" xml:space="preserve">마지막 차이점</x:String>
|
||||
<x:String x:Key="Text.Diff.LFS" xml:space="preserve">LFS 객체 변경</x:String>
|
||||
<x:String x:Key="Text.Diff.New" xml:space="preserve">신규</x:String>
|
||||
<x:String x:Key="Text.Diff.Next" xml:space="preserve">다음 차이점</x:String>
|
||||
<x:String x:Key="Text.Diff.NoChange" xml:space="preserve">변경 사항 없음 또는 줄바꿈(EOL) 변경만 있음</x:String>
|
||||
<x:String x:Key="Text.Diff.Old" xml:space="preserve">기존</x:String>
|
||||
<x:String x:Key="Text.Diff.Prev" xml:space="preserve">이전 차이점</x:String>
|
||||
<x:String x:Key="Text.Diff.SaveAsPatch" xml:space="preserve">패치로 저장</x:String>
|
||||
<x:String x:Key="Text.Diff.ShowHiddenSymbols" xml:space="preserve">숨겨진 기호 표시</x:String>
|
||||
<x:String x:Key="Text.Diff.SideBySide" xml:space="preserve">나란히 비교</x:String>
|
||||
<x:String x:Key="Text.Diff.Submodule" xml:space="preserve">서브모듈</x:String>
|
||||
<x:String x:Key="Text.Diff.Submodule.Deleted" xml:space="preserve">삭제됨</x:String>
|
||||
<x:String x:Key="Text.Diff.Submodule.New" xml:space="preserve">신규</x:String>
|
||||
<x:String x:Key="Text.Diff.SwapCommits" xml:space="preserve">전환</x:String>
|
||||
<x:String x:Key="Text.Diff.SyntaxHighlight" xml:space="preserve">구문 강조</x:String>
|
||||
<x:String x:Key="Text.Diff.ToggleWordWrap" xml:space="preserve">줄 바꿈</x:String>
|
||||
<x:String x:Key="Text.Diff.UseMerger" xml:space="preserve">병합 도구에서 열기</x:String>
|
||||
<x:String x:Key="Text.Diff.VisualLines.All" xml:space="preserve">모든 줄 표시</x:String>
|
||||
<x:String x:Key="Text.Diff.VisualLines.Decr" xml:space="preserve">표시 줄 수 줄이기</x:String>
|
||||
<x:String x:Key="Text.Diff.VisualLines.Incr" xml:space="preserve">표시 줄 수 늘리기</x:String>
|
||||
<x:String x:Key="Text.Diff.Welcome" xml:space="preserve">파일을 선택하여 변경 사항 보기</x:String>
|
||||
<x:String x:Key="Text.DirHistories" xml:space="preserve">디렉터리 히스토리</x:String>
|
||||
<x:String x:Key="Text.DirtyState.HasLocalChanges" xml:space="preserve">로컬 변경 사항 있음</x:String>
|
||||
<x:String x:Key="Text.DirtyState.HasPendingPullOrPush" xml:space="preserve">업스트림과 불일치</x:String>
|
||||
<x:String x:Key="Text.DirtyState.UpToDate" xml:space="preserve">이미 최신 상태</x:String>
|
||||
<x:String x:Key="Text.Discard" xml:space="preserve">변경 사항 폐기</x:String>
|
||||
<x:String x:Key="Text.Discard.All" xml:space="preserve">작업 사본의 모든 로컬 변경 사항.</x:String>
|
||||
<x:String x:Key="Text.Discard.Changes" xml:space="preserve">변경 사항:</x:String>
|
||||
<x:String x:Key="Text.Discard.IncludeIgnored" xml:space="preserve">무시된 파일 포함</x:String>
|
||||
<x:String x:Key="Text.Discard.IncludeUntracked" xml:space="preserve">추적하지 않는 파일 포함</x:String>
|
||||
<x:String x:Key="Text.Discard.Total" xml:space="preserve">{0}개의 변경 사항이 폐기됩니다</x:String>
|
||||
<x:String x:Key="Text.Discard.Warning" xml:space="preserve">이 작업은 되돌릴 수 없습니다!!!</x:String>
|
||||
<x:String x:Key="Text.DropHead" xml:space="preserve">커밋 삭제</x:String>
|
||||
<x:String x:Key="Text.DropHead.Commit" xml:space="preserve">커밋:</x:String>
|
||||
<x:String x:Key="Text.DropHead.NewHead" xml:space="preserve">새 HEAD:</x:String>
|
||||
<x:String x:Key="Text.EditRepositoryNode.Bookmark" xml:space="preserve">북마크:</x:String>
|
||||
<x:String x:Key="Text.EditRepositoryNode.Name" xml:space="preserve">새 이름:</x:String>
|
||||
<x:String x:Key="Text.EditRepositoryNode.Target" xml:space="preserve">대상:</x:String>
|
||||
<x:String x:Key="Text.EditRepositoryNode.TitleForGroup" xml:space="preserve">선택한 그룹 편집</x:String>
|
||||
<x:String x:Key="Text.EditRepositoryNode.TitleForRepository" xml:space="preserve">선택한 저장소 편집</x:String>
|
||||
<x:String x:Key="Text.ExecuteCustomAction.Target" xml:space="preserve">대상:</x:String>
|
||||
<x:String x:Key="Text.ExecuteCustomAction.Repository" xml:space="preserve">이 저장소</x:String>
|
||||
<x:String x:Key="Text.Fetch" xml:space="preserve">Fetch</x:String>
|
||||
<x:String x:Key="Text.Fetch.AllRemotes" xml:space="preserve">모든 원격 Fetch</x:String>
|
||||
<x:String x:Key="Text.Fetch.Force" xml:space="preserve">로컬 ref 강제 덮어쓰기</x:String>
|
||||
<x:String x:Key="Text.Fetch.NoTags" xml:space="preserve">태그 없이 Fetch</x:String>
|
||||
<x:String x:Key="Text.Fetch.Remote" xml:space="preserve">원격:</x:String>
|
||||
<x:String x:Key="Text.Fetch.Title" xml:space="preserve">원격 변경 사항 Fetch</x:String>
|
||||
<x:String x:Key="Text.FileCM.AssumeUnchanged" xml:space="preserve">변경되지 않음으로 간주</x:String>
|
||||
<x:String x:Key="Text.FileCM.Discard" xml:space="preserve">폐기...</x:String>
|
||||
<x:String x:Key="Text.FileCM.DiscardMulti" xml:space="preserve">{0}개 파일 폐기...</x:String>
|
||||
<x:String x:Key="Text.FileCM.ResolveUsing" xml:space="preserve">${0}$을(를) 사용하여 해결</x:String>
|
||||
<x:String x:Key="Text.FileCM.SaveAsPatch" xml:space="preserve">패치로 저장...</x:String>
|
||||
<x:String x:Key="Text.FileCM.Stage" xml:space="preserve">스테이지</x:String>
|
||||
<x:String x:Key="Text.FileCM.StageMulti" xml:space="preserve">{0}개 파일 스테이지</x:String>
|
||||
<x:String x:Key="Text.FileCM.Stash" xml:space="preserve">스태시...</x:String>
|
||||
<x:String x:Key="Text.FileCM.StashMulti" xml:space="preserve">{0}개 파일 스태시...</x:String>
|
||||
<x:String x:Key="Text.FileCM.Unstage" xml:space="preserve">언스테이지</x:String>
|
||||
<x:String x:Key="Text.FileCM.UnstageMulti" xml:space="preserve">{0}개 파일 언스테이지</x:String>
|
||||
<x:String x:Key="Text.FileCM.UseMine" xml:space="preserve">내 것 사용 (checkout --ours)</x:String>
|
||||
<x:String x:Key="Text.FileCM.UseTheirs" xml:space="preserve">상대방 것 사용 (checkout --theirs)</x:String>
|
||||
<x:String x:Key="Text.FileHistory" xml:space="preserve">파일 히스토리</x:String>
|
||||
<x:String x:Key="Text.FileHistory.FileChange" xml:space="preserve">변경 사항</x:String>
|
||||
<x:String x:Key="Text.FileHistory.FileContent" xml:space="preserve">내용</x:String>
|
||||
<x:String x:Key="Text.GitFlow" xml:space="preserve">Git-Flow</x:String>
|
||||
<x:String x:Key="Text.GitFlow.DevelopBranch" xml:space="preserve">개발 브랜치:</x:String>
|
||||
<x:String x:Key="Text.GitFlow.Feature" xml:space="preserve">Feature:</x:String>
|
||||
<x:String x:Key="Text.GitFlow.FeaturePrefix" xml:space="preserve">Feature 접두사:</x:String>
|
||||
<x:String x:Key="Text.GitFlow.FinishFeature" xml:space="preserve">FLOW - Feature 완료</x:String>
|
||||
<x:String x:Key="Text.GitFlow.FinishHotfix" xml:space="preserve">FLOW - Hotfix 완료</x:String>
|
||||
<x:String x:Key="Text.GitFlow.FinishRelease" xml:space="preserve">FLOW - Release 완료</x:String>
|
||||
<x:String x:Key="Text.GitFlow.FinishTarget" xml:space="preserve">대상:</x:String>
|
||||
<x:String x:Key="Text.GitFlow.FinishWithPush" xml:space="preserve">완료 후 원격(들)에 푸시</x:String>
|
||||
<x:String x:Key="Text.GitFlow.FinishWithSquash" xml:space="preserve">병합 시 스쿼시</x:String>
|
||||
<x:String x:Key="Text.GitFlow.Hotfix" xml:space="preserve">핫픽스:</x:String>
|
||||
<x:String x:Key="Text.GitFlow.HotfixPrefix" xml:space="preserve">Hotfix 접두사:</x:String>
|
||||
<x:String x:Key="Text.GitFlow.Init" xml:space="preserve">Git-Flow 초기화</x:String>
|
||||
<x:String x:Key="Text.GitFlow.KeepBranchAfterFinish" xml:space="preserve">브랜치 유지</x:String>
|
||||
<x:String x:Key="Text.GitFlow.ProductionBranch" xml:space="preserve">운영 브랜치:</x:String>
|
||||
<x:String x:Key="Text.GitFlow.Release" xml:space="preserve">릴리스:</x:String>
|
||||
<x:String x:Key="Text.GitFlow.ReleasePrefix" xml:space="preserve">Release 접두사:</x:String>
|
||||
<x:String x:Key="Text.GitFlow.StartFeature" xml:space="preserve">Feature 시작...</x:String>
|
||||
<x:String x:Key="Text.GitFlow.StartFeatureTitle" xml:space="preserve">FLOW - Feature 시작</x:String>
|
||||
<x:String x:Key="Text.GitFlow.StartHotfix" xml:space="preserve">Hotfix 시작...</x:String>
|
||||
<x:String x:Key="Text.GitFlow.StartHotfixTitle" xml:space="preserve">FLOW - Hotfix 시작</x:String>
|
||||
<x:String x:Key="Text.GitFlow.StartPlaceholder" xml:space="preserve">이름 입력</x:String>
|
||||
<x:String x:Key="Text.GitFlow.StartRelease" xml:space="preserve">Release 시작...</x:String>
|
||||
<x:String x:Key="Text.GitFlow.StartReleaseTitle" xml:space="preserve">FLOW - Release 시작</x:String>
|
||||
<x:String x:Key="Text.GitFlow.TagPrefix" xml:space="preserve">버전 태그 접두사:</x:String>
|
||||
<x:String x:Key="Text.GitLFS" xml:space="preserve">Git LFS</x:String>
|
||||
<x:String x:Key="Text.GitLFS.AddTrackPattern" xml:space="preserve">추적 패턴 추가...</x:String>
|
||||
<x:String x:Key="Text.GitLFS.AddTrackPattern.IsFilename" xml:space="preserve">패턴이 파일 이름임</x:String>
|
||||
<x:String x:Key="Text.GitLFS.AddTrackPattern.Pattern" xml:space="preserve">사용자 정의 패턴:</x:String>
|
||||
<x:String x:Key="Text.GitLFS.AddTrackPattern.Title" xml:space="preserve">Git LFS에 추적 패턴 추가</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Fetch" xml:space="preserve">Fetch</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Fetch.Tips" xml:space="preserve">Git LFS 객체를 다운로드하려면 `git lfs fetch`를 실행하세요. 이 작업은 작업 사본을 업데이트하지 않습니다.</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Fetch.Title" xml:space="preserve">LFS 객체 Fetch</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Install" xml:space="preserve">Git LFS 훅(hook) 설치</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Locks" xml:space="preserve">잠금 보기</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Locks.Empty" xml:space="preserve">잠긴 파일 없음</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Locks.Lock" xml:space="preserve">잠금</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Locks.OnlyMine" xml:space="preserve">내 잠금만 보기</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Locks.Title" xml:space="preserve">LFS 잠금</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Locks.Unlock" xml:space="preserve">잠금 해제</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Locks.UnlockForce" xml:space="preserve">강제 잠금 해제</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Prune" xml:space="preserve">정리</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Prune.Tips" xml:space="preserve">로컬 저장소에서 오래된 LFS 파일을 삭제하려면 `git lfs prune`을 실행하세요</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Pull" xml:space="preserve">Pull</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Pull.Tips" xml:space="preserve">현재 ref 및 체크아웃에 대한 모든 Git LFS 파일을 다운로드하려면 `git lfs pull`을 실행하세요</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Pull.Title" xml:space="preserve">LFS 객체 Pull</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Push" xml:space="preserve">푸시</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Push.Tips" xml:space="preserve">대기 중인 대용량 파일을 Git LFS 엔드포인트로 푸시합니다</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Push.Title" xml:space="preserve">LFS 객체 푸시</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Remote" xml:space="preserve">원격:</x:String>
|
||||
<x:String x:Key="Text.GitLFS.Track" xml:space="preserve">'{0}' 이름의 파일 추적</x:String>
|
||||
<x:String x:Key="Text.GitLFS.TrackByExtension" xml:space="preserve">모든 *{0} 파일 추적</x:String>
|
||||
<x:String x:Key="Text.Histories" xml:space="preserve">히스토리</x:String>
|
||||
<x:String x:Key="Text.Histories.Header.Author" xml:space="preserve">작성자</x:String>
|
||||
<x:String x:Key="Text.Histories.Header.AuthorTime" xml:space="preserve">작성 시간</x:String>
|
||||
<x:String x:Key="Text.Histories.Header.GraphAndSubject" xml:space="preserve">그래프 & 제목</x:String>
|
||||
<x:String x:Key="Text.Histories.Header.SHA" xml:space="preserve">SHA</x:String>
|
||||
<x:String x:Key="Text.Histories.Header.Time" xml:space="preserve">커밋 시간</x:String>
|
||||
<x:String x:Key="Text.Histories.Selected" xml:space="preserve">{0}개 커밋 선택됨</x:String>
|
||||
<x:String x:Key="Text.Histories.Tips" xml:space="preserve">'Ctrl' 또는 'Shift' 키를 누른 채로 여러 커밋을 선택하세요.</x:String>
|
||||
<x:String x:Key="Text.Histories.Tips.MacOS" xml:space="preserve">⌘ 또는 ⇧ 키를 누른 채로 여러 커밋을 선택하세요.</x:String>
|
||||
<x:String x:Key="Text.Histories.Tips.Prefix" xml:space="preserve">팁:</x:String>
|
||||
<x:String x:Key="Text.Hotkeys" xml:space="preserve">키보드 단축키 참조</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global" xml:space="preserve">전역</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.Clone" xml:space="preserve">새 저장소 복제</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.CloseTab" xml:space="preserve">현재 탭 닫기</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.GotoNextTab" xml:space="preserve">다음 탭으로 이동</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.GotoPrevTab" xml:space="preserve">이전 탭으로 이동</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.NewTab" xml:space="preserve">새 탭 만들기</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.OpenPreferences" xml:space="preserve">환경설정 대화상자 열기</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchTab" xml:space="preserve">활성 탭 전환</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">저장소</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">스테이징된 변경 사항 커밋</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.CommitAndPush" xml:space="preserve">스테이징된 변경 사항 커밋 및 푸시</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.CommitWithAutoStage" xml:space="preserve">모든 변경 사항 스테이징 후 커밋</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.Fetch" xml:space="preserve">Fetch (바로 시작)</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.GoHome" xml:space="preserve">대시보드 모드 (기본)</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.OpenSearchCommits" xml:space="preserve">커밋 검색 모드 열기</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.Pull" xml:space="preserve">Pull (바로 시작)</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.Push" xml:space="preserve">푸시 (바로 시작)</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.Refresh" xml:space="preserve">이 저장소 강제 새로고침</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.ViewChanges" xml:space="preserve">'변경 사항'으로 전환</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.ViewHistories" xml:space="preserve">'히스토리'로 전환</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.ViewStashes" xml:space="preserve">'스태시'로 전환</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.TextEditor" xml:space="preserve">텍스트 에디터</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.TextEditor.CloseSearch" xml:space="preserve">검색 패널 닫기</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.TextEditor.GotoNextMatch" xml:space="preserve">다음 일치 항목 찾기</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.TextEditor.GotoPrevMatch" xml:space="preserve">이전 일치 항목 찾기</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.TextEditor.OpenExternalMergeTool" xml:space="preserve">외부 diff/merge 도구로 열기</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.TextEditor.Search" xml:space="preserve">검색 패널 열기</x:String>
|
||||
<x:String x:Key="Text.Hunk.Discard" xml:space="preserve">폐기</x:String>
|
||||
<x:String x:Key="Text.Hunk.Stage" xml:space="preserve">스테이지</x:String>
|
||||
<x:String x:Key="Text.Hunk.Unstage" xml:space="preserve">언스테이지</x:String>
|
||||
<x:String x:Key="Text.Init" xml:space="preserve">저장소 초기화</x:String>
|
||||
<x:String x:Key="Text.Init.Path" xml:space="preserve">경로:</x:String>
|
||||
<x:String x:Key="Text.InProgress.CherryPick" xml:space="preserve">체리픽 진행 중.</x:String>
|
||||
<x:String x:Key="Text.InProgress.CherryPick.Head" xml:space="preserve">커밋 처리 중</x:String>
|
||||
<x:String x:Key="Text.InProgress.Merge" xml:space="preserve">병합 진행 중.</x:String>
|
||||
<x:String x:Key="Text.InProgress.Merge.Operating" xml:space="preserve">병합 중</x:String>
|
||||
<x:String x:Key="Text.InProgress.Rebase" xml:space="preserve">리베이스 진행 중.</x:String>
|
||||
<x:String x:Key="Text.InProgress.Rebase.StoppedAt" xml:space="preserve">중단 지점</x:String>
|
||||
<x:String x:Key="Text.InProgress.Revert" xml:space="preserve">되돌리기 진행 중.</x:String>
|
||||
<x:String x:Key="Text.InProgress.Revert.Head" xml:space="preserve">커밋 되돌리는 중</x:String>
|
||||
<x:String x:Key="Text.InteractiveRebase" xml:space="preserve">대화형 리베이스</x:String>
|
||||
<x:String x:Key="Text.InteractiveRebase.AutoStash" xml:space="preserve">로컬 변경 사항 스태시 & 재적용</x:String>
|
||||
<x:String x:Key="Text.InteractiveRebase.On" xml:space="preserve">기준:</x:String>
|
||||
<x:String x:Key="Text.InteractiveRebase.ReorderTip" xml:space="preserve">드래그 앤 드롭으로 커밋 순서 변경</x:String>
|
||||
<x:String x:Key="Text.InteractiveRebase.Target" xml:space="preserve">대상 브랜치:</x:String>
|
||||
<x:String x:Key="Text.IssueLinkCM.CopyLink" xml:space="preserve">링크 복사</x:String>
|
||||
<x:String x:Key="Text.IssueLinkCM.OpenInBrowser" xml:space="preserve">브라우저에서 열기</x:String>
|
||||
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">오류</x:String>
|
||||
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">알림</x:String>
|
||||
<x:String x:Key="Text.Launcher.Pages" xml:space="preserve">탭</x:String>
|
||||
<x:String x:Key="Text.Launcher.Workspaces" xml:space="preserve">작업 공간</x:String>
|
||||
<x:String x:Key="Text.Merge" xml:space="preserve">브랜치 병합</x:String>
|
||||
<x:String x:Key="Text.Merge.Edit" xml:space="preserve">병합 메시지 수정</x:String>
|
||||
<x:String x:Key="Text.Merge.Into" xml:space="preserve">대상:</x:String>
|
||||
<x:String x:Key="Text.Merge.Mode" xml:space="preserve">병합 옵션:</x:String>
|
||||
<x:String x:Key="Text.Merge.Source" xml:space="preserve">소스:</x:String>
|
||||
<x:String x:Key="Text.MergeMultiple" xml:space="preserve">병합 (다중)</x:String>
|
||||
<x:String x:Key="Text.MergeMultiple.CommitChanges" xml:space="preserve">모든 변경 사항 커밋</x:String>
|
||||
<x:String x:Key="Text.MergeMultiple.Strategy" xml:space="preserve">전략:</x:String>
|
||||
<x:String x:Key="Text.MergeMultiple.Targets" xml:space="preserve">대상:</x:String>
|
||||
<x:String x:Key="Text.MoveSubmodule" xml:space="preserve">서브모듈 이동</x:String>
|
||||
<x:String x:Key="Text.MoveSubmodule.MoveTo" xml:space="preserve">이동 위치:</x:String>
|
||||
<x:String x:Key="Text.MoveSubmodule.Submodule" xml:space="preserve">서브모듈:</x:String>
|
||||
<x:String x:Key="Text.MoveRepositoryNode" xml:space="preserve">저장소 노드 이동</x:String>
|
||||
<x:String x:Key="Text.MoveRepositoryNode.Target" xml:space="preserve">상위 노드 선택:</x:String>
|
||||
<x:String x:Key="Text.Name" xml:space="preserve">이름:</x:String>
|
||||
<x:String x:Key="Text.NotConfigured" xml:space="preserve">Git이 구성되지 않았습니다. [환경설정]으로 이동하여 먼저 구성하세요.</x:String>
|
||||
<x:String x:Key="Text.OpenAppDataDir" xml:space="preserve">데이터 저장 디렉터리 열기</x:String>
|
||||
<x:String x:Key="Text.OpenInExternalMergeTool" xml:space="preserve">병합 도구에서 열기</x:String>
|
||||
<x:String x:Key="Text.OpenWith" xml:space="preserve">다음으로 열기...</x:String>
|
||||
<x:String x:Key="Text.Optional" xml:space="preserve">선택 사항.</x:String>
|
||||
<x:String x:Key="Text.PageTabBar.New" xml:space="preserve">새 탭 만들기</x:String>
|
||||
<x:String x:Key="Text.PageTabBar.Tab.Bookmark" xml:space="preserve">북마크</x:String>
|
||||
<x:String x:Key="Text.PageTabBar.Tab.Close" xml:space="preserve">탭 닫기</x:String>
|
||||
<x:String x:Key="Text.PageTabBar.Tab.CloseOther" xml:space="preserve">다른 탭 닫기</x:String>
|
||||
<x:String x:Key="Text.PageTabBar.Tab.CloseRight" xml:space="preserve">오른쪽 탭 닫기</x:String>
|
||||
<x:String x:Key="Text.PageTabBar.Tab.CopyPath" xml:space="preserve">저장소 경로 복사</x:String>
|
||||
<x:String x:Key="Text.PageTabBar.Welcome.Title" xml:space="preserve">저장소</x:String>
|
||||
<x:String x:Key="Text.Paste" xml:space="preserve">붙여넣기</x:String>
|
||||
<x:String x:Key="Text.Period.DaysAgo" xml:space="preserve">{0}일 전</x:String>
|
||||
<x:String x:Key="Text.Period.HourAgo" xml:space="preserve">1시간 전</x:String>
|
||||
<x:String x:Key="Text.Period.HoursAgo" xml:space="preserve">{0}시간 전</x:String>
|
||||
<x:String x:Key="Text.Period.JustNow" xml:space="preserve">방금 전</x:String>
|
||||
<x:String x:Key="Text.Period.LastMonth" xml:space="preserve">지난 달</x:String>
|
||||
<x:String x:Key="Text.Period.LastYear" xml:space="preserve">작년</x:String>
|
||||
<x:String x:Key="Text.Period.MinutesAgo" xml:space="preserve">{0}분 전</x:String>
|
||||
<x:String x:Key="Text.Period.MonthsAgo" xml:space="preserve">{0}개월 전</x:String>
|
||||
<x:String x:Key="Text.Period.YearsAgo" xml:space="preserve">{0}년 전</x:String>
|
||||
<x:String x:Key="Text.Period.Yesterday" xml:space="preserve">어제</x:String>
|
||||
<x:String x:Key="Text.Preferences" xml:space="preserve">환경설정</x:String>
|
||||
<x:String x:Key="Text.Preferences.AI" xml:space="preserve">AI</x:String>
|
||||
<x:String x:Key="Text.Preferences.AI.AnalyzeDiffPrompt" xml:space="preserve">Diff 분석 프롬프트</x:String>
|
||||
<x:String x:Key="Text.Preferences.AI.ApiKey" xml:space="preserve">API 키</x:String>
|
||||
<x:String x:Key="Text.Preferences.AI.GenerateSubjectPrompt" xml:space="preserve">제목 생성 프롬프트</x:String>
|
||||
<x:String x:Key="Text.Preferences.AI.Model" xml:space="preserve">모델</x:String>
|
||||
<x:String x:Key="Text.Preferences.AI.Name" xml:space="preserve">이름</x:String>
|
||||
<x:String x:Key="Text.Preferences.AI.ReadApiKeyFromEnv" xml:space="preserve">입력된 값은 환경변수(ENV)에서 API 키를 불러올 이름입니다</x:String>
|
||||
<x:String x:Key="Text.Preferences.AI.Server" xml:space="preserve">서버</x:String>
|
||||
<x:String x:Key="Text.Preferences.AI.Streaming" xml:space="preserve">스트리밍 활성화</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance" xml:space="preserve">모양</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.DefaultFont" xml:space="preserve">기본 글꼴</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.EditorTabWidth" xml:space="preserve">에디터 탭 너비</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize" xml:space="preserve">글꼴 크기</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Default" xml:space="preserve">기본</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Editor" xml:space="preserve">에디터</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.MonospaceFont" xml:space="preserve">고정폭 글꼴</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.Theme" xml:space="preserve">테마</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.ThemeOverrides" xml:space="preserve">테마 재정의</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseAutoHideScrollBars" xml:space="preserve">스크롤바 자동 숨기기 사용</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseNativeWindowFrame" xml:space="preserve">네이티브 윈도우 프레임 사용</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge" xml:space="preserve">DIFF/MERGE 도구</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge.Path" xml:space="preserve">설치 경로</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge.Path.Placeholder" xml:space="preserve">diff/merge 도구 경로 입력</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge.Type" xml:space="preserve">도구</x:String>
|
||||
<x:String x:Key="Text.Preferences.General" xml:space="preserve">일반</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.Check4UpdatesOnStartup" xml:space="preserve">시작 시 업데이트 확인</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.DateFormat" xml:space="preserve">날짜 형식</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.EnableCompactFolders" xml:space="preserve">변경 사항 트리에서 폴더 압축 활성화</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.Locale" xml:space="preserve">언어</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.MaxHistoryCommits" xml:space="preserve">히스토리 커밋 수</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.ShowAuthorTime" xml:space="preserve">그래프에 커밋 시간 대신 작성자 시간 표시</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.ShowChangesPageByDefault" xml:space="preserve">기본으로 `로컬 변경 사항` 페이지 표시</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.ShowChangesTabInCommitDetailByDefault" xml:space="preserve">커밋 세부 정보에서 기본으로 `변경 사항` 탭 표시</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.ShowChildren" xml:space="preserve">커밋 세부 정보에 자식 커밋 표시</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.ShowTagsInGraph" xml:space="preserve">커밋 그래프에 태그 표시</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.SubjectGuideLength" xml:space="preserve">제목 가이드 길이</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.UseGitHubStyleAvatar" xml:space="preserve">GitHub 스타일 기본 아바타 생성</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git" xml:space="preserve">GIT</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git.CRLF" xml:space="preserve">자동 CRLF 활성화</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git.DefaultCloneDir" xml:space="preserve">기본 복제 디렉터리</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git.Email" xml:space="preserve">사용자 이메일</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git.Email.Placeholder" xml:space="preserve">전역 git 사용자 이메일</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git.EnablePruneOnFetch" xml:space="preserve">Fetch 시 --prune 활성화</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git.IgnoreCRAtEOLInDiff" xml:space="preserve">diff 시 --ignore-cr-at-eol 활성화</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git.Invalid" xml:space="preserve">이 앱은 Git (>= 2.25.1)을(를) 필요로 합니다</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git.Path" xml:space="preserve">설치 경로</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git.SSLVerify" xml:space="preserve">HTTP SSL 검증 활성화</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git.UseLibsecret" xml:space="preserve">git-credential-manager 대신 git-credential-libsecret 사용</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git.User" xml:space="preserve">사용자 이름</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git.User.Placeholder" xml:space="preserve">전역 git 사용자 이름</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git.Version" xml:space="preserve">Git 버전</x:String>
|
||||
<x:String x:Key="Text.Preferences.GPG" xml:space="preserve">GPG 서명</x:String>
|
||||
<x:String x:Key="Text.Preferences.GPG.CommitEnabled" xml:space="preserve">커밋 GPG 서명</x:String>
|
||||
<x:String x:Key="Text.Preferences.GPG.Format" xml:space="preserve">GPG 형식</x:String>
|
||||
<x:String x:Key="Text.Preferences.GPG.Path" xml:space="preserve">프로그램 설치 경로</x:String>
|
||||
<x:String x:Key="Text.Preferences.GPG.Path.Placeholder" xml:space="preserve">설치된 gpg 프로그램 경로 입력</x:String>
|
||||
<x:String x:Key="Text.Preferences.GPG.TagEnabled" xml:space="preserve">태그 GPG 서명</x:String>
|
||||
<x:String x:Key="Text.Preferences.GPG.UserKey" xml:space="preserve">사용자 서명 키</x:String>
|
||||
<x:String x:Key="Text.Preferences.GPG.UserKey.Placeholder" xml:space="preserve">사용자의 gpg 서명 키</x:String>
|
||||
<x:String x:Key="Text.Preferences.Integration" xml:space="preserve">연동</x:String>
|
||||
<x:String x:Key="Text.Preferences.Shell" xml:space="preserve">셸/터미널</x:String>
|
||||
<x:String x:Key="Text.Preferences.Shell.Path" xml:space="preserve">경로</x:String>
|
||||
<x:String x:Key="Text.Preferences.Shell.Type" xml:space="preserve">셸/터미널</x:String>
|
||||
<x:String x:Key="Text.PruneRemote" xml:space="preserve">원격 정리</x:String>
|
||||
<x:String x:Key="Text.PruneRemote.Target" xml:space="preserve">대상:</x:String>
|
||||
<x:String x:Key="Text.PruneWorktrees" xml:space="preserve">워크트리 정리</x:String>
|
||||
<x:String x:Key="Text.PruneWorktrees.Tip" xml:space="preserve">`$GIT_COMMON_DIR/worktrees`의 워크트리 정보 정리</x:String>
|
||||
<x:String x:Key="Text.Pull" xml:space="preserve">Pull</x:String>
|
||||
<x:String x:Key="Text.Pull.Branch" xml:space="preserve">원격 브랜치:</x:String>
|
||||
<x:String x:Key="Text.Pull.Into" xml:space="preserve">대상:</x:String>
|
||||
<x:String x:Key="Text.Pull.LocalChanges" xml:space="preserve">로컬 변경 사항:</x:String>
|
||||
<x:String x:Key="Text.Pull.LocalChanges.Discard" xml:space="preserve">폐기</x:String>
|
||||
<x:String x:Key="Text.Pull.LocalChanges.StashAndReply" xml:space="preserve">스태시 & 재적용</x:String>
|
||||
<x:String x:Key="Text.Pull.RecurseSubmodules" xml:space="preserve">모든 서브모듈 업데이트</x:String>
|
||||
<x:String x:Key="Text.Pull.Remote" xml:space="preserve">원격:</x:String>
|
||||
<x:String x:Key="Text.Pull.Title" xml:space="preserve">Pull (Fetch & 병합)</x:String>
|
||||
<x:String x:Key="Text.Pull.UseRebase" xml:space="preserve">병합 대신 리베이스 사용</x:String>
|
||||
<x:String x:Key="Text.Push" xml:space="preserve">푸시</x:String>
|
||||
<x:String x:Key="Text.Push.CheckSubmodules" xml:space="preserve">서브모듈이 푸시되었는지 확인</x:String>
|
||||
<x:String x:Key="Text.Push.Force" xml:space="preserve">강제 푸시</x:String>
|
||||
<x:String x:Key="Text.Push.Local" xml:space="preserve">로컬 브랜치:</x:String>
|
||||
<x:String x:Key="Text.Push.New" xml:space="preserve">신규</x:String>
|
||||
<x:String x:Key="Text.Push.Remote" xml:space="preserve">원격:</x:String>
|
||||
<x:String x:Key="Text.Push.Revision" xml:space="preserve">리비전:</x:String>
|
||||
<x:String x:Key="Text.Push.Revision.Title" xml:space="preserve">리비전을 원격에 푸시</x:String>
|
||||
<x:String x:Key="Text.Push.Title" xml:space="preserve">변경 사항을 원격에 푸시</x:String>
|
||||
<x:String x:Key="Text.Push.To" xml:space="preserve">원격 브랜치:</x:String>
|
||||
<x:String x:Key="Text.Push.Tracking" xml:space="preserve">추적 브랜치로 설정</x:String>
|
||||
<x:String x:Key="Text.Push.WithAllTags" xml:space="preserve">모든 태그 푸시</x:String>
|
||||
<x:String x:Key="Text.PushTag" xml:space="preserve">태그를 원격에 푸시</x:String>
|
||||
<x:String x:Key="Text.PushTag.PushAllRemotes" xml:space="preserve">모든 원격에 푸시</x:String>
|
||||
<x:String x:Key="Text.PushTag.Remote" xml:space="preserve">원격:</x:String>
|
||||
<x:String x:Key="Text.PushTag.Tag" xml:space="preserve">태그:</x:String>
|
||||
<x:String x:Key="Text.Quit" xml:space="preserve">종료</x:String>
|
||||
<x:String x:Key="Text.Rebase" xml:space="preserve">현재 브랜치 리베이스</x:String>
|
||||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">로컬 변경 사항 스태시 & 재적용</x:String>
|
||||
<x:String x:Key="Text.Rebase.On" xml:space="preserve">기준:</x:String>
|
||||
<x:String x:Key="Text.Remote.AddTitle" xml:space="preserve">원격 추가</x:String>
|
||||
<x:String x:Key="Text.Remote.EditTitle" xml:space="preserve">원격 편집</x:String>
|
||||
<x:String x:Key="Text.Remote.Name" xml:space="preserve">이름:</x:String>
|
||||
<x:String x:Key="Text.Remote.Name.Placeholder" xml:space="preserve">원격 이름</x:String>
|
||||
<x:String x:Key="Text.Remote.URL" xml:space="preserve">저장소 URL:</x:String>
|
||||
<x:String x:Key="Text.Remote.URL.Placeholder" xml:space="preserve">원격 git 저장소 URL</x:String>
|
||||
<x:String x:Key="Text.RemoteCM.CopyURL" xml:space="preserve">URL 복사</x:String>
|
||||
<x:String x:Key="Text.RemoteCM.CustomAction" xml:space="preserve">사용자 지정 작업</x:String>
|
||||
<x:String x:Key="Text.RemoteCM.Delete" xml:space="preserve">삭제...</x:String>
|
||||
<x:String x:Key="Text.RemoteCM.Edit" xml:space="preserve">편집...</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.Prune" 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.Target" xml:space="preserve">대상:</x:String>
|
||||
<x:String x:Key="Text.RenameBranch" xml:space="preserve">브랜치 이름 변경</x:String>
|
||||
<x:String x:Key="Text.RenameBranch.Name" xml:space="preserve">새 이름:</x:String>
|
||||
<x:String x:Key="Text.RenameBranch.Name.Placeholder" xml:space="preserve">이 브랜치의 고유한 이름</x:String>
|
||||
<x:String x:Key="Text.RenameBranch.Target" xml:space="preserve">브랜치:</x:String>
|
||||
<x:String x:Key="Text.Repository.Abort" xml:space="preserve">중단</x:String>
|
||||
<x:String x:Key="Text.Repository.AutoFetching" xml:space="preserve">원격에서 변경 사항 자동 Fetch 중...</x:String>
|
||||
<x:String x:Key="Text.Repository.BranchSort" xml:space="preserve">정렬</x:String>
|
||||
<x:String x:Key="Text.Repository.BranchSort.ByCommitterDate" xml:space="preserve">커밋 날짜 순</x:String>
|
||||
<x:String x:Key="Text.Repository.BranchSort.ByName" xml:space="preserve">이름 순</x:String>
|
||||
<x:String x:Key="Text.Repository.Clean" xml:space="preserve">정리 (GC & Prune)</x:String>
|
||||
<x:String x:Key="Text.Repository.CleanTips" xml:space="preserve">이 저장소에 대해 `git gc` 명령을 실행합니다.</x:String>
|
||||
<x:String x:Key="Text.Repository.ClearAllCommitsFilter" xml:space="preserve">모두 지우기</x:String>
|
||||
<x:String x:Key="Text.Repository.ClearStashes" xml:space="preserve">지우기</x:String>
|
||||
<x:String x:Key="Text.Repository.Configure" xml:space="preserve">이 저장소 설정</x:String>
|
||||
<x:String x:Key="Text.Repository.Continue" xml:space="preserve">계속</x:String>
|
||||
<x:String x:Key="Text.Repository.CustomActions" xml:space="preserve">사용자 지정 작업</x:String>
|
||||
<x:String x:Key="Text.Repository.CustomActions.Empty" xml:space="preserve">사용자 지정 작업 없음</x:String>
|
||||
<x:String x:Key="Text.Repository.Dashboard" xml:space="preserve">대시보드</x:String>
|
||||
<x:String x:Key="Text.Repository.DiscardAll" xml:space="preserve">모든 변경 사항 폐기</x:String>
|
||||
<x:String x:Key="Text.Repository.Explore" xml:space="preserve">파일 탐색기에서 열기</x:String>
|
||||
<x:String x:Key="Text.Repository.Filter" xml:space="preserve">브랜치/태그/서브모듈 검색</x:String>
|
||||
<x:String x:Key="Text.Repository.FilterCommits" xml:space="preserve">그래프에 표시 여부</x:String>
|
||||
<x:String x:Key="Text.Repository.FilterCommits.Default" xml:space="preserve">설정 안 함</x:String>
|
||||
<x:String x:Key="Text.Repository.FilterCommits.Exclude" xml:space="preserve">커밋 그래프에서 숨기기</x:String>
|
||||
<x:String x:Key="Text.Repository.FilterCommits.Include" xml:space="preserve">커밋 그래프에서 필터링</x:String>
|
||||
<x:String x:Key="Text.Repository.HistoriesLayout" xml:space="preserve">레이아웃</x:String>
|
||||
<x:String x:Key="Text.Repository.HistoriesLayout.Horizontal" xml:space="preserve">수평</x:String>
|
||||
<x:String x:Key="Text.Repository.HistoriesLayout.Vertical" xml:space="preserve">수직</x:String>
|
||||
<x:String x:Key="Text.Repository.HistoriesOrder" xml:space="preserve">커밋 순서</x:String>
|
||||
<x:String x:Key="Text.Repository.HistoriesOrder.ByDate" xml:space="preserve">커밋 날짜</x:String>
|
||||
<x:String x:Key="Text.Repository.HistoriesOrder.Topo" xml:space="preserve">위상 정렬</x:String>
|
||||
<x:String x:Key="Text.Repository.LocalBranches" xml:space="preserve">로컬 브랜치</x:String>
|
||||
<x:String x:Key="Text.Repository.MoreOptions" xml:space="preserve">추가 옵션...</x:String>
|
||||
<x:String x:Key="Text.Repository.NavigateToCurrentHead" xml:space="preserve">HEAD로 이동</x:String>
|
||||
<x:String x:Key="Text.Repository.NewBranch" xml:space="preserve">브랜치 생성</x:String>
|
||||
<x:String x:Key="Text.Repository.Notifications.Clear" xml:space="preserve">알림 지우기</x:String>
|
||||
<x:String x:Key="Text.Repository.OnlyHighlightCurrentBranchInGraph" xml:space="preserve">현재 브랜치만 강조</x:String>
|
||||
<x:String x:Key="Text.Repository.OpenIn" xml:space="preserve">{0}에서 열기</x:String>
|
||||
<x:String x:Key="Text.Repository.OpenWithExternalTools" xml:space="preserve">외부 도구에서 열기</x:String>
|
||||
<x:String x:Key="Text.Repository.Remotes" xml:space="preserve">원격</x:String>
|
||||
<x:String x:Key="Text.Repository.Remotes.Add" xml:space="preserve">원격 추가</x:String>
|
||||
<x:String x:Key="Text.Repository.Search" xml:space="preserve">커밋 검색</x:String>
|
||||
<x:String x:Key="Text.Repository.Search.ByAuthor" xml:space="preserve">작성자</x:String>
|
||||
<x:String x:Key="Text.Repository.Search.ByCommitter" xml:space="preserve">커밋터</x:String>
|
||||
<x:String x:Key="Text.Repository.Search.ByContent" xml:space="preserve">내용</x:String>
|
||||
<x:String x:Key="Text.Repository.Search.ByMessage" xml:space="preserve">메시지</x:String>
|
||||
<x:String x:Key="Text.Repository.Search.ByPath" xml:space="preserve">경로</x:String>
|
||||
<x:String x:Key="Text.Repository.Search.BySHA" xml:space="preserve">SHA</x:String>
|
||||
<x:String x:Key="Text.Repository.Search.InCurrentBranch" xml:space="preserve">현재 브랜치</x:String>
|
||||
<x:String x:Key="Text.Repository.ShowDecoratedCommitsOnly" xml:space="preserve">장식된(Decorated) 커밋만</x:String>
|
||||
<x:String x:Key="Text.Repository.ShowFirstParentOnly" xml:space="preserve">첫 번째 부모만</x:String>
|
||||
<x:String x:Key="Text.Repository.ShowFlags" xml:space="preserve">플래그 표시</x:String>
|
||||
<x:String x:Key="Text.Repository.ShowLostCommits" xml:space="preserve">유실된(Lost) 커밋 표시</x:String>
|
||||
<x:String x:Key="Text.Repository.ShowSubmodulesAsTree" xml:space="preserve">서브모듈을 트리로 표시</x:String>
|
||||
<x:String x:Key="Text.Repository.ShowTagsAsTree" xml:space="preserve">태그를 트리로 표시</x:String>
|
||||
<x:String x:Key="Text.Repository.Skip" xml:space="preserve">건너뛰기</x:String>
|
||||
<x:String x:Key="Text.Repository.Statistics" xml:space="preserve">통계</x:String>
|
||||
<x:String x:Key="Text.Repository.Submodules" xml:space="preserve">서브모듈</x:String>
|
||||
<x:String x:Key="Text.Repository.Submodules.Add" xml:space="preserve">서브모듈 추가</x:String>
|
||||
<x:String x:Key="Text.Repository.Submodules.Update" xml:space="preserve">서브모듈 업데이트</x:String>
|
||||
<x:String x:Key="Text.Repository.Tags" xml:space="preserve">태그</x:String>
|
||||
<x:String x:Key="Text.Repository.Tags.Add" xml:space="preserve">새 태그</x:String>
|
||||
<x:String x:Key="Text.Repository.Tags.OrderByCreatorDate" xml:space="preserve">생성 날짜 순</x:String>
|
||||
<x:String x:Key="Text.Repository.Tags.OrderByName" xml:space="preserve">이름 순</x:String>
|
||||
<x:String x:Key="Text.Repository.Tags.Sort" xml:space="preserve">정렬</x:String>
|
||||
<x:String x:Key="Text.Repository.Terminal" xml:space="preserve">터미널에서 열기</x:String>
|
||||
<x:String x:Key="Text.Repository.UseRelativeTimeInGraph" xml:space="preserve">상대 시간 사용</x:String>
|
||||
<x:String x:Key="Text.Repository.ViewLogs" xml:space="preserve">로그 보기</x:String>
|
||||
<x:String x:Key="Text.Repository.Visit" xml:space="preserve">브라우저에서 '{0}' 방문</x:String>
|
||||
<x:String x:Key="Text.Repository.Worktrees" xml:space="preserve">워크트리</x:String>
|
||||
<x:String x:Key="Text.Repository.Worktrees.Add" xml:space="preserve">워크트리 추가</x:String>
|
||||
<x:String x:Key="Text.Repository.Worktrees.Prune" xml:space="preserve">정리</x:String>
|
||||
<x:String x:Key="Text.RepositoryURL" xml:space="preserve">Git 저장소 URL</x:String>
|
||||
<x:String x:Key="Text.Reset" xml:space="preserve">현재 브랜치를 리비전으로 리셋</x:String>
|
||||
<x:String x:Key="Text.Reset.Mode" xml:space="preserve">리셋 모드:</x:String>
|
||||
<x:String x:Key="Text.Reset.MoveTo" xml:space="preserve">이동 대상:</x:String>
|
||||
<x:String x:Key="Text.Reset.Target" xml:space="preserve">현재 브랜치:</x:String>
|
||||
<x:String x:Key="Text.ResetWithoutCheckout" xml:space="preserve">브랜치 리셋 (체크아웃 없음)</x:String>
|
||||
<x:String x:Key="Text.ResetWithoutCheckout.MoveTo" xml:space="preserve">이동 대상:</x:String>
|
||||
<x:String x:Key="Text.ResetWithoutCheckout.Target" xml:space="preserve">브랜치:</x:String>
|
||||
<x:String x:Key="Text.RevealFile" xml:space="preserve">파일 탐색기에서 보기</x:String>
|
||||
<x:String x:Key="Text.Revert" xml:space="preserve">커밋 되돌리기</x:String>
|
||||
<x:String x:Key="Text.Revert.Commit" xml:space="preserve">커밋:</x:String>
|
||||
<x:String x:Key="Text.Revert.CommitChanges" xml:space="preserve">되돌린 변경 사항 커밋</x:String>
|
||||
<x:String x:Key="Text.Reword" xml:space="preserve">커밋 메시지 수정</x:String>
|
||||
<x:String x:Key="Text.Running" xml:space="preserve">실행 중. 잠시만 기다려주세요...</x:String>
|
||||
<x:String x:Key="Text.Save" xml:space="preserve">저장</x:String>
|
||||
<x:String x:Key="Text.SaveAs" xml:space="preserve">다른 이름으로 저장...</x:String>
|
||||
<x:String x:Key="Text.SaveAsPatchSuccess" xml:space="preserve">패치가 성공적으로 저장되었습니다!</x:String>
|
||||
<x:String x:Key="Text.ScanRepositories" xml:space="preserve">저장소 스캔</x:String>
|
||||
<x:String x:Key="Text.ScanRepositories.RootDir" xml:space="preserve">루트 디렉터리:</x:String>
|
||||
<x:String x:Key="Text.ScanRepositories.UseCustomDir" xml:space="preserve">다른 사용자 정의 디렉터리 스캔</x:String>
|
||||
<x:String x:Key="Text.SelfUpdate" xml:space="preserve">업데이트 확인...</x:String>
|
||||
<x:String x:Key="Text.SelfUpdate.Available" xml:space="preserve">이 소프트웨어의 새 버전을 사용할 수 있습니다: </x:String>
|
||||
<x:String x:Key="Text.SelfUpdate.Error" xml:space="preserve">업데이트 확인 실패!</x:String>
|
||||
<x:String x:Key="Text.SelfUpdate.GotoDownload" xml:space="preserve">다운로드</x:String>
|
||||
<x:String x:Key="Text.SelfUpdate.IgnoreThisVersion" xml:space="preserve">이 버전 건너뛰기</x:String>
|
||||
<x:String x:Key="Text.SelfUpdate.Title" xml:space="preserve">소프트웨어 업데이트</x:String>
|
||||
<x:String x:Key="Text.SelfUpdate.UpToDate" xml:space="preserve">현재 사용 가능한 업데이트가 없습니다.</x:String>
|
||||
<x:String x:Key="Text.SetSubmoduleBranch" xml:space="preserve">서브모듈 브랜치 설정</x:String>
|
||||
<x:String x:Key="Text.SetSubmoduleBranch.Submodule" xml:space="preserve">서브모듈:</x:String>
|
||||
<x:String x:Key="Text.SetSubmoduleBranch.Current" xml:space="preserve">현재:</x:String>
|
||||
<x:String x:Key="Text.SetSubmoduleBranch.New" xml:space="preserve">변경:</x:String>
|
||||
<x:String x:Key="Text.SetSubmoduleBranch.New.Tip" xml:space="preserve">선택 사항. 비어 있으면 기본값으로 설정됩니다.</x:String>
|
||||
<x:String x:Key="Text.SetUpstream" xml:space="preserve">추적 브랜치 설정</x:String>
|
||||
<x:String x:Key="Text.SetUpstream.Local" xml:space="preserve">브랜치:</x:String>
|
||||
<x:String x:Key="Text.SetUpstream.Unset" xml:space="preserve">업스트림 설정 해제</x:String>
|
||||
<x:String x:Key="Text.SetUpstream.Upstream" xml:space="preserve">업스트림:</x:String>
|
||||
<x:String x:Key="Text.SHALinkCM.CopySHA" xml:space="preserve">SHA 복사</x:String>
|
||||
<x:String x:Key="Text.SHALinkCM.NavigateTo" xml:space="preserve">이동</x:String>
|
||||
<x:String x:Key="Text.Squash" xml:space="preserve">커밋 스쿼시</x:String>
|
||||
<x:String x:Key="Text.Squash.Into" xml:space="preserve">대상:</x:String>
|
||||
<x:String x:Key="Text.SSHKey" xml:space="preserve">SSH 개인 키:</x:String>
|
||||
<x:String x:Key="Text.SSHKey.Placeholder" xml:space="preserve">개인 SSH 키 저장 경로</x:String>
|
||||
<x:String x:Key="Text.Start" xml:space="preserve">시작</x:String>
|
||||
<x:String x:Key="Text.Stash" xml:space="preserve">스태시</x:String>
|
||||
<x:String x:Key="Text.Stash.IncludeUntracked" xml:space="preserve">추적하지 않는 파일 포함</x:String>
|
||||
<x:String x:Key="Text.Stash.Message" xml:space="preserve">메시지:</x:String>
|
||||
<x:String x:Key="Text.Stash.Message.Placeholder" xml:space="preserve">선택 사항. 이 스태시의 메시지</x:String>
|
||||
<x:String x:Key="Text.Stash.Mode" xml:space="preserve">모드:</x:String>
|
||||
<x:String x:Key="Text.Stash.OnlyStagedChanges" xml:space="preserve">스테이징된 변경 사항만</x:String>
|
||||
<x:String x:Key="Text.Stash.TipForSelectedFiles" xml:space="preserve">선택한 파일의 스테이징된 변경 사항과 스테이징되지 않은 변경 사항이 모두 스태시됩니다!!!</x:String>
|
||||
<x:String x:Key="Text.Stash.Title" xml:space="preserve">로컬 변경 사항 스태시</x:String>
|
||||
<x:String x:Key="Text.StashCM.Apply" xml:space="preserve">적용</x:String>
|
||||
<x:String x:Key="Text.StashCM.CopyMessage" xml:space="preserve">메시지 복사</x:String>
|
||||
<x:String x:Key="Text.StashCM.Drop" xml:space="preserve">삭제</x:String>
|
||||
<x:String x:Key="Text.StashCM.SaveAsPatch" xml:space="preserve">패치로 저장...</x:String>
|
||||
<x:String x:Key="Text.StashDropConfirm" xml:space="preserve">스태시 삭제</x:String>
|
||||
<x:String x:Key="Text.StashDropConfirm.Label" xml:space="preserve">삭제:</x:String>
|
||||
<x:String x:Key="Text.Stashes" xml:space="preserve">스태시</x:String>
|
||||
<x:String x:Key="Text.Stashes.Changes" xml:space="preserve">변경 사항</x:String>
|
||||
<x:String x:Key="Text.Stashes.Stashes" xml:space="preserve">스태시</x:String>
|
||||
<x:String x:Key="Text.Statistics" xml:space="preserve">통계</x:String>
|
||||
<x:String x:Key="Text.Statistics.Overview" xml:space="preserve">개요</x:String>
|
||||
<x:String x:Key="Text.Statistics.ThisMonth" xml:space="preserve">이번 달</x:String>
|
||||
<x:String x:Key="Text.Statistics.ThisWeek" xml:space="preserve">이번 주</x:String>
|
||||
<x:String x:Key="Text.Statistics.TotalAuthors" xml:space="preserve">작성자: </x:String>
|
||||
<x:String x:Key="Text.Statistics.TotalCommits" xml:space="preserve">커밋: </x:String>
|
||||
<x:String x:Key="Text.Submodule" xml:space="preserve">서브모듈</x:String>
|
||||
<x:String x:Key="Text.Submodule.Add" xml:space="preserve">서브모듈 추가</x:String>
|
||||
<x:String x:Key="Text.Submodule.Branch" xml:space="preserve">브랜치</x:String>
|
||||
<x:String x:Key="Text.Submodule.CopyBranch" xml:space="preserve">브랜치</x:String>
|
||||
<x:String x:Key="Text.Submodule.CopyPath" xml:space="preserve">상대 경로</x:String>
|
||||
<x:String x:Key="Text.Submodule.Deinit" xml:space="preserve">초기화 해제</x:String>
|
||||
<x:String x:Key="Text.Submodule.FetchNested" xml:space="preserve">중첩된 서브모듈 Fetch</x:String>
|
||||
<x:String x:Key="Text.Submodule.Histories" xml:space="preserve">히스토리</x:String>
|
||||
<x:String x:Key="Text.Submodule.Move" xml:space="preserve">이동</x:String>
|
||||
<x:String x:Key="Text.Submodule.Open" xml:space="preserve">저장소 열기</x:String>
|
||||
<x:String x:Key="Text.Submodule.RelativePath" xml:space="preserve">상대 경로:</x:String>
|
||||
<x:String x:Key="Text.Submodule.RelativePath.Placeholder" xml:space="preserve">이 모듈을 저장할 상대 폴더입니다.</x:String>
|
||||
<x:String x:Key="Text.Submodule.Remove" xml:space="preserve">삭제</x:String>
|
||||
<x:String x:Key="Text.Submodule.SetBranch" xml:space="preserve">브랜치 설정</x:String>
|
||||
<x:String x:Key="Text.Submodule.SetURL" xml:space="preserve">URL 변경</x:String>
|
||||
<x:String x:Key="Text.Submodule.Status" xml:space="preserve">상태</x:String>
|
||||
<x:String x:Key="Text.Submodule.Status.Modified" xml:space="preserve">수정됨</x:String>
|
||||
<x:String x:Key="Text.Submodule.Status.NotInited" xml:space="preserve">초기화 안 됨</x:String>
|
||||
<x:String x:Key="Text.Submodule.Status.RevisionChanged" xml:space="preserve">리비전 변경됨</x:String>
|
||||
<x:String x:Key="Text.Submodule.Update" xml:space="preserve">업데이트</x:String>
|
||||
<x:String x:Key="Text.Submodule.URL" xml:space="preserve">URL</x:String>
|
||||
<x:String x:Key="Text.Sure" xml:space="preserve">확인</x:String>
|
||||
<x:String x:Key="Text.Tag.Tagger" xml:space="preserve">태그 생성자</x:String>
|
||||
<x:String x:Key="Text.Tag.Time" xml:space="preserve">시간</x:String>
|
||||
<x:String x:Key="Text.TagCM.Copy.Message" xml:space="preserve">메시지</x:String>
|
||||
<x:String x:Key="Text.TagCM.Copy.Name" xml:space="preserve">이름</x:String>
|
||||
<x:String x:Key="Text.TagCM.Copy.Tagger" xml:space="preserve">태그 생성자</x:String>
|
||||
<x:String x:Key="Text.TagCM.CopyName" xml:space="preserve">태그 이름 복사</x:String>
|
||||
<x:String x:Key="Text.TagCM.CustomAction" xml:space="preserve">사용자 지정 작업</x:String>
|
||||
<x:String x:Key="Text.TagCM.Delete" xml:space="preserve">${0}$ 삭제...</x:String>
|
||||
<x:String x:Key="Text.TagCM.DeleteMultiple" xml:space="preserve">선택한 {0}개의 태그 삭제...</x:String>
|
||||
<x:String x:Key="Text.TagCM.Merge" xml:space="preserve">${0}$을(를) ${1}$(으)로 병합...</x:String>
|
||||
<x:String x:Key="Text.TagCM.Push" xml:space="preserve">${0}$ 푸시...</x:String>
|
||||
<x:String x:Key="Text.UpdateSubmodules" xml:space="preserve">서브모듈 업데이트</x:String>
|
||||
<x:String x:Key="Text.UpdateSubmodules.All" xml:space="preserve">모든 서브모듈</x:String>
|
||||
<x:String x:Key="Text.UpdateSubmodules.Init" xml:space="preserve">필요시 초기화</x:String>
|
||||
<x:String x:Key="Text.UpdateSubmodules.Recursive" xml:space="preserve">서브모듈 재귀적으로 탐색</x:String>
|
||||
<x:String x:Key="Text.UpdateSubmodules.Target" xml:space="preserve">서브모듈:</x:String>
|
||||
<x:String x:Key="Text.UpdateSubmodules.UpdateToRemoteTrackingBranch" xml:space="preserve">서브모듈의 원격 추적 브랜치로 업데이트</x:String>
|
||||
<x:String x:Key="Text.URL" xml:space="preserve">URL:</x:String>
|
||||
<x:String x:Key="Text.ViewLogs" xml:space="preserve">로그</x:String>
|
||||
<x:String x:Key="Text.ViewLogs.Clear" xml:space="preserve">모두 지우기</x:String>
|
||||
<x:String x:Key="Text.ViewLogs.CopyLog" xml:space="preserve">복사</x:String>
|
||||
<x:String x:Key="Text.ViewLogs.Delete" xml:space="preserve">삭제</x:String>
|
||||
<x:String x:Key="Text.Warn" xml:space="preserve">경고</x:String>
|
||||
<x:String x:Key="Text.Welcome" xml:space="preserve">시작 페이지</x:String>
|
||||
<x:String x:Key="Text.Welcome.AddRootFolder" xml:space="preserve">그룹 생성</x:String>
|
||||
<x:String x:Key="Text.Welcome.AddSubFolder" xml:space="preserve">하위 그룹 생성</x:String>
|
||||
<x:String x:Key="Text.Welcome.Clone" xml:space="preserve">저장소 복제</x:String>
|
||||
<x:String x:Key="Text.Welcome.Delete" xml:space="preserve">삭제</x:String>
|
||||
<x:String x:Key="Text.Welcome.DragDropTip" xml:space="preserve">폴더 끌어다 놓기 지원. 사용자 정의 그룹화 지원.</x:String>
|
||||
<x:String x:Key="Text.Welcome.Edit" xml:space="preserve">편집</x:String>
|
||||
<x:String x:Key="Text.Welcome.Move" xml:space="preserve">다른 그룹으로 이동</x:String>
|
||||
<x:String x:Key="Text.Welcome.OpenAllInNode" xml:space="preserve">모든 저장소 열기</x:String>
|
||||
<x:String x:Key="Text.Welcome.OpenOrInit" xml:space="preserve">저장소 열기</x:String>
|
||||
<x:String x:Key="Text.Welcome.OpenTerminal" xml:space="preserve">터미널 열기</x:String>
|
||||
<x:String x:Key="Text.Welcome.ScanDefaultCloneDir" xml:space="preserve">기본 복제 디렉터리의 저장소 다시 스캔</x:String>
|
||||
<x:String x:Key="Text.Welcome.Search" xml:space="preserve">저장소 검색...</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy" xml:space="preserve">로컬 변경 사항</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore" xml:space="preserve">Git 무시</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.Extension" xml:space="preserve">모든 *{0} 파일 무시</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.ExtensionInSameFolder" xml:space="preserve">같은 폴더의 *{0} 파일 무시</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.InFolder" xml:space="preserve">이 폴더의 추적하지 않는 파일 무시</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.AddToGitIgnore.SingleFile" xml:space="preserve">이 파일만 무시</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Amend" xml:space="preserve">수정</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.CanStageTip" xml:space="preserve">이제 이 파일을 스테이징할 수 있습니다.</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.ClearCommitHistories" xml:space="preserve">히스토리 지우기</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.ClearCommitHistories.Confirm" xml:space="preserve">모든 커밋 메시지 히스토리를 지우시겠습니까? 이 작업은 되돌릴 수 없습니다.</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Commit" xml:space="preserve">커밋</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.CommitAndPush" xml:space="preserve">커밋 & 푸시</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.CommitMessageHelper" xml:space="preserve">템플릿/히스토리</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.CommitTip" xml:space="preserve">클릭 이벤트 트리거</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.CommitToEdit" xml:space="preserve">커밋 (수정)</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.CommitWithAutoStage" xml:space="preserve">모든 변경 사항 스테이징 후 커밋</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.ConfirmCommitWithDetachedHead">분리된(detached) HEAD에 커밋을 생성하고 있습니다. 계속하시겠습니까?</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.ConfirmCommitWithFilter">{0}개의 파일을 스테이징했지만 {1}개의 파일만 표시됩니다 ({2}개의 파일은 필터링됨). 계속하시겠습니까?</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Conflicts" xml:space="preserve">충돌 감지됨</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Conflicts.OpenExternalMergeTool" xml:space="preserve">외부 병합 도구 열기</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Conflicts.OpenExternalMergeToolAllConflicts" xml:space="preserve">모든 충돌을 외부 병합 도구에서 열기</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Conflicts.Resolved" xml:space="preserve">파일 충돌 해결됨</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Conflicts.UseMine" xml:space="preserve">내 것 사용</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Conflicts.UseTheirs" xml:space="preserve">상대방 것 사용</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.IncludeUntracked" xml:space="preserve">추적하지 않는 파일 포함</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.NoCommitHistories" xml:space="preserve">최근 입력한 메시지 없음</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.NoCommitTemplates" xml:space="preserve">커밋 템플릿 없음</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.NoVerify" xml:space="preserve">검증 안 함</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.ResetAuthor" xml:space="preserve">작성자 리셋</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.SignOff" xml:space="preserve">서명(SignOff)</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Staged" xml:space="preserve">스테이징됨</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Staged.Unstage" xml:space="preserve">언스테이지</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Staged.UnstageAll" xml:space="preserve">모두 언스테이지</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Unstaged" xml:space="preserve">스테이징 안 됨</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Unstaged.Stage" xml:space="preserve">스테이지</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Unstaged.StageAll" xml:space="preserve">모두 스테이지</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Unstaged.ViewAssumeUnchanged" xml:space="preserve">변경되지 않음으로 간주된 파일 보기</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.UseCommitTemplate" xml:space="preserve">템플릿: ${0}$</x:String>
|
||||
<x:String x:Key="Text.Workspace" xml:space="preserve">작업 공간: </x:String>
|
||||
<x:String x:Key="Text.Workspace.Configure" xml:space="preserve">작업 공간 설정...</x:String>
|
||||
<x:String x:Key="Text.Worktree" xml:space="preserve">워크트리</x:String>
|
||||
<x:String x:Key="Text.Worktree.CopyPath" xml:space="preserve">경로 복사</x:String>
|
||||
<x:String x:Key="Text.Worktree.Lock" xml:space="preserve">잠금</x:String>
|
||||
<x:String x:Key="Text.Worktree.Open" xml:space="preserve">열기</x:String>
|
||||
<x:String x:Key="Text.Worktree.Remove" xml:space="preserve">제거</x:String>
|
||||
<x:String x:Key="Text.Worktree.Unlock" xml:space="preserve">잠금 해제</x:String>
|
||||
</ResourceDictionary>
|
||||
@@ -35,7 +35,7 @@
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">Atualizar</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">ARQUIVO BINÁRIO NÃO SUPORTADO!!!</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">Blame</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">BLAME NESTE ARQUIVO NÃO É SUPORTADO!!!</x:String>
|
||||
<x:String x:Key="Text.Blame.TypeNotSupported" xml:space="preserve">BLAME NESTE ARQUIVO NÃO É SUPORTADO!!!</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Checkout" xml:space="preserve">Checkout ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithCurrent" xml:space="preserve">Comparar com ${0}$</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithWorktree" xml:space="preserve">Comparar com Worktree</x:String>
|
||||
@@ -399,10 +399,8 @@
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Default" xml:space="preserve">Padrão</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Editor" xml:space="preserve">Editor</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.MonospaceFont" xml:space="preserve">Fonte Monoespaçada</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.OnlyUseMonoFontInEditor" xml:space="preserve">Usar fonte monoespaçada apenas no editor de texto</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.Theme" xml:space="preserve">Tema</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.ThemeOverrides" xml:space="preserve">Substituições de Tema</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseFixedTabWidth" xml:space="preserve">Usar largura fixa de aba na barra de título</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseNativeWindowFrame" xml:space="preserve">Usar moldura de janela nativa</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge" xml:space="preserve">FERRAMENTA DE DIFF/MERGE</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge.Path" xml:space="preserve">Caminho de Instalação</x:String>
|
||||
|
||||
@@ -56,11 +56,14 @@
|
||||
<x:String x:Key="Text.Bisect.Skip">Пропустить</x:String>
|
||||
<x:String x:Key="Text.Bisect.WaitingForRange">Раздвоение. Сделать текущую ревизию хорошей или плохой и переключиться на другой.</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">Расследование</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">РАССЛЕДОВАНИЕ В ЭТОМ ФАЙЛЕ НЕ ПОДДЕРЖИВАЕТСЯ!!!</x:String>
|
||||
<x:String x:Key="Text.Blame.BlameOnPreviousRevision" xml:space="preserve">Расследование на предыдущей редакции</x:String>
|
||||
<x:String x:Key="Text.Blame.TypeNotSupported" xml:space="preserve">РАССЛЕДОВАНИЕ В ЭТОМ ФАЙЛЕ НЕ ПОДДЕРЖИВАЕТСЯ!!!</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Checkout" xml:space="preserve">Переключиться на ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithCurrent" xml:space="preserve">Сравнить с ${0}$</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithWorktree" xml:space="preserve">Сравнить с рабочим каталогом</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CopyName" xml:space="preserve">Копировать имя ветки</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CreatePR" xml:space="preserve">Создать PR...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CreatePRForUpstream" xml:space="preserve">Создать PR для основной ветки ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CustomAction" xml:space="preserve">Изменить действие</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Delete" xml:space="preserve">Удалить ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.DeleteMultiBranches" xml:space="preserve">Удалить выбранные {0} ветки</x:String>
|
||||
@@ -186,12 +189,19 @@
|
||||
<x:String x:Key="Text.CommitMessageTextBox.SubjectPlaceholder" xml:space="preserve">Введите тему ревизии</x:String>
|
||||
<x:String x:Key="Text.Configure" xml:space="preserve">Настройка репозитория</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate" xml:space="preserve">ШАБЛОН РЕВИЗИИ</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.BuiltinVars" xml:space="preserve">Вы можете использовать ${files_num}, ${branch_name}, ${files} и ${files:N}, где N — максимальное количество путей к файлам для вывода.</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.BuiltinVars" xml:space="preserve">Встроенные параметры:
|
||||
|
||||
${branch_name} Имя текущей локальной ветки
|
||||
${files_num} Количество изменённых файлов
|
||||
${files} Пути изменённых файлов
|
||||
${files:N} Пути изменённых файлов, не более N
|
||||
${pure_files} То же, что и ${files}, но только имена файлов
|
||||
${pure_files:N} То же, что и ${files:N}, но только имена файлов</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Content" xml:space="preserve">Cодержание:</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Name" xml:space="preserve">Название:</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction" xml:space="preserve">ПОЛЬЗОВАТЕЛЬСКОЕ ДЕЙСТВИЕ</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.Arguments" xml:space="preserve">Аргументы:</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.Arguments.Tip" xml:space="preserve">Built-in parameters:
|
||||
<x:String x:Key="Text.Configure.CustomAction.Arguments.Tip" xml:space="preserve">Встроенные параметры:
|
||||
|
||||
${REPO} Путь репозитория
|
||||
${REMOTE} Выбранная удаённая ветка
|
||||
@@ -216,6 +226,7 @@
|
||||
<x:String x:Key="Text.Configure.Git" xml:space="preserve">GIT</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.AutoFetch" xml:space="preserve">Автозагрузка изменений</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.AutoFetchIntervalSuffix" xml:space="preserve">Минут(а/ы)</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.ConventionalTypesOverride" xml:space="preserve">Общепринятые типы ревизии</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.DefaultRemote" xml:space="preserve">Внешний репозиторий по умолчанию</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.PreferredMergeMode" xml:space="preserve">Предпочтительный режим слияния</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker" xml:space="preserve">ОТСЛЕЖИВАНИЕ ПРОБЛЕМ</x:String>
|
||||
@@ -249,6 +260,7 @@
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Label" xml:space="preserve">Метка:</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Options" xml:space="preserve">Опции:</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Options.Tip" xml:space="preserve">Используйте разделитель «|» для опций</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.StringValue.Tip" xml:space="preserve">Встроенные переменные ${REPO}, ${REMOTE}, ${BRANCH}, ${BRANCH_FRIENDLY_NAME}, ${SHA}, и ${TAG} останутся здесь доступными</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Type" xml:space="preserve">Тип:</x:String>
|
||||
<x:String x:Key="Text.ConfigureWorkspace" xml:space="preserve">Рабочие пространства</x:String>
|
||||
<x:String x:Key="Text.ConfigureWorkspace.Color" xml:space="preserve">Цвет</x:String>
|
||||
@@ -257,7 +269,7 @@
|
||||
<x:String x:Key="Text.ConfirmEmptyCommit.Continue" xml:space="preserve">ПРОДОЛЖИТЬ</x:String>
|
||||
<x:String x:Key="Text.ConfirmEmptyCommit.NoLocalChanges" xml:space="preserve">Обнаружена пустая ревизия! Вы хотите продолжить (--allow-empty)?</x:String>
|
||||
<x:String x:Key="Text.ConfirmEmptyCommit.StageAllThenCommit" xml:space="preserve">Сформировать всё и зафиксировать ревизию</x:String>
|
||||
<x:String x:Key="Text.ConfirmEmptyCommit.WithLocalChanges" xml:space="preserve">Обнаружена пустая ревизия! Вы хотите продолжить (--allow-empty) или отложить всё, затем зафиксировать ревизию?</x:String>
|
||||
<x:String x:Key="Text.ConfirmEmptyCommit.WithLocalChanges" xml:space="preserve">Обнаружена пустая ревизия! Вы хотите продолжить (--allow-empty) или отложить всё, а затем зафиксировать ревизию?</x:String>
|
||||
<x:String x:Key="Text.ConfirmRestart.Title" xml:space="preserve">Требуется перезапуск</x:String>
|
||||
<x:String x:Key="Text.ConfirmRestart.Message" xml:space="preserve">Вы должны перезапустить приложение после применения изменений.</x:String>
|
||||
<x:String x:Key="Text.ConventionalCommit" xml:space="preserve">Общепринятый помощник по ревизии</x:String>
|
||||
@@ -462,7 +474,6 @@
|
||||
<x:String x:Key="Text.Hotkeys.Global.GotoPrevTab" xml:space="preserve">Перейти на предыдущую вкладку</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.NewTab" xml:space="preserve">Создать новую вкладку</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.OpenPreferences" xml:space="preserve">Открыть диалоговое окно настроек</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchWorkspace" xml:space="preserve">Переключиться на рабочее место</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchTab" xml:space="preserve">Переключиться на вкладку</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">РЕПОЗИТОРИЙ</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">Зафиксировать сформированные изменения</x:String>
|
||||
@@ -505,6 +516,7 @@
|
||||
<x:String x:Key="Text.IssueLinkCM.OpenInBrowser" xml:space="preserve">Открыть в браузере</x:String>
|
||||
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">ОШИБКА</x:String>
|
||||
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">УВЕДОМЛЕНИЕ</x:String>
|
||||
<x:String x:Key="Text.Launcher.OpenRepository" xml:space="preserve">Открыть репозитории</x:String>
|
||||
<x:String x:Key="Text.Launcher.Pages" xml:space="preserve">Вкладки</x:String>
|
||||
<x:String x:Key="Text.Launcher.Workspaces" xml:space="preserve">Рабочие места</x:String>
|
||||
<x:String x:Key="Text.Merge" xml:space="preserve">Влить ветку</x:String>
|
||||
@@ -562,11 +574,9 @@
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Default" xml:space="preserve">По умолчанию</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Editor" xml:space="preserve">Редактор</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.MonospaceFont" xml:space="preserve">Моноширный шрифт</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.OnlyUseMonoFontInEditor" xml:space="preserve">В текстовом редакторе используется только моноширный шрифт</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.Theme" xml:space="preserve">Тема</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.ThemeOverrides" xml:space="preserve">Переопределение темы</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseAutoHideScrollBars" xml:space="preserve">Автоматически скрывать прокрутку</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseFixedTabWidth" xml:space="preserve">Использовать фиксированную ширину табуляции в строке заголовка.</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseNativeWindowFrame" xml:space="preserve">Использовать системное окно</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge" xml:space="preserve">ИНСТРУМЕНТ СРАВНЕНИЙ/СЛИЯНИЯ</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge.Path" xml:space="preserve">Путь установки</x:String>
|
||||
@@ -641,6 +651,8 @@
|
||||
<x:String x:Key="Text.PushTag.PushAllRemotes" xml:space="preserve">Выложить на все внешние репозитории</x:String>
|
||||
<x:String x:Key="Text.PushTag.Remote" xml:space="preserve">Внешний репозиторий:</x:String>
|
||||
<x:String x:Key="Text.PushTag.Tag" xml:space="preserve">Метка:</x:String>
|
||||
<x:String x:Key="Text.PushToNewBranch" xml:space="preserve">Отправить к НОВОЙ ветке</x:String>
|
||||
<x:String x:Key="Text.PushToNewBranch.Title" xml:space="preserve">Введитте имя для новой удалённой ветки:</x:String>
|
||||
<x:String x:Key="Text.Quit" xml:space="preserve">Выйти</x:String>
|
||||
<x:String x:Key="Text.Rebase" xml:space="preserve">Перемещение текущей ветки</x:String>
|
||||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">Отложить и применить повторно локальные изменения</x:String>
|
||||
@@ -759,7 +771,7 @@
|
||||
<x:String x:Key="Text.SelfUpdate.GotoDownload" xml:space="preserve">Загрузка</x:String>
|
||||
<x:String x:Key="Text.SelfUpdate.IgnoreThisVersion" xml:space="preserve">Пропустить эту версию</x:String>
|
||||
<x:String x:Key="Text.SelfUpdate.Title" xml:space="preserve">Обновление ПО</x:String>
|
||||
<x:String x:Key="Text.SelfUpdate.UpToDate" xml:space="preserve">В настоящее время обновления недоступны.</x:String>
|
||||
<x:String x:Key="Text.SelfUpdate.UpToDate" xml:space="preserve">Сейчас нет обновлений.</x:String>
|
||||
<x:String x:Key="Text.SetSubmoduleBranch" xml:space="preserve">Установить ветку подмодуля</x:String>
|
||||
<x:String x:Key="Text.SetSubmoduleBranch.Submodule" xml:space="preserve">Подмодуль:</x:String>
|
||||
<x:String x:Key="Text.SetSubmoduleBranch.Current" xml:space="preserve">Текущий:</x:String>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">புதுப்பி</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">இருமம் கோப்பு ஆதரிக்கப்படவில்லை!!!</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">குற்றச்சாட்டு</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">இந்த கோப்பில் குற்றம் சாட்ட ஆதரிக்கப்படவில்லை!!!</x:String>
|
||||
<x:String x:Key="Text.Blame.TypeNotSupported" xml:space="preserve">இந்த கோப்பில் குற்றம் சாட்ட ஆதரிக்கப்படவில்லை!!!</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Checkout" xml:space="preserve">${0}$ சரிபார்...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithWorktree" xml:space="preserve">பணிமரத்துடன் ஒப்பிடுக</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CopyName" xml:space="preserve">கிளை பெயரை நகலெடு</x:String>
|
||||
@@ -435,10 +435,8 @@
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Default" xml:space="preserve">இயல்புநிலை</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Editor" xml:space="preserve">திருத்தி</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.MonospaceFont" xml:space="preserve">ஒற்றைவெளி எழுத்துரு</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.OnlyUseMonoFontInEditor" xml:space="preserve">ஒற்றைவெளி எழுத்துருவை உரை திருத்தியில் மட்டும் பயன்படுத்து</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.Theme" xml:space="preserve">கருப்பொருள்</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.ThemeOverrides" xml:space="preserve">கருப்பொருள் மேலெழுதப்படுகிறது</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseFixedTabWidth" xml:space="preserve">தலைப்புப்பட்டியில் நிலையான தாவல் அகலத்தைப் பயன்படுத்து</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseNativeWindowFrame" xml:space="preserve">சொந்த சாளர சட்டத்தைப் பயன்படுத்து</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge" xml:space="preserve">வேறு/ஒன்றிணை கருவி</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge.Path" xml:space="preserve">நிறுவல் பாதை</x:String>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">Оновити</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">БІНАРНИЙ ФАЙЛ НЕ ПІДТРИМУЄТЬСЯ!!!</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">Автор рядка</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">ПОШУК АВТОРА РЯДКА ДЛЯ ЦЬОГО ФАЙЛУ НЕ ПІДТРИМУЄТЬСЯ!!!</x:String>
|
||||
<x:String x:Key="Text.Blame.TypeNotSupported" xml:space="preserve">ПОШУК АВТОРА РЯДКА ДЛЯ ЦЬОГО ФАЙЛУ НЕ ПІДТРИМУЄТЬСЯ!!!</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Checkout" xml:space="preserve">Перейти на ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithCurrent" xml:space="preserve">Порівняти з ${0}$</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithWorktree" xml:space="preserve">Порівняти з робочим деревом</x:String>
|
||||
@@ -440,10 +440,8 @@
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Default" xml:space="preserve">За замовчуванням</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Editor" xml:space="preserve">Редактор</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.MonospaceFont" xml:space="preserve">Моноширинний шрифт</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.OnlyUseMonoFontInEditor" xml:space="preserve">Використовувати моноширинний шрифт лише в текстовому редакторі</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.Theme" xml:space="preserve">Тема</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.ThemeOverrides" xml:space="preserve">Перевизначення теми</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseFixedTabWidth" xml:space="preserve">Використовувати фіксовану ширину вкладки в заголовку</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseNativeWindowFrame" xml:space="preserve">Використовувати системну рамку вікна</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge" xml:space="preserve">ІНСТРУМЕНТ DIFF/MERGE</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge.Path" xml:space="preserve">Шлях встановлення</x:String>
|
||||
|
||||
@@ -56,11 +56,14 @@
|
||||
<x:String x:Key="Text.Bisect.Skip">无法判定</x:String>
|
||||
<x:String x:Key="Text.Bisect.WaitingForRange">二分定位进行中。请标记当前的提交是 '正确' 还是 '错误',然后检出另一个提交。</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">逐行追溯(blame)</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">选中文件不支持该操作!!!</x:String>
|
||||
<x:String x:Key="Text.Blame.BlameOnPreviousRevision" xml:space="preserve">对当前版本的前一版本执行逐行追溯操作</x:String>
|
||||
<x:String x:Key="Text.Blame.TypeNotSupported" xml:space="preserve">选中文件不支持该操作!!!</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Checkout" xml:space="preserve">检出(checkout) ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithCurrent" xml:space="preserve">与当前 ${0}$ 比较</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithWorktree" xml:space="preserve">与本地工作树比较</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CopyName" xml:space="preserve">复制分支名</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CreatePR" xml:space="preserve">创建合并请求 ...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CreatePRForUpstream" xml:space="preserve">为上游分支 ${0}$ 创建合并请求 ...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CustomAction" xml:space="preserve">自定义操作</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Delete" xml:space="preserve">删除 ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.DeleteMultiBranches" xml:space="preserve">删除选中的 {0} 个分支</x:String>
|
||||
@@ -186,7 +189,14 @@
|
||||
<x:String x:Key="Text.CommitMessageTextBox.SubjectPlaceholder" xml:space="preserve">填写提交信息主题</x:String>
|
||||
<x:String x:Key="Text.Configure" xml:space="preserve">仓库配置</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate" xml:space="preserve">提交信息模板</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.BuiltinVars" xml:space="preserve">您可使用 ${files_num}, ${branch_name}, ${files} 或 ${files:N}(N表示最大显示的文件数)</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.BuiltinVars" xml:space="preserve">内置变量:
|
||||
|
||||
${branch_name} 当前分支名
|
||||
${files_num} 变更文件数量
|
||||
${files} 变更文件路径列表
|
||||
${files:N} 变更文件路径列表(仅输出指定 N 条)
|
||||
${pure_files} 与 ${files} 类似,但仅输出文件名
|
||||
${pure_files:N} 与 ${files:N} 类似,但仅输出文件名</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Content" xml:space="preserve">模板内容 :</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Name" xml:space="preserve">模板名 :</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction" xml:space="preserve">自定义操作</x:String>
|
||||
@@ -216,6 +226,7 @@
|
||||
<x:String x:Key="Text.Configure.Git" xml:space="preserve">GIT配置</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.AutoFetch" xml:space="preserve">启用定时自动拉取远程更新</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.AutoFetchIntervalSuffix" xml:space="preserve">分钟</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.ConventionalTypesOverride" xml:space="preserve">自定义规范化提交类型</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.DefaultRemote" xml:space="preserve">默认远程</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.PreferredMergeMode" xml:space="preserve">默认合并方式</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker" xml:space="preserve">ISSUE追踪</x:String>
|
||||
@@ -249,6 +260,7 @@
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Label" xml:space="preserve">名称 :</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Options" xml:space="preserve">选项列表 :</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Options.Tip" xml:space="preserve">选项之间请使用英文 '|' 作为分隔符</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.StringValue.Tip" xml:space="preserve">内置变量 ${REPO}, ${REMOTE}, ${BRANCH}, ${BRANCH_FRIENDLY_NAME}, ${SHA} 与 ${TAG} 在这里仍然可用</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Type" xml:space="preserve">类型 :</x:String>
|
||||
<x:String x:Key="Text.ConfigureWorkspace" xml:space="preserve">工作区</x:String>
|
||||
<x:String x:Key="Text.ConfigureWorkspace.Color" xml:space="preserve">颜色</x:String>
|
||||
@@ -462,7 +474,6 @@
|
||||
<x:String x:Key="Text.Hotkeys.Global.GotoPrevTab" xml:space="preserve">切换到上一个页面</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.NewTab" xml:space="preserve">新建页面</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.OpenPreferences" xml:space="preserve">打开偏好设置面板</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchWorkspace" xml:space="preserve">切换工作区</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchTab" xml:space="preserve">切换显示页面</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">仓库页面快捷键</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">提交暂存区更改</x:String>
|
||||
@@ -505,6 +516,7 @@
|
||||
<x:String x:Key="Text.IssueLinkCM.OpenInBrowser" xml:space="preserve">在浏览器中访问</x:String>
|
||||
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">出错了</x:String>
|
||||
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">系统提示</x:String>
|
||||
<x:String x:Key="Text.Launcher.OpenRepository" xml:space="preserve">打开其他仓库</x:String>
|
||||
<x:String x:Key="Text.Launcher.Pages" xml:space="preserve">页面列表</x:String>
|
||||
<x:String x:Key="Text.Launcher.Workspaces" xml:space="preserve">工作区列表</x:String>
|
||||
<x:String x:Key="Text.Merge" xml:space="preserve">合并分支</x:String>
|
||||
@@ -562,11 +574,9 @@
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Default" xml:space="preserve">默认</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Editor" xml:space="preserve">代码编辑器</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.MonospaceFont" xml:space="preserve">等宽字体</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.OnlyUseMonoFontInEditor" xml:space="preserve">仅在文本编辑器中使用等宽字体</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.Theme" xml:space="preserve">主题</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.ThemeOverrides" xml:space="preserve">主题自定义</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseAutoHideScrollBars" xml:space="preserve">允许滚动条自动隐藏</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseFixedTabWidth" xml:space="preserve">主标签使用固定宽度</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseNativeWindowFrame" xml:space="preserve">使用系统默认窗体样式</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge" xml:space="preserve">对比/合并工具</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge.Path" xml:space="preserve">安装路径</x:String>
|
||||
@@ -641,6 +651,8 @@
|
||||
<x:String x:Key="Text.PushTag.PushAllRemotes" xml:space="preserve">推送到所有远程仓库</x:String>
|
||||
<x:String x:Key="Text.PushTag.Remote" xml:space="preserve">远程仓库 :</x:String>
|
||||
<x:String x:Key="Text.PushTag.Tag" xml:space="preserve">标签 :</x:String>
|
||||
<x:String x:Key="Text.PushToNewBranch" xml:space="preserve">推送到新的分支</x:String>
|
||||
<x:String x:Key="Text.PushToNewBranch.Title" xml:space="preserve">输入新的远端分支名</x:String>
|
||||
<x:String x:Key="Text.Quit" xml:space="preserve">退出</x:String>
|
||||
<x:String x:Key="Text.Rebase" xml:space="preserve">变基(rebase)操作</x:String>
|
||||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">自动贮藏并恢复本地变更</x:String>
|
||||
|
||||
@@ -56,11 +56,14 @@
|
||||
<x:String x:Key="Text.Bisect.Skip">無法確認</x:String>
|
||||
<x:String x:Key="Text.Bisect.WaitingForRange">二分搜尋進行中。請標記目前的提交為「良好」或「錯誤」,然後簽出另一個提交。</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">逐行溯源 (blame)</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">所選擇的檔案不支援該操作!</x:String>
|
||||
<x:String x:Key="Text.Blame.BlameOnPreviousRevision" xml:space="preserve">對上一個版本執行逐行溯源</x:String>
|
||||
<x:String x:Key="Text.Blame.TypeNotSupported" xml:space="preserve">所選擇的檔案不支援該操作!</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Checkout" xml:space="preserve">簽出 (checkout) ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithCurrent" xml:space="preserve">與目前 ${0}$ 比較</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CompareWithWorktree" xml:space="preserve">與本機工作區比較</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CopyName" xml:space="preserve">複製分支名稱</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CreatePR" xml:space="preserve">建立拉取請求...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CreatePRForUpstream" xml:space="preserve">為上游分支 ${0}$ 建立拉取請求...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.CustomAction" xml:space="preserve">自訂動作</x:String>
|
||||
<x:String x:Key="Text.BranchCM.Delete" xml:space="preserve">刪除 ${0}$...</x:String>
|
||||
<x:String x:Key="Text.BranchCM.DeleteMultiBranches" xml:space="preserve">刪除所選的 {0} 個分支</x:String>
|
||||
@@ -79,7 +82,7 @@
|
||||
<x:String x:Key="Text.BranchCM.Tracking" xml:space="preserve">切換上游分支...</x:String>
|
||||
<x:String x:Key="Text.BranchCompare" xml:space="preserve">分支比較</x:String>
|
||||
<x:String x:Key="Text.BranchTree.Ahead" xml:space="preserve">領先 {0} 次提交</x:String>
|
||||
<x:String x:Key="Text.BranchTree.AheadBehind" xml:space="preserve">領先 {0} 次提交, 落後 {0} 次提交</x:String>
|
||||
<x:String x:Key="Text.BranchTree.AheadBehind" xml:space="preserve">領先 {0} 次提交,落後 {0} 次提交</x:String>
|
||||
<x:String x:Key="Text.BranchTree.Behind" xml:space="preserve">落後 {0} 次提交</x:String>
|
||||
<x:String x:Key="Text.BranchTree.InvalidUpstream" xml:space="preserve">無效</x:String>
|
||||
<x:String x:Key="Text.BranchTree.Remote" xml:space="preserve">遠端</x:String>
|
||||
@@ -181,18 +184,25 @@
|
||||
<x:String x:Key="Text.CommitDetail.Info.Signer" xml:space="preserve">簽署人:</x:String>
|
||||
<x:String x:Key="Text.CommitDetail.Info.WebLinks" xml:space="preserve">在瀏覽器中檢視</x:String>
|
||||
<x:String x:Key="Text.CommitMessageTextBox.MessagePlaceholder" xml:space="preserve">詳細描述</x:String>
|
||||
<x:String x:Key="Text.CommitMessageTextBox.PasteAndReplaceAll" xml:space="preserve">粘貼(替換所有內容)</x:String>
|
||||
<x:String x:Key="Text.CommitMessageTextBox.PasteAndReplaceAll" xml:space="preserve">貼上 (全部取代)</x:String>
|
||||
<x:String x:Key="Text.CommitMessageTextBox.SubjectCount" xml:space="preserve">標題</x:String>
|
||||
<x:String x:Key="Text.CommitMessageTextBox.SubjectPlaceholder" xml:space="preserve">填寫提交訊息標題</x:String>
|
||||
<x:String x:Key="Text.Configure" xml:space="preserve">存放庫設定</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate" xml:space="preserve">提交訊息範本</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.BuiltinVars" xml:space="preserve">您可以使用 ${files_num}、${branch_name}、${files} 或 ${files:N},其中 N 是要輸出的檔案路徑的最大數目。</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.BuiltinVars" xml:space="preserve">內建參數:
|
||||
|
||||
${branch_name} 目前分支名稱
|
||||
${files_num} 已變更檔案數
|
||||
${files} 已變更檔案路徑清單
|
||||
${files:N} 已變更檔案路徑清單 (僅列出前 N 個)
|
||||
${pure_files} 類似 ${files},不含資料夾的純檔案名稱
|
||||
${pure_files:N} 類似 ${files:N},不含資料夾的純檔案名稱</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Content" xml:space="preserve">範本內容:</x:String>
|
||||
<x:String x:Key="Text.Configure.CommitMessageTemplate.Name" xml:space="preserve">範本名稱:</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction" xml:space="preserve">自訂動作</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.Arguments" xml:space="preserve">指令參數:</x:String>
|
||||
<x:String x:Key="Text.Configure.CustomAction.Arguments.Tip" xml:space="preserve">內建參數:
|
||||
|
||||
<x:String x:Key="Text.Configure.CustomAction.Arguments.Tip" xml:space="preserve">內建參數:
|
||||
|
||||
${REPO} 存放庫路徑
|
||||
${REMOTE} 所選的遠端存放庫或所選分支的遠端
|
||||
${BRANCH} 所選的分支。對於遠端分支,不包含遠端名稱
|
||||
@@ -216,6 +226,7 @@
|
||||
<x:String x:Key="Text.Configure.Git" xml:space="preserve">Git 設定</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.AutoFetch" xml:space="preserve">啟用定時自動提取 (fetch) 遠端更新</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.AutoFetchIntervalSuffix" xml:space="preserve">分鐘</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.ConventionalTypesOverride" xml:space="preserve">自訂約定式提交類型</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.DefaultRemote" xml:space="preserve">預設遠端存放庫</x:String>
|
||||
<x:String x:Key="Text.Configure.Git.PreferredMergeMode" xml:space="preserve">預設合併模式</x:String>
|
||||
<x:String x:Key="Text.Configure.IssueTracker" xml:space="preserve">Issue 追蹤</x:String>
|
||||
@@ -249,6 +260,7 @@
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Label" xml:space="preserve">名稱:</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Options" xml:space="preserve">選項列表:</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Options.Tip" xml:space="preserve">請使用英文「|」符號分隔選項</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.StringValue.Tip" xml:space="preserve">內建變數 ${REPO}、${REMOTE}、${BRANCH}、${BRANCH_FRIENDLY_NAME}、${SHA} 及 ${TAG} 在此處仍可使用</x:String>
|
||||
<x:String x:Key="Text.ConfigureCustomActionControls.Type" xml:space="preserve">類型:</x:String>
|
||||
<x:String x:Key="Text.ConfigureWorkspace" xml:space="preserve">工作區</x:String>
|
||||
<x:String x:Key="Text.ConfigureWorkspace.Color" xml:space="preserve">顏色</x:String>
|
||||
@@ -325,7 +337,7 @@
|
||||
<x:String x:Key="Text.Diff.First" xml:space="preserve">第一個差異</x:String>
|
||||
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">忽略空白符號變化</x:String>
|
||||
<x:String x:Key="Text.Diff.Image.Blend" xml:space="preserve">混合對比</x:String>
|
||||
<x:String x:Key="Text.Diff.Image.Difference" xml:space="preserve">差異比較</x:String>
|
||||
<x:String x:Key="Text.Diff.Image.Difference" xml:space="preserve">差異對比</x:String>
|
||||
<x:String x:Key="Text.Diff.Image.SideBySide" xml:space="preserve">並排對比</x:String>
|
||||
<x:String x:Key="Text.Diff.Image.Swipe" xml:space="preserve">滑桿對比</x:String>
|
||||
<x:String x:Key="Text.Diff.Last" xml:space="preserve">最後一個差異</x:String>
|
||||
@@ -350,8 +362,8 @@
|
||||
<x:String x:Key="Text.Diff.VisualLines.Incr" xml:space="preserve">增加可見的行數</x:String>
|
||||
<x:String x:Key="Text.Diff.Welcome" xml:space="preserve">請選擇需要對比的檔案</x:String>
|
||||
<x:String x:Key="Text.DirHistories" xml:space="preserve">目錄内容變更歷史</x:String>
|
||||
<x:String x:Key="Text.DirtyState.HasLocalChanges" xml:space="preserve">未提交的本地變更</x:String>
|
||||
<x:String x:Key="Text.DirtyState.HasPendingPullOrPush" xml:space="preserve">當前分支的 HEAD 與上游不匹配</x:String>
|
||||
<x:String x:Key="Text.DirtyState.HasLocalChanges" xml:space="preserve">未提交的本機變更</x:String>
|
||||
<x:String x:Key="Text.DirtyState.HasPendingPullOrPush" xml:space="preserve">目前分支 HEAD 與上游不相符</x:String>
|
||||
<x:String x:Key="Text.DirtyState.UpToDate" xml:space="preserve">已更新至最新</x:String>
|
||||
<x:String x:Key="Text.Discard" xml:space="preserve">捨棄變更</x:String>
|
||||
<x:String x:Key="Text.Discard.All" xml:space="preserve">所有本機未提交的變更。</x:String>
|
||||
@@ -361,8 +373,8 @@
|
||||
<x:String x:Key="Text.Discard.Total" xml:space="preserve">將捨棄總計 {0} 項已選取的變更</x:String>
|
||||
<x:String x:Key="Text.Discard.Warning" xml:space="preserve">您無法復原此操作,請確認後再繼續!</x:String>
|
||||
<x:String x:Key="Text.DropHead" xml:space="preserve">捨棄提交</x:String>
|
||||
<x:String x:Key="Text.DropHead.Commit" xml:space="preserve">提交 :</x:String>
|
||||
<x:String x:Key="Text.DropHead.NewHead" xml:space="preserve">捨棄後新的 HEAD :</x:String>
|
||||
<x:String x:Key="Text.DropHead.Commit" xml:space="preserve">提交:</x:String>
|
||||
<x:String x:Key="Text.DropHead.NewHead" xml:space="preserve">捨棄後新的 HEAD:</x:String>
|
||||
<x:String x:Key="Text.EditRepositoryNode.Bookmark" xml:space="preserve">書籤:</x:String>
|
||||
<x:String x:Key="Text.EditRepositoryNode.Name" xml:space="preserve">名稱:</x:String>
|
||||
<x:String x:Key="Text.EditRepositoryNode.Target" xml:space="preserve">目標:</x:String>
|
||||
@@ -462,7 +474,6 @@
|
||||
<x:String x:Key="Text.Hotkeys.Global.GotoPrevTab" xml:space="preserve">切換到上一個頁面</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.NewTab" xml:space="preserve">新增頁面</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.OpenPreferences" xml:space="preserve">開啟偏好設定面板</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchWorkspace" xml:space="preserve">切換工作區</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Global.SwitchTab" xml:space="preserve">切換目前頁面</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo" xml:space="preserve">存放庫頁面快速鍵</x:String>
|
||||
<x:String x:Key="Text.Hotkeys.Repo.Commit" xml:space="preserve">提交暫存區變更</x:String>
|
||||
@@ -505,6 +516,7 @@
|
||||
<x:String x:Key="Text.IssueLinkCM.OpenInBrowser" xml:space="preserve">在瀏覽器中開啟連結</x:String>
|
||||
<x:String x:Key="Text.Launcher.Error" xml:space="preserve">發生錯誤</x:String>
|
||||
<x:String x:Key="Text.Launcher.Info" xml:space="preserve">系統提示</x:String>
|
||||
<x:String x:Key="Text.Launcher.OpenRepository" xml:space="preserve">開啟存放庫</x:String>
|
||||
<x:String x:Key="Text.Launcher.Pages" xml:space="preserve">頁面列表</x:String>
|
||||
<x:String x:Key="Text.Launcher.Workspaces" xml:space="preserve">工作區列表</x:String>
|
||||
<x:String x:Key="Text.Merge" xml:space="preserve">合併分支</x:String>
|
||||
@@ -552,7 +564,7 @@
|
||||
<x:String x:Key="Text.Preferences.AI.GenerateSubjectPrompt" xml:space="preserve">產生提交訊息提示詞</x:String>
|
||||
<x:String x:Key="Text.Preferences.AI.Model" xml:space="preserve">模型</x:String>
|
||||
<x:String x:Key="Text.Preferences.AI.Name" xml:space="preserve">名稱</x:String>
|
||||
<x:String x:Key="Text.Preferences.AI.ReadApiKeyFromEnv" xml:space="preserve">從環境變數中(輸入為環境變數名稱)載入金鑰</x:String>
|
||||
<x:String x:Key="Text.Preferences.AI.ReadApiKeyFromEnv" xml:space="preserve">從環境變數中 (輸入環境變數名稱) 讀取 API 金鑰</x:String>
|
||||
<x:String x:Key="Text.Preferences.AI.Server" xml:space="preserve">伺服器</x:String>
|
||||
<x:String x:Key="Text.Preferences.AI.Streaming" xml:space="preserve">啟用串流輸出</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance" xml:space="preserve">外觀設定</x:String>
|
||||
@@ -562,11 +574,9 @@
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Default" xml:space="preserve">預設</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.FontSize.Editor" xml:space="preserve">程式碼</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.MonospaceFont" xml:space="preserve">等寬字型</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.OnlyUseMonoFontInEditor" xml:space="preserve">僅在文字編輯器中使用等寬字型</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.Theme" xml:space="preserve">佈景主題</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.ThemeOverrides" xml:space="preserve">自訂主題</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseAutoHideScrollBars" xml:space="preserve">允許滾動條自動隱藏</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseFixedTabWidth" xml:space="preserve">使用固定寬度的分頁標籤</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseAutoHideScrollBars" xml:space="preserve">允許自動隱藏捲軸</x:String>
|
||||
<x:String x:Key="Text.Preferences.Appearance.UseNativeWindowFrame" xml:space="preserve">使用系統原生預設視窗樣式</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge" xml:space="preserve">對比/合併工具</x:String>
|
||||
<x:String x:Key="Text.Preferences.DiffMerge.Path" xml:space="preserve">安裝路徑</x:String>
|
||||
@@ -575,16 +585,16 @@
|
||||
<x:String x:Key="Text.Preferences.General" xml:space="preserve">一般設定</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.Check4UpdatesOnStartup" xml:space="preserve">啟動時檢查軟體更新</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.DateFormat" xml:space="preserve">日期時間格式</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.EnableCompactFolders" xml:space="preserve">在變更樹中啟用精簡文件夾顯示模式</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.EnableCompactFolders" xml:space="preserve">在樹狀變更目錄中啟用密集資料夾模式</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.Locale" xml:space="preserve">顯示語言</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.MaxHistoryCommits" xml:space="preserve">最大歷史提交數</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.ShowAuthorTime" xml:space="preserve">在提交路線圖中顯示修改時間而非提交時間</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.ShowChangesPageByDefault" xml:space="preserve">預設顯示「本機變更」頁面</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.ShowChangesTabInCommitDetailByDefault" xml:space="preserve">在提交詳細資訊頁面預設顯示【變更對比】</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.ShowChangesPageByDefault" xml:space="preserve">預設顯示 [本機變更] 頁面</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.ShowChangesTabInCommitDetailByDefault" xml:space="preserve">在提交詳細資訊頁面預設顯示 [變更對比]</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.ShowChildren" xml:space="preserve">在提交詳細資訊中顯示後續提交</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.ShowTagsInGraph" xml:space="preserve">在路線圖中顯示標籤</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.SubjectGuideLength" xml:space="preserve">提交標題字數偵測</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.UseGitHubStyleAvatar" xml:space="preserve">生成 GitHub 風格的預設頭像</x:String>
|
||||
<x:String x:Key="Text.Preferences.General.UseGitHubStyleAvatar" xml:space="preserve">產生 GitHub 風格的預設頭貼</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git" xml:space="preserve">Git 設定</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git.CRLF" xml:space="preserve">自動換行轉換</x:String>
|
||||
<x:String x:Key="Text.Preferences.Git.DefaultCloneDir" xml:space="preserve">預設複製 (clone) 路徑</x:String>
|
||||
@@ -641,6 +651,8 @@
|
||||
<x:String x:Key="Text.PushTag.PushAllRemotes" xml:space="preserve">推送到所有遠端存放庫</x:String>
|
||||
<x:String x:Key="Text.PushTag.Remote" xml:space="preserve">遠端存放庫:</x:String>
|
||||
<x:String x:Key="Text.PushTag.Tag" xml:space="preserve">標籤:</x:String>
|
||||
<x:String x:Key="Text.PushToNewBranch" xml:space="preserve">推送到新的分支</x:String>
|
||||
<x:String x:Key="Text.PushToNewBranch.Title" xml:space="preserve">輸入新的遠端分支名稱:</x:String>
|
||||
<x:String x:Key="Text.Quit" xml:space="preserve">結束</x:String>
|
||||
<x:String x:Key="Text.Rebase" xml:space="preserve">重定基底 (rebase) 操作</x:String>
|
||||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">自動擱置變更並復原本機變更</x:String>
|
||||
@@ -738,7 +750,7 @@
|
||||
<x:String x:Key="Text.Reset.Mode" xml:space="preserve">重設模式:</x:String>
|
||||
<x:String x:Key="Text.Reset.MoveTo" xml:space="preserve">移至提交:</x:String>
|
||||
<x:String x:Key="Text.Reset.Target" xml:space="preserve">目前分支:</x:String>
|
||||
<x:String x:Key="Text.ResetWithoutCheckout" xml:space="preserve">重設選取的分支(非目前分支)</x:String>
|
||||
<x:String x:Key="Text.ResetWithoutCheckout" xml:space="preserve">重設選取的分支 (非目前分支)</x:String>
|
||||
<x:String x:Key="Text.ResetWithoutCheckout.MoveTo" xml:space="preserve">重設位置: </x:String>
|
||||
<x:String x:Key="Text.ResetWithoutCheckout.Target" xml:space="preserve">選取分支: </x:String>
|
||||
<x:String x:Key="Text.RevealFile" xml:space="preserve">在檔案瀏覽器中檢視</x:String>
|
||||
@@ -867,7 +879,7 @@
|
||||
<x:String x:Key="Text.WorkingCopy.Amend" xml:space="preserve">修補</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.CanStageTip" xml:space="preserve">現在您已可將其加入暫存區中</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.ClearCommitHistories" xml:space="preserve">清除提交訊息歷史</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.ClearCommitHistories.Confirm" xml:space="preserve">您確定要清除所有提交訊息記錄嗎 (動作無法撤銷) ?</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.ClearCommitHistories.Confirm" xml:space="preserve">您確定要清除所有提交訊息記錄嗎 (執行後無法復原)?</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Commit" xml:space="preserve">提 交</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.CommitAndPush" xml:space="preserve">提交並推送</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.CommitMessageHelper" xml:space="preserve">歷史輸入/範本</x:String>
|
||||
@@ -885,7 +897,7 @@
|
||||
<x:String x:Key="Text.WorkingCopy.IncludeUntracked" xml:space="preserve">顯示未追蹤檔案</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.NoCommitHistories" xml:space="preserve">沒有提交訊息記錄</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.NoCommitTemplates" xml:space="preserve">沒有可套用的提交訊息範本</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.NoVerify" xml:space="preserve">繞過 HOOKS 檢查</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.NoVerify" xml:space="preserve">繞過 Hooks 檢查</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.ResetAuthor" xml:space="preserve">重設作者</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.SignOff" xml:space="preserve">署名</x:String>
|
||||
<x:String x:Key="Text.WorkingCopy.Staged" xml:space="preserve">已暫存</x:String>
|
||||
|
||||
@@ -301,9 +301,6 @@
|
||||
<Style Selector="TextBlock.italic">
|
||||
<Setter Property="FontStyle" Value="Italic"/>
|
||||
</Style>
|
||||
<Style Selector="TextBlock.primary, SelectableTextBlock.primary">
|
||||
<Setter Property="FontFamily" Value="{DynamicResource Fonts.Primary}"/>
|
||||
</Style>
|
||||
<Style Selector="TextBlock.group_header_label">
|
||||
<Setter Property="Foreground" Value="{DynamicResource Brush.FG2}"/>
|
||||
<Setter Property="FontWeight" Value="Bold"/>
|
||||
@@ -853,7 +850,7 @@
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="{Binding Name}" VerticalAlignment="Center"/>
|
||||
<Border Margin="4,0,0,0" Height="16" Background="Green" CornerRadius="8" VerticalAlignment="Center" IsVisible="{Binding IsGlobal}">
|
||||
<TextBlock Classes="primary" Text="GLOBAL" Margin="8,0" FontSize="10" Foreground="White"/>
|
||||
<TextBlock Text="GLOBAL" Margin="8,0" FontSize="10" Foreground="White"/>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<Color x:Key="Color.Window">#FF252525</Color>
|
||||
<Color x:Key="Color.WindowBorder">#FF444444</Color>
|
||||
<Color x:Key="Color.TitleBar">#FF1F1F1F</Color>
|
||||
<Color x:Key="Color.ToolBar">#FF2C2C2C</Color>
|
||||
<Color x:Key="Color.ToolBar">#FF2F2F2F</Color>
|
||||
<Color x:Key="Color.Popup">#FF2B2B2B</Color>
|
||||
<Color x:Key="Color.Contents">#FF1C1C1C</Color>
|
||||
<Color x:Key="Color.Badge">#FF8F8F8F</Color>
|
||||
@@ -85,5 +85,4 @@
|
||||
|
||||
<FontFamily x:Key="Fonts.Default">fonts:Inter#Inter</FontFamily>
|
||||
<FontFamily x:Key="Fonts.Monospace">fonts:SourceGit#JetBrains Mono</FontFamily>
|
||||
<FontFamily x:Key="Fonts.Primary">fonts:SourceGit#JetBrains Mono</FontFamily>
|
||||
</ResourceDictionary>
|
||||
|
||||
@@ -39,12 +39,12 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Avalonia" Version="11.3.7" />
|
||||
<PackageReference Include="Avalonia.Controls.DataGrid" Version="11.3.7" />
|
||||
<PackageReference Include="Avalonia.Desktop" Version="11.3.7" />
|
||||
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.3.7" />
|
||||
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.3.7" />
|
||||
<PackageReference Include="Avalonia.Diagnostics" Version="11.3.7" Condition="'$(Configuration)' == 'Debug'" />
|
||||
<PackageReference Include="Avalonia" Version="11.3.8" />
|
||||
<PackageReference Include="Avalonia.Controls.DataGrid" Version="11.3.8" />
|
||||
<PackageReference Include="Avalonia.Desktop" Version="11.3.8" />
|
||||
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.3.8" />
|
||||
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.3.8" />
|
||||
<PackageReference Include="Avalonia.Diagnostics" Version="11.3.8" Condition="'$(Configuration)' == 'Debug'" />
|
||||
<PackageReference Include="Avalonia.AvaloniaEdit" Version="11.3.0" />
|
||||
<PackageReference Include="AvaloniaEdit.TextMate" Version="11.3.0" />
|
||||
<PackageReference Include="Azure.AI.OpenAI" Version="2.5.0-beta.1" />
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Avalonia.Threading;
|
||||
@@ -20,6 +21,12 @@ namespace SourceGit.ViewModels
|
||||
private set => SetProperty(ref _revision, value);
|
||||
}
|
||||
|
||||
public Models.Commit PrevRevision
|
||||
{
|
||||
get => _prevRevision;
|
||||
private set => SetProperty(ref _prevRevision, value);
|
||||
}
|
||||
|
||||
public Models.BlameData Data
|
||||
{
|
||||
get => _data;
|
||||
@@ -51,10 +58,10 @@ namespace SourceGit.ViewModels
|
||||
|
||||
FilePath = file;
|
||||
Revision = commit;
|
||||
PrevRevision = null;
|
||||
|
||||
_repo = repo;
|
||||
_navigationHistory.Add(sha);
|
||||
_commits.Add(sha, commit);
|
||||
SetBlameData(sha);
|
||||
}
|
||||
|
||||
@@ -90,6 +97,14 @@ namespace SourceGit.ViewModels
|
||||
NavigateToCommit(_navigationHistory[_navigationActiveIndex], true);
|
||||
}
|
||||
|
||||
public void GotoPrevRevision()
|
||||
{
|
||||
if (_prevRevision == null)
|
||||
return;
|
||||
|
||||
NavigateToCommit(_prevRevision.SHA, false);
|
||||
}
|
||||
|
||||
public void NavigateToCommit(string commitSHA, bool isBackOrForward)
|
||||
{
|
||||
if (Revision.SHA.StartsWith(commitSHA, StringComparison.Ordinal))
|
||||
@@ -130,28 +145,28 @@ namespace SourceGit.ViewModels
|
||||
_cancellationSource = new CancellationTokenSource();
|
||||
var token = _cancellationSource.Token;
|
||||
|
||||
if (_commits.TryGetValue(commitSHA, out var c))
|
||||
Task.Run(async () =>
|
||||
{
|
||||
Revision = c;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var result = await new Commands.QuerySingleCommit(_repo, commitSHA)
|
||||
.GetResultAsync()
|
||||
.ConfigureAwait(false);
|
||||
var argsBuilder = new StringBuilder();
|
||||
argsBuilder
|
||||
.Append("--date-order -n 2 ")
|
||||
.Append(commitSHA ?? string.Empty)
|
||||
.Append(" -- ")
|
||||
.Append(FilePath.Quoted());
|
||||
|
||||
Dispatcher.UIThread.Post(() =>
|
||||
var commits = await new Commands.QueryCommits(_repo, argsBuilder.ToString(), false)
|
||||
.GetResultAsync()
|
||||
.ConfigureAwait(false);
|
||||
|
||||
Dispatcher.UIThread.Post(() =>
|
||||
{
|
||||
if (!token.IsCancellationRequested)
|
||||
{
|
||||
if (!token.IsCancellationRequested)
|
||||
{
|
||||
_commits.Add(commitSHA, result);
|
||||
Revision = result ?? new Models.Commit() { SHA = commitSHA };
|
||||
}
|
||||
});
|
||||
}, token);
|
||||
}
|
||||
Revision = commits.Count > 0 ? commits[0] : null;
|
||||
PrevRevision = commits.Count == 2 ? commits[1] : null;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
Task.Run(async () =>
|
||||
{
|
||||
@@ -169,11 +184,11 @@ namespace SourceGit.ViewModels
|
||||
|
||||
private string _repo;
|
||||
private Models.Commit _revision;
|
||||
private Models.Commit _prevRevision;
|
||||
private CancellationTokenSource _cancellationSource = null;
|
||||
private int _navigationActiveIndex = 0;
|
||||
private List<string> _navigationHistory = [];
|
||||
private Models.BlameData _data = null;
|
||||
private Dictionary<string, Models.Commit> _commits = new();
|
||||
private Dictionary<string, string> _commitMessages = new();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,6 +128,13 @@ namespace SourceGit.ViewModels
|
||||
return Native.OS.GetAbsPath(_repo, path);
|
||||
}
|
||||
|
||||
public async Task SaveChangesAsPatchAsync(List<Models.Change> changes, string saveTo)
|
||||
{
|
||||
var succ = await Commands.SaveChangesAsPatch.ProcessRevisionCompareChangesAsync(_repo, changes, _based.Head, _to.Head, saveTo);
|
||||
if (succ)
|
||||
App.SendNotification(_repo, App.Text("SaveAsPatchSuccess"));
|
||||
}
|
||||
|
||||
private void Refresh()
|
||||
{
|
||||
IsLoading = true;
|
||||
|
||||
@@ -58,7 +58,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
if (!DiscardLocalChanges)
|
||||
{
|
||||
var changes = await new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).GetResultAsync();
|
||||
var changes = await new Commands.CountLocalChanges(_repo.FullPath, false).GetResultAsync();
|
||||
if (changes > 0)
|
||||
{
|
||||
succ = await new Commands.Stash(_repo.FullPath)
|
||||
|
||||
@@ -63,7 +63,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
if (!DiscardLocalChanges)
|
||||
{
|
||||
var changes = await new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).GetResultAsync();
|
||||
var changes = await new Commands.CountLocalChanges(_repo.FullPath, false).GetResultAsync();
|
||||
if (changes > 0)
|
||||
{
|
||||
succ = await new Commands.Stash(_repo.FullPath)
|
||||
|
||||
@@ -58,7 +58,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
if (!DiscardLocalChanges)
|
||||
{
|
||||
var changes = await new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).GetResultAsync();
|
||||
var changes = await new Commands.CountLocalChanges(_repo.FullPath, false).GetResultAsync();
|
||||
if (changes > 0)
|
||||
{
|
||||
succ = await new Commands.Stash(_repo.FullPath)
|
||||
|
||||
@@ -150,6 +150,8 @@ namespace SourceGit.ViewModels
|
||||
log.Complete();
|
||||
|
||||
var node = Preferences.Instance.FindOrAddNodeByRepositoryPath(path, null, true);
|
||||
await node.UpdateStatusAsync(false, null);
|
||||
|
||||
var launcher = App.GetLauncher();
|
||||
LauncherPage page = null;
|
||||
foreach (var one in launcher.Pages)
|
||||
|
||||
@@ -37,7 +37,12 @@ namespace SourceGit.ViewModels
|
||||
set
|
||||
{
|
||||
if (value != _sharedData.ActiveTabIndex)
|
||||
{
|
||||
_sharedData.ActiveTabIndex = value;
|
||||
|
||||
if (value == 1 && DiffContext == null && _selectedChanges is { Count: 1 })
|
||||
DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption(_commit, _selectedChanges[0]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,7 +99,7 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
if (SetProperty(ref _selectedChanges, value))
|
||||
{
|
||||
if (value is not { Count: 1 })
|
||||
if (ActiveTabIndex != 1 || value is not { Count: 1 })
|
||||
DiffContext = null;
|
||||
else
|
||||
DiffContext = new DiffContext(_repo.FullPath, new Models.DiffOption(_commit, value[0]), _diffContext);
|
||||
@@ -234,7 +239,7 @@ namespace SourceGit.ViewModels
|
||||
public async Task ResetToThisRevisionAsync(string path)
|
||||
{
|
||||
var log = _repo.CreateLog($"Reset File to '{_commit.SHA}'");
|
||||
await new Commands.Checkout(_repo.FullPath).Use(log).FileWithRevisionAsync(path, $"{_commit.SHA}");
|
||||
await new Commands.Checkout(_repo.FullPath).Use(log).FileWithRevisionAsync(path, _commit.SHA);
|
||||
log.Complete();
|
||||
}
|
||||
|
||||
@@ -249,6 +254,41 @@ namespace SourceGit.ViewModels
|
||||
log.Complete();
|
||||
}
|
||||
|
||||
public async Task ResetMultipleToThisRevisionAsync(List<Models.Change> changes)
|
||||
{
|
||||
var files = new List<string>();
|
||||
foreach (var c in changes)
|
||||
files.Add(c.Path);
|
||||
|
||||
var log = _repo.CreateLog($"Reset Files to '{_commit.SHA}'");
|
||||
await new Commands.Checkout(_repo.FullPath).Use(log).MultipleFilesWithRevisionAsync(files, _commit.SHA);
|
||||
log.Complete();
|
||||
}
|
||||
|
||||
public async Task ResetMultipleToParentRevisionAsync(List<Models.Change> changes)
|
||||
{
|
||||
var renamed = new List<string>();
|
||||
var modified = new List<string>();
|
||||
|
||||
foreach (var c in changes)
|
||||
{
|
||||
if (c.Index == Models.ChangeState.Renamed)
|
||||
renamed.Add(c.OriginalPath);
|
||||
else
|
||||
modified.Add(c.Path);
|
||||
}
|
||||
|
||||
var log = _repo.CreateLog($"Reset Files to '{_commit.SHA}~1'");
|
||||
|
||||
if (modified.Count > 0)
|
||||
await new Commands.Checkout(_repo.FullPath).Use(log).MultipleFilesWithRevisionAsync(modified, $"{_commit.SHA}~1");
|
||||
|
||||
if (renamed.Count > 0)
|
||||
await new Commands.Checkout(_repo.FullPath).Use(log).MultipleFilesWithRevisionAsync(renamed, $"{_commit.SHA}~1");
|
||||
|
||||
log.Complete();
|
||||
}
|
||||
|
||||
public async Task<List<Models.Object>> GetRevisionFilesUnderFolderAsync(string parentFolder)
|
||||
{
|
||||
return await new Commands.QueryRevisionObjects(_repo.FullPath, _commit.SHA, parentFolder)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Text;
|
||||
@@ -9,11 +10,17 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
public class ConventionalCommitMessageBuilder : ObservableValidator
|
||||
{
|
||||
[Required(ErrorMessage = "Type of changes can not be null")]
|
||||
public Models.ConventionalCommitType Type
|
||||
public List<Models.ConventionalCommitType> Types
|
||||
{
|
||||
get => _type;
|
||||
set => SetProperty(ref _type, value, true);
|
||||
get;
|
||||
private set;
|
||||
} = [];
|
||||
|
||||
[Required(ErrorMessage = "Type of changes can not be null")]
|
||||
public Models.ConventionalCommitType SelectedType
|
||||
{
|
||||
get => _selectedType;
|
||||
set => SetProperty(ref _selectedType, value, true);
|
||||
}
|
||||
|
||||
public string Scope
|
||||
@@ -47,8 +54,10 @@ namespace SourceGit.ViewModels
|
||||
set => SetProperty(ref _closedIssue, value);
|
||||
}
|
||||
|
||||
public ConventionalCommitMessageBuilder(Action<string> onApply)
|
||||
public ConventionalCommitMessageBuilder(string conventionalTypesOverride, Action<string> onApply)
|
||||
{
|
||||
Types = Models.ConventionalCommitType.Load(conventionalTypesOverride);
|
||||
SelectedType = Types.Count > 0 ? Types[0] : null;
|
||||
_onApply = onApply;
|
||||
}
|
||||
|
||||
@@ -63,7 +72,7 @@ namespace SourceGit.ViewModels
|
||||
return false;
|
||||
|
||||
var builder = new StringBuilder();
|
||||
builder.Append(_type.Type);
|
||||
builder.Append(_selectedType.Type);
|
||||
|
||||
if (!string.IsNullOrEmpty(_scope))
|
||||
{
|
||||
@@ -103,7 +112,7 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
|
||||
private Action<string> _onApply = null;
|
||||
private Models.ConventionalCommitType _type = Models.ConventionalCommitType.Supported[0];
|
||||
private Models.ConventionalCommitType _selectedType = null;
|
||||
private string _scope = string.Empty;
|
||||
private string _description = string.Empty;
|
||||
private string _detail = string.Empty;
|
||||
|
||||
@@ -142,7 +142,7 @@ namespace SourceGit.ViewModels
|
||||
var needPopStash = false;
|
||||
if (!DiscardLocalChanges)
|
||||
{
|
||||
var changes = await new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).GetResultAsync();
|
||||
var changes = await new Commands.CountLocalChanges(_repo.FullPath, false).GetResultAsync();
|
||||
if (changes > 0)
|
||||
{
|
||||
succ = await new Commands.Stash(_repo.FullPath)
|
||||
|
||||
@@ -68,6 +68,7 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
|
||||
var navigateToUpstreamHEAD = _repo.SelectedView is Histories { AutoSelectedCommit: { IsCurrentHead: true } };
|
||||
var notags = _repo.Settings.FetchWithoutTags;
|
||||
var force = _repo.Settings.EnableForceOnFetch;
|
||||
var log = _repo.CreateLog("Fetch");
|
||||
@@ -89,11 +90,14 @@ namespace SourceGit.ViewModels
|
||||
|
||||
log.Complete();
|
||||
|
||||
var upstream = _repo.CurrentBranch?.Upstream;
|
||||
if (!string.IsNullOrEmpty(upstream))
|
||||
if (navigateToUpstreamHEAD)
|
||||
{
|
||||
var upstreamHead = await new Commands.QueryRevisionByRefName(_repo.FullPath, upstream.Substring(13)).GetResultAsync();
|
||||
_repo.NavigateToCommit(upstreamHead, true);
|
||||
var upstream = _repo.CurrentBranch?.Upstream;
|
||||
if (!string.IsNullOrEmpty(upstream))
|
||||
{
|
||||
var upstreamHead = await new Commands.QueryRevisionByRefName(_repo.FullPath, upstream.Substring(13)).GetResultAsync();
|
||||
_repo.NavigateToCommit(upstreamHead, true);
|
||||
}
|
||||
}
|
||||
|
||||
_repo.MarkFetched();
|
||||
|
||||
@@ -35,8 +35,12 @@ namespace SourceGit.ViewModels
|
||||
|
||||
log.Complete();
|
||||
|
||||
var newHead = await new Commands.QueryRevisionByRefName(_repo.FullPath, Local.Name).GetResultAsync();
|
||||
_repo.NavigateToCommit(newHead, true);
|
||||
if (_repo.SelectedViewIndex == 0)
|
||||
{
|
||||
var newHead = await new Commands.QueryRevisionByRefName(_repo.FullPath, Local.Name).GetResultAsync();
|
||||
_repo.NavigateToCommit(newHead, true);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -358,10 +358,11 @@ namespace SourceGit.ViewModels
|
||||
await App.ShowDialog(new InteractiveRebase(_repo, on, prefill));
|
||||
}
|
||||
|
||||
public async Task CopyCommitFullMessageAsync(Models.Commit commit)
|
||||
public async Task<string> GetCommitFullMessageAsync(Models.Commit commit)
|
||||
{
|
||||
var message = await new Commands.QueryCommitFullMessage(_repo.FullPath, commit.SHA).GetResultAsync();
|
||||
await App.CopyTextAsync(message);
|
||||
return await new Commands.QueryCommitFullMessage(_repo.FullPath, commit.SHA)
|
||||
.GetResultAsync()
|
||||
.ConfigureAwait(false);
|
||||
}
|
||||
|
||||
public async Task<Models.Commit> CompareWithHeadAsync(Models.Commit commit)
|
||||
|
||||
@@ -39,7 +39,9 @@ namespace SourceGit.ViewModels
|
||||
|
||||
if (succ)
|
||||
{
|
||||
Preferences.Instance.FindOrAddNodeByRepositoryPath(_targetPath, _parentNode, true);
|
||||
var node = Preferences.Instance.FindOrAddNodeByRepositoryPath(_targetPath, _parentNode, true);
|
||||
await node.UpdateStatusAsync(false, null);
|
||||
|
||||
Welcome.Instance.Refresh();
|
||||
}
|
||||
return succ;
|
||||
|
||||
@@ -15,6 +15,11 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public class InteractiveRebaseItem : ObservableObject
|
||||
{
|
||||
public int OriginalOrder
|
||||
{
|
||||
get;
|
||||
}
|
||||
|
||||
public Models.Commit Commit
|
||||
{
|
||||
get;
|
||||
@@ -59,8 +64,21 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public InteractiveRebaseItem(Models.Commit c, string message, bool canSquashOrFixup)
|
||||
public bool IsDropBeforeVisible
|
||||
{
|
||||
get => _isDropBeforeVisible;
|
||||
set => SetProperty(ref _isDropBeforeVisible, value);
|
||||
}
|
||||
|
||||
public bool IsDropAfterVisible
|
||||
{
|
||||
get => _isDropAfterVisible;
|
||||
set => SetProperty(ref _isDropAfterVisible, value);
|
||||
}
|
||||
|
||||
public InteractiveRebaseItem(int order, Models.Commit c, string message, bool canSquashOrFixup)
|
||||
{
|
||||
OriginalOrder = order;
|
||||
Commit = c;
|
||||
FullMessage = message;
|
||||
CanSquashOrFixup = canSquashOrFixup;
|
||||
@@ -70,6 +88,8 @@ namespace SourceGit.ViewModels
|
||||
private string _subject;
|
||||
private string _fullMessage;
|
||||
private bool _canSquashOrFixup = true;
|
||||
private bool _isDropBeforeVisible = false;
|
||||
private bool _isDropAfterVisible = false;
|
||||
}
|
||||
|
||||
public class InteractiveRebase : ObservableObject
|
||||
@@ -96,6 +116,11 @@ namespace SourceGit.ViewModels
|
||||
get => _repo.IssueTrackers;
|
||||
}
|
||||
|
||||
public string ConventionalTypesOverride
|
||||
{
|
||||
get => _repo.Settings.ConventionalTypesOverride;
|
||||
}
|
||||
|
||||
public bool IsLoading
|
||||
{
|
||||
get => _isLoading;
|
||||
@@ -137,7 +162,7 @@ namespace SourceGit.ViewModels
|
||||
for (var i = 0; i < commits.Count; i++)
|
||||
{
|
||||
var c = commits[i];
|
||||
list.Add(new InteractiveRebaseItem(c.Commit, c.Message, i < commits.Count - 1));
|
||||
list.Add(new InteractiveRebaseItem(commits.Count - i, c.Commit, c.Message, i < commits.Count - 1));
|
||||
}
|
||||
|
||||
var selected = list.Count > 0 ? list[0] : null;
|
||||
@@ -177,30 +202,6 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public void MoveItemUp(InteractiveRebaseItem item)
|
||||
{
|
||||
var idx = Items.IndexOf(item);
|
||||
if (idx > 0)
|
||||
{
|
||||
var prev = Items[idx - 1];
|
||||
Items.RemoveAt(idx - 1);
|
||||
Items.Insert(idx, prev);
|
||||
UpdateItems();
|
||||
}
|
||||
}
|
||||
|
||||
public void MoveItemDown(InteractiveRebaseItem item)
|
||||
{
|
||||
var idx = Items.IndexOf(item);
|
||||
if (idx < Items.Count - 1)
|
||||
{
|
||||
var next = Items[idx + 1];
|
||||
Items.RemoveAt(idx + 1);
|
||||
Items.Insert(idx, next);
|
||||
UpdateItems();
|
||||
}
|
||||
}
|
||||
|
||||
public void ChangeAction(List<InteractiveRebaseItem> selected, Models.InteractiveRebaseAction action)
|
||||
{
|
||||
if (action == Models.InteractiveRebaseAction.Squash || action == Models.InteractiveRebaseAction.Fixup)
|
||||
@@ -220,6 +221,41 @@ namespace SourceGit.ViewModels
|
||||
UpdateItems();
|
||||
}
|
||||
|
||||
public void Move(List<InteractiveRebaseItem> commits, int index)
|
||||
{
|
||||
var hashes = new HashSet<string>();
|
||||
foreach (var c in commits)
|
||||
hashes.Add(c.Commit.SHA);
|
||||
|
||||
var before = new List<InteractiveRebaseItem>();
|
||||
var ordered = new List<InteractiveRebaseItem>();
|
||||
var after = new List<InteractiveRebaseItem>();
|
||||
|
||||
for (int i = 0; i < index; i++)
|
||||
{
|
||||
var item = Items[i];
|
||||
if (!hashes.Contains(item.Commit.SHA))
|
||||
before.Add(item);
|
||||
else
|
||||
ordered.Add(item);
|
||||
}
|
||||
|
||||
for (int i = index; i < Items.Count; i++)
|
||||
{
|
||||
var item = Items[i];
|
||||
if (!hashes.Contains(item.Commit.SHA))
|
||||
after.Add(item);
|
||||
else
|
||||
ordered.Add(item);
|
||||
}
|
||||
|
||||
Items.Clear();
|
||||
Items.AddRange(before);
|
||||
Items.AddRange(ordered);
|
||||
Items.AddRange(after);
|
||||
UpdateItems();
|
||||
}
|
||||
|
||||
public async Task<bool> Start()
|
||||
{
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
|
||||
@@ -62,7 +62,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
IsLoading = true;
|
||||
|
||||
var succ = await _repo.UnlockLFSFileAsync(_remote, lfsLock.File, force, false);
|
||||
var succ = await _repo.UnlockLFSFileAsync(_remote, lfsLock.Path, force, false);
|
||||
if (succ)
|
||||
{
|
||||
_cachedLocks.Remove(lfsLock);
|
||||
@@ -84,7 +84,7 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
foreach (var lfsLock in _cachedLocks)
|
||||
{
|
||||
if (lfsLock.User.Equals(_userName, StringComparison.Ordinal))
|
||||
if (lfsLock.Owner.Name.Equals(_userName, StringComparison.Ordinal))
|
||||
visible.Add(lfsLock);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,10 +43,10 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public IDisposable Switcher
|
||||
public QuickLauncher QuickLauncher
|
||||
{
|
||||
get => _switcher;
|
||||
private set => SetProperty(ref _switcher, value);
|
||||
get => _quickLauncher;
|
||||
set => SetProperty(ref _quickLauncher, value);
|
||||
}
|
||||
|
||||
public Launcher(string startupRepo)
|
||||
@@ -127,22 +127,6 @@ namespace SourceGit.ViewModels
|
||||
_ignoreIndexChange = false;
|
||||
}
|
||||
|
||||
public void OpenWorkspaceSwitcher()
|
||||
{
|
||||
Switcher = new WorkspaceSwitcher(this);
|
||||
}
|
||||
|
||||
public void OpenTabSwitcher()
|
||||
{
|
||||
Switcher = new LauncherPageSwitcher(this);
|
||||
}
|
||||
|
||||
public void CancelSwitcher()
|
||||
{
|
||||
Switcher?.Dispose();
|
||||
Switcher = null;
|
||||
}
|
||||
|
||||
public void SwitchWorkspace(Workspace to)
|
||||
{
|
||||
if (to == null || to.IsActive)
|
||||
@@ -497,6 +481,6 @@ namespace SourceGit.ViewModels
|
||||
private LauncherPage _activePage = null;
|
||||
private bool _ignoreIndexChange = false;
|
||||
private string _title = string.Empty;
|
||||
private IDisposable _switcher = null;
|
||||
private QuickLauncher _quickLauncher = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
namespace SourceGit.ViewModels
|
||||
{
|
||||
public class LauncherPageSwitcher : ObservableObject, IDisposable
|
||||
{
|
||||
public List<LauncherPage> VisiblePages
|
||||
{
|
||||
get => _visiblePages;
|
||||
private set => SetProperty(ref _visiblePages, value);
|
||||
}
|
||||
|
||||
public string SearchFilter
|
||||
{
|
||||
get => _searchFilter;
|
||||
set
|
||||
{
|
||||
if (SetProperty(ref _searchFilter, value))
|
||||
UpdateVisiblePages();
|
||||
}
|
||||
}
|
||||
|
||||
public LauncherPage SelectedPage
|
||||
{
|
||||
get => _selectedPage;
|
||||
set => SetProperty(ref _selectedPage, value);
|
||||
}
|
||||
|
||||
public LauncherPageSwitcher(Launcher launcher)
|
||||
{
|
||||
_launcher = launcher;
|
||||
UpdateVisiblePages();
|
||||
SelectedPage = launcher.ActivePage;
|
||||
}
|
||||
|
||||
public void ClearFilter()
|
||||
{
|
||||
SearchFilter = string.Empty;
|
||||
}
|
||||
|
||||
public void Switch()
|
||||
{
|
||||
_launcher.ActivePage = _selectedPage ?? _launcher.ActivePage;
|
||||
_launcher.CancelSwitcher();
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_visiblePages.Clear();
|
||||
_selectedPage = null;
|
||||
_searchFilter = string.Empty;
|
||||
}
|
||||
|
||||
private void UpdateVisiblePages()
|
||||
{
|
||||
var visible = new List<LauncherPage>();
|
||||
if (string.IsNullOrEmpty(_searchFilter))
|
||||
{
|
||||
visible.AddRange(_launcher.Pages);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var page in _launcher.Pages)
|
||||
{
|
||||
if (page.Node.Name.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase) ||
|
||||
(page.Node.IsRepository && page.Node.Id.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
visible.Add(page);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
VisiblePages = visible;
|
||||
SelectedPage = visible.Count > 0 ? visible[0] : null;
|
||||
}
|
||||
|
||||
private Launcher _launcher = null;
|
||||
private List<LauncherPage> _visiblePages = [];
|
||||
private string _searchFilter = string.Empty;
|
||||
private LauncherPage _selectedPage = null;
|
||||
}
|
||||
}
|
||||
@@ -71,8 +71,12 @@ namespace SourceGit.ViewModels
|
||||
|
||||
log.Complete();
|
||||
|
||||
var head = await new Commands.QueryRevisionByRefName(_repo.FullPath, "HEAD").GetResultAsync();
|
||||
_repo.NavigateToCommit(head, true);
|
||||
if (_repo.SelectedViewIndex == 0)
|
||||
{
|
||||
var head = await new Commands.QueryRevisionByRefName(_repo.FullPath, "HEAD").GetResultAsync();
|
||||
_repo.NavigateToCommit(head, true);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ namespace SourceGit.ViewModels
|
||||
set
|
||||
{
|
||||
if (SetProperty(ref _defaultFontFamily, value) && !_isLoading)
|
||||
App.SetFonts(value, _monospaceFontFamily, _onlyUseMonoFontInEditor);
|
||||
App.SetFonts(value, _monospaceFontFamily);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,17 +75,7 @@ namespace SourceGit.ViewModels
|
||||
set
|
||||
{
|
||||
if (SetProperty(ref _monospaceFontFamily, value) && !_isLoading)
|
||||
App.SetFonts(_defaultFontFamily, value, _onlyUseMonoFontInEditor);
|
||||
}
|
||||
}
|
||||
|
||||
public bool OnlyUseMonoFontInEditor
|
||||
{
|
||||
get => _onlyUseMonoFontInEditor;
|
||||
set
|
||||
{
|
||||
if (SetProperty(ref _onlyUseMonoFontInEditor, value) && !_isLoading)
|
||||
App.SetFonts(_defaultFontFamily, _monospaceFontFamily, _onlyUseMonoFontInEditor);
|
||||
App.SetFonts(_defaultFontFamily, value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -158,12 +148,6 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public bool UseFixedTabWidth
|
||||
{
|
||||
get => _useFixedTabWidth;
|
||||
set => SetProperty(ref _useFixedTabWidth, value);
|
||||
}
|
||||
|
||||
public bool UseAutoHideScrollBars
|
||||
{
|
||||
get => _useAutoHideScrollBars;
|
||||
@@ -721,7 +705,6 @@ namespace SourceGit.ViewModels
|
||||
private string _themeOverrides = string.Empty;
|
||||
private string _defaultFontFamily = string.Empty;
|
||||
private string _monospaceFontFamily = string.Empty;
|
||||
private bool _onlyUseMonoFontInEditor = true;
|
||||
private double _defaultFontSize = 13;
|
||||
private double _editorFontSize = 13;
|
||||
private int _editorTabWidth = 4;
|
||||
@@ -729,7 +712,6 @@ namespace SourceGit.ViewModels
|
||||
|
||||
private int _maxHistoryCommits = 20000;
|
||||
private int _subjectGuideLength = 50;
|
||||
private bool _useFixedTabWidth = true;
|
||||
private bool _useAutoHideScrollBars = true;
|
||||
private bool _useGitHubStyleAvatar = true;
|
||||
private bool _showAuthorTimeInGraph = false;
|
||||
|
||||
@@ -119,7 +119,7 @@ namespace SourceGit.ViewModels
|
||||
Use(log);
|
||||
|
||||
var updateSubmodules = IsRecurseSubmoduleVisible && RecurseSubmodules;
|
||||
var changes = await new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).GetResultAsync();
|
||||
var changes = await new Commands.CountLocalChanges(_repo.FullPath, false).GetResultAsync();
|
||||
var needPopStash = false;
|
||||
if (changes > 0)
|
||||
{
|
||||
@@ -160,8 +160,12 @@ namespace SourceGit.ViewModels
|
||||
|
||||
log.Complete();
|
||||
|
||||
var head = await new Commands.QueryRevisionByRefName(_repo.FullPath, "HEAD").GetResultAsync();
|
||||
_repo.NavigateToCommit(head, true);
|
||||
if (_repo.SelectedViewIndex == 0)
|
||||
{
|
||||
var head = await new Commands.QueryRevisionByRefName(_repo.FullPath, "HEAD").GetResultAsync();
|
||||
_repo.NavigateToCommit(head, true);
|
||||
}
|
||||
|
||||
return rs;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@@ -69,9 +70,9 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public bool Tracking
|
||||
{
|
||||
get;
|
||||
set;
|
||||
} = true;
|
||||
get => _tracking;
|
||||
set => SetProperty(ref _tracking, value);
|
||||
}
|
||||
|
||||
public bool IsCheckSubmodulesVisible
|
||||
{
|
||||
@@ -127,8 +128,10 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
|
||||
// Find preferred remote if selected local branch has upstream.
|
||||
if (!string.IsNullOrEmpty(_selectedLocalBranch?.Upstream))
|
||||
if (!string.IsNullOrEmpty(_selectedLocalBranch?.Upstream) && !_selectedLocalBranch.IsUpstreamGone)
|
||||
{
|
||||
_tracking = false;
|
||||
|
||||
foreach (var branch in repo.Branches)
|
||||
{
|
||||
if (!branch.IsLocal && _selectedLocalBranch.Upstream == branch.FullName)
|
||||
@@ -138,6 +141,10 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_tracking = true;
|
||||
}
|
||||
|
||||
// Set default remote to the first if it has not been set.
|
||||
if (_selectedRemote == null)
|
||||
@@ -153,6 +160,27 @@ namespace SourceGit.ViewModels
|
||||
AutoSelectBranchByRemote();
|
||||
}
|
||||
|
||||
public void PushToNewBranch(string name)
|
||||
{
|
||||
var exist = _remoteBranches.Find(x => x.Name.Equals(name, StringComparison.Ordinal));
|
||||
if (exist != null)
|
||||
{
|
||||
SelectedRemoteBranch = exist;
|
||||
return;
|
||||
}
|
||||
|
||||
var fake = new Models.Branch()
|
||||
{
|
||||
Name = name,
|
||||
Remote = _selectedRemote.Name,
|
||||
};
|
||||
var collection = new List<Models.Branch>();
|
||||
collection.AddRange(_remoteBranches);
|
||||
collection.Add(fake);
|
||||
RemoteBranches = collection;
|
||||
SelectedRemoteBranch = fake;
|
||||
}
|
||||
|
||||
public override bool CanStartDirectly()
|
||||
{
|
||||
return !string.IsNullOrEmpty(_selectedRemoteBranch?.Head);
|
||||
@@ -175,7 +203,7 @@ namespace SourceGit.ViewModels
|
||||
remoteBranchName,
|
||||
PushAllTags,
|
||||
_repo.Submodules.Count > 0 && CheckSubmodules,
|
||||
_isSetTrackOptionVisible && Tracking,
|
||||
_isSetTrackOptionVisible && _tracking,
|
||||
ForcePush).Use(log).RunAsync();
|
||||
|
||||
log.Complete();
|
||||
@@ -234,5 +262,6 @@ namespace SourceGit.ViewModels
|
||||
private List<Models.Branch> _remoteBranches = [];
|
||||
private Models.Branch _selectedRemoteBranch = null;
|
||||
private bool _isSetTrackOptionVisible = false;
|
||||
private bool _tracking = true;
|
||||
}
|
||||
}
|
||||
|
||||
125
src/ViewModels/QuickLauncher.cs
Normal file
125
src/ViewModels/QuickLauncher.cs
Normal file
@@ -0,0 +1,125 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
namespace SourceGit.ViewModels
|
||||
{
|
||||
public class QuickLauncher : ObservableObject
|
||||
{
|
||||
public List<LauncherPage> VisiblePages
|
||||
{
|
||||
get => _visiblePages;
|
||||
private set => SetProperty(ref _visiblePages, value);
|
||||
}
|
||||
|
||||
public List<RepositoryNode> VisibleRepos
|
||||
{
|
||||
get => _visibleRepos;
|
||||
private set => SetProperty(ref _visibleRepos, value);
|
||||
}
|
||||
|
||||
public string SearchFilter
|
||||
{
|
||||
get => _searchFilter;
|
||||
set
|
||||
{
|
||||
if (SetProperty(ref _searchFilter, value))
|
||||
UpdateVisible();
|
||||
}
|
||||
}
|
||||
|
||||
public LauncherPage SelectedPage
|
||||
{
|
||||
get => _selectedPage;
|
||||
set
|
||||
{
|
||||
if (SetProperty(ref _selectedPage, value) && value != null)
|
||||
SelectedRepo = null;
|
||||
}
|
||||
}
|
||||
|
||||
public RepositoryNode SelectedRepo
|
||||
{
|
||||
get => _selectedRepo;
|
||||
set
|
||||
{
|
||||
if (SetProperty(ref _selectedRepo, value) && value != null)
|
||||
SelectedPage = null;
|
||||
}
|
||||
}
|
||||
|
||||
public QuickLauncher(Launcher launcher)
|
||||
{
|
||||
_launcher = launcher;
|
||||
|
||||
foreach (var page in _launcher.Pages)
|
||||
{
|
||||
if (page.Node.IsRepository)
|
||||
_opened.Add(page.Node.Id);
|
||||
}
|
||||
|
||||
UpdateVisible();
|
||||
}
|
||||
|
||||
public void ClearFilter()
|
||||
{
|
||||
SearchFilter = string.Empty;
|
||||
}
|
||||
|
||||
public void OpenOrSwitchTo()
|
||||
{
|
||||
if (_selectedPage != null)
|
||||
_launcher.ActivePage = _selectedPage;
|
||||
else if (_selectedRepo != null)
|
||||
_launcher.OpenRepositoryInTab(_selectedRepo, null);
|
||||
|
||||
_launcher.QuickLauncher = null;
|
||||
}
|
||||
|
||||
private void UpdateVisible()
|
||||
{
|
||||
var pages = new List<LauncherPage>();
|
||||
foreach (var page in _launcher.Pages)
|
||||
{
|
||||
if (string.IsNullOrEmpty(_searchFilter) ||
|
||||
page.Node.Name.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase) ||
|
||||
(page.Node.IsRepository && page.Node.Id.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase)))
|
||||
pages.Add(page);
|
||||
}
|
||||
|
||||
var repos = new List<RepositoryNode>();
|
||||
CollectVisibleRepository(repos, Preferences.Instance.RepositoryNodes);
|
||||
|
||||
VisiblePages = pages;
|
||||
VisibleRepos = repos;
|
||||
}
|
||||
|
||||
private void CollectVisibleRepository(List<RepositoryNode> outs, List<RepositoryNode> nodes)
|
||||
{
|
||||
foreach (var node in nodes)
|
||||
{
|
||||
if (!node.IsRepository)
|
||||
{
|
||||
CollectVisibleRepository(outs, node.SubNodes);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (_opened.Contains(node.Id))
|
||||
continue;
|
||||
|
||||
if (string.IsNullOrEmpty(_searchFilter) ||
|
||||
node.Id.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase) ||
|
||||
node.Name.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase))
|
||||
outs.Add(node);
|
||||
}
|
||||
}
|
||||
|
||||
private Launcher _launcher = null;
|
||||
private HashSet<string> _opened = new HashSet<string>();
|
||||
private List<LauncherPage> _visiblePages = [];
|
||||
private List<RepositoryNode> _visibleRepos = [];
|
||||
private string _searchFilter = string.Empty;
|
||||
private LauncherPage _selectedPage = null;
|
||||
private RepositoryNode _selectedRepo = null;
|
||||
}
|
||||
}
|
||||
@@ -567,7 +567,11 @@ namespace SourceGit.ViewModels
|
||||
|
||||
if (!_isWorktree)
|
||||
{
|
||||
_settings.LastCommitMessage = _workingCopy.CommitMessage;
|
||||
if (_workingCopy.InProgressContext != null && !string.IsNullOrEmpty(_workingCopy.CommitMessage))
|
||||
File.WriteAllText(Path.Combine(GitDir, "MERGE_MSG"), _workingCopy.CommitMessage);
|
||||
else
|
||||
_settings.LastCommitMessage = _workingCopy.CommitMessage;
|
||||
|
||||
using var stream = File.Create(Path.Combine(_gitCommonDir, "sourcegit.settings"));
|
||||
JsonSerializer.Serialize(stream, _settings, JsonCodeGen.Default.RepositorySettings);
|
||||
}
|
||||
@@ -985,10 +989,10 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
_navigateToCommitDelayed = sha;
|
||||
}
|
||||
else if (_histories != null)
|
||||
else
|
||||
{
|
||||
SelectedViewIndex = 0;
|
||||
_histories.NavigateTo(sha);
|
||||
_histories?.NavigateTo(sha);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -76,6 +76,19 @@ namespace SourceGit.ViewModels
|
||||
set => SetProperty(ref _httpProxy, value);
|
||||
}
|
||||
|
||||
public string ConventionalTypesOverride
|
||||
{
|
||||
get => _repo.Settings.ConventionalTypesOverride;
|
||||
set
|
||||
{
|
||||
if (_repo.Settings.ConventionalTypesOverride != value)
|
||||
{
|
||||
_repo.Settings.ConventionalTypesOverride = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool EnablePruneOnFetch
|
||||
{
|
||||
get;
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
namespace SourceGit.ViewModels
|
||||
@@ -62,6 +64,12 @@ namespace SourceGit.ViewModels
|
||||
set;
|
||||
} = 0;
|
||||
|
||||
public Models.RepositoryStatus Status
|
||||
{
|
||||
get => _status;
|
||||
set => SetProperty(ref _status, value);
|
||||
}
|
||||
|
||||
public List<RepositoryNode> SubNodes
|
||||
{
|
||||
get;
|
||||
@@ -122,11 +130,53 @@ namespace SourceGit.ViewModels
|
||||
activePage.Popup = new DeleteRepositoryNode(this);
|
||||
}
|
||||
|
||||
public async Task UpdateStatusAsync(bool force, CancellationToken? token)
|
||||
{
|
||||
if (token is { IsCancellationRequested: true })
|
||||
return;
|
||||
|
||||
if (!_isRepository)
|
||||
{
|
||||
Status = null;
|
||||
|
||||
if (SubNodes.Count > 0)
|
||||
{
|
||||
// avoid collection was modified while enumerating.
|
||||
var nodes = new List<RepositoryNode>();
|
||||
nodes.AddRange(SubNodes);
|
||||
|
||||
foreach (var node in nodes)
|
||||
await node.UpdateStatusAsync(force, token);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Directory.Exists(_id))
|
||||
{
|
||||
_lastUpdateStatus = DateTime.Now;
|
||||
Status = null;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!force)
|
||||
{
|
||||
var passed = DateTime.Now - _lastUpdateStatus;
|
||||
if (passed.TotalSeconds < 10.0)
|
||||
return;
|
||||
}
|
||||
|
||||
_lastUpdateStatus = DateTime.Now;
|
||||
Status = await new Commands.QueryRepositoryStatus(_id).GetResultAsync();
|
||||
}
|
||||
|
||||
private string _id = string.Empty;
|
||||
private string _name = string.Empty;
|
||||
private bool _isRepository = false;
|
||||
private int _bookmark = 0;
|
||||
private bool _isExpanded = false;
|
||||
private bool _isVisible = true;
|
||||
private Models.RepositoryStatus _status = null;
|
||||
private DateTime _lastUpdateStatus = DateTime.UnixEpoch.ToLocalTime();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,14 +127,11 @@ namespace SourceGit.ViewModels
|
||||
return Native.OS.GetAbsPath(_repo, path);
|
||||
}
|
||||
|
||||
public void SaveAsPatch(string saveTo)
|
||||
public async Task SaveChangesAsPatchAsync(List<Models.Change> changes, string saveTo)
|
||||
{
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var succ = await Commands.SaveChangesAsPatch.ProcessRevisionCompareChangesAsync(_repo, _changes, GetSHA(_startPoint), GetSHA(_endPoint), saveTo);
|
||||
if (succ)
|
||||
App.SendNotification(_repo, App.Text("SaveAsPatchSuccess"));
|
||||
});
|
||||
var succ = await Commands.SaveChangesAsPatch.ProcessRevisionCompareChangesAsync(_repo, changes ?? _changes, GetSHA(_startPoint), GetSHA(_endPoint), saveTo);
|
||||
if (succ)
|
||||
App.SendNotification(_repo, App.Text("SaveAsPatchSuccess"));
|
||||
}
|
||||
|
||||
public void ClearSearchFilter()
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@@ -25,7 +24,6 @@ namespace SourceGit.ViewModels
|
||||
get;
|
||||
}
|
||||
|
||||
[Required(ErrorMessage = "Scan directory is required!!!")]
|
||||
public Models.ScanDir Selected
|
||||
{
|
||||
get => _selected;
|
||||
@@ -53,11 +51,26 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
var selectedDir = _useCustomDir ? _customDir : _selected?.Path;
|
||||
if (string.IsNullOrEmpty(selectedDir))
|
||||
string selectedDir;
|
||||
if (_useCustomDir)
|
||||
{
|
||||
App.RaiseException(null, "Missing root directory to scan!");
|
||||
return false;
|
||||
if (string.IsNullOrEmpty(_customDir))
|
||||
{
|
||||
App.RaiseException(null, "Missing root directory to scan!");
|
||||
return false;
|
||||
}
|
||||
|
||||
selectedDir = _customDir;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_selected == null || string.IsNullOrEmpty(_selected.Path))
|
||||
{
|
||||
App.RaiseException(null, "Missing root directory to scan!");
|
||||
return false;
|
||||
}
|
||||
|
||||
selectedDir = _selected.Path;
|
||||
}
|
||||
|
||||
if (!Directory.Exists(selectedDir))
|
||||
@@ -84,13 +97,15 @@ namespace SourceGit.ViewModels
|
||||
var parent = new DirectoryInfo(f).Parent!.FullName.Replace('\\', '/').TrimEnd('/');
|
||||
if (parent.Equals(normalizedRoot, StringComparison.Ordinal))
|
||||
{
|
||||
Preferences.Instance.FindOrAddNodeByRepositoryPath(f, null, false, false);
|
||||
var node = Preferences.Instance.FindOrAddNodeByRepositoryPath(f, null, false, false);
|
||||
await node.UpdateStatusAsync(false, null);
|
||||
}
|
||||
else if (parent.StartsWith(normalizedRoot, StringComparison.Ordinal))
|
||||
{
|
||||
var relative = parent.Substring(normalizedRoot.Length).TrimStart('/');
|
||||
var group = FindOrCreateGroupRecursive(Preferences.Instance.RepositoryNodes, relative);
|
||||
Preferences.Instance.FindOrAddNodeByRepositoryPath(f, group, false, false);
|
||||
var node = Preferences.Instance.FindOrAddNodeByRepositoryPath(f, group, false, false);
|
||||
await node.UpdateStatusAsync(false, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -158,7 +158,7 @@ namespace SourceGit.ViewModels
|
||||
_repo.ShowPopup(new DropStash(_repo, stash));
|
||||
}
|
||||
|
||||
public async Task SaveStashAsPathAsync(Models.Stash stash, string saveTo)
|
||||
public async Task SaveStashAsPatchAsync(Models.Stash stash, string saveTo)
|
||||
{
|
||||
var opts = new List<Models.DiffOption>();
|
||||
var changes = await new Commands.CompareRevisions(_repo.FullPath, $"{stash.SHA}^", stash.SHA)
|
||||
@@ -211,6 +211,42 @@ namespace SourceGit.ViewModels
|
||||
log.Complete();
|
||||
}
|
||||
|
||||
public async Task CheckoutMultipleFileAsync(List<Models.Change> changes)
|
||||
{
|
||||
var untracked = new List<string>();
|
||||
var added = new List<string>();
|
||||
var modified = new List<string>();
|
||||
|
||||
foreach (var c in changes)
|
||||
{
|
||||
if (_untracked.Contains(c) && _selectedStash.Parents.Count == 3)
|
||||
untracked.Add(c.Path);
|
||||
else if (c.Index == Models.ChangeState.Added && _selectedStash.Parents.Count > 1)
|
||||
added.Add(c.Path);
|
||||
else
|
||||
modified.Add(c.Path);
|
||||
}
|
||||
|
||||
var log = _repo.CreateLog($"Reset File to '{_selectedStash.Name}'");
|
||||
|
||||
if (untracked.Count > 0)
|
||||
await new Commands.Checkout(_repo.FullPath)
|
||||
.Use(log)
|
||||
.MultipleFilesWithRevisionAsync(untracked, _selectedStash.Parents[2]);
|
||||
|
||||
if (added.Count > 0)
|
||||
await new Commands.Checkout(_repo.FullPath)
|
||||
.Use(log)
|
||||
.MultipleFilesWithRevisionAsync(added, _selectedStash.Parents[1]);
|
||||
|
||||
if (modified.Count > 0)
|
||||
await new Commands.Checkout(_repo.FullPath)
|
||||
.Use(log)
|
||||
.MultipleFilesWithRevisionAsync(modified, _selectedStash.SHA);
|
||||
|
||||
log.Complete();
|
||||
}
|
||||
|
||||
private void RefreshVisible()
|
||||
{
|
||||
if (string.IsNullOrEmpty(_searchFilter))
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Avalonia.Collections;
|
||||
@@ -52,6 +53,23 @@ namespace SourceGit.ViewModels
|
||||
Rows.AddRange(rows);
|
||||
}
|
||||
|
||||
public async Task UpdateStatusAsync(bool force, CancellationToken? token)
|
||||
{
|
||||
if (_isUpdatingStatus)
|
||||
return;
|
||||
|
||||
_isUpdatingStatus = true;
|
||||
|
||||
// avoid collection was modified while enumerating.
|
||||
var nodes = new List<RepositoryNode>();
|
||||
nodes.AddRange(Preferences.Instance.RepositoryNodes);
|
||||
|
||||
foreach (var node in nodes)
|
||||
await node.UpdateStatusAsync(force, token);
|
||||
|
||||
_isUpdatingStatus = false;
|
||||
}
|
||||
|
||||
public void ToggleNodeIsExpanded(RepositoryNode node)
|
||||
{
|
||||
node.IsExpanded = !node.IsExpanded;
|
||||
@@ -123,9 +141,11 @@ namespace SourceGit.ViewModels
|
||||
activePage.Popup = new Init(activePage.Node.Id, path, parent, reason);
|
||||
}
|
||||
|
||||
public void AddRepository(string path, RepositoryNode parent, bool moveNode, bool open)
|
||||
public async Task AddRepositoryAsync(string path, RepositoryNode parent, bool moveNode, bool open)
|
||||
{
|
||||
var node = Preferences.Instance.FindOrAddNodeByRepositoryPath(path, parent, moveNode);
|
||||
await node.UpdateStatusAsync(false, null);
|
||||
|
||||
if (open)
|
||||
node.Open();
|
||||
}
|
||||
@@ -270,5 +290,6 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
|
||||
private string _searchFilter = string.Empty;
|
||||
private bool _isUpdatingStatus = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -769,43 +769,49 @@ namespace SourceGit.ViewModels
|
||||
|
||||
private void UpdateInProgressState()
|
||||
{
|
||||
if (string.IsNullOrEmpty(_commitMessage))
|
||||
{
|
||||
var mergeMsgFile = Path.Combine(_repo.GitDir, "MERGE_MSG");
|
||||
if (File.Exists(mergeMsgFile))
|
||||
CommitMessage = File.ReadAllText(mergeMsgFile);
|
||||
}
|
||||
var oldType = _inProgressContext != null ? _inProgressContext.GetType() : null;
|
||||
|
||||
if (File.Exists(Path.Combine(_repo.GitDir, "CHERRY_PICK_HEAD")))
|
||||
{
|
||||
InProgressContext = new CherryPickInProgress(_repo);
|
||||
}
|
||||
else if (Directory.Exists(Path.Combine(_repo.GitDir, "rebase-merge")) || Directory.Exists(Path.Combine(_repo.GitDir, "rebase-apply")))
|
||||
{
|
||||
var rebasing = new RebaseInProgress(_repo);
|
||||
InProgressContext = rebasing;
|
||||
|
||||
if (string.IsNullOrEmpty(_commitMessage))
|
||||
{
|
||||
var rebaseMsgFile = Path.Combine(_repo.GitDir, "rebase-merge", "message");
|
||||
if (File.Exists(rebaseMsgFile))
|
||||
CommitMessage = File.ReadAllText(rebaseMsgFile);
|
||||
else if (rebasing.StoppedAt != null)
|
||||
CommitMessage = new Commands.QueryCommitFullMessage(_repo.FullPath, rebasing.StoppedAt.SHA).GetResult();
|
||||
}
|
||||
}
|
||||
InProgressContext = new RebaseInProgress(_repo);
|
||||
else if (File.Exists(Path.Combine(_repo.GitDir, "REVERT_HEAD")))
|
||||
{
|
||||
InProgressContext = new RevertInProgress(_repo);
|
||||
}
|
||||
else if (File.Exists(Path.Combine(_repo.GitDir, "MERGE_HEAD")))
|
||||
{
|
||||
InProgressContext = new MergeInProgress(_repo);
|
||||
}
|
||||
else
|
||||
{
|
||||
InProgressContext = null;
|
||||
}
|
||||
|
||||
if (_inProgressContext == null)
|
||||
return;
|
||||
|
||||
if (_inProgressContext.GetType() == oldType && !string.IsNullOrEmpty(_commitMessage))
|
||||
return;
|
||||
|
||||
do
|
||||
{
|
||||
if (LoadCommitMessageFromFile(Path.Combine(_repo.GitDir, "MERGE_MSG")))
|
||||
break;
|
||||
|
||||
if (LoadCommitMessageFromFile(Path.Combine(_repo.GitDir, "rebase-merge", "message")))
|
||||
break;
|
||||
|
||||
if (_inProgressContext is RebaseInProgress { StoppedAt: { } stopAt })
|
||||
CommitMessage = new Commands.QueryCommitFullMessage(_repo.FullPath, stopAt.SHA).GetResult();
|
||||
} while (false);
|
||||
}
|
||||
|
||||
private bool LoadCommitMessageFromFile(string file)
|
||||
{
|
||||
if (!File.Exists(file))
|
||||
return false;
|
||||
|
||||
var msg = File.ReadAllText(file).Trim();
|
||||
if (string.IsNullOrEmpty(msg))
|
||||
return false;
|
||||
|
||||
CommitMessage = msg;
|
||||
return true;
|
||||
}
|
||||
|
||||
private void SetDetail(Models.Change change, bool isUnstaged)
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
namespace SourceGit.ViewModels
|
||||
{
|
||||
public class WorkspaceSwitcher : ObservableObject, IDisposable
|
||||
{
|
||||
public List<Workspace> VisibleWorkspaces
|
||||
{
|
||||
get => _visibleWorkspaces;
|
||||
private set => SetProperty(ref _visibleWorkspaces, value);
|
||||
}
|
||||
|
||||
public string SearchFilter
|
||||
{
|
||||
get => _searchFilter;
|
||||
set
|
||||
{
|
||||
if (SetProperty(ref _searchFilter, value))
|
||||
UpdateVisibleWorkspaces();
|
||||
}
|
||||
}
|
||||
|
||||
public Workspace SelectedWorkspace
|
||||
{
|
||||
get => _selectedWorkspace;
|
||||
set => SetProperty(ref _selectedWorkspace, value);
|
||||
}
|
||||
|
||||
public WorkspaceSwitcher(Launcher launcher)
|
||||
{
|
||||
_launcher = launcher;
|
||||
UpdateVisibleWorkspaces();
|
||||
}
|
||||
|
||||
public void ClearFilter()
|
||||
{
|
||||
SearchFilter = string.Empty;
|
||||
}
|
||||
|
||||
public void Switch()
|
||||
{
|
||||
_launcher.SwitchWorkspace(_selectedWorkspace);
|
||||
_launcher.CancelSwitcher();
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_visibleWorkspaces.Clear();
|
||||
_selectedWorkspace = null;
|
||||
_searchFilter = string.Empty;
|
||||
}
|
||||
|
||||
private void UpdateVisibleWorkspaces()
|
||||
{
|
||||
var visible = new List<Workspace>();
|
||||
if (string.IsNullOrEmpty(_searchFilter))
|
||||
{
|
||||
visible.AddRange(Preferences.Instance.Workspaces);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var workspace in Preferences.Instance.Workspaces)
|
||||
{
|
||||
if (workspace.Name.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase))
|
||||
visible.Add(workspace);
|
||||
}
|
||||
}
|
||||
|
||||
VisibleWorkspaces = visible;
|
||||
SelectedWorkspace = visible.Count == 0 ? null : visible[0];
|
||||
}
|
||||
|
||||
private Launcher _launcher = null;
|
||||
private List<Workspace> _visibleWorkspaces = null;
|
||||
private string _searchFilter = string.Empty;
|
||||
private Workspace _selectedWorkspace = null;
|
||||
}
|
||||
}
|
||||
@@ -52,7 +52,7 @@
|
||||
Cursor="Hand"
|
||||
PointerPressed="OnVisitReleaseNotes"
|
||||
ToolTip.Tip="{DynamicResource Text.About.ReleaseNotes}">
|
||||
<TextBlock x:Name="TxtVersion" Classes="primary" Margin="8,0" FontSize="12" Foreground="White"/>
|
||||
<TextBlock x:Name="TxtVersion" Margin="8,0" FontSize="12" Foreground="White"/>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
<TextBlock Grid.Column="1" Text="{Binding File, Mode=OneWay}" VerticalAlignment="Center"/>
|
||||
|
||||
<Border Grid.Column="2" Height="16" Background="{Binding Brush}" CornerRadius="8" VerticalAlignment="Center">
|
||||
<TextBlock Classes="primary" Text="{Binding Desc}" Margin="8,0" FontSize="10" Foreground="White"/>
|
||||
<TextBlock Text="{Binding Desc}" Margin="8,0" FontSize="10" Foreground="White"/>
|
||||
</Border>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
HorizontalAlignment="Left" VerticalAlignment="Center"
|
||||
Data="{StaticResource Icons.Stashes}"/>
|
||||
|
||||
<TextBlock Grid.Column="1" VerticalAlignment="Center" Classes="primary" Text="{Binding Stash.Name}" Foreground="DarkOrange"/>
|
||||
<TextBlock Grid.Column="1" VerticalAlignment="Center" Text="{Binding Stash.Name}" Foreground="DarkOrange"/>
|
||||
<TextBlock Grid.Column="2" VerticalAlignment="Center" Text="{Binding Stash.Subject}" TextTrimming="CharacterEllipsis" Margin="4,0,0,0"/>
|
||||
</Grid>
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
<DataTemplate DataType="m:Commit">
|
||||
<Grid ColumnDefinitions="Auto,Auto,*">
|
||||
<Path Grid.Column="0" Width="14" Height="14" Data="{StaticResource Icons.Commit}"/>
|
||||
<TextBlock Grid.Column="1" Classes="primary" VerticalAlignment="Center" Text="{Binding SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="1" VerticalAlignment="Center" Text="{Binding SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="2" VerticalAlignment="Center" Text="{Binding Subject}" Margin="4,0,0,0" TextTrimming="CharacterEllipsis"/>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
<!-- File -->
|
||||
<Border Grid.Row="1" Padding="8,0" >
|
||||
<Grid ColumnDefinitions="Auto,*,Auto,Auto,400">
|
||||
<Grid ColumnDefinitions="Auto,*,Auto,Auto,400,Auto">
|
||||
<Path Grid.Column="0"
|
||||
Width="14" Height="14"
|
||||
Data="{StaticResource Icons.File}"/>
|
||||
@@ -76,6 +76,15 @@
|
||||
TextTrimming="CharacterEllipsis"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<Button Grid.Column="5"
|
||||
Classes="icon_button"
|
||||
IsEnabled="{Binding PrevRevision, Converter={x:Static ObjectConverters.IsNotNull}}"
|
||||
Width="18" Margin="4,0,0,0"
|
||||
Command="{Binding GotoPrevRevision}"
|
||||
ToolTip.Tip="{DynamicResource Text.Blame.BlameOnPreviousRevision}">
|
||||
<Path Width="12" Height="12" Data="{StaticResource Icons.GotoParent}"/>
|
||||
</Button>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
@@ -107,7 +116,7 @@
|
||||
HorizontalAlignment="Center" VerticalAlignment="Center"
|
||||
IsVisible="{Binding IsBinary}">
|
||||
<Path Width="64" Height="64" Fill="{DynamicResource Brush.FG2}" Data="{StaticResource Icons.Error}"/>
|
||||
<TextBlock Margin="0,16,0,0" FontSize="18" FontWeight="Bold" HorizontalAlignment="Center" Foreground="{DynamicResource Brush.FG2}" Text="{DynamicResource Text.BlameTypeNotSupported}"/>
|
||||
<TextBlock Margin="0,16,0,0" FontSize="18" FontWeight="Bold" HorizontalAlignment="Center" Foreground="{DynamicResource Brush.FG2}" Text="{DynamicResource Text.Blame.TypeNotSupported}"/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Loading -->
|
||||
|
||||
@@ -46,15 +46,15 @@
|
||||
VerticalAlignment="Center"
|
||||
IsHitTestVisible="False"
|
||||
User="{Binding BaseHead.Author}"/>
|
||||
<TextBlock Grid.Column="1" Classes="primary" Text="{Binding BaseHead.Author.Name}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="1" Text="{Binding BaseHead.Author.Name}" Margin="8,0,0,0"/>
|
||||
<Border Grid.Column="2" Background="{DynamicResource Brush.Accent}" CornerRadius="4">
|
||||
<TextBlock Text="{Binding Base.FriendlyName}" Classes="primary" Margin="4,0" Foreground="#FFDDDDDD"/>
|
||||
<TextBlock Text="{Binding Base.FriendlyName}" Margin="4,0" Foreground="#FFDDDDDD"/>
|
||||
</Border>
|
||||
<TextBlock Grid.Column="3" Classes="primary" Text="{Binding BaseHead.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange" Margin="8,0,0,0" TextDecorations="Underline" Cursor="Hand" PointerPressed="OnPressedSHA"/>
|
||||
<TextBlock Grid.Column="4" Classes="primary" Text="{Binding BaseHead.CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="3" Text="{Binding BaseHead.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange" Margin="8,0,0,0" TextDecorations="Underline" Cursor="Hand" PointerPressed="OnPressedSHA"/>
|
||||
<TextBlock Grid.Column="4" Text="{Binding BaseHead.CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
|
||||
</Grid>
|
||||
|
||||
<TextBlock Grid.Row="1" Classes="primary" Text="{Binding BaseHead.Subject}" VerticalAlignment="Bottom"/>
|
||||
<TextBlock Grid.Row="1" Text="{Binding BaseHead.Subject}" VerticalAlignment="Bottom"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
@@ -70,15 +70,15 @@
|
||||
VerticalAlignment="Center"
|
||||
IsHitTestVisible="False"
|
||||
User="{Binding ToHead.Author}"/>
|
||||
<TextBlock Grid.Column="1" Classes="primary" Text="{Binding ToHead.Author.Name}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="1" Text="{Binding ToHead.Author.Name}" Margin="8,0,0,0"/>
|
||||
<Border Grid.Column="2" Background="{DynamicResource Brush.Accent}" CornerRadius="4">
|
||||
<TextBlock Text="{Binding To.FriendlyName}" Classes="primary" Margin="4,0" Foreground="#FFDDDDDD"/>
|
||||
<TextBlock Text="{Binding To.FriendlyName}" Margin="4,0" Foreground="#FFDDDDDD"/>
|
||||
</Border>
|
||||
<TextBlock Grid.Column="3" Classes="primary" Text="{Binding ToHead.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange" Margin="8,0,0,0" TextDecorations="Underline" Cursor="Hand" PointerPressed="OnPressedSHA"/>
|
||||
<TextBlock Grid.Column="4" Classes="primary" Text="{Binding ToHead.CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="3" Text="{Binding ToHead.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange" Margin="8,0,0,0" TextDecorations="Underline" Cursor="Hand" PointerPressed="OnPressedSHA"/>
|
||||
<TextBlock Grid.Column="4" Text="{Binding ToHead.CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
|
||||
</Grid>
|
||||
|
||||
<TextBlock Grid.Row="1" Classes="primary" Text="{Binding ToHead.Subject}" VerticalAlignment="Bottom"/>
|
||||
<TextBlock Grid.Row="1" Text="{Binding ToHead.Subject}" VerticalAlignment="Bottom"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
</Grid>
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Platform.Storage;
|
||||
|
||||
namespace SourceGit.Views
|
||||
{
|
||||
@@ -15,61 +17,127 @@ namespace SourceGit.Views
|
||||
|
||||
private void OnChangeContextRequested(object sender, ContextRequestedEventArgs e)
|
||||
{
|
||||
if (DataContext is ViewModels.BranchCompare { SelectedChanges: { Count: 1 } selected } vm &&
|
||||
if (DataContext is ViewModels.BranchCompare { SelectedChanges: { Count: > 0 } selected } vm &&
|
||||
sender is ChangeCollectionView view)
|
||||
{
|
||||
var repo = vm.RepositoryPath;
|
||||
var change = selected[0];
|
||||
var menu = new ContextMenu();
|
||||
var repo = vm.RepositoryPath;
|
||||
|
||||
var openWithMerger = new MenuItem();
|
||||
openWithMerger.Header = App.Text("OpenInExternalMergeTool");
|
||||
openWithMerger.Icon = App.CreateMenuIcon("Icons.OpenWith");
|
||||
openWithMerger.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+D" : "Ctrl+Shift+D";
|
||||
openWithMerger.Click += (_, ev) =>
|
||||
var patch = new MenuItem();
|
||||
patch.Header = App.Text("FileCM.SaveAsPatch");
|
||||
patch.Icon = App.CreateMenuIcon("Icons.Diff");
|
||||
patch.Click += async (_, e) =>
|
||||
{
|
||||
new Commands.DiffTool(repo, new Models.DiffOption(vm.Base.Head, vm.To.Head, change)).Open();
|
||||
ev.Handled = true;
|
||||
};
|
||||
menu.Items.Add(openWithMerger);
|
||||
var storageProvider = this.StorageProvider;
|
||||
if (storageProvider == null)
|
||||
return;
|
||||
|
||||
if (change.Index != Models.ChangeState.Deleted)
|
||||
{
|
||||
var full = Path.GetFullPath(Path.Combine(repo, change.Path));
|
||||
var explore = new MenuItem();
|
||||
explore.Header = App.Text("RevealFile");
|
||||
explore.Icon = App.CreateMenuIcon("Icons.Explore");
|
||||
explore.IsEnabled = File.Exists(full);
|
||||
explore.Click += (_, ev) =>
|
||||
var options = new FilePickerSaveOptions();
|
||||
options.Title = App.Text("FileCM.SaveAsPatch");
|
||||
options.DefaultExtension = ".patch";
|
||||
options.FileTypeChoices = [new FilePickerFileType("Patch File") { Patterns = ["*.patch"] }];
|
||||
|
||||
var storageFile = await storageProvider.SaveFilePickerAsync(options);
|
||||
if (storageFile != null)
|
||||
{
|
||||
Native.OS.OpenInFileManager(full, true);
|
||||
var saveTo = storageFile.Path.LocalPath;
|
||||
await vm.SaveChangesAsPatchAsync(selected, saveTo);
|
||||
}
|
||||
|
||||
e.Handled = true;
|
||||
};
|
||||
|
||||
if (selected.Count == 1)
|
||||
{
|
||||
var change = selected[0];
|
||||
var openWithMerger = new MenuItem();
|
||||
openWithMerger.Header = App.Text("OpenInExternalMergeTool");
|
||||
openWithMerger.Icon = App.CreateMenuIcon("Icons.OpenWith");
|
||||
openWithMerger.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+D" : "Ctrl+Shift+D";
|
||||
openWithMerger.Click += (_, ev) =>
|
||||
{
|
||||
new Commands.DiffTool(repo, new Models.DiffOption(vm.Base.Head, vm.To.Head, change)).Open();
|
||||
ev.Handled = true;
|
||||
};
|
||||
menu.Items.Add(explore);
|
||||
menu.Items.Add(openWithMerger);
|
||||
|
||||
if (change.Index != Models.ChangeState.Deleted)
|
||||
{
|
||||
var full = Path.GetFullPath(Path.Combine(repo, change.Path));
|
||||
var explore = new MenuItem();
|
||||
explore.Header = App.Text("RevealFile");
|
||||
explore.Icon = App.CreateMenuIcon("Icons.Explore");
|
||||
explore.IsEnabled = File.Exists(full);
|
||||
explore.Click += (_, ev) =>
|
||||
{
|
||||
Native.OS.OpenInFileManager(full, true);
|
||||
ev.Handled = true;
|
||||
};
|
||||
menu.Items.Add(explore);
|
||||
}
|
||||
|
||||
var copyPath = new MenuItem();
|
||||
copyPath.Header = App.Text("CopyPath");
|
||||
copyPath.Icon = App.CreateMenuIcon("Icons.Copy");
|
||||
copyPath.Tag = OperatingSystem.IsMacOS() ? "⌘+C" : "Ctrl+C";
|
||||
copyPath.Click += async (_, ev) =>
|
||||
{
|
||||
await App.CopyTextAsync(change.Path);
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
var copyFullPath = new MenuItem();
|
||||
copyFullPath.Header = App.Text("CopyFullPath");
|
||||
copyFullPath.Icon = App.CreateMenuIcon("Icons.Copy");
|
||||
copyFullPath.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+C" : "Ctrl+Shift+C";
|
||||
copyFullPath.Click += async (_, ev) =>
|
||||
{
|
||||
await App.CopyTextAsync(Native.OS.GetAbsPath(repo, change.Path));
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
menu.Items.Add(patch);
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
menu.Items.Add(copyPath);
|
||||
menu.Items.Add(copyFullPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
var copyPath = new MenuItem();
|
||||
copyPath.Header = App.Text("CopyPath");
|
||||
copyPath.Icon = App.CreateMenuIcon("Icons.Copy");
|
||||
copyPath.Tag = OperatingSystem.IsMacOS() ? "⌘+C" : "Ctrl+C";
|
||||
copyPath.Click += async (_, ev) =>
|
||||
{
|
||||
var builder = new StringBuilder();
|
||||
foreach (var c in selected)
|
||||
builder.AppendLine(c.Path);
|
||||
|
||||
await App.CopyTextAsync(builder.ToString());
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
var copyFullPath = new MenuItem();
|
||||
copyFullPath.Header = App.Text("CopyFullPath");
|
||||
copyFullPath.Icon = App.CreateMenuIcon("Icons.Copy");
|
||||
copyFullPath.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+C" : "Ctrl+Shift+C";
|
||||
copyFullPath.Click += async (_, ev) =>
|
||||
{
|
||||
var builder = new StringBuilder();
|
||||
foreach (var c in selected)
|
||||
builder.AppendLine(Native.OS.GetAbsPath(repo, c.Path));
|
||||
|
||||
await App.CopyTextAsync(builder.ToString());
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
menu.Items.Add(patch);
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
menu.Items.Add(copyPath);
|
||||
menu.Items.Add(copyFullPath);
|
||||
}
|
||||
|
||||
var copyPath = new MenuItem();
|
||||
copyPath.Header = App.Text("CopyPath");
|
||||
copyPath.Icon = App.CreateMenuIcon("Icons.Copy");
|
||||
copyPath.Tag = OperatingSystem.IsMacOS() ? "⌘+C" : "Ctrl+C";
|
||||
copyPath.Click += async (_, ev) =>
|
||||
{
|
||||
await App.CopyTextAsync(change.Path);
|
||||
ev.Handled = true;
|
||||
};
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
menu.Items.Add(copyPath);
|
||||
|
||||
var copyFullPath = new MenuItem();
|
||||
copyFullPath.Header = App.Text("CopyFullPath");
|
||||
copyFullPath.Icon = App.CreateMenuIcon("Icons.Copy");
|
||||
copyFullPath.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+C" : "Ctrl+Shift+C";
|
||||
copyFullPath.Click += async (_, ev) =>
|
||||
{
|
||||
await App.CopyTextAsync(Native.OS.GetAbsPath(repo, change.Path));
|
||||
ev.Handled = true;
|
||||
};
|
||||
menu.Items.Add(copyFullPath);
|
||||
menu.Open(view);
|
||||
}
|
||||
|
||||
@@ -89,17 +157,24 @@ namespace SourceGit.Views
|
||||
if (DataContext is not ViewModels.BranchCompare vm)
|
||||
return;
|
||||
|
||||
if (sender is not ChangeCollectionView { SelectedChanges: { Count: 1 } selectedChanges })
|
||||
if (sender is not ChangeCollectionView { SelectedChanges: { Count: > 0 } selectedChanges })
|
||||
return;
|
||||
|
||||
var change = selectedChanges[0];
|
||||
if (e.KeyModifiers.HasFlag(OperatingSystem.IsMacOS() ? KeyModifiers.Meta : KeyModifiers.Control) && e.Key == Key.C)
|
||||
{
|
||||
if (e.KeyModifiers.HasFlag(KeyModifiers.Shift))
|
||||
await App.CopyTextAsync(vm.GetAbsPath(change.Path));
|
||||
var builder = new StringBuilder();
|
||||
var copyAbsPath = e.KeyModifiers.HasFlag(KeyModifiers.Shift);
|
||||
if (selectedChanges.Count == 1)
|
||||
{
|
||||
builder.Append(copyAbsPath ? vm.GetAbsPath(selectedChanges[0].Path) : selectedChanges[0].Path);
|
||||
}
|
||||
else
|
||||
await App.CopyTextAsync(change.Path);
|
||||
{
|
||||
foreach (var c in selectedChanges)
|
||||
builder.AppendLine(copyAbsPath ? vm.GetAbsPath(c.Path) : c.Path);
|
||||
}
|
||||
|
||||
await App.CopyTextAsync(builder.ToString());
|
||||
e.Handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
<Path Width="12" Height="12" Data="{StaticResource Icons.Branch}"/>
|
||||
<TextBlock FontWeight="Bold" VerticalAlignment="Center" Margin="4,0,0,0" Text="{Binding FriendlyName}"/>
|
||||
<Border Background="Green" Margin="4,0,0,0" CornerRadius="4" VerticalAlignment="Center" IsVisible="{Binding !IsLocal}">
|
||||
<TextBlock Text="{DynamicResource Text.BranchTree.Remote}" FontSize="12" Classes="primary" Margin="4,0" Foreground="White" VerticalAlignment="Center"/>
|
||||
<TextBlock Text="{DynamicResource Text.BranchTree.Remote}" FontSize="12" Margin="4,0" Foreground="White" VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
</TextBlock>
|
||||
|
||||
<Border Background="OrangeRed" Margin="4,0,0,0" CornerRadius="4" VerticalAlignment="Center" IsVisible="{Binding IsUpstreamGone}">
|
||||
<TextBlock Text="{DynamicResource Text.BranchTree.InvalidUpstream}" FontSize="12" Classes="primary" Margin="4,1" Foreground="White" VerticalAlignment="Center"/>
|
||||
<TextBlock Text="{DynamicResource Text.BranchTree.InvalidUpstream}" FontSize="12" Margin="4,1" Foreground="White" VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
|
||||
@@ -133,7 +133,6 @@
|
||||
|
||||
<!-- Name -->
|
||||
<TextBlock Grid.Column="1"
|
||||
Classes="primary"
|
||||
FontWeight="{Binding IsCurrent, Converter={x:Static c:BoolConverters.IsBoldToFontWeight}}"
|
||||
TextTrimming="CharacterEllipsis">
|
||||
<Run Text="{Binding Name}"/>
|
||||
|
||||
@@ -842,6 +842,24 @@ namespace SourceGit.Views
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
menu.Items.Add(createBranch);
|
||||
menu.Items.Add(createTag);
|
||||
|
||||
if (upstream != null)
|
||||
{
|
||||
var remote = repo.Remotes.Find(x => x.Name.Equals(upstream.Remote, StringComparison.Ordinal));
|
||||
if (remote != null && remote.TryGetCreatePullRequestURL(out var prURL, upstream.Name))
|
||||
{
|
||||
var createPR = new MenuItem();
|
||||
createPR.Header = App.Text("BranchCM.CreatePRForUpstream", upstream.FriendlyName);
|
||||
createPR.Icon = App.CreateMenuIcon("Icons.CreatePR");
|
||||
createPR.Click += (_, e) =>
|
||||
{
|
||||
Native.OS.OpenBrowser(prURL);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
||||
menu.Items.Add(createPR);
|
||||
}
|
||||
}
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
TryToAddCustomActionsToBranchContextMenu(repo, menu, branch);
|
||||
|
||||
@@ -1060,6 +1078,9 @@ namespace SourceGit.Views
|
||||
e.Handled = true;
|
||||
};
|
||||
|
||||
menu.Items.Add(delete);
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
|
||||
var createBranch = new MenuItem();
|
||||
createBranch.Icon = App.CreateMenuIcon("Icons.Branch.Add");
|
||||
createBranch.Header = App.Text("CreateBranch");
|
||||
@@ -1080,6 +1101,26 @@ namespace SourceGit.Views
|
||||
e.Handled = true;
|
||||
};
|
||||
|
||||
menu.Items.Add(createBranch);
|
||||
menu.Items.Add(createTag);
|
||||
|
||||
var remote = repo.Remotes.Find(x => x.Name.Equals(branch.Remote, StringComparison.Ordinal));
|
||||
if (remote != null && remote.TryGetCreatePullRequestURL(out var prURL, branch.Name))
|
||||
{
|
||||
var createPR = new MenuItem();
|
||||
createPR.Header = App.Text("BranchCM.CreatePR");
|
||||
createPR.Icon = App.CreateMenuIcon("Icons.CreatePR");
|
||||
createPR.Click += (_, e) =>
|
||||
{
|
||||
Native.OS.OpenBrowser(prURL);
|
||||
e.Handled = true;
|
||||
};
|
||||
|
||||
menu.Items.Add(createPR);
|
||||
}
|
||||
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
|
||||
var archive = new MenuItem();
|
||||
archive.Icon = App.CreateMenuIcon("Icons.Archive");
|
||||
archive.Header = App.Text("Archive");
|
||||
@@ -1099,16 +1140,10 @@ namespace SourceGit.Views
|
||||
e.Handled = true;
|
||||
};
|
||||
|
||||
menu.Items.Add(delete);
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
menu.Items.Add(createBranch);
|
||||
menu.Items.Add(createTag);
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
menu.Items.Add(archive);
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
TryToAddCustomActionsToBranchContextMenu(repo, menu, branch);
|
||||
menu.Items.Add(copy);
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<v:ChangeCollectionContainer Focusable="True"
|
||||
ItemsSource="{Binding Rows}"
|
||||
SelectedItems="{Binding SelectedRows, Mode=TwoWay}"
|
||||
SelectionMode="{Binding #ThisControl.SelectionMode}"
|
||||
SelectionMode="Multiple"
|
||||
SelectionChanged="OnRowSelectionChanged">
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate DataType="vm:ChangeTreeNode">
|
||||
@@ -65,8 +65,8 @@
|
||||
IsVisible="{Binding !IsFolder}"/>
|
||||
|
||||
<StackPanel Grid.Column="2" Orientation="Horizontal" Margin="4,0,0,0">
|
||||
<TextBlock Classes="primary" Text="{Binding ConflictMarker, Mode=OneWay}" Foreground="DarkOrange" FontWeight="Bold" Margin="0,0,4,0" IsVisible="{Binding ShowConflictMarker}"/>
|
||||
<TextBlock Classes="primary" Text="{Binding DisplayName, Mode=OneWay}"/>
|
||||
<TextBlock Text="{Binding ConflictMarker, Mode=OneWay}" Foreground="DarkOrange" FontWeight="Bold" Margin="0,0,4,0" IsVisible="{Binding ShowConflictMarker}"/>
|
||||
<TextBlock Text="{Binding DisplayName, Mode=OneWay}"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
@@ -78,7 +78,7 @@
|
||||
<v:ChangeCollectionContainer Focusable="True"
|
||||
ItemsSource="{Binding Changes}"
|
||||
SelectedItems="{Binding SelectedChanges, Mode=TwoWay}"
|
||||
SelectionMode="{Binding #ThisControl.SelectionMode}"
|
||||
SelectionMode="Multiple"
|
||||
SelectionChanged="OnRowSelectionChanged">
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate DataType="m:Change">
|
||||
@@ -93,12 +93,11 @@
|
||||
Change="{Binding}" />
|
||||
|
||||
<StackPanel Grid.Column="1" Orientation="Horizontal" Margin="4,0">
|
||||
<TextBlock Classes="primary" Text="{Binding ConflictMarker}" Foreground="DarkOrange" FontWeight="Bold" Margin="0,0,4,0" IsVisible="{Binding IsConflicted}"/>
|
||||
<TextBlock Classes="primary" Text="{Binding Path, Converter={x:Static c:PathConverters.PureFileName}}"/>
|
||||
<TextBlock Text="{Binding ConflictMarker}" Foreground="DarkOrange" FontWeight="Bold" Margin="0,0,4,0" IsVisible="{Binding IsConflicted}"/>
|
||||
<TextBlock Text="{Binding Path, Converter={x:Static c:PathConverters.PureFileName}}"/>
|
||||
</StackPanel>
|
||||
|
||||
<TextBlock Grid.Column="2"
|
||||
Classes="primary"
|
||||
Text="{Binding Path, Converter={x:Static c:PathConverters.PureDirectoryName}}"
|
||||
Foreground="{DynamicResource Brush.FG2}"/>
|
||||
</Grid>
|
||||
@@ -111,7 +110,7 @@
|
||||
<v:ChangeCollectionContainer Focusable="True"
|
||||
ItemsSource="{Binding Changes}"
|
||||
SelectedItems="{Binding SelectedChanges, Mode=TwoWay}"
|
||||
SelectionMode="{Binding #ThisControl.SelectionMode}"
|
||||
SelectionMode="Multiple"
|
||||
SelectionChanged="OnRowSelectionChanged">
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate DataType="m:Change">
|
||||
@@ -126,8 +125,8 @@
|
||||
Change="{Binding}" />
|
||||
|
||||
<StackPanel Grid.Column="1" Orientation="Horizontal" Margin="4,0">
|
||||
<TextBlock Classes="primary" Text="{Binding ConflictMarker}" Foreground="DarkOrange" FontWeight="Bold" Margin="0,0,4,0" IsVisible="{Binding IsConflicted}"/>
|
||||
<TextBlock Classes="primary" Text="{Binding Path}"/>
|
||||
<TextBlock Text="{Binding ConflictMarker}" Foreground="DarkOrange" FontWeight="Bold" Margin="0,0,4,0" IsVisible="{Binding IsConflicted}"/>
|
||||
<TextBlock Text="{Binding Path}"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
|
||||
@@ -61,15 +61,6 @@ namespace SourceGit.Views
|
||||
set => SetValue(IsUnstagedChangeProperty, value);
|
||||
}
|
||||
|
||||
public static readonly StyledProperty<SelectionMode> SelectionModeProperty =
|
||||
AvaloniaProperty.Register<ChangeCollectionView, SelectionMode>(nameof(SelectionMode));
|
||||
|
||||
public SelectionMode SelectionMode
|
||||
{
|
||||
get => GetValue(SelectionModeProperty);
|
||||
set => SetValue(SelectionModeProperty, value);
|
||||
}
|
||||
|
||||
public static readonly StyledProperty<Models.ChangeViewMode> ViewModeProperty =
|
||||
AvaloniaProperty.Register<ChangeCollectionView, Models.ChangeViewMode>(nameof(ViewMode), Models.ChangeViewMode.Tree);
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
Text="{DynamicResource Text.Checkout.Commit.Target}" />
|
||||
<Grid Grid.Row="0" Grid.Column="1" ColumnDefinitions="Auto,Auto,*">
|
||||
<Path Grid.Column="0" Width="14" Height="14" Data="{StaticResource Icons.Commit}" />
|
||||
<TextBlock Grid.Column="1" Classes="primary" Foreground="DarkOrange" VerticalAlignment="Center" Margin="8,0" Text="{Binding Commit.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" />
|
||||
<TextBlock Grid.Column="1" Foreground="DarkOrange" VerticalAlignment="Center" Margin="8,0" Text="{Binding Commit.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" />
|
||||
<TextBlock Grid.Column="2" Text="{Binding Commit.Subject}" TextTrimming="CharacterEllipsis"/>
|
||||
</Grid>
|
||||
|
||||
|
||||
@@ -59,10 +59,7 @@
|
||||
<!-- SHA -->
|
||||
<TextBlock Grid.Row="0" Grid.Column="0" Classes="info_label" VerticalAlignment="Top" Margin="0,4,0,0" Text="{DynamicResource Text.CommitDetail.Info.SHA}" />
|
||||
<StackPanel Grid.Row="0" Grid.Column="1" Orientation="Horizontal" Height="24">
|
||||
<TextBlock Classes="primary"
|
||||
Text="{Binding SHA}"
|
||||
Margin="12,0,4,0"
|
||||
VerticalAlignment="Center"/>
|
||||
<TextBlock Text="{Binding SHA}" Margin="12,0,4,0" VerticalAlignment="Center"/>
|
||||
|
||||
<Button Classes="icon_button" Width="24" Cursor="Hand" Click="OnCopyCommitSHA" ToolTip.Tip="{DynamicResource Text.Copy}">
|
||||
<Path Width="12" Height="12" Data="{StaticResource Icons.Copy}"/>
|
||||
@@ -109,8 +106,7 @@
|
||||
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Classes="primary"
|
||||
Text="{Binding Converter={x:Static c:StringConverters.ToShortSHA}}"
|
||||
<TextBlock Text="{Binding Converter={x:Static c:StringConverters.ToShortSHA}}"
|
||||
Foreground="DarkOrange"
|
||||
TextDecorations="Underline"
|
||||
Cursor="Hand"
|
||||
@@ -130,11 +126,11 @@
|
||||
<StackPanel MinWidth="400" Orientation="Vertical">
|
||||
<Grid ColumnDefinitions="Auto,*,Auto">
|
||||
<v:Avatar Grid.Column="0" Width="16" Height="16" VerticalAlignment="Center" IsHitTestVisible="False" User="{Binding Author}"/>
|
||||
<TextBlock Grid.Column="1" Classes="primary" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="2" Classes="primary" Text="{Binding CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="1" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="2" Text="{Binding CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
|
||||
</Grid>
|
||||
|
||||
<TextBlock Classes="primary" Margin="0,8,0,0" Text="{Binding Subject}" TextWrapping="Wrap"/>
|
||||
<TextBlock Margin="0,8,0,0" Text="{Binding Subject}" TextWrapping="Wrap"/>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
</TextBlock.DataTemplates>
|
||||
@@ -154,8 +150,7 @@
|
||||
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Classes="primary"
|
||||
Text="{Binding Converter={x:Static c:StringConverters.ToShortSHA}}"
|
||||
<TextBlock Text="{Binding Converter={x:Static c:StringConverters.ToShortSHA}}"
|
||||
Foreground="DarkOrange"
|
||||
TextDecorations="Underline"
|
||||
Cursor="Hand"
|
||||
@@ -175,11 +170,11 @@
|
||||
<StackPanel MinWidth="400" Orientation="Vertical">
|
||||
<Grid ColumnDefinitions="Auto,*,Auto">
|
||||
<v:Avatar Grid.Column="0" Width="16" Height="16" VerticalAlignment="Center" IsHitTestVisible="False" User="{Binding Author}"/>
|
||||
<TextBlock Grid.Column="1" Classes="primary" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="2" Classes="primary" Text="{Binding CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="1" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="2" Text="{Binding CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
|
||||
</Grid>
|
||||
|
||||
<TextBlock Classes="primary" Margin="0,8,0,0" Text="{Binding Subject}" TextWrapping="Wrap"/>
|
||||
<TextBlock Margin="0,8,0,0" Text="{Binding Subject}" TextWrapping="Wrap"/>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
</TextBlock.DataTemplates>
|
||||
@@ -192,7 +187,6 @@
|
||||
<TextBlock Grid.Row="3" Grid.Column="0" Classes="info_label" VerticalAlignment="Top" Margin="0,4,0,0" Text="{DynamicResource Text.CommitDetail.Info.Refs}" IsVisible="{Binding HasDecorators}"/>
|
||||
<Border Grid.Row="3" Grid.Column="1" Margin="12,0,0,0" MinHeight="24" IsVisible="{Binding HasDecorators}">
|
||||
<v:CommitRefsPresenter Foreground="{DynamicResource Brush.FG1}"
|
||||
FontFamily="{DynamicResource Fonts.Primary}"
|
||||
FontSize="12"
|
||||
AllowWrap="True"
|
||||
Margin="0,4,0,0"
|
||||
@@ -203,7 +197,6 @@
|
||||
<TextBlock Grid.Row="4" Grid.Column="0" Classes="info_label" VerticalAlignment="Top" Margin="0,4,0,0" Text="{DynamicResource Text.CommitDetail.Info.Message}" />
|
||||
<v:CommitMessagePresenter Grid.Row="4" Grid.Column="1"
|
||||
Margin="12,4,8,0"
|
||||
Classes="primary"
|
||||
FullMessage="{Binding #ThisControl.FullMessage}"
|
||||
HorizontalAlignment="Stretch"
|
||||
TextWrapping="Wrap">
|
||||
@@ -219,11 +212,11 @@
|
||||
<StackPanel MinWidth="400" Orientation="Vertical">
|
||||
<Grid ColumnDefinitions="Auto,*,Auto">
|
||||
<v:Avatar Grid.Column="0" Width="16" Height="16" VerticalAlignment="Center" IsHitTestVisible="False" User="{Binding Author}"/>
|
||||
<TextBlock Grid.Column="1" Classes="primary" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="2" Classes="primary" Text="{Binding CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="1" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="2" Text="{Binding CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
|
||||
</Grid>
|
||||
|
||||
<TextBlock Classes="primary" Margin="0,8,0,0" Text="{Binding Subject}" TextWrapping="Wrap"/>
|
||||
<TextBlock Margin="0,8,0,0" Text="{Binding Subject}" TextWrapping="Wrap"/>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
</v:CommitMessagePresenter.DataTemplates>
|
||||
|
||||
@@ -45,8 +45,7 @@
|
||||
|
||||
<!-- Changes -->
|
||||
<Border Grid.Row="1" Margin="0,4,0,0" BorderBrush="{DynamicResource Brush.Border2}" BorderThickness="1" Background="{DynamicResource Brush.Contents}">
|
||||
<v:ChangeCollectionView SelectionMode="Single"
|
||||
ViewMode="{Binding Source={x:Static vm:Preferences.Instance}, Path=CommitChangeViewMode}"
|
||||
<v:ChangeCollectionView ViewMode="{Binding Source={x:Static vm:Preferences.Instance}, Path=CommitChangeViewMode}"
|
||||
EnableCompactFolders="{Binding Source={x:Static vm:Preferences.Instance}, Path=EnableCompactFoldersInChangesTree}"
|
||||
Changes="{Binding VisibleChanges}"
|
||||
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Input;
|
||||
@@ -17,27 +18,20 @@ namespace SourceGit.Views
|
||||
{
|
||||
e.Handled = true;
|
||||
|
||||
if (sender is not ChangeCollectionView view)
|
||||
if (sender is not ChangeCollectionView { SelectedChanges: { Count: > 0 } changes } view)
|
||||
return;
|
||||
|
||||
var detailView = this.FindAncestorOfType<CommitDetail>();
|
||||
if (detailView == null)
|
||||
return;
|
||||
|
||||
var changes = view.SelectedChanges ?? [];
|
||||
var container = view.FindDescendantOfType<ChangeCollectionContainer>();
|
||||
if (container is { SelectedItems.Count: 1, SelectedItem: ViewModels.ChangeTreeNode { IsFolder: true } node })
|
||||
{
|
||||
var menu = detailView.CreateChangeContextMenuByFolder(node, changes);
|
||||
menu.Open(view);
|
||||
return;
|
||||
}
|
||||
|
||||
if (changes.Count == 1)
|
||||
{
|
||||
var menu = detailView.CreateChangeContextMenu(changes[0]);
|
||||
menu.Open(view);
|
||||
}
|
||||
detailView.CreateChangeContextMenuByFolder(node, changes)?.Open(view);
|
||||
else if (changes.Count > 1)
|
||||
detailView.CreateMultipleChangesContextMenu(changes)?.Open(view);
|
||||
else
|
||||
detailView.CreateChangeContextMenu(changes[0])?.Open(view);
|
||||
}
|
||||
|
||||
private async void OnChangeCollectionViewKeyDown(object sender, KeyEventArgs e)
|
||||
@@ -45,18 +39,30 @@ namespace SourceGit.Views
|
||||
if (DataContext is not ViewModels.CommitDetail vm)
|
||||
return;
|
||||
|
||||
if (sender is not ChangeCollectionView { SelectedChanges: { Count: 1 } selectedChanges })
|
||||
if (sender is not ChangeCollectionView { SelectedChanges: { Count: > 0 } selectedChanges } view)
|
||||
return;
|
||||
|
||||
var change = selectedChanges[0];
|
||||
if (e.Key == Key.C &&
|
||||
e.KeyModifiers.HasFlag(OperatingSystem.IsMacOS() ? KeyModifiers.Meta : KeyModifiers.Control))
|
||||
{
|
||||
if (e.KeyModifiers.HasFlag(KeyModifiers.Shift))
|
||||
await App.CopyTextAsync(vm.GetAbsPath(change.Path));
|
||||
var builder = new StringBuilder();
|
||||
var copyAbsPath = e.KeyModifiers.HasFlag(KeyModifiers.Shift);
|
||||
var container = view.FindDescendantOfType<ChangeCollectionContainer>();
|
||||
if (container is { SelectedItems.Count: 1, SelectedItem: ViewModels.ChangeTreeNode { IsFolder: true } node })
|
||||
{
|
||||
builder.Append(copyAbsPath ? vm.GetAbsPath(node.FullPath) : node.FullPath);
|
||||
}
|
||||
else if (selectedChanges.Count == 1)
|
||||
{
|
||||
builder.Append(copyAbsPath ? vm.GetAbsPath(selectedChanges[0].Path) : selectedChanges[0].Path);
|
||||
}
|
||||
else
|
||||
await App.CopyTextAsync(change.Path);
|
||||
{
|
||||
foreach (var c in selectedChanges)
|
||||
builder.AppendLine(copyAbsPath ? vm.GetAbsPath(c.Path) : c.Path);
|
||||
}
|
||||
|
||||
await App.CopyTextAsync(builder.ToString());
|
||||
e.Handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
HorizontalAlignment="Left"
|
||||
Margin="16,0,0,0"
|
||||
Change="{Binding}"/>
|
||||
<TextBlock Grid.Column="1" Classes="primary" Text="{Binding Path}" Margin="8,0" HorizontalAlignment="Stretch" TextTrimming="CharacterEllipsis"/>
|
||||
<TextBlock Grid.Column="1" Text="{Binding Path}" Margin="8,0" HorizontalAlignment="Stretch" TextTrimming="CharacterEllipsis"/>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</ListBox.ItemTemplate>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Input;
|
||||
@@ -97,6 +98,98 @@ namespace SourceGit.Views
|
||||
return menu;
|
||||
}
|
||||
|
||||
public ContextMenu CreateMultipleChangesContextMenu(List<Models.Change> changes)
|
||||
{
|
||||
if (DataContext is not ViewModels.CommitDetail { Repository: { } repo, Commit: { } commit } vm)
|
||||
return null;
|
||||
|
||||
var patch = new MenuItem();
|
||||
patch.Header = App.Text("FileCM.SaveAsPatch");
|
||||
patch.Icon = App.CreateMenuIcon("Icons.Diff");
|
||||
patch.Click += async (_, e) =>
|
||||
{
|
||||
var storageProvider = TopLevel.GetTopLevel(this)?.StorageProvider;
|
||||
if (storageProvider == null)
|
||||
return;
|
||||
|
||||
var options = new FilePickerSaveOptions();
|
||||
options.Title = App.Text("FileCM.SaveAsPatch");
|
||||
options.DefaultExtension = ".patch";
|
||||
options.FileTypeChoices = [new FilePickerFileType("Patch File") { Patterns = ["*.patch"] }];
|
||||
|
||||
var storageFile = await storageProvider.SaveFilePickerAsync(options);
|
||||
if (storageFile != null)
|
||||
{
|
||||
var saveTo = storageFile.Path.LocalPath;
|
||||
await vm.SaveChangesAsPatchAsync(changes, saveTo);
|
||||
}
|
||||
|
||||
e.Handled = true;
|
||||
};
|
||||
|
||||
var menu = new ContextMenu();
|
||||
menu.Items.Add(patch);
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
|
||||
if (!repo.IsBare)
|
||||
{
|
||||
var resetToThisRevision = new MenuItem();
|
||||
resetToThisRevision.Header = App.Text("ChangeCM.CheckoutThisRevision");
|
||||
resetToThisRevision.Icon = App.CreateMenuIcon("Icons.File.Checkout");
|
||||
resetToThisRevision.Click += async (_, ev) =>
|
||||
{
|
||||
await vm.ResetMultipleToThisRevisionAsync(changes);
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
var resetToFirstParent = new MenuItem();
|
||||
resetToFirstParent.Header = App.Text("ChangeCM.CheckoutFirstParentRevision");
|
||||
resetToFirstParent.Icon = App.CreateMenuIcon("Icons.File.Checkout");
|
||||
resetToFirstParent.IsEnabled = commit.Parents.Count > 0;
|
||||
resetToFirstParent.Click += async (_, ev) =>
|
||||
{
|
||||
await vm.ResetMultipleToParentRevisionAsync(changes);
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
menu.Items.Add(resetToThisRevision);
|
||||
menu.Items.Add(resetToFirstParent);
|
||||
menu.Items.Add(new MenuItem { Header = "-" });
|
||||
}
|
||||
|
||||
var copyPath = new MenuItem();
|
||||
copyPath.Header = App.Text("CopyPath");
|
||||
copyPath.Icon = App.CreateMenuIcon("Icons.Copy");
|
||||
copyPath.Tag = OperatingSystem.IsMacOS() ? "⌘+C" : "Ctrl+C";
|
||||
copyPath.Click += async (_, ev) =>
|
||||
{
|
||||
var builder = new StringBuilder();
|
||||
foreach (var c in changes)
|
||||
builder.AppendLine(c.Path);
|
||||
|
||||
await App.CopyTextAsync(builder.ToString());
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
var copyFullPath = new MenuItem();
|
||||
copyFullPath.Header = App.Text("CopyFullPath");
|
||||
copyFullPath.Icon = App.CreateMenuIcon("Icons.Copy");
|
||||
copyFullPath.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+C" : "Ctrl+Shift+C";
|
||||
copyFullPath.Click += async (_, e) =>
|
||||
{
|
||||
var builder = new StringBuilder();
|
||||
foreach (var c in changes)
|
||||
builder.AppendLine(Native.OS.GetAbsPath(repo.FullPath, c.Path));
|
||||
|
||||
await App.CopyTextAsync(builder.ToString());
|
||||
e.Handled = true;
|
||||
};
|
||||
|
||||
menu.Items.Add(copyPath);
|
||||
menu.Items.Add(copyFullPath);
|
||||
return menu;
|
||||
}
|
||||
|
||||
public ContextMenu CreateChangeContextMenu(Models.Change change)
|
||||
{
|
||||
if (DataContext is not ViewModels.CommitDetail { Repository: { } repo, Commit: { } commit } vm)
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
using System.Text.Json;
|
||||
using Avalonia.Interactivity;
|
||||
|
||||
namespace SourceGit.Views
|
||||
{
|
||||
public partial class CommitMessageEditor : ChromelessWindow
|
||||
{
|
||||
public string ConventionalTypesOverride
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
} = string.Empty;
|
||||
|
||||
public CommitMessageEditor()
|
||||
{
|
||||
CloseOnESC = true;
|
||||
@@ -15,6 +21,25 @@ namespace SourceGit.Views
|
||||
|
||||
public void AsStandalone(string file)
|
||||
{
|
||||
var gitDir = new Commands.QueryGitDir(Path.GetDirectoryName(file)).GetResult();
|
||||
if (!string.IsNullOrEmpty(gitDir))
|
||||
{
|
||||
var settingsFile = Path.Combine(gitDir, "sourcegit.settings");
|
||||
if (File.Exists(settingsFile))
|
||||
{
|
||||
try
|
||||
{
|
||||
using var stream = File.OpenRead(settingsFile);
|
||||
var settings = JsonSerializer.Deserialize(stream, JsonCodeGen.Default.RepositorySettings);
|
||||
ConventionalTypesOverride = settings.ConventionalTypesOverride;
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Ignore errors
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_onSave = msg => File.WriteAllText(file, msg);
|
||||
_shouldExitApp = true;
|
||||
|
||||
@@ -25,8 +50,10 @@ namespace SourceGit.Views
|
||||
Editor.DescriptionEditor.Text = parts[1].Trim();
|
||||
}
|
||||
|
||||
public void AsBuiltin(string msg, Action<string> onSave)
|
||||
public void AsBuiltin(string conventionalTypesOverride, string msg, Action<string> onSave)
|
||||
{
|
||||
ConventionalTypesOverride = conventionalTypesOverride;
|
||||
|
||||
_onSave = onSave;
|
||||
_shouldExitApp = false;
|
||||
|
||||
|
||||
@@ -120,10 +120,10 @@
|
||||
VerticalAlignment="Center"
|
||||
Orientation="Horizontal">
|
||||
<TextBlock Classes="info_label" FontSize="13" HorizontalAlignment="Left" Text="{DynamicResource Text.CommitMessageTextBox.SubjectCount}"/>
|
||||
<TextBlock Classes="primary" Margin="8,0,0,0" FontSize="11" Text="{Binding #ThisControl.Subject.Length}" IsVisible="{Binding #ThisControl.Subject.Length, Converter={x:Static c:IntConverters.IsSubjectLengthGood}}" VerticalAlignment="Center"/>
|
||||
<TextBlock Classes="primary" Margin="8,0,0,0" FontSize="11" Foreground="DarkGoldenrod" Text="{Binding #ThisControl.Subject.Length}" IsVisible="{Binding #ThisControl.Subject.Length, Converter={x:Static c:IntConverters.IsSubjectLengthBad}}" VerticalAlignment="Center"/>
|
||||
<TextBlock Classes="primary" FontSize="11" Text="/" VerticalAlignment="Center"/>
|
||||
<TextBlock Classes="primary" FontSize="11" Text="{Binding Source={x:Static vm:Preferences.Instance}, Path=SubjectGuideLength}" VerticalAlignment="Center"/>
|
||||
<TextBlock Margin="8,0,0,0" FontSize="11" Text="{Binding #ThisControl.Subject.Length}" IsVisible="{Binding #ThisControl.Subject.Length, Converter={x:Static c:IntConverters.IsSubjectLengthGood}}" VerticalAlignment="Center"/>
|
||||
<TextBlock Margin="8,0,0,0" FontSize="11" Foreground="DarkGoldenrod" Text="{Binding #ThisControl.Subject.Length}" IsVisible="{Binding #ThisControl.Subject.Length, Converter={x:Static c:IntConverters.IsSubjectLengthBad}}" VerticalAlignment="Center"/>
|
||||
<TextBlock FontSize="11" Text="/" VerticalAlignment="Center"/>
|
||||
<TextBlock FontSize="11" Text="{Binding Source={x:Static vm:Preferences.Instance}, Path=SubjectGuideLength}" VerticalAlignment="Center"/>
|
||||
<Path Width="10" Height="10" Margin="4,0,0,0" Data="{StaticResource Icons.Error}" Fill="DarkGoldenrod" IsVisible="{Binding #ThisControl.Subject.Length, Converter={x:Static c:IntConverters.IsSubjectLengthBad}}"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
@@ -339,13 +339,21 @@ namespace SourceGit.Views
|
||||
|
||||
private async void OnOpenConventionalCommitHelper(object _, RoutedEventArgs e)
|
||||
{
|
||||
var toplevel = TopLevel.GetTopLevel(this);
|
||||
if (toplevel is Window owner)
|
||||
var owner = TopLevel.GetTopLevel(this) as Window;
|
||||
if (owner == null)
|
||||
return;
|
||||
|
||||
var conventionalTypesOverride = owner switch
|
||||
{
|
||||
var vm = new ViewModels.ConventionalCommitMessageBuilder(text => Text = text);
|
||||
var builder = new ConventionalCommitMessageBuilder() { DataContext = vm };
|
||||
await builder.ShowDialog(owner);
|
||||
}
|
||||
Launcher { DataContext: ViewModels.Launcher { ActivePage: { Data: ViewModels.Repository repo } } } => repo.Settings.ConventionalTypesOverride,
|
||||
RepositoryConfigure { DataContext: ViewModels.RepositoryConfigure config } => config.ConventionalTypesOverride,
|
||||
CommitMessageEditor editor => editor.ConventionalTypesOverride,
|
||||
_ => string.Empty
|
||||
};
|
||||
|
||||
var vm = new ViewModels.ConventionalCommitMessageBuilder(conventionalTypesOverride, text => Text = text);
|
||||
var builder = new ConventionalCommitMessageBuilder() { DataContext = vm };
|
||||
await builder.ShowDialog(owner);
|
||||
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<StackPanel Orientation="Horizontal" Margin="8,0" VerticalAlignment="Center">
|
||||
<Path Width="10" Height="10" Data="{StaticResource Icons.Branch}" IsVisible="{Binding !IsTag}"/>
|
||||
<Path Width="10" Height="10" Data="{StaticResource Icons.Tag}" IsVisible="{Binding IsTag}"/>
|
||||
<TextBlock Classes="primary" Text="{Binding Name}" Margin="2,0,0,0"/>
|
||||
<TextBlock Text="{Binding Name}" Margin="2,0,0,0"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</DataTemplate>
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
<TextBlock Margin="0,2,0,0"
|
||||
Classes="small"
|
||||
TextWrapping="Wrap"
|
||||
Text="{DynamicResource Text.Configure.CustomAction.Arguments.Tip}"
|
||||
Text="{DynamicResource Text.ConfigureCustomActionControls.StringValue.Tip}"
|
||||
Foreground="{DynamicResource Brush.FG2}">
|
||||
<TextBlock.IsVisible>
|
||||
<MultiBinding Converter="{x:Static BoolConverters.Or}">
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,0,0,8">
|
||||
<Border Height="16" VerticalAlignment="Center" Background="Red" CornerRadius="8">
|
||||
<TextBlock Classes="primary" Text="{Binding Marker}" Foreground="White" FontWeight="Bold" Margin="8,0" FontSize="10"/>
|
||||
<TextBlock Text="{Binding Marker}" Foreground="White" FontWeight="Bold" Margin="8,0" FontSize="10"/>
|
||||
</Border>
|
||||
|
||||
<TextBlock Margin="8,0,0,0" VerticalAlignment="Center" Text="{Binding Description}"/>
|
||||
@@ -42,11 +42,11 @@
|
||||
<StackPanel MinWidth="400" Orientation="Vertical">
|
||||
<Grid ColumnDefinitions="Auto,*,Auto">
|
||||
<v:Avatar Grid.Column="0" Width="16" Height="16" VerticalAlignment="Center" IsHitTestVisible="False" User="{Binding Author}"/>
|
||||
<TextBlock Grid.Column="1" Classes="primary" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="2" Classes="primary" Text="{Binding CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="1" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="2" Text="{Binding CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
|
||||
</Grid>
|
||||
|
||||
<TextBlock Classes="primary" Margin="0,8,0,0" Text="{Binding Subject}" TextWrapping="Wrap"/>
|
||||
<TextBlock Margin="0,8,0,0" Text="{Binding Subject}" TextWrapping="Wrap"/>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
</TextBlock.DataTemplates>
|
||||
@@ -59,7 +59,6 @@
|
||||
<Path Width="12" Height="12" Data="{StaticResource Icons.Commit}"/>
|
||||
<v:CommitRefsPresenter Margin="8,0,0,0"
|
||||
Foreground="{DynamicResource Brush.FG1}"
|
||||
FontFamily="{DynamicResource Fonts.Primary}"
|
||||
FontSize="12"
|
||||
VerticalAlignment="Center"
|
||||
UseGraphColor="False"/>
|
||||
@@ -76,11 +75,11 @@
|
||||
<StackPanel MinWidth="400" Orientation="Vertical">
|
||||
<Grid ColumnDefinitions="Auto,*,Auto">
|
||||
<v:Avatar Grid.Column="0" Width="16" Height="16" VerticalAlignment="Center" IsHitTestVisible="False" User="{Binding Author}"/>
|
||||
<TextBlock Grid.Column="1" Classes="primary" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="2" Classes="primary" Text="{Binding CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="1" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="2" Text="{Binding CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
|
||||
</Grid>
|
||||
|
||||
<TextBlock Classes="primary" Margin="0,8,0,0" Text="{Binding Subject}" TextWrapping="Wrap"/>
|
||||
<TextBlock Margin="0,8,0,0" Text="{Binding Subject}" TextWrapping="Wrap"/>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
</TextBlock.DataTemplates>
|
||||
|
||||
@@ -47,8 +47,8 @@
|
||||
<ComboBox Grid.Row="0" Grid.Column="1"
|
||||
Height="28" Padding="8,0"
|
||||
VerticalAlignment="Center" HorizontalAlignment="Stretch"
|
||||
ItemsSource="{Binding Source={x:Static m:ConventionalCommitType.Supported}}"
|
||||
SelectedItem="{Binding Type, Mode=TwoWay}"
|
||||
ItemsSource="{Binding Types, Mode=OneWay}"
|
||||
SelectedItem="{Binding SelectedType, Mode=TwoWay}"
|
||||
Grid.IsSharedSizeScope="True">
|
||||
<ComboBox.SelectionBoxItemTemplate>
|
||||
<DataTemplate DataType="m:ConventionalCommitType">
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
<DataTemplate DataType="m:Commit">
|
||||
<Grid ColumnDefinitions="Auto,Auto,*">
|
||||
<Path Grid.Column="0" Width="14" Height="14" Data="{StaticResource Icons.Commit}"/>
|
||||
<TextBlock Grid.Column="1" Classes="primary" VerticalAlignment="Center" Text="{Binding SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="1" VerticalAlignment="Center" Text="{Binding SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="2" VerticalAlignment="Center" Text="{Binding Subject}" Margin="4,0,0,0" TextTrimming="CharacterEllipsis"/>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
<DataTemplate DataType="m:Commit">
|
||||
<Grid ColumnDefinitions="Auto,Auto,*">
|
||||
<Path Grid.Column="0" Width="14" Height="14" Data="{StaticResource Icons.Commit}"/>
|
||||
<TextBlock Grid.Column="1" Classes="primary" VerticalAlignment="Center" Text="{Binding SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="1" VerticalAlignment="Center" Text="{Binding SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange" Margin="8,0,0,0"/>
|
||||
<TextBlock Grid.Column="2" VerticalAlignment="Center" Text="{Binding Subject}" Margin="4,0,0,0" TextTrimming="CharacterEllipsis"/>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
<DataTemplate DataType="m:Branch">
|
||||
<Grid Height="26" ColumnDefinitions="22,*,Auto">
|
||||
<Path Grid.Column="0" Width="10" Height="10" Margin="4,0,8,0" Data="{StaticResource Icons.Branch}" />
|
||||
<TextBlock Grid.Column="1" Text="{Binding FriendlyName}" Classes="primary" />
|
||||
<TextBlock Grid.Column="1" Text="{Binding FriendlyName}" />
|
||||
<Border Grid.Column="2"
|
||||
Height="18"
|
||||
Margin="8,0"
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
<DataTemplate DataType="m:Tag">
|
||||
<Grid Height="26" ColumnDefinitions="22,*">
|
||||
<Path Grid.Column="0" Width="10" Height="10" Margin="4,0,8,0" Data="{StaticResource Icons.Tag}" />
|
||||
<TextBlock Grid.Column="1" Text="{Binding Name}" Classes="primary" />
|
||||
<TextBlock Grid.Column="1" Text="{Binding Name}" />
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</ListBox.ItemTemplate>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user