diff --git a/content.js b/content.js index 2e64dc7..554e621 100644 --- a/content.js +++ b/content.js @@ -63,6 +63,76 @@ '[contenteditable="true"]', '[data-hovercard-type="repository"]', '[data-hovercard-type="user"]', + // グローバルパンくず内のリポジトリ名。repoPickerCrumbはGitHubのReactヘッダーで + // リポジトリ切替対象を示す要素で、表示テキストはユーザーが付けたリポジトリ名 + '[class*="repoPickerCrumb"]', + // リポジトリのコード画面上部に表示されるリポジトリ名。Starボタン等の固定UIを + // 除外しないよう、CodeViewHeaderのタイトル内にあるstrongだけに限定する + '[class*="CodeViewHeader-module__TitleWrapper__"] strong', + // リポジトリコード画面のReactファイルツリー。treeitemはリンクではないため + // isUserContentLinkでは保護できず、遅延描画後にファイル名・ディレクトリ名が + // 辞書キーと完全一致すると誤訳される。固定UIを残してtree本体だけを除外する + 'nav[aria-label="File Tree Navigation"] [role="tree"]', + // Issue/PRに付くラベルとラベル作成フォームのプレビュー。ラベル名はユーザーが + // 自由に設定できるため、PrimerのIssueLabelトークン全体を翻訳対象から除外する。 + // 末尾はビルドごとに変わるハッシュなので、公開コンポーネント名の接頭辞だけを使う + '[class*="prc-Token-IssueLabel-"]', + // Issue/PR右サイドバーの編集ポップアップに表示される候補名。ラベル名・ + // マイルストーン名・プロジェクト名・担当者名はいずれもユーザーが設定する内容。 + // dialog全体を除外すると見出しや検索欄などの固定UIまで翻訳できなくなるため、 + // 用途が明示されたlistbox内の候補行だけを保護する。ラベルの説明文も候補行の + // 内側にあるので、行単位の除外により名前と合わせて保護される + '[role="listbox"][aria-label="Label results"] [role="option"]', + '[role="listbox"][aria-label="Milestone results"] [role="option"]', + '[role="listbox"][aria-label="Project results"] [role="option"]', + '[role="listbox"][aria-label="User results"] [role="option"]', + // Issueの「Create a branch」ダイアログ。ベースリポジトリとベースブランチは + // ユーザーが付けた識別子なので、候補行と選択後にボタン内へ表示される値を保護する。 + // ボタン自体のaria-labelは固定UIとして翻訳できるよう、表示値のspanだけを除外する + '[role="listbox"][aria-label="Repository results"] [role="option"]', + '[role="listbox"][aria-label="Branch results"] [role="option"]', + // Issue右サイドバーの「開発」メニューに表示されるPull request候補。 + // 候補行のタイトルはユーザー作成コンテンツで、リポジトリ名や番号も含む + '[role="listbox"][aria-label="Pull request results"] [role="option"]', + 'button[aria-label^="Selected repository:"] [data-component="text"]', + 'button[aria-label="Select a branch"] [data-component="text"]', + // PRとDiscussionの右サイドバーでは、上のReact製listboxではなく旧式の + // details-menuが使われている。各フォーム・候補行にGitHubが付けている用途別の + // クラス/aria-labelに限定し、「No milestone」等の固定UIや新規作成フォームは + // 除外せず、ユーザーが設定した候補名と付随する説明だけを保護する + '.js-discussion-sidebar-menu .js-filterable-label', + // Issue/PR一覧の絞り込みメニュー。ラベル名・説明、マイルストーン名、 + // プロジェクト名、ユーザー名はユーザー作成コンテンツなので候補行を保護し、 + // 「担当者なし」等の固定選択肢やフィルター見出しは翻訳対象に残す。 + // 新しいIssues一覧の同種候補は上の* results listboxで保護される + '.js-issues-label-select-menu-item', + '#milestones-select-menu [role="menuitemradio"][href*="milestone%3A"]', + '#project-select-menu virtual-list [role="menuitemcheckbox"]', + '#author-select-menu [role="menuitemradio"][href*="author%3A"]', + '#assignees-select-menu [role="menuitemradio"][href*="assignee%3A"]', + 'form[aria-label="Select milestones"] .select-menu-item:not(.select-menu-new-item-form)', + 'form[aria-label="Select projects"] [role="menuitemcheckbox"]', + 'form[aria-label="Select assignees"] .select-menu-item', + 'form[aria-label="Select reviewers"] .select-menu-item', + // リポジトリ画面で現在選択されているブランチ。aria-labelは「<ブランチ名> branch」 + // で、内部の表示テキストはユーザーが付けたブランチ名そのものになる + 'button[aria-label$=" branch"]', + // ブランチ選択ポップアップの候補行。ブランチ名とタグ名はいずれもユーザーが + // 付けた識別子なので、固定UIのタブや操作文言は残して候補行だけを除外する + '[role="dialog"][aria-label="Select a branch"] [role="menuitemradio"]', + // リリース作成画面のタグ候補。タグ名はユーザーが付ける識別子なので、 + // ダイアログの見出し・検索欄・新規タグ作成ボタンは残して候補行だけを除外する + '[role="dialog"][aria-label="Select a tag"] [role="menuitemradio"]', + // リリース作成・編集画面で選択中のタグ名。Tag:の固定ラベルとタグ名は別spanに + // 分かれているため、ラベルは翻訳対象に残し、その直後の値だけを保護する + 'button[aria-label^="Tag:"] .fgColor-muted + span', + // リリース作成画面のターゲット候補。ブランチ一覧と最近のコミット一覧が同じ + // コンテナ内で切り替わるため、ブランチ名だけでなくコミットメッセージを含む + // 候補行も保護する。js-release-target-wrapperはこの用途を示すGitHub側のクラス + '.js-release-target-wrapper [role="menuitemradio"]', + // Discussionの投票タイトル・選択肢・結果はすべてユーザーが作成する内容。 + // 作成後の表示だけでなく投票作成・編集時のプレビューもコンポーネント単位で保護する + '.js-discussion-poll-component', // GitHubの遅延読み込み用カスタム要素。読み込み中はaria-label="Loading ..."が // 付いており、[aria-label]に無条件でマッチしてしまう。中身は読み込み完了後に // Ajaxで丸ごと置き換わる仮のプレースホルダーなので、翻訳しても意味がなく、 @@ -143,7 +213,10 @@ // リポジトリSettings > Pages { pattern: /^\/[^/]+\/[^/]+\/settings\/pages$/, selectors: ['p'] }, // リポジトリSettings > 高度なセキュリティ - { pattern: /^\/[^/]+\/[^/]+\/settings\/security_analysis$/, selectors: ['p'] } + { pattern: /^\/[^/]+\/[^/]+\/settings\/security_analysis$/, selectors: ['p'] }, + // リリース作成画面。説明欄はtextarea、タグ・ブランチ・コミット候補は専用の + // 除外セレクターで保護済みのため、画面下部の固定ガイド文だけを許可する + { pattern: /^\/[^/]+\/[^/]+\/releases\/new$/, selectors: ['p'] } ]; // 許可リストを広げたページのうち、その画面固有のユーザー作成コンテンツ @@ -167,6 +240,79 @@ { pattern: /^\/settings\/personal-access-tokens\/\d+$/, selectors: ['form.js-user-programmatic-access-form h2.Subhead-heading', 'h3.Subhead-heading a'] + }, + // リポジトリ固有の保存済みIssueビュー詳細画面。h1はGitHub固定の見出しではなく、 + // ユーザーが自由に付けたビュー名そのものなので翻訳対象から除外する。 + { + pattern: /^\/[^/]+\/[^/]+\/issues\/views\/\d+$/, + selectors: ['h1'] + }, + // マイルストーン詳細画面。h1はGitHub固定の見出しではなく、ユーザーが自由に + // 付けたマイルストーン名そのものなので翻訳対象から除外する。 + { + pattern: /^\/[^/]+\/[^/]+\/milestone\/\d+$/, + selectors: ['h1'] + }, + // リリース詳細のh1はGitHub固定の見出しではなくユーザーが入力したリリース名。 + // タグ名と同じ場合も異なる場合もあるため、URLではなく見出し自体を保護する + { + pattern: /^\/[^/]+\/[^/]+\/releases\/tag\/[^/]+$/, + selectors: ['main .border-top > h1.sr-only'] + }, + // リリース一覧の各sectionにある非表示見出しはリリース名そのもの。 + // section全体を除外するとAssets等の固定UIまで翻訳できないため見出しだけを保護する + { + pattern: /^\/[^/]+\/[^/]+\/releases$/, + selectors: ['section[id^="release-"] > h2.sr-only', 'nav[aria-label="Release list navigation"] a[href^="#release-"]'] + }, + // Issue作成画面のカスタムIssue Template / Issue Formカード。名前と説明は + // リポジトリ内の設定ファイルで自由に指定できる。Blank issueは固定UIなので残す + { + pattern: /^\/[^/]+\/[^/]+\/issues\/new\/choose$/, + selectors: ['a[href*="/issues/new?template="]:not([href*="template=BLANK_ISSUE"])'] + }, + // Issue Form本体のラベル・説明・Markdownはリポジトリ内のYAMLで定義される内容。 + // 右側の担当者等の固定UIはコンテナ外なので、フォーム要素群だけを保護する + { + pattern: /^\/[^/]+\/[^/]+\/issues\/new$/, + selectors: ['[class*="IssueFormElements-module__formElementsContainer__"]'] + }, + // ラベル管理一覧。各行のラベル名と説明はどちらもユーザーが編集できるため、 + // React ListViewが付与する明示的なlistitemロールを行単位で除外する。 + { + pattern: /^\/[^/]+\/[^/]+\/labels$/, + selectors: ['main [role="listitem"]'] + }, + // ユーザーまたはOrganization所有のProjects画面。h1はGitHub固定の見出しではなく、 + // ユーザーが自由に付けたプロジェクト名そのものなので翻訳対象から除外する。 + { + pattern: /^\/(users|orgs)\/[^/]+\/projects\/\d+(\/|$)/, + selectors: ['h1'] + }, + // Issue/PR/Discussion詳細のタイトル。従来はbdiや.gh-header-titleで保護されていたが、 + // 新しいReact画面ではh1内の.markdown-titleとなり、スクロール時にはh2の + // 追従ヘッダーにも複製される。どちらもユーザーが付けたタイトルなので除外する。 + { + pattern: /^\/[^/]+\/[^/]+\/(issues|pull|discussions)\/\d+$/, + selectors: ['h1 .markdown-title', 'h2 .markdown-title', '.sticky-header-container .markdown-title'] + }, + // Actions実行詳細のタイトルとJob詳細見出し。Workflow名とJob名はWorkflow YAMLで + // ユーザーが設定するため、実行番号や固定のステータスUIとは分けて保護する + { + pattern: /^\/[^/]+\/[^/]+\/actions\/runs\/\d+(\/job\/\d+)?$/, + selectors: ['h1 .markdown-title', '.CheckRun-log-title'] + }, + // ルールセット作成・編集画面のテキスト入力欄。ルールセット名やrefパターンなど + // ユーザー設定値を保持し、現在値がplaceholderへ複製された場合も誤訳を防ぐ。 + { + pattern: /^\/[^/]+\/[^/]+\/settings\/rules\/(new|\d+)$/, + selectors: ['input[type="text"]'] + }, + // Environment編集画面の見出し。h2内の省略表示対象はGitHub固定文言ではなく、 + // ユーザーが自由に付けたEnvironment名なので翻訳対象から除外する。 + { + pattern: /^\/[^/]+\/[^/]+\/settings\/environments\/\d+\/edit$/, + selectors: ['h2 .css-truncate-target'] } ]; @@ -196,7 +342,17 @@ // GitHub側でURL規則が不統一なため、両方にマッチさせる(pulls?) // マイルストーン詳細ページはURLが/milestone/2(単数形)、一覧ページは // /milestones(複数形)とGitHub側でURL規則が不統一なため、両方にマッチさせる - /^\/[^/]+\/[^/]+\/(issues|pulls?|compare|wiki|security|pulse|graphs|community|network|discussions|actions|models|milestones?|labels)(\/|$)/.test(location.pathname); + /^\/[^/]+\/[^/]+\/(issues|pulls?|compare|wiki|security|pulse|graphs|community|network|discussions|actions|models|milestones?|labels|releases?)(\/|$)/.test(location.pathname) || + // グローバルなPull requestsダッシュボード(/pulls、/pulls/inbox、 + // /pulls/assigned等)。セクション見出し(h2)やページタイトル(h1)が + // nav/header/button外の素のテキストとして出るため拡張スコープが必要 + /^\/pulls(\/|$)/.test(location.pathname) || + // グローバルなIssuesダッシュボード(/issues、/issues/assigned等)。 + // 上と同様にページタイトル(h1)がnav/header/button外に出るため必要 + /^\/issues(\/|$)/.test(location.pathname) || + // グローバルなリポジトリ一覧(/repos)。ページタイトル(h1)や + // 「New repository」等のPrimer Buttonクラス付きタグが対象になる + /^\/repos(\/|$)/.test(location.pathname); const selector = isExtendedScopePage ? BASE_SELECTOR.concat(EXTRA_SELECTOR) @@ -227,6 +383,28 @@ } return /^\/[^/]+\/[^/]+\/(issues|pull|discussions)\/\d+(\/|$)/.test(path) || + // リポジトリ固有の保存済みIssueビュー一覧に表示されるビュー名。 + // リンク先の数値IDはGitHubが付与し、リンクの表示名はユーザーが自由に設定する + /^\/[^/]+\/[^/]+\/issues\/views\/\d+$/.test(path) || + // リリース一覧・詳細に表示されるリリース名。リンク先にはユーザーが付けた + // タグ名が入るため、辞書キーと完全一致しても表示名を翻訳しない + /^\/[^/]+\/[^/]+\/releases\/tag\/[^/]+$/.test(path) || + // リリースに手動アップロードされたAssetのファイル名。末尾のパス部分は + // ユーザーが付けた名前で、一覧・詳細のダウンロードリンクにそのまま表示される + /^\/[^/]+\/[^/]+\/releases\/download\/[^/]+\/.+$/.test(path) || + // ActionsのWorkflow名・実行名・Job名。リンク表示はWorkflow YAMLで自由に + // 設定でき、StarやActions等の辞書キーと完全一致しうる + /^\/[^/]+\/[^/]+\/actions\/workflows\/[^/]+$/.test(path) || + /^\/[^/]+\/[^/]+\/actions\/runs\/\d+(\/job\/\d+)?$/.test(path) || + // ユーザーまたはOrganization所有のProjects。プロジェクト名はパンくずリンク、 + // ビュー名は各ビューへのタブリンクとして表示され、どちらもユーザーが変更できる + /^\/(users|orgs)\/[^/]+\/projects\/\d+(\/views\/\d+)?$/.test(path) || + // リポジトリRulesets一覧に表示されるルールセット名。リンク先の数値IDは + // GitHubが付与し、リンクの表示名はユーザーが自由に設定する + /^\/[^/]+\/[^/]+\/settings\/rules\/\d+$/.test(path) || + // Environment一覧に表示されるEnvironment名。リンク先の数値IDはGitHubが + // 付与し、リンクの表示名はユーザーが自由に設定する + /^\/[^/]+\/[^/]+\/settings\/environments\/\d+\/edit$/.test(path) || /^\/[^/]+\/[^/]+\/commit\/[0-9a-f]+(\/|$)/i.test(path) || // Wikiページ名へのリンク(サイドバーのページ一覧等)。ページ名はユーザーが // 付けたタイトルであり、辞書のキーと偶然完全一致すると誤訳されうる。 @@ -242,11 +420,120 @@ // ファイル名・フォルダ名のテキストノードまでTreeWalkerで走査され誤訳が // 発生していた。isExcludedElementはtranslateElement呼び出し自体を止める // ため、この行はaria-label属性・可視テキストとも一切書き換えなくなる - /^\/[^/]+\/[^/]+\/(tree|blob)\/.+/.test(path); + /^\/[^/]+\/[^/]+\/(tree|blob)\/.+/.test(path) || + // Issue/PR一覧の各行に付くマイルストーンリンク(/owner/repo/milestones/)。 + // GitHubはID(/milestone/2、単数形)ではなくユーザーが付けたマイルストーン名を + // スラッグとしてそのままリンク先に使うため、"Actions"や"Draft"等の辞書キーと + // 偶然完全一致すると誤訳されうる。新規作成への固定リンク(.../milestones/new) + // はマイルストーン名ではないため除外対象から外す + /^\/[^/]+\/[^/]+\/milestones?\/(?!new$)[^/]+$/.test(path); + } + + // Pull requests/Issues/リポジトリのダッシュボード(サイドバーaside)には、 + // GitHub固定のフィルターリンク(Inbox、Assigned to me等)を並べたnavと、 + // ユーザーが名前を付けて保存した「Views」の一覧を並べたnavの2つが並ぶ。 + // 後者はユーザーが自由に名付けられるため、"My repositories"のように辞書の + // キーと偶然完全一致すると誤訳されうる。両navにはハッシュ化されたPrimerの + // 汎用クラスしか付いておらずCSSセレクタでは区別できないが、GitHub側の実装で + // 固定リンクのnavが常にaside内で最初のnavとしてレンダリングされ、保存された + // Viewsのnavはそれ以降に続くため、aside内で2番目以降のnavをユーザー作成 + // コンテンツとして除外する + function isSavedViewsLink(el) { + if (!/^\/(pulls|issues|repos)(\/|$)/.test(location.pathname)) return false; + + const nav = el.closest('nav'); + if (!nav) return false; + const aside = nav.closest('aside'); + if (!aside) return false; + return aside.querySelector('nav') !== nav; + } + + // ActionsのJobログではユーザー定義StepとGitHub固定Stepが同じ要素構造を使う。 + // 固定の開始・終了Stepは翻訳対象に残し、それ以外のWorkflow YAML由来の名前を保護する + function isWorkflowUserStep(el) { + const stepName = el.closest('.CheckStep-titleName'); + if (!stepName) return false; + const text = stepName.textContent.trim(); + return text !== 'Set up job' && text !== 'Complete job'; + } + + // グローバルパンくずのリポジトリ切り替えは、候補listboxに用途を示す属性がなく、 + // ダイアログ名も動的ID経由のaria-labelledbyで付く。専用のトリガーボタンが開いて + // いる間だけ、同時に表示されているSelectPanel内のoptionをリポジトリ名として保護する + function isRepositorySwitcherOption(el) { + const option = el.closest('[role="option"]'); + if (!option || !option.closest('[class*="prc-SelectPanel-Overlay-"]')) return false; + return Boolean(document.querySelector('[class*="repoPickerDropdownButton"][aria-expanded="true"]')); + } + + const STANDARD_DISCUSSION_CATEGORIES = new Set([ + 'announcements', 'general', 'ideas', 'polls', 'q-a', 'q&a', 'show-and-tell' + ]); + + // Discussionカテゴリはリポジトリ管理者が作成・命名できる。一方、GitHub標準の + // 6カテゴリは辞書で意図的に翻訳しているため、標準スラッグ以外だけを保護する。 + // 一覧のカテゴリリンク、新規Discussionのカテゴリカード、検索リンクに対応する + function isCustomDiscussionCategory(el) { + // セクション作成・編集画面のカテゴリチェック項目。数値IDしか持たないため、 + // labelの先頭テキストノードにあるカテゴリ名で標準カテゴリかを判定する + if (/^\/[^/]+\/[^/]+\/discussions\/sections\/(new|\d+\/edit)$/.test(location.pathname)) { + const label = el.closest('label'); + const checkbox = label?.querySelector('input[name="section[category_ids][]"]'); + if (checkbox) { + const nameNode = [...label.childNodes] + .find((node) => node.nodeType === Node.TEXT_NODE && node.textContent.trim()); + const name = (nameNode?.textContent || '').trim().toLowerCase().replaceAll(' ', '-'); + return Boolean(name) && !STANDARD_DISCUSSION_CATEGORIES.has(name); + } + } + + // カテゴリ管理一覧はリンク先が数値IDのためURLからスラッグを取得できない。 + // 各行のEditリンクに含まれるカテゴリ名で標準カテゴリかを判定し、カスタム行では + // 名前だけでなく管理者が入力した説明もまとめて保護する + if (/^\/[^/]+\/[^/]+\/discussions\/categories$/.test(location.pathname)) { + const row = el.closest('li.Box-row'); + const editLink = row?.querySelector('a[aria-label^="Edit "][aria-label$=" category"]'); + if (editLink) { + const name = editLink.getAttribute('aria-label').slice(5, -9).toLowerCase().replaceAll(' ', '-'); + return !STANDARD_DISCUSSION_CATEGORIES.has(name); + } + } + + let link = el.closest('a[href]'); + let protectCard = false; + if (!link) { + const card = el.closest('li'); + link = card?.querySelector('a[href*="/discussions/new?category="]') || null; + protectCard = Boolean(link); + } + if (!link) return false; + + let url; + try { + url = new URL(link.getAttribute('href'), location.href); + } catch { + return false; + } + + const categoryPath = url.pathname.match(/^\/[^/]+\/[^/]+\/discussions\/categories\/([^/]+)$/); + if (categoryPath) return !STANDARD_DISCUSSION_CATEGORIES.has(categoryPath[1]); + + if (/^\/[^/]+\/[^/]+\/discussions\/new$/.test(url.pathname)) { + const category = url.searchParams.get('category'); + return protectCard && Boolean(category) && !STANDARD_DISCUSSION_CATEGORIES.has(category); + } + + if (/^\/[^/]+\/[^/]+\/discussions$/.test(url.pathname)) { + const query = url.searchParams.get('discussions_q') || ''; + const match = query.match(/category:(?:"([^"]+)"|([^\s]+))/); + const name = (match?.[1] || match?.[2] || '').toLowerCase().replaceAll(' ', '-'); + return Boolean(name) && !STANDARD_DISCUSSION_CATEGORIES.has(name); + } + return false; } function isExcludedElement(el) { - return !el || Boolean(el.closest(getExcludeSelector())) || isUserContentLink(el); + return !el || Boolean(el.closest(getExcludeSelector())) || isUserContentLink(el) || isSavedViewsLink(el) || isWorkflowUserStep(el) || isRepositorySwitcherOption(el) || isCustomDiscussionCategory(el); } async function loadDictionary(language) { @@ -278,7 +565,8 @@ const label = el.getAttribute('aria-label'); if (label) { const trimmed = label.trim(); - const translated = dict[trimmed]; + const targetMatch = el.closest('.js-release-target-wrapper') && trimmed.match(/^Target:\s+(.+)$/); + const translated = dict[trimmed] || (targetMatch && dict['Target:'] && `${dict['Target:']} ${targetMatch[1]}`); if (translated) { // 置換文字列中の "$&" 等が特殊解釈されないよう関数形式で渡す const replacement = label.replace(trimmed, () => translated); @@ -357,7 +645,11 @@ // 一致させるため、辞書引き用にのみ連続空白を単一スペースに正規化する // (置換対象は元のtrimmedのままなので、余分な改行も訳文で解消される) const lookupText = trimmed.replace(/\s+/g, ' '); - const translated = dict[lookupText]; + // リリース作成画面のTargetボタンは固定ラベルとユーザーが選択したブランチ名を + // 1つのテキストノード(例: "Target: main")に結合する。完全一致の原則を保ち + // つつ、用途を限定して固定の接頭辞だけを訳し、選択値は原文のまま保持する + const targetMatch = textNode.parentElement.closest('.js-release-target-wrapper') && lookupText.match(/^Target:\s+(.+)$/); + const translated = dict[lookupText] || (targetMatch && dict['Target:'] && `${dict['Target:']} ${targetMatch[1]}`); if (translated) { // 置換文字列中の "$&" 等が特殊解釈されないよう関数形式で渡す const replacement = value.replace(trimmed, () => translated); diff --git a/dictionaries/de.json b/dictionaries/de.json index 2bb79c0..60a0848 100644 --- a/dictionaries/de.json +++ b/dictionaries/de.json @@ -95,6 +95,75 @@ "Unsubscribe": "Abo kündigen", "Customize": "Anpassen", + // ==== Branch aus einem Issue erstellen ==== + "Create a branch for this issue": "Einen Branch für dieses Problem erstellen", + "Branch name": "Branchname", + "Repository destination": "Ziel-Repository", + "Branch source": "Branch-Quelle", + "What's next?": "Wie geht es weiter?", + "Checkout locally": "Lokal auschecken", + "Open branch with GitHub Desktop": "Branch mit GitHub Desktop öffnen", + "Create branch": "Branch erstellen", + "Copy branch name to clipboard": "Branchnamen in die Zwischenablage kopieren", + "Select a branch": "Branch auswählen", + "Select an item": "Element auswählen", + "Choose a source branch": "Quell-Branch auswählen", + + // ==== Release erstellen ==== + "New release": "Neues Release", + "Tag:": "Tag:", + "Target:": "Ziel:", + "Select tag": "Tag auswählen", + "Choose an existing tag, or create a new tag when you publish this release.": "Wähle einen vorhandenen Tag aus oder erstelle beim Veröffentlichen dieses Releases einen neuen Tag.", + "Release title": "Release-Titel", + "Enter release title": "Release-Titel eingeben", + "Release notes": "Release-Notes", + "Select a previous tag to create generated release notes": "Vorherigen Tag auswählen, um Release-Notes zu generieren", + "Generate release notes": "Release-Notes generieren", + "Release description": "Release-Beschreibung", + "Describe this release": "Dieses Release beschreiben", + "Attach binaries by dropping them here or selecting them.": "Binärdateien hier ablegen oder zum Anhängen auswählen.", + "Release label": "Release-Kennzeichnung", + "Pre-release": "Vorabversion", + "Label release as non-production ready": "Release als nicht produktionsbereit kennzeichnen", + "Additional settings": "Zusätzliche Einstellungen", + "Create a discussion for this release": "Eine Diskussion für dieses Release erstellen", + "People will be able to leave comments and reactions on this release using Discussions.": "Über Diskussionen können Kommentare und Reaktionen zu diesem Release hinterlassen werden.", + "Publish release": "Release veröffentlichen", + "Save draft": "Entwurf speichern", + "Tagging suggestions": "Vorschläge zur Tag-Benennung", + "Select a tag": "Tag auswählen", + "Filter tags": "Tags filtern", + "Search or create a new tag": "Tag suchen oder neu erstellen", + "Create new tag": "Neuen Tag erstellen", + "Pick a branch or recent commit": "Branch oder letzten Commit auswählen", + "Filter branches": "Branches filtern", + "Recent Commits": "Letzte Commits", + "Releases and Tags": "Releases und Tags", + "Create release from tag": "Release aus Tag erstellen", + "Assets": "Assets", + "Source code": "Quellcode", + + // ==== Globales Pull-Requests-Dashboard (/pulls/inbox usw.) ==== + "Inbox": "Posteingang", + "Authored by me": "Von mir erstellt", + "Involves me": "Betrifft mich", + "Review requests": "Review-Anfragen", + "Needs your review": "Erfordert deine Überprüfung", + "Needs your teams' review": "Erfordert die Überprüfung deiner Teams", + "Your drafts": "Deine Entwürfe", + "Waiting for review or checks": "Wartet auf Überprüfung oder Prüfungen", + "Needs action": "Erfordert eine Aktion", + "Ready to merge": "Bereit zum Zusammenführen", + + // ==== Globales Issues-Dashboard (/issues/assigned usw.) ==== + "Mentioning me": "Erwähnt mich", + + // ==== Globale Repository-Liste (/repos) ==== + "My contributions": "Meine Beiträge", + "My repositories": "Meine Repositorys", + "My forks": "Meine Forks", + // ==== Issue-Listenansicht ==== "Assigned to me": "Mir zugewiesen", "Created by me": "Von mir erstellt", diff --git a/dictionaries/es.json b/dictionaries/es.json index 89dc6ad..50c0b05 100644 --- a/dictionaries/es.json +++ b/dictionaries/es.json @@ -95,6 +95,75 @@ "Unsubscribe": "Cancelar suscripción", "Customize": "Personalizar", + // ==== Crear una rama desde una incidencia ==== + "Create a branch for this issue": "Crear una rama para esta incidencia", + "Branch name": "Nombre de la rama", + "Repository destination": "Repositorio de destino", + "Branch source": "Origen de la rama", + "What's next?": "¿Qué quieres hacer después?", + "Checkout locally": "Extraer localmente", + "Open branch with GitHub Desktop": "Abrir la rama con GitHub Desktop", + "Create branch": "Crear rama", + "Copy branch name to clipboard": "Copiar el nombre de la rama al portapapeles", + "Select a branch": "Seleccionar una rama", + "Select an item": "Seleccionar un elemento", + "Choose a source branch": "Elegir una rama de origen", + + // ==== Crear una versión ==== + "New release": "Nueva versión", + "Tag:": "Etiqueta:", + "Target:": "Destino:", + "Select tag": "Seleccionar etiqueta", + "Choose an existing tag, or create a new tag when you publish this release.": "Elige una etiqueta existente o crea una nueva al publicar esta versión.", + "Release title": "Título de la versión", + "Enter release title": "Introduce el título de la versión", + "Release notes": "Notas de la versión", + "Select a previous tag to create generated release notes": "Selecciona una etiqueta anterior para generar las notas de la versión", + "Generate release notes": "Generar notas de la versión", + "Release description": "Descripción de la versión", + "Describe this release": "Describe esta versión", + "Attach binaries by dropping them here or selecting them.": "Arrastra los archivos binarios aquí o selecciónalos para adjuntarlos.", + "Release label": "Etiqueta de la versión", + "Pre-release": "Versión preliminar", + "Label release as non-production ready": "Marcar la versión como no lista para producción", + "Additional settings": "Configuración adicional", + "Create a discussion for this release": "Crear un debate para esta versión", + "People will be able to leave comments and reactions on this release using Discussions.": "Las personas podrán dejar comentarios y reacciones sobre esta versión mediante los debates.", + "Publish release": "Publicar versión", + "Save draft": "Guardar borrador", + "Tagging suggestions": "Sugerencias para las etiquetas", + "Select a tag": "Seleccionar una etiqueta", + "Filter tags": "Filtrar etiquetas", + "Search or create a new tag": "Buscar o crear una etiqueta nueva", + "Create new tag": "Crear etiqueta nueva", + "Pick a branch or recent commit": "Elige una rama o un commit reciente", + "Filter branches": "Filtrar ramas", + "Recent Commits": "Commits recientes", + "Releases and Tags": "Versiones y etiquetas", + "Create release from tag": "Crear una versión desde la etiqueta", + "Assets": "Recursos", + "Source code": "Código fuente", + + // ==== Panel global de Pull requests (/pulls/inbox, etc.) ==== + "Inbox": "Bandeja de entrada", + "Authored by me": "Creadas por mí", + "Involves me": "Me involucran", + "Review requests": "Solicitudes de revisión", + "Needs your review": "Necesita tu revisión", + "Needs your teams' review": "Necesita la revisión de tu equipo", + "Your drafts": "Tus borradores", + "Waiting for review or checks": "Esperando revisión o comprobaciones", + "Needs action": "Requiere una acción", + "Ready to merge": "Listas para fusionar", + + // ==== Panel global de Issues (/issues/assigned, etc.) ==== + "Mentioning me": "Me menciona", + + // ==== Lista global de repositorios (/repos) ==== + "My contributions": "Mis contribuciones", + "My repositories": "Mis repositorios", + "My forks": "Mis forks", + // ==== Pantalla de lista de incidencias ==== "Assigned to me": "Asignadas a mí", "Created by me": "Creadas por mí", diff --git a/dictionaries/ja.json b/dictionaries/ja.json index eeb7e4a..b5d8777 100644 --- a/dictionaries/ja.json +++ b/dictionaries/ja.json @@ -95,6 +95,75 @@ "Unsubscribe": "購読解除", "Customize": "カスタマイズ", + // ==== Issueからブランチを作成 ==== + "Create a branch for this issue": "このイシュー用のブランチを作成", + "Branch name": "ブランチ名", + "Repository destination": "作成先リポジトリ", + "Branch source": "ブランチの作成元", + "What's next?": "次の操作", + "Checkout locally": "ローカルにチェックアウト", + "Open branch with GitHub Desktop": "GitHub Desktopでブランチを開く", + "Create branch": "ブランチを作成", + "Copy branch name to clipboard": "ブランチ名をクリップボードにコピー", + "Select a branch": "ブランチを選択", + "Select an item": "項目を選択", + "Choose a source branch": "作成元ブランチを選択", + + // ==== リリース作成 ==== + "New release": "新しいリリース", + "Tag:": "タグ:", + "Target:": "ターゲット:", + "Select tag": "タグを選択", + "Choose an existing tag, or create a new tag when you publish this release.": "既存のタグを選択するか、リリースの公開時に新しいタグを作成します。", + "Release title": "リリースタイトル", + "Enter release title": "リリースタイトルを入力", + "Release notes": "リリースノート", + "Select a previous tag to create generated release notes": "以前のタグを選択してリリースノートを生成", + "Generate release notes": "リリースノートを生成", + "Release description": "リリースの説明", + "Describe this release": "このリリースについて説明", + "Attach binaries by dropping them here or selecting them.": "バイナリをここにドロップするか、選択して添付します。", + "Release label": "リリースラベル", + "Pre-release": "プレリリース", + "Label release as non-production ready": "本番環境向けではないリリースとして設定", + "Additional settings": "追加設定", + "Create a discussion for this release": "このリリースのディスカッションを作成", + "People will be able to leave comments and reactions on this release using Discussions.": "ディスカッションを使用して、このリリースにコメントやリアクションを投稿できるようになります。", + "Publish release": "リリースを公開", + "Save draft": "下書きを保存", + "Tagging suggestions": "タグ付けのヒント", + "Select a tag": "タグを選択", + "Filter tags": "タグを絞り込む", + "Search or create a new tag": "タグを検索または新規作成", + "Create new tag": "新しいタグを作成", + "Pick a branch or recent commit": "ブランチまたは最近のコミットを選択", + "Filter branches": "ブランチを絞り込む", + "Recent Commits": "最近のコミット", + "Releases and Tags": "リリースとタグ", + "Create release from tag": "タグからリリースを作成", + "Assets": "アセット", + "Source code": "ソースコード", + + // ==== グローバルPull requestsダッシュボード(/pulls/inbox等) ==== + "Inbox": "受信トレイ", + "Authored by me": "自分が作成した", + "Involves me": "自分が関わっている", + "Review requests": "レビューリクエスト", + "Needs your review": "あなたのレビューが必要", + "Needs your teams' review": "あなたのチームのレビューが必要", + "Your drafts": "自分のドラフト", + "Waiting for review or checks": "レビューまたはチェック待ち", + "Needs action": "対応が必要", + "Ready to merge": "マージ可能", + + // ==== グローバルIssuesダッシュボード(/issues/assigned等) ==== + "Mentioning me": "自分がメンションされた", + + // ==== グローバルリポジトリ一覧(/repos) ==== + "My contributions": "自分のコントリビューション", + "My repositories": "自分のリポジトリ", + "My forks": "自分のフォーク", + // ==== Issue一覧画面 ==== "Assigned to me": "自分に割り当てられた", "Created by me": "自分が作成した", diff --git a/dictionaries/ko.json b/dictionaries/ko.json index e28d3b4..94e1484 100644 --- a/dictionaries/ko.json +++ b/dictionaries/ko.json @@ -95,6 +95,75 @@ "Unsubscribe": "구독 취소", "Customize": "사용자 지정", + // ==== 이슈에서 브랜치 만들기 ==== + "Create a branch for this issue": "이 이슈에 대한 브랜치 만들기", + "Branch name": "브랜치 이름", + "Repository destination": "대상 리포지토리", + "Branch source": "브랜치 원본", + "What's next?": "다음 단계", + "Checkout locally": "로컬에서 체크아웃", + "Open branch with GitHub Desktop": "GitHub Desktop으로 브랜치 열기", + "Create branch": "브랜치 만들기", + "Copy branch name to clipboard": "브랜치 이름을 클립보드에 복사", + "Select a branch": "브랜치 선택", + "Select an item": "항목 선택", + "Choose a source branch": "원본 브랜치 선택", + + // ==== 릴리스 만들기 ==== + "New release": "새 릴리스", + "Tag:": "태그:", + "Target:": "대상:", + "Select tag": "태그 선택", + "Choose an existing tag, or create a new tag when you publish this release.": "기존 태그를 선택하거나 릴리스를 게시할 때 새 태그를 만드세요.", + "Release title": "릴리스 제목", + "Enter release title": "릴리스 제목 입력", + "Release notes": "릴리스 노트", + "Select a previous tag to create generated release notes": "이전 태그를 선택하여 릴리스 노트 생성", + "Generate release notes": "릴리스 노트 생성", + "Release description": "릴리스 설명", + "Describe this release": "이 릴리스에 대한 설명", + "Attach binaries by dropping them here or selecting them.": "바이너리를 여기에 놓거나 선택하여 첨부하세요.", + "Release label": "릴리스 레이블", + "Pre-release": "시험판", + "Label release as non-production ready": "프로덕션 준비가 되지 않은 릴리스로 표시", + "Additional settings": "추가 설정", + "Create a discussion for this release": "이 릴리스에 대한 토론 만들기", + "People will be able to leave comments and reactions on this release using Discussions.": "Discussions를 사용하여 이 릴리스에 댓글과 반응을 남길 수 있습니다.", + "Publish release": "릴리스 게시", + "Save draft": "초안 저장", + "Tagging suggestions": "태그 지정 제안", + "Select a tag": "태그 선택", + "Filter tags": "태그 필터링", + "Search or create a new tag": "태그 검색 또는 새로 만들기", + "Create new tag": "새 태그 만들기", + "Pick a branch or recent commit": "브랜치 또는 최근 커밋 선택", + "Filter branches": "브랜치 필터링", + "Recent Commits": "최근 커밋", + "Releases and Tags": "릴리스 및 태그", + "Create release from tag": "태그에서 릴리스 만들기", + "Assets": "자산", + "Source code": "소스 코드", + + // ==== 전체 Pull requests 대시보드 (/pulls/inbox 등) ==== + "Inbox": "받은 편지함", + "Authored by me": "내가 작성함", + "Involves me": "나와 관련됨", + "Review requests": "리뷰 요청", + "Needs your review": "내 리뷰가 필요함", + "Needs your teams' review": "내 팀의 리뷰가 필요함", + "Your drafts": "내 초안", + "Waiting for review or checks": "리뷰 또는 검사 대기 중", + "Needs action": "조치가 필요함", + "Ready to merge": "병합 준비 완료", + + // ==== 전체 Issues 대시보드 (/issues/assigned 등) ==== + "Mentioning me": "나를 멘션함", + + // ==== 전체 저장소 목록 (/repos) ==== + "My contributions": "내 기여", + "My repositories": "내 리포지토리", + "My forks": "내 포크", + // ==== 이슈 목록 화면 ==== "Assigned to me": "나에게 할당됨", "Created by me": "내가 만듦", diff --git a/dictionaries/pt-BR.json b/dictionaries/pt-BR.json index f011213..259a890 100644 --- a/dictionaries/pt-BR.json +++ b/dictionaries/pt-BR.json @@ -95,6 +95,75 @@ "Unsubscribe": "Cancelar inscrição", "Customize": "Personalizar", + // ==== Criar um branch a partir de um problema ==== + "Create a branch for this issue": "Criar um branch para este problema", + "Branch name": "Nome do branch", + "Repository destination": "Repositório de destino", + "Branch source": "Origem do branch", + "What's next?": "O que vem a seguir?", + "Checkout locally": "Fazer checkout localmente", + "Open branch with GitHub Desktop": "Abrir o branch com o GitHub Desktop", + "Create branch": "Criar branch", + "Copy branch name to clipboard": "Copiar o nome do branch para a área de transferência", + "Select a branch": "Selecionar um branch", + "Select an item": "Selecionar um item", + "Choose a source branch": "Escolher um branch de origem", + + // ==== Criar uma versão ==== + "New release": "Nova versão", + "Tag:": "Tag:", + "Target:": "Destino:", + "Select tag": "Selecionar tag", + "Choose an existing tag, or create a new tag when you publish this release.": "Escolha uma tag existente ou crie uma nova ao publicar esta versão.", + "Release title": "Título da versão", + "Enter release title": "Digite o título da versão", + "Release notes": "Notas da versão", + "Select a previous tag to create generated release notes": "Selecione uma tag anterior para gerar as notas da versão", + "Generate release notes": "Gerar notas da versão", + "Release description": "Descrição da versão", + "Describe this release": "Descreva esta versão", + "Attach binaries by dropping them here or selecting them.": "Solte os arquivos binários aqui ou selecione-os para anexar.", + "Release label": "Rótulo da versão", + "Pre-release": "Pré-lançamento", + "Label release as non-production ready": "Marcar a versão como não pronta para produção", + "Additional settings": "Configurações adicionais", + "Create a discussion for this release": "Criar uma discussão para esta versão", + "People will be able to leave comments and reactions on this release using Discussions.": "As pessoas poderão deixar comentários e reações nesta versão usando as Discussões.", + "Publish release": "Publicar versão", + "Save draft": "Salvar rascunho", + "Tagging suggestions": "Sugestões de tags", + "Select a tag": "Selecionar uma tag", + "Filter tags": "Filtrar tags", + "Search or create a new tag": "Pesquisar ou criar uma nova tag", + "Create new tag": "Criar nova tag", + "Pick a branch or recent commit": "Escolha um branch ou commit recente", + "Filter branches": "Filtrar branches", + "Recent Commits": "Commits recentes", + "Releases and Tags": "Versões e tags", + "Create release from tag": "Criar versão a partir da tag", + "Assets": "Recursos", + "Source code": "Código-fonte", + + // ==== Painel global de Pull requests (/pulls/inbox etc.) ==== + "Inbox": "Caixa de entrada", + "Authored by me": "Criados por mim", + "Involves me": "Me envolve", + "Review requests": "Solicitações de revisão", + "Needs your review": "Precisa da sua revisão", + "Needs your teams' review": "Precisa da revisão da sua equipe", + "Your drafts": "Seus rascunhos", + "Waiting for review or checks": "Aguardando revisão ou verificações", + "Needs action": "Requer uma ação", + "Ready to merge": "Prontas para mesclagem", + + // ==== Painel global de Issues (/issues/assigned etc.) ==== + "Mentioning me": "Me menciona", + + // ==== Lista global de repositórios (/repos) ==== + "My contributions": "Minhas contribuições", + "My repositories": "Meus repositórios", + "My forks": "Meus forks", + // ==== Tela de lista de issues ==== "Assigned to me": "Atribuídos a mim", "Created by me": "Criados por mim", diff --git a/dictionaries/zh-CN.json b/dictionaries/zh-CN.json index d0b2a6d..cfb412f 100644 --- a/dictionaries/zh-CN.json +++ b/dictionaries/zh-CN.json @@ -95,6 +95,75 @@ "Unsubscribe": "取消订阅", "Customize": "自定义", + // ==== 从议题创建分支 ==== + "Create a branch for this issue": "为此议题创建分支", + "Branch name": "分支名称", + "Repository destination": "目标仓库", + "Branch source": "分支来源", + "What's next?": "接下来做什么?", + "Checkout locally": "在本地签出", + "Open branch with GitHub Desktop": "使用 GitHub Desktop 打开分支", + "Create branch": "创建分支", + "Copy branch name to clipboard": "将分支名称复制到剪贴板", + "Select a branch": "选择分支", + "Select an item": "选择一个项目", + "Choose a source branch": "选择源分支", + + // ==== 创建发行版 ==== + "New release": "新建发行版", + "Tag:": "标签:", + "Target:": "目标:", + "Select tag": "选择标签", + "Choose an existing tag, or create a new tag when you publish this release.": "选择现有标签,或在发布此发行版时创建新标签。", + "Release title": "发行版标题", + "Enter release title": "输入发行版标题", + "Release notes": "发行说明", + "Select a previous tag to create generated release notes": "选择以前的标签以生成发行说明", + "Generate release notes": "生成发行说明", + "Release description": "发行版描述", + "Describe this release": "描述此发行版", + "Attach binaries by dropping them here or selecting them.": "将二进制文件拖放到此处或选择文件进行附加。", + "Release label": "发行版标签", + "Pre-release": "预发行版", + "Label release as non-production ready": "将发行版标记为尚未准备好用于生产环境", + "Additional settings": "其他设置", + "Create a discussion for this release": "为此发行版创建讨论", + "People will be able to leave comments and reactions on this release using Discussions.": "用户可以通过讨论对此发行版发表评论和回应。", + "Publish release": "发布发行版", + "Save draft": "保存草稿", + "Tagging suggestions": "标签建议", + "Select a tag": "选择标签", + "Filter tags": "筛选标签", + "Search or create a new tag": "搜索或创建新标签", + "Create new tag": "创建新标签", + "Pick a branch or recent commit": "选择分支或最近的提交", + "Filter branches": "筛选分支", + "Recent Commits": "最近的提交", + "Releases and Tags": "发行版和标签", + "Create release from tag": "从标签创建发行版", + "Assets": "资源", + "Source code": "源代码", + + // ==== 全局 Pull requests 仪表盘(/pulls/inbox 等) ==== + "Inbox": "收件箱", + "Authored by me": "我创建的", + "Involves me": "涉及我", + "Review requests": "审查请求", + "Needs your review": "需要你的审查", + "Needs your teams' review": "需要你的团队审查", + "Your drafts": "你的草稿", + "Waiting for review or checks": "等待审查或检查", + "Needs action": "需要处理", + "Ready to merge": "可以合并", + + // ==== 全局 Issues 仪表盘(/issues/assigned 等) ==== + "Mentioning me": "提及我", + + // ==== 全局仓库列表(/repos) ==== + "My contributions": "我的贡献", + "My repositories": "我的仓库", + "My forks": "我的复刻", + // ==== Issue 列表页面 ==== "Assigned to me": "指派给我的", "Created by me": "我创建的",