From 5418ccac9e898643a71e820ca327b9beb40efe2c Mon Sep 17 00:00:00 2001 From: leo Date: Thu, 14 Jan 2021 16:31:03 +0800 Subject: [PATCH] feature<*>: add translation for Simplified Chinese --- src/App.preference.cs | 4 + src/App.xaml | 1 + src/App.xaml.cs | 29 ++ src/Git/Repository.cs | 8 +- src/Helpers/Validations.cs | 28 +- src/Resources/Locales/en_US.xaml | 432 +++++++++++++++++++++++++++++ src/Resources/Locales/zh_CN.xaml | 432 +++++++++++++++++++++++++++++ src/UI/About.xaml | 6 +- src/UI/AddSubmodule.xaml | 16 +- src/UI/Apply.xaml | 14 +- src/UI/Apply.xaml.cs | 14 +- src/UI/Blame.xaml | 12 +- src/UI/Blame.xaml.cs | 4 +- src/UI/CherryPick.xaml | 10 +- src/UI/Clone.xaml | 22 +- src/UI/Clone.xaml.cs | 2 +- src/UI/CommitViewer.xaml | 30 +- src/UI/CommitViewer.xaml.cs | 26 +- src/UI/Configure.xaml | 18 +- src/UI/CreateBranch.xaml | 20 +- src/UI/CreateTag.xaml | 16 +- src/UI/CreateTag.xaml.cs | 5 - src/UI/Dashboard.xaml | 66 ++--- src/UI/Dashboard.xaml.cs | 86 +++--- src/UI/DeleteBranch.xaml | 11 +- src/UI/DeleteRemote.xaml | 8 +- src/UI/DeleteTag.xaml | 10 +- src/UI/DiffViewer.xaml | 18 +- src/UI/DiffViewer.xaml.cs | 14 +- src/UI/Discard.xaml | 15 +- src/UI/Discard.xaml.cs | 4 +- src/UI/Fetch.xaml | 12 +- src/UI/FileHistories.xaml | 5 +- src/UI/FilesDisplayModeSwitch.xaml | 8 +- src/UI/FolderDailog.xaml | 8 +- src/UI/GitFlowFinishBranch.xaml | 4 +- src/UI/GitFlowFinishBranch.xaml.cs | 12 +- src/UI/GitFlowSetup.xaml | 20 +- src/UI/GitFlowSetup.xaml.cs | 10 +- src/UI/GitFlowStartBranch.xaml | 6 +- src/UI/GitFlowStartBranch.xaml.cs | 6 +- src/UI/Histories.xaml | 19 +- src/UI/Histories.xaml.cs | 44 +-- src/UI/Init.xaml | 10 +- src/UI/InteractiveRebase.xaml | 16 +- src/UI/Launcher.xaml | 12 +- src/UI/Launcher.xaml.cs | 10 +- src/UI/Merge.xaml | 15 +- src/UI/NewPage.xaml | 10 +- src/UI/NewPage.xaml.cs | 20 +- src/UI/Pull.xaml | 18 +- src/UI/Push.xaml | 16 +- src/UI/PushTag.xaml | 10 +- src/UI/Rebase.xaml | 12 +- src/UI/Remote.xaml | 14 +- src/UI/Remote.xaml.cs | 7 +- src/UI/RenameBranch.xaml | 14 +- src/UI/Reset.xaml | 12 +- src/UI/Revert.xaml | 10 +- src/UI/SettingDialog.xaml | 81 +++--- src/UI/SettingDialog.xaml.cs | 41 ++- src/UI/Stash.xaml | 14 +- src/UI/Stashes.xaml | 6 +- src/UI/Stashes.xaml.cs | 6 +- src/UI/TwoCommitsDiff.xaml | 4 +- src/UI/TwoCommitsDiff.xaml.cs | 14 +- src/UI/UpdateAvailable.xaml | 35 ++- src/UI/UpdateAvailable.xaml.cs | 2 +- src/UI/WorkingCopy.xaml | 30 +- src/UI/WorkingCopy.xaml.cs | 72 ++--- 70 files changed, 1492 insertions(+), 554 deletions(-) create mode 100644 src/Resources/Locales/en_US.xaml create mode 100644 src/Resources/Locales/zh_CN.xaml diff --git a/src/App.preference.cs b/src/App.preference.cs index d51fe99a..29ed49e5 100644 --- a/src/App.preference.cs +++ b/src/App.preference.cs @@ -49,6 +49,10 @@ namespace SourceGit { /// public bool UseLightTheme { get; set; } /// + /// Locale + /// + public string Locale { get; set; } = "en_US"; + /// /// Main window width /// public double WindowWidth { get; set; } diff --git a/src/App.xaml b/src/App.xaml index 408df2f0..a85e0cf5 100644 --- a/src/App.xaml +++ b/src/App.xaml @@ -9,6 +9,7 @@ + diff --git a/src/App.xaml.cs b/src/App.xaml.cs index c2c2f757..a577fc6f 100644 --- a/src/App.xaml.cs +++ b/src/App.xaml.cs @@ -30,6 +30,25 @@ namespace SourceGit { } } + /// + /// Load text from locales. + /// + /// + /// + public static string Text(string key) { + return Current.FindResource("Text." + key) as string; + } + + /// + /// Format text + /// + /// + /// + /// + public static string Format(string key, params object[] args) { + return string.Format(Text(key), args); + } + /// /// Raise error message. /// @@ -109,6 +128,16 @@ namespace SourceGit { } } + // Apply locales + if (Setting.UI.Locale != "en_US") { + foreach (var rs in Current.Resources.MergedDictionaries) { + if (rs.Source != null && rs.Source.OriginalString.StartsWith("pack://application:,,,/Resources/Locales/")) { + rs.Source = new Uri($"pack://application:,,,/Resources/Locales/{Setting.UI.Locale}.xaml", UriKind.Absolute); + break; + } + } + } + // Show main window MainWindow = new UI.Launcher(); MainWindow.Show(); diff --git a/src/Git/Repository.cs b/src/Git/Repository.cs index 6a358570..d0bccb04 100644 --- a/src/Git/Repository.cs +++ b/src/Git/Repository.cs @@ -261,7 +261,7 @@ namespace SourceGit.Git { var checkGitDir = new DirectoryInfo(GitDir); if (!checkGitDir.Exists) { - App.RaiseError("GIT_DIR for this repository NOT FOUND!"); + App.RaiseError(App.Text("GitDirNotFound")); return; } else { GitDir = checkGitDir.FullName; @@ -1110,7 +1110,7 @@ namespace SourceGit.Git { releasePrefix = GetConfig("gitflow.prefix.release"); hotfixPrefix = GetConfig("gitflow.prefix.hotfix"); - if (!IsGitFlowEnabled()) App.RaiseError("Initialize Git-flow failed!"); + if (!IsGitFlowEnabled()) App.RaiseError(App.Text("InitGitFlowFailed")); if (refreshBranches) { Branches(true); @@ -1136,7 +1136,7 @@ namespace SourceGit.Git { case Branch.Type.Release: args = $"flow release start {name}"; break; case Branch.Type.Hotfix: args = $"flow hotfix start {name}"; break; default: - App.RaiseError("Bad git-flow branch type!"); + App.RaiseError(App.Text("BadGitFlowType")); return; } @@ -1165,7 +1165,7 @@ namespace SourceGit.Git { args = $"flow hotfix finish {hotfixName} -m \"Hotfix done\""; break; default: - App.RaiseError("Bad git-flow branch type!"); + App.RaiseError(App.Text("BadGitFlowType")); return; } diff --git a/src/Helpers/Validations.cs b/src/Helpers/Validations.cs index 04ba8319..3fb2deb2 100644 --- a/src/Helpers/Validations.cs +++ b/src/Helpers/Validations.cs @@ -10,7 +10,7 @@ namespace SourceGit.Helpers { /// public class CloneFolderRule : ValidationRule { public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - var badPath = "EXISTS and FULL ACCESS CONTROL needed"; + var badPath = App.Text("BadCloneFolder"); var path = value as string; return Directory.Exists(path) ? ValidationResult.ValidResult : new ValidationResult(false, badPath); } @@ -21,7 +21,7 @@ namespace SourceGit.Helpers { /// public class RemoteUriRule : ValidationRule { public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - var badUrl = "Remote git URL not supported"; + var badUrl = App.Text("BadRemoteUri"); return Git.Repository.IsValidUrl(value as string) ? ValidationResult.ValidResult : new ValidationResult(false, badUrl); } } @@ -38,13 +38,13 @@ namespace SourceGit.Helpers { var name = value as string; var remotes = Repo.Remotes(); - if (string.IsNullOrEmpty(name)) return new ValidationResult(false, "Remote name can NOT be null"); - if (!regex.IsMatch(name)) return new ValidationResult(false, $"Bad name for remote. Regex: ^[\\w\\-\\.]+$"); + if (string.IsNullOrEmpty(name)) return new ValidationResult(false, App.Text("EmptyRemoteName")); + if (!regex.IsMatch(name)) return new ValidationResult(false, App.Text("BadRemoteName")); if (Old == null || name != Old.Name) { foreach (var t in remotes) { if (t.Name == name) { - return new ValidationResult(false, $"Remote '{name}' already exists"); + return new ValidationResult(false, App.Text("DuplicatedRemoteName")); } } } @@ -65,14 +65,14 @@ namespace SourceGit.Helpers { var name = value as string; var branches = Repo.Branches(); - if (string.IsNullOrEmpty(name)) return new ValidationResult(false, "Branch name can NOT be null"); - if (!regex.IsMatch(name)) return new ValidationResult(false, $"Bad name for branch. Regex: ^[\\w\\-/\\.]+$"); + if (string.IsNullOrEmpty(name)) return new ValidationResult(false, App.Text("EmptyBranchName")); + if (!regex.IsMatch(name)) return new ValidationResult(false, App.Text("BadBranchName")); name = Prefix + name; foreach (var b in branches) { if (b.Name == name) { - return new ValidationResult(false, $"Branch '{name}' already exists"); + return new ValidationResult(false, App.Text("DuplicatedBranchName")); } } @@ -91,12 +91,12 @@ namespace SourceGit.Helpers { var name = value as string; var tags = Repo.Tags(); - if (string.IsNullOrEmpty(name)) return new ValidationResult(false, "Tag name can NOT be null"); - if (!regex.IsMatch(name)) return new ValidationResult(false, $"Bad name for tag. Regex: ^[\\w\\-\\.]+$"); + if (string.IsNullOrEmpty(name)) return new ValidationResult(false, App.Text("EmptyTagName")); + if (!regex.IsMatch(name)) return new ValidationResult(false, App.Text("BadTagName")); foreach (var t in tags) { if (t.Name == name) { - return new ValidationResult(false, $"Tag '{name}' already exists"); + return new ValidationResult(false, App.Text("DuplicatedTagName")); } } @@ -110,7 +110,7 @@ namespace SourceGit.Helpers { public class CommitSubjectRequiredRule : ValidationRule { public override ValidationResult Validate(object value, CultureInfo cultureInfo) { var subject = value as string; - return string.IsNullOrWhiteSpace(subject) ? new ValidationResult(false, "Commit subject can NOT be empty") : ValidationResult.ValidResult; + return string.IsNullOrWhiteSpace(subject) ? new ValidationResult(false, App.Text("EmptyCommitMessage")) : ValidationResult.ValidResult; } } @@ -121,7 +121,7 @@ namespace SourceGit.Helpers { public override ValidationResult Validate(object value, CultureInfo cultureInfo) { var path = value as string; var succ = !string.IsNullOrEmpty(path) && File.Exists(path); - return !succ ? new ValidationResult(false, "Invalid path for patch file") : ValidationResult.ValidResult; + return !succ ? new ValidationResult(false, App.Text("BadPatchFile")) : ValidationResult.ValidResult; } } @@ -133,7 +133,7 @@ namespace SourceGit.Helpers { var regex = new Regex(@"^[\w\-\._/]+$"); var path = value as string; var succ = !string.IsNullOrEmpty(path) && regex.IsMatch(path.Trim()); - return !succ ? new ValidationResult(false, "Invalid path for submodules") : ValidationResult.ValidResult; + return !succ ? new ValidationResult(false, App.Text("BadSubmodulePath")) : ValidationResult.ValidResult; } } } diff --git a/src/Resources/Locales/en_US.xaml b/src/Resources/Locales/en_US.xaml new file mode 100644 index 00000000..df9588b9 --- /dev/null +++ b/src/Resources/Locales/en_US.xaml @@ -0,0 +1,432 @@ + + START + SURE + SAVE + CLOSE + CANCEL + CLICK TO GO + Reveal in File Explorer + Save As ... + Save File to ... + Copy Path + {0} Bytes + FILTER + Optional. + + URL : + Git Repository URL + Parent Folder : + Relative foler to store this module. Optional. + + ABOUT + SourceGit - OPEN SOURCE GIT CLIENT + + Apply + Apply Patch + Patch File : + Select .patch file to apply + Whitespace : + Ignore whitespace changes + No Warn + Turns off the trailing whitespace warning + Warn + Outputs warnings for a few such errors, but applies + Error + Raise errors and refuses to apply the patch + Error All + Similar to 'error', but shows more + + Blame + SOURCEGIT - BLAME + Use right mouse button to view commit information. + COMMIT SHA + AUTHOR + MODIFY TIME + + SUBMODULES + Add Submodule + Fetch nested submodules + Open Submodule Repository + Copy Relative Path + + Cherry-Pick This Commit + Cherry Pick + Commit : + Commit all changes + + Clone Remote Repository + Repository URL : + Git Repository URL + Parent Folder : + Folder to contain this repository + Local Name : + Repository name. Optional. + Remote Name : + Remote name. Optional. + + INFORMATION + AUTHOR + COMMITTER + SHA + PARENTS + REFS + MESSAGE + CHANGED + CHANGES + Search Files ... + SWITCH TO LIST/TREE VIEW + FILES + + Configure + CREDENTIAL + User : + User name for this repository + Email : + Email address + COMMIT TEMPLATE + Template : + + Create Branch + Create Local Branch + Based On : + New Branch Name : + Enter branch name. + Local Changes : + Stash & Reapply + Discard + Check out after created + + Create Tag + New Tag At : + Tag Name : + Recommanded format :v1.0.0-alpha + Tag Message : + Optional. + + Explore + Open In File Browser + Terminal + Open Git Bash + Search + Search Commit + Configure this repository + WORKSPACE + LOCAL BRANCHES + NEW BRANCH + REMOTES + ADD REMOTE + TAGS + NEW TAG + SUBMODULES + ADD SUBMODULE + UPDATE SUBMODULE + RESOLVE + CONTINUE + ABORT + + GIT FLOW + Initialize Git-Flow + Production Branch : + Development Branch : + Feature : + Release : + Hotfix : + Feature Prefix : + Release Prefix : + Hotfix Prefix : + Version Tag Prefix : + Start Feature ... + Start Release ... + Start Hotfix ... + GIT FLOW - Start Feature + GIT FLOW - Start Release + GIT FLOW - Start Hotfix + Enter name + GIT FLOW - Finish Feature + GIT FLOW - Finish Release + GIT FLOW - Finish Hotfix + {0} branch name is required. + {0} branch name contains invalid characters. + {0} prefix is required. + {0} contains invalid characters. + Development branch is same with production! + + Refresh + Bookmark + CopyPath + Open + Open Container Folder + + Push '{0}' + Discard all changes + Fast-Forward to '{0}' + Pull '{0}' + Pull '{0}' into '{1}' + Checkout '{0}' + Merge '{0}' into '{1}' + Rebase '{0}' on '{1}' + Git Flow - Finish '{0}' + Rename '{0}' + Delete '{0}' + Tracking ... + Copy Branch Name + + Fetch '{0}' + Edit '{0}' + Delete '{0}' + Copy Remote URL + + Reset '{0}' to Here + Interactive Rebase '{0}' from Here + Rebase '{0}' to Here + Cherry-Pick This Commit + Revert Commit + Save as Patch + Copy Commit SHA + Copy Commit Info + + Push '{0}' + Delete '{0}' + Copy Tag Name + + Apply + Pop + Drop + + Unstage + Stage... + Discard... + Stash... + Unstage {0} files + Stage {0} files... + Discard {0} files... + Stash {0} files... + Save As Patch... + + Confirm To Delete Branch + Branch : + + Confirm To Delete Remote + Remote : + + Confirm To Delete Tag + Tag : + Delete from remote repositories + + Next Difference + Previous Difference + Toggle One-Side/Two-Sides + SELECT FILE TO VIEW CHANGES + NO CHANGES OR ONLY EOL CHANGES + BINARY DIFF + OLD : + New : + LFS OBJECT CHANGE + Copy Selected Lines + + Confirm To Discard Changes + Changes : + You can't undo this action!!! + All local changes in working copy. + Total {0} changes will be discard + + Fetch + Fetch Remote Changes + Remote : + Fetch all remotes + Prune remote dead branches + + File History + + CHANGE FILES DISPLAY MODE + Show as Grid + Show as List + Show as Tree + + SELECT FOLDER + SELECTED : + + Histories + SEARCH SHA/SUBJECT/AUTHOR. PRESS ENTER TO SEARCH, ESC TO QUIT + CLEAR + Toggle Horizontal/Vertical Layout + SELECTED {0} COMMITS + HISTORIES GUIDE + 1. Select single commit to view detail + 2. Select two commits to show differences + 3. Select more than 2 commits to count + 4. Try to open context menu with selected commit + + Initialize Repository + Path : + Invalid repository detected. Run `git init` under this path? + + SOURCEGIT - INTERACTIVE REBASE + Rebase : + On : + REBASE + MOVE UP + MOVE DOWN + + Source Git + NEW PAGE + PREFERENCE + ABOUT + ERROR + New Page + Welcome Page + + Merge Branch + Source Branch : + Into : + Merge Option : + + Welcome to SourceGit :) + Open Local Repository + Clone Remote Repository + REPOSITORIES + DRAG-DROP YOUR FOLDER + Open or init local repository + Add Folder + Add Sub-Folder + Rename + Delete + + Pull + Pull (Fetch & Merge) + Remote : + Branch : + Into : + Use rebase instead of merge + Stash & reapply local changes + + Push + Push Changes To Remote + Local Branch : + Remote : + To : + Push all tags + Force push + + Push Tag To Remote + Tag : + Remote : + + Rebase Current Branch + Rebase : + On : + Stash & reapply local changes + + Add Remote + Edit Remote + Name : + Remote name + Repository URL : + Remote git repository URL + + Rename Branch + Branch : + New Name : + Unique name for this branch + + Reset Current Branch To Revision + Current Branch : + Move To : + Reset Mode : + + Confirm To Revert Commit + Commit : + Commit revert changes + + Preference + GENERAL SETTING + RESTART REQUIRED + Display Language : + Light Theme : + Check for Update : + GIT INSTANCE + Install Path : + Input path for git.exe + Default Clone Dir : + Default path to clone repo into + GLOBAL SETTING + Name : + Email : + Auto CRLF + MERGE TOOL + Merger : + Install Path : + Input path for merge tool + Command : + Select Git Executable File + Select default clone path + Select {0} Install Path + + Stash + Stash Local Changes + Message : + Optional. Name of this stash + Include untracked files + + Stashes + STASHES + CHANGES + Untracked files not shown + + COMMIT : {0} -> {1} + + UPDATE AVAILABLE + {0} is available! + Publish Time + Base On Commit + Is Pre-release + DOWNLOAD + + Commit + UNSTAGED + STAGE + STAGE ALL + STAGED + UNSTAGE + UNSTAGE ALL + CONFLICTS DETECTED + USE THEIRS + USE MINE + OPEN MERGE + Enter commit message + MESSAGE HISTORIES + Amend + COMMIT + COMMIT & PUSH + NO RECENT INPUT MESSAGES + RECENT INPUT MESSAGES + + Cherry-Pick merge request detected! Press 'Abort' to restore original HEAD + Rebase merge request detected! Press 'Abort' to restore original HEAD + Revert merge request detected! Press 'Abort' to restore original HEAD + Merge request detected! Press 'Abort' to restore original HEAD + + Git has NOT been configured.\nPlease to go [Preference] and configure it first. + Path[{0}] not exists! + Can NOT locate bash.exe. Make sure bash.exe exists under the same folder with git.exe + BINARY FILE BLAME NOT SUPPORTED!!! + GIT_DIR for this repository NOT FOUND! + Initialize Git-flow failed! + Bad git-flow branch type! + EXISTS and FULL ACCESS CONTROL needed + Remote git URL not supported + Remote name can NOT be null + Bad name for remote. Regex: ^[\\w\\-\\.]+$ + Duplicated remote name! + Branch name can NOT be null + Bad name for branch. Regex: ^[\\w\\-/\\.]+$ + Duplicated branch name! + Tag name can NOT be null + Bad name for tag. Regex: ^[\\w\\-\\.]+$ + Duplicated tag name! + Commit subject can NOT be empty + Invalid path for patch file + Invalid path for submodules + \ No newline at end of file diff --git a/src/Resources/Locales/zh_CN.xaml b/src/Resources/Locales/zh_CN.xaml new file mode 100644 index 00000000..c8420b02 --- /dev/null +++ b/src/Resources/Locales/zh_CN.xaml @@ -0,0 +1,432 @@ + + 开 始 + 确 定 + 保 存 + 关 闭 + 取 消 + 点击前往 + 在文件浏览器中查看 + 另存为... + 另存文件到... + 复制路径 + {0} 字节 + 过滤 + 选填 + + 仓库地址 : + 远程仓库地址 + 本地目录 : + 本地存放的父级目录,选填. + + 关于软件 + SourceGit - 开源Git图形客户端 + + 应用补丁 + 应用补丁 + 补丁文件 : + 选择补丁文件 + 空白符号处理 : + 忽略空白符号 + 忽略 + 关闭所有警告 + 警告 + 应用补丁,输出关于空白符的警告 + 错误 + 输出错误,并终止应用补丁 + 更多错误 + 与【错误】级别相似,但输出内容更多 + + 逐行追溯 + 追溯 + 右键点击查看所选行修改记录 + 提交指纹 + 修改者 + 修改时间 + + 子模块 + 添加子模块 + 拉取子孙模块 + 打开仓库 + 复制路径 + + 挑选此提交 + 挑选提交 + 提交ID : + 提交变化 + + 克隆远程仓库 + 远程仓库 : + 远程仓库地址 + 父级目录 : + 选择存放本仓库的父级文件夹路径 + 本地仓库名 : + 本地仓库目录的名字,选填 + 远程名 : + 远程的名字,选填 + + 基本信息 + 修改者 + 提交者 + 提交指纹 + 父提交 + 相关引用 + 提交信息 + 变更列表 + 变更对比 + 查找文件... + 切换树形/列表模式 + 文件列表 + + 配置 + 仓库凭证 + 用户 : + 应用于本仓库的用户名 + 邮箱 : + 邮箱地址 + 提交模板 + 模板内容 : + + 新建分支 + 创建本地分支 + 新分支基于 : + 新分支名 : + 填写分支名称 + 未提交更改 : + 贮藏并自动恢复 + 忽略 + 完成后切换到新分支 + + 新建标签 + 标签位于 : + 标签名 : + 推荐格式 :v1.0.0-alpha + 标签描述 : + 选填 + + 浏览 + 在文件浏览器中打开 + 终端 + 打开GIT终端 + 查找 + 查找提交 + 配置本仓库 + 工作区 + 本地分支 + 新建分支 + 远程列表 + 添加远程 + 标签列表 + 新建标签 + 子模块列表 + 添加子模块 + 更新子模块 + 解决冲突 + 下一步 + 终止冲突解决 + + GIT工作流 + 初始化GIT工作流 + 发布分支 : + 开发分支 : + 特性分支 : + 版本分支 : + 修复分支 : + 特性分支名前缀 : + 版本分支名前缀 : + 修复分支名前缀 : + 版本标签前缀 : + 开始特性分支... + 开始版本分支... + 开始修复分支... + 开始特性分支 + 开始版本分支 + 开始修复分支 + 输入分支名 + 结束特性分支 + 结束版本分支 + 结束修复分支 + {0}分支名未填写! + {0}分支名包含非法字符! + {0}前缀未填写! + {0}前缀包含非法字符! + 开发分支与发布分支不可相同! + + 刷新 + 书签 + 复制路径 + 打开 + 在浏览器中查看 + + 推送 '{0}' + 放弃所有更改 + 快进到 '{0}' + 拉回 '{0}' + 拉回 '{0}' 内容至 '{1}' + 检出 '{0}' + 合并 '{0}' 到 '{1}' + 变基 '{0}' 分支至 '{1}' + GIT工作流 - 完成 '{0}' + 重命名 '{0}' + 删除 '{0}' + 切换上游分支... + 复制分支名 + + 拉取 '{0}' 更新 + 编辑 '{0}' + 删除 '{0}' + 复制远程地址 + + 重置 '{0}' 到此处 + 从此处开始对 '{0}' 交互式变基 + 变基 '{0}' 到此处 + 挑选此提交 + 回滚此提交 + 另存为补丁 + 复制提交指纹 + 复制提交信息 + + 推送 '{0}' + 删除 '{0}' + 复制标签名 + + 应用 + 应用并删除 + 删除 + + 从暂存中移除 + 暂存... + 放弃更改... + 贮藏... + 从暂存中移除 {0} 个文件 + 暂存 {0} 个文件... + 放弃 {0} 个文件的更改... + 贮藏选中的 {0} 个文件... + 另存为补丁... + + 确定要删除此分支吗? + 分支名 : + + 确定要移除该远程吗? + 远程名 : + + 确定要移除该标签吗? + 标签名 : + 同时删除远程仓库中的此标签 + + 下一个差异 + 上一个差异 + 切换显示模式 + 请选择需要对比的文件 + 没有变更或仅有换行符差异 + 二进制文件 + 原始大小 : + 当前大小 : + LFS对象变更 + 复制 + + 放弃更改确认 + 需要放弃的变更 : + 本操作不支持回退,请确认后继续!!! + 所有本地址未提交的修改 + 总计{0}项选中更改 + + 拉取 + 拉取远程仓库内容 + 远程仓库 : + 拉取所有的远程仓库 + 自动清理远程已删除分支 + + 文件历史 + + 切换显示模式 + 网格模式 + 列表模式 + 树形模式 + + 选择目录... + 当前选择 : + + 历史记录 + 查询提交指纹、信息、作者。回车键开始,ESC键取消 + 清空 + 切换横向/纵向显示 + 已选中{0}项提交 + 操作说明 + 1. 单选时,显示选中提交的详细信息 + 2. 双选时,按选中顺序对比两个提交 + 3. 多选时,仅统计选中行数 + 4. 右键用于操作选中的某个提交 + + 初始化新仓库 + 路径 : + 点击【确定】将在此目录执行`git init`操作 + + 交互式变基 + 操作分支 : + 开始提交 : + 开 始 + 向上移动 + 向下移动 + + Source Git + 新建空白页 + 偏好设置 + 关于 + 出错了 + 新标签页 + 起始页 + + 合并分支 + 合并分支 : + 目标分支 : + 合并方式 : + + 欢迎使用本软件 + 打开本地仓库 + 克隆远程仓库 + 仓库列表 + 支持拖放操作 + 打开/初始化本地仓库 + 新建分组 + 新建子分组 + 重命名 + 删除 + + 拉回 + 拉回(拉取并合并) + 远程 : + 拉取分支 : + 本地分支 : + 使用变基方式合并分支 + 自动贮藏并恢复本地变更 + + 推送 + 推送到远程仓库 + 本地分支 : + 远程仓库 : + 远程分支 : + 同时推送标签 + 启用强制推送 + + 推送标签到远程仓库 + 标签 : + 远程仓库 : + + 变基操作 + 分支 : + 目标提交 : + 自动贮藏并恢复本地变更 + + 添加远程仓库 + 编辑远程仓库 + 远程名 : + 唯一远程名 + 仓库地址 : + 远程仓库的地址 + + 分支重命名 + 分支 : + 新的名称 : + 新的分支名不能与现有分支名相同 + + 重置当前分支到指定版本 + 当前分支 : + 提交 : + 重置模式 : + + 确定要回滚吗? + 目标提交 : + 回滚后提交更改 + + 偏好设置 + 通用配置 + 需要重启软件 + 显示语言 : + 启用浅色主题 : + 检测更新 : + GIT配置 + 安装路径 : + 填写git.exe所在位置 + 默认克隆路径 : + 默认的仓库本地存放位置 + 全局设置 + 用户名 : + 邮箱 : + 自动换行转换 : + 外部合并工具 + 工具 : + 安装路径 : + 填写工具可执行文件所在位置 + 指令 : + 选择git.exe所在位置 + 选择仓库本地存放位置 + 选择{0}所在位置 + + 贮藏 + 贮藏本地变更 + 信息 : + 选填,用于命名此贮藏 + 包含未跟踪的文件 + + 贮藏列表 + 贮藏列表 + 查看变更 + 不显示未跟踪的文件 + + 对比提交 : {0} -> {1} + + 检测更新 + {0}已发布! + 发布时间 + GIT版本 + 预览版 + 下 载 + + 本地更改 + 未暂存 + 暂存选中 + 暂存所有 + 已暂存 + 从暂存区移除选中 + 从暂存区移除所有 + 检测到冲突 + 使用THEIRS + 使用MINE + 打开合并工具 + 填写提交信息 + 历史提交信息 + 修补 + 提交 + 提交并推送 + 没有提交信息记录 + 最近输入的提交信息 + + 检测到挑选提交冲突! + 检测到变基冲突! + 检测到回滚提交冲突! + 检测到分支合并冲突! + + GIT尚未配置。请打开【偏好设置】配置GIT路径。 + 路径({0})不存在或不可读取! + 无法找到bash.exe,请确保其在git.exe同目录中! + 二进制文件不支持该操作!!! + 获取仓库GIT_DIR失败! + 初始化GIT FLOW失败! + 不支持的GIT FLOW分支! + 目录不存在或不可写!!! + 非法的远程仓库地址! + 远程仓库地址不可为空 + 远程仓库地址包含非法字符!仅支持字母、数字、下划线、横线或英文点号! + 远程仓库名已存在! + 分支名不可为空 + 分支名包含非法字符!仅支持字母、数字、下划线、横线或英文点号! + 分支名已存在! + 标签名不可为空! + 标签名包含非法字符!仅支持字母、数字、下划线、横线或英文点号! + 标签名已存在! + 提交信息未填写! + 补丁文件不存在或不可访问! + 非法的子模块路径! + \ No newline at end of file diff --git a/src/UI/About.xaml b/src/UI/About.xaml index 2e2b84da..c0d90469 100644 --- a/src/UI/About.xaml +++ b/src/UI/About.xaml @@ -5,7 +5,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Height="280" Width="400" - Title="About" + Title="{StaticResource Text.About}" WindowStartupLocation="CenterOwner" ResizeMode="NoResize"> @@ -33,7 +33,7 @@ - + diff --git a/src/UI/Histories.xaml.cs b/src/UI/Histories.xaml.cs index b6d9ec20..8ac0f227 100644 --- a/src/UI/Histories.xaml.cs +++ b/src/UI/Histories.xaml.cs @@ -205,7 +205,7 @@ namespace SourceGit.UI { } else if (selected.Count > 2) { mask.Visibility = Visibility.Visible; txtCounter.Visibility = Visibility.Visible; - txtCounter.Content = $"SELECTED {selected.Count} COMMITS"; + txtCounter.Content = App.Format("Histories.Selected", selected.Count); } else { mask.Visibility = Visibility.Visible; txtCounter.Visibility = Visibility.Hidden; @@ -226,7 +226,7 @@ namespace SourceGit.UI { if (!string.IsNullOrEmpty(branch.Upstream)) { var upstream = branch.Upstream.Substring(13); var fastForward = new MenuItem(); - fastForward.Header = $"Fast-Forward to '{upstream}'"; + fastForward.Header = App.Format("BranchCM.FastForward", upstream); fastForward.Click += (o, e) => { Merge.StartDirectly(Repo, upstream, branch.Name); e.Handled = true; @@ -234,7 +234,7 @@ namespace SourceGit.UI { submenu.Items.Add(fastForward); var pull = new MenuItem(); - pull.Header = $"Pull '{upstream}' ..."; + pull.Header = App.Format("BranchCM.Pull", upstream); pull.Click += (o, e) => { Pull.Show(Repo); e.Handled = true; @@ -243,7 +243,7 @@ namespace SourceGit.UI { } var push = new MenuItem(); - push.Header = $"Push '{branch.Name}' ..."; + push.Header = App.Format("BranchCM.Push", branch.Name); push.Click += (o, e) => { Push.Show(Repo, branch); e.Handled = true; @@ -258,7 +258,7 @@ namespace SourceGit.UI { flowIcon.Width = 10; var finish = new MenuItem(); - finish.Header = $"Git Flow - Finish '{branch.Name}'"; + finish.Header = App.Format("BranchCM.Finish", branch.Name); finish.Icon = flowIcon; finish.Click += (o, e) => { GitFlowFinishBranch.Show(Repo, branch); @@ -270,7 +270,7 @@ namespace SourceGit.UI { } var rename = new MenuItem(); - rename.Header = "Rename ..."; + rename.Header = App.Format("BranchCM.Rename", branch.Name); rename.Click += (o, e) => { RenameBranch.Show(Repo, branch); e.Handled = true; @@ -292,7 +292,7 @@ namespace SourceGit.UI { submenu.Icon = icon; var checkout = new MenuItem(); - checkout.Header = $"Checkout '{branch.Name}'"; + checkout.Header = App.Format("BranchCM.Checkout", branch.Name); checkout.Click += (o, e) => { if (branch.IsLocal) { Task.Run(() => Repo.Checkout(branch.Name)); @@ -312,7 +312,7 @@ namespace SourceGit.UI { submenu.Items.Add(checkout); var merge = new MenuItem(); - merge.Header = $"Merge into '{current.Name}' ..."; + merge.Header = App.Format("BranchCM.Merge", branch.Name, current.Name); merge.IsEnabled = !merged; merge.Click += (o, e) => { Merge.Show(Repo, branch.Name, current.Name); @@ -328,7 +328,7 @@ namespace SourceGit.UI { flowIcon.Width = 10; var finish = new MenuItem(); - finish.Header = $"Git Flow - Finish '{branch.Name}'"; + finish.Header = App.Format("BranchCM.Finish", branch.Name); finish.Icon = flowIcon; finish.Click += (o, e) => { GitFlowFinishBranch.Show(Repo, branch); @@ -340,7 +340,7 @@ namespace SourceGit.UI { } var rename = new MenuItem(); - rename.Header = "Rename ..."; + rename.Header = App.Format("BranchCM.Rename", branch.Name); rename.Visibility = branch.IsLocal ? Visibility.Visible : Visibility.Collapsed; rename.Click += (o, e) => { RenameBranch.Show(Repo, current); @@ -349,7 +349,7 @@ namespace SourceGit.UI { submenu.Items.Add(rename); var delete = new MenuItem(); - delete.Header = "Delete ..."; + delete.Header = App.Format("BranchCM.Delete", branch.Name); delete.Click += (o, e) => { DeleteBranch.Show(Repo, branch); }; @@ -370,7 +370,7 @@ namespace SourceGit.UI { submenu.MinWidth = 200; var push = new MenuItem(); - push.Header = "Push ..."; + push.Header = App.Format("TagCM.Push", tag.Name); push.Click += (o, e) => { PushTag.Show(Repo, tag); e.Handled = true; @@ -378,7 +378,7 @@ namespace SourceGit.UI { submenu.Items.Add(push); var delete = new MenuItem(); - delete.Header = "Delete ..."; + delete.Header = App.Format("TagCM.Delete", tag.Name); delete.Click += (o, e) => { DeleteTag.Show(Repo, tag); e.Handled = true; @@ -439,7 +439,7 @@ namespace SourceGit.UI { // Reset var reset = new MenuItem(); - reset.Header = $"Reset '{current.Name}' to Here"; + reset.Header = App.Format("CommitCM.Reset", current.Name); reset.Visibility = commit.IsHEAD ? Visibility.Collapsed : Visibility.Visible; reset.Click += (o, e) => { Reset.Show(Repo, commit); @@ -449,7 +449,7 @@ namespace SourceGit.UI { // Rebase or interactive rebase var rebase = new MenuItem(); - rebase.Header = commit.IsMerged ? $"Interactive Rebase '{current.Name}' from Here" : $"Rebase '{current.Name}' to Here"; + rebase.Header = App.Format(commit.IsMerged ? "CommitCM.InteractiveRebase" : "CommitCM.Rebase", current.Name); rebase.Visibility = commit.IsHEAD ? Visibility.Collapsed : Visibility.Visible; rebase.Click += (o, e) => { if (commit.IsMerged) { @@ -472,7 +472,7 @@ namespace SourceGit.UI { // Cherry-Pick var cherryPick = new MenuItem(); - cherryPick.Header = "Cherry-Pick This Commit"; + cherryPick.Header = App.Text("CommitCM.CherryPick"); cherryPick.Visibility = commit.IsMerged ? Visibility.Collapsed : Visibility.Visible; cherryPick.Click += (o, e) => { CherryPick.Show(Repo, commit); @@ -482,7 +482,7 @@ namespace SourceGit.UI { // Revert commit var revert = new MenuItem(); - revert.Header = "Revert Commit"; + revert.Header = App.Text("CommitCM.Revert"); revert.Visibility = !commit.IsMerged ? Visibility.Collapsed : Visibility.Visible; revert.Click += (o, e) => { Revert.Show(Repo, commit); @@ -493,14 +493,14 @@ namespace SourceGit.UI { // Common var createBranch = new MenuItem(); - createBranch.Header = "Create Branch"; + createBranch.Header = App.Text("CreateBranch"); createBranch.Click += (o, e) => { CreateBranch.Show(Repo, commit); e.Handled = true; }; menu.Items.Add(createBranch); var createTag = new MenuItem(); - createTag.Header = "Create Tag"; + createTag.Header = App.Text("CreateTag"); createTag.Click += (o, e) => { CreateTag.Show(Repo, commit); e.Handled = true; @@ -510,7 +510,7 @@ namespace SourceGit.UI { // Save as patch var patch = new MenuItem(); - patch.Header = "Save as Patch"; + patch.Header = App.Text("CommitCM.SaveAsPatch"); patch.Click += (o, e) => { FolderDailog.Open("Save patch to ...", saveTo => { Repo.RunCommand($"format-patch {commit.SHA} -1 -o \"{saveTo}\"", null); @@ -521,7 +521,7 @@ namespace SourceGit.UI { // Copy SHA var copySHA = new MenuItem(); - copySHA.Header = "Copy Commit SHA"; + copySHA.Header = App.Text("CommitCM.CopySHA"); copySHA.Click += (o, e) => { Clipboard.SetText(commit.SHA); }; @@ -529,7 +529,7 @@ namespace SourceGit.UI { // Copy info var copyInfo = new MenuItem(); - copyInfo.Header = "Copy Commit Info"; + copyInfo.Header = App.Text("CommitCM.CopyInfo"); copyInfo.Click += (o, e) => { Clipboard.SetText(string.Format( "SHA: {0}\nTITLE: {1}\nAUTHOR: {2} <{3}>\nTIME: {4}", diff --git a/src/UI/Init.xaml b/src/UI/Init.xaml index fd644564..60ea1d96 100644 --- a/src/UI/Init.xaml +++ b/src/UI/Init.xaml @@ -20,15 +20,15 @@ -