diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c71687..b7a56b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,16 @@ Notable user-facing changes to PullMark. Release notes for GitHub releases are extracted from this file by `scripts/make-release.sh` — keep the `## Unreleased` section current as features land. +## Unreleased + +- **PullMark speaks seven languages.** The entire app — menus, settings, + alerts, the sidebar, and every rendered-page control — is now + available in 中文, 日本語, Français, Deutsch, Nederlands, Español, and + Português, alongside English. PullMark follows your system language + automatically, or pick one in Settings → General → Language (each + language names itself) and relaunch with one click. Dates, counts, + and relative times follow your language's own conventions. + ## 0.40.0 - 2026-08-20 - **Pasted GitHub screenshots finally render.** Images attached to PR diff --git a/Makefile b/Makefile index bc6796d..618d795 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ build: test: swift test $(TEST_FLAGS) + python3 scripts/check-strings.py app: ./scripts/make-app.sh diff --git a/Sources/PullMark/App/AppLinkRouter.swift b/Sources/PullMark/App/AppLinkRouter.swift index a666ef4..45ccd03 100644 --- a/Sources/PullMark/App/AppLinkRouter.swift +++ b/Sources/PullMark/App/AppLinkRouter.swift @@ -33,14 +33,11 @@ enum AppLinkRouter { let version = Bundle.main.object( forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "dev" let alert = NSAlert() - alert.messageText = "That link needs a different version of PullMark" - alert.informativeText = "This version (\(version)) doesn't know " - + "\(url.absoluteString) — it may point at a feature from a newer " - + "release, or one that has moved. Checking for updates usually " - + "resolves it." - alert.addButton(withTitle: "Check for Updates…") - alert.addButton(withTitle: "Report an Issue…") - alert.addButton(withTitle: "Close") + alert.messageText = String(localized: "That link needs a different version of PullMark") + alert.informativeText = String(localized: "This version (\(version)) doesn't know \(url.absoluteString) — it may point at a feature from a newer release, or one that has moved. Checking for updates usually resolves it.") + alert.addButton(withTitle: String(localized: "Check for Updates…")) + alert.addButton(withTitle: String(localized: "Report an Issue…")) + alert.addButton(withTitle: String(localized: "Close")) NSApp.activate(ignoringOtherApps: true) switch alert.runModal() { case .alertFirstButtonReturn: diff --git a/Sources/PullMark/App/AppRelaunch.swift b/Sources/PullMark/App/AppRelaunch.swift new file mode 100644 index 0000000..c153cb0 --- /dev/null +++ b/Sources/PullMark/App/AppRelaunch.swift @@ -0,0 +1,16 @@ +import AppKit + +/// Quit-and-reopen for settings that only apply at launch (today: the +/// language override). A detached shell outlives the app, waits out +/// the termination, and opens the bundle fresh — the standard trick, +/// since `open` against a still-running instance would just focus it. +enum AppRelaunch { + static func relaunch() { + let path = Bundle.main.bundleURL.path + let task = Process() + task.executableURL = URL(fileURLWithPath: "/bin/sh") + task.arguments = ["-c", "sleep 0.6; /usr/bin/open \"$0\"", path] + try? task.run() + NSApp.terminate(nil) + } +} diff --git a/Sources/PullMark/App/AppState.swift b/Sources/PullMark/App/AppState.swift index 12a768a..fc3cfc1 100644 --- a/Sources/PullMark/App/AppState.swift +++ b/Sources/PullMark/App/AppState.swift @@ -951,7 +951,7 @@ final class AppState: ObservableObject { panel.canChooseFiles = true panel.canChooseDirectories = true panel.allowsMultipleSelection = true - panel.message = "Open Markdown files or a folder containing them" + panel.message = String(localized: "Open Markdown files or a folder containing them") guard panel.runModal() == .OK else { return } for url in panel.urls { add(url: url) } } @@ -962,7 +962,7 @@ final class AppState: ObservableObject { panel.canChooseFiles = true panel.canChooseDirectories = false panel.allowsMultipleSelection = true - panel.message = "Open Markdown files" + panel.message = String(localized: "Open Markdown files") guard panel.runModal() == .OK else { return } for url in panel.urls { add(url: url) } } @@ -972,7 +972,7 @@ final class AppState: ObservableObject { panel.canChooseFiles = false panel.canChooseDirectories = true panel.allowsMultipleSelection = false - panel.message = "Open a folder containing Markdown files" + panel.message = String(localized: "Open a folder containing Markdown files") guard panel.runModal() == .OK else { return } for url in panel.urls { add(url: url) } } @@ -1507,7 +1507,7 @@ final class AppState: ObservableObject { folders[index].truncated = truncated folders[index].git = git if initialScan, filePaths.isEmpty { - lastNotice = "No Markdown files found in \(root.lastPathComponent)." + lastNotice = String(localized: "No Markdown files found in \(root.lastPathComponent).") } } else { // The root vanished (unmounted volume, deleted @@ -2004,10 +2004,9 @@ final class AppState: ObservableObject { /// client already appends a sign-in hint when no credentials resolved). static func remoteFailureMessage(_ error: Error, what: String) -> String { if let api = error as? GitHubClient.APIError, api.status == 404 { - return "Couldn't open \(what): \(api.message). It may not exist at that ref, " - + "or it may be a private repository your GitHub credentials can't access." + return String(localized: "Couldn't open \(what): \(api.message). It may not exist at that ref, or it may be a private repository your GitHub credentials can't access.") } - return "Couldn't open \(what): \(error.localizedDescription)" + return String(localized: "Couldn't open \(what): \(error.localizedDescription)") } /// The 60s quiet tick for the frontmost PR (spec: pr-cockpit): @@ -2161,7 +2160,7 @@ final class AppState: ObservableObject { // queue through the stale index (code-review catch). await refreshCockpit(sessionID: sessionID) } catch { - lastError = "Could not refresh \(session.id): \(error.localizedDescription)" + lastError = String(localized: "Could not refresh \(session.id): \(error.localizedDescription)") } } @@ -2381,7 +2380,7 @@ final class AppState: ObservableObject { guard let serverID = comment.serverID else { // Landed by the atomic create, id not echoed back yet (see // stateAfterCreate) — a server-side delete needs the id. - lastError = "This comment is still syncing with GitHub — try discarding it again in a moment." + lastError = String(localized: "This comment is still syncing with GitHub — try discarding it again in a moment.") return } let ref = prSessions[index].ref @@ -2390,7 +2389,7 @@ final class AppState: ObservableObject { try await client.deleteReviewComment(ref, commentID: serverID) await adoptPendingReview(sessionID: sessionID) } catch { - lastError = "Could not discard the pending comment: \(error.localizedDescription)" + lastError = String(localized: "Could not discard the pending comment: \(error.localizedDescription)") } } } @@ -2563,8 +2562,9 @@ final class AppState: ObservableObject { let count = prSessions.first(where: { $0.id == sessionID })? .queuedComments.count ?? 0 if count > 0 { - lastError = "Could not upload \(count) pending comment\(count == 1 ? "" : "s") " - + "to GitHub — kept locally for retry. \(error.localizedDescription)" + lastError = count == 1 + ? String(localized: "Could not upload 1 pending comment to GitHub — kept locally for retry. \(error.localizedDescription)") + : String(localized: "Could not upload \(count) pending comments to GitHub — kept locally for retry. \(error.localizedDescription)") } return } @@ -2679,7 +2679,7 @@ final class AppState: ObservableObject { } clearPendingState(sessionID: sessionID) } catch { - lastError = "Could not abandon the review: \(error.localizedDescription)" + lastError = String(localized: "Could not abandon the review: \(error.localizedDescription)") } } diff --git a/Sources/PullMark/App/DMGGreeter.swift b/Sources/PullMark/App/DMGGreeter.swift index 4b658b9..e3a3c01 100644 --- a/Sources/PullMark/App/DMGGreeter.swift +++ b/Sources/PullMark/App/DMGGreeter.swift @@ -32,11 +32,10 @@ enum DMGGreeter { private static func offerMove(_ image: DiskImages.MountedImage) { let alert = NSAlert() - alert.messageText = "Move PullMark to your Applications folder?" - alert.informativeText = "PullMark is running from its disk image. " - + "Moving it to Applications installs it properly and enables one-click updates." - alert.addButton(withTitle: "Move to Applications") - alert.addButton(withTitle: "Not Now") + alert.messageText = String(localized: "Move PullMark to your Applications folder?") + alert.informativeText = String(localized: "PullMark is running from its disk image. Moving it to Applications installs it properly and enables one-click updates.") + alert.addButton(withTitle: String(localized: "Move to Applications")) + alert.addButton(withTitle: String(localized: "Not Now")) guard alert.runModal() == .alertFirstButtonReturn else { return } let destination = "/Applications/PullMark.app" @@ -48,8 +47,8 @@ enum DMGGreeter { try fm.copyItem(atPath: Bundle.main.bundlePath, toPath: destination) } catch { let failure = NSAlert() - failure.messageText = "Couldn't move PullMark" - failure.informativeText = "Drag PullMark to Applications in the Finder instead. (\(error.localizedDescription))" + failure.messageText = String(localized: "Couldn't move PullMark") + failure.informativeText = String(localized: "Drag PullMark to Applications in the Finder instead. (\(error.localizedDescription))") failure.runModal() return } @@ -67,11 +66,10 @@ enum DMGGreeter { private static func offerCleanup(_ image: DiskImages.MountedImage) { let file = (image.imagePath as NSString).lastPathComponent let alert = NSAlert() - alert.messageText = "Remove the PullMark disk image?" - alert.informativeText = "PullMark is installed — the disk image is no longer needed. " - + "This ejects it and moves “\(file)” to the Trash." - alert.addButton(withTitle: "Move to Trash") - alert.addButton(withTitle: "Keep") + alert.messageText = String(localized: "Remove the PullMark disk image?") + alert.informativeText = String(localized: "PullMark is installed — the disk image is no longer needed. This ejects it and moves “\(file)” to the Trash.") + alert.addButton(withTitle: String(localized: "Move to Trash")) + alert.addButton(withTitle: String(localized: "Keep")) guard alert.runModal() == .alertFirstButtonReturn else { var declined = UserDefaults.pullmark.stringArray(forKey: DefaultsKeys.dmgCleanupDeclined) ?? [] declined.append(image.imagePath) diff --git a/Sources/PullMark/App/DocumentExport.swift b/Sources/PullMark/App/DocumentExport.swift index 1d9ee4f..02f787a 100644 --- a/Sources/PullMark/App/DocumentExport.swift +++ b/Sources/PullMark/App/DocumentExport.swift @@ -17,7 +17,7 @@ enum DocumentExport { case .success(let data): write(data, to: url, onError: onError) case .failure(let error): - onError("Could not create the PDF: \(error.localizedDescription)") + onError(String(localized: "Could not create the PDF: \(error.localizedDescription)")) } } } @@ -27,7 +27,7 @@ enum DocumentExport { else { return } document.proxy.pageDOM { dom in guard let dom else { - onError("Could not read the rendered page.") + onError(String(localized: "Could not read the rendered page.")) return } let html = selfContainedHTML(dom: dom, document: document) @@ -117,7 +117,7 @@ enum DocumentExport { do { try data.write(to: url) } catch { - onError("Could not save \(url.lastPathComponent): \(error.localizedDescription)") + onError(String(localized: "Could not save \(url.lastPathComponent): \(error.localizedDescription)")) } } } diff --git a/Sources/PullMark/App/PullMarkApp.swift b/Sources/PullMark/App/PullMarkApp.swift index 6b9c79b..4571210 100644 --- a/Sources/PullMark/App/PullMarkApp.swift +++ b/Sources/PullMark/App/PullMarkApp.swift @@ -89,7 +89,7 @@ struct PullMarkApp: App { .keyboardShortcut(shortcuts.keyboardShortcut(for: .prFlipLayout)) .disabled(!prFileSelected) Button(state?.resolvedConversationsVisible == true - ? "Hide Resolved Conversations" : "Show Resolved Conversations") { + ? String(localized: "Hide Resolved Conversations") : String(localized: "Show Resolved Conversations")) { state?.resolvedConversationsVisible.toggle() } .keyboardShortcut(shortcuts.keyboardShortcut(for: .showResolvedConversations)) @@ -183,7 +183,7 @@ struct PullMarkApp: App { } private var copyGitHubLinkAlternate: some View { - Button(githubLinkDefaultIsPermalink ? "Copy GitHub Branch Link" : "Copy GitHub Permalink") { + Button(githubLinkDefaultIsPermalink ? String(localized: "Copy GitHub Branch Link") : String(localized: "Copy GitHub Permalink")) { copyGitHubLink(permalink: !githubLinkDefaultIsPermalink) } .disabled(selectionGitHubLinkURL == nil) @@ -296,7 +296,7 @@ struct PullMarkApp: App { if let root = LocalGit.repoRoot(for: url) { state?.commitRequest = CommitRequest(root: root) } else { - state?.lastNotice = "\(url.lastPathComponent) isn't inside a git repository." + state?.lastNotice = String(localized: "\(url.lastPathComponent) isn't inside a git repository.") } } .keyboardShortcut(shortcuts.keyboardShortcut(for: .commitChanges)) @@ -306,9 +306,9 @@ struct PullMarkApp: App { guard let url = activeLocalFileURL else { return } do { try EditHistory.revertLastEdit(for: url) - state?.lastNotice = "Reverted the last edit to \(url.lastPathComponent)." + state?.lastNotice = String(localized: "Reverted the last edit to \(url.lastPathComponent).") } catch { - state?.lastError = "Couldn't revert: \(error.localizedDescription)" + state?.lastError = String(localized: "Couldn't revert: \(error.localizedDescription)") } } .keyboardShortcut(shortcuts.keyboardShortcut(for: .revertLastEdit)) @@ -346,8 +346,7 @@ struct PullMarkApp: App { Button("Copy as Markdown") { copyAsMarkdown() } .keyboardShortcut(shortcuts.keyboardShortcut(for: .copyAsMarkdown)) .disabled(state?.activeDocument == nil) - .help("Copies the Markdown source of the selected blocks " - + "(whole blocks — or the whole document when nothing is selected)") + .help("Copies the Markdown source of the selected blocks (whole blocks — or the whole document when nothing is selected)") } CommandGroup(after: .textEditing) { Button("Find in Page") { state?.findBarVisible = true } @@ -390,8 +389,7 @@ struct PullMarkApp: App { updates.historyMarkdown = history updates.showHistory = true } else { - state.lastNotice = "Release notes couldn't be loaded — " - + "they're also at github.com/jedijashwa/pullmark/releases." + state.lastNotice = String(localized: "Release notes couldn't be loaded — they're also at github.com/jedijashwa/pullmark/releases.") } } } @@ -436,13 +434,13 @@ struct PullMarkApp: App { } } Divider() - Button(state?.sourceViewVisible == true ? "Hide Markdown Source" : "Show Markdown Source") { + Button(state?.sourceViewVisible == true ? String(localized: "Hide Markdown Source") : String(localized: "Show Markdown Source")) { state?.sourceViewVisible.toggle() } .keyboardShortcut(shortcuts.keyboardShortcut(for: .toggleSource)) .disabled(state?.activeDocument == nil) .help("Temporarily show the raw Markdown behind the rendered document") - Button(outlineVisible ? "Hide Outline" : "Show Outline") { + Button(outlineVisible ? String(localized: "Hide Outline") : String(localized: "Show Outline")) { outlineVisible.toggle() } .keyboardShortcut(shortcuts.keyboardShortcut(for: .toggleOutline)) @@ -457,15 +455,13 @@ struct PullMarkApp: App { } .disabled(activeLocalFileURL == nil || state?.expectedSurfaceToolbar?.compareGitAvailable != true) - .help("What changed since the last commit, rendered like a PR " - + "diff — the toolbar's Compare button offers older " - + "revisions and branches") - Button(marginNotesVisible ? "Hide Margin Notes" : "Show Margin Notes") { + .help("What changed since the last commit, rendered like a PR diff — the toolbar's Compare button offers older revisions and branches") + Button(marginNotesVisible ? String(localized: "Hide Margin Notes") : String(localized: "Show Margin Notes")) { marginNotesVisible.toggle() } .keyboardShortcut(shortcuts.keyboardShortcut(for: .toggleMarginNotes)) .help("Margin-note bubbles ( comments) in rendered documents") - Button(showHiddenFiles ? "Hide Hidden Files" : "Show Hidden Files") { + Button(showHiddenFiles ? String(localized: "Hide Hidden Files") : String(localized: "Show Hidden Files")) { showHiddenFiles.toggle() } .keyboardShortcut(shortcuts.keyboardShortcut(for: .toggleHiddenFiles)) @@ -586,6 +582,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate { NSApp.setActivationPolicy(.regular) NSApp.activate(ignoringOtherApps: true) Appearance.applyCurrent() + // Pin the launch language before any UI (or the user) can + // change the stored value — the Settings row compares against it. + _ = AppLanguage.atLaunch let cliURLs = LaunchArguments.consumeFileURLs() if !cliURLs.isEmpty { OpenURLRouter.shared.deliver(cliURLs) diff --git a/Sources/PullMark/App/ShortcutStore.swift b/Sources/PullMark/App/ShortcutStore.swift index 56fcf4e..a7118f5 100644 --- a/Sources/PullMark/App/ShortcutStore.swift +++ b/Sources/PullMark/App/ShortcutStore.swift @@ -58,7 +58,7 @@ final class ShortcutStore: ObservableObject { case .notBindable: return "Shortcuts need ⌘ or ⌃ (function keys can stand alone)." case .reserved(let combo, let command): - return "\(combo.display) is reserved for \(command)." + return String(localized: "\(combo.display) is reserved for \(command).") case .taken(let combo, let action): return "\(combo.display) is already used by “\(action.title)”." } diff --git a/Sources/PullMark/App/UpdateChecker.swift b/Sources/PullMark/App/UpdateChecker.swift index 68e70c4..d2652ba 100644 --- a/Sources/PullMark/App/UpdateChecker.swift +++ b/Sources/PullMark/App/UpdateChecker.swift @@ -427,7 +427,7 @@ final class UpdateChecker: ObservableObject { Task { @MainActor in if let message = await checkManually() { let alert = NSAlert() - alert.messageText = "Check for Updates" + alert.messageText = String(localized: "Check for Updates") alert.informativeText = message NSApp.activate(ignoringOtherApps: true) alert.runModal() diff --git a/Sources/PullMark/Core/AppLanguage.swift b/Sources/PullMark/Core/AppLanguage.swift new file mode 100644 index 0000000..fc36f81 --- /dev/null +++ b/Sources/PullMark/Core/AppLanguage.swift @@ -0,0 +1,57 @@ +import Foundation + +/// The in-app language override (spec: app-i18n). Stored as the +/// AppleLanguages array in the app's own defaults domain — the same +/// mechanism the system's per-app Language & Region setting uses, so +/// the two never fight: whichever wrote last wins, exactly like every +/// other app. Strings resolve at launch, so a change applies the next +/// time PullMark opens. +enum AppLanguage: String, CaseIterable, Identifiable { + case system + case english = "en" + case chinese = "zh-Hans" + case japanese = "ja" + case french = "fr" + case german = "de" + case dutch = "nl" + case spanish = "es" + case portuguese = "pt-BR" + + var id: String { rawValue } + + /// Every language names itself — deliberately never translated, + /// matching the site's switcher: a reader hunting for their own + /// language finds it in that language. + var label: String { + switch self { + case .system: return String(localized: "System") + case .english: return "English" + case .chinese: return "中文" + case .japanese: return "日本語" + case .french: return "Français" + case .german: return "Deutsch" + case .dutch: return "Nederlands" + case .spanish: return "Español" + case .portuguese: return "Português" + } + } + + /// The language this process actually launched with — pinned at + /// startup (PullMarkApp touches it) so the Settings row can tell a + /// pending change from the status quo and offer a relaunch. + static let atLaunch: AppLanguage = current + + static var current: AppLanguage { + guard let languages = UserDefaults.pullmark.array(forKey: "AppleLanguages") as? [String], + let first = languages.first else { return .system } + return AppLanguage(rawValue: first) ?? .system + } + + func apply() { + if self == .system { + UserDefaults.pullmark.removeObject(forKey: "AppleLanguages") + } else { + UserDefaults.pullmark.set([rawValue], forKey: "AppleLanguages") + } + } +} diff --git a/Sources/PullMark/Core/AppLinks.swift b/Sources/PullMark/Core/AppLinks.swift index 3bdeb5a..bfa748b 100644 --- a/Sources/PullMark/Core/AppLinks.swift +++ b/Sources/PullMark/Core/AppLinks.swift @@ -15,6 +15,7 @@ enum AppLinks { "compare", "settings", "settings/general", + "settings/general/language", "settings/themes", "settings/keyboard", "settings/experimental", diff --git a/Sources/PullMark/Core/Appearance.swift b/Sources/PullMark/Core/Appearance.swift index c8da1e4..580224b 100644 --- a/Sources/PullMark/Core/Appearance.swift +++ b/Sources/PullMark/Core/Appearance.swift @@ -11,9 +11,9 @@ enum Appearance: String, CaseIterable, Identifiable { var label: String { switch self { - case .system: return "System" - case .light: return "Light" - case .dark: return "Dark" + case .system: return String(localized: "System") + case .light: return String(localized: "Light") + case .dark: return String(localized: "Dark") } } diff --git a/Sources/PullMark/Core/Blame.swift b/Sources/PullMark/Core/Blame.swift index 7016429..5227260 100644 --- a/Sources/PullMark/Core/Blame.swift +++ b/Sources/PullMark/Core/Blame.swift @@ -177,21 +177,26 @@ enum BlameMapper { /// "3 weeks ago"-style label, computed in Swift so the page shows plain /// strings (no date logic in JS). static func relativeLabel(from date: Date, to now: Date = Date()) -> String { - func plural(_ n: Int, _ unit: String) -> String { - "\(n) \(unit)\(n == 1 ? "" : "s") ago" + // Same bucketing as always; the FORMATTING is the system's + // relative formatter, so every locale gets its own units and + // plural rules (spec: app-i18n). + func spell(_ components: DateComponents) -> String { + let formatter = RelativeDateTimeFormatter() + formatter.unitsStyle = .full + return formatter.localizedString(from: components) } let seconds = now.timeIntervalSince(date) - if seconds < 45 { return "just now" } + if seconds < 45 { return String(localized: "just now") } let minutes = max(1, Int((seconds / 60).rounded())) - if minutes < 60 { return plural(minutes, "minute") } + if minutes < 60 { return spell(DateComponents(minute: -minutes)) } let hours = Int((seconds / 3600).rounded()) - if hours < 24 { return plural(hours, "hour") } + if hours < 24 { return spell(DateComponents(hour: -hours)) } let days = Int((seconds / 86400).rounded()) - if days < 7 { return plural(days, "day") } - if days < 30 { return plural(days / 7, "week") } + if days < 7 { return spell(DateComponents(day: -days)) } + if days < 30 { return spell(DateComponents(weekOfMonth: -(days / 7))) } let months = Int((Double(days) / 30.44).rounded()) - if months < 12 { return plural(max(1, months), "month") } - return plural(max(1, Int(Double(days) / 365.25)), "year") + if months < 12 { return spell(DateComponents(month: -max(1, months))) } + return spell(DateComponents(year: -max(1, Int(Double(days) / 365.25)))) } } diff --git a/Sources/PullMark/Core/ContentWidth.swift b/Sources/PullMark/Core/ContentWidth.swift index 9e8967d..d47d44c 100644 --- a/Sources/PullMark/Core/ContentWidth.swift +++ b/Sources/PullMark/Core/ContentWidth.swift @@ -17,9 +17,9 @@ enum ContentWidth: String, CaseIterable, Identifiable { var label: String { switch self { - case .standard: return "Standard" - case .wide: return "Wide" - case .full: return "Full Width" + case .standard: return String(localized: "Standard") + case .wide: return String(localized: "Wide") + case .full: return String(localized: "Full Width") } } diff --git a/Sources/PullMark/Core/KeyboardShortcuts.swift b/Sources/PullMark/Core/KeyboardShortcuts.swift index a4cb8fd..81e909b 100644 --- a/Sources/PullMark/Core/KeyboardShortcuts.swift +++ b/Sources/PullMark/Core/KeyboardShortcuts.swift @@ -26,11 +26,13 @@ struct KeyCombo: Codable, Equatable, Hashable { ] private static let spokenKeys: [String: String] = [ - "escape": "Escape", "return": "Return", "tab": "Tab", "space": "Space", - "delete": "Delete", "forwarddelete": "Forward Delete", - "up": "Up Arrow", "down": "Down Arrow", "left": "Left Arrow", - "right": "Right Arrow", "home": "Home", "end": "End", - "pageup": "Page Up", "pagedown": "Page Down", + "escape": String(localized: "Escape"), "return": String(localized: "Return"), + "tab": String(localized: "Tab"), "space": String(localized: "Space"), + "delete": String(localized: "Delete"), "forwarddelete": String(localized: "Forward Delete"), + "up": String(localized: "Up Arrow"), "down": String(localized: "Down Arrow"), + "left": String(localized: "Left Arrow"), "right": String(localized: "Right Arrow"), + "home": String(localized: "Home"), "end": String(localized: "End"), + "pageup": String(localized: "Page Up"), "pagedown": String(localized: "Page Down"), ] var isFunctionKey: Bool { key.hasPrefix("f") && Int(key.dropFirst()) != nil } @@ -54,10 +56,10 @@ struct KeyCombo: Codable, Equatable, Hashable { /// VoiceOver reads glyph strings unreliably — "Shift Command O". var spoken: String { var parts: [String] = [] - if control { parts.append("Control") } - if option { parts.append("Option") } - if shift { parts.append("Shift") } - if command { parts.append("Command") } + if control { parts.append(String(localized: "Control")) } + if option { parts.append(String(localized: "Option")) } + if shift { parts.append(String(localized: "Shift")) } + if command { parts.append(String(localized: "Command")) } parts.append(Self.spokenKeys[key] ?? (isFunctionKey ? key.uppercased() : key.uppercased())) return parts.joined(separator: " ") } @@ -75,26 +77,26 @@ struct KeyCombo: Codable, Equatable, Hashable { // right and a key that never fires. if command, !option, !control, !shift { switch key { - case "space": return "Spotlight" - case "tab": return "the app switcher" - case "`": return "cycling windows" + case "space": return String(localized: "Spotlight") + case "tab": return String(localized: "the app switcher") + case "`": return String(localized: "cycling windows") default: break } } if control, !command, !option, ["up", "down", "left", "right"].contains(key) { - return "Mission Control" + return String(localized: "Mission Control") } // Fixed keys the app's own sheets and palettes own (Esc to // dismiss, ⌘↩ to commit) — they can't be rebound, so nothing // else may claim them either. if !command, !option, !control, !shift, key == "escape" { - return "dismissing sheets" + return String(localized: "dismissing sheets") } if command, !option, !control, !shift, key == "return" { - return "confirming sheets" + return String(localized: "confirming sheets") } if command, shift, !option, !control { - let shifted = ["z": "Redo", "/": "the Help menu"] + let shifted = ["z": String(localized: "Redo"), "/": String(localized: "the Help menu")] return shifted[key] } guard command, !option, !control, !shift else { return nil } @@ -128,47 +130,47 @@ enum ShortcutAction: String, CaseIterable, Codable { var title: String { switch self { - case .openFile: return "Open…" - case .openPullRequest: return "Open Pull Request…" - case .openQuickly: return "Open Quickly…" - case .commitChanges: return "Commit Changes…" - case .revertLastEdit: return "Revert Last Edit" - case .revealInFinder: return "Reveal in Finder" - case .copyPath: return "Copy Path" - case .copyGitHubLink: return "Copy GitHub Link" - case .refreshFolder: return "Refresh Folder" - case .clearRecents: return "Clear Recents" - case .closeAllFiles: return "Close All Files" - case .pageSetup: return "Page Setup…" - case .printDocument: return "Print…" - case .exportPDF: return "Export as PDF…" - case .exportHTML: return "Export as HTML…" - case .editMode: return "Edit Mode" - case .copyAsMarkdown: return "Copy as Markdown" - case .findInPage: return "Find in Page" - case .findNext: return "Find Next" - case .findPrevious: return "Find Previous" - case .searchAllFiles: return "Search All Files…" - case .toggleOutline: return "Show/Hide Outline" - case .toggleSource: return "Show/Hide Markdown Source" - case .reloadDocument: return "Reload Document" - case .zoomIn: return "Zoom In" - case .zoomOut: return "Zoom Out" - case .actualSize: return "Actual Size" - case .goBack: return "Back" - case .goForward: return "Forward" - case .prRenderedDiff: return "Rendered Diff" - case .prSourceDiff: return "Source Diff" - case .prResult: return "Result" - case .prFlipLayout: return "Flip Diff Layout" - case .reviewChanges: return "Review Changes…" + case .openFile: return String(localized: "Open…") + case .openPullRequest: return String(localized: "Open Pull Request…") + case .openQuickly: return String(localized: "Open Quickly…") + case .commitChanges: return String(localized: "Commit Changes…") + case .revertLastEdit: return String(localized: "Revert Last Edit") + case .revealInFinder: return String(localized: "Reveal in Finder") + case .copyPath: return String(localized: "Copy Path") + case .copyGitHubLink: return String(localized: "Copy GitHub Link") + case .refreshFolder: return String(localized: "Refresh Folder") + case .clearRecents: return String(localized: "Clear Recents") + case .closeAllFiles: return String(localized: "Close All Files") + case .pageSetup: return String(localized: "Page Setup…") + case .printDocument: return String(localized: "Print…") + case .exportPDF: return String(localized: "Export as PDF…") + case .exportHTML: return String(localized: "Export as HTML…") + case .editMode: return String(localized: "Edit Mode") + case .copyAsMarkdown: return String(localized: "Copy as Markdown") + case .findInPage: return String(localized: "Find in Page") + case .findNext: return String(localized: "Find Next") + case .findPrevious: return String(localized: "Find Previous") + case .searchAllFiles: return String(localized: "Search All Files…") + case .toggleOutline: return String(localized: "Show/Hide Outline") + case .toggleSource: return String(localized: "Show/Hide Markdown Source") + case .reloadDocument: return String(localized: "Reload Document") + case .zoomIn: return String(localized: "Zoom In") + case .zoomOut: return String(localized: "Zoom Out") + case .actualSize: return String(localized: "Actual Size") + case .goBack: return String(localized: "Back") + case .goForward: return String(localized: "Forward") + case .prRenderedDiff: return String(localized: "Rendered Diff") + case .prSourceDiff: return String(localized: "Source Diff") + case .prResult: return String(localized: "Result") + case .prFlipLayout: return String(localized: "Flip Diff Layout") + case .reviewChanges: return String(localized: "Review Changes…") // The menu item's title flips Show/Hide with state; the settings // row names the toggle itself. - case .showResolvedConversations: return "Show/Hide Resolved Conversations" - case .addMarginNote: return "Add Margin Note" - case .addFileMarginNote: return "File Margin Note…" - case .toggleMarginNotes: return "Show/Hide Margin Notes" - case .toggleHiddenFiles: return "Show/Hide Hidden Files" + case .showResolvedConversations: return String(localized: "Show/Hide Resolved Conversations") + case .addMarginNote: return String(localized: "Add Margin Note") + case .addFileMarginNote: return String(localized: "File Margin Note…") + case .toggleMarginNotes: return String(localized: "Show/Hide Margin Notes") + case .toggleHiddenFiles: return String(localized: "Show/Hide Hidden Files") } } @@ -180,23 +182,23 @@ enum ShortcutAction: String, CaseIterable, Codable { .revertLastEdit, .revealInFinder, .copyPath, .copyGitHubLink, .refreshFolder, .clearRecents, .closeAllFiles, .pageSetup, .printDocument, .exportPDF, .exportHTML: - return "File" + return String(localized: "File") case .editMode, .copyAsMarkdown, .addMarginNote, .addFileMarginNote, .findInPage, .findNext, .findPrevious, .searchAllFiles: - return "Edit" + return String(localized: "Edit") case .toggleOutline, .toggleSource, .reloadDocument, .zoomIn, .zoomOut, .actualSize, .toggleMarginNotes, .toggleHiddenFiles: - return "View" + return String(localized: "View") case .goBack, .goForward: - return "Go" + return String(localized: "Go") case .prRenderedDiff, .prSourceDiff, .prResult, .prFlipLayout, .reviewChanges, .showResolvedConversations: - return "Pull Requests" + return String(localized: "Pull Requests") } } /// Categories in the order the Keyboard settings tab shows them. - static let categories = ["File", "Edit", "View", "Go", "Pull Requests"] + static let categories = [String(localized: "File"), String(localized: "Edit"), String(localized: "View"), String(localized: "Go"), String(localized: "Pull Requests")] /// Where the action applies. Every action has a menu item that greys /// out when it doesn't apply; this says so in the settings list too, @@ -204,27 +206,27 @@ enum ShortcutAction: String, CaseIterable, Codable { var scopeNote: String? { switch self { case .toggleOutline, .reloadDocument, .editMode: - return "In a local document" + return String(localized: "In a local document") case .revealInFinder, .copyPath: - return "With a local file or folder selected" + return String(localized: "With a local file or folder selected") case .copyGitHubLink: - return "With a local file or folder in a GitHub repository selected" + return String(localized: "With a local file or folder in a GitHub repository selected") case .closeAllFiles: - return "With files in Open Files" + return String(localized: "With files in Open Files") case .refreshFolder: - return "With a folder selected" + return String(localized: "With a folder selected") case .findNext, .findPrevious: - return "While the find bar is open" + return String(localized: "While the find bar is open") case .goBack, .goForward: - return "After navigating between documents" + return String(localized: "After navigating between documents") case .prRenderedDiff, .prSourceDiff, .prResult, .prFlipLayout: - return "In a pull request file" + return String(localized: "In a pull request file") case .reviewChanges: - return "In a pull request" + return String(localized: "In a pull request") case .showResolvedConversations: - return "In a pull request file's Result view" + return String(localized: "In a pull request file's Result view") case .addMarginNote, .addFileMarginNote: - return "In a local document" + return String(localized: "In a local document") default: return nil } diff --git a/Sources/PullMark/Core/ReviewControl.swift b/Sources/PullMark/Core/ReviewControl.swift index 6e57494..9530997 100644 --- a/Sources/PullMark/Core/ReviewControl.swift +++ b/Sources/PullMark/Core/ReviewControl.swift @@ -33,14 +33,17 @@ enum ReviewControl { /// The toolbar control is both the status and the entry point: quiet /// when nothing is pending, a call to finish when something is. static func buttonLabel(pendingCount: Int) -> String { - pendingCount == 0 ? "Review changes" : "Finish your review · \(pendingCount)" + pendingCount == 0 + ? String(localized: "Review changes") + : String(localized: "Finish your review · \(pendingCount)") } /// The popover's header, spelling the count out in words. static func headerLabel(pendingCount: Int) -> String { - pendingCount == 0 - ? "Review changes" - : "Finish your review — \(pendingCount) pending comment\(pendingCount == 1 ? "" : "s")" + if pendingCount == 0 { return String(localized: "Review changes") } + return pendingCount == 1 + ? String(localized: "Finish your review — 1 pending comment") + : String(localized: "Finish your review — \(pendingCount) pending comments") } /// True only when both logins are known and match. A nil viewer diff --git a/Sources/PullMark/GitHub/GitHubClient.swift b/Sources/PullMark/GitHub/GitHubClient.swift index c10e71b..24f4713 100644 --- a/Sources/PullMark/GitHub/GitHubClient.swift +++ b/Sources/PullMark/GitHub/GitHubClient.swift @@ -7,7 +7,7 @@ final class GitHubClient { struct APIError: LocalizedError { let status: Int let message: String - var errorDescription: String? { "GitHub API error (\(status)): \(message)" } + var errorDescription: String? { String(localized: "GitHub API error (\(status)): \(message)") } } private var cachedToken: String? @@ -226,7 +226,7 @@ final class GitHubClient { /// attachments posted in public repos (spec: github-user-attachments). func attachmentData(path: String) async throws -> (data: Data, mimeType: String?) { guard !DemoMode.active else { - throw APIError(status: -1, message: "PullMark is in demo mode — network access is disabled.") + throw APIError(status: -1, message: String(localized: "PullMark is in demo mode — network access is disabled.")) } guard let url = URL(string: "https://github.com/\(path)") else { throw APIError(status: -1, message: "Invalid attachment path") @@ -1424,7 +1424,7 @@ final class GitHubClient { // here): demo mode is offline by construction, not by hoping // every caller remembered its own guard. guard !DemoMode.active else { - throw APIError(status: -1, message: "PullMark is in demo mode — network access is disabled.") + throw APIError(status: -1, message: String(localized: "PullMark is in demo mode — network access is disabled.")) } var components = URLComponents(string: "https://api.github.com")! components.path = path diff --git a/Sources/PullMark/GitHub/ReviewThreads.swift b/Sources/PullMark/GitHub/ReviewThreads.swift index 7f83091..2fdd23c 100644 --- a/Sources/PullMark/GitHub/ReviewThreads.swift +++ b/Sources/PullMark/GitHub/ReviewThreads.swift @@ -15,15 +15,16 @@ struct ReviewThread: Equatable { var isOutdated: Bool { root.line == nil && !isFileLevel } var lineLabel: String { - if isFileLevel { return "Whole file" } + if isFileLevel { return String(localized: "Whole file") } if let line = root.line { - let which = anchorSide == "LEFT" ? "old" : "new" - return "Line \(line) (\(which))" + return anchorSide == "LEFT" + ? String(localized: "Line \(line) (old)") + : String(localized: "Line \(line) (new)") } if let original = root.originalLine { - return "Outdated — was line \(original)" + return String(localized: "Outdated — was line \(original)") } - return "Outdated" + return String(localized: "Outdated") } } diff --git a/Sources/PullMark/GitHub/SystemGitCredentials.swift b/Sources/PullMark/GitHub/SystemGitCredentials.swift index e26da09..dc8949e 100644 --- a/Sources/PullMark/GitHub/SystemGitCredentials.swift +++ b/Sources/PullMark/GitHub/SystemGitCredentials.swift @@ -14,8 +14,8 @@ enum SystemGitCredentials { var label: String { switch self { - case .githubCLI: return "GitHub CLI" - case .credentialHelper: return "git credential helper" + case .githubCLI: return String(localized: "GitHub CLI") + case .credentialHelper: return String(localized: "git credential helper") } } } diff --git a/Sources/PullMark/Rendering/HTMLBuilder.swift b/Sources/PullMark/Rendering/HTMLBuilder.swift index 5e4e5b7..7aff5ba 100644 --- a/Sources/PullMark/Rendering/HTMLBuilder.swift +++ b/Sources/PullMark/Rendering/HTMLBuilder.swift @@ -109,6 +109,11 @@ enum HTMLBuilder { /// the timeline is empty — a PR overview always offers the /// comment box; other pages never do. var conversationComposer: Bool? + /// Localized UI strings for the page (PageStrings.table) — + /// keyed by the English string, consumed by app.js's pmString. + /// Stamped centrally in page(payload:); previews skip it (they + /// render fixed sample content and keep pages byte-stable). + var strings: [String: String]? } /// Options for rendering a file that lives in a GitHub repo. @@ -343,6 +348,7 @@ enum HTMLBuilder { } payload.remoteLinkPolicy = UserDefaults.pullmark.string(forKey: DefaultsKeys.remoteLinkPolicy) ?? "ask" payload.githubAttachments = true + payload.strings = PageStrings.table } return """ diff --git a/Sources/PullMark/Rendering/MarkdownWebView.swift b/Sources/PullMark/Rendering/MarkdownWebView.swift index 69c53b7..a4a66f3 100644 --- a/Sources/PullMark/Rendering/MarkdownWebView.swift +++ b/Sources/PullMark/Rendering/MarkdownWebView.swift @@ -254,7 +254,7 @@ struct MarkdownWebView: NSViewRepresentable { // Our commands ride along when a selection exists (Copy is // only offered on selections, so it's the reliable signal). if hadCopy { - let item = NSMenuItem(title: "Copy as Markdown", + let item = NSMenuItem(title: String(localized: "Copy as Markdown"), action: #selector(copySelectionAsMarkdown), keyEquivalent: "") item.target = self diff --git a/Sources/PullMark/Rendering/PageStrings.swift b/Sources/PullMark/Rendering/PageStrings.swift new file mode 100644 index 0000000..afeabb9 --- /dev/null +++ b/Sources/PullMark/Rendering/PageStrings.swift @@ -0,0 +1,107 @@ +import Foundation + +/// The rendered page's UI strings (spec: app-i18n). app.js copy is +/// unreachable by .strings lookup, so every key rides the render +/// payload, resolved here via Bundle.main. Keys are the English +/// strings; templated keys use {name} placeholders substituted by +/// app.js's pmFormat. scripts/check-strings.py verifies this table +/// covers every pmString/pmFormat key in app.js. +enum PageStrings { + static let table: [String: String] = { + var strings: [String: String] = [:] + for key in keys { + strings[key] = NSLocalizedString(key, comment: "rendered page") + } + return strings + }() + + static let keys: [String] = [ + " · was {r}", + "(empty)", + "Add a margin note", + "Add a suggestion", + "Add reaction", + "Add single comment", + "Cancel", + "Click the gutter for history", + "Comment", + "Comment actions", + "Comment on line {n}", + "Comment on lines {a}–{b}", + "Comment on new line {n}", + "Comment on new line {n} — shift-click extends the range", + "Comment on new lines {a}–{b}", + "Comment on old line {n} — shift-click extends the range", + "Comment on old lines {a}–{b}", + "Comment on the pull request conversation", + "Conversation", + "Copy full SHA", + "Couldn't load this image from GitHub · ", + "Delete", + "Edit", + "File comments", + "Front matter", + "Hide {n} resolved conversation", + "Hide {n} resolved conversations", + "Insert a ```suggestion block pre-filled with the current lines", + "LEFT", + "Leave a comment", + "Line {n}", + "Lines {a}–{b}", + "Moved from line {n} — content unchanged", + "No headings", + "Not synced", + "Old line {n}", + "Old lines {a}–{b}", + "Open on GitHub", + "Open this conversation on GitHub — PullMark doesn't render this file", + "Open {path} and jump to this conversation", + "Outdated review comments", + "Pending", + "Pending comment — click to expand", + "Pending comments — click to expand", + "Post to the PR conversation right away — not part of a review (⌘↩)", + "Reply", + "Reply to this thread (⌘↩)", + "Resolve", + "Resolved", + "Review discussion", + "Save", + "Save your edit (⌘↩)", + "Show on GitHub", + "Show {n} resolved conversation", + "Show {n} resolved conversations", + "Suggested change", + "Suggestions can only target new-file lines — GitHub applies them in place of the commented lines.", + "The conversation could not be loaded — retrying.", + "The targeted lines aren't available to suggest an edit to.", + "This block isn't part of the pull request's diff — GitHub can only attach comments to changed lines.", + "This file is empty on both sides of the diff.", + "Unresolve", + "View commit on GitHub", + "View in File", + "Write a reply", + "Write at the end of the document", + "all conversations resolved", + "approved these changes", + "bot", + "copied", + "dismissed their review", + "moved", + "requested changes", + "reviewed", + "whole document", + "{n} comment", + "{n} comment — click to expand", + "{n} comments", + "{n} comments — click to expand", + "{n} review", + "{n} reviews", + "{n} unresolved conversation", + "{n} unresolved conversations", + " · edited", + "· asks where to open", + "· opens in PullMark", + "· opens in browser", + ] +} diff --git a/Sources/PullMark/Resources/app.js b/Sources/PullMark/Resources/app.js index 662101c..c889424 100644 --- a/Sources/PullMark/Resources/app.js +++ b/Sources/PullMark/Resources/app.js @@ -38,6 +38,24 @@ // Parse through a real Marked instance: the UMD namespace's methods are // read-only getters, so fixWalkTokens couldn't patch walkTokens on it. + // ---- Localized page strings (spec: app-i18n) ---- + // The render payload carries a strings table resolved Swift-side via + // Bundle.main; keys are the English strings. Absent table or key + // (previews, missing translation) falls back to the English key — + // the same silent-English failure mode .strings files have, which + // scripts/check-strings.py exists to catch. + function pmString(key) { + return (payload.strings && payload.strings[key]) || key; + } + // Templated variant: pmFormat("Comment on line {n}", {n: 12}) + function pmFormat(key, subs) { + var out = pmString(key); + Object.keys(subs).forEach(function (name) { + out = out.replace("{" + name + "}", subs[name]); + }); + return out; + } + var MarkedCtor = marked.Marked; marked = new MarkedCtor(); @@ -255,10 +273,10 @@ } var note = document.createElement("span"); note.className = "pm-attachment-missing-note"; - note.textContent = "Couldn't load this image from GitHub · "; + note.textContent = pmString("Couldn't load this image from GitHub · "); var link = document.createElement("a"); link.href = original; - link.textContent = "Open on GitHub"; + link.textContent = pmString("Open on GitHub"); note.append(link); box.append(note); img.replaceWith(box); @@ -390,7 +408,7 @@ details.className = "pm-frontmatter"; if (open) { details.open = true; } var summary = document.createElement("summary"); - summary.textContent = "Front matter"; + summary.textContent = pmString("Front matter"); details.append(summary); var table = document.createElement("table"); table.className = "pm-frontmatter-table"; @@ -464,9 +482,9 @@ function suffixFor(href) { var policy = payload.remoteLinkPolicy; if (!policy || !isGitHubDocLink(href)) { return ""; } - if (policy === "ask") { return "· asks where to open"; } + if (policy === "ask") { return pmString("· asks where to open"); } var inApp = policy === "pullmark" ? !cmdHeld : cmdHeld; - return inApp ? "· opens in PullMark" : "· opens in browser"; + return inApp ? pmString("· opens in PullMark") : pmString("· opens in browser"); } function render() { @@ -550,7 +568,7 @@ wrap.className = "pm-suggestion"; var label = document.createElement("div"); label.className = "pm-suggestion-label"; - label.textContent = "Suggested change"; + label.textContent = pmString("Suggested change"); if (pre.dataset.pmLines) { wrap.dataset.pmLines = pre.dataset.pmLines; } pre.replaceWith(wrap); wrap.append(label, pre); @@ -598,7 +616,7 @@ if (!items.length) { var empty = document.createElement("p"); empty.className = "pm-toc-empty"; - empty.textContent = "No headings"; + empty.textContent = pmString("No headings"); nav.append(empty); return; } @@ -1114,15 +1132,15 @@ if (run.url) { sha = document.createElement("a"); sha.href = run.url; // opened externally by the navigation delegate - sha.title = "View commit on GitHub"; + sha.title = pmString("View commit on GitHub"); } else { sha = document.createElement("button"); sha.type = "button"; - sha.title = "Copy full SHA"; + sha.title = pmString("Copy full SHA"); sha.addEventListener("click", function (event) { event.stopPropagation(); post({ type: "copySHA", sha: run.sha }); - sha.textContent = "copied"; + sha.textContent = pmString("copied"); setTimeout(function () { sha.textContent = run.shortSHA; }, 900); }); } @@ -1157,7 +1175,7 @@ if (!run.uncommitted) { actions.append(shaChipEl(run)); } var hint = document.createElement("span"); hint.className = "pm-blame-pop-hint"; - hint.textContent = "Click the gutter for history"; + hint.textContent = pmString("Click the gutter for history"); actions.append(hint); pop.append(actions); } @@ -1248,7 +1266,8 @@ // their labels are grid items (see app.css), only nudged here. function rangeText(start, end) { - return start === end ? "Line " + start : "Lines " + start + "–" + end; + return start === end ? pmFormat("Line {n}", {n: start}) + : pmFormat("Lines {a}–{b}", {a: start, b: end}); } // The y of the first line of visible content — not the box top: a @@ -1582,8 +1601,10 @@ function updateResolvedControl() { if (!resolvedControl) { return; } // Symmetric verb labels: both states say what the click will do. - resolvedControl.textContent = (resolvedShown ? "Hide " : "Show ") - + resolvedCount + " resolved conversation" + (resolvedCount === 1 ? "" : "s"); + resolvedControl.textContent = pmFormat(resolvedShown + ? (resolvedCount === 1 ? "Hide {n} resolved conversation" : "Hide {n} resolved conversations") + : (resolvedCount === 1 ? "Show {n} resolved conversation" : "Show {n} resolved conversations"), + {n: resolvedCount}); } function applyVisibility() { @@ -1605,16 +1626,18 @@ cluster.badge.querySelector(".pm-marker-count").textContent = count; cluster.badge.classList.toggle("pm-marker-resolved", visible.every(function (t) { return t.resolved === true; })); - cluster.badge.title = count + (count === 1 ? " comment" : " comments") - + " — click to expand"; + cluster.badge.title = pmFormat(count === 1 + ? "{n} comment — click to expand" + : "{n} comments — click to expand", {n: count}); cluster.badge.setAttribute("aria-label", cluster.badge.title); } if (cluster.pendingBadge) { cluster.pendingBadge.style.display = hasPending ? "" : "none"; cluster.pendingBadge.querySelector(".pm-marker-count").textContent = cluster.pendings.length; - cluster.pendingBadge.title = "Pending comment" - + (cluster.pendings.length === 1 ? "" : "s") + " — click to expand"; + cluster.pendingBadge.title = pmString(cluster.pendings.length === 1 + ? "Pending comment — click to expand" + : "Pending comments — click to expand"); cluster.pendingBadge.setAttribute("aria-label", cluster.pendingBadge.title); } if (clusterOpen(cluster)) { @@ -1720,7 +1743,7 @@ if (div.querySelector("img, svg, hr, video, iframe, input, object, embed, canvas")) { return; } var label = document.createElement("span"); label.className = "pm-blank-label"; - label.textContent = "(empty)"; + label.textContent = pmString("(empty)"); div.append(label); } @@ -1731,8 +1754,9 @@ btn.className = "pm-comment-btn"; btn.type = "button"; btn.innerHTML = COMMENT_ICON; - btn.title = "Comment on " + (seg.side === "LEFT" ? "old" : "new") + - " lines " + seg.lineStart + "–" + seg.lineEnd; + btn.title = pmFormat(seg.side === "LEFT" + ? "Comment on old lines {a}–{b}" : "Comment on new lines {a}–{b}", + {a: seg.lineStart, b: seg.lineEnd}); btn.setAttribute("aria-label", btn.title); btn.addEventListener("click", function (event) { event.stopPropagation(); @@ -1766,7 +1790,7 @@ summary.type = "button"; summary.className = "pm-thread-summary"; var author = (thread.comments && thread.comments[0] && thread.comments[0].author) || ""; - summary.textContent = (author ? author + " · " : "") + "Resolved"; + summary.textContent = (author ? author + " · " : "") + pmString("Resolved"); // A real disclosure chevron that rotates on expand — one icon, // one width, no glyph-swap wobble. summary.prepend(svgIcon("chevron", "pm-summary-chevron")); @@ -1788,7 +1812,7 @@ actions.className = "pm-thread-actions"; var reply = document.createElement("button"); reply.type = "button"; - reply.textContent = "Reply"; + reply.textContent = pmString("Reply"); reply.addEventListener("click", function () { toggleReplyComposer(box, thread.rootID, reply); }); @@ -1796,7 +1820,7 @@ if (thread.resolved !== null && thread.resolved !== undefined) { var resolve = document.createElement("button"); resolve.type = "button"; - resolve.textContent = thread.resolved ? "Unresolve" : "Resolve"; + resolve.textContent = thread.resolved ? pmString("Unresolve") : pmString("Resolve"); resolve.addEventListener("click", function () { post({ type: "threadResolve", rootID: thread.rootID, resolved: !thread.resolved }); }); @@ -1835,14 +1859,14 @@ if (c.bot) { var botTag = document.createElement("span"); botTag.className = "pm-bot-tag"; - botTag.textContent = "bot"; + botTag.textContent = pmString("bot"); head.append(botTag); } head.append(document.createTextNode(c.dateLabel ? " · " + c.dateLabel : "")); if (c.edited) { var edited = document.createElement("span"); edited.className = "pm-edited"; - edited.textContent = " · edited"; + edited.textContent = pmString(" · edited"); head.append(edited); } var body = document.createElement("div"); @@ -1991,8 +2015,8 @@ add.type = "button"; add.className = "pm-react-add"; add.innerHTML = SMILEY_ICON; - add.title = "Add reaction"; - add.setAttribute("aria-label", "Add reaction"); + add.title = pmString("Add reaction"); + add.setAttribute("aria-label", pmString("Add reaction")); add.setAttribute("aria-haspopup", "true"); add.addEventListener("click", function () { if (transientPopup && transientPopup.anchor === add) { closeTransientPopup(); return; } @@ -2110,8 +2134,8 @@ btn.type = "button"; btn.className = "pm-comment-menu-btn"; btn.textContent = "⋯"; - btn.title = "Comment actions"; - btn.setAttribute("aria-label", "Comment actions"); + btn.title = pmString("Comment actions"); + btn.setAttribute("aria-label", pmString("Comment actions")); btn.setAttribute("aria-haspopup", "menu"); btn.addEventListener("click", function () { if (transientPopup && transientPopup.anchor === btn) { closeTransientPopup(); return; } @@ -2121,7 +2145,7 @@ var edit = document.createElement("button"); edit.type = "button"; edit.setAttribute("role", "menuitem"); - edit.textContent = "Edit"; + edit.textContent = pmString("Edit"); edit.addEventListener("click", function () { closeTransientPopup(); openEditComposer(c, card, bodyEl); @@ -2130,7 +2154,7 @@ del.type = "button"; del.setAttribute("role", "menuitem"); del.className = "pm-menu-destructive"; - del.textContent = "Delete"; + del.textContent = pmString("Delete"); del.addEventListener("click", function () { closeTransientPopup(); post({ type: "commentDelete", commentID: c.id, source: c.source }); @@ -2159,12 +2183,12 @@ actions.className = "pm-composer-actions"; var cancel = document.createElement("button"); cancel.type = "button"; - cancel.textContent = "Cancel"; + cancel.textContent = pmString("Cancel"); var save = document.createElement("button"); save.type = "button"; save.className = "pm-composer-primary"; - save.textContent = "Save"; - save.title = "Save your edit (⌘↩)"; + save.textContent = pmString("Save"); + save.title = pmString("Save your edit (⌘↩)"); actions.append(cancel, save); root.append(ta, actions); @@ -2266,12 +2290,12 @@ tags.className = "pm-pending-tags"; var tag = document.createElement("span"); tag.className = "pm-pending-tag"; - tag.textContent = "Pending"; + tag.textContent = pmString("Pending"); tags.append(tag); if (item.uploaded === false) { var queued = document.createElement("span"); queued.className = "pm-pending-tag pm-pending-queued"; - queued.textContent = "Not synced"; + queued.textContent = pmString("Not synced"); tags.append(queued); } header.append(label, tags); @@ -2493,30 +2517,29 @@ var suggest = document.createElement("button"); suggest.type = "button"; suggest.className = "pm-composer-suggest"; - suggest.textContent = "Add a suggestion"; + suggest.textContent = pmString("Add a suggestion"); var caption = document.createElement("span"); caption.className = "pm-composer-caption"; bar.append(suggest, caption); var ta = document.createElement("textarea"); ta.className = "pm-composer-text"; - ta.placeholder = "Leave a comment"; + ta.placeholder = pmString("Leave a comment"); ta.rows = 3; var note = document.createElement("div"); note.className = "pm-composer-note"; - note.textContent = "These lines are outside the pull request's diff, " - + "so GitHub can't attach a comment to them."; + note.textContent = pmString("These lines are outside the pull request's diff, so GitHub can't attach a comment to them."); var actions = document.createElement("div"); actions.className = "pm-composer-actions"; var cancel = document.createElement("button"); cancel.type = "button"; - cancel.textContent = "Cancel"; + cancel.textContent = pmString("Cancel"); var secondary = document.createElement("button"); secondary.type = "button"; - secondary.textContent = "Add single comment"; - secondary.title = "Post immediately, outside any pending review (⇧⌘↩)"; + secondary.textContent = pmString("Add single comment"); + secondary.title = pmString("Post immediately, outside any pending review (⇧⌘↩)"); var primary = document.createElement("button"); primary.type = "button"; primary.className = "pm-composer-primary"; @@ -2558,14 +2581,13 @@ secondary.disabled = !valid || empty; if (opts.side !== "RIGHT") { suggest.disabled = true; - suggest.title = "Suggestions can only target new-file lines — " - + "GitHub applies them in place of the commented lines."; + suggest.title = pmString("Suggestions can only target new-file lines — GitHub applies them in place of the commented lines."); } else if (seedText() === null || !valid) { suggest.disabled = true; - suggest.title = "The targeted lines aren't available to suggest an edit to."; + suggest.title = pmString("The targeted lines aren't available to suggest an edit to."); } else { suggest.disabled = false; - suggest.title = "Insert a ```suggestion block pre-filled with the current lines"; + suggest.title = pmString("Insert a ```suggestion block pre-filled with the current lines"); } } @@ -2737,18 +2759,18 @@ root.className = "pm-reply-composer"; var ta = document.createElement("textarea"); ta.className = "pm-composer-text"; - ta.placeholder = "Write a reply"; + ta.placeholder = pmString("Write a reply"); ta.rows = 2; var actions = document.createElement("div"); actions.className = "pm-composer-actions"; var cancel = document.createElement("button"); cancel.type = "button"; - cancel.textContent = "Cancel"; + cancel.textContent = pmString("Cancel"); var send = document.createElement("button"); send.type = "button"; send.className = "pm-composer-primary"; - send.textContent = "Reply"; - send.title = "Reply to this thread (⌘↩)"; + send.textContent = pmString("Reply"); + send.title = pmString("Reply to this thread (⌘↩)"); actions.append(cancel, send); root.append(ta, actions); @@ -2935,8 +2957,7 @@ bubble.innerHTML = COMMENT_ICON; if (!mapped) { bubble.classList.add("pm-comment-unavailable"); - bubble.title = "This block isn't part of the pull request's diff — " - + "GitHub can only attach comments to changed lines."; + bubble.title = pmString("This block isn't part of the pull request's diff — GitHub can only attach comments to changed lines."); bubble.setAttribute("aria-disabled", "true"); bubble.setAttribute("aria-label", bubble.title); tools.append(bubble); @@ -2969,7 +2990,7 @@ prefillSuggestion: suggest }); } - bubble.title = "Comment on lines " + mapped[0] + "–" + mapped[1]; + bubble.title = pmFormat("Comment on lines {a}–{b}", {a: mapped[0], b: mapped[1]}); bubble.setAttribute("aria-label", bubble.title); bubble.addEventListener("click", function (event) { event.stopPropagation(); @@ -3062,7 +3083,7 @@ actions.className = "pm-composer-actions"; var cancel = document.createElement("button"); cancel.type = "button"; - cancel.textContent = "Cancel"; + cancel.textContent = pmString("Cancel"); var primary = document.createElement("button"); primary.type = "button"; primary.className = "pm-composer-primary"; @@ -3145,7 +3166,7 @@ if (note.fileLevel) { var scope = document.createElement("span"); scope.className = "pm-note-scope"; - scope.textContent = "whole document"; + scope.textContent = pmString("whole document"); head.append(scope); } var body = document.createElement("div"); @@ -3161,7 +3182,7 @@ actions.className = "pm-note-actions"; var edit = document.createElement("button"); edit.type = "button"; - edit.textContent = "Edit"; + edit.textContent = pmString("Edit"); edit.addEventListener("click", function () { noteIntroGate(function () { card.style.display = "none"; @@ -3178,7 +3199,7 @@ }); var del = document.createElement("button"); del.type = "button"; - del.textContent = "Delete"; + del.textContent = pmString("Delete"); del.addEventListener("click", function () { noteIntroGate(function () { post({ type: "noteDelete", index: note.index }); @@ -3345,7 +3366,7 @@ bubble.type = "button"; bubble.className = "pm-comment-btn"; bubble.innerHTML = COMMENT_ICON; - bubble.title = "Add a margin note"; + bubble.title = pmString("Add a margin note"); bubble.setAttribute("aria-label", bubble.title); bubble.addEventListener("click", function (event) { event.stopPropagation(); @@ -3549,15 +3570,14 @@ action.type = "button"; action.className = "pm-discussion-action"; if (group.isMarkdown) { - action.textContent = "View in File"; - action.title = "Open " + group.path + " and jump to this conversation"; + action.textContent = pmString("View in File"); + action.title = pmFormat("Open {path} and jump to this conversation", {path: group.path}); action.addEventListener("click", function () { post({ type: "openPRComment", path: group.path, rootID: item.rootID }); }); } else { - action.textContent = "Show on GitHub"; - action.title = "Open this conversation on GitHub — PullMark doesn't " - + "render this file"; + action.textContent = pmString("Show on GitHub"); + action.title = pmString("Open this conversation on GitHub — PullMark doesn't render this file"); action.addEventListener("click", function () { if (item.htmlUrl) { post({ type: "openExternal", url: item.htmlUrl }); } }); @@ -3583,10 +3603,10 @@ function verdictText(kind) { switch (kind) { - case "approved": return "approved these changes"; - case "changes_requested": return "requested changes"; - case "dismissed": return "dismissed their review"; - default: return "reviewed"; + case "approved": return pmString("approved these changes"); + case "changes_requested": return pmString("requested changes"); + case "dismissed": return pmString("dismissed their review"); + default: return pmString("reviewed"); } } @@ -3656,15 +3676,15 @@ root.className = "pm-reply-composer pm-conversation-composer"; var ta = document.createElement("textarea"); ta.className = "pm-composer-text"; - ta.placeholder = "Comment on the pull request conversation"; + ta.placeholder = pmString("Comment on the pull request conversation"); ta.rows = 2; var actions = document.createElement("div"); actions.className = "pm-composer-actions"; var send = document.createElement("button"); send.type = "button"; send.className = "pm-composer-primary"; - send.textContent = "Comment"; - send.title = "Post to the PR conversation right away — not part of a review (⌘↩)"; + send.textContent = pmString("Comment"); + send.title = pmString("Post to the PR conversation right away — not part of a review (⌘↩)"); actions.append(send); root.append(ta, actions); @@ -3715,7 +3735,7 @@ section.className = "pm-conversation pm-annotation"; var heading = document.createElement("h2"); heading.className = "pm-discussion-heading"; - heading.textContent = "Conversation"; + heading.textContent = pmString("Conversation"); if (entries.length) { // The count carries state, not arithmetic — "5 entries" counts // what's already visible; reviews vs comments says what kind of @@ -3723,8 +3743,12 @@ var reviews = entries.filter(function (e) { return e.kind !== "comment"; }).length; var comments = entries.length - reviews; var parts = []; - if (reviews) { parts.push(reviews + " review" + (reviews === 1 ? "" : "s")); } - if (comments) { parts.push(comments + " comment" + (comments === 1 ? "" : "s")); } + if (reviews) { + parts.push(pmFormat(reviews === 1 ? "{n} review" : "{n} reviews", {n: reviews})); + } + if (comments) { + parts.push(pmFormat(comments === 1 ? "{n} comment" : "{n} comments", {n: comments})); + } var count = document.createElement("span"); count.className = "pm-discussion-count"; count.textContent = parts.join(" · "); @@ -3734,7 +3758,7 @@ if (payload.conversationUnavailable) { var note = document.createElement("p"); note.className = "pm-empty-note"; - note.textContent = "The conversation could not be loaded — retrying."; + note.textContent = pmString("The conversation could not be loaded — retrying."); section.append(note); } entries.forEach(function (entry) { @@ -3801,12 +3825,13 @@ }, 0); var heading = document.createElement("h2"); heading.className = "pm-discussion-heading"; - heading.textContent = "Review discussion"; + heading.textContent = pmString("Review discussion"); var count = document.createElement("span"); count.className = "pm-discussion-count"; count.textContent = unresolved === 0 - ? "all conversations resolved" - : unresolved + " unresolved conversation" + (unresolved === 1 ? "" : "s"); + ? pmString("all conversations resolved") + : pmFormat(unresolved === 1 ? "{n} unresolved conversation" + : "{n} unresolved conversations", {n: unresolved}); heading.append(count); section.append(heading); @@ -3892,9 +3917,9 @@ function movedChip(seg) { var chip = document.createElement("span"); chip.className = "pm-moved-chip"; - chip.textContent = "moved"; + chip.textContent = pmString("moved"); if (seg.movedFromLine) { - chip.title = "Moved from line " + seg.movedFromLine + " — content unchanged"; + chip.title = pmFormat("Moved from line {n} — content unchanged", {n: seg.movedFromLine}); } return chip; } @@ -3976,8 +4001,9 @@ btn.className = "pm-comment-btn"; btn.type = "button"; btn.innerHTML = COMMENT_ICON; - btn.title = "Comment on new line" + (r[1] === r[0] ? " " + r[0] - : "s " + r[0] + "–" + r[1]); + btn.title = r[1] === r[0] + ? pmFormat("Comment on new line {n}", {n: r[0]}) + : pmFormat("Comment on new lines {a}–{b}", {a: r[0], b: r[1]}); btn.setAttribute("aria-label", btn.title); btn.style.display = "none"; btn.addEventListener("click", function (event) { @@ -4030,11 +4056,13 @@ function stampSegmentNumber(wrap, seg) { var tip = rangeText(seg.lineStart, seg.lineEnd); if (seg.kind === "removed") { - tip = "Old " + tip.toLowerCase(); + tip = seg.lineStart === seg.lineEnd + ? pmFormat("Old line {n}", {n: seg.lineStart}) + : pmFormat("Old lines {a}–{b}", {a: seg.lineStart, b: seg.lineEnd}); wrap.setAttribute("data-pm-num-old", "1"); } else if (seg.kind === "modified" && seg.oldLineStart) { - tip += " · was " + (seg.oldLineStart === seg.oldLineEnd - ? seg.oldLineStart : seg.oldLineStart + "–" + seg.oldLineEnd); + tip += pmFormat(" · was {r}", {r: seg.oldLineStart === seg.oldLineEnd + ? seg.oldLineStart : seg.oldLineStart + "–" + seg.oldLineEnd}); } else if (seg.kind === "moved" && seg.movedFromLine) { tip += " · moved from " + seg.movedFromLine; } @@ -4353,14 +4381,14 @@ if (fileThreads.length) { var fileHeading = document.createElement("h2"); fileHeading.className = "pm-outdated-heading"; - fileHeading.textContent = "File comments"; + fileHeading.textContent = pmString("File comments"); content.append(fileHeading, threadsEl(fileThreads)); } var threads = payload.outdatedThreads || []; if (!threads.length) { return; } var heading = document.createElement("h2"); heading.className = "pm-outdated-heading"; - heading.textContent = "Outdated review comments"; + heading.textContent = pmString("Outdated review comments"); content.append(heading, threadsEl(threads)); } @@ -4410,9 +4438,9 @@ count.className = "pm-marker-count"; count.textContent = threadTotal + pendingTotal; badge.append(count); - badge.title = (threadTotal + pendingTotal) - + (threadTotal + pendingTotal === 1 ? " comment" : " comments") - + " — click to expand"; + badge.title = pmFormat(threadTotal + pendingTotal === 1 + ? "{n} comment — click to expand" + : "{n} comments — click to expand", {n: threadTotal + pendingTotal}); badge.setAttribute("aria-label", badge.title); badge.setAttribute("aria-expanded", "false"); badge.addEventListener("click", function (event) { @@ -4552,8 +4580,9 @@ lineno.type = "button"; lineno.className = "pm-patch-lineno pm-annotation"; lineno.textContent = String(number); - lineno.title = "Comment on " + (side === "LEFT" ? "old" : "new") - + " line " + number + " — shift-click extends the range"; + lineno.title = pmFormat(side === "LEFT" + ? "Comment on old line {n} — shift-click extends the range" + : "Comment on new line {n} — shift-click extends the range", {n: number}); lineno.setAttribute("aria-label", lineno.title); lineno.addEventListener("click", function (event) { event.stopPropagation(); @@ -5034,7 +5063,7 @@ var phantom = document.createElement("div"); phantom.className = "pm-append"; phantom.textContent = "+"; - phantom.title = "Write at the end of the document"; + phantom.title = pmString("Write at the end of the document"); content.append(phantom); function appendReveal() { if (revealState) { commitReveal(); return; } @@ -5143,7 +5172,7 @@ if (!segments.length && !payload.allNew) { var note = document.createElement("p"); note.className = "pm-empty-note"; - note.textContent = "This file is empty on both sides of the diff."; + note.textContent = pmString("This file is empty on both sides of the diff."); content.append(note); } if (payload.allNew) { diff --git a/Sources/PullMark/Views/AppToolbar.swift b/Sources/PullMark/Views/AppToolbar.swift index 031a6f6..d0b76e4 100644 --- a/Sources/PullMark/Views/AppToolbar.swift +++ b/Sources/PullMark/Views/AppToolbar.swift @@ -512,7 +512,7 @@ private struct OpenFileToolbarButton: View { } label: { Label("Open File or Folder", systemImage: "folder") } - .help("Open local Markdown files or a folder" + .help(String(localized: "Open local Markdown files or a folder") + shortcuts.hint(.openFile)) } } @@ -527,7 +527,7 @@ private struct OpenPRToolbarButton: View { } label: { Label("Open Pull Request", systemImage: "arrow.triangle.pull") } - .help("Open a GitHub pull request" + .help(String(localized: "Open a GitHub pull request") + shortcuts.hint(.openPullRequest)) } } @@ -650,7 +650,7 @@ private struct ZoomToolbarButton: View { Label("Zoom Out", systemImage: "minus.magnifyingglass") } .disabled(zoom <= DocumentZoom.minimum) - .help("Make the document smaller" + shortcuts.hint(.zoomOut)) + .help(String(localized: "Make the document smaller") + shortcuts.hint(.zoomOut)) case .actualSize: Button { zoom = 1.0 @@ -658,7 +658,7 @@ private struct ZoomToolbarButton: View { Label("Actual Size", systemImage: "1.magnifyingglass") } .disabled(DocumentZoom.isActualSize(zoom)) - .help("Reset the zoom to 100%" + shortcuts.hint(.actualSize)) + .help(String(localized: "Reset the zoom to 100%") + shortcuts.hint(.actualSize)) case .zoomIn: Button { zoom = DocumentZoom.zoomIn(from: zoom) @@ -666,7 +666,7 @@ private struct ZoomToolbarButton: View { Label("Zoom In", systemImage: "plus.magnifyingglass") } .disabled(zoom >= DocumentZoom.maximum) - .help("Make the document bigger" + shortcuts.hint(.zoomIn)) + .help(String(localized: "Make the document bigger") + shortcuts.hint(.zoomIn)) } } } diff --git a/Sources/PullMark/Views/CommitSheet.swift b/Sources/PullMark/Views/CommitSheet.swift index 867a0f9..f792982 100644 --- a/Sources/PullMark/Views/CommitSheet.swift +++ b/Sources/PullMark/Views/CommitSheet.swift @@ -151,12 +151,12 @@ struct CommitSheet: View { /// anyone who doesn't live in git. static func statusLabel(_ code: String) -> String { switch code.trimmingCharacters(in: .whitespaces) { - case "M", "MM", "AM": return "Modified" - case "A": return "Added" - case "D": return "Deleted" - case "R": return "Renamed" - case "??": return "Untracked" - default: return "Changed" + case "M", "MM", "AM": return String(localized: "Modified") + case "A": return String(localized: "Added") + case "D": return String(localized: "Deleted") + case "R": return String(localized: "Renamed") + case "??": return String(localized: "Untracked") + default: return String(localized: "Changed") } } @@ -259,15 +259,21 @@ struct CommitSheet: View { if !allowed.contains(root.path) { allowed.append(root.path) } UserDefaults.pullmark.set(allowed, forKey: DefaultsKeys.commitToMainAllowed) } - let committed = "Committed \(displayCount) file\(displayCount == 1 ? "" : "s")" - + (branchName.isEmpty ? "" : " on new branch “\(branchName)”") + let committed = displayCount == 1 + ? (branchName.isEmpty + ? String(localized: "Committed 1 file") + : String(localized: "Committed 1 file on new branch “\(branchName)”")) + : (branchName.isEmpty + ? String(localized: "Committed \(displayCount) files") + : String(localized: "Committed \(displayCount) files on new branch “\(branchName)”")) if let pushResult { // The commit landed — a push failure must not read as a // failed commit. - state.lastNotice = committed - + ", but the push failed: \(pushResult)" + state.lastNotice = String(localized: "\(committed), but the push failed: \(pushResult)") } else { - state.lastNotice = committed + (push ? " and pushed to origin." : ".") + state.lastNotice = push + ? String(localized: "\(committed) and pushed to origin.") + : committed + "." } state.gitStateTick += 1 dismiss() diff --git a/Sources/PullMark/Views/CompareRevisionsSheet.swift b/Sources/PullMark/Views/CompareRevisionsSheet.swift index 4a3d054..5f58ddd 100644 --- a/Sources/PullMark/Views/CompareRevisionsSheet.swift +++ b/Sources/PullMark/Views/CompareRevisionsSheet.swift @@ -21,8 +21,7 @@ struct CompareRevisionsSheet: View { VStack(alignment: .leading, spacing: 14) { Text("Compare Revisions") .font(.headline) - Text("Anything Git can resolve works: a branch, a tag, or a " - + "commit. Leave the new side empty to compare the working file.") + Text("Anything Git can resolve works: a branch, a tag, or a commit. Leave the new side empty to compare the working file.") .font(.callout) .foregroundStyle(.secondary) refRow(title: "Old side", text: $oldRef, diff --git a/Sources/PullMark/Views/ContentView.swift b/Sources/PullMark/Views/ContentView.swift index 219b0b8..7bc580c 100644 --- a/Sources/PullMark/Views/ContentView.swift +++ b/Sources/PullMark/Views/ContentView.swift @@ -251,7 +251,7 @@ struct SidebarView: View { // ordered, plus the single italic preview entry last. Trees // answer "where does it live"; this section answers "what do // I have open" (Sublime's exact label for the same list). - CollapsibleSection("Open Files", isExpanded: $filesExpanded, + CollapsibleSection(String(localized: "Open Files"), isExpanded: $filesExpanded, headerActions: state.hasOpenFiles ? [ SectionHeaderAction(id: "close-all", symbol: "xmark.circle.fill", help: "Close All") { state.closeAllOpenFiles() } @@ -294,7 +294,7 @@ struct SidebarView: View { // Locations: browsable roots wherever they live — local folders // and GitHub repos share one section (Finder's word for exactly // this list); the icon and subtitle carry the origin. - CollapsibleSection("Locations", isExpanded: $foldersExpanded, + CollapsibleSection(String(localized: "Locations"), isExpanded: $foldersExpanded, headerActions: [ SectionHeaderAction(id: "add-folder", symbol: "plus", help: "Open Folder…") { state.openFolderPanel() } @@ -318,7 +318,7 @@ struct SidebarView: View { } .onMove { from, to in state.remoteSessions.move(fromOffsets: from, toOffset: to) } } - CollapsibleSection("Pull Requests", isExpanded: $prsExpanded, + CollapsibleSection(String(localized: "Pull Requests"), isExpanded: $prsExpanded, headerActions: [ SectionHeaderAction(id: "add-pr", symbol: "plus", help: "Open Pull Request…") { state.showAddPR = true } @@ -369,7 +369,7 @@ struct SidebarView: View { } } if !recentItems.isEmpty { - CollapsibleSection("Recents", isExpanded: $recentExpanded) { + CollapsibleSection(String(localized: "Recents"), isExpanded: $recentExpanded) { ForEach(recentItems) { item in RecentRow(item: item, missing: state.missingRecentIDs.contains(item.id), @@ -641,7 +641,7 @@ enum SidebarActions { : LocalGit.repoRoot(for: url) guard let root else { return } guard let repo = LocalGit.linkableGitHubRepo(in: root) else { - state.lastNotice = "This repository has no GitHub remote." + state.lastNotice = String(localized: "This repository has no GitHub remote.") return } let ref = permalink @@ -835,8 +835,7 @@ private struct FolderRootGroup: View { Text("Showing the first \(folder.filePaths.count) Markdown files") .font(fonts.caption) .foregroundStyle(.secondary) - .help("This folder has more Markdown files than PullMark scans — " - + "open a subfolder as its own Location to see the rest") + .help("This folder has more Markdown files than PullMark scans — open a subfolder as its own Location to see the rest") } } label: { rootRow diff --git a/Sources/PullMark/Views/GitHubSetupSheet.swift b/Sources/PullMark/Views/GitHubSetupSheet.swift index 49df274..4a2023d 100644 --- a/Sources/PullMark/Views/GitHubSetupSheet.swift +++ b/Sources/PullMark/Views/GitHubSetupSheet.swift @@ -25,10 +25,9 @@ struct GitHubSetupSheet: View { stepContent HStack { - Button(checking ? "Checking…" : "Check Again") { check() } + Button(checking ? String(localized: "Checking…") : String(localized: "Check Again")) { check() } .disabled(checking) - .help("Re-read credentials from the GitHub CLI and " - + "git credential helpers") + .help("Re-read credentials from the GitHub CLI and git credential helpers") Spacer() Button("Done") { dismiss() } .keyboardShortcut(.defaultAction) @@ -98,7 +97,7 @@ struct GitHubSetupSheet: View { private var connectedLine: String { guard case .connected(let login, let source) = connection.status else { - return "Connected" + return String(localized: "Connected") } let who = login.map { "Connected as \($0)" } ?? "Connected" return "\(who) · \(source.label)" diff --git a/Sources/PullMark/Views/KeyboardSettingsTab.swift b/Sources/PullMark/Views/KeyboardSettingsTab.swift index 6e1918d..5bcb09e 100644 --- a/Sources/PullMark/Views/KeyboardSettingsTab.swift +++ b/Sources/PullMark/Views/KeyboardSettingsTab.swift @@ -23,8 +23,7 @@ struct KeyboardSettingsTab: View { Section { // Spelled out, not glyphs: ⌫ and ⎋ are unrecognizable // to plenty of people in running prose. - Text("Click a shortcut, or select a row and press Return, then type " - + "the new keys. Press Delete to remove a shortcut, Esc to cancel.") + Text("Click a shortcut, or select a row and press Return, then type the new keys. Press Delete to remove a shortcut, Esc to cancel.") .font(.callout) .foregroundStyle(.secondary) .fixedSize(horizontal: false, vertical: true) @@ -194,8 +193,8 @@ struct KeyboardSettingsTab: View { .allowsHitTesting(shortcuts.isCustomized(action)) .accessibilityHidden(!shortcuts.isCustomized(action)) .accessibilityLabel("Restore the default shortcut for \(action.title)") - .help("Restore the default" - + (action.defaultCombo.map { " (\($0.display))" } ?? " (none)")) + .help(String(localized: "Restore the default") + + (action.defaultCombo.map { " (\($0.display))" } ?? String(localized: " (none)"))) } } diff --git a/Sources/PullMark/Views/LocalFileView.swift b/Sources/PullMark/Views/LocalFileView.swift index 38fbec2..4801211 100644 --- a/Sources/PullMark/Views/LocalFileView.swift +++ b/Sources/PullMark/Views/LocalFileView.swift @@ -242,8 +242,7 @@ struct LocalFileView: View { // The @AppStorage flip re-renders every open document // without authoring chrome — existing notes still show. marginNotesEnabled = false - state.lastNotice = "Margin notes are off — turn them " - + "back on in Settings → Experimental." + state.lastNotice = String(localized: "Margin notes are off — turn them back on in Settings → Experimental.") }, onKeepUsing: { MarginNotesIntro.markSeen() @@ -320,12 +319,11 @@ struct LocalFileView: View { private func openNoteComposer(fileLevel: Bool) { guard compare == nil, !state.sourceViewVisible else { return } guard marginNotesEnabled else { - state.lastNotice = "Margin notes are off — turn them on in " - + "Settings → Experimental." + state.lastNotice = String(localized: "Margin notes are off — turn them on in Settings → Experimental.") return } guard marginNotesVisible else { - state.lastNotice = "Margin notes are hidden — choose View → Show Margin Notes first." + state.lastNotice = String(localized: "Margin notes are hidden — choose View → Show Margin Notes first.") return } guard MarginNotesIntro.seen() else { @@ -426,8 +424,8 @@ struct LocalFileView: View { let panel = NSOpenPanel() panel.canChooseDirectories = false panel.allowsMultipleSelection = false - panel.message = "Choose the file to compare with — it becomes the old side." - panel.prompt = "Compare" + panel.message = String(localized: "Choose the file to compare with — it becomes the old side.") + panel.prompt = String(localized: "Compare") guard panel.runModal() == .OK, let other = panel.url else { return } startComparingFile(other) } @@ -563,8 +561,7 @@ struct LocalFileView: View { // line range — abort rather than splice into the wrong lines. guard TextLines.lines(in: currentText, from: target.lineStart, to: target.lineEnd) == target.seed else { - state.lastNotice = "\(file.url.lastPathComponent) changed while you were editing " - + "this block — nothing was saved. Re-open the block to edit the current version." + state.lastNotice = String(localized: "\(file.url.lastPathComponent) changed while you were editing this block — nothing was saved. Re-open the block to edit the current version.") pendingRevealLine = nil // a refused save must not leave a proxy.cancelInlineEdit() // reveal armed for a later reload return @@ -600,7 +597,7 @@ struct LocalFileView: View { } try newText.write(to: file.url, atomically: true, encoding: .utf8) } catch { - state.lastError = "Couldn't save \(file.url.lastPathComponent): \(error.localizedDescription)" + state.lastError = String(localized: "Couldn't save \(file.url.lastPathComponent): \(error.localizedDescription)") proxy.cancelInlineEdit() } } @@ -655,8 +652,7 @@ struct LocalFileView: View { .replacingOccurrences(of: "\r\n", with: "\n") .replacingOccurrences(of: "\r", with: "\n") guard var newText = transform(lf) else { - state.lastNotice = "\(file.url.lastPathComponent) changed while you were " - + "annotating — nothing was saved. The current notes are shown now." + state.lastNotice = String(localized: "\(file.url.lastPathComponent) changed while you were annotating — nothing was saved. The current notes are shown now.") return } if wasCRLF { @@ -666,7 +662,7 @@ struct LocalFileView: View { EditHistory.snapshot(file.url) try newText.write(to: file.url, atomically: true, encoding: .utf8) } catch { - state.lastError = "Couldn't save \(file.url.lastPathComponent): " + state.lastError = String(localized: "Couldn't save \(file.url.lastPathComponent): ") + error.localizedDescription } } @@ -853,8 +849,7 @@ struct LocalFileView: View { return } guard LocalGit.repoRoot(for: file.url) != nil else { - state.lastError = "\(file.url.lastPathComponent) isn't in a git " - + "repository, so there's nothing to compare against." + state.lastError = String(localized: "\(file.url.lastPathComponent) isn't in a git repository, so there's nothing to compare against.") retirePendingCompare() return } @@ -891,12 +886,12 @@ struct LocalFileView: View { guard generation == compareGeneration else { return } let name = url.lastPathComponent guard let old else { - state.lastError = "\(name) does not exist at \(oldRef)." + state.lastError = String(localized: "\(name) does not exist at \(oldRef).") stopComparing() return } guard let new else { - state.lastError = "\(name) does not exist at \(newRef)." + state.lastError = String(localized: "\(name) does not exist at \(newRef).") stopComparing() return } @@ -918,7 +913,7 @@ struct LocalFileView: View { await MainActor.run { guard generation == compareGeneration else { return } guard let old else { - state.lastError = "Could not read \(other.lastPathComponent)." + state.lastError = String(localized: "Could not read \(other.lastPathComponent).") stopComparing() return } @@ -943,7 +938,7 @@ struct LocalFileView: View { // newest request may land, or the page and banner disagree. guard generation == compareGeneration else { return } guard let old else { - state.lastError = "\(url.lastPathComponent) does not exist at \(label)." + state.lastError = String(localized: "\(url.lastPathComponent) does not exist at \(label).") stopComparing() return } diff --git a/Sources/PullMark/Views/MarginNotesIntroSheet.swift b/Sources/PullMark/Views/MarginNotesIntroSheet.swift index 1aadef8..897170c 100644 --- a/Sources/PullMark/Views/MarginNotesIntroSheet.swift +++ b/Sources/PullMark/Views/MarginNotesIntroSheet.swift @@ -54,8 +54,7 @@ struct MarginNotesIntroSheet: View { copiedSnippet = false } } - .help("Copies instructions for CLAUDE.md / AGENTS.md — how to " - + "read margin notes and delete them as they're addressed") + .help("Copies instructions for CLAUDE.md / AGENTS.md — how to read margin notes and delete them as they're addressed") } Text("Notes are written so agents can read and act on them. Paste the snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in this file\" becomes a complete handoff.") .font(.callout) diff --git a/Sources/PullMark/Views/OpenQuicklyPalette.swift b/Sources/PullMark/Views/OpenQuicklyPalette.swift index e917849..b4b13cd 100644 --- a/Sources/PullMark/Views/OpenQuicklyPalette.swift +++ b/Sources/PullMark/Views/OpenQuicklyPalette.swift @@ -225,8 +225,7 @@ struct OpenQuicklyPalette: View { do { try await state.addPR("\(ref.owner)/\(ref.repo)#\(ref.number)") } catch { - state.lastError = "Couldn't open " - + "\(ref.owner)/\(ref.repo)#\(ref.number): " + state.lastError = String(localized: "Couldn't open \(ref.owner)/\(ref.repo)#\(ref.number): ") + error.localizedDescription } } diff --git a/Sources/PullMark/Views/PRCockpitHeader.swift b/Sources/PullMark/Views/PRCockpitHeader.swift index 18f59b4..bc242e1 100644 --- a/Sources/PullMark/Views/PRCockpitHeader.swift +++ b/Sources/PullMark/Views/PRCockpitHeader.swift @@ -52,9 +52,9 @@ private struct ReviewDecisionCapsule: View { private var label: String { switch decision { - case .approved: return "Approved" - case .changesRequested: return "Changes requested" - case .reviewRequired: return "Review required" + case .approved: return String(localized: "Approved") + case .changesRequested: return String(localized: "Changes requested") + case .reviewRequired: return String(localized: "Review required") } } @@ -119,10 +119,10 @@ private struct ChecksCapsule: View { private var label: String { switch summary { case .none: return "" - case .failed: return "Checks failed" - case .running: return "Checks running" - case .awaitingApproval: return "Checks awaiting approval" - case .passed: return "Checks passed" + case .failed: return String(localized: "Checks failed") + case .running: return String(localized: "Checks running") + case .awaitingApproval: return String(localized: "Checks awaiting approval") + case .passed: return String(localized: "Checks passed") } } @@ -130,11 +130,11 @@ private struct ChecksCapsule: View { switch summary { case .none: return "" case .failed(let failing, let total): - return "\(failing) of \(total) failing" + return String(localized: "\(failing) of \(total) failing") case .running(let done, let total): - return "\(done) of \(total) done" + return String(localized: "\(done) of \(total) done") case .awaitingApproval: - return "A workflow is waiting for approval" + return String(localized: "A workflow is waiting for approval") case .passed(let passed, let skipped): return skipped > 0 ? "\(passed) passed, \(skipped) skipped" : "\(passed) passed" @@ -323,20 +323,24 @@ private struct ReviewerStrip: View { Text("+\(overflow)") .font(.caption) .foregroundStyle(.secondary) - .accessibilityLabel("\(overflow) more reviewer\(overflow == 1 ? "" : "s")") + .accessibilityLabel(overflow == 1 + ? Text("1 more reviewer") : Text("\(overflow) more reviewers")) } } } private func reviewerHelp(_ reviewer: ReviewerState) -> String { - let verb = reviewer.approved ? "approved" : "requested changes" guard let date = GitHubDate.parse(reviewer.submittedAt) else { - return "\(reviewer.login) \(verb)" + return reviewer.approved + ? String(localized: "\(reviewer.login) approved") + : String(localized: "\(reviewer.login) requested changes") } let formatter = RelativeDateTimeFormatter() formatter.unitsStyle = .full let when = formatter.localizedString(for: date, relativeTo: Date()) - return "\(reviewer.login) \(verb) \(when)" + return reviewer.approved + ? String(localized: "\(reviewer.login) approved \(when)") + : String(localized: "\(reviewer.login) requested changes \(when)") } } diff --git a/Sources/PullMark/Views/PRStatus.swift b/Sources/PullMark/Views/PRStatus.swift index f111266..cb4df2d 100644 --- a/Sources/PullMark/Views/PRStatus.swift +++ b/Sources/PullMark/Views/PRStatus.swift @@ -23,11 +23,11 @@ enum PRStatus: String, Codable, CaseIterable { var label: String { switch self { - case .draft: return "Draft" - case .open: return "Open" - case .closed: return "Closed" - case .merged: return "Merged" - case .deleted: return "Unavailable" + case .draft: return String(localized: "Draft") + case .open: return String(localized: "Open") + case .closed: return String(localized: "Closed") + case .merged: return String(localized: "Merged") + case .deleted: return String(localized: "Unavailable") } } diff --git a/Sources/PullMark/Views/PRViews.swift b/Sources/PullMark/Views/PRViews.swift index 562d999..a2f87c9 100644 --- a/Sources/PullMark/Views/PRViews.swift +++ b/Sources/PullMark/Views/PRViews.swift @@ -266,7 +266,9 @@ struct PROverviewView: View { // surface and this line retires. if !prDiscussionEnabled, hiddenCommentCount(session) > 0 { let count = hiddenCommentCount(session) - Text("\(count) unresolved review comment\(count == 1 ? "" : "s") on files not shown in PullMark") + Text(count == 1 + ? "1 unresolved review comment on files not shown in PullMark" + : "\(count) unresolved review comments on files not shown in PullMark") .font(.callout) .foregroundStyle(.secondary) } @@ -301,9 +303,14 @@ struct PROverviewView: View { private func filesSummary(_ session: PRSession) -> String { let md = session.markdownFiles.count - var parts = ["\(md) Markdown file\(md == 1 ? "" : "s") changed"] - if session.otherFileCount > 0 { - parts.append("\(session.otherFileCount) other file\(session.otherFileCount == 1 ? "" : "s") not shown") + var parts = [md == 1 + ? String(localized: "1 Markdown file changed") + : String(localized: "\(md) Markdown files changed")] + let other = session.otherFileCount + if other > 0 { + parts.append(other == 1 + ? String(localized: "1 other file not shown") + : String(localized: "\(other) other files not shown")) } return parts.joined(separator: " · ") } @@ -735,8 +742,7 @@ struct PRFileView: View { // The page already cleared its composer — never drop the text. threadActions.restoreDraftAfterFailure(key: submission.draftKey, text: submission.body) - state.lastError = "Could not post the comment — the PR session is " - + "no longer available. Your text was kept as a draft." + state.lastError = String(localized: "Could not post the comment — the PR session is no longer available. Your text was kept as a draft.") return } Task { @@ -754,7 +760,7 @@ struct PRFileView: View { } catch { threadActions.restoreDraftAfterFailure(key: submission.draftKey, text: submission.body) - state.lastError = "Could not post the comment: \(error.localizedDescription)" + state.lastError = String(localized: "Could not post the comment: \(error.localizedDescription)") } } } @@ -986,8 +992,12 @@ struct PRFileNavigation: View { } private var positionLabel: String { - guard let index else { return "\(session.markdownFiles.count) files" } - return "\(index + 1) of \(session.markdownFiles.count)" + guard let index else { + let count = session.markdownFiles.count + return count == 1 ? String(localized: "1 file") + : String(localized: "\(count) files") + } + return String(localized: "\(index + 1) of \(session.markdownFiles.count)") } } diff --git a/Sources/PullMark/Views/PageAccessories.swift b/Sources/PullMark/Views/PageAccessories.swift index 7dab48e..a06572d 100644 --- a/Sources/PullMark/Views/PageAccessories.swift +++ b/Sources/PullMark/Views/PageAccessories.swift @@ -95,11 +95,11 @@ struct FindBar: View { Button { step("prev") } label: { Image(systemName: "chevron.up") } .buttonStyle(.borderless) .disabled(total == 0) - .help("Previous match" + shortcuts.hint(.findPrevious)) + .help(String(localized: "Previous match") + shortcuts.hint(.findPrevious)) Button { step("next") } label: { Image(systemName: "chevron.down") } .buttonStyle(.borderless) .disabled(total == 0) - .help("Next match" + shortcuts.hint(.findNext)) + .help(String(localized: "Next match") + shortcuts.hint(.findNext)) Button("Done") { close() } .buttonStyle(.borderless) } diff --git a/Sources/PullMark/Views/RemoteDocView.swift b/Sources/PullMark/Views/RemoteDocView.swift index d3ace8b..cea829c 100644 --- a/Sources/PullMark/Views/RemoteDocView.swift +++ b/Sources/PullMark/Views/RemoteDocView.swift @@ -301,7 +301,7 @@ struct RemoteDocView: View { compare = RemoteCompare(ref: ref, label: label) } catch { guard generation == compareGeneration else { return } - state.lastError = "\((path as NSString).lastPathComponent) isn't available on \(label): " + state.lastError = String(localized: "\((path as NSString).lastPathComponent) isn't available on \(label): ") + error.localizedDescription } } @@ -449,7 +449,7 @@ enum RemoteBranchMenu { } } menu.addItem(.separator()) - let separately = NSMenuItem(title: "Open Branch Separately", action: nil, keyEquivalent: "") + let separately = NSMenuItem(title: String(localized: "Open Branch Separately"), action: nil, keyEquivalent: "") let submenu = NSMenu() for branch in shown where branch != session.displayRef { item(branch, in: submenu) { @@ -566,9 +566,7 @@ struct RemoteLinkPromptSheet: View { .truncationMode(.middle) } .font(.callout) - Text("PullMark can fetch this file and render it in-app, or send it to your " - + "browser. Hold ⌘ while clicking a link for the other behavior; the " - + "default lives in Settings → General.") + Text("PullMark can fetch this file and render it in-app, or send it to your browser. Hold ⌘ while clicking a link for the other behavior; the default lives in Settings → General.") .font(.callout) .foregroundStyle(.secondary) .fixedSize(horizontal: false, vertical: true) diff --git a/Sources/PullMark/Views/ReviewPopover.swift b/Sources/PullMark/Views/ReviewPopover.swift index 0727e85..4fdca8a 100644 --- a/Sources/PullMark/Views/ReviewPopover.swift +++ b/Sources/PullMark/Views/ReviewPopover.swift @@ -500,7 +500,7 @@ struct ReviewPopover: View { reviewSummary = "" summarySeed = nil summaryEdited = false - state.lastNotice = "Review submitted." + state.lastNotice = String(localized: "Review submitted.") dismiss() } catch { state.lastError = error.localizedDescription diff --git a/Sources/PullMark/Views/SettingsView.swift b/Sources/PullMark/Views/SettingsView.swift index 6aeb8a8..1d45301 100644 --- a/Sources/PullMark/Views/SettingsView.swift +++ b/Sources/PullMark/Views/SettingsView.swift @@ -30,6 +30,7 @@ struct SettingsView: View { // MARK: - General struct GeneralSettingsTab: View { + @State private var languageRaw = AppLanguage.current.rawValue @EnvironmentObject private var updates: UpdateChecker @EnvironmentObject private var defaultApp: DefaultAppManager @AppStorage(DefaultsKeys.diffLayout, store: UserDefaults.pullmark) private var diffLayoutRaw = PRFileView.DiffLayout.inline.rawValue @@ -62,6 +63,26 @@ struct GeneralSettingsTab: View { Form { GitHubNotConnectedAlert() + Section("Language") { + Picker("Language:", selection: $languageRaw) { + ForEach(AppLanguage.allCases) { language in + Text(language.label).tag(language.rawValue) + } + } + .onChange(of: languageRaw) { raw in + (AppLanguage(rawValue: raw) ?? .system).apply() + } + .settingAnchor("language") + if languageRaw != AppLanguage.atLaunch.rawValue { + HStack(spacing: 12) { + Text("Takes effect after PullMark relaunches.") + .font(.callout) + .foregroundStyle(.secondary) + Button("Relaunch Now") { AppRelaunch.relaunch() } + } + } + } + Section("Reading") { Toggle("Restore files and pull requests from the last session", isOn: $restoreSession) .help("Reopen what was in the sidebar when PullMark last quit") @@ -84,10 +105,7 @@ struct GeneralSettingsTab: View { Text("Open Fully").tag(FolderClickAction.open.rawValue) } .settingAnchor("clicking-files") - Text("Preview First shows a file with one click without keeping it — " - + "one italicized entry (in Open Files, or under its GitHub repo) " - + "that the next preview replaces. Double-click a file, or just " - + "start editing, to keep it open. Open Fully keeps every file you click.") + Text("Preview First shows a file with one click without keeping it — one italicized entry (in Open Files, or under its GitHub repo) that the next preview replaces. Double-click a file, or just start editing, to keep it open. Open Fully keeps every file you click.") .font(.callout) .foregroundStyle(.secondary) .fixedSize(horizontal: false, vertical: true) @@ -113,8 +131,7 @@ struct GeneralSettingsTab: View { // Graduated from Experimental (beta) in the cockpit wave — // on by default; stored choices from the beta days stand. Toggle("Show review discussion on the PR overview", isOn: $prDiscussionEnabled) - .help("Adds a Review discussion section under the PR description " - + "listing every thread, with code excerpts and links") + .help("Adds a Review discussion section under the PR description listing every thread, with code excerpts and links") .settingAnchor("pr-discussion") } @@ -415,10 +432,7 @@ struct ExperimentalSettingsTab: View { Button("Show Alpha Features") { showAlphaFeatures = true } Button("Cancel", role: .cancel) {} } message: { - Text("Alpha features are the frontier: their behavior and data " - + "formats may change incompatibly between versions, " - + "transitions may not be supported, and a feature may be " - + "removed entirely. Use them at your own risk.") + Text("Alpha features are the frontier: their behavior and data formats may change incompatibly between versions, transitions may not be supported, and a feature may be removed entirely. Use them at your own risk.") } } @@ -463,8 +477,7 @@ struct ExperimentalSettingsTab: View { .settingAnchor("margin-notes") Toggle("Enable margin notes", isOn: $marginNotesEnabled) - .help("Adds the authoring tools — hover a block, ⌥⌘M; documents " - + "that already contain notes always show them either way") + .help("Adds the authoring tools — hover a block, ⌥⌘M; documents that already contain notes always show them either way") // Flipping the toggle in either direction is an informed // choice — this section says everything the first-use // intro would, so it never needs to interrupt later. @@ -475,8 +488,7 @@ struct ExperimentalSettingsTab: View { if marginNotesEnabled { TextField("Sign notes as:", text: $marginNoteAuthor, prompt: Text(NSUserName())) - .help("The @name your notes carry — empty uses your GitHub " - + "login, or this Mac's account name when signed out") + .help("The @name your notes carry — empty uses your GitHub login, or this Mac's account name when signed out") VStack(alignment: .leading, spacing: 6) { Text("Using it") @@ -492,7 +504,7 @@ struct ExperimentalSettingsTab: View { Text("Teach your agent") .font(.callout.weight(.semibold)) Spacer() - Button(copiedSnippet ? "Copied" : "Copy") { + Button(copiedSnippet ? String(localized: "Copied") : String(localized: "Copy")) { let pasteboard = NSPasteboard.general pasteboard.clearContents() pasteboard.setString(MarginNotes.agentInstructions, forType: .string) @@ -501,8 +513,7 @@ struct ExperimentalSettingsTab: View { copiedSnippet = false } } - .help("Copies instructions for CLAUDE.md / AGENTS.md — how to " - + "read margin notes and delete them as they're addressed") + .help("Copies instructions for CLAUDE.md / AGENTS.md — how to read margin notes and delete them as they're addressed") } Text("Paste the copied snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in the file\" becomes a complete handoff — the agent deletes each note as it resolves it, and you watch the bubbles disappear.") .font(.callout) @@ -779,9 +790,9 @@ struct LineNumberPreviewCard: View { } } .padding(.bottom, 4) - Text(showNumbers ? "Shown" : "Hidden") + Text(showNumbers ? String(localized: "Shown") : String(localized: "Hidden")) .font(.callout.weight(selected ? .semibold : .medium)) - Text(showNumbers ? "Each block's source line in the margin" : "A clean margin, numbers on demand in Source") + Text(showNumbers ? String(localized: "Each block's source line in the margin") : String(localized: "A clean margin, numbers on demand in Source")) .font(.caption) .foregroundStyle(.secondary) .multilineTextAlignment(.center) @@ -791,7 +802,7 @@ struct LineNumberPreviewCard: View { .contentShape(Rectangle()) .onTapGesture(perform: select) .accessibilityElement(children: .combine) - .accessibilityLabel(showNumbers ? "Line numbers shown" : "Line numbers hidden") + .accessibilityLabel(showNumbers ? Text("Line numbers shown") : Text("Line numbers hidden")) .accessibilityAddTraits(selected ? [.isButton, .isSelected] : .isButton) .accessibilityAction(.default, select) } @@ -894,9 +905,7 @@ struct GitHubConnectionSection: View { Task { await GitHubClient.shared.recheck() } } .disabled(connection.status == .checking) - .help("Re-read credentials from the GitHub CLI and git " - + "credential helpers — after gh auth login, this " - + "connects without relaunching") + .help("Re-read credentials from the GitHub CLI and git credential helpers — after gh auth login, this connects without relaunching") Button("Set Up…") { showSetup = true } .help("Walk through connecting PullMark to GitHub") } @@ -969,8 +978,7 @@ struct GitHubNotConnectedAlert: View { HStack(spacing: 8) { Image(systemName: "exclamationmark.triangle.fill") .foregroundStyle(.orange) - Text("Not connected to GitHub — private repositories " - + "and reviewing are unavailable.") + Text("Not connected to GitHub — private repositories and reviewing are unavailable.") .fixedSize(horizontal: false, vertical: true) Spacer() Button("Show") { diff --git a/Sources/PullMark/Views/ThreadCardActions.swift b/Sources/PullMark/Views/ThreadCardActions.swift index 92c04f8..8618146 100644 --- a/Sources/PullMark/Views/ThreadCardActions.swift +++ b/Sources/PullMark/Views/ThreadCardActions.swift @@ -28,8 +28,7 @@ struct ThreadCardActions { guard let session else { // The page already cleared its composer — never drop the text. restoreDraftAfterFailure(key: draftKey, text: body) - state.lastError = "Could not post the reply — the PR session is " - + "no longer available. Your text was kept as a draft." + state.lastError = String(localized: "Could not post the reply — the PR session is no longer available. Your text was kept as a draft.") return } Task { @@ -45,14 +44,14 @@ struct ThreadCardActions { } } catch { restoreDraftAfterFailure(key: draftKey, text: body) - state.lastError = "Could not post the reply: \(error.localizedDescription)" + state.lastError = String(localized: "Could not post the reply: \(error.localizedDescription)") } } } func setThreadResolved(rootID: Int, resolved: Bool) { guard let session, let meta = session.threadMeta[rootID] else { - state.lastError = "Thread state unavailable — try refreshing the PR." + state.lastError = String(localized: "Thread state unavailable — try refreshing the PR.") return } Task { @@ -80,7 +79,7 @@ struct ThreadCardActions { guard let nodeID = CommentReactions.commentNodeID(of: commentID, in: session.threadMeta) else { proxy.revertReaction(commentID: commentID, content: content, attempted: reacted) - state.lastError = "Reaction state unavailable — try refreshing the PR." + state.lastError = String(localized: "Reaction state unavailable — try refreshing the PR.") return } // Serialized per comment id: a rapid double-toggle's add/remove @@ -96,7 +95,7 @@ struct ThreadCardActions { } catch { proxy.revertReaction(commentID: commentID, content: content, attempted: reacted) - state.lastError = "Could not update the reaction: \(error.localizedDescription)" + state.lastError = String(localized: "Could not update the reaction: \(error.localizedDescription)") } } } @@ -116,7 +115,7 @@ struct ThreadCardActions { } } catch { restoreDraftAfterFailure(key: draftKey, text: body) - state.lastError = "Could not save the edit: \(error.localizedDescription)" + state.lastError = String(localized: "Could not save the edit: \(error.localizedDescription)") } } } @@ -133,7 +132,7 @@ struct ThreadCardActions { state.applyCommentDelete(sessionID: sessionID, commentID: commentID) } } catch { - state.lastError = "Could not delete the comment: \(error.localizedDescription)" + state.lastError = String(localized: "Could not delete the comment: \(error.localizedDescription)") } } } @@ -146,8 +145,7 @@ struct ThreadCardActions { func sendConversationComment(body: String, draftKey: String) { guard let session else { restoreDraftAfterFailure(key: draftKey, text: body) - state.lastError = "Could not post the comment — the PR session is " - + "no longer available. Your text was kept as a draft." + state.lastError = String(localized: "Could not post the comment — the PR session is no longer available. Your text was kept as a draft.") return } Task { @@ -158,7 +156,7 @@ struct ThreadCardActions { } } catch { restoreDraftAfterFailure(key: draftKey, text: body) - state.lastError = "Could not post the comment: \(error.localizedDescription)" + state.lastError = String(localized: "Could not post the comment: \(error.localizedDescription)") } } } @@ -172,7 +170,7 @@ struct ThreadCardActions { : session.conversationMeta[commentID] guard let nodeID = meta?.nodeID else { proxy.revertReaction(commentID: commentID, content: content, attempted: reacted) - state.lastError = "Reaction state unavailable — try refreshing the PR." + state.lastError = String(localized: "Reaction state unavailable — try refreshing the PR.") return } state.serializeReactionWrite(commentID: commentID) { @@ -187,7 +185,7 @@ struct ThreadCardActions { } catch { proxy.revertReaction(commentID: commentID, content: content, attempted: reacted) - state.lastError = "Could not update the reaction: \(error.localizedDescription)" + state.lastError = String(localized: "Could not update the reaction: \(error.localizedDescription)") } } } @@ -204,7 +202,7 @@ struct ThreadCardActions { } } catch { restoreDraftAfterFailure(key: draftKey, text: body) - state.lastError = "Could not save the edit: \(error.localizedDescription)" + state.lastError = String(localized: "Could not save the edit: \(error.localizedDescription)") } } } @@ -219,7 +217,7 @@ struct ThreadCardActions { commentID: commentID) } } catch { - state.lastError = "Could not delete the comment: \(error.localizedDescription)" + state.lastError = String(localized: "Could not delete the comment: \(error.localizedDescription)") } } } @@ -232,8 +230,7 @@ struct ThreadCardActions { // of silently dropping the sync (empty text is a discard and // needs no noise). if !text.isEmpty { - state.lastError = "The PR session is no longer available — " - + "the draft could not be saved to disk." + state.lastError = String(localized: "The PR session is no longer available — the draft could not be saved to disk.") } return } diff --git a/docs/specs/app-i18n.md b/docs/specs/app-i18n.md new file mode 100644 index 0000000..4e8bf40 --- /dev/null +++ b/docs/specs/app-i18n.md @@ -0,0 +1,94 @@ +# App internationalization: seven languages + +The app joins the site (spec: site-localization) in Simplified +Chinese, Japanese, French, German, Dutch, Spanish, and Brazilian +Portuguese. Feasibility established by the 2026-08-20 spike; Josh +committed to the full wave same day ("ship 40, then do app i18n"). + +## Architecture + +- **`.lproj` at `loc/`, assembled by the build.** Hand-authored + `loc/.lproj/Localizable.strings` live at the repo root — + deliberately OUTSIDE `Sources/` so SwiftPM never buries them in the + resource bundle (where `Bundle.main` lookup can't see them and only + the banned `Bundle.module` could). `make-app.sh` copies them into + `Contents/Resources/` and adds `CFBundleDevelopmentRegion` (en) + + `CFBundleLocalizations` to the Info.plist heredoc. Locale codes: + `zh-Hans ja fr de nl es pt-BR`. +- **`Bundle.main` everywhere.** SwiftUI literal keys resolve through + it automatically once the `.lproj` folders exist; plain-String + contexts use `String(localized:)`/`NSLocalizedString`. +- **The Quick Look appex** gets copies of the same `.lproj` folders + (its two user-visible error strings), assembled the same way. +- **Rendered-page strings ride the payload.** app.js copy (~75 + strings: composer, thread chrome, section headings, the attachment + placeholder, tooltips) can't be reached by `.strings` files. A + `strings` dictionary joins `HTMLBuilder.RenderPayload` — resolved + Swift-side via `Bundle.main`, consumed by a `pmString(key)` helper + in app.js. Composed fragments ("Show " + n + " resolved…") become + whole templated messages with placeholders. + +## The verification gate (`scripts/check-strings.py`) + +genstrings cannot see SwiftUI literals, and a missing key fails +SILENTLY to English — so the gate comes before the first translation: + +- Inventories keys three ways: SwiftUI literal call sites + (Text/Button/Label/.help/Picker/Toggle/TextField/Menu/Section), + `NSLocalizedString`/`String(localized:)` sites, and the JS strings + table's keys. +- Diffs the inventory against every locale's `.strings`; reports + missing and orphaned keys per locale. +- Validates format specifiers match the English source (%@ vs %lld + mismatches crash or garble at runtime). +- Wired into `make test` so a new user-facing string without seven + translations fails loudly at development time, and re-checked by + the release runbook. + +## Code work (from the spike, ~260 touch points) + +1. ~180 plain-String sites wrapped: KeyboardShortcuts action/category + names (~80), the `lastError`/`lastNotice` channel (71 sites, 27 + interpolated — `String(localized:)` with interpolation), NSAlert + suite (17), open/save panel messages (~6), the 2 literal NSMenu + items, GitHub-side user-visible labels (~15). +2. The app.js strings table (~75 strings + de-concatenation). +3. Fix the 5 `.help("literal" + shortcuts.hint(...))` concatenations + that silently select the non-localizing StringProtocol overload. +4. ~376 SwiftUI literals: no code change (LocalizedStringKey), but + their keys enter the inventory and all seven `.strings` files. + +## Translation + +- English is the key (no `en.lproj` needed; base language IS the key). +- Seven **opus-pinned** agents (model-assignment razor), one per + locale, translating the extracted key inventory with the same + conventions as the site wave: GitHub-domain terms per GitHub's own + localized docs, macOS UI terms per Apple's glossaries (Ajustes / + Réglages / Einstellungen…), keycaps/format specifiers verbatim, + polite-form ja, du-form de, tú es, você pt-BR, je nl. +- The demo fixtures, changelog, and What's New stay English. + +## Verification beyond the gate + +- `make app` + `-AppleLanguages '()'` launches (BARE launch — + a document argument makes Launch Services drop the argument domain, + see scripts/screenshots/README.md) for per-locale visual passes. +- **German width pass** specifically: nav labels, toolbar, Settings — + German runs ~30% longer than English. +- Localized screenshots via `generate.sh --lang ` become + possible after this ships; the site keeps English-UI shots until a + deliberate refresh (own decision, not part of this wave). + +## Standing tax (accepted) + +Every release that adds user-facing strings owes seven translations +before it ships; the check-strings gate makes forgetting impossible +and the opus translation fan-out makes paying it minutes, not hours. + +## Out of scope + +- Localized changelog / release notes / What's New. +- Localized demo fixtures (screenshots stay English-fixture). +- RTL support (no RTL locale in scope). +- pt-PT, zh-Hant, and further locales — add on demand. diff --git a/loc/README.md b/loc/README.md new file mode 100644 index 0000000..fce9865 --- /dev/null +++ b/loc/README.md @@ -0,0 +1,9 @@ +# Localizations + +One `.lproj/Localizable.strings` per language, hand-authored +(no Xcode pipeline — see docs/specs/app-i18n.md). English is the key; +there is no en.lproj. `make-app.sh` copies these into the app and the +Quick Look appex at assembly time; `scripts/check-strings.py` keeps +them complete (run by `make test`). + +Locales: zh-Hans, ja, fr, de, nl, es, pt-BR. diff --git a/loc/_delta.json b/loc/_delta.json new file mode 100644 index 0000000..8f8f253 --- /dev/null +++ b/loc/_delta.json @@ -0,0 +1,11 @@ +{ + "added": [ + "Closed", + "Draft", + "Merged", + "Unavailable", + "View all checks on GitHub", + "View on GitHub" + ], + "removed": [] +} \ No newline at end of file diff --git a/loc/_inventory.json b/loc/_inventory.json new file mode 100644 index 0000000..5011e44 --- /dev/null +++ b/loc/_inventory.json @@ -0,0 +1,605 @@ +{ + " (none)": "Sources/PullMark/Views/KeyboardSettingsTab.swift", + "%@ and pushed to origin.": "Sources/PullMark/Views/CommitSheet.swift", + "%@ approved": "Sources/PullMark/Views/PRCockpitHeader.swift", + "%@ approved %@": "Sources/PullMark/Views/PRCockpitHeader.swift", + "%@ changed while you were annotating — nothing was saved. The current notes are shown now.": "Sources/PullMark/Views/LocalFileView.swift", + "%@ changed while you were editing this block — nothing was saved. Re-open the block to edit the current version.": "Sources/PullMark/Views/LocalFileView.swift", + "%@ does not exist at %@.": "Sources/PullMark/Views/LocalFileView.swift", + "%@ is reserved for %@.": "Sources/PullMark/App/ShortcutStore.swift", + "%@ isn't available": "Sources/PullMark/Views/ContentView.swift", + "%@ isn't available on %@: ": "Sources/PullMark/Views/RemoteDocView.swift", + "%@ isn't in a git repository, so there's nothing to compare against.": "Sources/PullMark/Views/LocalFileView.swift", + "%@ isn't inside a git repository.": "Sources/PullMark/App/PullMarkApp.swift", + "%@ requested changes": "Sources/PullMark/Views/PRCockpitHeader.swift", + "%@ requested changes %@": "Sources/PullMark/Views/PRCockpitHeader.swift", + "%@ words · %lld min": "Sources/PullMark/Views/PageAccessories.swift", + "%@ — previewing; double-click to keep it with its repo": "Sources/PullMark/Views/ContentView.swift", + "%@, but the push failed: %@": "Sources/PullMark/Views/CommitSheet.swift", + "%lld Markdown files changed": "Sources/PullMark/Views/PRViews.swift", + "%lld files": "Sources/PullMark/Views/PRViews.swift", + "%lld more reviewers": "Sources/PullMark/Views/PRCockpitHeader.swift", + "%lld more…": "Sources/PullMark/Views/SearchPalette.swift", + "%lld not yet on GitHub": "Sources/PullMark/Views/ReviewPopover.swift", + "%lld of %lld": "Sources/PullMark/Views/PRViews.swift", + "%lld of %lld done": "Sources/PullMark/Views/PRCockpitHeader.swift", + "%lld of %lld failing": "Sources/PullMark/Views/PRCockpitHeader.swift", + "%lld other files not shown": "Sources/PullMark/Views/PRViews.swift", + "1 Markdown file changed": "Sources/PullMark/Views/PRViews.swift", + "1 file": "Sources/PullMark/Views/PRViews.swift", + "1 more reviewer": "Sources/PullMark/Views/PRCockpitHeader.swift", + "1 other file not shown": "Sources/PullMark/Views/PRViews.swift", + "A clean margin, numbers on demand in Source": "Sources/PullMark/Views/SettingsView.swift", + "A workflow is waiting for approval": "Sources/PullMark/Views/PRCockpitHeader.swift", + "Abandon review": "Sources/PullMark/Views/ReviewPopover.swift", + "Abandon this review?": "Sources/PullMark/Views/ReviewPopover.swift", + "About PullMark": "Sources/PullMark/App/PullMarkApp.swift", + "Actual Size": "Sources/PullMark/App/PullMarkApp.swift", + "Add Margin Note": "Sources/PullMark/App/PullMarkApp.swift", + "Add a margin note on the block you're reading": "Sources/PullMark/Views/AppToolbar.swift", + "Added": "Sources/PullMark/Views/CommitSheet.swift", + "Adds a Review discussion section under the PR description listing every thread, with code excerpts and links": "Sources/PullMark/Views/SettingsView.swift", + "Adds a pullmark command to /usr/local/bin so you can open files and folders from the shell": "Sources/PullMark/Views/SettingsView.swift", + "Adds the authoring tools — hover a block, ⌥⌘M; documents that already contain notes always show them either way": "Sources/PullMark/Views/SettingsView.swift", + "After navigating between documents": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "All pending comments and the summary will be discarded, on GitHub too.": "Sources/PullMark/Views/ReviewPopover.swift", + "Alpha features are the frontier: their behavior and data formats may change incompatibly between versions, transitions may not be supported, and a feature may be removed entirely. Use them at your own risk.": "Sources/PullMark/Views/SettingsView.swift", + "Already use a git credential helper (macOS keychain, Git Credential Manager)? PullMark finds it automatically — Check Again will confirm.": "Sources/PullMark/Views/GitHubSetupSheet.swift", + "Anything Git can resolve works: a branch, a tag, or a commit. Leave the new side empty to compare the working file.": "Sources/PullMark/Views/CompareRevisionsSheet.swift", + "Appearance": "Sources/PullMark/App/PullMarkApp.swift", + "Applies to the whole file, not a specific line": "Sources/PullMark/Views/PRViews.swift", + "Approved": "Sources/PullMark/Views/PRCockpitHeader.swift", + "Ask on first click": "Sources/PullMark/Views/SettingsView.swift", + "Awaiting review from %@": "Sources/PullMark/Views/PRCockpitHeader.swift", + "Back": "Sources/PullMark/App/PullMarkApp.swift", + "Blame": "Sources/PullMark/Views/PageAccessories.swift", + "Branch name": "Sources/PullMark/Views/CommitSheet.swift", + "Branches": "Sources/PullMark/Views/CompareRevisionsSheet.swift", + "Branches and worktrees": "Sources/PullMark/Views/RemoteDocView.swift", + "Browse Repo Files": "Sources/PullMark/Views/ContentView.swift", + "Browse Repo Files…": "Sources/PullMark/Views/ContentView.swift", + "Built-In Keys": "Sources/PullMark/Views/KeyboardSettingsTab.swift", + "Cancel": "Sources/PullMark/Views/CommitSheet.swift", + "Changed": "Sources/PullMark/Views/CommitSheet.swift", + "Changes requested": "Sources/PullMark/Views/PRCockpitHeader.swift", + "Check Again": "Sources/PullMark/Views/GitHubSetupSheet.swift", + "Check for Updates": "Sources/PullMark/App/UpdateChecker.swift", + "Check for Updates…": "Sources/PullMark/App/AppLinkRouter.swift", + "Checking this Mac's credentials…": "Sources/PullMark/Views/GitHubSetupSheet.swift", + "Checking…": "Sources/PullMark/Views/GitHubSetupSheet.swift", + "Checkout of %@/%@": "Sources/PullMark/Views/ContentView.swift", + "Checks awaiting approval": "Sources/PullMark/Views/PRCockpitHeader.swift", + "Checks failed": "Sources/PullMark/Views/PRCockpitHeader.swift", + "Checks passed": "Sources/PullMark/Views/PRCockpitHeader.swift", + "Checks running": "Sources/PullMark/Views/PRCockpitHeader.swift", + "Choose the file to compare with — it becomes the old side.": "Sources/PullMark/Views/LocalFileView.swift", + "Choose which items the toolbar shows, and their order": "Sources/PullMark/App/PullMarkApp.swift", + "Clear Menu": "Sources/PullMark/App/PullMarkApp.swift", + "Clear Recents": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Click a shortcut, or select a row and press Return, then type the new keys. Press Delete to remove a shortcut, Esc to cancel.": "Sources/PullMark/Views/KeyboardSettingsTab.swift", + "Click to type a zoom level": "Sources/PullMark/Views/Lightbox.swift", + "Clicking files in Locations:": "Sources/PullMark/Views/SettingsView.swift", + "Close": "Sources/PullMark/App/AppLinkRouter.swift", + "Close All": "Sources/PullMark/Views/ContentView.swift", + "Close All Files": "Sources/PullMark/App/PullMarkApp.swift", + "Closed": "Sources/PullMark/Views/PRStatus.swift", + "Command": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Comment": "Sources/PullMark/Views/PRViews.swift", + "Comment on %@": "Sources/PullMark/Views/PRViews.swift", + "Comment on File": "Sources/PullMark/Views/AppToolbar.swift", + "Comment on any local Markdown document the way you'd comment on a PR. Notes save into the file itself as `` comments — ordinary HTML comments that stay out of rendered Markdown, shown by PullMark as bubbles pinned to their spot, and written so agents can read and act on them. [How margin notes work](https://pullmark.app/docs/experimental/margin-notes/)": "Sources/PullMark/Views/SettingsView.swift", + "Comment on any local Markdown document the way you'd comment on a PR. Notes save into the file itself as `` comments — ordinary HTML comments that stay out of rendered Markdown, shown by PullMark as bubbles pinned to their spot. Deleting a note is how it's resolved.": "Sources/PullMark/Views/MarginNotesIntroSheet.swift", + "Comment on this file as a whole, not a specific line": "Sources/PullMark/Views/AppToolbar.swift", + "Commit Changes": "Sources/PullMark/Views/CommitSheet.swift", + "Commit Changes…": "Sources/PullMark/App/PullMarkApp.swift", + "Commit message": "Sources/PullMark/Views/CommitSheet.swift", + "Commit to %@": "Sources/PullMark/Views/CommitSheet.swift", + "Commit to a new branch": "Sources/PullMark/Views/CommitSheet.swift", + "Committed %lld files": "Sources/PullMark/Views/CommitSheet.swift", + "Committed %lld files on new branch “%@”": "Sources/PullMark/Views/CommitSheet.swift", + "Committed 1 file": "Sources/PullMark/Views/CommitSheet.swift", + "Committed 1 file on new branch “%@”": "Sources/PullMark/Views/CommitSheet.swift", + "Compare": "Sources/PullMark/Views/CompareRevisionsSheet.swift", + "Compare Revisions": "Sources/PullMark/Views/CompareRevisionsSheet.swift", + "Comparing ": "Sources/PullMark/Views/LocalFileView.swift", + "Comparing with %@": "Sources/PullMark/Views/LocalFileView.swift", + "Connected": "Sources/PullMark/Views/GitHubSetupSheet.swift", + "Connection status…": "Sources/PullMark/Views/PRViews.swift", + "Content Width": "Sources/PullMark/App/PullMarkApp.swift", + "Content width": "Sources/PullMark/Views/SettingsView.swift", + "Control": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Copied": "Sources/PullMark/Views/SettingsView.swift", + "Copies instructions for CLAUDE.md / AGENTS.md — how to read margin notes and delete them as they're addressed": "Sources/PullMark/Views/MarginNotesIntroSheet.swift", + "Copies the Markdown source of the selected blocks (whole blocks — or the whole document when nothing is selected)": "Sources/PullMark/App/PullMarkApp.swift", + "Copies “%@” to the clipboard": "Sources/PullMark/Views/PageAccessories.swift", + "Copy": "Sources/PullMark/Views/PageAccessories.swift", + "Copy %@ to the clipboard": "Sources/PullMark/Views/GitHubSetupSheet.swift", + "Copy GitHub Branch Link": "Sources/PullMark/App/PullMarkApp.swift", + "Copy GitHub Link": "Sources/PullMark/App/PullMarkApp.swift", + "Copy GitHub Permalink": "Sources/PullMark/App/PullMarkApp.swift", + "Copy GitHub links as:": "Sources/PullMark/Views/SettingsView.swift", + "Copy Path": "Sources/PullMark/App/PullMarkApp.swift", + "Copy as Markdown": "Sources/PullMark/App/PullMarkApp.swift", + "Could not abandon the review: %@": "Sources/PullMark/App/AppState.swift", + "Could not create the PDF: %@": "Sources/PullMark/App/DocumentExport.swift", + "Could not delete the comment: %@": "Sources/PullMark/Views/ThreadCardActions.swift", + "Could not discard the pending comment: %@": "Sources/PullMark/App/AppState.swift", + "Could not post the comment — the PR session is no longer available. Your text was kept as a draft.": "Sources/PullMark/Views/PRViews.swift", + "Could not post the comment: %@": "Sources/PullMark/Views/PRViews.swift", + "Could not post the reply — the PR session is no longer available. Your text was kept as a draft.": "Sources/PullMark/Views/ThreadCardActions.swift", + "Could not post the reply: %@": "Sources/PullMark/Views/ThreadCardActions.swift", + "Could not read %@.": "Sources/PullMark/Views/LocalFileView.swift", + "Could not read the rendered page.": "Sources/PullMark/App/DocumentExport.swift", + "Could not refresh %@: %@": "Sources/PullMark/App/AppState.swift", + "Could not save %@: %@": "Sources/PullMark/App/DocumentExport.swift", + "Could not save the edit: %@": "Sources/PullMark/Views/ThreadCardActions.swift", + "Could not update the reaction: %@": "Sources/PullMark/Views/ThreadCardActions.swift", + "Could not upload %lld pending comments to GitHub — kept locally for retry. %@": "Sources/PullMark/App/AppState.swift", + "Could not upload 1 pending comment to GitHub — kept locally for retry. %@": "Sources/PullMark/App/AppState.swift", + "Couldn't move PullMark": "Sources/PullMark/App/DMGGreeter.swift", + "Couldn't open %@/%@#%lld: ": "Sources/PullMark/Views/OpenQuicklyPalette.swift", + "Couldn't open %@: %@": "Sources/PullMark/App/AppState.swift", + "Couldn't open %@: %@. It may not exist at that ref, or it may be a private repository your GitHub credentials can't access.": "Sources/PullMark/App/AppState.swift", + "Couldn't revert: %@": "Sources/PullMark/App/PullMarkApp.swift", + "Couldn't save %@: ": "Sources/PullMark/Views/LocalFileView.swift", + "Couldn't save %@: %@": "Sources/PullMark/Views/LocalFileView.swift", + "Current branch": "Sources/PullMark/Views/SettingsView.swift", + "Custom themes": "Sources/PullMark/Views/SettingsView.swift", + "Customize Toolbar…": "Sources/PullMark/App/PullMarkApp.swift", + "Dark": "Sources/PullMark/Core/Appearance.swift", + "Default diff layout:": "Sources/PullMark/Views/SettingsView.swift", + "Delete": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Delete comment": "Sources/PullMark/Views/ThreadCardActions.swift", + "Delete this comment?": "Sources/PullMark/Views/ThreadCardActions.swift", + "Deleted": "Sources/PullMark/Views/CommitSheet.swift", + "Determining how this copy was installed…": "Sources/PullMark/Views/PageAccessories.swift", + "Discard the pending review and all its comments, on GitHub too": "Sources/PullMark/Views/ReviewPopover.swift", + "Dismiss": "Sources/PullMark/Views/PageAccessories.swift", + "Dismiss Preview": "Sources/PullMark/Views/ContentView.swift", + "Dismiss — PullMark won't ask again unless you make it the default": "Sources/PullMark/Views/PageAccessories.swift", + "Dismiss — this version won't be suggested again": "Sources/PullMark/Views/PageAccessories.swift", + "Don't ask again for this repository": "Sources/PullMark/Views/CommitSheet.swift", + "Done": "Sources/PullMark/Views/GitHubSetupSheet.swift", + "Dotfiles and hidden folders in Locations — like ⇧⌘. in Finder": "Sources/PullMark/App/PullMarkApp.swift", + "Dotfiles and hidden folders in Locations — ⇧⌘. toggles this too, like Finder": "Sources/PullMark/Views/SettingsView.swift", + "Down Arrow": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Download": "Sources/PullMark/Views/PageAccessories.swift", + "Downloads the update, verifies its signature, and installs it in place": "Sources/PullMark/Views/PageAccessories.swift", + "Draft": "Sources/PullMark/Views/PRStatus.swift", + "Drag PullMark to Applications in the Finder instead. (%@)": "Sources/PullMark/App/DMGGreeter.swift", + "Each block's source line in the margin": "Sources/PullMark/Views/SettingsView.swift", + "Each block's starting source line, in the margin of rendered documents and diffs — hover a number for the block's full range. Rendered text wraps freely, so numbering is per block, not per visual line. The raw source view always shows its own line numbers.": "Sources/PullMark/Views/SettingsView.swift", + "Edit": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Edit Mode": "Sources/PullMark/App/PullMarkApp.swift", + "Enable margin notes": "Sources/PullMark/Views/SettingsView.swift", + "End": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Escape": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Every release's notes, up to the version you're running": "Sources/PullMark/App/PullMarkApp.swift", + "Exact commit (permalink)": "Sources/PullMark/Views/SettingsView.swift", + "Expand All": "Sources/PullMark/Views/ContentView.swift", + "Experimental": "Sources/PullMark/Views/SettingsView.swift", + "Export as HTML…": "Sources/PullMark/App/PullMarkApp.swift", + "Export as PDF…": "Sources/PullMark/App/PullMarkApp.swift", + "Features land here before their design is settled. **Beta** features get a real compatibility effort between versions and are likely to graduate. **Alpha** features carry no guarantees: they may change incompatibly, their data formats may not migrate, and they may disappear entirely. [About experimental features](https://pullmark.app/docs/experimental/)": "Sources/PullMark/Views/SettingsView.swift", + "Features land here before their design is settled. **Beta** features get a real compatibility effort between versions and are likely to graduate. [About experimental features](https://pullmark.app/docs/experimental/)": "Sources/PullMark/Views/SettingsView.swift", + "File": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "File Margin Note…": "Sources/PullMark/App/PullMarkApp.swift", + "Fill in a known branch, tag, or commit": "Sources/PullMark/Views/CompareRevisionsSheet.swift", + "Find Next": "Sources/PullMark/App/PullMarkApp.swift", + "Find Previous": "Sources/PullMark/App/PullMarkApp.swift", + "Find in Page": "Sources/PullMark/App/PullMarkApp.swift", + "Find in page": "Sources/PullMark/Views/PageAccessories.swift", + "Finish your review · %lld": "Sources/PullMark/Core/ReviewControl.swift", + "Finish your review — %lld pending comments": "Sources/PullMark/Core/ReviewControl.swift", + "Finish your review — 1 pending comment": "Sources/PullMark/Core/ReviewControl.swift", + "Flip Diff Layout": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Forward": "Sources/PullMark/App/PullMarkApp.swift", + "Forward Delete": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Full Width": "Sources/PullMark/Core/ContentWidth.swift", + "General": "Sources/PullMark/Views/SettingsView.swift", + "GitHub": "Sources/PullMark/Views/SettingsView.swift", + "GitHub API error (%lld): %@": "Sources/PullMark/GitHub/GitHubClient.swift", + "GitHub Access": "Sources/PullMark/Views/GitHubSetupSheet.swift", + "GitHub CLI": "Sources/PullMark/GitHub/SystemGitCredentials.swift", + "GitHub Markdown links:": "Sources/PullMark/Views/SettingsView.swift", + "Go": "Sources/PullMark/App/PullMarkApp.swift", + "Hidden": "Sources/PullMark/Views/SettingsView.swift", + "Hide Hidden Files": "Sources/PullMark/App/PullMarkApp.swift", + "Hide Margin Notes": "Sources/PullMark/App/PullMarkApp.swift", + "Hide Markdown Source": "Sources/PullMark/App/PullMarkApp.swift", + "Hide Outline": "Sources/PullMark/App/PullMarkApp.swift", + "Hide Resolved Conversations": "Sources/PullMark/App/PullMarkApp.swift", + "Hide review requests with no Markdown files — PullMark has nothing to show for them": "Sources/PullMark/Views/SettingsView.swift", + "History": "Sources/PullMark/Views/CompareRevisionsSheet.swift", + "Home": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Hover any block for the note bubble (select text first to quote it), or press ⌥⌘M. Edit and delete from each bubble; deleting a note is how it's resolved. Open Files rows show a count chip while a document still carries notes, and View → Hide Margin Notes clears the page for clean reading.": "Sources/PullMark/Views/SettingsView.swift", + "How far text may stretch before it wraps. Standard keeps the classic book-like measure; Wide fits more on screen and still caps the line length; Full Width gives the document the whole window — handy in full screen. Applies everywhere, live, and plays with any theme.": "Sources/PullMark/Views/SettingsView.swift", + "How wide the rendered text column runs": "Sources/PullMark/Views/AppToolbar.swift", + "In a local document": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "In a pull request": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "In a pull request file": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "In a pull request file's Result view": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Install pullmark Command…": "Sources/PullMark/Views/SettingsView.swift", + "Jump to another Markdown file in this pull request": "Sources/PullMark/Views/PRViews.swift", + "Jump to any file, heading, or pull request": "Sources/PullMark/App/PullMarkApp.swift", + "Jump to the GitHub connection section": "Sources/PullMark/Views/SettingsView.swift", + "Keep": "Sources/PullMark/App/DMGGreeter.swift", + "Keep Open": "Sources/PullMark/Views/ContentView.swift", + "Keep Using": "Sources/PullMark/Views/MarginNotesIntroSheet.swift", + "Keyboard": "Sources/PullMark/Views/SettingsView.swift", + "Language": "Sources/PullMark/Views/SettingsView.swift", + "Language:": "Sources/PullMark/Views/SettingsView.swift", + "Large repo — not all files shown": "Sources/PullMark/Views/ContentView.swift", + "Last seen at %@. ": "Sources/PullMark/Views/ContentView.swift", + "Layout": "Sources/PullMark/Views/AppToolbar.swift", + "Left Arrow": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Light": "Sources/PullMark/Core/Appearance.swift", + "Light, Dark, or match the system — the window and every rendered page follow, and each theme brings its own light and dark looks.": "Sources/PullMark/Views/SettingsView.swift", + "Line %lld (new)": "Sources/PullMark/GitHub/ReviewThreads.swift", + "Line %lld (old)": "Sources/PullMark/GitHub/ReviewThreads.swift", + "Line numbers": "Sources/PullMark/Views/SettingsView.swift", + "Line numbers hidden": "Sources/PullMark/Views/SettingsView.swift", + "Line numbers shown": "Sources/PullMark/Views/SettingsView.swift", + "Loading repo files…": "Sources/PullMark/Views/ContentView.swift", + "Locations": "Sources/PullMark/Views/ContentView.swift", + "Make Default Again": "Sources/PullMark/Views/PageAccessories.swift", + "Make PullMark the Default": "Sources/PullMark/Views/SettingsView.swift", + "Make the document bigger": "Sources/PullMark/Views/AppToolbar.swift", + "Make the document bigger — text, images, and the content column scale together": "Sources/PullMark/App/PullMarkApp.swift", + "Make the document smaller": "Sources/PullMark/App/PullMarkApp.swift", + "Make the page writable — then click any block": "Sources/PullMark/App/PullMarkApp.swift", + "Make this choice the default for GitHub Markdown links": "Sources/PullMark/Views/RemoteDocView.swift", + "Margin Notes": "Sources/PullMark/Views/MarginNotesIntroSheet.swift", + "Margin notes are experimental (beta): the design may still shift between versions, and Settings → Experimental turns them off any time. [How margin notes work](https://pullmark.app/docs/experimental/margin-notes/)": "Sources/PullMark/Views/MarginNotesIntroSheet.swift", + "Margin notes are hidden — choose View → Show Margin Notes first.": "Sources/PullMark/Views/LocalFileView.swift", + "Margin notes are off — turn them back on in Settings → Experimental.": "Sources/PullMark/Views/LocalFileView.swift", + "Margin notes are off — turn them on in Settings → Experimental.": "Sources/PullMark/Views/LocalFileView.swift", + "Margin-note bubbles ( comments) in rendered documents": "Sources/PullMark/App/PullMarkApp.swift", + "Markdown files open in PullMark": "Sources/PullMark/Views/SettingsView.swift", + "Merged": "Sources/PullMark/Views/PRStatus.swift", + "Mission Control": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Modified": "Sources/PullMark/Views/CommitSheet.swift", + "Move PullMark to your Applications folder?": "Sources/PullMark/App/DMGGreeter.swift", + "Move to Applications": "Sources/PullMark/App/DMGGreeter.swift", + "Move to Trash": "Sources/PullMark/App/DMGGreeter.swift", + "Next File": "Sources/PullMark/Views/PRViews.swift", + "Next Markdown file in this pull request": "Sources/PullMark/Views/PRViews.swift", + "Next match": "Sources/PullMark/Views/PageAccessories.swift", + "No Markdown files found in %@.": "Sources/PullMark/App/AppState.swift", + "No changes to commit.": "Sources/PullMark/Views/CommitSheet.swift", + "No headings": "Sources/PullMark/Views/PageAccessories.swift", + "None": "Sources/PullMark/Views/KeyboardSettingsTab.swift", + "Not Now": "Sources/PullMark/App/DMGGreeter.swift", + "Not a Homebrew user? [Download the CLI from cli.github.com](https://cli.github.com), then sign in the same way.": "Sources/PullMark/Views/GitHubSetupSheet.swift", + "Not available in this build": "Sources/PullMark/Views/SettingsView.swift", + "Not connected": "Sources/PullMark/Views/SettingsView.swift", + "Not connected to GitHub — private repositories and reviewing are unavailable.": "Sources/PullMark/Views/SettingsView.swift", + "Notes are written so agents can read and act on them. Paste the snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in this file\" becomes a complete handoff.": "Sources/PullMark/Views/MarginNotesIntroSheet.swift", + "OK": "Sources/PullMark/Views/ContentView.swift", + "Off shows a quiet banner instead — the notes stay one click away": "Sources/PullMark/Views/SettingsView.swift", + "Only requests that change Markdown": "Sources/PullMark/Views/SettingsView.swift", + "Open": "Sources/PullMark/Views/ContentView.swift", + "Open Branch Separately": "Sources/PullMark/Views/RemoteDocView.swift", + "Open File or Folder": "Sources/PullMark/Views/AppToolbar.swift", + "Open Files": "Sources/PullMark/Views/ContentView.swift", + "Open File…": "Sources/PullMark/Views/ContentView.swift", + "Open Folder…": "Sources/PullMark/Views/ContentView.swift", + "Open Fully": "Sources/PullMark/Views/SettingsView.swift", + "Open GitHub Markdown links in PullMark?": "Sources/PullMark/Views/RemoteDocView.swift", + "Open Markdown files": "Sources/PullMark/App/AppState.swift", + "Open Markdown files or a folder containing them": "Sources/PullMark/App/AppState.swift", + "Open Pull Request": "Sources/PullMark/Views/AppToolbar.swift", + "Open Pull Request…": "Sources/PullMark/App/PullMarkApp.swift", + "Open Quickly — files, headings, pull requests, or paths": "Sources/PullMark/Views/OpenQuicklyPalette.swift", + "Open Quickly…": "Sources/PullMark/App/PullMarkApp.swift", + "Open Recent": "Sources/PullMark/App/PullMarkApp.swift", + "Open Release Page": "Sources/PullMark/Views/PageAccessories.swift", + "Open Themes Folder": "Sources/PullMark/Views/SettingsView.swift", + "Open Worktree": "Sources/PullMark/Views/ContentView.swift", + "Open a GitHub pull request": "Sources/PullMark/Views/AppToolbar.swift", + "Open a Markdown file or a GitHub pull request": "Sources/PullMark/Views/ContentView.swift", + "Open a folder containing Markdown files": "Sources/PullMark/App/AppState.swift", + "Open files, folders, and worktrees from the shell — [about the pullmark command](https://pullmark.app/docs/cli/).": "Sources/PullMark/Views/SettingsView.swift", + "Open in Browser": "Sources/PullMark/Views/RemoteDocView.swift", + "Open in PullMark": "Sources/PullMark/Views/RemoteDocView.swift", + "Open local Markdown files or a folder": "Sources/PullMark/Views/AppToolbar.swift", + "Open on GitHub": "Sources/PullMark/Views/ContentView.swift", + "Open pull requests where your review is requested": "Sources/PullMark/Views/SettingsView.swift", + "Open the review — pending comments, summary, and verdict": "Sources/PullMark/App/PullMarkApp.swift", + "Opens the release page on GitHub": "Sources/PullMark/Views/PageAccessories.swift", + "Opens the release page on GitHub to update manually": "Sources/PullMark/Views/PageAccessories.swift", + "Open…": "Sources/PullMark/App/PullMarkApp.swift", + "Option": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Outdated": "Sources/PullMark/GitHub/ReviewThreads.swift", + "Outdated — was line %lld": "Sources/PullMark/GitHub/ReviewThreads.swift", + "Outline": "Sources/PullMark/Views/PageAccessories.swift", + "PR Overview": "Sources/PullMark/Views/PRViews.swift", + "Page Down": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Page Setup…": "Sources/PullMark/App/PullMarkApp.swift", + "Page Up": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Paper size and orientation for printing": "Sources/PullMark/App/PullMarkApp.swift", + "Paste the copied snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in the file\" becomes a complete handoff — the agent deletes each note as it resolves it, and you watch the bubbles disappear.": "Sources/PullMark/Views/SettingsView.swift", + "Pending review on GitHub": "Sources/PullMark/Views/ReviewPopover.swift", + "Pinned to commit %@ — the ref's tip as of this session's last fetch.": "Sources/PullMark/Views/RemoteDocView.swift", + "Posts immediately — file comments can't join a pending review.": "Sources/PullMark/Views/PRViews.swift", + "Preview First": "Sources/PullMark/Views/SettingsView.swift", + "Preview First shows a file with one click without keeping it — one italicized entry (in Open Files, or under its GitHub repo) that the next preview replaces. Double-click a file, or just start editing, to keep it open. Open Fully keeps every file you click.": "Sources/PullMark/Views/SettingsView.swift", + "Previous File": "Sources/PullMark/Views/PRViews.swift", + "Previous Markdown file in this pull request": "Sources/PullMark/Views/PRViews.swift", + "Previous match": "Sources/PullMark/Views/PageAccessories.swift", + "Print the rendered document": "Sources/PullMark/App/PullMarkApp.swift", + "Print…": "Sources/PullMark/App/PullMarkApp.swift", + "Private repositories, commenting, and reviewing are ready.": "Sources/PullMark/Views/GitHubSetupSheet.swift", + "Pull Requests": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "PullMark %@ is available.": "Sources/PullMark/Views/PageAccessories.swift", + "PullMark Website": "Sources/PullMark/App/PullMarkApp.swift", + "PullMark borrows the GitHub credentials your own tools already have — the GitHub CLI or a git credential helper. It has no login of its own, stores nothing, and never sees a password.": "Sources/PullMark/Views/GitHubSetupSheet.swift", + "PullMark borrows the credentials your own tools already have — the GitHub CLI or a git credential helper. It has no login of its own, stores nothing, and never sees a password. [About GitHub access](https://pullmark.app/docs/troubleshooting/#github-access)": "Sources/PullMark/Views/SettingsView.swift", + "PullMark can fetch this file and render it in-app, or send it to your browser. Hold ⌘ while clicking a link for the other behavior; the default lives in Settings → General.": "Sources/PullMark/Views/RemoteDocView.swift", + "PullMark is in demo mode — network access is disabled.": "Sources/PullMark/GitHub/GitHubClient.swift", + "PullMark is installed — the disk image is no longer needed. This ejects it and moves “%@” to the Trash.": "Sources/PullMark/App/DMGGreeter.swift", + "PullMark is no longer your default Markdown app.": "Sources/PullMark/Views/PageAccessories.swift", + "PullMark is running from its disk image. Moving it to Applications installs it properly and enables one-click updates.": "Sources/PullMark/App/DMGGreeter.swift", + "Push to origin after committing": "Sources/PullMark/Views/CommitSheet.swift", + "Quick Look previews:": "Sources/PullMark/Views/SettingsView.swift", + "Raw Source": "Sources/PullMark/Views/SettingsView.swift", + "Re-read credentials from the GitHub CLI and git credential helpers": "Sources/PullMark/Views/GitHubSetupSheet.swift", + "Re-read credentials from the GitHub CLI and git credential helpers — after gh auth login, this connects without relaunching": "Sources/PullMark/Views/SettingsView.swift", + "Re-read this file from disk": "Sources/PullMark/App/PullMarkApp.swift", + "Reaction state unavailable — try refreshing the PR.": "Sources/PullMark/Views/ThreadCardActions.swift", + "Reading": "Sources/PullMark/Views/SettingsView.swift", + "Recents": "Sources/PullMark/Views/ContentView.swift", + "Redo": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Refresh": "Sources/PullMark/Views/PageAccessories.swift", + "Refresh Folder": "Sources/PullMark/App/PullMarkApp.swift", + "Release Notes": "Sources/PullMark/App/PullMarkApp.swift", + "Release notes couldn't be loaded — they're also at github.com/jedijashwa/pullmark/releases.": "Sources/PullMark/App/PullMarkApp.swift", + "Reload": "Sources/PullMark/Views/AppToolbar.swift", + "Reload Document": "Sources/PullMark/App/PullMarkApp.swift", + "Remember my selection": "Sources/PullMark/Views/RemoteDocView.swift", + "Remote Branches": "Sources/PullMark/Views/CompareRevisionsSheet.swift", + "Remove from Recents": "Sources/PullMark/Views/ContentView.swift", + "Remove from Sidebar": "Sources/PullMark/Views/ContentView.swift", + "Remove the PullMark disk image?": "Sources/PullMark/App/DMGGreeter.swift", + "Renamed": "Sources/PullMark/Views/CommitSheet.swift", + "Rendered": "Sources/PullMark/Views/SettingsView.swift", + "Rendered Diff": "Sources/PullMark/App/PullMarkApp.swift", + "Reopen what was in the sidebar when PullMark last quit": "Sources/PullMark/Views/SettingsView.swift", + "Reopening…": "Sources/PullMark/Views/ContentView.swift", + "Report a Bug…": "Sources/PullMark/App/PullMarkApp.swift", + "Report an Issue…": "Sources/PullMark/App/AppLinkRouter.swift", + "Request a Feature…": "Sources/PullMark/App/PullMarkApp.swift", + "Required": "Sources/PullMark/Views/PRCockpitHeader.swift", + "Reset the zoom to 100%": "Sources/PullMark/App/PullMarkApp.swift", + "Restore Defaults": "Sources/PullMark/Views/KeyboardSettingsTab.swift", + "Restore Defaults…": "Sources/PullMark/Views/KeyboardSettingsTab.swift", + "Restore all keyboard shortcuts to their defaults?": "Sources/PullMark/Views/KeyboardSettingsTab.swift", + "Restore files and pull requests from the last session": "Sources/PullMark/Views/SettingsView.swift", + "Restore the default": "Sources/PullMark/Views/KeyboardSettingsTab.swift", + "Restore the file as it was before PullMark's last edit": "Sources/PullMark/App/PullMarkApp.swift", + "Result": "Sources/PullMark/App/PullMarkApp.swift", + "Retry": "Sources/PullMark/Views/PRViews.swift", + "Retry Upload": "Sources/PullMark/Views/ReviewPopover.swift", + "Return": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Reveal in Finder": "Sources/PullMark/App/PullMarkApp.swift", + "Reveal in Location": "Sources/PullMark/Views/ContentView.swift", + "Reveal on GitHub": "Sources/PullMark/Views/ContentView.swift", + "Reveal resolved review conversations in the Result view": "Sources/PullMark/App/PullMarkApp.swift", + "Revert Last Edit": "Sources/PullMark/App/PullMarkApp.swift", + "Reverted the last edit to %@.": "Sources/PullMark/App/PullMarkApp.swift", + "Review Changes…": "Sources/PullMark/App/PullMarkApp.swift", + "Review Requests": "Sources/PullMark/Views/ContentView.swift", + "Review changes": "Sources/PullMark/Core/ReviewControl.swift", + "Review comments couldn't be loaded — existing threads may be missing.": "Sources/PullMark/Views/PageAccessories.swift", + "Review requested from %@": "Sources/PullMark/Views/PRCockpitHeader.swift", + "Review required": "Sources/PullMark/Views/PRCockpitHeader.swift", + "Review submitted.": "Sources/PullMark/Views/ReviewPopover.swift", + "Review summary (optional)": "Sources/PullMark/Views/ReviewPopover.swift", + "Review verdict": "Sources/PullMark/Views/ReviewPopover.swift", + "Reviewing": "Sources/PullMark/Views/SettingsView.swift", + "Right Arrow": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Runs “%@” and relaunches PullMark": "Sources/PullMark/Views/PageAccessories.swift", + "Save the rendered document as a PDF": "Sources/PullMark/App/PullMarkApp.swift", + "Save the rendered document as a self-contained HTML file": "Sources/PullMark/App/PullMarkApp.swift", + "Saved as a pending review — visible only to you until you submit": "Sources/PullMark/Views/ReviewPopover.swift", + "Search All Files…": "Sources/PullMark/App/PullMarkApp.swift", + "Search all files": "Sources/PullMark/Views/SearchPalette.swift", + "See if something even newer is available": "Sources/PullMark/Views/SettingsView.swift", + "Set Up GitHub Access…": "Sources/PullMark/Views/ContentView.swift", + "Set Up…": "Sources/PullMark/Views/PRViews.swift", + "Set up the GitHub CLI": "Sources/PullMark/Views/GitHubSetupSheet.swift", + "Share": "Sources/PullMark/Views/AppToolbar.swift", + "Shift": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Show": "Sources/PullMark/Views/SettingsView.swift", + "Show Alpha Features": "Sources/PullMark/Views/SettingsView.swift", + "Show Hidden Files": "Sources/PullMark/App/PullMarkApp.swift", + "Show Margin Notes": "Sources/PullMark/App/PullMarkApp.swift", + "Show Markdown Source": "Sources/PullMark/App/PullMarkApp.swift", + "Show Outline": "Sources/PullMark/App/PullMarkApp.swift", + "Show Resolved Conversations": "Sources/PullMark/App/PullMarkApp.swift", + "Show What's New after an update": "Sources/PullMark/Views/SettingsView.swift", + "Show alpha features": "Sources/PullMark/Views/SettingsView.swift", + "Show alpha features?": "Sources/PullMark/Views/SettingsView.swift", + "Show hidden files": "Sources/PullMark/Views/SettingsView.swift", + "Show or hide the document outline": "Sources/PullMark/Views/PageAccessories.swift", + "Show review discussion on the PR overview": "Sources/PullMark/Views/SettingsView.swift", + "Show review requests in the sidebar": "Sources/PullMark/Views/SettingsView.swift", + "Show the next document": "Sources/PullMark/App/PullMarkApp.swift", + "Show the previous document": "Sources/PullMark/App/PullMarkApp.swift", + "Show the raw Markdown behind the rendered document": "Sources/PullMark/Views/AppToolbar.swift", + "Show who last changed each block (git blame)": "Sources/PullMark/Views/PageAccessories.swift", + "Show/Hide Hidden Files": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Show/Hide Margin Notes": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Show/Hide Markdown Source": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Show/Hide Outline": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Show/Hide Resolved Conversations": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Showing 500 of %lld changed files — Markdown files are preselected either way.": "Sources/PullMark/Views/CommitSheet.swift", + "Showing the first %lld Markdown files": "Sources/PullMark/Views/ContentView.swift", + "Shown": "Sources/PullMark/Views/SettingsView.swift", + "Sign in to GitHub": "Sources/PullMark/Views/GitHubSetupSheet.swift", + "Sign notes as:": "Sources/PullMark/Views/SettingsView.swift", + "Something went wrong": "Sources/PullMark/Views/ContentView.swift", + "Source": "Sources/PullMark/Views/AppToolbar.swift", + "Source Diff": "Sources/PullMark/App/PullMarkApp.swift", + "Space": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Spotlight": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Stage and commit changes in this file's repository": "Sources/PullMark/App/PullMarkApp.swift", + "Standard": "Sources/PullMark/Core/ContentWidth.swift", + "Submit review": "Sources/PullMark/Views/ReviewPopover.swift", + "Submit the review with the selected verdict (⌘↩)": "Sources/PullMark/Views/ReviewPopover.swift", + "Support PullMark ❤️": "Sources/PullMark/App/PullMarkApp.swift", + "Switch between light, dark, and system appearance": "Sources/PullMark/Views/AppToolbar.swift", + "Switch or Open Branch…": "Sources/PullMark/Views/ContentView.swift", + "System": "Sources/PullMark/Core/AppLanguage.swift", + "Tab": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Tags": "Sources/PullMark/Views/CompareRevisionsSheet.swift", + "Takes effect the next time PullMark opens.": "Sources/PullMark/Views/SettingsView.swift", + "Teach your agent": "Sources/PullMark/Views/SettingsView.swift", + "Tell your agent": "Sources/PullMark/Views/MarginNotesIntroSheet.swift", + "Temporarily show the raw Markdown behind the rendered document": "Sources/PullMark/App/PullMarkApp.swift", + "That link needs a different version of PullMark": "Sources/PullMark/App/AppLinkRouter.swift", + "The @name your notes carry — empty uses your GitHub login, or this Mac's account name when signed out": "Sources/PullMark/Views/SettingsView.swift", + "The GitHub CLI is installed but signed out. Run this in your terminal — it opens a browser to sign in:": "Sources/PullMark/Views/GitHubSetupSheet.swift", + "The PR session is no longer available — the draft could not be saved to disk.": "Sources/PullMark/Views/ThreadCardActions.swift", + "The comment will be removed from GitHub. Replies from others will stay.": "Sources/PullMark/Views/ThreadCardActions.swift", + "The document's headings, in a sidebar": "Sources/PullMark/App/PullMarkApp.swift", + "The pull request overview (%@ #%lld)": "Sources/PullMark/Views/PRViews.swift", + "The pullmark command is installed": "Sources/PullMark/Views/SettingsView.swift", + "Theme": "Sources/PullMark/Views/SettingsView.swift", + "Themes restyle rendered Markdown and diffs, and follow the Light/Dark appearance. Drop .css files into the Themes folder to add your own — they apply on top of the GitHub look. Quick Look previews follow your theme too (custom themes fall back to their GitHub base there).": "Sources/PullMark/Views/SettingsView.swift", + "These keys are fixed and can't be changed.": "Sources/PullMark/Views/KeyboardSettingsTab.swift", + "This comment is still syncing with GitHub — try discarding it again in a moment.": "Sources/PullMark/App/AppState.swift", + "This folder has more Markdown files than PullMark scans — open a subfolder as its own Location to see the rest": "Sources/PullMark/Views/ContentView.swift", + "This pull request was updated on GitHub.": "Sources/PullMark/Views/PageAccessories.swift", + "This repository has no GitHub remote.": "Sources/PullMark/Views/ContentView.swift", + "This version (%@) doesn't know %@ — it may point at a feature from a newer release, or one that has moved. Checking for updates usually resolves it.": "Sources/PullMark/App/AppLinkRouter.swift", + "Thread state unavailable — try refreshing the PR.": "Sources/PullMark/Views/ThreadCardActions.swift", + "Turn Off": "Sources/PullMark/Views/MarginNotesIntroSheet.swift", + "Unavailable": "Sources/PullMark/Views/PRStatus.swift", + "Untracked": "Sources/PullMark/Views/CommitSheet.swift", + "Up Arrow": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Update Now": "Sources/PullMark/Views/PageAccessories.swift", + "Update failed: %@": "Sources/PullMark/Views/PageAccessories.swift", + "Updated to PullMark %@.": "Sources/PullMark/Views/PageAccessories.swift", + "Updates": "Sources/PullMark/Views/SettingsView.swift", + "Upload the remaining comments into your pending review on GitHub": "Sources/PullMark/Views/ReviewPopover.swift", + "Use Anyway": "Sources/PullMark/Views/KeyboardSettingsTab.swift", + "Using it": "Sources/PullMark/Views/SettingsView.swift", + "View": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "View All Release Notes": "Sources/PullMark/Views/PageAccessories.swift", + "View all checks on GitHub": "Sources/PullMark/Views/PRCockpitHeader.swift", + "View as List": "Sources/PullMark/Views/ContentView.swift", + "View as Tree": "Sources/PullMark/Views/ContentView.swift", + "View on GitHub": "Sources/PullMark/Views/PRViews.swift", + "Viewing signed out — commenting and reviewing are unavailable": "Sources/PullMark/Views/PRViews.swift", + "Walk through connecting PullMark to GitHub": "Sources/PullMark/Views/PRViews.swift", + "What Copy GitHub Link copies — hold ⌥ in the menu for the other flavor": "Sources/PullMark/Views/SettingsView.swift", + "What changed since the last commit, rendered like a PR diff — the toolbar's Compare button offers older revisions and branches": "Sources/PullMark/App/PullMarkApp.swift", + "What clicking a link to a Markdown file on GitHub does — hold ⌘ while clicking for the other behavior": "Sources/PullMark/Views/SettingsView.swift", + "What pressing space in Finder shows for Markdown files": "Sources/PullMark/Views/SettingsView.swift", + "What's New": "Sources/PullMark/Views/PageAccessories.swift", + "While the find bar is open": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Whole file": "Sources/PullMark/GitHub/ReviewThreads.swift", + "Wide": "Sources/PullMark/Core/ContentWidth.swift", + "With a folder selected": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "With a local file or folder in a GitHub repository selected": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "With a local file or folder selected": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "With files in Open Files": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Works with private repos using your existing gh or git credentials.": "Sources/PullMark/Views/PRViews.swift", + "You're on %@.": "Sources/PullMark/Views/CommitSheet.swift", + "Your custom shortcuts will be removed. This can't be undone.": "Sources/PullMark/Views/KeyboardSettingsTab.swift", + "Zoom In": "Sources/PullMark/App/PullMarkApp.swift", + "Zoom Out": "Sources/PullMark/App/PullMarkApp.swift", + "and %lld more": "Sources/PullMark/Views/PRCockpitHeader.swift", + "confirming sheets": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "cycling windows": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "dismissing sheets": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "git credential helper": "Sources/PullMark/GitHub/SystemGitCredentials.swift", + "https://github.com/owner/repo/pull/123 or owner/repo#123": "Sources/PullMark/Views/PRViews.swift", + "just now": "Sources/PullMark/Core/Blame.swift", + "on base branch": "Sources/PullMark/Views/BlameHistorySheet.swift", + "opened by %@": "Sources/PullMark/Views/PRViews.swift", + "the Help menu": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "the app switcher": "Sources/PullMark/Core/KeyboardShortcuts.swift", + " · was {r}": "Sources/PullMark/Rendering/PageStrings.swift", + "(empty)": "Sources/PullMark/Rendering/PageStrings.swift", + "Add a margin note": "Sources/PullMark/Rendering/PageStrings.swift", + "Add a suggestion": "Sources/PullMark/Rendering/PageStrings.swift", + "Add reaction": "Sources/PullMark/Rendering/PageStrings.swift", + "Add single comment": "Sources/PullMark/Rendering/PageStrings.swift", + "Click the gutter for history": "Sources/PullMark/Rendering/PageStrings.swift", + "Comment actions": "Sources/PullMark/Rendering/PageStrings.swift", + "Comment on line {n}": "Sources/PullMark/Rendering/PageStrings.swift", + "Comment on lines {a}–{b}": "Sources/PullMark/Rendering/PageStrings.swift", + "Comment on new line {n}": "Sources/PullMark/Rendering/PageStrings.swift", + "Comment on new line {n} — shift-click extends the range": "Sources/PullMark/Rendering/PageStrings.swift", + "Comment on new lines {a}–{b}": "Sources/PullMark/Rendering/PageStrings.swift", + "Comment on old line {n} — shift-click extends the range": "Sources/PullMark/Rendering/PageStrings.swift", + "Comment on old lines {a}–{b}": "Sources/PullMark/Rendering/PageStrings.swift", + "Comment on the pull request conversation": "Sources/PullMark/Rendering/PageStrings.swift", + "Conversation": "Sources/PullMark/Rendering/PageStrings.swift", + "Copy full SHA": "Sources/PullMark/Rendering/PageStrings.swift", + "Couldn't load this image from GitHub · ": "Sources/PullMark/Rendering/PageStrings.swift", + "File comments": "Sources/PullMark/Rendering/PageStrings.swift", + "Front matter": "Sources/PullMark/Rendering/PageStrings.swift", + "Hide {n} resolved conversation": "Sources/PullMark/Rendering/PageStrings.swift", + "Hide {n} resolved conversations": "Sources/PullMark/Rendering/PageStrings.swift", + "Insert a ```suggestion block pre-filled with the current lines": "Sources/PullMark/Rendering/PageStrings.swift", + "LEFT": "Sources/PullMark/Rendering/PageStrings.swift", + "Leave a comment": "Sources/PullMark/Rendering/PageStrings.swift", + "Line {n}": "Sources/PullMark/Rendering/PageStrings.swift", + "Lines {a}–{b}": "Sources/PullMark/Rendering/PageStrings.swift", + "Moved from line {n} — content unchanged": "Sources/PullMark/Rendering/PageStrings.swift", + "Not synced": "Sources/PullMark/Rendering/PageStrings.swift", + "Old line {n}": "Sources/PullMark/Rendering/PageStrings.swift", + "Old lines {a}–{b}": "Sources/PullMark/Rendering/PageStrings.swift", + "Open this conversation on GitHub — PullMark doesn't render this file": "Sources/PullMark/Rendering/PageStrings.swift", + "Open {path} and jump to this conversation": "Sources/PullMark/Rendering/PageStrings.swift", + "Outdated review comments": "Sources/PullMark/Rendering/PageStrings.swift", + "Pending": "Sources/PullMark/Rendering/PageStrings.swift", + "Pending comment — click to expand": "Sources/PullMark/Rendering/PageStrings.swift", + "Pending comments — click to expand": "Sources/PullMark/Rendering/PageStrings.swift", + "Post to the PR conversation right away — not part of a review (⌘↩)": "Sources/PullMark/Rendering/PageStrings.swift", + "Reply": "Sources/PullMark/Rendering/PageStrings.swift", + "Reply to this thread (⌘↩)": "Sources/PullMark/Rendering/PageStrings.swift", + "Resolve": "Sources/PullMark/Rendering/PageStrings.swift", + "Resolved": "Sources/PullMark/Rendering/PageStrings.swift", + "Review discussion": "Sources/PullMark/Rendering/PageStrings.swift", + "Save": "Sources/PullMark/Rendering/PageStrings.swift", + "Save your edit (⌘↩)": "Sources/PullMark/Rendering/PageStrings.swift", + "Show on GitHub": "Sources/PullMark/Rendering/PageStrings.swift", + "Show {n} resolved conversation": "Sources/PullMark/Rendering/PageStrings.swift", + "Show {n} resolved conversations": "Sources/PullMark/Rendering/PageStrings.swift", + "Suggested change": "Sources/PullMark/Rendering/PageStrings.swift", + "Suggestions can only target new-file lines — GitHub applies them in place of the commented lines.": "Sources/PullMark/Rendering/PageStrings.swift", + "The conversation could not be loaded — retrying.": "Sources/PullMark/Rendering/PageStrings.swift", + "The targeted lines aren't available to suggest an edit to.": "Sources/PullMark/Rendering/PageStrings.swift", + "This block isn't part of the pull request's diff — GitHub can only attach comments to changed lines.": "Sources/PullMark/Rendering/PageStrings.swift", + "This file is empty on both sides of the diff.": "Sources/PullMark/Rendering/PageStrings.swift", + "Unresolve": "Sources/PullMark/Rendering/PageStrings.swift", + "View commit on GitHub": "Sources/PullMark/Rendering/PageStrings.swift", + "View in File": "Sources/PullMark/Rendering/PageStrings.swift", + "Write a reply": "Sources/PullMark/Rendering/PageStrings.swift", + "Write at the end of the document": "Sources/PullMark/Rendering/PageStrings.swift", + "all conversations resolved": "Sources/PullMark/Rendering/PageStrings.swift", + "approved these changes": "Sources/PullMark/Rendering/PageStrings.swift", + "bot": "Sources/PullMark/Rendering/PageStrings.swift", + "copied": "Sources/PullMark/Rendering/PageStrings.swift", + "dismissed their review": "Sources/PullMark/Rendering/PageStrings.swift", + "moved": "Sources/PullMark/Rendering/PageStrings.swift", + "requested changes": "Sources/PullMark/Rendering/PageStrings.swift", + "reviewed": "Sources/PullMark/Rendering/PageStrings.swift", + "whole document": "Sources/PullMark/Rendering/PageStrings.swift", + "{n} comment": "Sources/PullMark/Rendering/PageStrings.swift", + "{n} comment — click to expand": "Sources/PullMark/Rendering/PageStrings.swift", + "{n} comments": "Sources/PullMark/Rendering/PageStrings.swift", + "{n} comments — click to expand": "Sources/PullMark/Rendering/PageStrings.swift", + "{n} review": "Sources/PullMark/Rendering/PageStrings.swift", + "{n} reviews": "Sources/PullMark/Rendering/PageStrings.swift", + "{n} unresolved conversation": "Sources/PullMark/Rendering/PageStrings.swift", + "{n} unresolved conversations": "Sources/PullMark/Rendering/PageStrings.swift", + " · edited": "Sources/PullMark/Rendering/PageStrings.swift", + "· asks where to open": "Sources/PullMark/Rendering/PageStrings.swift", + "· opens in PullMark": "Sources/PullMark/Rendering/PageStrings.swift", + "· opens in browser": "Sources/PullMark/Rendering/PageStrings.swift" +} diff --git a/loc/de.lproj/Localizable.strings b/loc/de.lproj/Localizable.strings new file mode 100644 index 0000000..280dbd5 --- /dev/null +++ b/loc/de.lproj/Localizable.strings @@ -0,0 +1,610 @@ +// PullMark — German (de) app strings. Spec: docs/specs/app-i18n.md. +// Keys are the English source strings; see loc/_inventory.json. +// Register: du-form; macOS menu names per Apple (Ablage/Bearbeiten/ +// Darstellung/Gehe zu); sidebar section names (Open Files, Locations, +// Recents) stay English because they are not localizable in the app. + +" (none)" = " (ohne)"; +"%lld Markdown files changed" = "%lld Markdown-Dateien geändert"; +"%@ and pushed to origin." = "%@ und nach origin gepusht."; +"%@ approved" = "%@ hat genehmigt"; +"%@ approved %@" = "%@ hat %@ genehmigt"; +"%@ changed while you were annotating — nothing was saved. The current notes are shown now." = "%@ hat sich geändert, während du Notizen gemacht hast — nichts wurde gesichert. Zu sehen sind jetzt die aktuellen Notizen."; +"%@ changed while you were editing this block — nothing was saved. Re-open the block to edit the current version." = "%@ hat sich geändert, während du diesen Block bearbeitet hast — nichts wurde gesichert. Öffne den Block neu, um die aktuelle Fassung zu bearbeiten."; +"%@ does not exist at %@." = "%@ gibt es an %@ nicht."; +"%lld files" = "%lld Dateien"; +"%@ is reserved for %@." = "%@ ist für %@ reserviert."; +"%@ isn't available" = "%@ ist nicht verfügbar"; +"%@ isn't available on %@: " = "%@ ist auf %@ nicht verfügbar: "; +"%@ isn't in a git repository, so there's nothing to compare against." = "%@ liegt in keinem git-Repository, es gibt also nichts zum Vergleichen."; +"%@ isn't inside a git repository." = "%@ liegt in keinem Git-Repository."; +"%lld more reviewers" = "%lld weitere Reviewer"; +"%lld more…" = "%lld weitere…"; +"%lld not yet on GitHub" = "%lld noch nicht auf GitHub"; +"%lld of %lld" = "%lld von %lld"; +"%lld other files not shown" = "%lld weitere Dateien nicht gezeigt"; +"%@ requested changes" = "%@ hat Änderungen angefordert"; +"%@ requested changes %@" = "%@ hat %@ Änderungen angefordert"; +"%@ words · %lld min" = "%@ Wörter · %lld Min."; +"%@ — previewing; double-click to keep it with its repo" = "%@ — Vorschau; Doppelklick behält es bei seinem Repo"; +"%@, but the push failed: %@" = "%@, aber der Push ist fehlgeschlagen: %@"; +"1 Markdown file changed" = "1 Markdown-Datei geändert"; +"1 file" = "1 Datei"; +"1 more reviewer" = "1 weiterer Reviewer"; +"1 other file not shown" = "1 weitere Datei nicht gezeigt"; +"Abandon review" = "Review verwerfen"; +"Abandon this review?" = "Dieses Review verwerfen?"; +"About PullMark" = "Über PullMark"; +"Actual Size" = "Tatsächliche Größe"; +"Add Margin Note" = "Randnotiz hinzufügen"; +"Add a margin note on the block you're reading" = "Eine Randnotiz an dem Block anbringen, den du gerade liest"; +"Adds a Review discussion section under the PR description listing every thread, with code excerpts and links" = "Fügt unter der PR-Beschreibung einen Abschnitt „Review-Diskussion“ hinzu, der jeden Thread mit Code-Ausschnitten und Links auflistet"; +"Adds a pullmark command to /usr/local/bin so you can open files and folders from the shell" = "Legt einen pullmark-Befehl in /usr/local/bin an, damit du Dateien und Ordner aus der Shell öffnen kannst"; +"Adds the authoring tools — hover a block, ⌥⌘M; documents that already contain notes always show them either way" = "Schaltet die Werkzeuge zum Schreiben frei — über einen Block fahren, ⌥⌘M; Dokumente, die schon Notizen enthalten, zeigen sie so oder so"; +"After navigating between documents" = "Nach dem Navigieren zwischen Dokumenten"; +"All pending comments and the summary will be discarded, on GitHub too." = "Alle ausstehenden Kommentare und die Zusammenfassung werden verworfen, auch auf GitHub."; +"Alpha features are the frontier: their behavior and data formats may change incompatibly between versions, transitions may not be supported, and a feature may be removed entirely. Use them at your own risk." = "Alpha-Features sind Neuland: ihr Verhalten und ihre Datenformate können sich zwischen Versionen inkompatibel ändern, Übergänge werden vielleicht nicht unterstützt, und ein Feature kann ganz verschwinden. Nutzung auf eigene Gefahr."; +"Already use a git credential helper (macOS keychain, Git Credential Manager)? PullMark finds it automatically — Check Again will confirm." = "Du nutzt schon einen Git-Credential-Helper (macOS-Schlüsselbund, Git Credential Manager)? PullMark findet ihn automatisch — Erneut prüfen bestätigt das."; +"Anything Git can resolve works: a branch, a tag, or a commit. Leave the new side empty to compare the working file." = "Alles, was Git auflösen kann, geht: ein Branch, ein Tag oder ein Commit. Lass die neue Seite leer, um die Arbeitsdatei zu vergleichen."; +"Appearance" = "Erscheinungsbild"; +"Applies to the whole file, not a specific line" = "Gilt für die ganze Datei, nicht für eine bestimmte Zeile"; +"Approved" = "Genehmigt"; +"Ask on first click" = "Beim ersten Klick fragen"; +"Awaiting review from %@" = "Wartet auf das Review von %@"; +"Back" = "Zurück"; +"Blame" = "Blame"; +"Branch name" = "Branch-Name"; +"Branches" = "Branches"; +"Branches and worktrees" = "Branches und Worktrees"; +"Browse Repo Files" = "Repo-Dateien durchstöbern"; +"Browse Repo Files…" = "Repo-Dateien durchstöbern…"; +"Built-In Keys" = "Feste Tasten"; +"Cancel" = "Abbrechen"; +"Changes requested" = "Änderungen angefordert"; +"Check Again" = "Erneut prüfen"; +"Check for Updates" = "Nach Updates suchen"; +"Check for Updates…" = "Nach Updates suchen…"; +"Checking this Mac's credentials…" = "Zugangsdaten dieses Macs werden geprüft…"; +"Checking…" = "Wird geprüft…"; +"Checkout of %@/%@" = "Checkout von %@/%@"; +"Checks awaiting approval" = "Checks warten auf Genehmigung"; +"Checks failed" = "Checks fehlgeschlagen"; +"Checks passed" = "Checks bestanden"; +"Checks running" = "Checks laufen"; +"Choose the file to compare with — it becomes the old side." = "Wähl die Datei zum Vergleichen — sie wird die alte Seite."; +"Choose which items the toolbar shows, and their order" = "Wähle, welche Elemente die Symbolleiste zeigt, und in welcher Reihenfolge"; +"Clear Menu" = "Menü löschen"; +"Clear Recents" = "Recents leeren"; +"Click a shortcut, or select a row and press Return, then type the new keys. Press Delete to remove a shortcut, Esc to cancel." = "Klick ein Kürzel an oder wähl eine Zeile und drück Return, dann tipp die neuen Tasten. Löschen entfernt ein Kürzel, Escape bricht ab."; +"Click to type a zoom level" = "Klicken, um eine Zoomstufe einzutippen"; +"Clicking files in Locations:" = "Klick auf Dateien in Locations:"; +"Close" = "Schließen"; +"Close All" = "Alle schließen"; +"Close All Files" = "Alle Dateien schließen"; +"Command" = "Befehlstaste"; +"Comment" = "Kommentieren"; +"Comment on %@" = "Kommentar zu %@"; +"Comment on File" = "Datei kommentieren"; +"Comment on any local Markdown document the way you'd comment on a PR. Notes save into the file itself as `` comments — ordinary HTML comments that stay out of rendered Markdown, shown by PullMark as bubbles pinned to their spot, and written so agents can read and act on them. [How margin notes work](https://pullmark.app/docs/experimental/margin-notes/)" = "Kommentiere jedes lokale Markdown-Dokument so, wie du einen PR kommentierst. Notizen werden in der Datei selbst als ``-Kommentare gesichert — gewöhnliche HTML-Kommentare, die aus dem gerenderten Markdown herausbleiben, von PullMark als Blasen an ihrer Stelle gezeigt und so geschrieben, dass Agenten sie lesen und abarbeiten können. [Wie Randnotizen funktionieren](https://pullmark.app/docs/experimental/margin-notes/)"; +"Comment on any local Markdown document the way you'd comment on a PR. Notes save into the file itself as `` comments — ordinary HTML comments that stay out of rendered Markdown, shown by PullMark as bubbles pinned to their spot. Deleting a note is how it's resolved." = "Kommentiere jedes lokale Markdown-Dokument so, wie du einen PR kommentierst. Notizen werden in der Datei selbst als ``-Kommentare gesichert — gewöhnliche HTML-Kommentare, die aus dem gerenderten Markdown herausbleiben, von PullMark als Blasen an ihrer Stelle gezeigt. Eine Notiz zu löschen ist, wie sie aufgelöst wird."; +"Comment on this file as a whole, not a specific line" = "Die Datei als Ganzes kommentieren, nicht eine bestimmte Zeile"; +"Commit Changes" = "Änderungen committen"; +"Commit Changes…" = "Änderungen committen…"; +"Commit message" = "Commit-Nachricht"; +"Commit to %@" = "Commit in %@"; +"Commit to a new branch" = "Commit in einen neuen Branch"; +"Committed %lld files" = "%lld Dateien committet"; +"Committed %lld files on new branch “%@”" = "%lld Dateien im neuen Branch „%@“ committet"; +"Committed 1 file" = "1 Datei committet"; +"Committed 1 file on new branch “%@”" = "1 Datei im neuen Branch „%@“ committet"; +"Compare" = "Vergleichen"; +"Compare Revisions" = "Revisionen vergleichen"; +"Comparing " = "Vergleich "; +"Comparing with %@" = "Vergleich mit %@"; +"Connection status…" = "Verbindungsstatus…"; +"Content Width" = "Inhaltsbreite"; +"Content width" = "Inhaltsbreite"; +"Control" = "Steuerungstaste"; +"Copies instructions for CLAUDE.md / AGENTS.md — how to read margin notes and delete them as they're addressed" = "Kopiert Anweisungen für CLAUDE.md / AGENTS.md — wie Randnotizen zu lesen und beim Abarbeiten zu löschen sind"; +"Copies the Markdown source of the selected blocks (whole blocks — or the whole document when nothing is selected)" = "Kopiert den Markdown-Quelltext der ausgewählten Blöcke (ganze Blöcke — oder das ganze Dokument, wenn nichts ausgewählt ist)"; +"Copies “%@” to the clipboard" = "Kopiert „%@“ in die Zwischenablage"; +"Copy" = "Kopieren"; +"Copy %@ to the clipboard" = "%@ in die Zwischenablage kopieren"; +"Copy GitHub Link" = "GitHub-Link kopieren"; +"Copy GitHub links as:" = "GitHub-Links kopieren als:"; +"Copy Path" = "Pfad kopieren"; +"Copy as Markdown" = "Als Markdown kopieren"; +"Could not abandon the review: %@" = "Das Review konnte nicht verworfen werden: %@"; +"Could not create the PDF: %@" = "Das PDF konnte nicht erstellt werden: %@"; +"Could not delete the comment: %@" = "Der Kommentar konnte nicht gelöscht werden: %@"; +"Could not discard the pending comment: %@" = "Der ausstehende Kommentar konnte nicht verworfen werden: %@"; +"Could not post the comment — the PR session is no longer available. Your text was kept as a draft." = "Der Kommentar konnte nicht gesendet werden — die PR-Session ist nicht mehr verfügbar. Dein Text wurde als Entwurf behalten."; +"Could not post the comment: %@" = "Der Kommentar konnte nicht gesendet werden: %@"; +"Could not post the reply — the PR session is no longer available. Your text was kept as a draft." = "Die Antwort konnte nicht gesendet werden — die PR-Session ist nicht mehr verfügbar. Dein Text wurde als Entwurf behalten."; +"Could not post the reply: %@" = "Die Antwort konnte nicht gesendet werden: %@"; +"Could not read %@." = "%@ konnte nicht gelesen werden."; +"Could not read the rendered page." = "Die gerenderte Seite konnte nicht gelesen werden."; +"Could not refresh %@: %@" = "%@ konnte nicht aktualisiert werden: %@"; +"Could not save %@: %@" = "%@ konnte nicht gesichert werden: %@"; +"Could not save the edit: %@" = "Die Änderung konnte nicht gesichert werden: %@"; +"Could not update the reaction: %@" = "Die Reaktion konnte nicht aktualisiert werden: %@"; +"Could not upload %lld pending comments to GitHub — kept locally for retry. %@" = "%lld ausstehende Kommentare konnten nicht zu GitHub hochgeladen werden — lokal für einen neuen Versuch behalten. %@"; +"Could not upload 1 pending comment to GitHub — kept locally for retry. %@" = "1 ausstehender Kommentar konnte nicht zu GitHub hochgeladen werden — lokal für einen neuen Versuch behalten. %@"; +"Couldn't move PullMark" = "PullMark konnte nicht bewegt werden"; +"Couldn't open %@/%@#%lld: " = "Fehler beim Öffnen von %@/%@#%lld: "; +"Couldn't open %@: %@" = "%@ konnte nicht geöffnet werden: %@"; +"Couldn't open %@: %@. It may not exist at that ref, or it may be a private repository your GitHub credentials can't access." = "%@ konnte nicht geöffnet werden: %@. Vielleicht gibt es das an diesem Ref nicht, oder es ist ein privates Repository, an das deine GitHub-Zugangsdaten nicht herankommen."; +"Couldn't revert: %@" = "Zurücknehmen fehlgeschlagen: %@"; +"Couldn't save %@: " = "Fehler beim Sichern von %@: "; +"Couldn't save %@: %@" = "%@ konnte nicht gesichert werden: %@"; +"Current branch" = "Aktueller Branch"; +"Custom themes" = "Eigene Themes"; +"Customize Toolbar…" = "Symbolleiste anpassen…"; +"Dark" = "Dunkel"; +"Default diff layout:" = "Standard-Diff-Layout:"; +"Delete" = "Löschen"; +"Delete comment" = "Kommentar löschen"; +"Delete this comment?" = "Diesen Kommentar löschen?"; +"Determining how this copy was installed…" = "Wird ermittelt, wie diese Kopie installiert wurde…"; +"Discard the pending review and all its comments, on GitHub too" = "Das ausstehende Review und alle seine Kommentare verwerfen, auch auf GitHub"; +"Dismiss" = "Ausblenden"; +"Dismiss Preview" = "Vorschau verwerfen"; +"Dismiss — PullMark won't ask again unless you make it the default" = "Ausblenden — PullMark fragt erst wieder, wenn du es zur Standard-App machst"; +"Dismiss — this version won't be suggested again" = "Ausblenden — diese Version wird nicht wieder vorgeschlagen"; +"Don't ask again for this repository" = "Für dieses Repository nicht mehr fragen"; +"Done" = "Fertig"; +"Dotfiles and hidden folders in Locations — like ⇧⌘. in Finder" = "Dotfiles und versteckte Ordner in Locations — wie ⇧⌘. im Finder"; +"Dotfiles and hidden folders in Locations — ⇧⌘. toggles this too, like Finder" = "Dotfiles und versteckte Ordner in Locations — ⇧⌘. schaltet das auch um, wie im Finder"; +"Down Arrow" = "Pfeil nach unten"; +"Download" = "Herunterladen"; +"Downloads the update, verifies its signature, and installs it in place" = "Lädt das Update, prüft seine Signatur und installiert es an Ort und Stelle"; +"Drag PullMark to Applications in the Finder instead. (%@)" = "Zieh PullMark im Finder stattdessen nach „Programme“. (%@)"; +"Each block's starting source line, in the margin of rendered documents and diffs — hover a number for the block's full range. Rendered text wraps freely, so numbering is per block, not per visual line. The raw source view always shows its own line numbers." = "Die Startzeile jedes Blocks am Rand gerenderter Dokumente und Diffs — fahr über eine Nummer für den vollen Bereich des Blocks. Gerenderter Text bricht frei um, nummeriert wird also pro Block, nicht pro sichtbarer Zeile. Die Rohquell-Ansicht zeigt immer ihre eigenen Zeilennummern."; +"Edit" = "Bearbeiten"; +"Edit Mode" = "Bearbeitungsmodus"; +"Enable margin notes" = "Randnotizen aktivieren"; +"End" = "Ende"; +"Escape" = "Escape"; +"Every release's notes, up to the version you're running" = "Die Notes jedes Releases, bis zu deiner Version"; +"Exact commit (permalink)" = "Exakter Commit (Permalink)"; +"Expand All" = "Alle aufklappen"; +"Experimental" = "Experimentell"; +"Export as HTML…" = "Als HTML exportieren…"; +"Export as PDF…" = "Als PDF exportieren…"; +"Features land here before their design is settled. **Beta** features get a real compatibility effort between versions and are likely to graduate. **Alpha** features carry no guarantees: they may change incompatibly, their data formats may not migrate, and they may disappear entirely. [About experimental features](https://pullmark.app/docs/experimental/)" = "Features landen hier, bevor ihr Design fertig ist. **Beta**-Features bekommen zwischen Versionen echte Kompatibilitätsarbeit und graduieren wahrscheinlich. **Alpha**-Features geben keine Garantien: Sie können sich inkompatibel ändern, ihre Datenformate migrieren womöglich nicht, und sie können ganz verschwinden. [Über experimentelle Features](https://pullmark.app/docs/experimental/)"; +"Features land here before their design is settled. **Beta** features get a real compatibility effort between versions and are likely to graduate. [About experimental features](https://pullmark.app/docs/experimental/)" = "Features landen hier, bevor ihr Design fertig ist. **Beta**-Features bekommen zwischen Versionen echte Kompatibilitätsarbeit und graduieren wahrscheinlich. [Über experimentelle Features](https://pullmark.app/docs/experimental/)"; +"File" = "Ablage"; +"File Margin Note…" = "Randnotiz zur Datei…"; +"Fill in a known branch, tag, or commit" = "Trag einen bekannten Branch, Tag oder Commit ein"; +"Find Next" = "Weitersuchen"; +"Find Previous" = "Rückwärts suchen"; +"Find in Page" = "Auf der Seite suchen"; +"Find in page" = "Auf der Seite suchen"; +"Finish your review · %lld" = "Review abschließen · %lld"; +"Finish your review — 1 pending comment" = "Review abschließen — 1 ausstehender Kommentar"; +"Finish your review — %lld pending comments" = "Review abschließen — %lld ausstehende Kommentare"; +"Flip Diff Layout" = "Diff-Layout umschalten"; +"Forward" = "Vorwärts"; +"Forward Delete" = "Vorwärts löschen"; +"Full Width" = "Full Width"; +"General" = "Allgemein"; +"GitHub" = "GitHub"; +"GitHub API error (%lld): %@" = "GitHub-API-Fehler (%lld): %@"; +"GitHub Access" = "GitHub-Zugriff"; +"GitHub Markdown links:" = "GitHub-Markdown-Links:"; +"Go" = "Gehe zu"; +"Hide Hidden Files" = "Versteckte Dateien ausblenden"; +"Hide Margin Notes" = "Randnotizen ausblenden"; +"Hide Markdown Source" = "Markdown-Quelltext ausblenden"; +"Hide Outline" = "Gliederung ausblenden"; +"Hide Resolved Conversations" = "Aufgelöste Unterhaltungen ausblenden"; +"Hide review requests with no Markdown files — PullMark has nothing to show for them" = "Blendet Review-Anfragen ohne Markdown-Dateien aus — PullMark hat dazu nichts zu zeigen"; +"History" = "Historie"; +"Home" = "Pos1"; +"Hover any block for the note bubble (select text first to quote it), or press ⌥⌘M. Edit and delete from each bubble; deleting a note is how it's resolved. Open Files rows show a count chip while a document still carries notes, and View → Hide Margin Notes clears the page for clean reading." = "Fahr über einen beliebigen Block für die Notizblase (markier vorher Text, um ihn zu zitieren), oder drück ⌥⌘M. Bearbeiten und Löschen geht an jeder Blase; eine Notiz zu löschen ist, wie sie aufgelöst wird. Open-Files-Zeilen zeigen einen Chip mit der Zahl, solange ein Dokument noch Notizen trägt, und Darstellung → Randnotizen ausblenden räumt die Seite fürs saubere Lesen frei."; +"How far text may stretch before it wraps. Standard keeps the classic book-like measure; Wide fits more on screen and still caps the line length; Full Width gives the document the whole window — handy in full screen. Applies everywhere, live, and plays with any theme." = "Wie weit Text sich strecken darf, bevor er umbricht. Standard hält das klassische, buchähnliche Lesemaß; Wide bringt mehr auf den Schirm und deckelt die Zeilenlänge trotzdem; Full Width gibt dem Dokument das ganze Fenster — praktisch im Vollbild. Gilt überall, sofort, und verträgt sich mit jedem Theme."; +"How wide the rendered text column runs" = "Wie breit die gerenderte Textspalte läuft"; +"In a local document" = "In einem lokalen Dokument"; +"In a pull request" = "In einem Pull Request"; +"In a pull request file" = "In einer Pull-Request-Datei"; +"In a pull request file's Result view" = "In der Ergebnis-Ansicht einer Pull-Request-Datei"; +"Install pullmark Command…" = "pullmark-Befehl installieren…"; +"Jump to another Markdown file in this pull request" = "Zu einer anderen Markdown-Datei in diesem Pull Request springen"; +"Jump to any file, heading, or pull request" = "Zu einer Datei, Überschrift oder einem Pull Request springen"; +"Jump to the GitHub connection section" = "Zum Abschnitt GitHub-Verbindung springen"; +"Keep" = "Behalten"; +"Keep Open" = "Geöffnet lassen"; +"Keep Using" = "Weiter benutzen"; +"Keyboard" = "Tastatur"; +"Large repo — not all files shown" = "Großes Repo — nicht alle Dateien gezeigt"; +"Last seen at %@. " = "Zuletzt gesehen unter %@. "; +"Layout" = "Layout"; +"Left Arrow" = "Pfeil nach links"; +"Light" = "Hell"; +"Light, Dark, or match the system — the window and every rendered page follow, and each theme brings its own light and dark looks." = "Hell, Dunkel oder dem System folgen — das Fenster und jede gerenderte Seite ziehen mit, und jedes Theme bringt seinen eigenen hellen und dunklen Look mit."; +"Line %lld (new)" = "Zeile %lld (neu)"; +"Line %lld (old)" = "Zeile %lld (alt)"; +"Line numbers" = "Zeilennummern"; +"Loading repo files…" = "Repo-Dateien werden geladen…"; +"Locations" = "Locations"; +"Make Default Again" = "Wieder zum Standard machen"; +"Make PullMark the Default" = "PullMark zum Standard machen"; +"Make the document bigger" = "Das Dokument größer machen"; +"Make the document bigger — text, images, and the content column scale together" = "Das Dokument größer machen — Text, Bilder und die Inhaltsspalte skalieren zusammen"; +"Make the document smaller" = "Das Dokument kleiner machen"; +"Make the page writable — then click any block" = "Die Seite beschreibbar machen — dann einen beliebigen Block anklicken"; +"Make this choice the default for GitHub Markdown links" = "Diese Wahl zum Standard für GitHub-Markdown-Links machen"; +"Margin Notes" = "Randnotizen"; +"Margin notes are experimental (beta): the design may still shift between versions, and Settings → Experimental turns them off any time. [How margin notes work](https://pullmark.app/docs/experimental/margin-notes/)" = "Randnotizen sind experimentell (beta): Das Design kann sich zwischen Versionen noch verschieben, und Einstellungen → Experimentell schaltet sie jederzeit ab. [Wie Randnotizen funktionieren](https://pullmark.app/docs/experimental/margin-notes/)"; +"Margin notes are hidden — choose View → Show Margin Notes first." = "Randnotizen sind ausgeblendet — wähl zuerst Darstellung → Randnotizen einblenden."; +"Margin notes are off — turn them back on in Settings → Experimental." = "Randnotizen sind aus — schalte sie in Einstellungen → Experimentell wieder ein."; +"Margin notes are off — turn them on in Settings → Experimental." = "Randnotizen sind aus — schalte sie ein in Einstellungen → Experimentell."; +"Margin-note bubbles ( comments) in rendered documents" = "Notizblasen (-Kommentare) in gerenderten Dokumenten"; +"Markdown files open in PullMark" = "Markdown-Dateien öffnen sich in PullMark"; +"Mission Control" = "Mission Control"; +"Move PullMark to your Applications folder?" = "PullMark in den Ordner „Programme“ bewegen?"; +"Move to Applications" = "Nach „Programme“ bewegen"; +"Move to Trash" = "In den Papierkorb legen"; +"Next File" = "Nächste Datei"; +"Next Markdown file in this pull request" = "Nächste Markdown-Datei in diesem Pull Request"; +"Next match" = "Nächster Treffer"; +"No Markdown files found in %@." = "Keine Markdown-Dateien in %@ gefunden."; +"No changes to commit." = "Keine Änderungen zum Committen."; +"No headings" = "Keine Überschriften"; +"None" = "Ohne"; +"Not Now" = "Jetzt nicht"; +"Not a Homebrew user? [Download the CLI from cli.github.com](https://cli.github.com), then sign in the same way." = "Kein Homebrew? [Lad die CLI von cli.github.com](https://cli.github.com) und melde dich genauso an."; +"Not available in this build" = "In diesem Build nicht verfügbar"; +"Not connected" = "Nicht verbunden"; +"Not connected to GitHub — private repositories and reviewing are unavailable." = "Nicht mit GitHub verbunden — private Repositories und Reviewen sind nicht verfügbar."; +"Notes are written so agents can read and act on them. Paste the snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in this file\" becomes a complete handoff." = "Notizen sind so geschrieben, dass Agenten sie lesen und abarbeiten können. Füg den Schnipsel in die Anweisungsdatei deines Agenten ein (CLAUDE.md, AGENTS.md, …) und „arbeite die Randnotizen in dieser Datei ab“ wird zur kompletten Übergabe."; +"OK" = "OK"; +"Off shows a quiet banner instead — the notes stay one click away" = "Aus zeigt stattdessen ein leises Banner — die Notizen bleiben einen Klick entfernt"; +"Only requests that change Markdown" = "Nur Anfragen, die Markdown ändern"; +"Open" = "Öffnen"; +"Open Branch Separately" = "Branch separat öffnen"; +"Open File or Folder" = "Datei oder Ordner öffnen"; +"Open Files" = "Open Files"; +"Open File…" = "Datei öffnen…"; +"Open Folder…" = "Ordner öffnen…"; +"Open Fully" = "Ganz öffnen"; +"Open GitHub Markdown links in PullMark?" = "GitHub-Markdown-Links in PullMark öffnen?"; +"Open Markdown files" = "Markdown-Dateien öffnen"; +"Open Markdown files or a folder containing them" = "Markdown-Dateien oder einen Ordner damit öffnen"; +"Open Pull Request" = "Pull Request öffnen"; +"Open Pull Request…" = "Pull Request öffnen…"; +"Open Quickly — files, headings, pull requests, or paths" = "Schnell öffnen — Dateien, Überschriften, Pull Requests oder Pfade"; +"Open Quickly…" = "Schnell öffnen…"; +"Open Recent" = "Benutzte Dokumente"; +"Open Release Page" = "Release-Seite öffnen"; +"Open Themes Folder" = "Themes-Ordner öffnen"; +"Open Worktree" = "Worktree öffnen"; +"Open a GitHub pull request" = "Einen GitHub-Pull-Request öffnen"; +"Open a Markdown file or a GitHub pull request" = "Eine Markdown-Datei oder einen GitHub-Pull-Request öffnen"; +"Open a folder containing Markdown files" = "Einen Ordner mit Markdown-Dateien öffnen"; +"Open files, folders, and worktrees from the shell — [about the pullmark command](https://pullmark.app/docs/cli/)." = "Dateien, Ordner und Worktrees aus der Shell öffnen — [über den pullmark-Befehl](https://pullmark.app/docs/cli/)."; +"Open in Browser" = "Im Browser öffnen"; +"Open in PullMark" = "In PullMark öffnen"; +"Open local Markdown files or a folder" = "Lokale Markdown-Dateien oder einen Ordner öffnen"; +"Open on GitHub" = "Auf GitHub öffnen"; +"Open pull requests where your review is requested" = "Offene Pull Requests, bei denen dein Review angefragt ist"; +"Open the review — pending comments, summary, and verdict" = "Das Review öffnen — ausstehende Kommentare, Zusammenfassung und Urteil"; +"Opens the release page on GitHub" = "Öffnet die Release-Seite auf GitHub"; +"Opens the release page on GitHub to update manually" = "Öffnet die Release-Seite auf GitHub zum manuellen Updaten"; +"Open…" = "Öffnen…"; +"Option" = "Wahltaste"; +"Outdated" = "Veraltet"; +"Outdated — was line %lld" = "Veraltet — war Zeile %lld"; +"Outline" = "Gliederung"; +"PR Overview" = "PR-Übersicht"; +"Page Down" = "Bild ab"; +"Page Setup…" = "Papierformat…"; +"Page Up" = "Bild auf"; +"Paper size and orientation for printing" = "Papierformat und Ausrichtung fürs Drucken"; +"Paste the copied snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in the file\" becomes a complete handoff — the agent deletes each note as it resolves it, and you watch the bubbles disappear." = "Füg den kopierten Schnipsel in die Anweisungsdatei deines Agenten ein (CLAUDE.md, AGENTS.md, …) und „arbeite die Randnotizen in der Datei ab“ wird zur kompletten Übergabe — der Agent löscht jede Notiz, sobald er sie erledigt hat, und du siehst die Blasen verschwinden."; +"Pending review on GitHub" = "Ausstehendes Review auf GitHub"; +"Pinned to commit %@ — the ref's tip as of this session's last fetch." = "Auf Commit %@ festgesetzt — die Spitze des Refs beim letzten Abruf dieser Session."; +"Posts immediately — file comments can't join a pending review." = "Wird sofort gesendet — Dateikommentare können nicht Teil eines ausstehenden Reviews sein."; +"Preview First" = "Erst Vorschau"; +"Preview First shows a file with one click without keeping it — one italicized entry (in Open Files, or under its GitHub repo) that the next preview replaces. Double-click a file, or just start editing, to keep it open. Open Fully keeps every file you click." = "Erst Vorschau zeigt eine Datei mit einem Klick, ohne sie zu behalten — ein kursiver Eintrag (in Open Files oder unter seinem GitHub-Repository), den die nächste Vorschau ersetzt. Doppelklick auf eine Datei, oder fang einfach an zu tippen, und sie bleibt offen. Ganz öffnen behält jede Datei, die du anklickst."; +"Previous File" = "Vorherige Datei"; +"Previous Markdown file in this pull request" = "Vorherige Markdown-Datei in diesem Pull Request"; +"Previous match" = "Vorheriger Treffer"; +"Print the rendered document" = "Das gerenderte Dokument drucken"; +"Print…" = "Drucken…"; +"Private repositories, commenting, and reviewing are ready." = "Private Repositories, Kommentieren und Reviewen sind bereit."; +"Pull Requests" = "Pull Requests"; +"PullMark %@ is available." = "PullMark %@ ist verfügbar."; +"PullMark Website" = "PullMark-Website"; +"PullMark borrows the GitHub credentials your own tools already have — the GitHub CLI or a git credential helper. It has no login of its own, stores nothing, and never sees a password." = "PullMark leiht sich die GitHub-Zugangsdaten, die deine eigenen Tools längst haben — die GitHub CLI oder einen Git-Credential-Helper. Es hat kein eigenes Login, legt nichts ab und sieht nie ein Passwort."; +"PullMark borrows the credentials your own tools already have — the GitHub CLI or a git credential helper. It has no login of its own, stores nothing, and never sees a password. [About GitHub access](https://pullmark.app/docs/troubleshooting/#github-access)" = "PullMark leiht sich die Zugangsdaten, die deine eigenen Tools längst haben — die GitHub CLI oder einen Git-Credential-Helper. Es hat kein eigenes Login, legt nichts ab und sieht nie ein Passwort. [Über den GitHub-Zugriff](https://pullmark.app/docs/troubleshooting/#github-access)"; +"PullMark can fetch this file and render it in-app, or send it to your browser. Hold ⌘ while clicking a link for the other behavior; the default lives in Settings → General." = "PullMark kann diese Datei holen und in der App rendern, oder sie an deinen Browser geben. Halt ⌘ beim Klick auf einen Link für das andere Verhalten; der Standard steht in Einstellungen → Allgemein."; +"PullMark is in demo mode — network access is disabled." = "PullMark ist im Demo-Modus — der Netzwerkzugriff ist deaktiviert."; +"PullMark is installed — the disk image is no longer needed. This ejects it and moves “%@” to the Trash." = "PullMark ist installiert — das Disk-Image wird nicht mehr gebraucht. Das wirft es aus und legt „%@“ in den Papierkorb."; +"PullMark is no longer your default Markdown app." = "PullMark ist nicht mehr deine Standard-App für Markdown."; +"PullMark is running from its disk image. Moving it to Applications installs it properly and enables one-click updates." = "PullMark läuft von seinem Disk-Image. Nach „Programme“ bewegt wird es richtig installiert, und Updates gehen mit einem Klick."; +"Push to origin after committing" = "Nach dem Committen nach origin pushen"; +"Quick Look previews:" = "Quick-Look-Vorschauen:"; +"Raw Source" = "Rohquelltext"; +"Re-read credentials from the GitHub CLI and git credential helpers" = "Zugangsdaten aus der GitHub CLI und den Git-Credential-Helpern neu lesen"; +"Re-read credentials from the GitHub CLI and git credential helpers — after gh auth login, this connects without relaunching" = "Zugangsdaten aus der GitHub CLI und den Git-Credential-Helpern neu lesen — nach gh auth login verbindet das ohne Neustart"; +"Re-read this file from disk" = "Diese Datei neu von der Platte lesen"; +"Reaction state unavailable — try refreshing the PR." = "Reaktionsstatus nicht verfügbar — aktualisier den PR."; +"Reading" = "Lesen"; +"Recents" = "Recents"; +"Redo" = "Wiederholen"; +"Refresh" = "Aktualisieren"; +"Refresh Folder" = "Ordner aktualisieren"; +"Release Notes" = "Release Notes"; +"Release notes couldn't be loaded — they're also at github.com/jedijashwa/pullmark/releases." = "Die Release Notes konnten nicht geladen werden — sie stehen auch auf github.com/jedijashwa/pullmark/releases."; +"Reload" = "Neu laden"; +"Reload Document" = "Dokument neu laden"; +"Remember my selection" = "Meine Auswahl merken"; +"Remote Branches" = "Remote-Branches"; +"Remove from Recents" = "Aus Recents entfernen"; +"Remove from Sidebar" = "Aus der Seitenleiste entfernen"; +"Remove the PullMark disk image?" = "Das PullMark-Disk-Image entfernen?"; +"Rendered" = "Gerendert"; +"Rendered Diff" = "Gerendertes Diff"; +"Reopen what was in the sidebar when PullMark last quit" = "Öffnet wieder, was beim letzten Beenden in der Seitenleiste stand"; +"Reopening…" = "Wird wieder geöffnet…"; +"Report a Bug…" = "Fehler melden…"; +"Report an Issue…" = "Problem melden…"; +"Request a Feature…" = "Feature vorschlagen…"; +"Required" = "Erforderlich"; +"Reset the zoom to 100%" = "Den Zoom auf 100 % zurücksetzen"; +"Restore Defaults" = "Standards wiederherstellen"; +"Restore Defaults…" = "Standards wiederherstellen…"; +"Restore all keyboard shortcuts to their defaults?" = "Alle Tastaturkürzel auf die Standards zurücksetzen?"; +"Restore files and pull requests from the last session" = "Dateien und Pull Requests der letzten Session wiederherstellen"; +"Restore the default" = "Standard wiederherstellen"; +"Restore the file as it was before PullMark's last edit" = "Die Datei so wiederherstellen, wie sie vor PullMarks letzter Änderung war"; +"Result" = "Ergebnis"; +"Retry" = "Erneut versuchen"; +"Retry Upload" = "Upload erneut versuchen"; +"Return" = "Return"; +"Reveal in Finder" = "Im Finder zeigen"; +"Reveal in Location" = "In Location zeigen"; +"Reveal on GitHub" = "Auf GitHub zeigen"; +"Reveal resolved review conversations in the Result view" = "Aufgelöste Review-Unterhaltungen in der Ergebnis-Ansicht zeigen"; +"Revert Last Edit" = "Letzte Änderung zurücknehmen"; +"Reverted the last edit to %@." = "Letzte Änderung an %@ zurückgenommen."; +"Review Changes…" = "Änderungen reviewen…"; +"Review Requests" = "Review-Anfragen"; +"Review changes" = "Änderungen reviewen"; +"Review comments couldn't be loaded — existing threads may be missing." = "Review-Kommentare konnten nicht geladen werden — bestehende Threads fehlen womöglich."; +"Review requested from %@" = "Review von %@ angefragt"; +"Review required" = "Review erforderlich"; +"Review submitted." = "Review abgeschickt."; +"Review summary (optional)" = "Review-Zusammenfassung (optional)"; +"Review verdict" = "Review-Urteil"; +"Reviewing" = "Reviewen"; +"Right Arrow" = "Pfeil nach rechts"; +"Runs “%@” and relaunches PullMark" = "Führt „%@“ aus und startet PullMark neu"; +"Save the rendered document as a PDF" = "Das gerenderte Dokument als PDF sichern"; +"Save the rendered document as a self-contained HTML file" = "Das gerenderte Dokument als eigenständige HTML-Datei sichern"; +"Saved as a pending review — visible only to you until you submit" = "Als ausstehendes Review gesichert — nur für dich sichtbar, bis du abschickst"; +"Search All Files…" = "Alle Dateien durchsuchen…"; +"Search all files" = "Alle Dateien durchsuchen"; +"See if something even newer is available" = "Nachsehen, ob es noch etwas Neueres gibt"; +"Set Up GitHub Access…" = "GitHub-Zugriff einrichten…"; +"Set Up…" = "Einrichten…"; +"Set up the GitHub CLI" = "Die GitHub CLI einrichten"; +"Share" = "Teilen"; +"Shift" = "Umschalttaste"; +"Show" = "Zeigen"; +"Show Alpha Features" = "Alpha-Features zeigen"; +"Show Hidden Files" = "Versteckte Dateien einblenden"; +"Show Margin Notes" = "Randnotizen einblenden"; +"Show Markdown Source" = "Markdown-Quelltext einblenden"; +"Show Outline" = "Gliederung einblenden"; +"Show Resolved Conversations" = "Aufgelöste Unterhaltungen einblenden"; +"Show What's New after an update" = "Nach einem Update Neuerungen zeigen"; +"Show alpha features" = "Alpha-Features zeigen"; +"Show alpha features?" = "Alpha-Features zeigen?"; +"Show hidden files" = "Versteckte Dateien zeigen"; +"Show or hide the document outline" = "Die Gliederung des Dokuments ein- oder ausblenden"; +"Show review discussion on the PR overview" = "Review-Diskussion in der PR-Übersicht zeigen"; +"Show review requests in the sidebar" = "Review-Anfragen in der Seitenleiste zeigen"; +"Show the next document" = "Das nächste Dokument zeigen"; +"Show the previous document" = "Das vorherige Dokument zeigen"; +"Show the raw Markdown behind the rendered document" = "Das rohe Markdown hinter dem gerenderten Dokument zeigen"; +"Show who last changed each block (git blame)" = "Zeigt, wer jeden Block zuletzt geändert hat (git blame)"; +"Show/Hide Hidden Files" = "Versteckte Dateien ein-/ausblenden"; +"Show/Hide Margin Notes" = "Randnotizen ein-/ausblenden"; +"Show/Hide Markdown Source" = "Markdown-Quelltext ein-/ausblenden"; +"Show/Hide Outline" = "Gliederung ein-/ausblenden"; +"Show/Hide Resolved Conversations" = "Aufgelöste Unterhaltungen ein-/ausblenden"; +"Showing 500 of %lld changed files — Markdown files are preselected either way." = "500 von %lld geänderten Dateien gezeigt — Markdown-Dateien sind so oder so vorausgewählt."; +"Showing the first %lld Markdown files" = "Die ersten %lld Markdown-Dateien werden gezeigt"; +"Sign in to GitHub" = "Bei GitHub anmelden"; +"Sign notes as:" = "Notizen signieren als:"; +"Something went wrong" = "Etwas ist schiefgelaufen"; +"Source" = "Quelltext"; +"Source Diff" = "Quelltext-Diff"; +"Space" = "Leertaste"; +"Spotlight" = "Spotlight"; +"Stage and commit changes in this file's repository" = "Änderungen im Repository dieser Datei stagen und committen"; +"Standard" = "Standard"; +"Submit review" = "Review abschicken"; +"Submit the review with the selected verdict (⌘↩)" = "Das Review mit dem gewählten Urteil abschicken (⌘↩)"; +"Support PullMark ❤️" = "PullMark unterstützen ❤️"; +"Switch between light, dark, and system appearance" = "Zwischen hellem, dunklem und System-Erscheinungsbild wechseln"; +"Switch or Open Branch…" = "Branch wechseln oder öffnen…"; +"System" = "System"; +"Tab" = "Tabulator"; +"Tags" = "Tags"; +"Teach your agent" = "Deinen Agenten anlernen"; +"Tell your agent" = "Sag es deinem Agenten"; +"Temporarily show the raw Markdown behind the rendered document" = "Vorübergehend das rohe Markdown hinter dem gerenderten Dokument zeigen"; +"That link needs a different version of PullMark" = "Dieser Link braucht eine andere Version von PullMark"; +"The @name your notes carry — empty uses your GitHub login, or this Mac's account name when signed out" = "Der @name an deinen Notizen — leer nimmt dein GitHub-Login, oder den Account-Namen dieses Macs, wenn du abgemeldet bist"; +"The GitHub CLI is installed but signed out. Run this in your terminal — it opens a browser to sign in:" = "Die GitHub CLI ist installiert, aber abgemeldet. Führ das im Terminal aus — es öffnet einen Browser zum Anmelden:"; +"The PR session is no longer available — the draft could not be saved to disk." = "Die PR-Session ist nicht mehr verfügbar — der Entwurf konnte nicht auf die Festplatte gesichert werden."; +"The comment will be removed from GitHub. Replies from others will stay." = "Der Kommentar wird von GitHub entfernt. Antworten von anderen bleiben."; +"The document's headings, in a sidebar" = "Die Überschriften des Dokuments, in einer Seitenleiste"; +"The pull request overview (%@ #%lld)" = "Die Pull-Request-Übersicht (%@ #%lld)"; +"The pullmark command is installed" = "Der pullmark-Befehl ist installiert"; +"Theme" = "Theme"; +"Themes restyle rendered Markdown and diffs, and follow the Light/Dark appearance. Drop .css files into the Themes folder to add your own — they apply on top of the GitHub look. Quick Look previews follow your theme too (custom themes fall back to their GitHub base there)." = "Themes gestalten gerendertes Markdown und Diffs um und folgen der Hell/Dunkel-Einstellung. Leg .css-Dateien in den Themes-Ordner, um eigene hinzuzufügen — sie legen sich über den GitHub-Look. Quick-Look-Vorschauen folgen deinem Theme auch (eigene Themes fallen dort auf ihre GitHub-Basis zurück)."; +"These keys are fixed and can't be changed." = "Diese Tasten sind fest und lassen sich nicht ändern."; +"This comment is still syncing with GitHub — try discarding it again in a moment." = "Dieser Kommentar synchronisiert noch mit GitHub — versuch es gleich noch einmal zu verwerfen."; +"This folder has more Markdown files than PullMark scans — open a subfolder as its own Location to see the rest" = "Dieser Ordner hat mehr Markdown-Dateien, als PullMark scannt — öffne einen Unterordner als eigene Location, um den Rest zu sehen"; +"This pull request was updated on GitHub." = "Dieser Pull Request wurde auf GitHub aktualisiert."; +"This repository has no GitHub remote." = "Dieses Repository hat kein GitHub-Remote."; +"This version (%@) doesn't know %@ — it may point at a feature from a newer release, or one that has moved. Checking for updates usually resolves it." = "Diese Version (%@) kennt %@ nicht — es zeigt vielleicht auf ein Feature aus einer neueren Version oder auf eines, das umgezogen ist. Nach Updates suchen löst das meistens."; +"Thread state unavailable — try refreshing the PR." = "Thread-Status nicht verfügbar — aktualisier den PR."; +"Turn Off" = "Ausschalten"; +"Up Arrow" = "Pfeil nach oben"; +"Update Now" = "Jetzt updaten"; +"Update failed: %@" = "Update fehlgeschlagen: %@"; +"Updated to PullMark %@." = "Auf PullMark %@ aktualisiert."; +"Updates" = "Updates"; +"Upload the remaining comments into your pending review on GitHub" = "Die restlichen Kommentare in dein ausstehendes Review auf GitHub hochladen"; +"Use Anyway" = "Trotzdem nehmen"; +"Using it" = "Benutzung"; +"View" = "Darstellung"; +"View All Release Notes" = "Alle Release Notes ansehen"; +"View as List" = "Als Liste"; +"View as Tree" = "Als Baum"; +"Viewing signed out — commenting and reviewing are unavailable" = "Abgemeldet gelesen — Kommentieren und Reviewen sind nicht verfügbar"; +"Walk through connecting PullMark to GitHub" = "Schritt für Schritt PullMark mit GitHub verbinden"; +"What Copy GitHub Link copies — hold ⌥ in the menu for the other flavor" = "Was „GitHub-Link kopieren“ kopiert — halt ⌥ im Menü für die andere Variante"; +"What changed since the last commit, rendered like a PR diff — the toolbar's Compare button offers older revisions and branches" = "Was sich seit dem letzten Commit geändert hat, gerendert wie ein PR-Diff — der Knopf „Vergleichen“ in der Symbolleiste bietet ältere Revisionen und Branches"; +"What clicking a link to a Markdown file on GitHub does — hold ⌘ while clicking for the other behavior" = "Was ein Klick auf einen Link zu einer Markdown-Datei auf GitHub tut — halt ⌘ beim Klicken für das andere Verhalten"; +"What pressing space in Finder shows for Markdown files" = "Was die Leertaste im Finder für Markdown-Dateien zeigt"; +"What's New" = "Neuerungen"; +"While the find bar is open" = "Solange die Suchleiste offen ist"; +"Whole file" = "Ganze Datei"; +"Wide" = "Wide"; +"With a folder selected" = "Mit einem ausgewählten Ordner"; +"With a local file or folder in a GitHub repository selected" = "Mit einer lokalen Datei oder einem Ordner aus einem GitHub-Repository ausgewählt"; +"With a local file or folder selected" = "Mit einer lokalen Datei oder einem Ordner ausgewählt"; +"With files in Open Files" = "Mit Dateien in Open Files"; +"Works with private repos using your existing gh or git credentials." = "Funktioniert mit privaten Repos über deine vorhandenen gh- oder git-Zugangsdaten."; +"You're on %@." = "Du bist auf %@."; +"Your custom shortcuts will be removed. This can't be undone." = "Deine eigenen Kürzel werden entfernt. Das lässt sich nicht widerrufen."; +"Zoom In" = "Einzoomen"; +"Zoom Out" = "Auszoomen"; +"and %lld more" = "und %lld weitere"; +"confirming sheets" = "das Bestätigen von Sheets"; +"cycling windows" = "das Durchschalten von Fenstern"; +"dismissing sheets" = "das Schließen von Sheets"; +"https://github.com/owner/repo/pull/123 or owner/repo#123" = "https://github.com/owner/repo/pull/123 oder owner/repo#123"; +"just now" = "gerade eben"; +"on base branch" = "auf dem Base-Branch"; +"opened by %@" = "erstellt von %@"; +"the Help menu" = "das Hilfemenü"; +"the app switcher" = "den App-Umschalter"; +" · was {r}" = " · war {r}"; +"(empty)" = "(leer)"; +"Add a margin note" = "Randnotiz hinzufügen"; +"Add a suggestion" = "Vorschlag hinzufügen"; +"Add reaction" = "Reaktion hinzufügen"; +"Add single comment" = "Einzelkommentar senden"; +"Click the gutter for history" = "Klick auf den Rand für die Historie"; +"Comment actions" = "Kommentar-Aktionen"; +"Comment on line {n}" = "Zeile {n} kommentieren"; +"Comment on lines {a}–{b}" = "Zeilen {a}–{b} kommentieren"; +"Comment on new line {n}" = "Neue Zeile {n} kommentieren"; +"Comment on new line {n} — shift-click extends the range" = "Neue Zeile {n} kommentieren — Shift-Klick erweitert den Bereich"; +"Comment on new lines {a}–{b}" = "Neue Zeilen {a}–{b} kommentieren"; +"Comment on old line {n} — shift-click extends the range" = "Alte Zeile {n} kommentieren — Shift-Klick erweitert den Bereich"; +"Comment on old lines {a}–{b}" = "Alte Zeilen {a}–{b} kommentieren"; +"Comment on the pull request conversation" = "In der Unterhaltung des Pull Requests kommentieren"; +"Conversation" = "Unterhaltung"; +"Copy full SHA" = "Vollen SHA kopieren"; +"Couldn't load this image from GitHub · " = "Dieses Bild konnte nicht von GitHub geladen werden · "; +"File comments" = "Dateikommentare"; +"Front matter" = "Front Matter"; +"Hide {n} resolved conversation" = "{n} aufgelöste Unterhaltung ausblenden"; +"Hide {n} resolved conversations" = "{n} aufgelöste Unterhaltungen ausblenden"; +"Insert a ```suggestion block pre-filled with the current lines" = "Fügt einen ```suggestion-Block ein, vorbefüllt mit den aktuellen Zeilen"; +"LEFT" = "LEFT"; +"Leave a comment" = "Kommentar schreiben"; +"Line {n}" = "Zeile {n}"; +"Lines {a}–{b}" = "Zeilen {a}–{b}"; +"Moved from line {n} — content unchanged" = "Verschoben von Zeile {n} — Inhalt unverändert"; +"Not synced" = "Nicht synchronisiert"; +"Old line {n}" = "Alte Zeile {n}"; +"Old lines {a}–{b}" = "Alte Zeilen {a}–{b}"; +"Open this conversation on GitHub — PullMark doesn't render this file" = "Diese Unterhaltung auf GitHub öffnen — PullMark rendert diese Datei nicht"; +"Open {path} and jump to this conversation" = "{path} öffnen und zu dieser Unterhaltung springen"; +"Outdated review comments" = "Veraltete Review-Kommentare"; +"Pending" = "Ausstehend"; +"Pending comment — click to expand" = "Ausstehender Kommentar — klicken zum Aufklappen"; +"Pending comments — click to expand" = "Ausstehende Kommentare — klicken zum Aufklappen"; +"Post to the PR conversation right away — not part of a review (⌘↩)" = "Sofort in die PR-Unterhaltung senden — nicht Teil eines Reviews (⌘↩)"; +"Reply" = "Antworten"; +"Reply to this thread (⌘↩)" = "Auf diesen Thread antworten (⌘↩)"; +"Resolve" = "Auflösen"; +"Resolved" = "Aufgelöst"; +"Review discussion" = "Review-Diskussion"; +"Save" = "Sichern"; +"Save your edit (⌘↩)" = "Deine Änderung sichern (⌘↩)"; +"Show on GitHub" = "Auf GitHub zeigen"; +"Show {n} resolved conversation" = "{n} aufgelöste Unterhaltung einblenden"; +"Show {n} resolved conversations" = "{n} aufgelöste Unterhaltungen einblenden"; +"Suggested change" = "Vorgeschlagene Änderung"; +"Suggestions can only target new-file lines — GitHub applies them in place of the commented lines." = "Vorschläge können nur Zeilen der neuen Datei treffen — GitHub setzt sie anstelle der kommentierten Zeilen ein."; +"The conversation could not be loaded — retrying." = "Die Unterhaltung konnte nicht geladen werden — neuer Versuch."; +"The targeted lines aren't available to suggest an edit to." = "Für die anvisierten Zeilen lässt sich keine Änderung vorschlagen."; +"This block isn't part of the pull request's diff — GitHub can only attach comments to changed lines." = "Dieser Block ist nicht Teil des Diffs im Pull Request — GitHub kann Kommentare nur an geänderte Zeilen hängen."; +"This file is empty on both sides of the diff." = "Diese Datei ist auf beiden Seiten des Diffs leer."; +"Unresolve" = "Auflösung aufheben"; +"View commit on GitHub" = "Commit auf GitHub ansehen"; +"View in File" = "In der Datei ansehen"; +"Write a reply" = "Antwort schreiben"; +"Write at the end of the document" = "Am Ende des Dokuments schreiben"; +"all conversations resolved" = "alle Unterhaltungen aufgelöst"; +"approved these changes" = "hat diese Änderungen genehmigt"; +"bot" = "Bot"; +"copied" = "kopiert"; +"dismissed their review" = "hat das Review verworfen"; +"moved" = "verschoben"; +"requested changes" = "hat Änderungen angefordert"; +"reviewed" = "hat ein Review abgegeben"; +"whole document" = "ganzes Dokument"; +"{n} comment" = "{n} Kommentar"; +"{n} comments" = "{n} Kommentare"; +"{n} review" = "{n} Review"; +"{n} reviews" = "{n} Reviews"; +"{n} unresolved conversation" = "{n} unaufgelöste Unterhaltung"; +"{n} unresolved conversations" = "{n} unaufgelöste Unterhaltungen"; +" · edited" = " · bearbeitet"; +"· asks where to open" = "· fragt, wo geöffnet wird"; +"· opens in PullMark" = "· öffnet in PullMark"; +"· opens in browser" = "· öffnet im Browser"; +"{n} comment — click to expand" = "{n} Kommentar — zum Aufklappen klicken"; +"{n} comments — click to expand" = "{n} Kommentare — zum Aufklappen klicken"; +"Closed" = "Geschlossen"; +"Draft" = "Entwurf"; +"Merged" = "Zusammengeführt"; +"Unavailable" = "Nicht verfügbar"; +"View on GitHub" = "Auf GitHub anzeigen"; +"View all checks on GitHub" = "Alle Checks auf GitHub anzeigen"; +"%lld of %lld done" = "%lld von %lld fertig"; +"%lld of %lld failing" = "%lld von %lld fehlgeschlagen"; +"A clean margin, numbers on demand in Source" = "Ein ruhiger Rand, Nummern bei Bedarf in der Quelle"; +"A workflow is waiting for approval" = "Ein Workflow wartet auf Freigabe"; +"Added" = "Hinzugefügt"; +"Changed" = "Geändert"; +"Connected" = "Verbunden"; +"Copied" = "Kopiert"; +"Copy GitHub Branch Link" = "GitHub-Branch-Link kopieren"; +"Copy GitHub Permalink" = "GitHub-Permalink kopieren"; +"Deleted" = "Gelöscht"; +"Each block's source line in the margin" = "Die Quellzeile jedes Blocks am Rand"; +"GitHub CLI" = "GitHub CLI"; +"Hidden" = "Ausgeblendet"; +"Language" = "Sprache"; +"Language:" = "Sprache:"; +"Line numbers hidden" = "Zeilennummern ausgeblendet"; +"Line numbers shown" = "Zeilennummern eingeblendet"; +"Modified" = "Geändert"; +"Renamed" = "Umbenannt"; +"Shown" = "Eingeblendet"; +"Takes effect after PullMark relaunches." = "Gilt, sobald PullMark neu startet."; +"Untracked" = "Nicht versioniert"; +"git credential helper" = "git credential helper"; +"Relaunch Now" = "Jetzt neu starten"; diff --git a/loc/es.lproj/Localizable.strings b/loc/es.lproj/Localizable.strings new file mode 100644 index 0000000..110d348 --- /dev/null +++ b/loc/es.lproj/Localizable.strings @@ -0,0 +1,608 @@ +/* Spanish (es) — PullMark app strings. + Keys are the English source strings (spec: docs/specs/app-i18n.md). + Verified by scripts/check-strings.py. */ + +" (none)" = " (ninguno)"; +"%lld Markdown files changed" = "%lld archivos Markdown modificados"; +"%@ and pushed to origin." = "%@ y push a origin."; +"%@ approved" = "%@ aprobó"; +"%@ approved %@" = "%@ aprobó %@"; +"%@ changed while you were annotating — nothing was saved. The current notes are shown now." = "%@ cambió mientras estabas anotando — no se guardó nada. Ahora se muestran las notas actuales."; +"%@ changed while you were editing this block — nothing was saved. Re-open the block to edit the current version." = "%@ cambió mientras editabas este bloque — no se guardó nada. Vuelve a abrir el bloque para editar la versión actual."; +"%@ does not exist at %@." = "%@ no existe en %@."; +"%lld files" = "%lld archivos"; +"%@ is reserved for %@." = "%@ está reservado para %@."; +"%@ isn't available" = "%@ no está disponible"; +"%@ isn't available on %@: " = "%@ no está disponible en %@: "; +"%@ isn't in a git repository, so there's nothing to compare against." = "%@ no está en un repositorio git, así que no hay nada con lo que compararlo."; +"%@ isn't inside a git repository." = "%@ no está dentro de un repositorio git."; +"%lld more reviewers" = "%lld revisores más"; +"%lld more…" = "%lld más…"; +"%lld not yet on GitHub" = "%lld aún no están en GitHub"; +"%lld of %lld" = "%lld de %lld"; +"%lld other files not shown" = "%lld archivos más sin mostrar"; +"%@ requested changes" = "%@ solicitó cambios"; +"%@ requested changes %@" = "%@ solicitó cambios %@"; +"%@ words · %lld min" = "%@ palabras · %lld min"; +"%@ — previewing; double-click to keep it with its repo" = "%@ — vista previa; haz doble clic para conservarlo con su repo"; +"%@, but the push failed: %@" = "%@, pero el push falló: %@"; +"1 Markdown file changed" = "1 archivo Markdown modificado"; +"1 file" = "1 archivo"; +"1 more reviewer" = "1 revisor más"; +"1 other file not shown" = "1 archivo más sin mostrar"; +"Abandon review" = "Descartar la revisión"; +"Abandon this review?" = "¿Descartar esta revisión?"; +"About PullMark" = "Acerca de PullMark"; +"Actual Size" = "Tamaño real"; +"Add Margin Note" = "Añadir nota al margen"; +"Add a margin note on the block you're reading" = "Añade una nota al margen en el bloque que estás leyendo"; +"Adds a Review discussion section under the PR description listing every thread, with code excerpts and links" = "Añade una sección Discusión de la revisión bajo la descripción del PR con todos los hilos, sus fragmentos de código y sus enlaces"; +"Adds a pullmark command to /usr/local/bin so you can open files and folders from the shell" = "Añade un comando pullmark a /usr/local/bin para abrir archivos y carpetas desde la terminal"; +"Adds the authoring tools — hover a block, ⌥⌘M; documents that already contain notes always show them either way" = "Añade las herramientas de escritura — pasa el cursor por un bloque, ⌥⌘M; los documentos que ya contienen notas las muestran igualmente"; +"After navigating between documents" = "Después de navegar entre documentos"; +"All pending comments and the summary will be discarded, on GitHub too." = "Se descartarán todos los comentarios pendientes y el resumen, también en GitHub."; +"Alpha features are the frontier: their behavior and data formats may change incompatibly between versions, transitions may not be supported, and a feature may be removed entirely. Use them at your own risk." = "Las funciones alfa son la frontera: su comportamiento y sus formatos de datos pueden cambiar de forma incompatible entre versiones, puede que las transiciones no estén contempladas, y una función puede desaparecer del todo. Úsalas por tu cuenta y riesgo."; +"Already use a git credential helper (macOS keychain, Git Credential Manager)? PullMark finds it automatically — Check Again will confirm." = "¿Ya usas un ayudante de credenciales de git (llavero de macOS, Git Credential Manager)? PullMark lo encuentra automáticamente — Volver a comprobar te lo confirmará."; +"Anything Git can resolve works: a branch, a tag, or a commit. Leave the new side empty to compare the working file." = "Sirve cualquier cosa que Git sepa resolver: una rama, una etiqueta o un commit. Deja vacío el lado nuevo para comparar el archivo de trabajo."; +"Appearance" = "Apariencia"; +"Applies to the whole file, not a specific line" = "Se aplica a todo el archivo, no a una línea concreta"; +"Approved" = "Aprobado"; +"Ask on first click" = "Preguntar en el primer clic"; +"Awaiting review from %@" = "Esperando la revisión de %@"; +"Back" = "Atrás"; +"Blame" = "Blame"; +"Branch name" = "Nombre de la rama"; +"Branches" = "Ramas"; +"Branches and worktrees" = "Ramas y worktrees"; +"Browse Repo Files" = "Explorar los archivos del repo"; +"Browse Repo Files…" = "Explorar los archivos del repo…"; +"Built-In Keys" = "Teclas fijas"; +"Cancel" = "Cancelar"; +"Changes requested" = "Cambios solicitados"; +"Check Again" = "Volver a comprobar"; +"Check for Updates" = "Buscar actualizaciones"; +"Check for Updates…" = "Buscar actualizaciones…"; +"Checking this Mac's credentials…" = "Comprobando las credenciales de este Mac…"; +"Checking…" = "Comprobando…"; +"Checkout of %@/%@" = "Checkout de %@/%@"; +"Checks awaiting approval" = "Verificaciones pendientes de aprobación"; +"Checks failed" = "Verificaciones fallidas"; +"Checks passed" = "Verificaciones superadas"; +"Checks running" = "Verificaciones en curso"; +"Choose the file to compare with — it becomes the old side." = "Elige el archivo con el que comparar — será el lado antiguo."; +"Choose which items the toolbar shows, and their order" = "Elige qué elementos muestra la barra de herramientas y en qué orden"; +"Clear Menu" = "Vaciar menú"; +"Clear Recents" = "Vaciar recientes"; +"Click a shortcut, or select a row and press Return, then type the new keys. Press Delete to remove a shortcut, Esc to cancel." = "Haz clic en un atajo, o selecciona una fila y pulsa Retorno, y luego teclea las teclas nuevas. Pulsa Eliminar para quitar un atajo, Esc para cancelar."; +"Click to type a zoom level" = "Haz clic para escribir un nivel de zoom"; +"Clicking files in Locations:" = "Al hacer clic en archivos de Locations:"; +"Close" = "Cerrar"; +"Close All" = "Cerrar todo"; +"Close All Files" = "Cerrar todos los archivos"; +"Command" = "Comando"; +"Comment" = "Comentar"; +"Comment on %@" = "Comentar en %@"; +"Comment on File" = "Comentar el archivo"; +"Comment on any local Markdown document the way you'd comment on a PR. Notes save into the file itself as `` comments — ordinary HTML comments that stay out of rendered Markdown, shown by PullMark as bubbles pinned to their spot, and written so agents can read and act on them. [How margin notes work](https://pullmark.app/docs/experimental/margin-notes/)" = "Comenta cualquier documento Markdown local como comentarías un pull request. Las notas se guardan en el propio archivo como comentarios `` — comentarios HTML normales que no aparecen en el Markdown renderizado, que PullMark muestra como globos anclados a su sitio y escritos para que los agentes puedan leerlos y actuar sobre ellos. [Cómo funcionan las notas al margen](https://pullmark.app/docs/experimental/margin-notes/)"; +"Comment on any local Markdown document the way you'd comment on a PR. Notes save into the file itself as `` comments — ordinary HTML comments that stay out of rendered Markdown, shown by PullMark as bubbles pinned to their spot. Deleting a note is how it's resolved." = "Comenta cualquier documento Markdown local como comentarías un pull request. Las notas se guardan en el propio archivo como comentarios `` — comentarios HTML normales que no aparecen en el Markdown renderizado, que PullMark muestra como globos anclados a su sitio. Borrar una nota es la forma de darla por resuelta."; +"Comment on this file as a whole, not a specific line" = "Comenta este archivo entero, no una línea concreta"; +"Commit Changes" = "Hacer commit de los cambios"; +"Commit Changes…" = "Hacer commit de los cambios…"; +"Commit message" = "Mensaje del commit"; +"Commit to %@" = "Hacer commit en %@"; +"Commit to a new branch" = "Hacer commit en una rama nueva"; +"Committed %lld files" = "Se hizo commit de %lld archivos"; +"Committed %lld files on new branch “%@”" = "Se hizo commit de %lld archivos en la rama nueva “%@”"; +"Committed 1 file" = "Se hizo commit de 1 archivo"; +"Committed 1 file on new branch “%@”" = "Se hizo commit de 1 archivo en la rama nueva “%@”"; +"Compare" = "Comparar"; +"Compare Revisions" = "Comparar revisiones"; +"Comparing " = "Comparando "; +"Comparing with %@" = "Comparando con %@"; +"Connection status…" = "Estado de la conexión…"; +"Content Width" = "Ancho del contenido"; +"Content width" = "Ancho del contenido"; +"Control" = "Control"; +"Copies instructions for CLAUDE.md / AGENTS.md — how to read margin notes and delete them as they're addressed" = "Copia instrucciones para CLAUDE.md / AGENTS.md — cómo leer las notas al margen y borrarlas según se atienden"; +"Copies the Markdown source of the selected blocks (whole blocks — or the whole document when nothing is selected)" = "Copia el código Markdown de los bloques seleccionados (bloques enteros — o el documento entero si no hay nada seleccionado)"; +"Copies “%@” to the clipboard" = "Copia “%@” en el portapapeles"; +"Copy" = "Copiar"; +"Copy %@ to the clipboard" = "Copiar %@ en el portapapeles"; +"Copy GitHub Link" = "Copiar enlace de GitHub"; +"Copy GitHub links as:" = "Copiar los enlaces de GitHub como:"; +"Copy Path" = "Copiar ruta"; +"Copy as Markdown" = "Copiar como Markdown"; +"Could not abandon the review: %@" = "No se pudo descartar la revisión: %@"; +"Could not create the PDF: %@" = "No se pudo crear el PDF: %@"; +"Could not delete the comment: %@" = "No se pudo eliminar el comentario: %@"; +"Could not discard the pending comment: %@" = "No se pudo descartar el comentario pendiente: %@"; +"Could not post the comment — the PR session is no longer available. Your text was kept as a draft." = "No se pudo publicar el comentario — la sesión del PR ya no está disponible. Tu texto se guardó como borrador."; +"Could not post the comment: %@" = "No se pudo publicar el comentario: %@"; +"Could not post the reply — the PR session is no longer available. Your text was kept as a draft." = "No se pudo publicar la respuesta — la sesión del PR ya no está disponible. Tu texto se guardó como borrador."; +"Could not post the reply: %@" = "No se pudo publicar la respuesta: %@"; +"Could not read %@." = "No se pudo leer %@."; +"Could not read the rendered page." = "No se pudo leer la página renderizada."; +"Could not refresh %@: %@" = "No se pudo actualizar %@: %@"; +"Could not save %@: %@" = "No se pudo guardar %@: %@"; +"Could not save the edit: %@" = "No se pudo guardar la edición: %@"; +"Could not update the reaction: %@" = "No se pudo actualizar la reacción: %@"; +"Could not upload %lld pending comments to GitHub — kept locally for retry. %@" = "No se pudieron subir %lld comentarios pendientes a GitHub — se conservan en local para reintentarlo. %@"; +"Could not upload 1 pending comment to GitHub — kept locally for retry. %@" = "No se pudo subir 1 comentario pendiente a GitHub — se conserva en local para reintentarlo. %@"; +"Couldn't move PullMark" = "No se pudo mover PullMark"; +"Couldn't open %@/%@#%lld: " = "No se pudo abrir %@/%@#%lld: "; +"Couldn't open %@: %@" = "No se pudo abrir %@: %@"; +"Couldn't open %@: %@. It may not exist at that ref, or it may be a private repository your GitHub credentials can't access." = "No se pudo abrir %@: %@. Puede que no exista en esa ref, o que sea un repositorio privado al que tus credenciales de GitHub no tienen acceso."; +"Couldn't revert: %@" = "No se pudo revertir: %@"; +"Couldn't save %@: " = "No se pudo guardar %@: "; +"Couldn't save %@: %@" = "No se pudo guardar %@: %@"; +"Current branch" = "Rama actual"; +"Custom themes" = "Temas personalizados"; +"Customize Toolbar…" = "Personalizar barra de herramientas…"; +"Dark" = "Dark"; +"Default diff layout:" = "Disposición del diff por defecto:"; +"Delete" = "Eliminar"; +"Delete comment" = "Eliminar comentario"; +"Delete this comment?" = "¿Eliminar este comentario?"; +"Determining how this copy was installed…" = "Determinando cómo se instaló esta copia…"; +"Discard the pending review and all its comments, on GitHub too" = "Descarta la revisión pendiente y todos sus comentarios, también en GitHub"; +"Dismiss" = "Descartar"; +"Dismiss Preview" = "Descartar la vista previa"; +"Dismiss — PullMark won't ask again unless you make it the default" = "Descartar — PullMark no volverá a preguntar salvo que lo hagas la app por defecto"; +"Dismiss — this version won't be suggested again" = "Descartar — esta versión no se volverá a sugerir"; +"Don't ask again for this repository" = "No volver a preguntar para este repositorio"; +"Done" = "Listo"; +"Dotfiles and hidden folders in Locations — like ⇧⌘. in Finder" = "Los dotfiles y las carpetas ocultas en Locations — como ⇧⌘. en el Finder"; +"Dotfiles and hidden folders in Locations — ⇧⌘. toggles this too, like Finder" = "Los dotfiles y las carpetas ocultas en Locations — ⇧⌘. también lo alterna, como en el Finder"; +"Down Arrow" = "Flecha abajo"; +"Download" = "Descargar"; +"Downloads the update, verifies its signature, and installs it in place" = "Descarga la actualización, verifica su firma y la instala en el sitio"; +"Drag PullMark to Applications in the Finder instead. (%@)" = "Arrastra PullMark a Aplicaciones desde el Finder. (%@)"; +"Each block's starting source line, in the margin of rendered documents and diffs — hover a number for the block's full range. Rendered text wraps freely, so numbering is per block, not per visual line. The raw source view always shows its own line numbers." = "La línea de origen inicial de cada bloque, en el margen de los documentos renderizados y los diffs — pasa el cursor por un número para ver el rango completo del bloque. El texto renderizado fluye libre, así que la numeración es por bloque y no por línea visual. La vista de código fuente crudo siempre muestra sus propios números de línea."; +"Edit" = "Edición"; +"Edit Mode" = "Modo de edición"; +"Enable margin notes" = "Activar las notas al margen"; +"End" = "Fin"; +"Escape" = "Esc"; +"Every release's notes, up to the version you're running" = "Las notas de todas las versiones, hasta la que tienes en marcha"; +"Exact commit (permalink)" = "Commit exacto (enlace permanente)"; +"Expand All" = "Expandir todo"; +"Experimental" = "Experimental"; +"Export as HTML…" = "Exportar como HTML…"; +"Export as PDF…" = "Exportar como PDF…"; +"Features land here before their design is settled. **Beta** features get a real compatibility effort between versions and are likely to graduate. **Alpha** features carry no guarantees: they may change incompatibly, their data formats may not migrate, and they may disappear entirely. [About experimental features](https://pullmark.app/docs/experimental/)" = "Las funciones aterrizan aquí antes de que su diseño esté asentado. Las funciones **beta** reciben un empeño real de compatibilidad entre versiones y lo más probable es que se gradúen. Las funciones **alfa** no dan ninguna garantía: pueden cambiar de forma incompatible, sus formatos de datos pueden no migrar y pueden desaparecer del todo. [Sobre las funciones experimentales](https://pullmark.app/docs/experimental/)"; +"Features land here before their design is settled. **Beta** features get a real compatibility effort between versions and are likely to graduate. [About experimental features](https://pullmark.app/docs/experimental/)" = "Las funciones aterrizan aquí antes de que su diseño esté asentado. Las funciones **beta** reciben un empeño real de compatibilidad entre versiones y lo más probable es que se gradúen. [Sobre las funciones experimentales](https://pullmark.app/docs/experimental/)"; +"File" = "Archivo"; +"File Margin Note…" = "Nota al margen del archivo…"; +"Fill in a known branch, tag, or commit" = "Escribe una rama, una etiqueta o un commit conocidos"; +"Find Next" = "Buscar siguiente"; +"Find Previous" = "Buscar anterior"; +"Find in Page" = "Buscar en la página"; +"Find in page" = "Buscar en la página"; +"Finish your review · %lld" = "Terminar la revisión · %lld"; +"Finish your review — 1 pending comment" = "Terminar la revisión — 1 comentario pendiente"; +"Finish your review — %lld pending comments" = "Terminar la revisión — %lld comentarios pendientes"; +"Flip Diff Layout" = "Cambiar la disposición del diff"; +"Forward" = "Adelante"; +"Forward Delete" = "Eliminar hacia delante"; +"Full Width" = "Full Width"; +"General" = "General"; +"GitHub" = "GitHub"; +"GitHub API error (%lld): %@" = "Error de la API de GitHub (%lld): %@"; +"GitHub Access" = "Acceso a GitHub"; +"GitHub Markdown links:" = "Enlaces Markdown de GitHub:"; +"Go" = "Ir"; +"Hide Hidden Files" = "Ocultar los archivos ocultos"; +"Hide Margin Notes" = "Ocultar las notas al margen"; +"Hide Markdown Source" = "Ocultar el código Markdown"; +"Hide Outline" = "Ocultar el esquema"; +"Hide Resolved Conversations" = "Ocultar las conversaciones resueltas"; +"Hide review requests with no Markdown files — PullMark has nothing to show for them" = "Oculta las solicitudes de revisión sin archivos Markdown — PullMark no tiene nada que mostrar de ellas"; +"History" = "Historial"; +"Home" = "Inicio"; +"Hover any block for the note bubble (select text first to quote it), or press ⌥⌘M. Edit and delete from each bubble; deleting a note is how it's resolved. Open Files rows show a count chip while a document still carries notes, and View → Hide Margin Notes clears the page for clean reading." = "Pasa el cursor por cualquier bloque para ver el globo de nota (selecciona texto antes para citarlo), o pulsa ⌥⌘M. Edita y borra desde cada globo; borrar una nota es la forma de darla por resuelta. Las filas de Open Files llevan un chip con la cuenta mientras el documento aún cargue notas, y Visualización → Ocultar las notas al margen despeja la página para leer limpio."; +"How far text may stretch before it wraps. Standard keeps the classic book-like measure; Wide fits more on screen and still caps the line length; Full Width gives the document the whole window — handy in full screen. Applies everywhere, live, and plays with any theme." = "Hasta dónde puede estirarse el texto antes de saltar de línea. Standard mantiene la medida clásica de un libro; Wide encaja más en pantalla y sigue limitando el largo de línea; Full Width le da al documento toda la ventana — útil en pantalla completa. Se aplica en todas partes, en vivo, y se lleva bien con cualquier tema."; +"How wide the rendered text column runs" = "Cuánto se ensancha la columna de texto renderizado"; +"In a local document" = "En un documento local"; +"In a pull request" = "En un pull request"; +"In a pull request file" = "En un archivo de pull request"; +"In a pull request file's Result view" = "En la vista Resultado de un archivo de pull request"; +"Install pullmark Command…" = "Instalar el comando pullmark…"; +"Jump to another Markdown file in this pull request" = "Salta a otro archivo Markdown de este pull request"; +"Jump to any file, heading, or pull request" = "Salta a cualquier archivo, encabezado o pull request"; +"Jump to the GitHub connection section" = "Salta a la sección de conexión con GitHub"; +"Keep" = "Conservar"; +"Keep Open" = "Mantener abierto"; +"Keep Using" = "Seguir usándolas"; +"Keyboard" = "Teclado"; +"Large repo — not all files shown" = "Repo grande — no se muestran todos los archivos"; +"Last seen at %@. " = "Visto por última vez en %@. "; +"Layout" = "Disposición"; +"Left Arrow" = "Flecha izquierda"; +"Light" = "Light"; +"Light, Dark, or match the system — the window and every rendered page follow, and each theme brings its own light and dark looks." = "Light, Dark o seguir al sistema — la ventana y todas las páginas renderizadas lo siguen, y cada tema trae su propio aspecto claro y oscuro."; +"Line %lld (new)" = "Línea %lld (nueva)"; +"Line %lld (old)" = "Línea %lld (antigua)"; +"Line numbers" = "Números de línea"; +"Loading repo files…" = "Cargando los archivos del repo…"; +"Locations" = "Locations"; +"Make Default Again" = "Volver a hacerlo la app por defecto"; +"Make PullMark the Default" = "Hacer que PullMark sea la app por defecto"; +"Make the document bigger" = "Amplía el documento"; +"Make the document bigger — text, images, and the content column scale together" = "Amplía el documento — el texto, las imágenes y la columna de contenido escalan a la vez"; +"Make the document smaller" = "Reduce el documento"; +"Make the page writable — then click any block" = "Hace la página editable — luego haz clic en cualquier bloque"; +"Make this choice the default for GitHub Markdown links" = "Convierte esta elección en la opción por defecto para los enlaces Markdown de GitHub"; +"Margin Notes" = "Notas al margen"; +"Margin notes are experimental (beta): the design may still shift between versions, and Settings → Experimental turns them off any time. [How margin notes work](https://pullmark.app/docs/experimental/margin-notes/)" = "Las notas al margen son experimentales (beta): el diseño aún puede moverse entre versiones, y Ajustes → Experimental las desactiva cuando quieras. [Cómo funcionan las notas al margen](https://pullmark.app/docs/experimental/margin-notes/)"; +"Margin notes are hidden — choose View → Show Margin Notes first." = "Las notas al margen están ocultas — elige antes Visualización → Mostrar las notas al margen."; +"Margin notes are off — turn them back on in Settings → Experimental." = "Las notas al margen están desactivadas — vuelve a activarlas en Ajustes → Experimental."; +"Margin notes are off — turn them on in Settings → Experimental." = "Las notas al margen están desactivadas — actívalas en Ajustes → Experimental."; +"Margin-note bubbles ( comments) in rendered documents" = "Los globos de nota al margen (comentarios ) en los documentos renderizados"; +"Markdown files open in PullMark" = "Los archivos Markdown se abren en PullMark"; +"Mission Control" = "Mission Control"; +"Move PullMark to your Applications folder?" = "¿Mover PullMark a tu carpeta Aplicaciones?"; +"Move to Applications" = "Mover a Aplicaciones"; +"Move to Trash" = "Mover a la papelera"; +"Next File" = "Archivo siguiente"; +"Next Markdown file in this pull request" = "Siguiente archivo Markdown de este pull request"; +"Next match" = "Coincidencia siguiente"; +"No Markdown files found in %@." = "No se encontraron archivos Markdown en %@."; +"No changes to commit." = "No hay cambios para hacer commit."; +"No headings" = "Sin encabezados"; +"None" = "Ninguno"; +"Not Now" = "Ahora no"; +"Not a Homebrew user? [Download the CLI from cli.github.com](https://cli.github.com), then sign in the same way." = "¿No usas Homebrew? [Descarga la CLI desde cli.github.com](https://cli.github.com) y luego inicia sesión igual."; +"Not available in this build" = "No disponible en esta versión"; +"Not connected" = "No conectado"; +"Not connected to GitHub — private repositories and reviewing are unavailable." = "No hay conexión con GitHub — los repositorios privados y las revisiones no están disponibles."; +"Notes are written so agents can read and act on them. Paste the snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in this file\" becomes a complete handoff." = "Las notas están escritas para que los agentes puedan leerlas y actuar sobre ellas. Pega el fragmento en el archivo de instrucciones de tu agente (CLAUDE.md, AGENTS.md, …) y «atiende las notas al margen de este archivo» se convierte en un traspaso completo."; +"OK" = "OK"; +"Off shows a quiet banner instead — the notes stay one click away" = "Desactivado muestra un aviso discreto en su lugar — las notas quedan a un clic"; +"Only requests that change Markdown" = "Solo las solicitudes que cambian Markdown"; +"Open" = "Abrir"; +"Open Branch Separately" = "Abrir la rama por separado"; +"Open File or Folder" = "Abrir archivo o carpeta"; +"Open Files" = "Open Files"; +"Open File…" = "Abrir archivo…"; +"Open Folder…" = "Abrir carpeta…"; +"Open Fully" = "Abrir del todo"; +"Open GitHub Markdown links in PullMark?" = "¿Abrir en PullMark los enlaces Markdown de GitHub?"; +"Open Markdown files" = "Abre archivos Markdown"; +"Open Markdown files or a folder containing them" = "Abre archivos Markdown o una carpeta que los contenga"; +"Open Pull Request" = "Abrir pull request"; +"Open Pull Request…" = "Abrir pull request…"; +"Open Quickly — files, headings, pull requests, or paths" = "Apertura rápida — archivos, encabezados, pull requests o rutas"; +"Open Quickly…" = "Apertura rápida…"; +"Open Recent" = "Abrir recientes"; +"Open Release Page" = "Abrir la página de la versión"; +"Open Themes Folder" = "Abrir la carpeta de temas"; +"Open Worktree" = "Abrir worktree"; +"Open a GitHub pull request" = "Abre un pull request de GitHub"; +"Open a Markdown file or a GitHub pull request" = "Abre un archivo Markdown o un pull request de GitHub"; +"Open a folder containing Markdown files" = "Abre una carpeta que contenga archivos Markdown"; +"Open files, folders, and worktrees from the shell — [about the pullmark command](https://pullmark.app/docs/cli/)." = "Abre archivos, carpetas y worktrees desde la terminal — [sobre el comando pullmark](https://pullmark.app/docs/cli/)."; +"Open in Browser" = "Abrir en el navegador"; +"Open in PullMark" = "Abrir en PullMark"; +"Open local Markdown files or a folder" = "Abre archivos Markdown locales o una carpeta"; +"Open on GitHub" = "Abrir en GitHub"; +"Open pull requests where your review is requested" = "Los pull requests abiertos donde se solicita tu revisión"; +"Open the review — pending comments, summary, and verdict" = "Abre la revisión — comentarios pendientes, resumen y veredicto"; +"Opens the release page on GitHub" = "Abre la página de la versión en GitHub"; +"Opens the release page on GitHub to update manually" = "Abre la página de la versión en GitHub para actualizar a mano"; +"Open…" = "Abrir…"; +"Option" = "Opción"; +"Outdated" = "Obsoleto"; +"Outdated — was line %lld" = "Obsoleto — era la línea %lld"; +"Outline" = "Esquema"; +"PR Overview" = "Resumen del PR"; +"Page Down" = "Avanzar página"; +"Page Setup…" = "Ajustar página…"; +"Page Up" = "Retroceder página"; +"Paper size and orientation for printing" = "Tamaño y orientación del papel para imprimir"; +"Paste the copied snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in the file\" becomes a complete handoff — the agent deletes each note as it resolves it, and you watch the bubbles disappear." = "Pega el fragmento copiado en el archivo de instrucciones de tu agente (CLAUDE.md, AGENTS.md, …) y «atiende las notas al margen del archivo» se convierte en un traspaso completo — el agente borra cada nota según la resuelve y tú ves cómo desaparecen los globos."; +"Pending review on GitHub" = "Revisión pendiente en GitHub"; +"Pinned to commit %@ — the ref's tip as of this session's last fetch." = "Fijado al commit %@ — la punta de la ref en el último fetch de esta sesión."; +"Posts immediately — file comments can't join a pending review." = "Se publica al instante — los comentarios de archivo no pueden unirse a una revisión pendiente."; +"Preview First" = "Vista previa primero"; +"Preview First shows a file with one click without keeping it — one italicized entry (in Open Files, or under its GitHub repo) that the next preview replaces. Double-click a file, or just start editing, to keep it open. Open Fully keeps every file you click." = "Vista previa primero muestra un archivo con un clic sin conservarlo — una sola entrada en cursiva (en Open Files, o bajo su repositorio de GitHub) que la siguiente vista previa reemplaza. Haz doble clic en un archivo, o simplemente empieza a editarlo, para dejarlo abierto. Abrir del todo conserva cada archivo en el que haces clic."; +"Previous File" = "Archivo anterior"; +"Previous Markdown file in this pull request" = "Archivo Markdown anterior de este pull request"; +"Previous match" = "Coincidencia anterior"; +"Print the rendered document" = "Imprime el documento renderizado"; +"Print…" = "Imprimir…"; +"Private repositories, commenting, and reviewing are ready." = "Los repositorios privados, los comentarios y las revisiones están listos."; +"Pull Requests" = "Pull Requests"; +"PullMark %@ is available." = "PullMark %@ ya está disponible."; +"PullMark Website" = "Sitio web de PullMark"; +"PullMark borrows the GitHub credentials your own tools already have — the GitHub CLI or a git credential helper. It has no login of its own, stores nothing, and never sees a password." = "PullMark toma prestadas las credenciales de GitHub que ya tienen tus propias herramientas — la CLI de GitHub o un ayudante de credenciales de git. No tiene inicio de sesión propio, no guarda nada y nunca ve una contraseña."; +"PullMark borrows the credentials your own tools already have — the GitHub CLI or a git credential helper. It has no login of its own, stores nothing, and never sees a password. [About GitHub access](https://pullmark.app/docs/troubleshooting/#github-access)" = "PullMark toma prestadas las credenciales que ya tienen tus propias herramientas — la CLI de GitHub o un ayudante de credenciales de git. No tiene inicio de sesión propio, no guarda nada y nunca ve una contraseña. [Sobre el acceso a GitHub](https://pullmark.app/docs/troubleshooting/#github-access)"; +"PullMark can fetch this file and render it in-app, or send it to your browser. Hold ⌘ while clicking a link for the other behavior; the default lives in Settings → General." = "PullMark puede descargar este archivo y renderizarlo dentro de la app, o mandárselo a tu navegador. Mantén ⌘ al hacer clic en un enlace para el otro comportamiento; el valor por defecto está en Ajustes → General."; +"PullMark is in demo mode — network access is disabled." = "PullMark está en modo demo — el acceso a la red está desactivado."; +"PullMark is installed — the disk image is no longer needed. This ejects it and moves “%@” to the Trash." = "PullMark está instalado — la imagen de disco ya no hace falta. Esto la expulsa y mueve “%@” a la papelera."; +"PullMark is no longer your default Markdown app." = "PullMark ya no es tu app por defecto para Markdown."; +"PullMark is running from its disk image. Moving it to Applications installs it properly and enables one-click updates." = "PullMark se está ejecutando desde su imagen de disco. Moverlo a Aplicaciones lo instala como toca y habilita las actualizaciones con un clic."; +"Push to origin after committing" = "Hacer push a origin después del commit"; +"Quick Look previews:" = "Vistas previas de Quick Look:"; +"Raw Source" = "Código fuente crudo"; +"Re-read credentials from the GitHub CLI and git credential helpers" = "Vuelve a leer las credenciales de la CLI de GitHub y de los ayudantes de credenciales de git"; +"Re-read credentials from the GitHub CLI and git credential helpers — after gh auth login, this connects without relaunching" = "Vuelve a leer las credenciales de la CLI de GitHub y de los ayudantes de credenciales de git — después de gh auth login, conecta sin relanzar la app"; +"Re-read this file from disk" = "Vuelve a leer este archivo del disco"; +"Reaction state unavailable — try refreshing the PR." = "Estado de la reacción no disponible — prueba a actualizar el PR."; +"Reading" = "Lectura"; +"Recents" = "Recientes"; +"Redo" = "Rehacer"; +"Refresh" = "Actualizar"; +"Refresh Folder" = "Actualizar carpeta"; +"Release Notes" = "Notas de la versión"; +"Release notes couldn't be loaded — they're also at github.com/jedijashwa/pullmark/releases." = "No se pudieron cargar las notas de la versión — también están en github.com/jedijashwa/pullmark/releases."; +"Reload" = "Recargar"; +"Reload Document" = "Recargar documento"; +"Remember my selection" = "Recordar mi elección"; +"Remote Branches" = "Ramas remotas"; +"Remove from Recents" = "Quitar de recientes"; +"Remove from Sidebar" = "Quitar de la barra lateral"; +"Remove the PullMark disk image?" = "¿Quitar la imagen de disco de PullMark?"; +"Rendered" = "Renderizado"; +"Rendered Diff" = "Diff renderizado"; +"Reopen what was in the sidebar when PullMark last quit" = "Reabre lo que había en la barra lateral la última vez que PullMark se cerró"; +"Reopening…" = "Reabriendo…"; +"Report a Bug…" = "Informar de un error…"; +"Report an Issue…" = "Informar de un problema…"; +"Request a Feature…" = "Solicitar una función…"; +"Required" = "Requerida"; +"Reset the zoom to 100%" = "Restablece el zoom al 100%"; +"Restore Defaults" = "Restablecer valores por defecto"; +"Restore Defaults…" = "Restablecer valores por defecto…"; +"Restore all keyboard shortcuts to their defaults?" = "¿Restablecer todos los atajos de teclado a sus valores por defecto?"; +"Restore files and pull requests from the last session" = "Restaurar los archivos y los pull requests de la última sesión"; +"Restore the default" = "Restablecer el valor por defecto"; +"Restore the file as it was before PullMark's last edit" = "Restaura el archivo tal como estaba antes de la última edición de PullMark"; +"Result" = "Resultado"; +"Retry" = "Reintentar"; +"Retry Upload" = "Reintentar la subida"; +"Return" = "Retorno"; +"Reveal in Finder" = "Mostrar en el Finder"; +"Reveal in Location" = "Mostrar en su ubicación"; +"Reveal on GitHub" = "Mostrar en GitHub"; +"Reveal resolved review conversations in the Result view" = "Muestra las conversaciones de revisión resueltas en la vista Resultado"; +"Revert Last Edit" = "Revertir la última edición"; +"Reverted the last edit to %@." = "Se revirtió la última edición de %@."; +"Review Changes…" = "Revisar cambios…"; +"Review Requests" = "Solicitudes de revisión"; +"Review changes" = "Revisar cambios"; +"Review comments couldn't be loaded — existing threads may be missing." = "No se pudieron cargar los comentarios de revisión — puede que falten hilos ya existentes."; +"Review requested from %@" = "Revisión solicitada a %@"; +"Review required" = "Revisión requerida"; +"Review submitted." = "Revisión enviada."; +"Review summary (optional)" = "Resumen de la revisión (opcional)"; +"Review verdict" = "Veredicto de la revisión"; +"Reviewing" = "Revisión"; +"Right Arrow" = "Flecha derecha"; +"Runs “%@” and relaunches PullMark" = "Ejecuta “%@” y relanza PullMark"; +"Save the rendered document as a PDF" = "Guarda el documento renderizado como PDF"; +"Save the rendered document as a self-contained HTML file" = "Guarda el documento renderizado como un archivo HTML autocontenido"; +"Saved as a pending review — visible only to you until you submit" = "Guardado como revisión pendiente — solo tú lo ves hasta que la envíes"; +"Search All Files…" = "Buscar en todos los archivos…"; +"Search all files" = "Buscar en todos los archivos"; +"See if something even newer is available" = "Comprueba si hay algo aún más nuevo"; +"Set Up GitHub Access…" = "Configurar el acceso a GitHub…"; +"Set Up…" = "Configurar…"; +"Set up the GitHub CLI" = "Configura la CLI de GitHub"; +"Share" = "Compartir"; +"Shift" = "Mayúsculas"; +"Show" = "Mostrar"; +"Show Alpha Features" = "Mostrar las funciones alfa"; +"Show Hidden Files" = "Mostrar los archivos ocultos"; +"Show Margin Notes" = "Mostrar las notas al margen"; +"Show Markdown Source" = "Mostrar el código Markdown"; +"Show Outline" = "Mostrar el esquema"; +"Show Resolved Conversations" = "Mostrar las conversaciones resueltas"; +"Show What's New after an update" = "Mostrar Novedades después de una actualización"; +"Show alpha features" = "Mostrar las funciones alfa"; +"Show alpha features?" = "¿Mostrar las funciones alfa?"; +"Show hidden files" = "Mostrar los archivos ocultos"; +"Show or hide the document outline" = "Muestra u oculta el esquema del documento"; +"Show review discussion on the PR overview" = "Mostrar la discusión de la revisión en el resumen del PR"; +"Show review requests in the sidebar" = "Mostrar las solicitudes de revisión en la barra lateral"; +"Show the next document" = "Muestra el documento siguiente"; +"Show the previous document" = "Muestra el documento anterior"; +"Show the raw Markdown behind the rendered document" = "Muestra el Markdown crudo que hay detrás del documento renderizado"; +"Show who last changed each block (git blame)" = "Muestra quién cambió por última vez cada bloque (git blame)"; +"Show/Hide Hidden Files" = "Mostrar/ocultar los archivos ocultos"; +"Show/Hide Margin Notes" = "Mostrar/ocultar las notas al margen"; +"Show/Hide Markdown Source" = "Mostrar/ocultar el código Markdown"; +"Show/Hide Outline" = "Mostrar/ocultar el esquema"; +"Show/Hide Resolved Conversations" = "Mostrar/ocultar las conversaciones resueltas"; +"Showing 500 of %lld changed files — Markdown files are preselected either way." = "Se muestran 500 de %lld archivos modificados — los archivos Markdown quedan preseleccionados igualmente."; +"Showing the first %lld Markdown files" = "Se muestran los primeros %lld archivos Markdown"; +"Sign in to GitHub" = "Inicia sesión en GitHub"; +"Sign notes as:" = "Firmar las notas como:"; +"Something went wrong" = "Algo salió mal"; +"Source" = "Código fuente"; +"Source Diff" = "Diff del código fuente"; +"Space" = "Espacio"; +"Spotlight" = "Spotlight"; +"Stage and commit changes in this file's repository" = "Prepara y hace commit de los cambios en el repositorio de este archivo"; +"Standard" = "Standard"; +"Submit review" = "Enviar la revisión"; +"Submit the review with the selected verdict (⌘↩)" = "Envía la revisión con el veredicto seleccionado (⌘↩)"; +"Support PullMark ❤️" = "Apoya a PullMark ❤️"; +"Switch between light, dark, and system appearance" = "Cambia entre la apariencia clara, la oscura y la del sistema"; +"Switch or Open Branch…" = "Cambiar o abrir rama…"; +"System" = "Sistema"; +"Tab" = "Tabulador"; +"Tags" = "Etiquetas"; +"Teach your agent" = "Enseña a tu agente"; +"Tell your agent" = "Díselo a tu agente"; +"Temporarily show the raw Markdown behind the rendered document" = "Muestra temporalmente el Markdown crudo que hay detrás del documento renderizado"; +"That link needs a different version of PullMark" = "Ese enlace necesita otra versión de PullMark"; +"The @name your notes carry — empty uses your GitHub login, or this Mac's account name when signed out" = "El @nombre que llevan tus notas — vacío usa tu login de GitHub, o el nombre de la cuenta de este Mac si no has iniciado sesión"; +"The GitHub CLI is installed but signed out. Run this in your terminal — it opens a browser to sign in:" = "La CLI de GitHub está instalada pero con la sesión cerrada. Ejecuta esto en tu terminal — abre un navegador para iniciar sesión:"; +"The PR session is no longer available — the draft could not be saved to disk." = "La sesión del PR ya no está disponible — el borrador no se pudo guardar en el disco."; +"The comment will be removed from GitHub. Replies from others will stay." = "El comentario se eliminará de GitHub. Las respuestas de otras personas se quedarán."; +"The document's headings, in a sidebar" = "Los encabezados del documento, en una barra lateral"; +"The pull request overview (%@ #%lld)" = "El resumen del pull request (%@ #%lld)"; +"The pullmark command is installed" = "El comando pullmark está instalado"; +"Theme" = "Tema"; +"Themes restyle rendered Markdown and diffs, and follow the Light/Dark appearance. Drop .css files into the Themes folder to add your own — they apply on top of the GitHub look. Quick Look previews follow your theme too (custom themes fall back to their GitHub base there)." = "Los temas reestilizan el Markdown renderizado y los diffs, y siguen la apariencia Light/Dark. Suelta archivos .css en la carpeta Themes para añadir los tuyos — se aplican sobre el aspecto GitHub. Las vistas previas de Quick Look también siguen tu tema (los temas personalizados recurren ahí a su base GitHub)."; +"These keys are fixed and can't be changed." = "Estas teclas son fijas y no se pueden cambiar."; +"This comment is still syncing with GitHub — try discarding it again in a moment." = "Este comentario todavía se está sincronizando con GitHub — prueba a descartarlo de nuevo en un momento."; +"This folder has more Markdown files than PullMark scans — open a subfolder as its own Location to see the rest" = "Esta carpeta tiene más archivos Markdown de los que PullMark escanea — abre una subcarpeta como Location propia para ver el resto"; +"This pull request was updated on GitHub." = "Este pull request se actualizó en GitHub."; +"This repository has no GitHub remote." = "Este repositorio no tiene remoto en GitHub."; +"This version (%@) doesn't know %@ — it may point at a feature from a newer release, or one that has moved. Checking for updates usually resolves it." = "Esta versión (%@) no conoce %@ — puede que apunte a una función de una versión más nueva, o a una que ha cambiado de sitio. Buscar actualizaciones suele resolverlo."; +"Thread state unavailable — try refreshing the PR." = "Estado del hilo no disponible — prueba a actualizar el PR."; +"Turn Off" = "Desactivar"; +"Up Arrow" = "Flecha arriba"; +"Update Now" = "Actualizar ahora"; +"Update failed: %@" = "La actualización falló: %@"; +"Updated to PullMark %@." = "Actualizado a PullMark %@."; +"Updates" = "Actualizaciones"; +"Upload the remaining comments into your pending review on GitHub" = "Sube los comentarios que quedan a tu revisión pendiente en GitHub"; +"Use Anyway" = "Usar de todos modos"; +"Using it" = "Cómo se usan"; +"View" = "Visualización"; +"View All Release Notes" = "Ver todas las notas de versión"; +"View as List" = "Ver como lista"; +"View as Tree" = "Ver como árbol"; +"Viewing signed out — commenting and reviewing are unavailable" = "Viendo sin sesión iniciada — comentar y revisar no están disponibles"; +"Walk through connecting PullMark to GitHub" = "Te guía para conectar PullMark con GitHub"; +"What Copy GitHub Link copies — hold ⌥ in the menu for the other flavor" = "Lo que copia Copiar enlace de GitHub — mantén ⌥ en el menú para la otra variante"; +"What changed since the last commit, rendered like a PR diff — the toolbar's Compare button offers older revisions and branches" = "Lo que ha cambiado desde el último commit, renderizado como el diff de un PR — el botón Comparar de la barra de herramientas ofrece revisiones anteriores y ramas"; +"What clicking a link to a Markdown file on GitHub does — hold ⌘ while clicking for the other behavior" = "Qué hace clicar un enlace a un archivo Markdown en GitHub — mantén ⌘ al hacer clic para el otro comportamiento"; +"What pressing space in Finder shows for Markdown files" = "Lo que muestra pulsar espacio en el Finder para los archivos Markdown"; +"What's New" = "Novedades"; +"While the find bar is open" = "Con la barra de búsqueda abierta"; +"Whole file" = "Todo el archivo"; +"Wide" = "Wide"; +"With a folder selected" = "Con una carpeta seleccionada"; +"With a local file or folder in a GitHub repository selected" = "Con un archivo o carpeta local de un repositorio de GitHub seleccionado"; +"With a local file or folder selected" = "Con un archivo o carpeta local seleccionado"; +"With files in Open Files" = "Con archivos en Open Files"; +"Works with private repos using your existing gh or git credentials." = "Funciona con repos privados usando tus credenciales de gh o git existentes."; +"You're on %@." = "Estás en %@."; +"Your custom shortcuts will be removed. This can't be undone." = "Se eliminarán tus atajos personalizados. Esto no se puede deshacer."; +"Zoom In" = "Acercar"; +"Zoom Out" = "Alejar"; +"and %lld more" = "y %lld más"; +"confirming sheets" = "confirmar hojas"; +"cycling windows" = "cambiar de ventana"; +"dismissing sheets" = "cerrar hojas"; +"https://github.com/owner/repo/pull/123 or owner/repo#123" = "https://github.com/owner/repo/pull/123 o owner/repo#123"; +"just now" = "ahora mismo"; +"on base branch" = "en la rama base"; +"opened by %@" = "abierto por %@"; +"the Help menu" = "el menú Ayuda"; +"the app switcher" = "el conmutador de apps"; +" · was {r}" = " · era {r}"; +"(empty)" = "(vacío)"; +"Add a margin note" = "Añadir una nota al margen"; +"Add a suggestion" = "Añadir una sugerencia"; +"Add reaction" = "Añadir reacción"; +"Add single comment" = "Añadir un solo comentario"; +"Click the gutter for history" = "Haz clic en el margen para ver el historial"; +"Comment actions" = "Acciones del comentario"; +"Comment on line {n}" = "Comentar la línea {n}"; +"Comment on lines {a}–{b}" = "Comentar las líneas {a}–{b}"; +"Comment on new line {n}" = "Comentar la línea nueva {n}"; +"Comment on new line {n} — shift-click extends the range" = "Comentar la línea nueva {n} — mayús-clic amplía el rango"; +"Comment on new lines {a}–{b}" = "Comentar las líneas nuevas {a}–{b}"; +"Comment on old line {n} — shift-click extends the range" = "Comentar la línea antigua {n} — mayús-clic amplía el rango"; +"Comment on old lines {a}–{b}" = "Comentar las líneas antiguas {a}–{b}"; +"Comment on the pull request conversation" = "Comentar en la conversación del pull request"; +"Conversation" = "Conversación"; +"Copy full SHA" = "Copiar el SHA completo"; +"Couldn't load this image from GitHub · " = "No se pudo cargar esta imagen de GitHub · "; +"File comments" = "Comentarios del archivo"; +"Front matter" = "Front matter"; +"Hide {n} resolved conversation" = "Ocultar {n} conversación resuelta"; +"Hide {n} resolved conversations" = "Ocultar {n} conversaciones resueltas"; +"Insert a ```suggestion block pre-filled with the current lines" = "Inserta un bloque ```suggestion rellenado con las líneas actuales"; +"LEFT" = "LEFT"; +"Leave a comment" = "Deja un comentario"; +"Line {n}" = "Línea {n}"; +"Lines {a}–{b}" = "Líneas {a}–{b}"; +"Moved from line {n} — content unchanged" = "Movido desde la línea {n} — contenido sin cambios"; +"Not synced" = "Sin sincronizar"; +"Old line {n}" = "Línea antigua {n}"; +"Old lines {a}–{b}" = "Líneas antiguas {a}–{b}"; +"Open this conversation on GitHub — PullMark doesn't render this file" = "Abrir esta conversación en GitHub — PullMark no renderiza este archivo"; +"Open {path} and jump to this conversation" = "Abrir {path} y saltar a esta conversación"; +"Outdated review comments" = "Comentarios de revisión obsoletos"; +"Pending" = "Pendiente"; +"Pending comment — click to expand" = "Comentario pendiente — haz clic para desplegar"; +"Pending comments — click to expand" = "Comentarios pendientes — haz clic para desplegar"; +"Post to the PR conversation right away — not part of a review (⌘↩)" = "Publica en la conversación del PR al instante — no forma parte de una revisión (⌘↩)"; +"Reply" = "Responder"; +"Reply to this thread (⌘↩)" = "Responder a este hilo (⌘↩)"; +"Resolve" = "Resolver"; +"Resolved" = "Resuelta"; +"Review discussion" = "Discusión de la revisión"; +"Save" = "Guardar"; +"Save your edit (⌘↩)" = "Guarda tu edición (⌘↩)"; +"Show on GitHub" = "Ver en GitHub"; +"Show {n} resolved conversation" = "Mostrar {n} conversación resuelta"; +"Show {n} resolved conversations" = "Mostrar {n} conversaciones resueltas"; +"Suggested change" = "Cambio sugerido"; +"Suggestions can only target new-file lines — GitHub applies them in place of the commented lines." = "Las sugerencias solo pueden apuntar a líneas del archivo nuevo — GitHub las aplica en lugar de las líneas comentadas."; +"The conversation could not be loaded — retrying." = "No se pudo cargar la conversación — reintentando."; +"The targeted lines aren't available to suggest an edit to." = "Las líneas apuntadas no están disponibles para sugerir una edición."; +"This block isn't part of the pull request's diff — GitHub can only attach comments to changed lines." = "Este bloque no forma parte del diff del pull request — GitHub solo puede adjuntar comentarios a líneas modificadas."; +"This file is empty on both sides of the diff." = "Este archivo está vacío en ambos lados del diff."; +"Unresolve" = "Marcar sin resolver"; +"View commit on GitHub" = "Ver el commit en GitHub"; +"View in File" = "Ver en el archivo"; +"Write a reply" = "Escribe una respuesta"; +"Write at the end of the document" = "Escribe al final del documento"; +"all conversations resolved" = "todas las conversaciones resueltas"; +"approved these changes" = "aprobó estos cambios"; +"bot" = "bot"; +"copied" = "copiado"; +"dismissed their review" = "descartó su revisión"; +"moved" = "movido"; +"requested changes" = "solicitó cambios"; +"reviewed" = "revisó"; +"whole document" = "todo el documento"; +"{n} comment" = "{n} comentario"; +"{n} comments" = "{n} comentarios"; +"{n} review" = "{n} revisión"; +"{n} reviews" = "{n} revisiones"; +"{n} unresolved conversation" = "{n} conversación sin resolver"; +"{n} unresolved conversations" = "{n} conversaciones sin resolver"; +" · edited" = " · editado"; +"· asks where to open" = "· pregunta dónde abrir"; +"· opens in PullMark" = "· abre en PullMark"; +"· opens in browser" = "· abre en el navegador"; +"{n} comment — click to expand" = "{n} comentario — haz clic para expandir"; +"{n} comments — click to expand" = "{n} comentarios — haz clic para expandir"; +"Closed" = "Cerrado"; +"Draft" = "Borrador"; +"Merged" = "Fusionado"; +"Unavailable" = "No disponible"; +"View on GitHub" = "Ver en GitHub"; +"View all checks on GitHub" = "Ver todas las verificaciones en GitHub"; +"%lld of %lld done" = "%lld de %lld completadas"; +"%lld of %lld failing" = "%lld de %lld con fallos"; +"A clean margin, numbers on demand in Source" = "Un margen limpio, números bajo demanda en Fuente"; +"A workflow is waiting for approval" = "Un flujo de trabajo espera aprobación"; +"Added" = "Añadido"; +"Changed" = "Cambiado"; +"Connected" = "Conectado"; +"Copied" = "Copiado"; +"Copy GitHub Branch Link" = "Copiar enlace de rama de GitHub"; +"Copy GitHub Permalink" = "Copiar enlace permanente de GitHub"; +"Deleted" = "Eliminado"; +"Each block's source line in the margin" = "La línea de origen de cada bloque en el margen"; +"GitHub CLI" = "GitHub CLI"; +"Hidden" = "Ocultos"; +"Language" = "Idioma"; +"Language:" = "Idioma:"; +"Line numbers hidden" = "Números de línea ocultos"; +"Line numbers shown" = "Números de línea visibles"; +"Modified" = "Modificado"; +"Renamed" = "Renombrado"; +"Shown" = "Visibles"; +"Takes effect after PullMark relaunches." = "Se aplica cuando PullMark se reinicie."; +"Untracked" = "Sin seguimiento"; +"git credential helper" = "asistente de credenciales de git"; +"Relaunch Now" = "Reiniciar ahora"; diff --git a/loc/fr.lproj/Localizable.strings b/loc/fr.lproj/Localizable.strings new file mode 100644 index 0000000..59df574 --- /dev/null +++ b/loc/fr.lproj/Localizable.strings @@ -0,0 +1,604 @@ +" (none)" = " (aucun)"; +"%lld Markdown files changed" = "%lld fichiers Markdown modifiés"; +"%@ and pushed to origin." = "%@ et envoi vers origin réussi."; +"%@ approved" = "%@ a approuvé"; +"%@ approved %@" = "%@ a approuvé %@"; +"%@ changed while you were annotating — nothing was saved. The current notes are shown now." = "%@ a changé pendant que vous étiez en train d'annoter — rien n'a été enregistré. Les notes actuelles sont affichées."; +"%@ changed while you were editing this block — nothing was saved. Re-open the block to edit the current version." = "%@ a changé pendant que vous modifiiez ce bloc — rien n'a été enregistré. Rouvrez le bloc pour modifier la version actuelle."; +"%@ does not exist at %@." = "%@ n'existe pas sur %@."; +"%lld files" = "%lld fichiers"; +"%@ is reserved for %@." = "%@ est réservé pour %@."; +"%@ isn't available" = "%@ n'est pas disponible"; +"%@ isn't available on %@: " = "%@ n'est pas disponible sur %@ : "; +"%@ isn't in a git repository, so there's nothing to compare against." = "%@ n'est pas dans un dépôt git, il n'y a donc rien à quoi le comparer."; +"%@ isn't inside a git repository." = "%@ n'est pas dans un dépôt git."; +"%lld more reviewers" = "%lld réviseurs de plus"; +"%lld more…" = "%lld de plus…"; +"%lld not yet on GitHub" = "%lld pas encore sur GitHub"; +"%lld of %lld" = "%lld sur %lld"; +"%lld other files not shown" = "%lld autres fichiers non affichés"; +"%@ requested changes" = "%@ a demandé des modifications"; +"%@ requested changes %@" = "%@ a demandé des modifications %@"; +"%@ words · %lld min" = "%@ mots · %lld min"; +"%@ — previewing; double-click to keep it with its repo" = "%@ — en aperçu ; double-cliquez pour le conserver avec son dépôt"; +"%@, but the push failed: %@" = "%@, mais l'envoi a échoué : %@"; +"1 Markdown file changed" = "1 fichier Markdown modifié"; +"1 file" = "1 fichier"; +"1 more reviewer" = "1 réviseur de plus"; +"1 other file not shown" = "1 autre fichier non affiché"; +"Abandon review" = "Abandonner la révision"; +"Abandon this review?" = "Abandonner cette révision ?"; +"About PullMark" = "À propos de PullMark"; +"Actual Size" = "Taille réelle"; +"Add Margin Note" = "Ajouter une note de marge"; +"Add a margin note on the block you're reading" = "Ajoute une note de marge sur le bloc que vous lisez"; +"Adds a Review discussion section under the PR description listing every thread, with code excerpts and links" = "Ajoute une section Discussion de révision sous la description de la PR, listant chaque fil, avec extraits de code et liens"; +"Adds a pullmark command to /usr/local/bin so you can open files and folders from the shell" = "Ajoute une commande pullmark dans /usr/local/bin pour ouvrir fichiers et dossiers depuis le terminal"; +"Adds the authoring tools — hover a block, ⌥⌘M; documents that already contain notes always show them either way" = "Ajoute les outils de rédaction — survolez un bloc, ⌥⌘M ; les documents qui contiennent déjà des notes les affichent dans tous les cas"; +"After navigating between documents" = "Après une navigation entre documents"; +"All pending comments and the summary will be discarded, on GitHub too." = "Tous les commentaires en attente et le résumé seront supprimés, sur GitHub aussi."; +"Alpha features are the frontier: their behavior and data formats may change incompatibly between versions, transitions may not be supported, and a feature may be removed entirely. Use them at your own risk." = "Les fonctionnalités alpha sont un territoire mouvant : leur comportement et leurs formats de données peuvent changer de façon incompatible d'une version à l'autre, les transitions peuvent ne pas être prises en charge, et une fonctionnalité peut disparaître entièrement. À utiliser à vos risques et périls."; +"Already use a git credential helper (macOS keychain, Git Credential Manager)? PullMark finds it automatically — Check Again will confirm." = "Vous utilisez déjà un assistant d'identification git (trousseau macOS, Git Credential Manager) ? PullMark le trouve automatiquement — Vérifier à nouveau le confirmera."; +"Anything Git can resolve works: a branch, a tag, or a commit. Leave the new side empty to compare the working file." = "Tout ce que Git sait résoudre convient : une branche, un tag ou un commit. Laissez le côté nouveau vide pour comparer le fichier de travail."; +"Appearance" = "Apparence"; +"Applies to the whole file, not a specific line" = "S'applique au fichier entier, pas à une ligne précise"; +"Approved" = "Approuvé"; +"Ask on first click" = "Demander au premier clic"; +"Awaiting review from %@" = "En attente de la révision de %@"; +"Back" = "Précédent"; +"Blame" = "Blame"; +"Branch name" = "Nom de la branche"; +"Branches" = "Branches"; +"Branches and worktrees" = "Branches et worktrees"; +"Browse Repo Files" = "Parcourir les fichiers du dépôt"; +"Browse Repo Files…" = "Parcourir les fichiers du dépôt…"; +"Built-In Keys" = "Touches fixes"; +"Cancel" = "Annuler"; +"Changes requested" = "Modifications demandées"; +"Check Again" = "Vérifier à nouveau"; +"Check for Updates" = "Rechercher les mises à jour"; +"Check for Updates…" = "Rechercher les mises à jour…"; +"Checking this Mac's credentials…" = "Vérification des identifiants de ce Mac…"; +"Checking…" = "Vérification…"; +"Checkout of %@/%@" = "Copie locale de %@/%@"; +"Checks awaiting approval" = "Vérifications en attente d'approbation"; +"Checks failed" = "Vérifications échouées"; +"Checks passed" = "Vérifications réussies"; +"Checks running" = "Vérifications en cours"; +"Choose the file to compare with — it becomes the old side." = "Choisissez le fichier de comparaison — il devient le côté ancien."; +"Choose which items the toolbar shows, and their order" = "Choisir les éléments affichés dans la barre d'outils, et leur ordre"; +"Clear Menu" = "Effacer le menu"; +"Clear Recents" = "Effacer les récents"; +"Click a shortcut, or select a row and press Return, then type the new keys. Press Delete to remove a shortcut, Esc to cancel." = "Cliquez un raccourci, ou sélectionnez une ligne et appuyez sur Retour, puis tapez les nouvelles touches. Appuyez sur Supprimer pour retirer un raccourci, sur Échap pour annuler."; +"Click to type a zoom level" = "Cliquez pour saisir un niveau de zoom"; +"Clicking files in Locations:" = "Clic sur un fichier dans Locations :"; +"Close" = "Fermer"; +"Close All" = "Tout fermer"; +"Close All Files" = "Fermer tous les fichiers"; +"Command" = "Commande"; +"Comment" = "Commenter"; +"Comment on %@" = "Commenter %@"; +"Comment on File" = "Commenter le fichier"; +"Comment on any local Markdown document the way you'd comment on a PR. Notes save into the file itself as `` comments — ordinary HTML comments that stay out of rendered Markdown, shown by PullMark as bubbles pinned to their spot, and written so agents can read and act on them. [How margin notes work](https://pullmark.app/docs/experimental/margin-notes/)" = "Commentez n'importe quel document Markdown local comme vous commenteriez une PR. Les notes s'enregistrent dans le fichier même, sous forme de commentaires `` — de simples commentaires HTML qui restent hors du Markdown rendu, que PullMark affiche en bulles ancrées à leur emplacement, et qui sont écrites pour que les agents puissent les lire et agir dessus. [Comment fonctionnent les notes de marge](https://pullmark.app/docs/experimental/margin-notes/)"; +"Comment on any local Markdown document the way you'd comment on a PR. Notes save into the file itself as `` comments — ordinary HTML comments that stay out of rendered Markdown, shown by PullMark as bubbles pinned to their spot. Deleting a note is how it's resolved." = "Commentez n'importe quel document Markdown local comme vous commenteriez une PR. Les notes s'enregistrent dans le fichier même, sous forme de commentaires `` — de simples commentaires HTML qui restent hors du Markdown rendu, que PullMark affiche en bulles ancrées à leur emplacement. Supprimer une note, c'est ainsi qu'on la résout."; +"Comment on this file as a whole, not a specific line" = "Commenter ce fichier dans son ensemble, pas une ligne précise"; +"Commit Changes" = "Committer les modifications"; +"Commit Changes…" = "Committer les modifications…"; +"Commit message" = "Message de commit"; +"Commit to %@" = "Committer sur %@"; +"Commit to a new branch" = "Committer sur une nouvelle branche"; +"Committed %lld files" = "%lld fichiers committés"; +"Committed %lld files on new branch “%@”" = "%lld fichiers committés sur la nouvelle branche « %@ »"; +"Committed 1 file" = "1 fichier committé"; +"Committed 1 file on new branch “%@”" = "1 fichier committé sur la nouvelle branche « %@ »"; +"Compare" = "Comparer"; +"Compare Revisions" = "Comparer des versions"; +"Comparing " = "Comparaison "; +"Comparing with %@" = "Comparaison avec %@"; +"Connection status…" = "État de la connexion…"; +"Content Width" = "Largeur du contenu"; +"Content width" = "Largeur du contenu"; +"Control" = "Contrôle"; +"Copies instructions for CLAUDE.md / AGENTS.md — how to read margin notes and delete them as they're addressed" = "Copie des instructions pour CLAUDE.md / AGENTS.md — comment lire les notes de marge et les supprimer à mesure qu'elles sont traitées"; +"Copies the Markdown source of the selected blocks (whole blocks — or the whole document when nothing is selected)" = "Copie la source Markdown des blocs sélectionnés (des blocs entiers — ou tout le document quand rien n'est sélectionné)"; +"Copies “%@” to the clipboard" = "Copie « %@ » dans le presse-papiers"; +"Copy" = "Copier"; +"Copy %@ to the clipboard" = "Copier %@ dans le presse-papiers"; +"Copy GitHub Link" = "Copier le lien GitHub"; +"Copy GitHub links as:" = "Format des liens GitHub copiés :"; +"Copy Path" = "Copier le chemin d'accès"; +"Copy as Markdown" = "Copier au format Markdown"; +"Could not abandon the review: %@" = "Impossible d'abandonner la révision : %@"; +"Could not create the PDF: %@" = "Impossible de créer le PDF : %@"; +"Could not delete the comment: %@" = "Impossible de supprimer le commentaire : %@"; +"Could not discard the pending comment: %@" = "Impossible de supprimer le commentaire en attente : %@"; +"Could not post the comment — the PR session is no longer available. Your text was kept as a draft." = "Impossible de publier le commentaire — la session de la PR n'est plus disponible. Votre texte a été conservé en brouillon."; +"Could not post the comment: %@" = "Impossible de publier le commentaire : %@"; +"Could not post the reply — the PR session is no longer available. Your text was kept as a draft." = "Impossible de publier la réponse — la session de la PR n'est plus disponible. Votre texte a été conservé en brouillon."; +"Could not post the reply: %@" = "Impossible de publier la réponse : %@"; +"Could not read %@." = "Impossible de lire %@."; +"Could not read the rendered page." = "Impossible de lire la page rendue."; +"Could not refresh %@: %@" = "Impossible d'actualiser %@ : %@"; +"Could not save %@: %@" = "Impossible d'enregistrer %@ : %@"; +"Could not save the edit: %@" = "Impossible d'enregistrer la modification : %@"; +"Could not update the reaction: %@" = "Impossible de mettre à jour la réaction : %@"; +"Could not upload %lld pending comments to GitHub — kept locally for retry. %@" = "Impossible d'envoyer %lld commentaires en attente vers GitHub — conservés en local pour une nouvelle tentative. %@"; +"Could not upload 1 pending comment to GitHub — kept locally for retry. %@" = "Impossible d'envoyer 1 commentaire en attente vers GitHub — conservé en local pour une nouvelle tentative. %@"; +"Couldn't move PullMark" = "Impossible de déplacer PullMark"; +"Couldn't open %@/%@#%lld: " = "Impossible d'ouvrir %@/%@#%lld : "; +"Couldn't open %@: %@" = "Impossible d'ouvrir %@ : %@"; +"Couldn't open %@: %@. It may not exist at that ref, or it may be a private repository your GitHub credentials can't access." = "Impossible d'ouvrir %@ : %@. Le fichier n'existe peut-être pas à cette référence, ou il s'agit d'un dépôt privé auquel vos identifiants GitHub n'ont pas accès."; +"Couldn't revert: %@" = "Annulation impossible : %@"; +"Couldn't save %@: " = "Impossible d'enregistrer %@ : "; +"Couldn't save %@: %@" = "Impossible d'enregistrer %@ : %@"; +"Current branch" = "Branche actuelle"; +"Custom themes" = "Thèmes personnalisés"; +"Customize Toolbar…" = "Personnaliser la barre d'outils…"; +"Dark" = "Sombre"; +"Default diff layout:" = "Disposition par défaut des diffs :"; +"Delete" = "Supprimer"; +"Delete comment" = "Supprimer le commentaire"; +"Delete this comment?" = "Supprimer ce commentaire ?"; +"Determining how this copy was installed…" = "Détermination du mode d'installation de cette copie…"; +"Discard the pending review and all its comments, on GitHub too" = "Supprimer la révision en attente et tous ses commentaires, sur GitHub aussi"; +"Dismiss" = "Ignorer"; +"Dismiss Preview" = "Fermer l'aperçu"; +"Dismiss — PullMark won't ask again unless you make it the default" = "Ignorer — PullMark ne redemandera pas tant que vous ne l'aurez pas défini par défaut"; +"Dismiss — this version won't be suggested again" = "Ignorer — cette version ne sera plus proposée"; +"Don't ask again for this repository" = "Ne plus demander pour ce dépôt"; +"Done" = "Terminé"; +"Dotfiles and hidden folders in Locations — like ⇧⌘. in Finder" = "Les dotfiles et dossiers cachés dans Locations — comme ⇧⌘. dans le Finder"; +"Dotfiles and hidden folders in Locations — ⇧⌘. toggles this too, like Finder" = "Les dotfiles et dossiers cachés dans Locations — ⇧⌘. bascule aussi ce réglage, comme dans le Finder"; +"Down Arrow" = "Flèche bas"; +"Download" = "Télécharger"; +"Downloads the update, verifies its signature, and installs it in place" = "Télécharge la mise à jour, vérifie sa signature et l'installe sur place"; +"Drag PullMark to Applications in the Finder instead. (%@)" = "Glissez plutôt PullMark dans Applications depuis le Finder. (%@)"; +"Each block's starting source line, in the margin of rendered documents and diffs — hover a number for the block's full range. Rendered text wraps freely, so numbering is per block, not per visual line. The raw source view always shows its own line numbers." = "La ligne source de départ de chaque bloc, dans la marge des documents rendus et des diffs — survolez un numéro pour la plage complète du bloc. Le texte rendu se replie librement : la numérotation est donc par bloc, pas par ligne visuelle. La vue source brute montre toujours ses propres numéros de ligne."; +"Edit" = "Édition"; +"Edit Mode" = "Mode édition"; +"Enable margin notes" = "Activer les notes de marge"; +"End" = "Fin"; +"Escape" = "Échap"; +"Every release's notes, up to the version you're running" = "Les notes de chaque version, jusqu'à celle que vous utilisez"; +"Exact commit (permalink)" = "Commit exact (permalien)"; +"Expand All" = "Tout déplier"; +"Experimental" = "Expérimental"; +"Export as HTML…" = "Exporter au format HTML…"; +"Export as PDF…" = "Exporter au format PDF…"; +"Features land here before their design is settled. **Beta** features get a real compatibility effort between versions and are likely to graduate. **Alpha** features carry no guarantees: they may change incompatibly, their data formats may not migrate, and they may disappear entirely. [About experimental features](https://pullmark.app/docs/experimental/)" = "Les fonctionnalités arrivent ici avant que leur conception soit figée. Les fonctionnalités **bêta** bénéficient d'un réel effort de compatibilité entre versions et ont de bonnes chances d'en sortir. Les fonctionnalités **alpha** n'offrent aucune garantie : elles peuvent changer de façon incompatible, leurs formats de données peuvent ne pas migrer, et elles peuvent disparaître entièrement. [À propos des fonctionnalités expérimentales](https://pullmark.app/docs/experimental/)"; +"Features land here before their design is settled. **Beta** features get a real compatibility effort between versions and are likely to graduate. [About experimental features](https://pullmark.app/docs/experimental/)" = "Les fonctionnalités arrivent ici avant que leur conception soit figée. Les fonctionnalités **bêta** bénéficient d'un réel effort de compatibilité entre versions et ont de bonnes chances d'en sortir. [À propos des fonctionnalités expérimentales](https://pullmark.app/docs/experimental/)"; +"File" = "Fichier"; +"File Margin Note…" = "Note de marge sur le fichier…"; +"Fill in a known branch, tag, or commit" = "Indiquez une branche, un tag ou un commit connu"; +"Find Next" = "Rechercher le suivant"; +"Find Previous" = "Rechercher le précédent"; +"Find in Page" = "Rechercher dans la page"; +"Find in page" = "Rechercher dans la page"; +"Finish your review · %lld" = "Terminer la révision · %lld"; +"Finish your review — 1 pending comment" = "Terminer la révision — 1 commentaire en attente"; +"Finish your review — %lld pending comments" = "Terminer la révision — %lld commentaires en attente"; +"Flip Diff Layout" = "Inverser la disposition du diff"; +"Forward" = "Suivant"; +"Forward Delete" = "Supprimer vers l'avant"; +"Full Width" = "Full Width"; +"General" = "Général"; +"GitHub" = "GitHub"; +"GitHub API error (%lld): %@" = "Erreur de l'API GitHub (%lld) : %@"; +"GitHub Access" = "Accès GitHub"; +"GitHub Markdown links:" = "Liens Markdown GitHub :"; +"Go" = "Aller"; +"Hide Hidden Files" = "Masquer les fichiers cachés"; +"Hide Margin Notes" = "Masquer les notes de marge"; +"Hide Markdown Source" = "Masquer la source Markdown"; +"Hide Outline" = "Masquer le plan"; +"Hide Resolved Conversations" = "Masquer les conversations résolues"; +"Hide review requests with no Markdown files — PullMark has nothing to show for them" = "Masque les demandes de révision sans fichier Markdown — PullMark n'a rien à y montrer"; +"History" = "Historique"; +"Home" = "Début"; +"Hover any block for the note bubble (select text first to quote it), or press ⌥⌘M. Edit and delete from each bubble; deleting a note is how it's resolved. Open Files rows show a count chip while a document still carries notes, and View → Hide Margin Notes clears the page for clean reading." = "Survolez n'importe quel bloc pour faire apparaître la bulle de note (sélectionnez du texte d'abord pour le citer), ou appuyez sur ⌥⌘M. Modifiez et supprimez depuis chaque bulle ; supprimer une note, c'est ainsi qu'on la résout. Les lignes d'Open Files portent une pastille de compte tant que le document contient encore des notes, et Présentation → Masquer les notes de marge nettoie la page pour lire au propre."; +"How far text may stretch before it wraps. Standard keeps the classic book-like measure; Wide fits more on screen and still caps the line length; Full Width gives the document the whole window — handy in full screen. Applies everywhere, live, and plays with any theme." = "Jusqu'où le texte peut s'étirer avant de se replier. Standard garde la justification classique, façon livre ; Wide met plus de texte à l'écran tout en plafonnant la longueur de ligne ; Full Width donne toute la fenêtre au document — pratique en plein écran. S'applique partout, en direct, et se compose avec n'importe quel thème."; +"How wide the rendered text column runs" = "Largeur de la colonne de texte rendu"; +"In a local document" = "Dans un document local"; +"In a pull request" = "Dans une pull request"; +"In a pull request file" = "Dans un fichier de pull request"; +"In a pull request file's Result view" = "Dans la vue Résultat d'un fichier de pull request"; +"Install pullmark Command…" = "Installer la commande pullmark…"; +"Jump to another Markdown file in this pull request" = "Aller à un autre fichier Markdown de cette pull request"; +"Jump to any file, heading, or pull request" = "Aller à n'importe quel fichier, titre ou pull request"; +"Jump to the GitHub connection section" = "Aller à la section de connexion GitHub"; +"Keep" = "Conserver"; +"Keep Open" = "Garder ouvert"; +"Keep Using" = "Continuer à les utiliser"; +"Keyboard" = "Clavier"; +"Large repo — not all files shown" = "Dépôt volumineux — les fichiers ne sont pas tous affichés"; +"Last seen at %@. " = "Vu pour la dernière fois à %@. "; +"Layout" = "Disposition"; +"Left Arrow" = "Flèche gauche"; +"Light" = "Clair"; +"Light, Dark, or match the system — the window and every rendered page follow, and each theme brings its own light and dark looks." = "Clair, sombre ou selon le système — la fenêtre et chaque page rendue suivent, et chaque thème apporte ses propres visages clair et sombre."; +"Line %lld (new)" = "Ligne %lld (nouvelle)"; +"Line %lld (old)" = "Ligne %lld (ancienne)"; +"Line numbers" = "Numéros de ligne"; +"Loading repo files…" = "Chargement des fichiers du dépôt…"; +"Locations" = "Locations"; +"Make Default Again" = "Redéfinir par défaut"; +"Make PullMark the Default" = "Définir PullMark par défaut"; +"Make the document bigger" = "Agrandit le document"; +"Make the document bigger — text, images, and the content column scale together" = "Agrandit le document — texte, images et colonne de contenu grandissent ensemble"; +"Make the document smaller" = "Réduit le document"; +"Make the page writable — then click any block" = "Rend la page modifiable — cliquez ensuite n'importe quel bloc"; +"Make this choice the default for GitHub Markdown links" = "Faire de ce choix le comportement par défaut des liens Markdown GitHub"; +"Margin Notes" = "Notes de marge"; +"Margin notes are experimental (beta): the design may still shift between versions, and Settings → Experimental turns them off any time. [How margin notes work](https://pullmark.app/docs/experimental/margin-notes/)" = "Les notes de marge sont expérimentales (bêta) : leur conception peut encore évoluer d'une version à l'autre, et Réglages → Expérimental permet de les désactiver à tout moment. [Comment fonctionnent les notes de marge](https://pullmark.app/docs/experimental/margin-notes/)"; +"Margin notes are hidden — choose View → Show Margin Notes first." = "Les notes de marge sont masquées — choisissez d'abord Présentation → Afficher les notes de marge."; +"Margin notes are off — turn them back on in Settings → Experimental." = "Les notes de marge sont désactivées — réactivez-les dans Réglages → Expérimental."; +"Margin notes are off — turn them on in Settings → Experimental." = "Les notes de marge sont désactivées — activez-les dans Réglages → Expérimental."; +"Margin-note bubbles ( comments) in rendered documents" = "Les bulles de note de marge (commentaires ) dans les documents rendus"; +"Markdown files open in PullMark" = "Les fichiers Markdown s'ouvrent dans PullMark"; +"Mission Control" = "Mission Control"; +"Move PullMark to your Applications folder?" = "Déplacer PullMark vers votre dossier Applications ?"; +"Move to Applications" = "Déplacer vers Applications"; +"Move to Trash" = "Placer dans la corbeille"; +"Next File" = "Fichier suivant"; +"Next Markdown file in this pull request" = "Fichier Markdown suivant de cette pull request"; +"Next match" = "Occurrence suivante"; +"No Markdown files found in %@." = "Aucun fichier Markdown trouvé dans %@."; +"No changes to commit." = "Aucune modification à committer."; +"No headings" = "Aucun titre"; +"None" = "Aucun"; +"Not Now" = "Pas maintenant"; +"Not a Homebrew user? [Download the CLI from cli.github.com](https://cli.github.com), then sign in the same way." = "Vous n'utilisez pas Homebrew ? [Téléchargez la CLI depuis cli.github.com](https://cli.github.com), puis connectez-vous de la même façon."; +"Not available in this build" = "Non disponible dans cette version"; +"Not connected" = "Non connecté"; +"Not connected to GitHub — private repositories and reviewing are unavailable." = "Non connecté à GitHub — les dépôts privés et la révision ne sont pas disponibles."; +"Notes are written so agents can read and act on them. Paste the snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in this file\" becomes a complete handoff." = "Les notes sont écrites pour que les agents puissent les lire et agir dessus. Collez l'extrait dans le fichier d'instructions de votre agent (CLAUDE.md, AGENTS.md, …) et « traite les notes de marge de ce fichier » suffit comme passation."; +"OK" = "OK"; +"Off shows a quiet banner instead — the notes stay one click away" = "Désactivé, une discrète bannière prend le relais — les notes restent à un clic"; +"Only requests that change Markdown" = "Uniquement les demandes qui modifient du Markdown"; +"Open" = "Ouvrir"; +"Open Branch Separately" = "Ouvrir la branche à part"; +"Open File or Folder" = "Ouvrir un fichier ou un dossier"; +"Open Files" = "Open Files"; +"Open File…" = "Ouvrir un fichier…"; +"Open Folder…" = "Ouvrir un dossier…"; +"Open Fully" = "Ouvrir complètement"; +"Open GitHub Markdown links in PullMark?" = "Ouvrir les liens Markdown GitHub dans PullMark ?"; +"Open Markdown files" = "Ouvrir des fichiers Markdown"; +"Open Markdown files or a folder containing them" = "Ouvrir des fichiers Markdown ou un dossier qui en contient"; +"Open Pull Request" = "Ouvrir une pull request"; +"Open Pull Request…" = "Ouvrir une pull request…"; +"Open Quickly — files, headings, pull requests, or paths" = "Ouvrir rapidement — fichiers, titres, pull requests ou chemins"; +"Open Quickly…" = "Ouvrir rapidement…"; +"Open Recent" = "Ouvrir l'élément récent"; +"Open Release Page" = "Ouvrir la page de la version"; +"Open Themes Folder" = "Ouvrir le dossier Themes"; +"Open Worktree" = "Ouvrir le worktree"; +"Open a GitHub pull request" = "Ouvrir une pull request GitHub"; +"Open a Markdown file or a GitHub pull request" = "Ouvrez un fichier Markdown ou une pull request GitHub"; +"Open a folder containing Markdown files" = "Ouvrir un dossier contenant des fichiers Markdown"; +"Open files, folders, and worktrees from the shell — [about the pullmark command](https://pullmark.app/docs/cli/)." = "Ouvrez fichiers, dossiers et worktrees depuis le terminal — [à propos de la commande pullmark](https://pullmark.app/docs/cli/)."; +"Open in Browser" = "Ouvrir dans le navigateur"; +"Open in PullMark" = "Ouvrir dans PullMark"; +"Open local Markdown files or a folder" = "Ouvrir des fichiers Markdown locaux ou un dossier"; +"Open on GitHub" = "Ouvrir sur GitHub"; +"Open pull requests where your review is requested" = "Les pull requests ouvertes où votre révision est demandée"; +"Open the review — pending comments, summary, and verdict" = "Ouvre la révision — commentaires en attente, résumé et verdict"; +"Opens the release page on GitHub" = "Ouvre la page de la version sur GitHub"; +"Opens the release page on GitHub to update manually" = "Ouvre la page de la version sur GitHub pour mettre à jour manuellement"; +"Open…" = "Ouvrir…"; +"Option" = "Option"; +"Outdated" = "Obsolète"; +"Outdated — was line %lld" = "Obsolète — était la ligne %lld"; +"Outline" = "Plan"; +"PR Overview" = "Vue d'ensemble de la PR"; +"Page Down" = "Page suivante"; +"Page Setup…" = "Format d'impression…"; +"Page Up" = "Page précédente"; +"Paper size and orientation for printing" = "Format et orientation du papier pour l'impression"; +"Paste the copied snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in the file\" becomes a complete handoff — the agent deletes each note as it resolves it, and you watch the bubbles disappear." = "Collez l'extrait copié dans le fichier d'instructions de votre agent (CLAUDE.md, AGENTS.md, …) et « traite les notes de marge du fichier » suffit comme passation — l'agent supprime chaque note à mesure qu'il la traite, et vous voyez les bulles disparaître."; +"Pending review on GitHub" = "Révision en attente sur GitHub"; +"Pinned to commit %@ — the ref's tip as of this session's last fetch." = "Épinglé au commit %@ — la pointe de la référence lors de la dernière récupération de cette session."; +"Posts immediately — file comments can't join a pending review." = "Publie immédiatement — les commentaires de fichier ne peuvent pas rejoindre une révision en attente."; +"Preview First" = "Aperçu d'abord"; +"Preview First shows a file with one click without keeping it — one italicized entry (in Open Files, or under its GitHub repo) that the next preview replaces. Double-click a file, or just start editing, to keep it open. Open Fully keeps every file you click." = "Aperçu d'abord montre un fichier d'un seul clic sans le conserver — une seule entrée en italique (dans Open Files, ou sous son dépôt GitHub) que le prochain aperçu remplace. Double-cliquez un fichier, ou commencez simplement à le modifier, pour le garder ouvert. Ouvrir complètement conserve chaque fichier que vous cliquez."; +"Previous File" = "Fichier précédent"; +"Previous Markdown file in this pull request" = "Fichier Markdown précédent de cette pull request"; +"Previous match" = "Occurrence précédente"; +"Print the rendered document" = "Imprime le document rendu"; +"Print…" = "Imprimer…"; +"Private repositories, commenting, and reviewing are ready." = "Les dépôts privés, les commentaires et la révision sont prêts."; +"Pull Requests" = "Pull Requests"; +"PullMark %@ is available." = "PullMark %@ est disponible."; +"PullMark Website" = "Site web de PullMark"; +"PullMark borrows the GitHub credentials your own tools already have — the GitHub CLI or a git credential helper. It has no login of its own, stores nothing, and never sees a password." = "PullMark emprunte les identifiants GitHub que vos propres outils ont déjà — la CLI GitHub ou un assistant d'identification git. Il n'a pas de connexion à lui, ne stocke rien et ne voit jamais de mot de passe."; +"PullMark borrows the credentials your own tools already have — the GitHub CLI or a git credential helper. It has no login of its own, stores nothing, and never sees a password. [About GitHub access](https://pullmark.app/docs/troubleshooting/#github-access)" = "PullMark emprunte les identifiants que vos propres outils ont déjà — la CLI GitHub ou un assistant d'identification git. Il n'a pas de connexion à lui, ne stocke rien et ne voit jamais de mot de passe. [À propos de l'accès GitHub](https://pullmark.app/docs/troubleshooting/#github-access)"; +"PullMark can fetch this file and render it in-app, or send it to your browser. Hold ⌘ while clicking a link for the other behavior; the default lives in Settings → General." = "PullMark peut récupérer ce fichier et le rendre dans l'app, ou l'envoyer à votre navigateur. Maintenez ⌘ en cliquant un lien pour l'autre comportement ; la valeur par défaut se trouve dans Réglages → Général."; +"PullMark is in demo mode — network access is disabled." = "PullMark est en mode démo — l'accès réseau est désactivé."; +"PullMark is installed — the disk image is no longer needed. This ejects it and moves “%@” to the Trash." = "PullMark est installé — l'image disque n'est plus nécessaire. Ceci l'éjecte et place « %@ » dans la corbeille."; +"PullMark is no longer your default Markdown app." = "PullMark n'est plus votre app Markdown par défaut."; +"PullMark is running from its disk image. Moving it to Applications installs it properly and enables one-click updates." = "PullMark fonctionne depuis son image disque. Le déplacer vers Applications l'installe correctement et active les mises à jour en un clic."; +"Push to origin after committing" = "Pousser vers origin après le commit"; +"Quick Look previews:" = "Aperçus Quick Look :"; +"Raw Source" = "Source brute"; +"Re-read credentials from the GitHub CLI and git credential helpers" = "Relire les identifiants depuis la CLI GitHub et les assistants d'identification git"; +"Re-read credentials from the GitHub CLI and git credential helpers — after gh auth login, this connects without relaunching" = "Relit les identifiants depuis la CLI GitHub et les assistants d'identification git — après gh auth login, la connexion s'établit sans relancer l'app"; +"Re-read this file from disk" = "Relit ce fichier depuis le disque"; +"Reaction state unavailable — try refreshing the PR." = "État de la réaction indisponible — essayez d'actualiser la PR."; +"Reading" = "Lecture"; +"Recents" = "Récents"; +"Redo" = "Rétablir"; +"Refresh" = "Actualiser"; +"Refresh Folder" = "Actualiser le dossier"; +"Release Notes" = "Notes de version"; +"Release notes couldn't be loaded — they're also at github.com/jedijashwa/pullmark/releases." = "Impossible de charger les notes de version — elles sont aussi sur github.com/jedijashwa/pullmark/releases."; +"Reload" = "Recharger"; +"Reload Document" = "Recharger le document"; +"Remember my selection" = "Mémoriser mon choix"; +"Remote Branches" = "Branches distantes"; +"Remove from Recents" = "Retirer des récents"; +"Remove from Sidebar" = "Retirer de la barre latérale"; +"Remove the PullMark disk image?" = "Supprimer l'image disque PullMark ?"; +"Rendered" = "Rendu"; +"Rendered Diff" = "Diff rendu"; +"Reopen what was in the sidebar when PullMark last quit" = "Rouvrir ce qui était dans la barre latérale au dernier arrêt de PullMark"; +"Reopening…" = "Réouverture…"; +"Report a Bug…" = "Signaler un bug…"; +"Report an Issue…" = "Signaler un problème…"; +"Request a Feature…" = "Proposer une fonctionnalité…"; +"Required" = "Requis"; +"Reset the zoom to 100%" = "Rétablit le zoom à 100 %"; +"Restore Defaults" = "Rétablir les valeurs par défaut"; +"Restore Defaults…" = "Rétablir les valeurs par défaut…"; +"Restore all keyboard shortcuts to their defaults?" = "Rétablir tous les raccourcis clavier par défaut ?"; +"Restore files and pull requests from the last session" = "Restaurer les fichiers et pull requests de la dernière session"; +"Restore the default" = "Rétablir la valeur par défaut"; +"Restore the file as it was before PullMark's last edit" = "Rétablit le fichier tel qu'il était avant la dernière modification de PullMark"; +"Result" = "Résultat"; +"Retry" = "Réessayer"; +"Retry Upload" = "Réessayer l'envoi"; +"Return" = "Retour"; +"Reveal in Finder" = "Afficher dans le Finder"; +"Reveal in Location" = "Afficher dans Locations"; +"Reveal on GitHub" = "Afficher sur GitHub"; +"Reveal resolved review conversations in the Result view" = "Affiche les conversations de révision résolues dans la vue Résultat"; +"Revert Last Edit" = "Annuler la dernière modification"; +"Reverted the last edit to %@." = "Dernière modification de %@ annulée."; +"Review Changes…" = "Réviser les modifications…"; +"Review Requests" = "Demandes de révision"; +"Review changes" = "Réviser les modifications"; +"Review comments couldn't be loaded — existing threads may be missing." = "Impossible de charger les commentaires de révision — des fils existants peuvent manquer."; +"Review requested from %@" = "Révision demandée à %@"; +"Review required" = "Révision requise"; +"Review submitted." = "Révision envoyée."; +"Review summary (optional)" = "Résumé de la révision (facultatif)"; +"Review verdict" = "Verdict de la révision"; +"Reviewing" = "Révision"; +"Right Arrow" = "Flèche droite"; +"Runs “%@” and relaunches PullMark" = "Exécute « %@ » et relance PullMark"; +"Save the rendered document as a PDF" = "Enregistre le document rendu au format PDF"; +"Save the rendered document as a self-contained HTML file" = "Enregistre le document rendu dans un fichier HTML autonome"; +"Saved as a pending review — visible only to you until you submit" = "Enregistrée comme révision en attente — visible de vous seul jusqu'à l'envoi"; +"Search All Files…" = "Rechercher dans tous les fichiers…"; +"Search all files" = "Rechercher dans tous les fichiers"; +"See if something even newer is available" = "Voir si une version encore plus récente est disponible"; +"Set Up GitHub Access…" = "Configurer l'accès GitHub…"; +"Set Up…" = "Configurer…"; +"Set up the GitHub CLI" = "Configurer la CLI GitHub"; +"Share" = "Partager"; +"Shift" = "Majuscule"; +"Show" = "Afficher"; +"Show Alpha Features" = "Afficher les fonctionnalités alpha"; +"Show Hidden Files" = "Afficher les fichiers cachés"; +"Show Margin Notes" = "Afficher les notes de marge"; +"Show Markdown Source" = "Afficher la source Markdown"; +"Show Outline" = "Afficher le plan"; +"Show Resolved Conversations" = "Afficher les conversations résolues"; +"Show What's New after an update" = "Afficher les nouveautés après une mise à jour"; +"Show alpha features" = "Afficher les fonctionnalités alpha"; +"Show alpha features?" = "Afficher les fonctionnalités alpha ?"; +"Show hidden files" = "Afficher les fichiers cachés"; +"Show or hide the document outline" = "Afficher ou masquer le plan du document"; +"Show review discussion on the PR overview" = "Afficher la discussion de révision dans la vue d'ensemble de la PR"; +"Show review requests in the sidebar" = "Afficher les demandes de révision dans la barre latérale"; +"Show the next document" = "Affiche le document suivant"; +"Show the previous document" = "Affiche le document précédent"; +"Show the raw Markdown behind the rendered document" = "Affiche le Markdown brut derrière le document rendu"; +"Show who last changed each block (git blame)" = "Afficher qui a modifié chaque bloc en dernier (git blame)"; +"Show/Hide Hidden Files" = "Afficher/Masquer les fichiers cachés"; +"Show/Hide Margin Notes" = "Afficher/Masquer les notes de marge"; +"Show/Hide Markdown Source" = "Afficher/Masquer la source Markdown"; +"Show/Hide Outline" = "Afficher/Masquer le plan"; +"Show/Hide Resolved Conversations" = "Afficher/Masquer les conversations résolues"; +"Showing 500 of %lld changed files — Markdown files are preselected either way." = "500 des %lld fichiers modifiés sont affichés — les fichiers Markdown sont présélectionnés dans tous les cas."; +"Showing the first %lld Markdown files" = "Les %lld premiers fichiers Markdown sont affichés"; +"Sign in to GitHub" = "Se connecter à GitHub"; +"Sign notes as:" = "Signer les notes en tant que :"; +"Something went wrong" = "Une erreur s'est produite"; +"Source" = "Source"; +"Source Diff" = "Diff source"; +"Space" = "Espace"; +"Spotlight" = "Spotlight"; +"Stage and commit changes in this file's repository" = "Indexe et committe les modifications dans le dépôt de ce fichier"; +"Standard" = "Standard"; +"Submit review" = "Envoyer la révision"; +"Submit the review with the selected verdict (⌘↩)" = "Envoyer la révision avec le verdict sélectionné (⌘↩)"; +"Support PullMark ❤️" = "Soutenir PullMark ❤️"; +"Switch between light, dark, and system appearance" = "Basculer entre l'apparence claire, sombre et système"; +"Switch or Open Branch…" = "Changer ou ouvrir une branche…"; +"System" = "Système"; +"Tab" = "Tabulation"; +"Tags" = "Tags"; +"Teach your agent" = "Instruisez votre agent"; +"Tell your agent" = "Prévenez votre agent"; +"Temporarily show the raw Markdown behind the rendered document" = "Affiche temporairement le Markdown brut derrière le document rendu"; +"That link needs a different version of PullMark" = "Ce lien nécessite une autre version de PullMark"; +"The @name your notes carry — empty uses your GitHub login, or this Mac's account name when signed out" = "Le @nom que portent vos notes — vide, PullMark utilise votre login GitHub, ou le nom du compte de ce Mac hors connexion"; +"The GitHub CLI is installed but signed out. Run this in your terminal — it opens a browser to sign in:" = "La CLI GitHub est installée, mais déconnectée. Lancez ceci dans votre terminal — un navigateur s'ouvre pour la connexion :"; +"The PR session is no longer available — the draft could not be saved to disk." = "La session de la PR n'est plus disponible — le brouillon n'a pas pu être enregistré sur le disque."; +"The comment will be removed from GitHub. Replies from others will stay." = "Le commentaire sera supprimé de GitHub. Les réponses des autres resteront."; +"The document's headings, in a sidebar" = "Les titres du document, dans une barre latérale"; +"The pull request overview (%@ #%lld)" = "La vue d'ensemble de la pull request (%@ #%lld)"; +"The pullmark command is installed" = "La commande pullmark est installée"; +"Theme" = "Thème"; +"Themes restyle rendered Markdown and diffs, and follow the Light/Dark appearance. Drop .css files into the Themes folder to add your own — they apply on top of the GitHub look. Quick Look previews follow your theme too (custom themes fall back to their GitHub base there)." = "Les thèmes restylent le Markdown rendu et les diffs, et suivent l'apparence claire/sombre. Déposez des fichiers .css dans le dossier Themes pour ajouter les vôtres — ils s'appliquent par-dessus le look GitHub. Les aperçus Quick Look suivent aussi votre thème (les thèmes personnalisés y retombent sur leur base GitHub)."; +"These keys are fixed and can't be changed." = "Ces touches sont fixes et ne peuvent pas être modifiées."; +"This comment is still syncing with GitHub — try discarding it again in a moment." = "Ce commentaire est encore en cours de synchronisation avec GitHub — réessayez de le supprimer dans un instant."; +"This folder has more Markdown files than PullMark scans — open a subfolder as its own Location to see the rest" = "Ce dossier contient plus de fichiers Markdown que PullMark n'en analyse — ouvrez un sous-dossier comme Location à part pour voir le reste"; +"This pull request was updated on GitHub." = "Cette pull request a été mise à jour sur GitHub."; +"This repository has no GitHub remote." = "Ce dépôt n'a aucun remote GitHub."; +"This version (%@) doesn't know %@ — it may point at a feature from a newer release, or one that has moved. Checking for updates usually resolves it." = "Cette version (%@) ne connaît pas %@ — le lien pointe peut-être vers une fonctionnalité d'une version plus récente, ou vers une fonctionnalité qui a bougé. Rechercher les mises à jour suffit généralement à régler ça."; +"Thread state unavailable — try refreshing the PR." = "État du fil indisponible — essayez d'actualiser la PR."; +"Turn Off" = "Désactiver"; +"Up Arrow" = "Flèche haut"; +"Update Now" = "Mettre à jour"; +"Update failed: %@" = "Échec de la mise à jour : %@"; +"Updated to PullMark %@." = "Mis à jour vers PullMark %@."; +"Updates" = "Mises à jour"; +"Upload the remaining comments into your pending review on GitHub" = "Envoyer les commentaires restants dans votre révision en attente sur GitHub"; +"Use Anyway" = "Utiliser quand même"; +"Using it" = "Les utiliser"; +"View" = "Présentation"; +"View All Release Notes" = "Voir toutes les notes de version"; +"View as List" = "Afficher en liste"; +"View as Tree" = "Afficher en arborescence"; +"Viewing signed out — commenting and reviewing are unavailable" = "Consultation hors connexion — commenter et réviser sont indisponibles"; +"Walk through connecting PullMark to GitHub" = "Guide pas à pas pour connecter PullMark à GitHub"; +"What Copy GitHub Link copies — hold ⌥ in the menu for the other flavor" = "Ce que copie Copier le lien GitHub — maintenez ⌥ dans le menu pour l'autre variante"; +"What changed since the last commit, rendered like a PR diff — the toolbar's Compare button offers older revisions and branches" = "Ce qui a changé depuis le dernier commit, rendu comme un diff de PR — le bouton Comparer de la barre d'outils propose d'autres versions et branches"; +"What clicking a link to a Markdown file on GitHub does — hold ⌘ while clicking for the other behavior" = "Ce que fait un clic sur un lien vers un fichier Markdown sur GitHub — maintenez ⌘ en cliquant pour l'autre comportement"; +"What pressing space in Finder shows for Markdown files" = "Ce que la barre d'espace du Finder affiche pour les fichiers Markdown"; +"What's New" = "Nouveautés"; +"While the find bar is open" = "Tant que la barre de recherche est ouverte"; +"Whole file" = "Fichier entier"; +"Wide" = "Wide"; +"With a folder selected" = "Avec un dossier sélectionné"; +"With a local file or folder in a GitHub repository selected" = "Avec un fichier ou dossier local d'un dépôt GitHub sélectionné"; +"With a local file or folder selected" = "Avec un fichier ou dossier local sélectionné"; +"With files in Open Files" = "Avec des fichiers dans Open Files"; +"Works with private repos using your existing gh or git credentials." = "Fonctionne avec les dépôts privés grâce à vos identifiants gh ou git existants."; +"You're on %@." = "Vous êtes sur %@."; +"Your custom shortcuts will be removed. This can't be undone." = "Vos raccourcis personnalisés seront supprimés. Cette action est irréversible."; +"Zoom In" = "Zoom avant"; +"Zoom Out" = "Zoom arrière"; +"and %lld more" = "et %lld de plus"; +"confirming sheets" = "la validation des feuilles"; +"cycling windows" = "le passage d'une fenêtre à l'autre"; +"dismissing sheets" = "la fermeture des feuilles"; +"https://github.com/owner/repo/pull/123 or owner/repo#123" = "https://github.com/owner/repo/pull/123 ou owner/repo#123"; +"just now" = "à l'instant"; +"on base branch" = "sur la branche de base"; +"opened by %@" = "ouverte par %@"; +"the Help menu" = "le menu Aide"; +"the app switcher" = "le sélecteur d'apps"; +" · was {r}" = " · était {r}"; +"(empty)" = "(vide)"; +"Add a margin note" = "Ajouter une note de marge"; +"Add a suggestion" = "Ajouter une suggestion"; +"Add reaction" = "Ajouter une réaction"; +"Add single comment" = "Ajouter un seul commentaire"; +"Click the gutter for history" = "Cliquez la gouttière pour l'historique"; +"Comment actions" = "Actions du commentaire"; +"Comment on line {n}" = "Commenter la ligne {n}"; +"Comment on lines {a}–{b}" = "Commenter les lignes {a}–{b}"; +"Comment on new line {n}" = "Commenter la nouvelle ligne {n}"; +"Comment on new line {n} — shift-click extends the range" = "Commenter la nouvelle ligne {n} — maj-clic étend la plage"; +"Comment on new lines {a}–{b}" = "Commenter les nouvelles lignes {a}–{b}"; +"Comment on old line {n} — shift-click extends the range" = "Commenter l'ancienne ligne {n} — maj-clic étend la plage"; +"Comment on old lines {a}–{b}" = "Commenter les anciennes lignes {a}–{b}"; +"Comment on the pull request conversation" = "Commenter dans la conversation de la pull request"; +"Conversation" = "Conversation"; +"Copy full SHA" = "Copier le SHA complet"; +"Couldn't load this image from GitHub · " = "Impossible de charger cette image depuis GitHub · "; +"File comments" = "Commentaires sur le fichier"; +"Front matter" = "Front matter"; +"Hide {n} resolved conversation" = "Masquer {n} conversation résolue"; +"Hide {n} resolved conversations" = "Masquer {n} conversations résolues"; +"Insert a ```suggestion block pre-filled with the current lines" = "Insère un bloc ```suggestion prérempli avec les lignes actuelles"; +"LEFT" = "LEFT"; +"Leave a comment" = "Laisser un commentaire"; +"Line {n}" = "Ligne {n}"; +"Lines {a}–{b}" = "Lignes {a}–{b}"; +"Moved from line {n} — content unchanged" = "Déplacé depuis la ligne {n} — contenu inchangé"; +"Not synced" = "Non synchronisé"; +"Old line {n}" = "Ancienne ligne {n}"; +"Old lines {a}–{b}" = "Anciennes lignes {a}–{b}"; +"Open this conversation on GitHub — PullMark doesn't render this file" = "Ouvrir cette conversation sur GitHub — PullMark ne rend pas ce fichier"; +"Open {path} and jump to this conversation" = "Ouvrir {path} et aller à cette conversation"; +"Outdated review comments" = "Commentaires de révision obsolètes"; +"Pending" = "En attente"; +"Pending comment — click to expand" = "Commentaire en attente — cliquez pour déplier"; +"Pending comments — click to expand" = "Commentaires en attente — cliquez pour déplier"; +"Post to the PR conversation right away — not part of a review (⌘↩)" = "Publie tout de suite dans la conversation de la PR — hors révision (⌘↩)"; +"Reply" = "Répondre"; +"Reply to this thread (⌘↩)" = "Répondre à ce fil (⌘↩)"; +"Resolve" = "Résoudre"; +"Resolved" = "Résolue"; +"Review discussion" = "Discussion de révision"; +"Save" = "Enregistrer"; +"Save your edit (⌘↩)" = "Enregistrer votre modification (⌘↩)"; +"Show on GitHub" = "Afficher sur GitHub"; +"Show {n} resolved conversation" = "Afficher {n} conversation résolue"; +"Show {n} resolved conversations" = "Afficher {n} conversations résolues"; +"Suggested change" = "Modification suggérée"; +"Suggestions can only target new-file lines — GitHub applies them in place of the commented lines." = "Les suggestions ne peuvent viser que les lignes du nouveau fichier — GitHub les applique à la place des lignes commentées."; +"The conversation could not be loaded — retrying." = "Impossible de charger la conversation — nouvelle tentative."; +"The targeted lines aren't available to suggest an edit to." = "Les lignes visées ne permettent pas de proposer une modification."; +"This block isn't part of the pull request's diff — GitHub can only attach comments to changed lines." = "Ce bloc ne fait pas partie du diff de la pull request — GitHub ne peut attacher de commentaires qu'aux lignes modifiées."; +"This file is empty on both sides of the diff." = "Ce fichier est vide des deux côtés du diff."; +"Unresolve" = "Annuler la résolution"; +"View commit on GitHub" = "Voir le commit sur GitHub"; +"View in File" = "Voir dans le fichier"; +"Write a reply" = "Écrire une réponse"; +"Write at the end of the document" = "Écrire à la fin du document"; +"all conversations resolved" = "toutes les conversations sont résolues"; +"approved these changes" = "a approuvé ces modifications"; +"bot" = "bot"; +"copied" = "copié"; +"dismissed their review" = "a rejeté sa révision"; +"moved" = "déplacé"; +"requested changes" = "a demandé des modifications"; +"reviewed" = "a révisé"; +"whole document" = "document entier"; +"{n} comment" = "{n} commentaire"; +"{n} comments" = "{n} commentaires"; +"{n} review" = "{n} révision"; +"{n} reviews" = "{n} révisions"; +"{n} unresolved conversation" = "{n} conversation non résolue"; +"{n} unresolved conversations" = "{n} conversations non résolues"; +" · edited" = " · modifié"; +"· asks where to open" = "· demande où ouvrir"; +"· opens in PullMark" = "· ouvre dans PullMark"; +"· opens in browser" = "· ouvre dans le navigateur"; +"{n} comment — click to expand" = "{n} commentaire — cliquer pour développer"; +"{n} comments — click to expand" = "{n} commentaires — cliquer pour développer"; +"Closed" = "Fermée"; +"Draft" = "Brouillon"; +"Merged" = "Fusionnée"; +"Unavailable" = "Indisponible"; +"View on GitHub" = "Voir sur GitHub"; +"View all checks on GitHub" = "Voir toutes les vérifications sur GitHub"; +"%lld of %lld done" = "%lld sur %lld terminées"; +"%lld of %lld failing" = "%lld sur %lld en échec"; +"A clean margin, numbers on demand in Source" = "Une marge nette, les numéros à la demande dans Source"; +"A workflow is waiting for approval" = "Un workflow attend une approbation"; +"Added" = "Ajouté"; +"Changed" = "Modifié"; +"Connected" = "Connecté"; +"Copied" = "Copié"; +"Copy GitHub Branch Link" = "Copier le lien de branche GitHub"; +"Copy GitHub Permalink" = "Copier le permalien GitHub"; +"Deleted" = "Supprimé"; +"Each block's source line in the margin" = "La ligne source de chaque bloc dans la marge"; +"GitHub CLI" = "GitHub CLI"; +"Hidden" = "Masqués"; +"Language" = "Langue"; +"Language:" = "Langue :"; +"Line numbers hidden" = "Numéros de ligne masqués"; +"Line numbers shown" = "Numéros de ligne affichés"; +"Modified" = "Modifié"; +"Renamed" = "Renommé"; +"Shown" = "Affichés"; +"Takes effect after PullMark relaunches." = "Prend effet après le redémarrage de PullMark."; +"Untracked" = "Non suivi"; +"git credential helper" = "assistant d'identification git"; +"Relaunch Now" = "Relancer maintenant"; diff --git a/loc/ja.lproj/Localizable.strings b/loc/ja.lproj/Localizable.strings new file mode 100644 index 0000000..198a4ed --- /dev/null +++ b/loc/ja.lproj/Localizable.strings @@ -0,0 +1,607 @@ +/* PullMark — 日本語 (ja). One entry per key in loc/_inventory.json. + English is the key; see docs/specs/app-i18n.md. */ + +" (none)" = " (なし)"; +"%lld Markdown files changed" = "Markdown ファイル %lld 個を変更"; +"%@ and pushed to origin." = "%@。origin にプッシュしました。"; +"%@ approved" = "%@ が承認しました"; +"%@ approved %@" = "%@ が承認しました(%@)"; +"%@ changed while you were annotating — nothing was saved. The current notes are shown now." = "ノートを書いているあいだに %@ が変更されました — 何も保存されていません。いま表示されているのは現在のノートです。"; +"%@ changed while you were editing this block — nothing was saved. Re-open the block to edit the current version." = "このブロックを編集しているあいだに %@ が変更されました — 何も保存されていません。現在のバージョンを編集するには、ブロックを開き直してください。"; +"%@ does not exist at %@." = "%@ は %@ には存在しません。"; +"%lld files" = "%lld 個のファイル"; +"%@ is reserved for %@." = "%@ は「%@」に予約されています。"; +"%@ isn't available" = "%@ は利用できません"; +"%@ isn't available on %@: " = "%@ は %@ にはありません: "; +"%@ isn't in a git repository, so there's nothing to compare against." = "%@ は git リポジトリの中にないため、比較する相手がありません。"; +"%@ isn't inside a git repository." = "%@ は git リポジトリの中にありません。"; +"%lld more reviewers" = "他 %lld 名のレビュアー"; +"%lld more…" = "他 %lld 件…"; +"%lld not yet on GitHub" = "%lld 件が GitHub に未送信"; +"%lld of %lld" = "%lld / %lld"; +"%lld other files not shown" = "他の %lld 個のファイルは非表示"; +"%@ requested changes" = "%@ が変更をリクエストしました"; +"%@ requested changes %@" = "%@ が変更をリクエストしました(%@)"; +"%@ words · %lld min" = "%@ 語 · %lld 分"; +"%@ — previewing; double-click to keep it with its repo" = "%@ — プレビュー中。ダブルクリックでリポジトリのもとに残します"; +"%@, but the push failed: %@" = "%@。ただしプッシュに失敗しました: %@"; +"1 Markdown file changed" = "Markdown ファイル 1 個を変更"; +"1 file" = "1 個のファイル"; +"1 more reviewer" = "他 1 名のレビュアー"; +"1 other file not shown" = "他の 1 個のファイルは非表示"; +"Abandon review" = "レビューを破棄"; +"Abandon this review?" = "このレビューを破棄しますか?"; +"About PullMark" = "PullMark について"; +"Actual Size" = "実際のサイズ"; +"Add Margin Note" = "マージンノートを追加"; +"Add a margin note on the block you're reading" = "いま読んでいるブロックにマージンノートを追加します"; +"Adds a Review discussion section under the PR description listing every thread, with code excerpts and links" = "PR の説明の下に、すべてのスレッドをコードの抜粋とリンク付きで並べる「レビューの議論」セクションを追加します"; +"Adds a pullmark command to /usr/local/bin so you can open files and folders from the shell" = "/usr/local/bin に pullmark コマンドを追加し、シェルからファイルやフォルダを開けるようにします"; +"Adds the authoring tools — hover a block, ⌥⌘M; documents that already contain notes always show them either way" = "書くための道具を追加します — ブロックにホバー、⌥⌘M。すでにノートを含む文書は、どちらの設定でも表示されます"; +"After navigating between documents" = "文書間を移動したあと"; +"All pending comments and the summary will be discarded, on GitHub too." = "保留中のコメントと要約は、GitHub 上のものも含めてすべて破棄されます。"; +"Alpha features are the frontier: their behavior and data formats may change incompatibly between versions, transitions may not be supported, and a feature may be removed entirely. Use them at your own risk." = "アルファ機能は最前線です。ふるまいやデータ形式がバージョン間で互換性なく変わることがあり、移行がサポートされない場合も、機能がまるごと取り除かれる場合もあります。自己責任でお使いください。"; +"Already use a git credential helper (macOS keychain, Git Credential Manager)? PullMark finds it automatically — Check Again will confirm." = "すでに git の認証情報ヘルパー(macOS キーチェーン、Git Credential Manager)をお使いですか? PullMark が自動的に見つけます — 「再確認」で確かめられます。"; +"Anything Git can resolve works: a branch, a tag, or a commit. Leave the new side empty to compare the working file." = "Git が解決できるものなら何でも使えます。ブランチ、タグ、コミット。新しい側を空のままにすると、作業中のファイルと比較します。"; +"Appearance" = "外観"; +"Applies to the whole file, not a specific line" = "特定の行ではなく、ファイル全体に付きます"; +"Approved" = "承認済み"; +"Ask on first click" = "最初のクリックで確認"; +"Awaiting review from %@" = "%@ のレビュー待ち"; +"Back" = "戻る"; +"Blame" = "Blame"; +"Branch name" = "ブランチ名"; +"Branches" = "ブランチ"; +"Branches and worktrees" = "ブランチとワークツリー"; +"Browse Repo Files" = "リポジトリのファイルをブラウズ"; +"Browse Repo Files…" = "リポジトリのファイルをブラウズ…"; +"Built-In Keys" = "組み込みのキー"; +"Cancel" = "キャンセル"; +"Changes requested" = "変更をリクエスト済み"; +"Check Again" = "再確認"; +"Check for Updates" = "アップデートを確認"; +"Check for Updates…" = "アップデートを確認…"; +"Checking this Mac's credentials…" = "この Mac の認証情報を確認しています…"; +"Checking…" = "確認中…"; +"Checkout of %@/%@" = "%@/%@ のチェックアウト"; +"Checks awaiting approval" = "チェックの承認待ち"; +"Checks failed" = "チェック失敗"; +"Checks passed" = "チェック成功"; +"Checks running" = "チェック実行中"; +"Choose the file to compare with — it becomes the old side." = "比較する相手のファイルを選びます — そちらが古い側になります。"; +"Choose which items the toolbar shows, and their order" = "ツールバーに表示する項目とその順序を選びます"; +"Clear Menu" = "メニューを消去"; +"Clear Recents" = "最近使った項目を消去"; +"Click a shortcut, or select a row and press Return, then type the new keys. Press Delete to remove a shortcut, Esc to cancel." = "ショートカットをクリックするか、行を選んで Return を押してから、新しいキーを入力します。Delete で割り当てを外し、Esc で取り消します。"; +"Click to type a zoom level" = "クリックでズーム率を入力"; +"Clicking files in Locations:" = "Locations 内のファイルをクリックしたとき:"; +"Close" = "閉じる"; +"Close All" = "すべて閉じる"; +"Close All Files" = "すべてのファイルを閉じる"; +"Command" = "コマンド"; +"Comment" = "コメント"; +"Comment on %@" = "%@ にコメント"; +"Comment on File" = "ファイルにコメント"; +"Comment on any local Markdown document the way you'd comment on a PR. Notes save into the file itself as `` comments — ordinary HTML comments that stay out of rendered Markdown, shown by PullMark as bubbles pinned to their spot, and written so agents can read and act on them. [How margin notes work](https://pullmark.app/docs/experimental/margin-notes/)" = "ローカルのどんな Markdown 文書にも、PR にコメントするのと同じ感覚でコメントできます。ノートは `` というコメントとしてファイル自体に保存されます — レンダリングされた Markdown には現れないごく普通の HTML コメントで、PullMark はそれをその場所に留めた吹き出しとして表示します。エージェントが読んで対応できるように書かれています。[マージンノートの仕組み](https://pullmark.app/docs/experimental/margin-notes/)"; +"Comment on any local Markdown document the way you'd comment on a PR. Notes save into the file itself as `` comments — ordinary HTML comments that stay out of rendered Markdown, shown by PullMark as bubbles pinned to their spot. Deleting a note is how it's resolved." = "ローカルのどんな Markdown 文書にも、PR にコメントするのと同じ感覚でコメントできます。ノートは `` というコメントとしてファイル自体に保存されます — レンダリングされた Markdown には現れないごく普通の HTML コメントで、PullMark はそれをその場所に留めた吹き出しとして表示します。ノートを削除することが、解決するということです。"; +"Comment on this file as a whole, not a specific line" = "特定の行ではなく、ファイル全体にコメントします"; +"Commit Changes" = "変更をコミット"; +"Commit Changes…" = "変更をコミット…"; +"Commit message" = "コミットメッセージ"; +"Commit to %@" = "%@ にコミット"; +"Commit to a new branch" = "新しいブランチにコミット"; +"Committed %lld files" = "%lld 個のファイルをコミットしました"; +"Committed %lld files on new branch “%@”" = "%lld 個のファイルを新しいブランチ「%@」にコミットしました"; +"Committed 1 file" = "1 個のファイルをコミットしました"; +"Committed 1 file on new branch “%@”" = "1 個のファイルを新しいブランチ「%@」にコミットしました"; +"Compare" = "比較"; +"Compare Revisions" = "リビジョンを比較"; +"Comparing " = "比較中: "; +"Comparing with %@" = "%@ と比較中"; +"Connection status…" = "接続状況…"; +"Content Width" = "本文幅"; +"Content width" = "本文幅"; +"Control" = "コントロール"; +"Copies instructions for CLAUDE.md / AGENTS.md — how to read margin notes and delete them as they're addressed" = "CLAUDE.md / AGENTS.md 向けの指示をコピーします — マージンノートの読み方と、対応したノートを削除するやり方です"; +"Copies the Markdown source of the selected blocks (whole blocks — or the whole document when nothing is selected)" = "選択したブロックの Markdown ソースをコピーします(ブロック単位で、何も選択していなければ文書全体)"; +"Copies “%@” to the clipboard" = "「%@」をクリップボードにコピーします"; +"Copy" = "コピー"; +"Copy %@ to the clipboard" = "%@ をクリップボードにコピー"; +"Copy GitHub Link" = "GitHub リンクをコピー"; +"Copy GitHub links as:" = "GitHub リンクの形式:"; +"Copy Path" = "パスをコピー"; +"Copy as Markdown" = "Markdown としてコピー"; +"Could not abandon the review: %@" = "レビューを破棄できませんでした: %@"; +"Could not create the PDF: %@" = "PDF を作成できませんでした: %@"; +"Could not delete the comment: %@" = "コメントを削除できませんでした: %@"; +"Could not discard the pending comment: %@" = "保留中のコメントを破棄できませんでした: %@"; +"Could not post the comment — the PR session is no longer available. Your text was kept as a draft." = "コメントを投稿できませんでした — PR セッションはもう利用できません。入力内容は下書きとして保存しました。"; +"Could not post the comment: %@" = "コメントを投稿できませんでした: %@"; +"Could not post the reply — the PR session is no longer available. Your text was kept as a draft." = "返信を投稿できませんでした — PR セッションはもう利用できません。入力内容は下書きとして保存しました。"; +"Could not post the reply: %@" = "返信を投稿できませんでした: %@"; +"Could not read %@." = "%@ を読み込めませんでした。"; +"Could not read the rendered page." = "レンダリングされたページを読み込めませんでした。"; +"Could not refresh %@: %@" = "%@ を更新できませんでした: %@"; +"Could not save %@: %@" = "%@ を保存できませんでした: %@"; +"Could not save the edit: %@" = "編集を保存できませんでした: %@"; +"Could not update the reaction: %@" = "リアクションを更新できませんでした: %@"; +"Could not upload %lld pending comments to GitHub — kept locally for retry. %@" = "保留中のコメント %lld 件を GitHub にアップロードできませんでした — 再試行のためローカルに保持しています。%@"; +"Could not upload 1 pending comment to GitHub — kept locally for retry. %@" = "保留中のコメント 1 件を GitHub にアップロードできませんでした — 再試行のためローカルに保持しています。%@"; +"Couldn't move PullMark" = "PullMark を移動できませんでした"; +"Couldn't open %@/%@#%lld: " = "%@/%@#%lld を開けませんでした: "; +"Couldn't open %@: %@" = "%@ を開けませんでした: %@"; +"Couldn't open %@: %@. It may not exist at that ref, or it may be a private repository your GitHub credentials can't access." = "%@ を開けませんでした: %@。その ref には存在しないか、いまの GitHub 認証情報ではアクセスできないプライベートリポジトリかもしれません。"; +"Couldn't revert: %@" = "元に戻せませんでした: %@"; +"Couldn't save %@: " = "%@ を保存できませんでした: "; +"Couldn't save %@: %@" = "%@ を保存できませんでした: %@"; +"Current branch" = "現在のブランチ"; +"Custom themes" = "カスタムテーマ"; +"Customize Toolbar…" = "ツールバーをカスタマイズ…"; +"Dark" = "ダーク"; +"Default diff layout:" = "差分の初期レイアウト:"; +"Delete" = "削除"; +"Delete comment" = "コメントを削除"; +"Delete this comment?" = "このコメントを削除しますか?"; +"Determining how this copy was installed…" = "このコピーのインストール方法を調べています…"; +"Discard the pending review and all its comments, on GitHub too" = "保留中のレビューとそのコメントを、GitHub 上のものも含めて破棄します"; +"Dismiss" = "閉じる"; +"Dismiss Preview" = "プレビューを閉じる"; +"Dismiss — PullMark won't ask again unless you make it the default" = "閉じる — デフォルトにしない限り、PullMark はもう尋ねません"; +"Dismiss — this version won't be suggested again" = "閉じる — このバージョンはもう案内されません"; +"Don't ask again for this repository" = "このリポジトリではもう尋ねない"; +"Done" = "完了"; +"Dotfiles and hidden folders in Locations — like ⇧⌘. in Finder" = "Locations 内のドットファイルと隠しフォルダ — Finder の ⇧⌘. と同じです"; +"Dotfiles and hidden folders in Locations — ⇧⌘. toggles this too, like Finder" = "Locations 内のドットファイルと隠しフォルダ — Finder と同じく ⇧⌘. でも切り替えられます"; +"Down Arrow" = "下矢印"; +"Download" = "ダウンロード"; +"Downloads the update, verifies its signature, and installs it in place" = "アップデートをダウンロードし、署名を検証して、その場にインストールします"; +"Drag PullMark to Applications in the Finder instead. (%@)" = "代わりに Finder で PullMark を「アプリケーション」にドラッグしてください。(%@)"; +"Each block's starting source line, in the margin of rendered documents and diffs — hover a number for the block's full range. Rendered text wraps freely, so numbering is per block, not per visual line. The raw source view always shows its own line numbers." = "レンダリングされた文書と差分の余白に、各ブロックの開始ソース行を表示します — 番号にホバーすると、そのブロックの範囲全体が分かります。レンダリングされたテキストは自由に折り返すので、番号は表示行ごとではなくブロックごとです。生ソースのビューは、つねに自前の行番号を表示します。"; +"Edit" = "編集"; +"Edit Mode" = "編集モード"; +"Enable margin notes" = "マージンノートを有効にする"; +"End" = "End"; +"Escape" = "Escape"; +"Every release's notes, up to the version you're running" = "いま動いているバージョンまでの、すべてのリリースのノート"; +"Exact commit (permalink)" = "特定のコミット(パーマリンク)"; +"Expand All" = "すべて展開"; +"Experimental" = "実験的機能"; +"Export as HTML…" = "HTML として書き出す…"; +"Export as PDF…" = "PDF として書き出す…"; +"Features land here before their design is settled. **Beta** features get a real compatibility effort between versions and are likely to graduate. **Alpha** features carry no guarantees: they may change incompatibly, their data formats may not migrate, and they may disappear entirely. [About experimental features](https://pullmark.app/docs/experimental/)" = "設計が固まる前に、機能はまずここに着地します。**ベータ**の機能はバージョン間の互換性に本気で取り組んでおり、卒業する見込みも高いものです。**アルファ**の機能には何の保証もありません。互換性なく変わることも、データ形式が移行できないことも、まるごと消えることもあります。[実験的機能について](https://pullmark.app/docs/experimental/)"; +"Features land here before their design is settled. **Beta** features get a real compatibility effort between versions and are likely to graduate. [About experimental features](https://pullmark.app/docs/experimental/)" = "設計が固まる前に、機能はまずここに着地します。**ベータ**の機能はバージョン間の互換性に本気で取り組んでおり、卒業する見込みも高いものです。[実験的機能について](https://pullmark.app/docs/experimental/)"; +"File" = "ファイル"; +"File Margin Note…" = "ファイル全体のマージンノート…"; +"Fill in a known branch, tag, or commit" = "既知のブランチ、タグ、コミットを入力します"; +"Find Next" = "次を検索"; +"Find Previous" = "前を検索"; +"Find in Page" = "ページ内を検索"; +"Find in page" = "ページ内を検索"; +"Finish your review · %lld" = "レビューを完了 · %lld"; +"Finish your review — 1 pending comment" = "レビューを完了 — 保留中のコメント 1 件"; +"Finish your review — %lld pending comments" = "レビューを完了 — 保留中のコメント %lld 件"; +"Flip Diff Layout" = "差分レイアウトを切り替え"; +"Forward" = "進む"; +"Forward Delete" = "前方削除"; +"Full Width" = "Full Width"; +"General" = "一般"; +"GitHub" = "GitHub"; +"GitHub API error (%lld): %@" = "GitHub API エラー(%lld): %@"; +"GitHub Access" = "GitHub へのアクセス"; +"GitHub Markdown links:" = "GitHub の Markdown リンク:"; +"Go" = "移動"; +"Hide Hidden Files" = "隠しファイルを非表示"; +"Hide Margin Notes" = "マージンノートを非表示"; +"Hide Markdown Source" = "Markdown ソースを非表示"; +"Hide Outline" = "アウトラインを非表示"; +"Hide Resolved Conversations" = "解決済みの会話を非表示"; +"Hide review requests with no Markdown files — PullMark has nothing to show for them" = "Markdown ファイルを含まないレビューリクエストを隠します — PullMark に見せられるものがないからです"; +"History" = "履歴"; +"Home" = "Home"; +"Hover any block for the note bubble (select text first to quote it), or press ⌥⌘M. Edit and delete from each bubble; deleting a note is how it's resolved. Open Files rows show a count chip while a document still carries notes, and View → Hide Margin Notes clears the page for clean reading." = "どれかのブロックにホバーするとノートの吹き出しが出ます(先にテキストを選択すれば引用されます)。⌥⌘M でも構いません。編集と削除は各吹き出しから。ノートを削除することが、解決するということです。文書がまだノートを抱えているあいだ、Open Files の行には件数のチップが付き、表示 → マージンノートを非表示 はきれいに読むためにページを片づけます。"; +"How far text may stretch before it wraps. Standard keeps the classic book-like measure; Wide fits more on screen and still caps the line length; Full Width gives the document the whole window — handy in full screen. Applies everywhere, live, and plays with any theme." = "折り返すまでにテキストがどこまで広がるか。Standard は本のような古典的な行長を保ち、Wide は行長に上限を残したまま画面に載る量を増やし、Full Width は文書にウィンドウ全体を与えます — フルスクリーンで重宝します。どこにでもその場で効き、どのテーマとも素直に組み合わさります。"; +"How wide the rendered text column runs" = "レンダリングされたテキスト段の幅"; +"In a local document" = "ローカル文書で"; +"In a pull request" = "プルリクエストで"; +"In a pull request file" = "プルリクエストのファイルで"; +"In a pull request file's Result view" = "プルリクエストのファイルの「結果」ビューで"; +"Install pullmark Command…" = "pullmark コマンドをインストール…"; +"Jump to another Markdown file in this pull request" = "このプルリクエスト内の別の Markdown ファイルへジャンプします"; +"Jump to any file, heading, or pull request" = "ファイル、見出し、プルリクエストへジャンプします"; +"Jump to the GitHub connection section" = "GitHub 接続のセクションへジャンプします"; +"Keep" = "残す"; +"Keep Open" = "開いたままにする"; +"Keep Using" = "使い続ける"; +"Keyboard" = "キーボード"; +"Large repo — not all files shown" = "大きなリポジトリ — すべてのファイルは表示されていません"; +"Last seen at %@. " = "最後に見かけたのは %@ でした。 "; +"Layout" = "レイアウト"; +"Left Arrow" = "左矢印"; +"Light" = "ライト"; +"Light, Dark, or match the system — the window and every rendered page follow, and each theme brings its own light and dark looks." = "ライト、ダーク、またはシステムに合わせる — ウィンドウもレンダリングされたページもそれに従い、テーマはそれぞれ自前のライトとダークの姿を持っています。"; +"Line %lld (new)" = "%lld 行目 (新)"; +"Line %lld (old)" = "%lld 行目 (旧)"; +"Line numbers" = "行番号"; +"Loading repo files…" = "リポジトリのファイルを読み込んでいます…"; +"Locations" = "Locations"; +"Make Default Again" = "もう一度デフォルトにする"; +"Make PullMark the Default" = "PullMark をデフォルトにする"; +"Make the document bigger" = "文書を大きくします"; +"Make the document bigger — text, images, and the content column scale together" = "文書を大きくします — テキストも画像も本文の段も一緒に拡大します"; +"Make the document smaller" = "文書を小さくします"; +"Make the page writable — then click any block" = "ページを書き込み可能にします — あとはどれかのブロックをクリック"; +"Make this choice the default for GitHub Markdown links" = "この選択を GitHub の Markdown リンクのデフォルトにする"; +"Margin Notes" = "マージンノート"; +"Margin notes are experimental (beta): the design may still shift between versions, and Settings → Experimental turns them off any time. [How margin notes work](https://pullmark.app/docs/experimental/margin-notes/)" = "マージンノートは実験的機能(ベータ)です。設計はバージョン間でまだ動くことがあり、設定 → 実験的機能からいつでもオフにできます。[マージンノートの仕組み](https://pullmark.app/docs/experimental/margin-notes/)"; +"Margin notes are hidden — choose View → Show Margin Notes first." = "マージンノートは隠れています — 先に 表示 → マージンノートを表示 を選んでください。"; +"Margin notes are off — turn them back on in Settings → Experimental." = "マージンノートはオフです — 設定 → 実験的機能 でオンに戻せます。"; +"Margin notes are off — turn them on in Settings → Experimental." = "マージンノートはオフです — オンにするのは 設定 → 実験的機能 です。"; +"Margin-note bubbles ( comments) in rendered documents" = "レンダリングされた文書の中の、マージンノートの吹き出し( コメント)"; +"Markdown files open in PullMark" = "Markdown ファイルを PullMark で開く"; +"Mission Control" = "Mission Control"; +"Move PullMark to your Applications folder?" = "PullMark を「アプリケーション」フォルダに移動しますか?"; +"Move to Applications" = "「アプリケーション」に移動"; +"Move to Trash" = "ゴミ箱に入れる"; +"Next File" = "次のファイル"; +"Next Markdown file in this pull request" = "このプルリクエストの次の Markdown ファイル"; +"Next match" = "次の一致"; +"No Markdown files found in %@." = "%@ に Markdown ファイルが見つかりませんでした。"; +"No changes to commit." = "コミットする変更はありません。"; +"No headings" = "見出しがありません"; +"None" = "なし"; +"Not Now" = "今はしない"; +"Not a Homebrew user? [Download the CLI from cli.github.com](https://cli.github.com), then sign in the same way." = "Homebrew を使っていませんか? [cli.github.com から CLI をダウンロード](https://cli.github.com)して、同じ手順でサインインしてください。"; +"Not available in this build" = "このビルドでは利用できません"; +"Not connected" = "未接続"; +"Not connected to GitHub — private repositories and reviewing are unavailable." = "GitHub に接続していません — プライベートリポジトリとレビューは利用できません。"; +"Notes are written so agents can read and act on them. Paste the snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in this file\" becomes a complete handoff." = "ノートは、エージェントが読んで対応できるように書かれています。スニペットをエージェントの指示ファイル(CLAUDE.md、AGENTS.md、…)に貼り付ければ、「このファイルのマージンノートに対応して」だけで受け渡しが完結します。"; +"OK" = "OK"; +"Off shows a quiet banner instead — the notes stay one click away" = "オフにすると控えめなバナーに変わります — ノートはワンクリック先のままです"; +"Only requests that change Markdown" = "Markdown を変更するリクエストのみ"; +"Open" = "開く"; +"Open Branch Separately" = "ブランチを別に開く"; +"Open File or Folder" = "ファイルまたはフォルダを開く"; +"Open Files" = "Open Files"; +"Open File…" = "ファイルを開く…"; +"Open Folder…" = "フォルダを開く…"; +"Open Fully" = "完全に開く"; +"Open GitHub Markdown links in PullMark?" = "GitHub の Markdown リンクを PullMark で開きますか?"; +"Open Markdown files" = "Markdown ファイルを開きます"; +"Open Markdown files or a folder containing them" = "Markdown ファイル、またはそれを含むフォルダを開きます"; +"Open Pull Request" = "プルリクエストを開く"; +"Open Pull Request…" = "プルリクエストを開く…"; +"Open Quickly — files, headings, pull requests, or paths" = "クイックオープン — ファイル、見出し、プルリクエスト、パス"; +"Open Quickly…" = "クイックオープン…"; +"Open Recent" = "最近使った項目を開く"; +"Open Release Page" = "リリースページを開く"; +"Open Themes Folder" = "Themes フォルダを開く"; +"Open Worktree" = "ワークツリーを開く"; +"Open a GitHub pull request" = "GitHub のプルリクエストを開きます"; +"Open a Markdown file or a GitHub pull request" = "Markdown ファイル、または GitHub のプルリクエストを開きます"; +"Open a folder containing Markdown files" = "Markdown ファイルを含むフォルダを開きます"; +"Open files, folders, and worktrees from the shell — [about the pullmark command](https://pullmark.app/docs/cli/)." = "シェルからファイル・フォルダ・ワークツリーを開きます — [pullmark コマンドについて](https://pullmark.app/docs/cli/)。"; +"Open in Browser" = "ブラウザで開く"; +"Open in PullMark" = "PullMark で開く"; +"Open local Markdown files or a folder" = "ローカルの Markdown ファイルまたはフォルダを開きます"; +"Open on GitHub" = "GitHub で開く"; +"Open pull requests where your review is requested" = "あなたのレビューが求められているオープンなプルリクエスト"; +"Open the review — pending comments, summary, and verdict" = "レビューを開きます — 保留中のコメント、要約、判定"; +"Opens the release page on GitHub" = "GitHub のリリースページを開きます"; +"Opens the release page on GitHub to update manually" = "手動で更新するために GitHub のリリースページを開きます"; +"Open…" = "開く…"; +"Option" = "オプション"; +"Outdated" = "古い"; +"Outdated — was line %lld" = "古い — 元は %lld 行目"; +"Outline" = "アウトライン"; +"PR Overview" = "PR の概要"; +"Page Down" = "Page Down"; +"Page Setup…" = "ページ設定…"; +"Page Up" = "Page Up"; +"Paper size and orientation for printing" = "プリント時の用紙サイズと向き"; +"Paste the copied snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in the file\" becomes a complete handoff — the agent deletes each note as it resolves it, and you watch the bubbles disappear." = "コピーしたスニペットをエージェントの指示ファイル(CLAUDE.md、AGENTS.md、…)に貼り付ければ、「このファイルのマージンノートに対応して」だけで受け渡しが完結します — エージェントは解決したノートを次々と削除し、吹き出しが目の前で消えていきます。"; +"Pending review on GitHub" = "GitHub 上の保留中のレビュー"; +"Pinned to commit %@ — the ref's tip as of this session's last fetch." = "コミット %@ に固定されています — このセッションが最後に取得した時点の ref の先端です。"; +"Posts immediately — file comments can't join a pending review." = "すぐに投稿されます — ファイルへのコメントは保留中のレビューに加えられません。"; +"Preview First" = "プレビュー優先"; +"Preview First shows a file with one click without keeping it — one italicized entry (in Open Files, or under its GitHub repo) that the next preview replaces. Double-click a file, or just start editing, to keep it open. Open Fully keeps every file you click." = "「プレビュー優先」は、クリック 1 回でファイルを見せながら、手元には残しません — 斜体の項目がひとつ(Open Files、またはその GitHub リポジトリの下に)現れ、次のプレビューがそれを置き換えます。ファイルをダブルクリックするか、編集を始めるだけで、開いたままになります。「完全に開く」は、クリックしたファイルをすべて残します。"; +"Previous File" = "前のファイル"; +"Previous Markdown file in this pull request" = "このプルリクエストの前の Markdown ファイル"; +"Previous match" = "前の一致"; +"Print the rendered document" = "レンダリングされた文書をプリントします"; +"Print…" = "プリント…"; +"Private repositories, commenting, and reviewing are ready." = "プライベートリポジトリ、コメント、レビューの準備ができました。"; +"Pull Requests" = "プルリクエスト"; +"PullMark %@ is available." = "PullMark %@ が利用できます。"; +"PullMark Website" = "PullMark の Web サイト"; +"PullMark borrows the GitHub credentials your own tools already have — the GitHub CLI or a git credential helper. It has no login of its own, stores nothing, and never sees a password." = "PullMark は、あなたの道具がすでに持っている GitHub の認証情報を借ります — GitHub CLI か、git の認証情報ヘルパーです。自前のログインは持たず、何も保存せず、パスワードを目にすることもありません。"; +"PullMark borrows the credentials your own tools already have — the GitHub CLI or a git credential helper. It has no login of its own, stores nothing, and never sees a password. [About GitHub access](https://pullmark.app/docs/troubleshooting/#github-access)" = "PullMark は、あなたの道具がすでに持っている認証情報を借ります — GitHub CLI か、git の認証情報ヘルパーです。自前のログインは持たず、何も保存せず、パスワードを目にすることもありません。[GitHub へのアクセスについて](https://pullmark.app/docs/troubleshooting/#github-access)"; +"PullMark can fetch this file and render it in-app, or send it to your browser. Hold ⌘ while clicking a link for the other behavior; the default lives in Settings → General." = "PullMark はこのファイルを取得してアプリ内でレンダリングすることも、ブラウザに渡すこともできます。リンクをクリックするときに ⌘ を押していれば、もう一方のふるまいになります。デフォルトは 設定 → 一般 にあります。"; +"PullMark is in demo mode — network access is disabled." = "PullMark はデモモードです — ネットワークアクセスは無効になっています。"; +"PullMark is installed — the disk image is no longer needed. This ejects it and moves “%@” to the Trash." = "PullMark はインストール済みです — このディスクイメージはもう必要ありません。取り出して、「%@」をゴミ箱に入れます。"; +"PullMark is no longer your default Markdown app." = "PullMark は Markdown のデフォルトアプリではなくなりました。"; +"PullMark is running from its disk image. Moving it to Applications installs it properly and enables one-click updates." = "PullMark はディスクイメージから実行されています。「アプリケーション」に移動すればきちんとインストールされ、ワンクリックのアップデートも使えるようになります。"; +"Push to origin after committing" = "コミット後に origin へプッシュ"; +"Quick Look previews:" = "Quick Look のプレビュー:"; +"Raw Source" = "生ソース"; +"Re-read credentials from the GitHub CLI and git credential helpers" = "GitHub CLI と git の認証情報ヘルパーから認証情報を読み直します"; +"Re-read credentials from the GitHub CLI and git credential helpers — after gh auth login, this connects without relaunching" = "GitHub CLI と git の認証情報ヘルパーから認証情報を読み直します — gh auth login のあとなら、再起動なしで接続します"; +"Re-read this file from disk" = "このファイルをディスクから読み直します"; +"Reaction state unavailable — try refreshing the PR." = "リアクションの状態を取得できません — PR を更新してみてください。"; +"Reading" = "読む"; +"Recents" = "最近使った項目"; +"Redo" = "やり直す"; +"Refresh" = "更新"; +"Refresh Folder" = "フォルダを更新"; +"Release Notes" = "リリースノート"; +"Release notes couldn't be loaded — they're also at github.com/jedijashwa/pullmark/releases." = "リリースノートを読み込めませんでした — github.com/jedijashwa/pullmark/releases にもあります。"; +"Reload" = "再読み込み"; +"Reload Document" = "文書を再読み込み"; +"Remember my selection" = "選択を記憶する"; +"Remote Branches" = "リモートブランチ"; +"Remove from Recents" = "最近使った項目から取り除く"; +"Remove from Sidebar" = "サイドバーから取り除く"; +"Remove the PullMark disk image?" = "PullMark のディスクイメージを取り除きますか?"; +"Rendered" = "レンダリング"; +"Rendered Diff" = "レンダリング差分"; +"Reopen what was in the sidebar when PullMark last quit" = "PullMark を最後に終了したとき、サイドバーにあったものを開き直します"; +"Reopening…" = "開き直しています…"; +"Report a Bug…" = "バグを報告…"; +"Report an Issue…" = "問題を報告…"; +"Request a Feature…" = "機能をリクエスト…"; +"Required" = "必須"; +"Reset the zoom to 100%" = "ズームを 100% に戻します"; +"Restore Defaults" = "デフォルトに戻す"; +"Restore Defaults…" = "デフォルトに戻す…"; +"Restore all keyboard shortcuts to their defaults?" = "すべてのキーボードショートカットをデフォルトに戻しますか?"; +"Restore files and pull requests from the last session" = "前回のセッションのファイルとプルリクエストを復元する"; +"Restore the default" = "デフォルトに戻す"; +"Restore the file as it was before PullMark's last edit" = "PullMark の最後の編集より前の状態にファイルを戻します"; +"Result" = "結果"; +"Retry" = "再試行"; +"Retry Upload" = "アップロードを再試行"; +"Return" = "Return"; +"Reveal in Finder" = "Finder に表示"; +"Reveal in Location" = "Location 内に表示"; +"Reveal on GitHub" = "GitHub で表示"; +"Reveal resolved review conversations in the Result view" = "解決済みのレビュー会話を「結果」ビューに表示します"; +"Revert Last Edit" = "最後の編集を元に戻す"; +"Reverted the last edit to %@." = "%@ の最後の編集を元に戻しました。"; +"Review Changes…" = "変更をレビュー…"; +"Review Requests" = "レビューリクエスト"; +"Review changes" = "変更をレビュー"; +"Review comments couldn't be loaded — existing threads may be missing." = "レビューコメントを読み込めませんでした — 既存のスレッドが表示されていない可能性があります。"; +"Review requested from %@" = "%@ にレビューを依頼済み"; +"Review required" = "レビューが必要"; +"Review submitted." = "レビューを送信しました。"; +"Review summary (optional)" = "レビューの要約(任意)"; +"Review verdict" = "レビューの判定"; +"Reviewing" = "レビューする"; +"Right Arrow" = "右矢印"; +"Runs “%@” and relaunches PullMark" = "「%@」を実行して PullMark を再起動します"; +"Save the rendered document as a PDF" = "レンダリングされた文書を PDF として保存します"; +"Save the rendered document as a self-contained HTML file" = "レンダリングされた文書を、単体で完結する HTML ファイルとして保存します"; +"Saved as a pending review — visible only to you until you submit" = "保留中のレビューとして保存されました — 送信するまであなたにしか見えません"; +"Search All Files…" = "すべてのファイルを検索…"; +"Search all files" = "すべてのファイルを検索"; +"See if something even newer is available" = "さらに新しいものが出ていないか確認します"; +"Set Up GitHub Access…" = "GitHub へのアクセスを設定…"; +"Set Up…" = "設定…"; +"Set up the GitHub CLI" = "GitHub CLI を設定する"; +"Share" = "共有"; +"Shift" = "シフト"; +"Show" = "表示"; +"Show Alpha Features" = "アルファ機能を表示"; +"Show Hidden Files" = "隠しファイルを表示"; +"Show Margin Notes" = "マージンノートを表示"; +"Show Markdown Source" = "Markdown ソースを表示"; +"Show Outline" = "アウトラインを表示"; +"Show Resolved Conversations" = "解決済みの会話を表示"; +"Show What's New after an update" = "アップデート後に「新機能」を表示する"; +"Show alpha features" = "アルファ機能を表示"; +"Show alpha features?" = "アルファ機能を表示しますか?"; +"Show hidden files" = "隠しファイルを表示"; +"Show or hide the document outline" = "文書のアウトラインを表示/非表示にします"; +"Show review discussion on the PR overview" = "PR の概要にレビューの議論を表示する"; +"Show review requests in the sidebar" = "サイドバーにレビューリクエストを表示する"; +"Show the next document" = "次の文書を表示します"; +"Show the previous document" = "前の文書を表示します"; +"Show the raw Markdown behind the rendered document" = "レンダリングされた文書の背後にある生の Markdown を表示します"; +"Show who last changed each block (git blame)" = "各ブロックを最後に変えたのは誰かを表示します(git blame)"; +"Show/Hide Hidden Files" = "隠しファイルの表示/非表示"; +"Show/Hide Margin Notes" = "マージンノートの表示/非表示"; +"Show/Hide Markdown Source" = "Markdown ソースの表示/非表示"; +"Show/Hide Outline" = "アウトラインの表示/非表示"; +"Show/Hide Resolved Conversations" = "解決済みの会話の表示/非表示"; +"Showing 500 of %lld changed files — Markdown files are preselected either way." = "変更された %lld 個のファイルのうち 500 個を表示しています — どのみち Markdown ファイルはあらかじめ選択されます。"; +"Showing the first %lld Markdown files" = "最初の %lld 個の Markdown ファイルを表示しています"; +"Sign in to GitHub" = "GitHub にサインインする"; +"Sign notes as:" = "ノートの署名:"; +"Something went wrong" = "問題が発生しました"; +"Source" = "ソース"; +"Source Diff" = "ソース差分"; +"Space" = "スペース"; +"Spotlight" = "Spotlight"; +"Stage and commit changes in this file's repository" = "このファイルのリポジトリで変更をステージしてコミットします"; +"Standard" = "Standard"; +"Submit review" = "レビューを送信"; +"Submit the review with the selected verdict (⌘↩)" = "選んだ判定でレビューを送信します (⌘↩)"; +"Support PullMark ❤️" = "PullMark を応援する ❤️"; +"Switch between light, dark, and system appearance" = "ライト・ダーク・システムの外観を切り替えます"; +"Switch or Open Branch…" = "ブランチを切り替える/開く…"; +"System" = "システム"; +"Tab" = "Tab"; +"Tags" = "タグ"; +"Teach your agent" = "エージェントに教える"; +"Tell your agent" = "エージェントに伝える"; +"Temporarily show the raw Markdown behind the rendered document" = "レンダリングされた文書の背後にある生の Markdown を一時的に表示します"; +"That link needs a different version of PullMark" = "そのリンクには別のバージョンの PullMark が必要です"; +"The @name your notes carry — empty uses your GitHub login, or this Mac's account name when signed out" = "ノートに入る @name — 空にすると GitHub のログイン名、サインアウト中はこの Mac のアカウント名を使います"; +"The GitHub CLI is installed but signed out. Run this in your terminal — it opens a browser to sign in:" = "GitHub CLI はインストール済みですが、サインアウトしています。ターミナルでこれを実行してください — ブラウザが開いてサインインできます:"; +"The PR session is no longer available — the draft could not be saved to disk." = "PR セッションはもう利用できません — 下書きをディスクに保存できませんでした。"; +"The comment will be removed from GitHub. Replies from others will stay." = "コメントは GitHub から削除されます。他の人の返信は残ります。"; +"The document's headings, in a sidebar" = "文書の見出しを、サイドバーに"; +"The pull request overview (%@ #%lld)" = "プルリクエストの概要 (%@ #%lld)"; +"The pullmark command is installed" = "pullmark コマンドはインストール済みです"; +"Theme" = "テーマ"; +"Themes restyle rendered Markdown and diffs, and follow the Light/Dark appearance. Drop .css files into the Themes folder to add your own — they apply on top of the GitHub look. Quick Look previews follow your theme too (custom themes fall back to their GitHub base there)." = "テーマは、レンダリングされた Markdown と差分の装いを変え、ライト/ダークの外観に従います。Themes フォルダに .css ファイルを入れれば、自分のテーマを追加できます — GitHub の姿の上に重ねて適用されます。Quick Look のプレビューもテーマに従います(そこではカスタムテーマは、土台の GitHub にフォールバックします)。"; +"These keys are fixed and can't be changed." = "これらのキーは固定されていて、変更できません。"; +"This comment is still syncing with GitHub — try discarding it again in a moment." = "このコメントはまだ GitHub と同期中です — 少ししてからもう一度破棄してみてください。"; +"This folder has more Markdown files than PullMark scans — open a subfolder as its own Location to see the rest" = "このフォルダには、PullMark がスキャンする数より多くの Markdown ファイルがあります — 残りを見るには、サブフォルダを独立した Location として開いてください"; +"This pull request was updated on GitHub." = "このプルリクエストは GitHub で更新されました。"; +"This repository has no GitHub remote." = "このリポジトリには GitHub のリモートがありません。"; +"This version (%@) doesn't know %@ — it may point at a feature from a newer release, or one that has moved. Checking for updates usually resolves it." = "このバージョン (%@) は %@ を認識できません — もっと新しいリリースの機能か、移動した機能を指しているのかもしれません。アップデートを確認すれば、たいてい解決します。"; +"Thread state unavailable — try refreshing the PR." = "スレッドの状態を取得できません — PR を更新してみてください。"; +"Turn Off" = "オフにする"; +"Up Arrow" = "上矢印"; +"Update Now" = "今すぐアップデート"; +"Update failed: %@" = "アップデートに失敗しました: %@"; +"Updated to PullMark %@." = "PullMark %@ にアップデートしました。"; +"Updates" = "アップデート"; +"Upload the remaining comments into your pending review on GitHub" = "残りのコメントを GitHub の保留中のレビューにアップロードします"; +"Use Anyway" = "このまま使用"; +"Using it" = "使い方"; +"View" = "表示"; +"View All Release Notes" = "すべてのリリースノートを表示"; +"View as List" = "リストとして表示"; +"View as Tree" = "ツリーとして表示"; +"Viewing signed out — commenting and reviewing are unavailable" = "サインアウトした状態で閲覧しています — コメントとレビューは利用できません"; +"Walk through connecting PullMark to GitHub" = "PullMark を GitHub につなぐ手順を案内します"; +"What Copy GitHub Link copies — hold ⌥ in the menu for the other flavor" = "「GitHub リンクをコピー」が何をコピーするか — メニューで ⌥ を押すと、もう一方になります"; +"What changed since the last commit, rendered like a PR diff — the toolbar's Compare button offers older revisions and branches" = "最後のコミットからの変更を、PR の差分のようにレンダリングします — ツールバーの「比較」ボタンからは、より古いリビジョンやブランチも選べます"; +"What clicking a link to a Markdown file on GitHub does — hold ⌘ while clicking for the other behavior" = "GitHub 上の Markdown ファイルへのリンクをクリックしたときの動作 — ⌘ を押しながらクリックすると、もう一方のふるまいになります"; +"What pressing space in Finder shows for Markdown files" = "Finder で Markdown ファイルにスペースキーを押したとき、何が出るか"; +"What's New" = "新機能"; +"While the find bar is open" = "検索バーが開いているあいだ"; +"Whole file" = "ファイル全体"; +"Wide" = "Wide"; +"With a folder selected" = "フォルダを選んでいるとき"; +"With a local file or folder in a GitHub repository selected" = "GitHub リポジトリ内のローカルのファイルかフォルダを選んでいるとき"; +"With a local file or folder selected" = "ローカルのファイルかフォルダを選んでいるとき"; +"With files in Open Files" = "Open Files にファイルがあるとき"; +"Works with private repos using your existing gh or git credentials." = "既存の gh または git の認証情報を使って、プライベートリポジトリでも動きます。"; +"You're on %@." = "現在 %@ にいます。"; +"Your custom shortcuts will be removed. This can't be undone." = "カスタムのショートカットは削除されます。この操作は取り消せません。"; +"Zoom In" = "拡大"; +"Zoom Out" = "縮小"; +"and %lld more" = "ほか %lld 件"; +"confirming sheets" = "シートの確定"; +"cycling windows" = "ウィンドウの切り替え"; +"dismissing sheets" = "シートを閉じる操作"; +"https://github.com/owner/repo/pull/123 or owner/repo#123" = "https://github.com/owner/repo/pull/123 または owner/repo#123"; +"just now" = "たった今"; +"on base branch" = "ベースブランチ"; +"opened by %@" = "%@ が作成"; +"the Help menu" = "ヘルプメニュー"; +"the app switcher" = "アプリケーションスイッチャー"; +" · was {r}" = " · 元は {r}"; +"(empty)" = "(空)"; +"Add a margin note" = "マージンノートを追加"; +"Add a suggestion" = "提案を追加"; +"Add reaction" = "リアクションを追加"; +"Add single comment" = "単一のコメントを追加"; +"Click the gutter for history" = "余白をクリックで履歴"; +"Comment actions" = "コメントの操作"; +"Comment on line {n}" = "{n} 行目にコメント"; +"Comment on lines {a}–{b}" = "{a}–{b} 行目にコメント"; +"Comment on new line {n}" = "新 {n} 行目にコメント"; +"Comment on new line {n} — shift-click extends the range" = "新 {n} 行目にコメント — shift クリックで範囲を広げます"; +"Comment on new lines {a}–{b}" = "新 {a}–{b} 行目にコメント"; +"Comment on old line {n} — shift-click extends the range" = "旧 {n} 行目にコメント — shift クリックで範囲を広げます"; +"Comment on old lines {a}–{b}" = "旧 {a}–{b} 行目にコメント"; +"Comment on the pull request conversation" = "プルリクエストの会話にコメント"; +"Conversation" = "会話"; +"Copy full SHA" = "完全な SHA をコピー"; +"Couldn't load this image from GitHub · " = "GitHub からこの画像を読み込めませんでした · "; +"File comments" = "ファイルへのコメント"; +"Front matter" = "フロントマター"; +"Hide {n} resolved conversation" = "解決済みの会話 {n} 件を隠す"; +"Hide {n} resolved conversations" = "解決済みの会話 {n} 件を隠す"; +"Insert a ```suggestion block pre-filled with the current lines" = "現在の行を入れた ```suggestion ブロックを挿入します"; +"LEFT" = "LEFT"; +"Leave a comment" = "コメントを残す"; +"Line {n}" = "{n} 行目"; +"Lines {a}–{b}" = "{a}–{b} 行目"; +"Moved from line {n} — content unchanged" = "{n} 行目から移動 — 内容は変わっていません"; +"Not synced" = "未同期"; +"Old line {n}" = "旧 {n} 行目"; +"Old lines {a}–{b}" = "旧 {a}–{b} 行目"; +"Open this conversation on GitHub — PullMark doesn't render this file" = "この会話を GitHub で開きます — このファイルは PullMark ではレンダリングされません"; +"Open {path} and jump to this conversation" = "{path} を開いて、この会話にジャンプします"; +"Outdated review comments" = "古いレビューコメント"; +"Pending" = "保留中"; +"Pending comment — click to expand" = "保留中のコメント — クリックで展開"; +"Pending comments — click to expand" = "保留中のコメント — クリックで展開"; +"Post to the PR conversation right away — not part of a review (⌘↩)" = "PR の会話にすぐ投稿します — レビューには含まれません (⌘↩)"; +"Reply" = "返信"; +"Reply to this thread (⌘↩)" = "このスレッドに返信します (⌘↩)"; +"Resolve" = "解決"; +"Resolved" = "解決済み"; +"Review discussion" = "レビューの議論"; +"Save" = "保存"; +"Save your edit (⌘↩)" = "編集を保存します (⌘↩)"; +"Show on GitHub" = "GitHub で表示"; +"Show {n} resolved conversation" = "解決済みの会話 {n} 件を表示"; +"Show {n} resolved conversations" = "解決済みの会話 {n} 件を表示"; +"Suggested change" = "変更の提案"; +"Suggestions can only target new-file lines — GitHub applies them in place of the commented lines." = "提案は新しいファイル側の行にしか付けられません — GitHub はコメントした行と置き換えて適用します。"; +"The conversation could not be loaded — retrying." = "会話を読み込めませんでした — 再試行しています。"; +"The targeted lines aren't available to suggest an edit to." = "対象の行には、編集を提案できません。"; +"This block isn't part of the pull request's diff — GitHub can only attach comments to changed lines." = "このブロックはプルリクエストの差分に含まれていません — GitHub は変更された行にしかコメントを付けられません。"; +"This file is empty on both sides of the diff." = "このファイルは差分の両側とも空です。"; +"Unresolve" = "未解決に戻す"; +"View commit on GitHub" = "GitHub でコミットを表示"; +"View in File" = "ファイル内で表示"; +"Write a reply" = "返信を書く"; +"Write at the end of the document" = "文書の末尾に書く"; +"all conversations resolved" = "すべての会話が解決済み"; +"approved these changes" = "がこれらの変更を承認しました"; +"bot" = "bot"; +"copied" = "コピーしました"; +"dismissed their review" = "がレビューを却下しました"; +"moved" = "移動"; +"requested changes" = "が変更をリクエストしました"; +"reviewed" = "がレビューしました"; +"whole document" = "文書全体"; +"{n} comment" = "コメント {n} 件"; +"{n} comments" = "コメント {n} 件"; +"{n} review" = "レビュー {n} 件"; +"{n} reviews" = "レビュー {n} 件"; +"{n} unresolved conversation" = "未解決の会話 {n} 件"; +"{n} unresolved conversations" = "未解決の会話 {n} 件"; +" · edited" = " · 編集済み"; +"· asks where to open" = "· 開き先を確認します"; +"· opens in PullMark" = "· PullMark で開きます"; +"· opens in browser" = "· ブラウザで開きます"; +"{n} comment — click to expand" = "{n} 件のコメント — クリックで展開"; +"{n} comments — click to expand" = "{n} 件のコメント — クリックで展開"; +"Closed" = "クローズ"; +"Draft" = "ドラフト"; +"Merged" = "マージ済み"; +"Unavailable" = "利用できません"; +"View on GitHub" = "GitHub で表示"; +"View all checks on GitHub" = "GitHub ですべてのチェックを表示"; +"%lld of %lld done" = "%lld/%lld 完了"; +"%lld of %lld failing" = "%lld/%lld 失敗"; +"A clean margin, numbers on demand in Source" = "余白はすっきり、行番号は「ソース」で必要なときに"; +"A workflow is waiting for approval" = "ワークフローが承認待ちです"; +"Added" = "追加"; +"Changed" = "変更"; +"Connected" = "接続済み"; +"Copied" = "コピーしました"; +"Copy GitHub Branch Link" = "GitHub ブランチリンクをコピー"; +"Copy GitHub Permalink" = "GitHub パーマリンクをコピー"; +"Deleted" = "削除"; +"Each block's source line in the margin" = "各ブロックのソース行番号を余白に表示"; +"GitHub CLI" = "GitHub CLI"; +"Hidden" = "非表示"; +"Language" = "言語"; +"Language:" = "言語:"; +"Line numbers hidden" = "行番号は非表示"; +"Line numbers shown" = "行番号を表示中"; +"Modified" = "変更"; +"Renamed" = "名称変更"; +"Shown" = "表示中"; +"Takes effect after PullMark relaunches." = "PullMark の再起動後に反映されます。"; +"Untracked" = "未追跡"; +"git credential helper" = "git 認証ヘルパー"; +"Relaunch Now" = "今すぐ再起動"; diff --git a/loc/nl.lproj/Localizable.strings b/loc/nl.lproj/Localizable.strings new file mode 100644 index 0000000..9daaba1 --- /dev/null +++ b/loc/nl.lproj/Localizable.strings @@ -0,0 +1,607 @@ +// PullMark — Nederlandse app-strings (spec: docs/specs/app-i18n.md). +// Sleutels zijn de Engelse strings; zie loc/README.md. + +" (none)" = " (geen)"; +"%lld Markdown files changed" = "%lld Markdown-bestanden gewijzigd"; +"%@ and pushed to origin." = "%@ en naar origin gepusht."; +"%@ approved" = "%@ heeft goedgekeurd"; +"%@ approved %@" = "%@ heeft %@ goedgekeurd"; +"%@ changed while you were annotating — nothing was saved. The current notes are shown now." = "%@ is veranderd terwijl je bezig was met annoteren — er is niets bewaard. Je ziet nu de huidige notities."; +"%@ changed while you were editing this block — nothing was saved. Re-open the block to edit the current version." = "%@ is veranderd terwijl je bezig was met het bewerken van dit blok — er is niets bewaard. Open het blok opnieuw om de huidige versie te bewerken."; +"%@ does not exist at %@." = "%@ bestaat niet op %@."; +"%lld files" = "%lld bestanden"; +"%@ is reserved for %@." = "%@ is gereserveerd voor %@."; +"%@ isn't available" = "%@ is niet beschikbaar"; +"%@ isn't available on %@: " = "%@ is niet beschikbaar op %@: "; +"%@ isn't in a git repository, so there's nothing to compare against." = "%@ zit niet in een git-repository, dus er is niets om mee te vergelijken."; +"%@ isn't inside a git repository." = "%@ zit niet in een git-repository."; +"%lld more reviewers" = "nog %lld reviewers"; +"%lld more…" = "Nog %lld…"; +"%lld not yet on GitHub" = "%lld nog niet op GitHub"; +"%lld of %lld" = "%lld van %lld"; +"%lld other files not shown" = "%lld andere bestanden niet getoond"; +"%@ requested changes" = "%@ heeft wijzigingen gevraagd"; +"%@ requested changes %@" = "%@ heeft %@ wijzigingen gevraagd"; +"%@ words · %lld min" = "%@ woorden · %lld min"; +"%@ — previewing; double-click to keep it with its repo" = "%@ — preview; dubbelklik om het bij zijn repo te houden"; +"%@, but the push failed: %@" = "%@, maar de push is mislukt: %@"; +"1 Markdown file changed" = "1 Markdown-bestand gewijzigd"; +"1 file" = "1 bestand"; +"1 more reviewer" = "nog 1 reviewer"; +"1 other file not shown" = "1 ander bestand niet getoond"; +"Abandon review" = "Verwerp review"; +"Abandon this review?" = "Deze review verwerpen?"; +"About PullMark" = "Over PullMark"; +"Actual Size" = "Werkelijke grootte"; +"Add Margin Note" = "Voeg margin note toe"; +"Add a margin note on the block you're reading" = "Voeg een margin note toe bij het blok dat je leest"; +"Adds a Review discussion section under the PR description listing every thread, with code excerpts and links" = "Voegt onder de PR-beschrijving een sectie Reviewdiscussie toe met elke thread, inclusief codefragmenten en links"; +"Adds a pullmark command to /usr/local/bin so you can open files and folders from the shell" = "Voegt een pullmark-commando toe aan /usr/local/bin zodat je bestanden en mappen vanuit de shell kunt openen"; +"Adds the authoring tools — hover a block, ⌥⌘M; documents that already contain notes always show them either way" = "Voegt het schrijfgereedschap toe — hover over een blok, ⌥⌘M; documenten die al notities bevatten tonen ze hoe dan ook"; +"After navigating between documents" = "Na navigeren tussen documenten"; +"All pending comments and the summary will be discarded, on GitHub too." = "Alle pending comments en de samenvatting worden verwijderd, ook op GitHub."; +"Alpha features are the frontier: their behavior and data formats may change incompatibly between versions, transitions may not be supported, and a feature may be removed entirely. Use them at your own risk." = "Alpha-functies zijn de voorhoede: hun gedrag en dataformaten kunnen tussen versies incompatibel veranderen, overgangen worden misschien niet ondersteund, en een functie kan helemaal verdwijnen. Gebruik op eigen risico."; +"Already use a git credential helper (macOS keychain, Git Credential Manager)? PullMark finds it automatically — Check Again will confirm." = "Gebruik je al een git credential helper (macOS-sleutelhanger, Git Credential Manager)? PullMark vindt hem automatisch — Controleer opnieuw bevestigt dat."; +"Anything Git can resolve works: a branch, a tag, or a commit. Leave the new side empty to compare the working file." = "Alles wat Git kan herleiden werkt: een branch, een tag of een commit. Laat de nieuwe kant leeg om het werkbestand te vergelijken."; +"Appearance" = "Weergave"; +"Applies to the whole file, not a specific line" = "Geldt voor het hele bestand, niet voor een specifieke regel"; +"Approved" = "Goedgekeurd"; +"Ask on first click" = "Vraag bij de eerste klik"; +"Awaiting review from %@" = "Wacht op review van %@"; +"Back" = "Terug"; +"Blame" = "Blame"; +"Branch name" = "Branchnaam"; +"Branches" = "Branches"; +"Branches and worktrees" = "Branches en worktrees"; +"Browse Repo Files" = "Blader door repo-bestanden"; +"Browse Repo Files…" = "Blader door repo-bestanden…"; +"Built-In Keys" = "Vaste toetsen"; +"Cancel" = "Annuleer"; +"Changes requested" = "Wijzigingen gevraagd"; +"Check Again" = "Controleer opnieuw"; +"Check for Updates" = "Zoek naar updates"; +"Check for Updates…" = "Zoek naar updates…"; +"Checking this Mac's credentials…" = "Credentials van deze Mac controleren…"; +"Checking…" = "Controleren…"; +"Checkout of %@/%@" = "Checkout van %@/%@"; +"Checks awaiting approval" = "Checks wachten op goedkeuring"; +"Checks failed" = "Checks mislukt"; +"Checks passed" = "Checks geslaagd"; +"Checks running" = "Checks lopen"; +"Choose the file to compare with — it becomes the old side." = "Kies het bestand om mee te vergelijken — dat wordt de oude kant."; +"Choose which items the toolbar shows, and their order" = "Kies welke onderdelen de toolbar toont, en in welke volgorde"; +"Clear Menu" = "Wis menu"; +"Clear Recents" = "Wis recente onderdelen"; +"Click a shortcut, or select a row and press Return, then type the new keys. Press Delete to remove a shortcut, Esc to cancel." = "Klik op een sneltoets, of selecteer een rij en druk op Return, en typ de nieuwe toetsen. Druk op Verwijder om een sneltoets te wissen, op Escape om te annuleren."; +"Click to type a zoom level" = "Klik om een zoomniveau te typen"; +"Clicking files in Locations:" = "Klikken op bestanden in Locations:"; +"Close" = "Sluit"; +"Close All" = "Sluit alles"; +"Close All Files" = "Sluit alle bestanden"; +"Command" = "Command"; +"Comment" = "Plaats comment"; +"Comment on %@" = "Reageer op %@"; +"Comment on File" = "Reageer op bestand"; +"Comment on any local Markdown document the way you'd comment on a PR. Notes save into the file itself as `` comments — ordinary HTML comments that stay out of rendered Markdown, shown by PullMark as bubbles pinned to their spot, and written so agents can read and act on them. [How margin notes work](https://pullmark.app/docs/experimental/margin-notes/)" = "Reageer op elk lokaal Markdown-document zoals je op een PR zou reageren. Notities worden bewaard in het bestand zelf, als ``-comments — gewone HTML-comments die buiten de gerenderde Markdown blijven, door PullMark getoond als ballonnetjes op hun plek, en zo geschreven dat agents ze kunnen lezen en verwerken. [Hoe margin notes werken](https://pullmark.app/docs/experimental/margin-notes/)"; +"Comment on any local Markdown document the way you'd comment on a PR. Notes save into the file itself as `` comments — ordinary HTML comments that stay out of rendered Markdown, shown by PullMark as bubbles pinned to their spot. Deleting a note is how it's resolved." = "Reageer op elk lokaal Markdown-document zoals je op een PR zou reageren. Notities worden bewaard in het bestand zelf, als ``-comments — gewone HTML-comments die buiten de gerenderde Markdown blijven, door PullMark getoond als ballonnetjes op hun plek. Een notitie verwijderen is hoe je haar afhandelt."; +"Comment on this file as a whole, not a specific line" = "Reageer op het hele bestand, niet op een specifieke regel"; +"Commit Changes" = "Commit wijzigingen"; +"Commit Changes…" = "Commit wijzigingen…"; +"Commit message" = "Commitbericht"; +"Commit to %@" = "Commit naar %@"; +"Commit to a new branch" = "Commit naar een nieuwe branch"; +"Committed %lld files" = "%lld bestanden gecommit"; +"Committed %lld files on new branch “%@”" = "%lld bestanden gecommit op nieuwe branch “%@”"; +"Committed 1 file" = "1 bestand gecommit"; +"Committed 1 file on new branch “%@”" = "1 bestand gecommit op nieuwe branch “%@”"; +"Compare" = "Vergelijk"; +"Compare Revisions" = "Vergelijk revisies"; +"Comparing " = "Vergelijken: "; +"Comparing with %@" = "Vergelijken met %@"; +"Connection status…" = "Verbindingsstatus…"; +"Content Width" = "Tekstbreedte"; +"Content width" = "Tekstbreedte"; +"Control" = "Control"; +"Copies instructions for CLAUDE.md / AGENTS.md — how to read margin notes and delete them as they're addressed" = "Kopieert instructies voor CLAUDE.md / AGENTS.md — hoe je margin notes leest en verwijdert zodra ze zijn verwerkt"; +"Copies the Markdown source of the selected blocks (whole blocks — or the whole document when nothing is selected)" = "Kopieert de Markdown-bron van de geselecteerde blokken (hele blokken — of het hele document wanneer er niets is geselecteerd)"; +"Copies “%@” to the clipboard" = "Kopieert “%@” naar het klembord"; +"Copy" = "Kopieer"; +"Copy %@ to the clipboard" = "Kopieer %@ naar het klembord"; +"Copy GitHub Link" = "Kopieer GitHub-link"; +"Copy GitHub links as:" = "Kopieer GitHub-links als:"; +"Copy Path" = "Kopieer pad"; +"Copy as Markdown" = "Kopieer als Markdown"; +"Could not abandon the review: %@" = "Kon de review niet verwerpen: %@"; +"Could not create the PDF: %@" = "Kon de PDF niet aanmaken: %@"; +"Could not delete the comment: %@" = "Kon de comment niet verwijderen: %@"; +"Could not discard the pending comment: %@" = "Kon de pending comment niet verwijderen: %@"; +"Could not post the comment — the PR session is no longer available. Your text was kept as a draft." = "Kon de comment niet plaatsen — de PR-sessie is niet meer beschikbaar. Je tekst is als concept bewaard."; +"Could not post the comment: %@" = "Kon de comment niet plaatsen: %@"; +"Could not post the reply — the PR session is no longer available. Your text was kept as a draft." = "Kon het antwoord niet plaatsen — de PR-sessie is niet meer beschikbaar. Je tekst is als concept bewaard."; +"Could not post the reply: %@" = "Kon het antwoord niet plaatsen: %@"; +"Could not read %@." = "Kon %@ niet lezen."; +"Could not read the rendered page." = "Kon de gerenderde pagina niet lezen."; +"Could not refresh %@: %@" = "Kon %@ niet verversen: %@"; +"Could not save %@: %@" = "Kon %@ niet bewaren: %@"; +"Could not save the edit: %@" = "Kon de bewerking niet bewaren: %@"; +"Could not update the reaction: %@" = "Kon de reactie niet bijwerken: %@"; +"Could not upload %lld pending comments to GitHub — kept locally for retry. %@" = "Kon %lld pending comments niet naar GitHub uploaden — lokaal bewaard voor een nieuwe poging. %@"; +"Could not upload 1 pending comment to GitHub — kept locally for retry. %@" = "Kon 1 pending comment niet naar GitHub uploaden — lokaal bewaard voor een nieuwe poging. %@"; +"Couldn't move PullMark" = "Kon PullMark niet verplaatsen"; +"Couldn't open %@/%@#%lld: " = "Kon %@/%@#%lld niet openen: "; +"Couldn't open %@: %@" = "Kon %@ niet openen: %@"; +"Couldn't open %@: %@. It may not exist at that ref, or it may be a private repository your GitHub credentials can't access." = "Kon %@ niet openen: %@. Het bestaat mogelijk niet op die ref, of het is een privérepository waar je GitHub-credentials geen toegang toe hebben."; +"Couldn't revert: %@" = "Kon niet terugdraaien: %@"; +"Couldn't save %@: " = "Kon %@ niet bewaren: "; +"Couldn't save %@: %@" = "Kon %@ niet bewaren: %@"; +"Current branch" = "Huidige branch"; +"Custom themes" = "Eigen thema's"; +"Customize Toolbar…" = "Pas toolbar aan…"; +"Dark" = "Dark"; +"Default diff layout:" = "Standaard diff-indeling:"; +"Delete" = "Verwijder"; +"Delete comment" = "Verwijder comment"; +"Delete this comment?" = "Deze comment verwijderen?"; +"Determining how this copy was installed…" = "Bepalen hoe deze kopie is geïnstalleerd…"; +"Discard the pending review and all its comments, on GitHub too" = "Verwerp de pending review en al haar comments, ook op GitHub"; +"Dismiss" = "Negeer"; +"Dismiss Preview" = "Sluit preview"; +"Dismiss — PullMark won't ask again unless you make it the default" = "Negeer — PullMark vraagt het niet opnieuw, tenzij je hem de standaard maakt"; +"Dismiss — this version won't be suggested again" = "Negeer — deze versie wordt niet opnieuw voorgesteld"; +"Don't ask again for this repository" = "Vraag dit niet meer voor deze repository"; +"Done" = "Gereed"; +"Dotfiles and hidden folders in Locations — like ⇧⌘. in Finder" = "Dotfiles en verborgen mappen in Locations — net als ⇧⌘. in de Finder"; +"Dotfiles and hidden folders in Locations — ⇧⌘. toggles this too, like Finder" = "Dotfiles en verborgen mappen in Locations — ⇧⌘. schakelt dit ook, net als in de Finder"; +"Down Arrow" = "Pijl omlaag"; +"Download" = "Download"; +"Downloads the update, verifies its signature, and installs it in place" = "Downloadt de update, controleert de handtekening en installeert hem ter plekke"; +"Drag PullMark to Applications in the Finder instead. (%@)" = "Sleep PullMark dan zelf naar Programma's in de Finder. (%@)"; +"Each block's starting source line, in the margin of rendered documents and diffs — hover a number for the block's full range. Rendered text wraps freely, so numbering is per block, not per visual line. The raw source view always shows its own line numbers." = "De eerste bronregel van elk blok, in de kantlijn van gerenderde documenten en diffs — hover over een nummer voor het volledige bereik van het blok. Gerenderde tekst loopt vrij door, dus de nummering is per blok, niet per visuele regel. De ruwe bronweergave toont altijd haar eigen regelnummers."; +"Edit" = "Wijzig"; +"Edit Mode" = "Editmodus"; +"Enable margin notes" = "Zet margin notes aan"; +"End" = "End"; +"Escape" = "Escape"; +"Every release's notes, up to the version you're running" = "De notes van elke release, tot en met de versie die je draait"; +"Exact commit (permalink)" = "Exacte commit (permalink)"; +"Expand All" = "Vouw alles uit"; +"Experimental" = "Experimenteel"; +"Export as HTML…" = "Exporteer als HTML…"; +"Export as PDF…" = "Exporteer als PDF…"; +"Features land here before their design is settled. **Beta** features get a real compatibility effort between versions and are likely to graduate. **Alpha** features carry no guarantees: they may change incompatibly, their data formats may not migrate, and they may disappear entirely. [About experimental features](https://pullmark.app/docs/experimental/)" = "Functies verschijnen hier voordat hun ontwerp vastligt. **Beta**-functies krijgen een serieuze compatibiliteitsinspanning tussen versies en slagen waarschijnlijk. **Alpha**-functies bieden geen enkele garantie: ze kunnen incompatibel veranderen, hun dataformaten migreren mogelijk niet, en ze kunnen helemaal verdwijnen. [Over experimentele functies](https://pullmark.app/docs/experimental/)"; +"Features land here before their design is settled. **Beta** features get a real compatibility effort between versions and are likely to graduate. [About experimental features](https://pullmark.app/docs/experimental/)" = "Functies verschijnen hier voordat hun ontwerp vastligt. **Beta**-functies krijgen een serieuze compatibiliteitsinspanning tussen versies en slagen waarschijnlijk. [Over experimentele functies](https://pullmark.app/docs/experimental/)"; +"File" = "Archief"; +"File Margin Note…" = "Margin note over bestand…"; +"Fill in a known branch, tag, or commit" = "Vul een bekende branch, tag of commit in"; +"Find Next" = "Zoek volgende"; +"Find Previous" = "Zoek vorige"; +"Find in Page" = "Zoek op pagina"; +"Find in page" = "Zoek op pagina"; +"Finish your review · %lld" = "Rond je review af · %lld"; +"Finish your review — 1 pending comment" = "Rond je review af — 1 pending comment"; +"Finish your review — %lld pending comments" = "Rond je review af — %lld pending comments"; +"Flip Diff Layout" = "Draai diff-indeling om"; +"Forward" = "Vooruit"; +"Forward Delete" = "Verwijder vooruit"; +"Full Width" = "Full Width"; +"General" = "Algemeen"; +"GitHub" = "GitHub"; +"GitHub API error (%lld): %@" = "GitHub API-fout (%lld): %@"; +"GitHub Access" = "GitHub-toegang"; +"GitHub Markdown links:" = "GitHub-Markdown-links:"; +"Go" = "Ga"; +"Hide Hidden Files" = "Verberg verborgen bestanden"; +"Hide Margin Notes" = "Verberg margin notes"; +"Hide Markdown Source" = "Verberg Markdown-bron"; +"Hide Outline" = "Verberg outline"; +"Hide Resolved Conversations" = "Verberg opgeloste conversaties"; +"Hide review requests with no Markdown files — PullMark has nothing to show for them" = "Verbergt reviewverzoeken zonder Markdown-bestanden — PullMark heeft er niets voor te tonen"; +"History" = "Geschiedenis"; +"Home" = "Home"; +"Hover any block for the note bubble (select text first to quote it), or press ⌥⌘M. Edit and delete from each bubble; deleting a note is how it's resolved. Open Files rows show a count chip while a document still carries notes, and View → Hide Margin Notes clears the page for clean reading." = "Hover over een blok voor het notitieballonnetje (selecteer eerst tekst om die te citeren), of druk op ⌥⌘M. Bewerken en verwijderen doe je vanuit elk ballonnetje; een notitie verwijderen is hoe je haar afhandelt. Rijen in Open Files dragen een chip met het aantal notities zolang een document ze nog bevat, en Weergave → Verberg margin notes maakt de pagina leeg om schoon te lezen."; +"How far text may stretch before it wraps. Standard keeps the classic book-like measure; Wide fits more on screen and still caps the line length; Full Width gives the document the whole window — handy in full screen. Applies everywhere, live, and plays with any theme." = "Hoe ver tekst mag uitlopen voordat hij afbreekt. Standard houdt de klassieke, boekachtige leesbreedte aan; Wide past meer op het scherm en begrenst de regellengte nog steeds; Full Width geeft het document het hele venster — handig in volledig scherm. Geldt overal, live, en combineert met elk thema."; +"How wide the rendered text column runs" = "Hoe breed de gerenderde tekstkolom loopt"; +"In a local document" = "In een lokaal document"; +"In a pull request" = "In een pull request"; +"In a pull request file" = "In een pull request-bestand"; +"In a pull request file's Result view" = "In de Resultaat-weergave van een pull request-bestand"; +"Install pullmark Command…" = "Installeer pullmark-commando…"; +"Jump to another Markdown file in this pull request" = "Spring naar een ander Markdown-bestand in deze pull request"; +"Jump to any file, heading, or pull request" = "Spring naar elk bestand, elke kop of elke pull request"; +"Jump to the GitHub connection section" = "Spring naar de sectie GitHub-verbinding"; +"Keep" = "Behoud"; +"Keep Open" = "Houd open"; +"Keep Using" = "Blijf gebruiken"; +"Keyboard" = "Toetsenbord"; +"Large repo — not all files shown" = "Grote repo — niet alle bestanden getoond"; +"Last seen at %@. " = "Laatst gezien op %@. "; +"Layout" = "Indeling"; +"Left Arrow" = "Pijl links"; +"Light" = "Light"; +"Light, Dark, or match the system — the window and every rendered page follow, and each theme brings its own light and dark looks." = "Light, Dark of gelijk aan het systeem — het venster en elke gerenderde pagina volgen, en elk thema brengt zijn eigen lichte en donkere gedaante mee."; +"Line %lld (new)" = "Regel %lld (nieuw)"; +"Line %lld (old)" = "Regel %lld (oud)"; +"Line numbers" = "Regelnummers"; +"Loading repo files…" = "Repo-bestanden laden…"; +"Locations" = "Locations"; +"Make Default Again" = "Maak weer standaard"; +"Make PullMark the Default" = "Maak PullMark de standaard"; +"Make the document bigger" = "Maak het document groter"; +"Make the document bigger — text, images, and the content column scale together" = "Maak het document groter — tekst, afbeeldingen en de tekstkolom schalen mee"; +"Make the document smaller" = "Maak het document kleiner"; +"Make the page writable — then click any block" = "Maak de pagina bewerkbaar — klik daarna op een blok"; +"Make this choice the default for GitHub Markdown links" = "Maak dit de standaard voor GitHub-Markdown-links"; +"Margin Notes" = "Margin notes"; +"Margin notes are experimental (beta): the design may still shift between versions, and Settings → Experimental turns them off any time. [How margin notes work](https://pullmark.app/docs/experimental/margin-notes/)" = "Margin notes zijn experimenteel (beta): het ontwerp kan tussen versies nog schuiven, en via Instellingen → Experimenteel zet je ze altijd uit. [Hoe margin notes werken](https://pullmark.app/docs/experimental/margin-notes/)"; +"Margin notes are hidden — choose View → Show Margin Notes first." = "Margin notes zijn verborgen — kies eerst Weergave → Toon margin notes."; +"Margin notes are off — turn them back on in Settings → Experimental." = "Margin notes staan uit — zet ze weer aan in Instellingen → Experimenteel."; +"Margin notes are off — turn them on in Settings → Experimental." = "Margin notes staan uit — zet ze aan in Instellingen → Experimenteel."; +"Margin-note bubbles ( comments) in rendered documents" = "Notitieballonnetjes (-comments) in gerenderde documenten"; +"Markdown files open in PullMark" = "Markdown-bestanden openen in PullMark"; +"Mission Control" = "Mission Control"; +"Move PullMark to your Applications folder?" = "PullMark naar je map Programma's verplaatsen?"; +"Move to Applications" = "Verplaats naar Programma's"; +"Move to Trash" = "Verplaats naar prullenmand"; +"Next File" = "Volgend bestand"; +"Next Markdown file in this pull request" = "Volgend Markdown-bestand in deze pull request"; +"Next match" = "Volgend resultaat"; +"No Markdown files found in %@." = "Geen Markdown-bestanden gevonden in %@."; +"No changes to commit." = "Geen wijzigingen om te committen."; +"No headings" = "Geen koppen"; +"None" = "Geen"; +"Not Now" = "Niet nu"; +"Not a Homebrew user? [Download the CLI from cli.github.com](https://cli.github.com), then sign in the same way." = "Geen Homebrew-gebruiker? [Download de CLI van cli.github.com](https://cli.github.com) en log daarna op dezelfde manier in."; +"Not available in this build" = "Niet beschikbaar in deze build"; +"Not connected" = "Niet verbonden"; +"Not connected to GitHub — private repositories and reviewing are unavailable." = "Niet verbonden met GitHub — privérepo's en reviewen zijn niet beschikbaar."; +"Notes are written so agents can read and act on them. Paste the snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in this file\" becomes a complete handoff." = "Notities zijn zo geschreven dat agents ze kunnen lezen en verwerken. Plak het fragment in het instructiebestand van je agent (CLAUDE.md, AGENTS.md, …) en \"verwerk de margin notes in dit bestand\" is een complete overdracht."; +"OK" = "OK"; +"Off shows a quiet banner instead — the notes stay one click away" = "Uit toont in plaats daarvan een rustige banner — de notes blijven één klik verderop"; +"Only requests that change Markdown" = "Alleen verzoeken die Markdown wijzigen"; +"Open" = "Open"; +"Open Branch Separately" = "Open branch apart"; +"Open File or Folder" = "Open bestand of map"; +"Open Files" = "Open Files"; +"Open File…" = "Open bestand…"; +"Open Folder…" = "Open map…"; +"Open Fully" = "Volledig openen"; +"Open GitHub Markdown links in PullMark?" = "GitHub-Markdown-links in PullMark openen?"; +"Open Markdown files" = "Open Markdown-bestanden"; +"Open Markdown files or a folder containing them" = "Open Markdown-bestanden of een map die ze bevat"; +"Open Pull Request" = "Open pull request"; +"Open Pull Request…" = "Open pull request…"; +"Open Quickly — files, headings, pull requests, or paths" = "Open snel — bestanden, koppen, pull requests of paden"; +"Open Quickly…" = "Open snel…"; +"Open Recent" = "Open recent onderdeel"; +"Open Release Page" = "Open releasepagina"; +"Open Themes Folder" = "Open Themes-map"; +"Open Worktree" = "Open worktree"; +"Open a GitHub pull request" = "Open een GitHub-pull request"; +"Open a Markdown file or a GitHub pull request" = "Open een Markdown-bestand of een GitHub-pull request"; +"Open a folder containing Markdown files" = "Open een map met Markdown-bestanden"; +"Open files, folders, and worktrees from the shell — [about the pullmark command](https://pullmark.app/docs/cli/)." = "Open bestanden, mappen en worktrees vanuit de shell — [over het pullmark-commando](https://pullmark.app/docs/cli/)."; +"Open in Browser" = "Open in browser"; +"Open in PullMark" = "Open in PullMark"; +"Open local Markdown files or a folder" = "Open lokale Markdown-bestanden of een map"; +"Open on GitHub" = "Open op GitHub"; +"Open pull requests where your review is requested" = "Openstaande pull requests waar jouw review gevraagd is"; +"Open the review — pending comments, summary, and verdict" = "Open de review — pending comments, samenvatting en oordeel"; +"Opens the release page on GitHub" = "Opent de releasepagina op GitHub"; +"Opens the release page on GitHub to update manually" = "Opent de releasepagina op GitHub om handmatig bij te werken"; +"Open…" = "Open…"; +"Option" = "Option"; +"Outdated" = "Verouderd"; +"Outdated — was line %lld" = "Verouderd — was regel %lld"; +"Outline" = "Outline"; +"PR Overview" = "PR-overzicht"; +"Page Down" = "Page Down"; +"Page Setup…" = "Pagina-instelling…"; +"Page Up" = "Page Up"; +"Paper size and orientation for printing" = "Papierformaat en richting voor afdrukken"; +"Paste the copied snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in the file\" becomes a complete handoff — the agent deletes each note as it resolves it, and you watch the bubbles disappear." = "Plak het gekopieerde fragment in het instructiebestand van je agent (CLAUDE.md, AGENTS.md, …) en \"verwerk de margin notes in het bestand\" is een complete overdracht — de agent verwijdert elke notitie zodra hij haar afhandelt, en jij ziet de ballonnetjes verdwijnen."; +"Pending review on GitHub" = "Pending review op GitHub"; +"Pinned to commit %@ — the ref's tip as of this session's last fetch." = "Vastgezet op commit %@ — de tip van de ref bij de laatste fetch van deze sessie."; +"Posts immediately — file comments can't join a pending review." = "Wordt meteen geplaatst — bestandscomments kunnen niet mee in een pending review."; +"Preview First" = "Eerst previewen"; +"Preview First shows a file with one click without keeping it — one italicized entry (in Open Files, or under its GitHub repo) that the next preview replaces. Double-click a file, or just start editing, to keep it open. Open Fully keeps every file you click." = "Eerst previewen toont een bestand met één klik zonder het vast te houden — één cursieve regel (in Open Files, of onder de bijbehorende GitHub-repo) die de volgende preview vervangt. Dubbelklik een bestand, of begin gewoon te typen, om het open te houden. Volledig openen houdt elk bestand dat je aanklikt."; +"Previous File" = "Vorig bestand"; +"Previous Markdown file in this pull request" = "Vorig Markdown-bestand in deze pull request"; +"Previous match" = "Vorig resultaat"; +"Print the rendered document" = "Druk het gerenderde document af"; +"Print…" = "Druk af…"; +"Private repositories, commenting, and reviewing are ready." = "Privérepo's, reageren en reviewen zijn klaar voor gebruik."; +"Pull Requests" = "Pull requests"; +"PullMark %@ is available." = "PullMark %@ is beschikbaar."; +"PullMark Website" = "PullMark-website"; +"PullMark borrows the GitHub credentials your own tools already have — the GitHub CLI or a git credential helper. It has no login of its own, stores nothing, and never sees a password." = "PullMark leent de GitHub-credentials die je eigen tools al hebben — de GitHub CLI of een git credential helper. Het heeft geen eigen login, bewaart niets en ziet nooit een wachtwoord."; +"PullMark borrows the credentials your own tools already have — the GitHub CLI or a git credential helper. It has no login of its own, stores nothing, and never sees a password. [About GitHub access](https://pullmark.app/docs/troubleshooting/#github-access)" = "PullMark leent de credentials die je eigen tools al hebben — de GitHub CLI of een git credential helper. Het heeft geen eigen login, bewaart niets en ziet nooit een wachtwoord. [Over GitHub-toegang](https://pullmark.app/docs/troubleshooting/#github-access)"; +"PullMark can fetch this file and render it in-app, or send it to your browser. Hold ⌘ while clicking a link for the other behavior; the default lives in Settings → General." = "PullMark kan dit bestand ophalen en in de app renderen, of het naar je browser sturen. Houd ⌘ ingedrukt bij het klikken op een link voor het andere gedrag; de standaard staat in Instellingen → Algemeen."; +"PullMark is in demo mode — network access is disabled." = "PullMark staat in demomodus — netwerktoegang is uitgeschakeld."; +"PullMark is installed — the disk image is no longer needed. This ejects it and moves “%@” to the Trash." = "PullMark is geïnstalleerd — de schijfkopie is niet meer nodig. Dit werpt hem uit en verplaatst “%@” naar de prullenmand."; +"PullMark is no longer your default Markdown app." = "PullMark is niet langer je standaard-Markdown-app."; +"PullMark is running from its disk image. Moving it to Applications installs it properly and enables one-click updates." = "PullMark draait vanaf de schijfkopie. Naar Programma's verplaatsen installeert hem netjes en maakt updates met één klik mogelijk."; +"Push to origin after committing" = "Push naar origin na het committen"; +"Quick Look previews:" = "Quick Look-previews:"; +"Raw Source" = "Ruwe bron"; +"Re-read credentials from the GitHub CLI and git credential helpers" = "Lees de credentials opnieuw uit de GitHub CLI en git credential helpers"; +"Re-read credentials from the GitHub CLI and git credential helpers — after gh auth login, this connects without relaunching" = "Lees de credentials opnieuw uit de GitHub CLI en git credential helpers — na gh auth login verbindt dit zonder herstart"; +"Re-read this file from disk" = "Lees dit bestand opnieuw van schijf"; +"Reaction state unavailable — try refreshing the PR." = "Reactiestatus niet beschikbaar — ververs de PR."; +"Reading" = "Lezen"; +"Recents" = "Recents"; +"Redo" = "Herhaal"; +"Refresh" = "Ververs"; +"Refresh Folder" = "Ververs map"; +"Release Notes" = "Releasenotes"; +"Release notes couldn't be loaded — they're also at github.com/jedijashwa/pullmark/releases." = "De releasenotes konden niet worden geladen — ze staan ook op github.com/jedijashwa/pullmark/releases."; +"Reload" = "Herlaad"; +"Reload Document" = "Herlaad document"; +"Remember my selection" = "Onthoud mijn keuze"; +"Remote Branches" = "Remote branches"; +"Remove from Recents" = "Verwijder uit Recents"; +"Remove from Sidebar" = "Verwijder uit zijbalk"; +"Remove the PullMark disk image?" = "PullMark-schijfkopie verwijderen?"; +"Rendered" = "Gerenderd"; +"Rendered Diff" = "Gerenderde diff"; +"Reopen what was in the sidebar when PullMark last quit" = "Heropent wat er in de zijbalk stond toen PullMark voor het laatst afsloot"; +"Reopening…" = "Opnieuw openen…"; +"Report a Bug…" = "Meld een bug…"; +"Report an Issue…" = "Meld een probleem…"; +"Request a Feature…" = "Vraag een functie aan…"; +"Required" = "Vereist"; +"Reset the zoom to 100%" = "Zet de zoom terug op 100%"; +"Restore Defaults" = "Herstel standaardwaarden"; +"Restore Defaults…" = "Herstel standaardwaarden…"; +"Restore all keyboard shortcuts to their defaults?" = "Alle sneltoetsen herstellen naar de standaardwaarden?"; +"Restore files and pull requests from the last session" = "Herstel bestanden en pull requests uit de vorige sessie"; +"Restore the default" = "Herstel de standaardwaarde"; +"Restore the file as it was before PullMark's last edit" = "Zet het bestand terug zoals het was vóór PullMarks laatste bewerking"; +"Result" = "Resultaat"; +"Retry" = "Probeer opnieuw"; +"Retry Upload" = "Upload opnieuw"; +"Return" = "Return"; +"Reveal in Finder" = "Toon in Finder"; +"Reveal in Location" = "Toon in Locations"; +"Reveal on GitHub" = "Toon op GitHub"; +"Reveal resolved review conversations in the Result view" = "Toon opgeloste reviewconversaties in de Resultaat-weergave"; +"Revert Last Edit" = "Draai laatste bewerking terug"; +"Reverted the last edit to %@." = "De laatste bewerking van %@ is teruggedraaid."; +"Review Changes…" = "Review wijzigingen…"; +"Review Requests" = "Reviewverzoeken"; +"Review changes" = "Review wijzigingen"; +"Review comments couldn't be loaded — existing threads may be missing." = "Reviewcomments konden niet worden geladen — bestaande threads ontbreken mogelijk."; +"Review requested from %@" = "Review gevraagd van %@"; +"Review required" = "Review vereist"; +"Review submitted." = "Review ingediend."; +"Review summary (optional)" = "Samenvatting van de review (optioneel)"; +"Review verdict" = "Reviewoordeel"; +"Reviewing" = "Reviewen"; +"Right Arrow" = "Pijl rechts"; +"Runs “%@” and relaunches PullMark" = "Voert “%@” uit en start PullMark opnieuw"; +"Save the rendered document as a PDF" = "Bewaar het gerenderde document als PDF"; +"Save the rendered document as a self-contained HTML file" = "Bewaar het gerenderde document als zelfstandig HTML-bestand"; +"Saved as a pending review — visible only to you until you submit" = "Bewaard als pending review — alleen zichtbaar voor jou tot je hem indient"; +"Search All Files…" = "Zoek in alle bestanden…"; +"Search all files" = "Zoek in alle bestanden"; +"See if something even newer is available" = "Kijk of er iets nog nieuwers is"; +"Set Up GitHub Access…" = "Stel GitHub-toegang in…"; +"Set Up…" = "Stel in…"; +"Set up the GitHub CLI" = "Stel de GitHub CLI in"; +"Share" = "Deel"; +"Shift" = "Shift"; +"Show" = "Toon"; +"Show Alpha Features" = "Toon alpha-functies"; +"Show Hidden Files" = "Toon verborgen bestanden"; +"Show Margin Notes" = "Toon margin notes"; +"Show Markdown Source" = "Toon Markdown-bron"; +"Show Outline" = "Toon outline"; +"Show Resolved Conversations" = "Toon opgeloste conversaties"; +"Show What's New after an update" = "Toon Wat is er nieuw na een update"; +"Show alpha features" = "Toon alpha-functies"; +"Show alpha features?" = "Alpha-functies tonen?"; +"Show hidden files" = "Toon verborgen bestanden"; +"Show or hide the document outline" = "Toon of verberg de outline van het document"; +"Show review discussion on the PR overview" = "Toon reviewdiscussie op het PR-overzicht"; +"Show review requests in the sidebar" = "Toon reviewverzoeken in de zijbalk"; +"Show the next document" = "Toon het volgende document"; +"Show the previous document" = "Toon het vorige document"; +"Show the raw Markdown behind the rendered document" = "Toon de ruwe Markdown achter het gerenderde document"; +"Show who last changed each block (git blame)" = "Toon wie elk blok het laatst heeft gewijzigd (git blame)"; +"Show/Hide Hidden Files" = "Toon/verberg verborgen bestanden"; +"Show/Hide Margin Notes" = "Toon/verberg margin notes"; +"Show/Hide Markdown Source" = "Toon/verberg Markdown-bron"; +"Show/Hide Outline" = "Toon/verberg outline"; +"Show/Hide Resolved Conversations" = "Toon/verberg opgeloste conversaties"; +"Showing 500 of %lld changed files — Markdown files are preselected either way." = "500 van %lld gewijzigde bestanden getoond — Markdown-bestanden zijn hoe dan ook voorgeselecteerd."; +"Showing the first %lld Markdown files" = "De eerste %lld Markdown-bestanden worden getoond"; +"Sign in to GitHub" = "Log in bij GitHub"; +"Sign notes as:" = "Onderteken notities als:"; +"Something went wrong" = "Er ging iets mis"; +"Source" = "Bron"; +"Source Diff" = "Bron-diff"; +"Space" = "Spatie"; +"Spotlight" = "Spotlight"; +"Stage and commit changes in this file's repository" = "Stage en commit wijzigingen in de repository van dit bestand"; +"Standard" = "Standard"; +"Submit review" = "Dien review in"; +"Submit the review with the selected verdict (⌘↩)" = "Dien de review in met het gekozen oordeel (⌘↩)"; +"Support PullMark ❤️" = "Steun PullMark ❤️"; +"Switch between light, dark, and system appearance" = "Wissel tussen lichte, donkere en systeemweergave"; +"Switch or Open Branch…" = "Wissel of open branch…"; +"System" = "Systeem"; +"Tab" = "Tab"; +"Tags" = "Tags"; +"Teach your agent" = "Leid je agent op"; +"Tell your agent" = "Vertel het je agent"; +"Temporarily show the raw Markdown behind the rendered document" = "Toon tijdelijk de ruwe Markdown achter het gerenderde document"; +"That link needs a different version of PullMark" = "Die link vraagt om een andere versie van PullMark"; +"The @name your notes carry — empty uses your GitHub login, or this Mac's account name when signed out" = "De @naam die je notities dragen — leeg gebruikt je GitHub-login, of de accountnaam op deze Mac wanneer je uitgelogd bent"; +"The GitHub CLI is installed but signed out. Run this in your terminal — it opens a browser to sign in:" = "De GitHub CLI is geïnstalleerd maar niet ingelogd. Voer dit uit in je terminal — het opent een browser om in te loggen:"; +"The PR session is no longer available — the draft could not be saved to disk." = "De PR-sessie is niet meer beschikbaar — het concept kon niet naar schijf worden bewaard."; +"The comment will be removed from GitHub. Replies from others will stay." = "De comment wordt van GitHub verwijderd. Antwoorden van anderen blijven staan."; +"The document's headings, in a sidebar" = "De koppen van het document, in een zijbalk"; +"The pull request overview (%@ #%lld)" = "Het overzicht van de pull request (%@ #%lld)"; +"The pullmark command is installed" = "Het pullmark-commando is geïnstalleerd"; +"Theme" = "Thema"; +"Themes restyle rendered Markdown and diffs, and follow the Light/Dark appearance. Drop .css files into the Themes folder to add your own — they apply on top of the GitHub look. Quick Look previews follow your theme too (custom themes fall back to their GitHub base there)." = "Thema's restylen gerenderde Markdown en diffs, en volgen de Light/Dark-weergave. Zet .css-bestanden in de Themes-map om je eigen thema toe te voegen — ze werken bovenop de GitHub-look. Quick Look-previews volgen je thema ook (eigen thema's vallen daar terug op hun GitHub-basis)."; +"These keys are fixed and can't be changed." = "Deze toetsen liggen vast en zijn niet te veranderen."; +"This comment is still syncing with GitHub — try discarding it again in a moment." = "Deze comment synchroniseert nog met GitHub — probeer hem zo meteen opnieuw te verwijderen."; +"This folder has more Markdown files than PullMark scans — open a subfolder as its own Location to see the rest" = "Deze map heeft meer Markdown-bestanden dan PullMark scant — open een submap als eigen Location om de rest te zien"; +"This pull request was updated on GitHub." = "Deze pull request is bijgewerkt op GitHub."; +"This repository has no GitHub remote." = "Deze repository heeft geen GitHub-remote."; +"This version (%@) doesn't know %@ — it may point at a feature from a newer release, or one that has moved. Checking for updates usually resolves it." = "Deze versie (%@) kent %@ niet — het wijst misschien naar een functie uit een nieuwere release, of naar een die verhuisd is. Zoeken naar updates lost dit meestal op."; +"Thread state unavailable — try refreshing the PR." = "Threadstatus niet beschikbaar — ververs de PR."; +"Turn Off" = "Zet uit"; +"Up Arrow" = "Pijl omhoog"; +"Update Now" = "Werk nu bij"; +"Update failed: %@" = "Bijwerken mislukt: %@"; +"Updated to PullMark %@." = "Bijgewerkt naar PullMark %@."; +"Updates" = "Updates"; +"Upload the remaining comments into your pending review on GitHub" = "Upload de resterende comments naar je pending review op GitHub"; +"Use Anyway" = "Gebruik toch"; +"Using it" = "Zo gebruik je het"; +"View" = "Weergave"; +"View All Release Notes" = "Bekijk alle releasenotes"; +"View as List" = "Toon als lijst"; +"View as Tree" = "Toon als boomstructuur"; +"Viewing signed out — commenting and reviewing are unavailable" = "Je bekijkt dit uitgelogd — reageren en reviewen zijn niet beschikbaar"; +"Walk through connecting PullMark to GitHub" = "Loop stap voor stap door het verbinden van PullMark met GitHub"; +"What Copy GitHub Link copies — hold ⌥ in the menu for the other flavor" = "Wat Kopieer GitHub-link kopieert — houd ⌥ ingedrukt in het menu voor de andere smaak"; +"What changed since the last commit, rendered like a PR diff — the toolbar's Compare button offers older revisions and branches" = "Wat er sinds de laatste commit is veranderd, gerenderd als een PR-diff — de Vergelijk-knop in de toolbar biedt oudere revisies en branches"; +"What clicking a link to a Markdown file on GitHub does — hold ⌘ while clicking for the other behavior" = "Wat klikken op een link naar een Markdown-bestand op GitHub doet — houd ⌘ ingedrukt tijdens het klikken voor het andere gedrag"; +"What pressing space in Finder shows for Markdown files" = "Wat de spatiebalk in de Finder toont voor Markdown-bestanden"; +"What's New" = "Wat is er nieuw"; +"While the find bar is open" = "Terwijl de zoekbalk open is"; +"Whole file" = "Hele bestand"; +"Wide" = "Wide"; +"With a folder selected" = "Met een map geselecteerd"; +"With a local file or folder in a GitHub repository selected" = "Met een lokaal bestand of lokale map in een GitHub-repository geselecteerd"; +"With a local file or folder selected" = "Met een lokaal bestand of lokale map geselecteerd"; +"With files in Open Files" = "Met bestanden in Open Files"; +"Works with private repos using your existing gh or git credentials." = "Werkt met privérepo's via je bestaande gh- of git-credentials."; +"You're on %@." = "Je zit op %@."; +"Your custom shortcuts will be removed. This can't be undone." = "Je eigen sneltoetsen worden verwijderd. Dit kan niet ongedaan worden gemaakt."; +"Zoom In" = "Zoom in"; +"Zoom Out" = "Zoom uit"; +"and %lld more" = "en nog %lld"; +"confirming sheets" = "het bevestigen van panelen"; +"cycling windows" = "wisselen tussen vensters"; +"dismissing sheets" = "het sluiten van panelen"; +"https://github.com/owner/repo/pull/123 or owner/repo#123" = "https://github.com/owner/repo/pull/123 of owner/repo#123"; +"just now" = "zojuist"; +"on base branch" = "op de base branch"; +"opened by %@" = "geopend door %@"; +"the Help menu" = "het Help-menu"; +"the app switcher" = "de appwisselaar"; +" · was {r}" = " · was {r}"; +"(empty)" = "(leeg)"; +"Add a margin note" = "Voeg een margin note toe"; +"Add a suggestion" = "Voeg een suggestie toe"; +"Add reaction" = "Voeg reactie toe"; +"Add single comment" = "Voeg losse comment toe"; +"Click the gutter for history" = "Klik in de kantlijn voor de geschiedenis"; +"Comment actions" = "Commentacties"; +"Comment on line {n}" = "Reageer op regel {n}"; +"Comment on lines {a}–{b}" = "Reageer op regels {a}–{b}"; +"Comment on new line {n}" = "Reageer op nieuwe regel {n}"; +"Comment on new line {n} — shift-click extends the range" = "Reageer op nieuwe regel {n} — shift-klik verlengt het bereik"; +"Comment on new lines {a}–{b}" = "Reageer op nieuwe regels {a}–{b}"; +"Comment on old line {n} — shift-click extends the range" = "Reageer op oude regel {n} — shift-klik verlengt het bereik"; +"Comment on old lines {a}–{b}" = "Reageer op oude regels {a}–{b}"; +"Comment on the pull request conversation" = "Reageer in de conversatie van de pull request"; +"Conversation" = "Conversatie"; +"Copy full SHA" = "Kopieer volledige SHA"; +"Couldn't load this image from GitHub · " = "Kon deze afbeelding niet van GitHub laden · "; +"File comments" = "Bestandscomments"; +"Front matter" = "Front matter"; +"Hide {n} resolved conversation" = "Verberg {n} opgeloste conversatie"; +"Hide {n} resolved conversations" = "Verberg {n} opgeloste conversaties"; +"Insert a ```suggestion block pre-filled with the current lines" = "Voegt een ```suggestion-blok in, alvast gevuld met de huidige regels"; +"LEFT" = "LEFT"; +"Leave a comment" = "Laat een comment achter"; +"Line {n}" = "Regel {n}"; +"Lines {a}–{b}" = "Regels {a}–{b}"; +"Moved from line {n} — content unchanged" = "Verplaatst van regel {n} — inhoud ongewijzigd"; +"Not synced" = "Niet gesynct"; +"Old line {n}" = "Oude regel {n}"; +"Old lines {a}–{b}" = "Oude regels {a}–{b}"; +"Open this conversation on GitHub — PullMark doesn't render this file" = "Open deze conversatie op GitHub — PullMark rendert dit bestand niet"; +"Open {path} and jump to this conversation" = "Open {path} en spring naar deze conversatie"; +"Outdated review comments" = "Verouderde reviewcomments"; +"Pending" = "Pending"; +"Pending comment — click to expand" = "Pending comment — klik om uit te vouwen"; +"Pending comments — click to expand" = "Pending comments — klik om uit te vouwen"; +"Post to the PR conversation right away — not part of a review (⌘↩)" = "Plaats meteen in de PR-conversatie — geen onderdeel van een review (⌘↩)"; +"Reply" = "Antwoord"; +"Reply to this thread (⌘↩)" = "Antwoord in deze thread (⌘↩)"; +"Resolve" = "Markeer als opgelost"; +"Resolved" = "Opgelost"; +"Review discussion" = "Reviewdiscussie"; +"Save" = "Bewaar"; +"Save your edit (⌘↩)" = "Bewaar je bewerking (⌘↩)"; +"Show on GitHub" = "Toon op GitHub"; +"Show {n} resolved conversation" = "Toon {n} opgeloste conversatie"; +"Show {n} resolved conversations" = "Toon {n} opgeloste conversaties"; +"Suggested change" = "Voorgestelde wijziging"; +"Suggestions can only target new-file lines — GitHub applies them in place of the commented lines." = "Suggesties kunnen alleen op regels van het nieuwe bestand mikken — GitHub past ze toe in plaats van de becommentarieerde regels."; +"The conversation could not be loaded — retrying." = "De conversatie kon niet worden geladen — nieuwe poging."; +"The targeted lines aren't available to suggest an edit to." = "De aangewezen regels zijn niet beschikbaar om een bewerking voor te stellen."; +"This block isn't part of the pull request's diff — GitHub can only attach comments to changed lines." = "Dit blok maakt geen deel uit van de diff van de pull request — GitHub kan comments alleen aan gewijzigde regels hangen."; +"This file is empty on both sides of the diff." = "Dit bestand is aan beide kanten van de diff leeg."; +"Unresolve" = "Markeer als onopgelost"; +"View commit on GitHub" = "Bekijk commit op GitHub"; +"View in File" = "Bekijk in bestand"; +"Write a reply" = "Schrijf een antwoord"; +"Write at the end of the document" = "Schrijf aan het eind van het document"; +"all conversations resolved" = "alle conversaties opgelost"; +"approved these changes" = "heeft deze wijzigingen goedgekeurd"; +"bot" = "bot"; +"copied" = "gekopieerd"; +"dismissed their review" = "heeft de review verworpen"; +"moved" = "verplaatst"; +"requested changes" = "heeft wijzigingen gevraagd"; +"reviewed" = "heeft gereviewd"; +"whole document" = "hele document"; +"{n} comment" = "{n} comment"; +"{n} comments" = "{n} comments"; +"{n} review" = "{n} review"; +"{n} reviews" = "{n} reviews"; +"{n} unresolved conversation" = "{n} onopgeloste conversatie"; +"{n} unresolved conversations" = "{n} onopgeloste conversaties"; +" · edited" = " · bewerkt"; +"· asks where to open" = "· vraagt waar te openen"; +"· opens in PullMark" = "· opent in PullMark"; +"· opens in browser" = "· opent in browser"; +"{n} comment — click to expand" = "{n} comment — klik om uit te klappen"; +"{n} comments — click to expand" = "{n} comments — klik om uit te klappen"; +"Closed" = "Gesloten"; +"Draft" = "Concept"; +"Merged" = "Gemerged"; +"Unavailable" = "Niet beschikbaar"; +"View on GitHub" = "Bekijk op GitHub"; +"View all checks on GitHub" = "Bekijk alle checks op GitHub"; +"%lld of %lld done" = "%lld van %lld klaar"; +"%lld of %lld failing" = "%lld van %lld mislukt"; +"A clean margin, numbers on demand in Source" = "Een rustige marge, nummers op verzoek in Source"; +"A workflow is waiting for approval" = "Een workflow wacht op goedkeuring"; +"Added" = "Toegevoegd"; +"Changed" = "Gewijzigd"; +"Connected" = "Verbonden"; +"Copied" = "Gekopieerd"; +"Copy GitHub Branch Link" = "Kopieer GitHub-branchlink"; +"Copy GitHub Permalink" = "Kopieer GitHub-permalink"; +"Deleted" = "Verwijderd"; +"Each block's source line in the margin" = "De bronregel van elk blok in de marge"; +"GitHub CLI" = "GitHub CLI"; +"Hidden" = "Verborgen"; +"Language" = "Taal"; +"Language:" = "Taal:"; +"Line numbers hidden" = "Regelnummers verborgen"; +"Line numbers shown" = "Regelnummers zichtbaar"; +"Modified" = "Gewijzigd"; +"Renamed" = "Hernoemd"; +"Shown" = "Zichtbaar"; +"Takes effect after PullMark relaunches." = "Geldt nadat PullMark opnieuw is gestart."; +"Untracked" = "Niet gevolgd"; +"git credential helper" = "git credential helper"; +"Relaunch Now" = "Nu opnieuw starten"; diff --git a/loc/pt-BR.lproj/Localizable.strings b/loc/pt-BR.lproj/Localizable.strings new file mode 100644 index 0000000..c53e5be --- /dev/null +++ b/loc/pt-BR.lproj/Localizable.strings @@ -0,0 +1,606 @@ +/* PullMark — Português (Brasil). Keys are the English strings. */ + +" (none)" = " (nenhum)"; +"%lld Markdown files changed" = "%lld arquivos Markdown alterados"; +"%@ and pushed to origin." = "%@ e enviado para origin."; +"%@ approved" = "%@ aprovou"; +"%@ approved %@" = "%@ aprovou %@"; +"%@ changed while you were annotating — nothing was saved. The current notes are shown now." = "%@ mudou enquanto você estava anotando — nada foi salvo. As notas atuais são as que aparecem agora."; +"%@ changed while you were editing this block — nothing was saved. Re-open the block to edit the current version." = "%@ mudou enquanto você estava editando este bloco — nada foi salvo. Reabra o bloco para editar a versão atual."; +"%@ does not exist at %@." = "%@ não existe em %@."; +"%lld files" = "%lld arquivos"; +"%@ is reserved for %@." = "%@ está reservado para %@."; +"%@ isn't available" = "%@ não está disponível"; +"%@ isn't available on %@: " = "%@ não está disponível em %@: "; +"%@ isn't in a git repository, so there's nothing to compare against." = "%@ não está num repositório git, então não há com o que comparar."; +"%@ isn't inside a git repository." = "%@ não está dentro de um repositório git."; +"%lld more reviewers" = "mais %lld revisores"; +"%lld more…" = "mais %lld…"; +"%lld not yet on GitHub" = "%lld ainda sem envio ao GitHub"; +"%lld of %lld" = "%lld de %lld"; +"%lld other files not shown" = "mais %lld arquivos não mostrados"; +"%@ requested changes" = "%@ solicitou alterações"; +"%@ requested changes %@" = "%@ solicitou alterações %@"; +"%@ words · %lld min" = "%@ palavras · %lld min"; +"%@ — previewing; double-click to keep it with its repo" = "%@ — prévia; clique duas vezes para mantê-lo com seu repositório"; +"%@, but the push failed: %@" = "%@, mas o push falhou: %@"; +"1 Markdown file changed" = "1 arquivo Markdown alterado"; +"1 file" = "1 arquivo"; +"1 more reviewer" = "mais 1 revisor"; +"1 other file not shown" = "mais 1 arquivo não mostrado"; +"Abandon review" = "Abandonar revisão"; +"Abandon this review?" = "Abandonar esta revisão?"; +"About PullMark" = "Sobre o PullMark"; +"Actual Size" = "Tamanho Real"; +"Add Margin Note" = "Adicionar Nota de Margem"; +"Add a margin note on the block you're reading" = "Adicionar uma nota de margem no bloco que você está lendo"; +"Adds a Review discussion section under the PR description listing every thread, with code excerpts and links" = "Adiciona uma seção Discussão da revisão abaixo da descrição do PR, listando cada thread, com trechos de código e links"; +"Adds a pullmark command to /usr/local/bin so you can open files and folders from the shell" = "Adiciona um comando pullmark em /usr/local/bin para você abrir arquivos e pastas pelo shell"; +"Adds the authoring tools — hover a block, ⌥⌘M; documents that already contain notes always show them either way" = "Adiciona as ferramentas de escrita — passe o mouse sobre um bloco, ⌥⌘M; documentos que já contêm notas sempre as mostram de qualquer jeito"; +"After navigating between documents" = "Depois de navegar entre documentos"; +"All pending comments and the summary will be discarded, on GitHub too." = "Todos os comentários pendentes e o resumo serão descartados, também no GitHub."; +"Alpha features are the frontier: their behavior and data formats may change incompatibly between versions, transitions may not be supported, and a feature may be removed entirely. Use them at your own risk." = "Recursos alfa são a fronteira: seu comportamento e seus formatos de dados podem mudar de forma incompatível entre versões, transições podem não ter suporte, e um recurso pode ser removido por completo. Use por sua conta e risco."; +"Already use a git credential helper (macOS keychain, Git Credential Manager)? PullMark finds it automatically — Check Again will confirm." = "Já usa um credential helper do git (chaveiro do macOS, Git Credential Manager)? O PullMark o encontra automaticamente — Verificar Novamente confirma."; +"Anything Git can resolve works: a branch, a tag, or a commit. Leave the new side empty to compare the working file." = "Qualquer coisa que o Git resolva funciona: uma branch, uma tag ou um commit. Deixe o lado novo vazio para comparar o arquivo de trabalho."; +"Appearance" = "Aparência"; +"Applies to the whole file, not a specific line" = "Vale para o arquivo inteiro, não para uma linha específica"; +"Approved" = "Aprovado"; +"Ask on first click" = "Perguntar no primeiro clique"; +"Awaiting review from %@" = "Aguardando revisão de %@"; +"Back" = "Voltar"; +"Blame" = "Blame"; +"Branch name" = "Nome da branch"; +"Branches" = "Branches"; +"Branches and worktrees" = "Branches e worktrees"; +"Browse Repo Files" = "Navegar pelos Arquivos do Repositório"; +"Browse Repo Files…" = "Navegar pelos Arquivos do Repositório…"; +"Built-In Keys" = "Teclas Embutidas"; +"Cancel" = "Cancelar"; +"Changes requested" = "Alterações solicitadas"; +"Check Again" = "Verificar Novamente"; +"Check for Updates" = "Buscar Atualizações"; +"Check for Updates…" = "Buscar Atualizações…"; +"Checking this Mac's credentials…" = "Verificando as credenciais deste Mac…"; +"Checking…" = "Verificando…"; +"Checkout of %@/%@" = "Checkout de %@/%@"; +"Checks awaiting approval" = "Verificações aguardando aprovação"; +"Checks failed" = "Verificações com falha"; +"Checks passed" = "Verificações bem-sucedidas"; +"Checks running" = "Verificações em execução"; +"Choose the file to compare with — it becomes the old side." = "Escolha o arquivo com que comparar — ele vira o lado antigo."; +"Choose which items the toolbar shows, and their order" = "Escolha quais itens a barra de ferramentas mostra, e em que ordem"; +"Clear Menu" = "Limpar Menu"; +"Clear Recents" = "Limpar Recents"; +"Click a shortcut, or select a row and press Return, then type the new keys. Press Delete to remove a shortcut, Esc to cancel." = "Clique num atalho, ou selecione uma linha e pressione Return, depois digite as teclas novas. Pressione Apagar para remover um atalho, Escape para cancelar."; +"Click to type a zoom level" = "Clique para digitar um nível de zoom"; +"Clicking files in Locations:" = "Clicar em arquivos em Locations:"; +"Close" = "Fechar"; +"Close All" = "Fechar Tudo"; +"Close All Files" = "Fechar Todos os Arquivos"; +"Command" = "Comando"; +"Comment" = "Comentar"; +"Comment on %@" = "Comentar em %@"; +"Comment on File" = "Comentar no Arquivo"; +"Comment on any local Markdown document the way you'd comment on a PR. Notes save into the file itself as `` comments — ordinary HTML comments that stay out of rendered Markdown, shown by PullMark as bubbles pinned to their spot, and written so agents can read and act on them. [How margin notes work](https://pullmark.app/docs/experimental/margin-notes/)" = "Comente qualquer documento Markdown local do jeito que você comentaria um PR. As notas são salvas no próprio arquivo como comentários `` — comentários HTML comuns que ficam fora do Markdown renderizado, mostrados pelo PullMark como balões presos ao seu lugar, e escritos para que agentes consigam lê-los e agir sobre eles. [Como funcionam as notas de margem](https://pullmark.app/docs/experimental/margin-notes/)"; +"Comment on any local Markdown document the way you'd comment on a PR. Notes save into the file itself as `` comments — ordinary HTML comments that stay out of rendered Markdown, shown by PullMark as bubbles pinned to their spot. Deleting a note is how it's resolved." = "Comente qualquer documento Markdown local do jeito que você comentaria um PR. As notas são salvas no próprio arquivo como comentários `` — comentários HTML comuns que ficam fora do Markdown renderizado, mostrados pelo PullMark como balões presos ao seu lugar. Apagar uma nota é como ela se resolve."; +"Comment on this file as a whole, not a specific line" = "Comentar neste arquivo como um todo, não numa linha específica"; +"Commit Changes" = "Fazer Commit das Alterações"; +"Commit Changes…" = "Fazer Commit das Alterações…"; +"Commit message" = "Mensagem do commit"; +"Commit to %@" = "Fazer commit em %@"; +"Commit to a new branch" = "Fazer commit numa nova branch"; +"Committed %lld files" = "%lld arquivos commitados"; +"Committed %lld files on new branch “%@”" = "%lld arquivos commitados na nova branch “%@”"; +"Committed 1 file" = "1 arquivo commitado"; +"Committed 1 file on new branch “%@”" = "1 arquivo commitado na nova branch “%@”"; +"Compare" = "Comparar"; +"Compare Revisions" = "Comparar Revisões"; +"Comparing " = "Comparando "; +"Comparing with %@" = "Comparando com %@"; +"Connection status…" = "Status da conexão…"; +"Content Width" = "Largura do Conteúdo"; +"Content width" = "Largura do conteúdo"; +"Control" = "Controle"; +"Copies instructions for CLAUDE.md / AGENTS.md — how to read margin notes and delete them as they're addressed" = "Copia instruções para CLAUDE.md / AGENTS.md — como ler as notas de margem e apagá-las conforme forem resolvidas"; +"Copies the Markdown source of the selected blocks (whole blocks — or the whole document when nothing is selected)" = "Copia o código-fonte Markdown dos blocos selecionados (blocos inteiros — ou o documento inteiro quando nada está selecionado)"; +"Copies “%@” to the clipboard" = "Copia “%@” para a área de transferência"; +"Copy" = "Copiar"; +"Copy %@ to the clipboard" = "Copiar %@ para a área de transferência"; +"Copy GitHub Link" = "Copiar Link do GitHub"; +"Copy GitHub links as:" = "Copiar links do GitHub como:"; +"Copy Path" = "Copiar Caminho"; +"Copy as Markdown" = "Copiar como Markdown"; +"Could not abandon the review: %@" = "Não foi possível abandonar a revisão: %@"; +"Could not create the PDF: %@" = "Não foi possível criar o PDF: %@"; +"Could not delete the comment: %@" = "Não foi possível apagar o comentário: %@"; +"Could not discard the pending comment: %@" = "Não foi possível descartar o comentário pendente: %@"; +"Could not post the comment — the PR session is no longer available. Your text was kept as a draft." = "Não foi possível publicar o comentário — a sessão do PR não está mais disponível. Seu texto foi mantido como rascunho."; +"Could not post the comment: %@" = "Não foi possível publicar o comentário: %@"; +"Could not post the reply — the PR session is no longer available. Your text was kept as a draft." = "Não foi possível publicar a resposta — a sessão do PR não está mais disponível. Seu texto foi mantido como rascunho."; +"Could not post the reply: %@" = "Não foi possível publicar a resposta: %@"; +"Could not read %@." = "Não foi possível ler %@."; +"Could not read the rendered page." = "Não foi possível ler a página renderizada."; +"Could not refresh %@: %@" = "Não foi possível atualizar %@: %@"; +"Could not save %@: %@" = "Não foi possível salvar %@: %@"; +"Could not save the edit: %@" = "Não foi possível salvar a edição: %@"; +"Could not update the reaction: %@" = "Não foi possível atualizar a reação: %@"; +"Could not upload %lld pending comments to GitHub — kept locally for retry. %@" = "Não foi possível enviar %lld comentários pendentes ao GitHub — mantidos localmente para nova tentativa. %@"; +"Could not upload 1 pending comment to GitHub — kept locally for retry. %@" = "Não foi possível enviar 1 comentário pendente ao GitHub — mantido localmente para nova tentativa. %@"; +"Couldn't move PullMark" = "Não foi possível mover o PullMark"; +"Couldn't open %@/%@#%lld: " = "Não foi possível abrir %@/%@#%lld: "; +"Couldn't open %@: %@" = "Não foi possível abrir %@: %@"; +"Couldn't open %@: %@. It may not exist at that ref, or it may be a private repository your GitHub credentials can't access." = "Não foi possível abrir %@: %@. Pode não existir nesse ref, ou pode ser um repositório privado que suas credenciais do GitHub não acessam."; +"Couldn't revert: %@" = "Não foi possível reverter: %@"; +"Couldn't save %@: " = "Não foi possível salvar %@: "; +"Couldn't save %@: %@" = "Não foi possível salvar %@: %@"; +"Current branch" = "Branch atual"; +"Custom themes" = "Temas personalizados"; +"Customize Toolbar…" = "Personalizar Barra de Ferramentas…"; +"Dark" = "Dark"; +"Default diff layout:" = "Layout padrão do diff:"; +"Delete" = "Apagar"; +"Delete comment" = "Apagar comentário"; +"Delete this comment?" = "Apagar este comentário?"; +"Determining how this copy was installed…" = "Determinando como esta cópia foi instalada…"; +"Discard the pending review and all its comments, on GitHub too" = "Descartar a revisão pendente e todos os seus comentários, também no GitHub"; +"Dismiss" = "Dispensar"; +"Dismiss Preview" = "Dispensar Prévia"; +"Dismiss — PullMark won't ask again unless you make it the default" = "Dispensar — o PullMark não pergunta de novo a menos que você o torne o padrão"; +"Dismiss — this version won't be suggested again" = "Dispensar — esta versão não será sugerida de novo"; +"Don't ask again for this repository" = "Não perguntar de novo para este repositório"; +"Done" = "Concluído"; +"Dotfiles and hidden folders in Locations — like ⇧⌘. in Finder" = "Dotfiles e pastas ocultas em Locations — como ⇧⌘. no Finder"; +"Dotfiles and hidden folders in Locations — ⇧⌘. toggles this too, like Finder" = "Dotfiles e pastas ocultas em Locations — ⇧⌘. também alterna isto, como no Finder"; +"Down Arrow" = "Seta para baixo"; +"Download" = "Baixar"; +"Downloads the update, verifies its signature, and installs it in place" = "Baixa a atualização, verifica sua assinatura e a instala no lugar"; +"Drag PullMark to Applications in the Finder instead. (%@)" = "Arraste o PullMark para Aplicativos no Finder. (%@)"; +"Each block's starting source line, in the margin of rendered documents and diffs — hover a number for the block's full range. Rendered text wraps freely, so numbering is per block, not per visual line. The raw source view always shows its own line numbers." = "A linha inicial de cada bloco no código-fonte, na margem de documentos e diffs renderizados — passe o mouse sobre um número para ver o intervalo completo do bloco. O texto renderizado quebra livremente, então a numeração é por bloco, não por linha visual. A visualização do código-fonte bruto sempre mostra os próprios números de linha."; +"Edit" = "Editar"; +"Edit Mode" = "Modo de Edição"; +"Enable margin notes" = "Ativar notas de margem"; +"End" = "Fim"; +"Escape" = "Escape"; +"Every release's notes, up to the version you're running" = "As notas de cada versão, até a que você está usando"; +"Exact commit (permalink)" = "Commit exato (permalink)"; +"Expand All" = "Expandir Tudo"; +"Experimental" = "Experimental"; +"Export as HTML…" = "Exportar como HTML…"; +"Export as PDF…" = "Exportar como PDF…"; +"Features land here before their design is settled. **Beta** features get a real compatibility effort between versions and are likely to graduate. **Alpha** features carry no guarantees: they may change incompatibly, their data formats may not migrate, and they may disappear entirely. [About experimental features](https://pullmark.app/docs/experimental/)" = "Os recursos chegam aqui antes de o design assentar. Recursos **beta** recebem um esforço real de compatibilidade entre versões e provavelmente vão se graduar. Recursos **alfa** não trazem garantia nenhuma: podem mudar de forma incompatível, seus formatos de dados podem não migrar, e podem desaparecer por completo. [Sobre os recursos experimentais](https://pullmark.app/docs/experimental/)"; +"Features land here before their design is settled. **Beta** features get a real compatibility effort between versions and are likely to graduate. [About experimental features](https://pullmark.app/docs/experimental/)" = "Os recursos chegam aqui antes de o design assentar. Recursos **beta** recebem um esforço real de compatibilidade entre versões e provavelmente vão se graduar. [Sobre os recursos experimentais](https://pullmark.app/docs/experimental/)"; +"File" = "Arquivo"; +"File Margin Note…" = "Nota de Margem do Arquivo…"; +"Fill in a known branch, tag, or commit" = "Preencher com uma branch, tag ou commit conhecido"; +"Find Next" = "Buscar Seguinte"; +"Find Previous" = "Buscar Anterior"; +"Find in Page" = "Buscar na Página"; +"Find in page" = "Buscar na página"; +"Finish your review · %lld" = "Finalizar a revisão · %lld"; +"Finish your review — 1 pending comment" = "Finalizar a revisão — 1 comentário pendente"; +"Finish your review — %lld pending comments" = "Finalizar a revisão — %lld comentários pendentes"; +"Flip Diff Layout" = "Inverter Layout do Diff"; +"Forward" = "Avançar"; +"Forward Delete" = "Apagar para frente"; +"Full Width" = "Full Width"; +"General" = "Geral"; +"GitHub" = "GitHub"; +"GitHub API error (%lld): %@" = "Erro da API do GitHub (%lld): %@"; +"GitHub Access" = "Acesso ao GitHub"; +"GitHub Markdown links:" = "Links de Markdown do GitHub:"; +"Go" = "Ir"; +"Hide Hidden Files" = "Ocultar Arquivos Ocultos"; +"Hide Margin Notes" = "Ocultar Notas de Margem"; +"Hide Markdown Source" = "Ocultar Código-Fonte Markdown"; +"Hide Outline" = "Ocultar Sumário"; +"Hide Resolved Conversations" = "Ocultar Conversas Resolvidas"; +"Hide review requests with no Markdown files — PullMark has nothing to show for them" = "Esconde solicitações de revisão sem arquivos Markdown — o PullMark não tem nada a mostrar para elas"; +"History" = "Histórico"; +"Home" = "Início"; +"Hover any block for the note bubble (select text first to quote it), or press ⌥⌘M. Edit and delete from each bubble; deleting a note is how it's resolved. Open Files rows show a count chip while a document still carries notes, and View → Hide Margin Notes clears the page for clean reading." = "Passe o mouse sobre qualquer bloco para ver o balão de nota (selecione texto antes para citá-lo), ou pressione ⌥⌘M. Edite e apague a partir de cada balão; apagar uma nota é como ela se resolve. As linhas de Open Files mostram um chip com a contagem enquanto um documento ainda carrega notas, e Visualizar → Ocultar Notas de Margem limpa a página para uma leitura sem nada."; +"How far text may stretch before it wraps. Standard keeps the classic book-like measure; Wide fits more on screen and still caps the line length; Full Width gives the document the whole window — handy in full screen. Applies everywhere, live, and plays with any theme." = "O quanto o texto pode se esticar antes de quebrar. Standard mantém a clássica medida de livro; Wide cabe mais na tela e ainda limita o comprimento da linha; Full Width dá ao documento a janela inteira — útil em tela cheia. Vale em todo lugar, ao vivo, e combina com qualquer tema."; +"How wide the rendered text column runs" = "A largura da coluna de texto renderizado"; +"In a local document" = "Num documento local"; +"In a pull request" = "Num pull request"; +"In a pull request file" = "Num arquivo de pull request"; +"In a pull request file's Result view" = "Na visão Resultado de um arquivo de pull request"; +"Install pullmark Command…" = "Instalar o Comando pullmark…"; +"Jump to another Markdown file in this pull request" = "Pular para outro arquivo Markdown neste pull request"; +"Jump to any file, heading, or pull request" = "Pular para qualquer arquivo, título ou pull request"; +"Jump to the GitHub connection section" = "Pular para a seção de conexão com o GitHub"; +"Keep" = "Manter"; +"Keep Open" = "Manter Aberto"; +"Keep Using" = "Continuar Usando"; +"Keyboard" = "Teclado"; +"Large repo — not all files shown" = "Repositório grande — nem todos os arquivos são mostrados"; +"Last seen at %@. " = "Visto pela última vez em %@. "; +"Layout" = "Layout"; +"Left Arrow" = "Seta para a esquerda"; +"Light" = "Light"; +"Light, Dark, or match the system — the window and every rendered page follow, and each theme brings its own light and dark looks." = "Light, Dark ou acompanhar o sistema — a janela e cada página renderizada seguem junto, e cada tema traz seus próprios visuais claro e escuro."; +"Line %lld (new)" = "Linha %lld (nova)"; +"Line %lld (old)" = "Linha %lld (antiga)"; +"Line numbers" = "Números de linha"; +"Loading repo files…" = "Carregando os arquivos do repositório…"; +"Locations" = "Locations"; +"Make Default Again" = "Tornar Padrão de Novo"; +"Make PullMark the Default" = "Tornar o PullMark o Padrão"; +"Make the document bigger" = "Aumentar o documento"; +"Make the document bigger — text, images, and the content column scale together" = "Aumentar o documento — texto, imagens e a coluna de conteúdo crescem juntos"; +"Make the document smaller" = "Diminuir o documento"; +"Make the page writable — then click any block" = "Torna a página editável — depois clique em qualquer bloco"; +"Make this choice the default for GitHub Markdown links" = "Tornar esta escolha o padrão para links de Markdown do GitHub"; +"Margin Notes" = "Notas de Margem"; +"Margin notes are experimental (beta): the design may still shift between versions, and Settings → Experimental turns them off any time. [How margin notes work](https://pullmark.app/docs/experimental/margin-notes/)" = "As notas de margem são experimentais (beta): o design ainda pode mudar entre versões, e Ajustes → Experimental as desliga a qualquer momento. [Como funcionam as notas de margem](https://pullmark.app/docs/experimental/margin-notes/)"; +"Margin notes are hidden — choose View → Show Margin Notes first." = "As notas de margem estão ocultas — escolha Visualizar → Mostrar Notas de Margem primeiro."; +"Margin notes are off — turn them back on in Settings → Experimental." = "As notas de margem estão desativadas — ative-as de novo em Ajustes → Experimental."; +"Margin notes are off — turn them on in Settings → Experimental." = "As notas de margem estão desativadas — ative-as em Ajustes → Experimental."; +"Margin-note bubbles ( comments) in rendered documents" = "Balões de notas de margem (comentários ) em documentos renderizados"; +"Markdown files open in PullMark" = "Arquivos Markdown abrem no PullMark"; +"Mission Control" = "Mission Control"; +"Move PullMark to your Applications folder?" = "Mover o PullMark para a pasta Aplicativos?"; +"Move to Applications" = "Mover para Aplicativos"; +"Move to Trash" = "Mover para o Lixo"; +"Next File" = "Próximo Arquivo"; +"Next Markdown file in this pull request" = "Próximo arquivo Markdown neste pull request"; +"Next match" = "Ocorrência seguinte"; +"No Markdown files found in %@." = "Nenhum arquivo Markdown encontrado em %@."; +"No changes to commit." = "Nenhuma alteração para commitar."; +"No headings" = "Sem títulos"; +"None" = "Nenhum"; +"Not Now" = "Agora Não"; +"Not a Homebrew user? [Download the CLI from cli.github.com](https://cli.github.com), then sign in the same way." = "Não usa Homebrew? [Baixe a CLI em cli.github.com](https://cli.github.com), depois entre da mesma forma."; +"Not available in this build" = "Indisponível nesta build"; +"Not connected" = "Não conectado"; +"Not connected to GitHub — private repositories and reviewing are unavailable." = "Não conectado ao GitHub — repositórios privados e revisão estão indisponíveis."; +"Notes are written so agents can read and act on them. Paste the snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in this file\" becomes a complete handoff." = "As notas são escritas para que agentes consigam lê-las e agir sobre elas. Cole o trecho no arquivo de instruções do seu agente (CLAUDE.md, AGENTS.md, …) e \"resolva as notas de margem neste arquivo\" vira um repasse completo."; +"OK" = "OK"; +"Off shows a quiet banner instead — the notes stay one click away" = "Desligado mostra um banner discreto — as notas ficam a um clique"; +"Only requests that change Markdown" = "Apenas solicitações que mudam Markdown"; +"Open" = "Abrir"; +"Open Branch Separately" = "Abrir a Branch Separadamente"; +"Open File or Folder" = "Abrir Arquivo ou Pasta"; +"Open Files" = "Open Files"; +"Open File…" = "Abrir Arquivo…"; +"Open Folder…" = "Abrir Pasta…"; +"Open Fully" = "Abrir por Completo"; +"Open GitHub Markdown links in PullMark?" = "Abrir links de Markdown do GitHub no PullMark?"; +"Open Markdown files" = "Abra arquivos Markdown"; +"Open Markdown files or a folder containing them" = "Abrir arquivos Markdown ou uma pasta que os contenha"; +"Open Pull Request" = "Abrir Pull Request"; +"Open Pull Request…" = "Abrir Pull Request…"; +"Open Quickly — files, headings, pull requests, or paths" = "Abrir Rapidamente — arquivos, títulos, pull requests ou caminhos"; +"Open Quickly…" = "Abrir Rapidamente…"; +"Open Recent" = "Abrir Recentes"; +"Open Release Page" = "Abrir a Página da Release"; +"Open Themes Folder" = "Abrir a Pasta Themes"; +"Open Worktree" = "Abrir Worktree"; +"Open a GitHub pull request" = "Abrir um pull request do GitHub"; +"Open a Markdown file or a GitHub pull request" = "Abra um arquivo Markdown ou um pull request do GitHub"; +"Open a folder containing Markdown files" = "Abra uma pasta com arquivos Markdown"; +"Open files, folders, and worktrees from the shell — [about the pullmark command](https://pullmark.app/docs/cli/)." = "Abra arquivos, pastas e worktrees pelo shell — [sobre o comando pullmark](https://pullmark.app/docs/cli/)."; +"Open in Browser" = "Abrir no Navegador"; +"Open in PullMark" = "Abrir no PullMark"; +"Open local Markdown files or a folder" = "Abrir arquivos Markdown locais ou uma pasta"; +"Open on GitHub" = "Abrir no GitHub"; +"Open pull requests where your review is requested" = "Pull requests abertos onde sua revisão foi solicitada"; +"Open the review — pending comments, summary, and verdict" = "Abrir a revisão — comentários pendentes, resumo e veredito"; +"Opens the release page on GitHub" = "Abre a página da release no GitHub"; +"Opens the release page on GitHub to update manually" = "Abre a página da release no GitHub para atualizar manualmente"; +"Open…" = "Abrir…"; +"Option" = "Opção"; +"Outdated" = "Desatualizado"; +"Outdated — was line %lld" = "Desatualizado — era a linha %lld"; +"Outline" = "Sumário"; +"PR Overview" = "Visão Geral do PR"; +"Page Down" = "Página abaixo"; +"Page Setup…" = "Configurar Página…"; +"Page Up" = "Página acima"; +"Paper size and orientation for printing" = "Tamanho e orientação do papel para impressão"; +"Paste the copied snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in the file\" becomes a complete handoff — the agent deletes each note as it resolves it, and you watch the bubbles disappear." = "Cole o trecho copiado no arquivo de instruções do seu agente (CLAUDE.md, AGENTS.md, …) e \"resolva as notas de margem no arquivo\" vira um repasse completo — o agente apaga cada nota conforme a resolve, e você vê os balões desaparecerem."; +"Pending review on GitHub" = "Revisão pendente no GitHub"; +"Pinned to commit %@ — the ref's tip as of this session's last fetch." = "Fixado no commit %@ — a ponta do ref no último fetch desta sessão."; +"Posts immediately — file comments can't join a pending review." = "Publica imediatamente — comentários de arquivo não entram numa revisão pendente."; +"Preview First" = "Prévia Primeiro"; +"Preview First shows a file with one click without keeping it — one italicized entry (in Open Files, or under its GitHub repo) that the next preview replaces. Double-click a file, or just start editing, to keep it open. Open Fully keeps every file you click." = "Prévia Primeiro mostra um arquivo com um clique sem mantê-lo — uma única entrada em itálico (em Open Files, ou sob o repositório do GitHub dele) que a próxima prévia substitui. Dê um duplo clique num arquivo, ou simplesmente comece a editar, para mantê-lo aberto. Abrir por Completo mantém cada arquivo em que você clica."; +"Previous File" = "Arquivo Anterior"; +"Previous Markdown file in this pull request" = "Arquivo Markdown anterior neste pull request"; +"Previous match" = "Ocorrência anterior"; +"Print the rendered document" = "Imprimir o documento renderizado"; +"Print…" = "Imprimir…"; +"Private repositories, commenting, and reviewing are ready." = "Repositórios privados, comentários e revisão estão prontos."; +"Pull Requests" = "Pull Requests"; +"PullMark %@ is available." = "O PullMark %@ está disponível."; +"PullMark Website" = "Site do PullMark"; +"PullMark borrows the GitHub credentials your own tools already have — the GitHub CLI or a git credential helper. It has no login of its own, stores nothing, and never sees a password." = "O PullMark pega emprestadas as credenciais do GitHub que suas próprias ferramentas já têm — a CLI do GitHub ou um credential helper do git. Ele não tem login próprio, não guarda nada e nunca vê uma senha."; +"PullMark borrows the credentials your own tools already have — the GitHub CLI or a git credential helper. It has no login of its own, stores nothing, and never sees a password. [About GitHub access](https://pullmark.app/docs/troubleshooting/#github-access)" = "O PullMark pega emprestadas as credenciais que suas próprias ferramentas já têm — a CLI do GitHub ou um credential helper do git. Ele não tem login próprio, não guarda nada e nunca vê uma senha. [Sobre o acesso ao GitHub](https://pullmark.app/docs/troubleshooting/#github-access)"; +"PullMark can fetch this file and render it in-app, or send it to your browser. Hold ⌘ while clicking a link for the other behavior; the default lives in Settings → General." = "O PullMark pode buscar este arquivo e renderizá-lo no app, ou mandá-lo para o seu navegador. Segure ⌘ ao clicar num link para o outro comportamento; o padrão fica em Ajustes → Geral."; +"PullMark is in demo mode — network access is disabled." = "PullMark está em modo de demonstração — o acesso à rede está desativado."; +"PullMark is installed — the disk image is no longer needed. This ejects it and moves “%@” to the Trash." = "O PullMark está instalado — a imagem de disco não é mais necessária. Isto a ejeta e move “%@” para o Lixo."; +"PullMark is no longer your default Markdown app." = "O PullMark não é mais seu app padrão de Markdown."; +"PullMark is running from its disk image. Moving it to Applications installs it properly and enables one-click updates." = "O PullMark está rodando a partir da imagem de disco. Movê-lo para Aplicativos o instala direito e habilita atualizações com um clique."; +"Push to origin after committing" = "Fazer push para origin depois do commit"; +"Quick Look previews:" = "Prévias do Quick Look:"; +"Raw Source" = "Código-Fonte"; +"Re-read credentials from the GitHub CLI and git credential helpers" = "Relê as credenciais da CLI do GitHub e dos credential helpers do git"; +"Re-read credentials from the GitHub CLI and git credential helpers — after gh auth login, this connects without relaunching" = "Relê as credenciais da CLI do GitHub e dos credential helpers do git — depois de gh auth login, isto conecta sem reabrir o app"; +"Re-read this file from disk" = "Reler este arquivo do disco"; +"Reaction state unavailable — try refreshing the PR." = "Estado da reação indisponível — tente atualizar o PR."; +"Reading" = "Leitura"; +"Recents" = "Recents"; +"Redo" = "Refazer"; +"Refresh" = "Atualizar"; +"Refresh Folder" = "Atualizar Pasta"; +"Release Notes" = "Notas da Versão"; +"Release notes couldn't be loaded — they're also at github.com/jedijashwa/pullmark/releases." = "Não foi possível carregar as notas da versão — elas também estão em github.com/jedijashwa/pullmark/releases."; +"Reload" = "Recarregar"; +"Reload Document" = "Recarregar Documento"; +"Remember my selection" = "Lembrar minha escolha"; +"Remote Branches" = "Branches Remotas"; +"Remove from Recents" = "Remover de Recents"; +"Remove from Sidebar" = "Remover da Barra Lateral"; +"Remove the PullMark disk image?" = "Remover a imagem de disco do PullMark?"; +"Rendered" = "Renderizado"; +"Rendered Diff" = "Diff Renderizado"; +"Reopen what was in the sidebar when PullMark last quit" = "Reabre o que estava na barra lateral quando o PullMark foi encerrado"; +"Reopening…" = "Reabrindo…"; +"Report a Bug…" = "Relatar um Erro…"; +"Report an Issue…" = "Relatar um Problema…"; +"Request a Feature…" = "Solicitar um Recurso…"; +"Required" = "Obrigatório"; +"Reset the zoom to 100%" = "Redefinir o zoom para 100%"; +"Restore Defaults" = "Restaurar Padrões"; +"Restore Defaults…" = "Restaurar Padrões…"; +"Restore all keyboard shortcuts to their defaults?" = "Restaurar todos os atalhos de teclado para os padrões?"; +"Restore files and pull requests from the last session" = "Restaurar arquivos e pull requests da última sessão"; +"Restore the default" = "Restaurar o padrão"; +"Restore the file as it was before PullMark's last edit" = "Restaurar o arquivo como estava antes da última edição do PullMark"; +"Result" = "Resultado"; +"Retry" = "Tentar Novamente"; +"Retry Upload" = "Reenviar"; +"Return" = "Return"; +"Reveal in Finder" = "Mostrar no Finder"; +"Reveal in Location" = "Mostrar no Location"; +"Reveal on GitHub" = "Mostrar no GitHub"; +"Reveal resolved review conversations in the Result view" = "Mostra as conversas de revisão resolvidas na visão Resultado"; +"Revert Last Edit" = "Reverter Última Edição"; +"Reverted the last edit to %@." = "A última edição em %@ foi revertida."; +"Review Changes…" = "Revisar Alterações…"; +"Review Requests" = "Solicitações de Revisão"; +"Review changes" = "Revisar alterações"; +"Review comments couldn't be loaded — existing threads may be missing." = "Não foi possível carregar os comentários de revisão — threads existentes podem estar faltando."; +"Review requested from %@" = "Revisão solicitada de %@"; +"Review required" = "Revisão necessária"; +"Review submitted." = "Revisão enviada."; +"Review summary (optional)" = "Resumo da revisão (opcional)"; +"Review verdict" = "Veredito da revisão"; +"Reviewing" = "Revisão"; +"Right Arrow" = "Seta para a direita"; +"Runs “%@” and relaunches PullMark" = "Executa “%@” e reabre o PullMark"; +"Save the rendered document as a PDF" = "Salvar o documento renderizado como PDF"; +"Save the rendered document as a self-contained HTML file" = "Salvar o documento renderizado como um arquivo HTML autocontido"; +"Saved as a pending review — visible only to you until you submit" = "Salvo como revisão pendente — visível só para você até você enviar"; +"Search All Files…" = "Buscar em Todos os Arquivos…"; +"Search all files" = "Buscar em todos os arquivos"; +"See if something even newer is available" = "Ver se há algo ainda mais novo disponível"; +"Set Up GitHub Access…" = "Configurar o Acesso ao GitHub…"; +"Set Up…" = "Configurar…"; +"Set up the GitHub CLI" = "Configure a CLI do GitHub"; +"Share" = "Compartilhar"; +"Shift" = "Shift"; +"Show" = "Mostrar"; +"Show Alpha Features" = "Mostrar Recursos Alfa"; +"Show Hidden Files" = "Mostrar Arquivos Ocultos"; +"Show Margin Notes" = "Mostrar Notas de Margem"; +"Show Markdown Source" = "Mostrar Código-Fonte Markdown"; +"Show Outline" = "Mostrar Sumário"; +"Show Resolved Conversations" = "Mostrar Conversas Resolvidas"; +"Show What's New after an update" = "Mostrar Novidades depois de uma atualização"; +"Show alpha features" = "Mostrar recursos alfa"; +"Show alpha features?" = "Mostrar recursos alfa?"; +"Show hidden files" = "Mostrar arquivos ocultos"; +"Show or hide the document outline" = "Mostrar ou ocultar o sumário do documento"; +"Show review discussion on the PR overview" = "Mostrar a discussão da revisão na visão geral do PR"; +"Show review requests in the sidebar" = "Mostrar solicitações de revisão na barra lateral"; +"Show the next document" = "Mostrar o próximo documento"; +"Show the previous document" = "Mostrar o documento anterior"; +"Show the raw Markdown behind the rendered document" = "Mostrar o Markdown cru por trás do documento renderizado"; +"Show who last changed each block (git blame)" = "Mostrar quem mudou cada bloco por último (git blame)"; +"Show/Hide Hidden Files" = "Mostrar/Ocultar Arquivos Ocultos"; +"Show/Hide Margin Notes" = "Mostrar/Ocultar Notas de Margem"; +"Show/Hide Markdown Source" = "Mostrar/Ocultar Código-Fonte Markdown"; +"Show/Hide Outline" = "Mostrar/Ocultar Sumário"; +"Show/Hide Resolved Conversations" = "Mostrar/Ocultar Conversas Resolvidas"; +"Showing 500 of %lld changed files — Markdown files are preselected either way." = "Mostrando 500 de %lld arquivos alterados — arquivos Markdown vêm pré-selecionados de qualquer jeito."; +"Showing the first %lld Markdown files" = "Mostrando os primeiros %lld arquivos Markdown"; +"Sign in to GitHub" = "Entre no GitHub"; +"Sign notes as:" = "Assinar as notas como:"; +"Something went wrong" = "Algo deu errado"; +"Source" = "Código-Fonte"; +"Source Diff" = "Diff do Código-Fonte"; +"Space" = "Espaço"; +"Spotlight" = "Spotlight"; +"Stage and commit changes in this file's repository" = "Preparar e commitar as alterações no repositório deste arquivo"; +"Standard" = "Standard"; +"Submit review" = "Enviar revisão"; +"Submit the review with the selected verdict (⌘↩)" = "Enviar a revisão com o veredito selecionado (⌘↩)"; +"Support PullMark ❤️" = "Apoie o PullMark ❤️"; +"Switch between light, dark, and system appearance" = "Alternar entre aparência clara, escura e do sistema"; +"Switch or Open Branch…" = "Trocar ou Abrir Branch…"; +"System" = "Sistema"; +"Tab" = "Tab"; +"Tags" = "Tags"; +"Teach your agent" = "Ensine seu agente"; +"Tell your agent" = "Diga ao seu agente"; +"Temporarily show the raw Markdown behind the rendered document" = "Mostrar temporariamente o Markdown cru por trás do documento renderizado"; +"That link needs a different version of PullMark" = "Esse link precisa de outra versão do PullMark"; +"The @name your notes carry — empty uses your GitHub login, or this Mac's account name when signed out" = "O @nome que suas notas levam — vazio usa seu login do GitHub, ou o nome da conta deste Mac quando desconectado"; +"The GitHub CLI is installed but signed out. Run this in your terminal — it opens a browser to sign in:" = "A CLI do GitHub está instalada, mas desconectada. Rode isto no seu terminal — ele abre um navegador para entrar:"; +"The PR session is no longer available — the draft could not be saved to disk." = "A sessão do PR não está mais disponível — não foi possível salvar o rascunho no disco."; +"The comment will be removed from GitHub. Replies from others will stay." = "O comentário será removido do GitHub. As respostas de outras pessoas permanecem."; +"The document's headings, in a sidebar" = "Os títulos do documento, numa barra lateral"; +"The pull request overview (%@ #%lld)" = "A visão geral do pull request (%@ #%lld)"; +"The pullmark command is installed" = "O comando pullmark está instalado"; +"Theme" = "Tema"; +"Themes restyle rendered Markdown and diffs, and follow the Light/Dark appearance. Drop .css files into the Themes folder to add your own — they apply on top of the GitHub look. Quick Look previews follow your theme too (custom themes fall back to their GitHub base there)." = "Os temas reestilizam o Markdown e os diffs renderizados, e seguem a aparência Light/Dark. Solte arquivos .css na pasta Themes para adicionar os seus — eles se aplicam por cima do visual do GitHub. As prévias do Quick Look também seguem seu tema (temas personalizados voltam para a base GitHub por lá)."; +"These keys are fixed and can't be changed." = "Estas teclas são fixas e não podem ser mudadas."; +"This comment is still syncing with GitHub — try discarding it again in a moment." = "Este comentário ainda está sincronizando com o GitHub — tente descartá-lo de novo daqui a pouco."; +"This folder has more Markdown files than PullMark scans — open a subfolder as its own Location to see the rest" = "Esta pasta tem mais arquivos Markdown do que o PullMark escaneia — abra uma subpasta como seu próprio Location para ver o resto"; +"This pull request was updated on GitHub." = "Este pull request foi atualizado no GitHub."; +"This repository has no GitHub remote." = "Este repositório não tem um remote do GitHub."; +"This version (%@) doesn't know %@ — it may point at a feature from a newer release, or one that has moved. Checking for updates usually resolves it." = "Esta versão (%@) não conhece %@ — pode ser que aponte para um recurso de uma release mais nova, ou para um que mudou de lugar. Buscar atualizações costuma resolver."; +"Thread state unavailable — try refreshing the PR." = "Estado da thread indisponível — tente atualizar o PR."; +"Turn Off" = "Desligar"; +"Up Arrow" = "Seta para cima"; +"Update Now" = "Atualizar Agora"; +"Update failed: %@" = "A atualização falhou: %@"; +"Updated to PullMark %@." = "Atualizado para o PullMark %@."; +"Updates" = "Atualizações"; +"Upload the remaining comments into your pending review on GitHub" = "Enviar os comentários restantes para sua revisão pendente no GitHub"; +"Use Anyway" = "Usar Mesmo Assim"; +"Using it" = "Como usar"; +"View" = "Visualizar"; +"View All Release Notes" = "Ver Todas as Notas da Versão"; +"View as List" = "Ver como Lista"; +"View as Tree" = "Ver como Árvore"; +"Viewing signed out — commenting and reviewing are unavailable" = "Visualizando desconectado — comentar e revisar estão indisponíveis"; +"Walk through connecting PullMark to GitHub" = "Um passo a passo para conectar o PullMark ao GitHub"; +"What Copy GitHub Link copies — hold ⌥ in the menu for the other flavor" = "O que Copiar Link do GitHub copia — segure ⌥ no menu para a outra variante"; +"What changed since the last commit, rendered like a PR diff — the toolbar's Compare button offers older revisions and branches" = "O que mudou desde o último commit, renderizado como um diff de PR — o botão Comparar da barra de ferramentas oferece revisões e branches mais antigas"; +"What clicking a link to a Markdown file on GitHub does — hold ⌘ while clicking for the other behavior" = "O que clicar num link para um arquivo Markdown no GitHub faz — segure ⌘ ao clicar para o outro comportamento"; +"What pressing space in Finder shows for Markdown files" = "O que pressionar espaço no Finder mostra para arquivos Markdown"; +"What's New" = "Novidades"; +"While the find bar is open" = "Enquanto a barra de busca está aberta"; +"Whole file" = "Arquivo inteiro"; +"Wide" = "Wide"; +"With a folder selected" = "Com uma pasta selecionada"; +"With a local file or folder in a GitHub repository selected" = "Com um arquivo ou pasta local num repositório do GitHub selecionado"; +"With a local file or folder selected" = "Com um arquivo ou pasta local selecionado"; +"With files in Open Files" = "Com arquivos em Open Files"; +"Works with private repos using your existing gh or git credentials." = "Funciona com repositórios privados usando suas credenciais existentes do gh ou do git."; +"You're on %@." = "Você está em %@."; +"Your custom shortcuts will be removed. This can't be undone." = "Seus atalhos personalizados serão removidos. Isto não pode ser desfeito."; +"Zoom In" = "Mais Zoom"; +"Zoom Out" = "Menos Zoom"; +"and %lld more" = "e mais %lld"; +"confirming sheets" = "confirmar folhas"; +"cycling windows" = "alternar entre janelas"; +"dismissing sheets" = "dispensar folhas"; +"https://github.com/owner/repo/pull/123 or owner/repo#123" = "https://github.com/owner/repo/pull/123 ou owner/repo#123"; +"just now" = "agora mesmo"; +"on base branch" = "na branch base"; +"opened by %@" = "aberto por %@"; +"the Help menu" = "o menu Ajuda"; +"the app switcher" = "o alternador de apps"; +" · was {r}" = " · era {r}"; +"(empty)" = "(vazio)"; +"Add a margin note" = "Adicionar uma nota de margem"; +"Add a suggestion" = "Adicionar uma sugestão"; +"Add reaction" = "Adicionar reação"; +"Add single comment" = "Adicionar comentário único"; +"Click the gutter for history" = "Clique na margem para ver o histórico"; +"Comment actions" = "Ações do comentário"; +"Comment on line {n}" = "Comentar na linha {n}"; +"Comment on lines {a}–{b}" = "Comentar nas linhas {a}–{b}"; +"Comment on new line {n}" = "Comentar na nova linha {n}"; +"Comment on new line {n} — shift-click extends the range" = "Comentar na nova linha {n} — shift-clique estende o intervalo"; +"Comment on new lines {a}–{b}" = "Comentar nas novas linhas {a}–{b}"; +"Comment on old line {n} — shift-click extends the range" = "Comentar na linha antiga {n} — shift-clique estende o intervalo"; +"Comment on old lines {a}–{b}" = "Comentar nas linhas antigas {a}–{b}"; +"Comment on the pull request conversation" = "Comentar na conversa do pull request"; +"Conversation" = "Conversa"; +"Copy full SHA" = "Copiar o SHA completo"; +"Couldn't load this image from GitHub · " = "Não foi possível carregar esta imagem do GitHub · "; +"File comments" = "Comentários do arquivo"; +"Front matter" = "Front matter"; +"Hide {n} resolved conversation" = "Ocultar {n} conversa resolvida"; +"Hide {n} resolved conversations" = "Ocultar {n} conversas resolvidas"; +"Insert a ```suggestion block pre-filled with the current lines" = "Insere um bloco ```suggestion já preenchido com as linhas atuais"; +"LEFT" = "LEFT"; +"Leave a comment" = "Deixe um comentário"; +"Line {n}" = "Linha {n}"; +"Lines {a}–{b}" = "Linhas {a}–{b}"; +"Moved from line {n} — content unchanged" = "Movido da linha {n} — conteúdo inalterado"; +"Not synced" = "Não sincronizado"; +"Old line {n}" = "Linha antiga {n}"; +"Old lines {a}–{b}" = "Linhas antigas {a}–{b}"; +"Open this conversation on GitHub — PullMark doesn't render this file" = "Abrir esta conversa no GitHub — o PullMark não renderiza este arquivo"; +"Open {path} and jump to this conversation" = "Abrir {path} e pular para esta conversa"; +"Outdated review comments" = "Comentários de revisão desatualizados"; +"Pending" = "Pendente"; +"Pending comment — click to expand" = "Comentário pendente — clique para expandir"; +"Pending comments — click to expand" = "Comentários pendentes — clique para expandir"; +"Post to the PR conversation right away — not part of a review (⌘↩)" = "Publicar na conversa do PR agora mesmo — fora de uma revisão (⌘↩)"; +"Reply" = "Responder"; +"Reply to this thread (⌘↩)" = "Responder nesta thread (⌘↩)"; +"Resolve" = "Resolver"; +"Resolved" = "Resolvida"; +"Review discussion" = "Discussão da revisão"; +"Save" = "Salvar"; +"Save your edit (⌘↩)" = "Salvar sua edição (⌘↩)"; +"Show on GitHub" = "Mostrar no GitHub"; +"Show {n} resolved conversation" = "Mostrar {n} conversa resolvida"; +"Show {n} resolved conversations" = "Mostrar {n} conversas resolvidas"; +"Suggested change" = "Alteração sugerida"; +"Suggestions can only target new-file lines — GitHub applies them in place of the commented lines." = "Sugestões só podem mirar linhas do arquivo novo — o GitHub as aplica no lugar das linhas comentadas."; +"The conversation could not be loaded — retrying." = "Não foi possível carregar a conversa — tentando de novo."; +"The targeted lines aren't available to suggest an edit to." = "As linhas visadas não estão disponíveis para sugerir uma edição."; +"This block isn't part of the pull request's diff — GitHub can only attach comments to changed lines." = "Este bloco não faz parte do diff do pull request — o GitHub só anexa comentários a linhas alteradas."; +"This file is empty on both sides of the diff." = "Este arquivo está vazio nos dois lados do diff."; +"Unresolve" = "Marcar como não resolvida"; +"View commit on GitHub" = "Ver o commit no GitHub"; +"View in File" = "Ver no Arquivo"; +"Write a reply" = "Escreva uma resposta"; +"Write at the end of the document" = "Escrever no fim do documento"; +"all conversations resolved" = "todas as conversas resolvidas"; +"approved these changes" = "aprovou estas alterações"; +"bot" = "bot"; +"copied" = "copiado"; +"dismissed their review" = "dispensou a revisão"; +"moved" = "movido"; +"requested changes" = "solicitou alterações"; +"reviewed" = "revisou"; +"whole document" = "documento inteiro"; +"{n} comment" = "{n} comentário"; +"{n} comments" = "{n} comentários"; +"{n} review" = "{n} revisão"; +"{n} reviews" = "{n} revisões"; +"{n} unresolved conversation" = "{n} conversa não resolvida"; +"{n} unresolved conversations" = "{n} conversas não resolvidas"; +" · edited" = " · editado"; +"· asks where to open" = "· pergunta onde abrir"; +"· opens in PullMark" = "· abre no PullMark"; +"· opens in browser" = "· abre no navegador"; +"{n} comment — click to expand" = "{n} comentário — clique para expandir"; +"{n} comments — click to expand" = "{n} comentários — clique para expandir"; +"Closed" = "Fechado"; +"Draft" = "Rascunho"; +"Merged" = "Mesclado"; +"Unavailable" = "Indisponível"; +"View on GitHub" = "Ver no GitHub"; +"View all checks on GitHub" = "Ver todas as verificações no GitHub"; +"%lld of %lld done" = "%lld de %lld concluídas"; +"%lld of %lld failing" = "%lld de %lld com falha"; +"A clean margin, numbers on demand in Source" = "Uma margem limpa, números sob demanda em Fonte"; +"A workflow is waiting for approval" = "Um workflow está aguardando aprovação"; +"Added" = "Adicionado"; +"Changed" = "Alterado"; +"Connected" = "Conectado"; +"Copied" = "Copiado"; +"Copy GitHub Branch Link" = "Copiar link da branch no GitHub"; +"Copy GitHub Permalink" = "Copiar link permanente do GitHub"; +"Deleted" = "Excluído"; +"Each block's source line in the margin" = "A linha de origem de cada bloco na margem"; +"GitHub CLI" = "GitHub CLI"; +"Hidden" = "Ocultos"; +"Language" = "Idioma"; +"Language:" = "Idioma:"; +"Line numbers hidden" = "Números de linha ocultos"; +"Line numbers shown" = "Números de linha visíveis"; +"Modified" = "Modificado"; +"Renamed" = "Renomeado"; +"Shown" = "Visíveis"; +"Takes effect after PullMark relaunches." = "Aplicado quando o PullMark reiniciar."; +"Untracked" = "Não rastreado"; +"git credential helper" = "auxiliar de credenciais do git"; +"Relaunch Now" = "Reiniciar agora"; diff --git a/loc/zh-Hans.lproj/Localizable.strings b/loc/zh-Hans.lproj/Localizable.strings new file mode 100644 index 0000000..fdcee43 --- /dev/null +++ b/loc/zh-Hans.lproj/Localizable.strings @@ -0,0 +1,607 @@ +/* PullMark — Simplified Chinese (zh-Hans). One entry per + loc/_inventory.json key; see docs/specs/app-i18n.md. */ + +" (none)" = "(无)"; +"%lld Markdown files changed" = "更改了 %lld 个 Markdown 文件"; +"%@ and pushed to origin." = "%@,并已推送到 origin。"; +"%@ approved" = "%@ 已批准"; +"%@ approved %@" = "%@ 已批准(%@)"; +"%@ changed while you were annotating — nothing was saved. The current notes are shown now." = "%@ 在你批注期间发生了改动——什么都没有保存。现在显示的是当前的批注。"; +"%@ changed while you were editing this block — nothing was saved. Re-open the block to edit the current version." = "%@ 在你编辑这个区块期间发生了改动——什么都没有保存。请重新打开该区块以编辑当前版本。"; +"%@ does not exist at %@." = "%@ 在 %@ 上不存在。"; +"%lld files" = "%lld 个文件"; +"%@ is reserved for %@." = "%@ 已保留给%@使用。"; +"%@ isn't available" = "%@ 不可用"; +"%@ isn't available on %@: " = "%@ 在 %@ 上不可用:"; +"%@ isn't in a git repository, so there's nothing to compare against." = "%@ 不在 git 仓库中,因此没有可比较的对象。"; +"%@ isn't inside a git repository." = "%@ 不在 git 仓库中。"; +"%lld more reviewers" = "另有 %lld 位审查者"; +"%lld more…" = "还有 %lld 条…"; +"%lld not yet on GitHub" = "%lld 条尚未上传到 GitHub"; +"%lld of %lld" = "第 %lld 个,共 %lld 个"; +"%lld other files not shown" = "另有 %lld 个文件未显示"; +"%@ requested changes" = "%@ 已请求更改"; +"%@ requested changes %@" = "%@ 已请求更改(%@)"; +"%@ words · %lld min" = "%@ 字 · %lld 分钟"; +"%@ — previewing; double-click to keep it with its repo" = "%@ —— 预览中;双击可将它保留在所属仓库下"; +"%@, but the push failed: %@" = "%@,但推送失败:%@"; +"1 Markdown file changed" = "更改了 1 个 Markdown 文件"; +"1 file" = "1 个文件"; +"1 more reviewer" = "另有 1 位审查者"; +"1 other file not shown" = "另有 1 个文件未显示"; +"Abandon review" = "放弃审查"; +"Abandon this review?" = "要放弃这次审查吗?"; +"About PullMark" = "关于 PullMark"; +"Actual Size" = "实际大小"; +"Add Margin Note" = "添加页边批注"; +"Add a margin note on the block you're reading" = "在你正在阅读的区块上添加页边批注"; +"Adds a Review discussion section under the PR description listing every thread, with code excerpts and links" = "在 PR 描述下方添加“审查讨论”分区,列出每一场会话,并附上代码摘录和链接"; +"Adds a pullmark command to /usr/local/bin so you can open files and folders from the shell" = "把 pullmark 命令装进 /usr/local/bin,让你能从命令行打开文件和文件夹"; +"Adds the authoring tools — hover a block, ⌥⌘M; documents that already contain notes always show them either way" = "添加撰写工具——悬停某个区块、按 ⌥⌘M;已经含有批注的文档无论如何都会显示它们"; +"After navigating between documents" = "在文档之间导航之后"; +"All pending comments and the summary will be discarded, on GitHub too." = "所有待提交的评论和总结都会被丢弃,GitHub 上也一样。"; +"Alpha features are the frontier: their behavior and data formats may change incompatibly between versions, transitions may not be supported, and a feature may be removed entirely. Use them at your own risk." = "Alpha 功能位于最前沿:它们的行为与数据格式可能在版本之间发生不兼容的改动,迁移未必受支持,某个功能也可能被彻底移除。使用风险由你自己承担。"; +"Already use a git credential helper (macOS keychain, Git Credential Manager)? PullMark finds it automatically — Check Again will confirm." = "已经在用 git 凭据助手(macOS 钥匙串、Git Credential Manager)?PullMark 会自动找到它——点“重新检查”即可确认。"; +"Anything Git can resolve works: a branch, a tag, or a commit. Leave the new side empty to compare the working file." = "Git 能解析的任何写法都可以:分支、标签,或提交。把新的一侧留空即可与工作区文件比较。"; +"Appearance" = "外观"; +"Applies to the whole file, not a specific line" = "针对整个文件,而不是某一行"; +"Approved" = "已批准"; +"Ask on first click" = "首次点击时询问"; +"Awaiting review from %@" = "等待 %@ 审查"; +"Back" = "后退"; +"Blame" = "Blame"; +"Branch name" = "分支名称"; +"Branches" = "分支"; +"Branches and worktrees" = "分支与工作树"; +"Browse Repo Files" = "浏览仓库文件"; +"Browse Repo Files…" = "浏览仓库文件…"; +"Built-In Keys" = "内置按键"; +"Cancel" = "取消"; +"Changes requested" = "已请求更改"; +"Check Again" = "重新检查"; +"Check for Updates" = "检查更新"; +"Check for Updates…" = "检查更新…"; +"Checking this Mac's credentials…" = "正在检查这台 Mac 的凭据…"; +"Checking…" = "正在检查…"; +"Checkout of %@/%@" = "%@/%@ 的检出"; +"Checks awaiting approval" = "检查等待批准"; +"Checks failed" = "检查失败"; +"Checks passed" = "检查已通过"; +"Checks running" = "检查运行中"; +"Choose the file to compare with — it becomes the old side." = "选择要与之比较的文件——它将作为旧的一侧。"; +"Choose which items the toolbar shows, and their order" = "选择工具栏显示哪些项目,以及它们的顺序"; +"Clear Menu" = "清除菜单"; +"Clear Recents" = "清除最近使用"; +"Click a shortcut, or select a row and press Return, then type the new keys. Press Delete to remove a shortcut, Esc to cancel." = "点击某条快捷键,或选中一行按 Return,然后按下新的按键。按删除键可移除快捷键,按 Escape 取消。"; +"Click to type a zoom level" = "点击可输入缩放比例"; +"Clicking files in Locations:" = "点击 Locations 中的文件:"; +"Close" = "关闭"; +"Close All" = "全部关闭"; +"Close All Files" = "关闭所有文件"; +"Command" = "Command"; +"Comment" = "评论"; +"Comment on %@" = "评论 %@"; +"Comment on File" = "评论文件"; +"Comment on any local Markdown document the way you'd comment on a PR. Notes save into the file itself as `` comments — ordinary HTML comments that stay out of rendered Markdown, shown by PullMark as bubbles pinned to their spot, and written so agents can read and act on them. [How margin notes work](https://pullmark.app/docs/experimental/margin-notes/)" = "像评论 PR 一样评论任何本地 Markdown 文档。批注以 `` 注释的形式存进文件本身——普通的 HTML 注释,不会出现在渲染后的 Markdown 中,由 PullMark 显示为钉在原处的气泡,写法也便于智能体读取并据此行动。[页边批注的工作方式](https://pullmark.app/docs/experimental/margin-notes/)"; +"Comment on any local Markdown document the way you'd comment on a PR. Notes save into the file itself as `` comments — ordinary HTML comments that stay out of rendered Markdown, shown by PullMark as bubbles pinned to their spot. Deleting a note is how it's resolved." = "像评论 PR 一样评论任何本地 Markdown 文档。批注以 `` 注释的形式存进文件本身——普通的 HTML 注释,不会出现在渲染后的 Markdown 中,由 PullMark 显示为钉在原处的气泡。删除一条批注就是解决它。"; +"Comment on this file as a whole, not a specific line" = "针对整个文件而不是某一行发表评论"; +"Commit Changes" = "提交更改"; +"Commit Changes…" = "提交更改…"; +"Commit message" = "提交信息"; +"Commit to %@" = "提交到 %@"; +"Commit to a new branch" = "提交到新分支"; +"Committed %lld files" = "已提交 %lld 个文件"; +"Committed %lld files on new branch “%@”" = "已提交 %lld 个文件到新分支“%@”"; +"Committed 1 file" = "已提交 1 个文件"; +"Committed 1 file on new branch “%@”" = "已提交 1 个文件到新分支“%@”"; +"Compare" = "比较"; +"Compare Revisions" = "比较修订版本"; +"Comparing " = "正在比较 "; +"Comparing with %@" = "正在与 %@ 比较"; +"Connection status…" = "连接状态…"; +"Content Width" = "栏宽"; +"Content width" = "栏宽"; +"Control" = "Control"; +"Copies instructions for CLAUDE.md / AGENTS.md — how to read margin notes and delete them as they're addressed" = "拷贝给 CLAUDE.md / AGENTS.md 用的说明——如何读取页边批注,以及处理完后如何删除它们"; +"Copies the Markdown source of the selected blocks (whole blocks — or the whole document when nothing is selected)" = "拷贝所选区块的 Markdown 源码(以整个区块为单位——未选中任何内容时则是整篇文档)"; +"Copies “%@” to the clipboard" = "把“%@”拷贝到剪贴板"; +"Copy" = "拷贝"; +"Copy %@ to the clipboard" = "把 %@ 拷贝到剪贴板"; +"Copy GitHub Link" = "拷贝 GitHub 链接"; +"Copy GitHub links as:" = "拷贝 GitHub 链接的形式:"; +"Copy Path" = "拷贝路径"; +"Copy as Markdown" = "拷贝为 Markdown"; +"Could not abandon the review: %@" = "无法放弃这份审查:%@"; +"Could not create the PDF: %@" = "无法创建 PDF:%@"; +"Could not delete the comment: %@" = "无法删除该评论:%@"; +"Could not discard the pending comment: %@" = "无法丢弃该待提交评论:%@"; +"Could not post the comment — the PR session is no longer available. Your text was kept as a draft." = "无法发表评论——此 PR 会话已不再可用。你输入的文字已保留为草稿。"; +"Could not post the comment: %@" = "无法发表评论:%@"; +"Could not post the reply — the PR session is no longer available. Your text was kept as a draft." = "无法发表回复——此 PR 会话已不再可用。你输入的文字已保留为草稿。"; +"Could not post the reply: %@" = "无法发表回复:%@"; +"Could not read %@." = "无法读取 %@。"; +"Could not read the rendered page." = "无法读取渲染后的页面。"; +"Could not refresh %@: %@" = "无法刷新 %@:%@"; +"Could not save %@: %@" = "无法存储 %@:%@"; +"Could not save the edit: %@" = "无法存储这次编辑:%@"; +"Could not update the reaction: %@" = "无法更新表情回应:%@"; +"Could not upload %lld pending comments to GitHub — kept locally for retry. %@" = "无法把 %lld 条待提交评论上传到 GitHub——已保留在本地以便重试。%@"; +"Could not upload 1 pending comment to GitHub — kept locally for retry. %@" = "无法把 1 条待提交评论上传到 GitHub——已保留在本地以便重试。%@"; +"Couldn't move PullMark" = "无法移动 PullMark"; +"Couldn't open %@/%@#%lld: " = "无法打开 %@/%@#%lld:"; +"Couldn't open %@: %@" = "无法打开 %@:%@"; +"Couldn't open %@: %@. It may not exist at that ref, or it may be a private repository your GitHub credentials can't access." = "无法打开 %@:%@。它可能在该 ref 上并不存在,也可能属于你的 GitHub 凭据无权访问的私有仓库。"; +"Couldn't revert: %@" = "无法还原:%@"; +"Couldn't save %@: " = "无法存储 %@:"; +"Couldn't save %@: %@" = "无法存储 %@:%@"; +"Current branch" = "当前分支"; +"Custom themes" = "自定义主题"; +"Customize Toolbar…" = "自定义工具栏…"; +"Dark" = "深色"; +"Default diff layout:" = "默认差异布局:"; +"Delete" = "删除"; +"Delete comment" = "删除评论"; +"Delete this comment?" = "要删除这条评论吗?"; +"Determining how this copy was installed…" = "正在确定这份副本的安装方式…"; +"Discard the pending review and all its comments, on GitHub too" = "丢弃这份待提交审查及其所有评论,GitHub 上也一并丢弃"; +"Dismiss" = "忽略"; +"Dismiss Preview" = "关闭预览"; +"Dismiss — PullMark won't ask again unless you make it the default" = "忽略——除非你把 PullMark 设为默认,否则它不会再问"; +"Dismiss — this version won't be suggested again" = "忽略——不会再推荐这个版本"; +"Don't ask again for this repository" = "不再为此仓库询问"; +"Done" = "完成"; +"Dotfiles and hidden folders in Locations — like ⇧⌘. in Finder" = "Locations 中的点文件和隐藏文件夹——与访达里的 ⇧⌘. 相同"; +"Dotfiles and hidden folders in Locations — ⇧⌘. toggles this too, like Finder" = "Locations 中的点文件和隐藏文件夹——⇧⌘. 同样可以切换,和访达一样"; +"Down Arrow" = "下箭头"; +"Download" = "下载"; +"Downloads the update, verifies its signature, and installs it in place" = "下载更新、校验签名,并就地安装"; +"Drag PullMark to Applications in the Finder instead. (%@)" = "请改为在访达中把 PullMark 拖到“应用程序”文件夹。(%@)"; +"Each block's starting source line, in the margin of rendered documents and diffs — hover a number for the block's full range. Rendered text wraps freely, so numbering is per block, not per visual line. The raw source view always shows its own line numbers." = "在渲染文档和差异的页边显示每个区块起始的源码行号——悬停某个数字可见该区块的完整范围。渲染文本会自由折行,因此编号按区块而非按视觉行。原始源码视图始终显示自己的行号。"; +"Edit" = "编辑"; +"Edit Mode" = "编辑模式"; +"Enable margin notes" = "启用页边批注"; +"End" = "End"; +"Escape" = "Escape"; +"Every release's notes, up to the version you're running" = "每个版本的发行说明,直到你正在运行的这一版"; +"Exact commit (permalink)" = "精确提交(永久链接)"; +"Expand All" = "全部展开"; +"Experimental" = "实验性功能"; +"Export as HTML…" = "导出为 HTML…"; +"Export as PDF…" = "导出为 PDF…"; +"Features land here before their design is settled. **Beta** features get a real compatibility effort between versions and are likely to graduate. **Alpha** features carry no guarantees: they may change incompatibly, their data formats may not migrate, and they may disappear entirely. [About experimental features](https://pullmark.app/docs/experimental/)" = "设计尚未定稿的功能会先落在这里。**Beta** 功能会在版本之间获得切实的兼容性投入,也很可能毕业。**Alpha** 功能不作任何保证:它们可能发生不兼容的改动,数据格式可能无法迁移,也可能彻底消失。[关于实验性功能](https://pullmark.app/docs/experimental/)"; +"Features land here before their design is settled. **Beta** features get a real compatibility effort between versions and are likely to graduate. [About experimental features](https://pullmark.app/docs/experimental/)" = "设计尚未定稿的功能会先落在这里。**Beta** 功能会在版本之间获得切实的兼容性投入,也很可能毕业。[关于实验性功能](https://pullmark.app/docs/experimental/)"; +"File" = "文件"; +"File Margin Note…" = "整篇文档的页边批注…"; +"Fill in a known branch, tag, or commit" = "填入一个已知的分支、标签或提交"; +"Find Next" = "查找下一个"; +"Find Previous" = "查找上一个"; +"Find in Page" = "在页面中查找"; +"Find in page" = "在页面中查找"; +"Finish your review · %lld" = "完成审查 · %lld"; +"Finish your review — 1 pending comment" = "完成审查——1 条待提交评论"; +"Finish your review — %lld pending comments" = "完成审查——%lld 条待提交评论"; +"Flip Diff Layout" = "翻转差异布局"; +"Forward" = "前进"; +"Forward Delete" = "向前删除"; +"Full Width" = "Full Width"; +"General" = "通用"; +"GitHub" = "GitHub"; +"GitHub API error (%lld): %@" = "GitHub API 错误(%lld):%@"; +"GitHub Access" = "GitHub 访问"; +"GitHub Markdown links:" = "GitHub Markdown 链接:"; +"Go" = "前往"; +"Hide Hidden Files" = "隐藏隐藏文件"; +"Hide Margin Notes" = "隐藏页边批注"; +"Hide Markdown Source" = "隐藏 Markdown 源码"; +"Hide Outline" = "隐藏大纲"; +"Hide Resolved Conversations" = "隐藏已解决的会话"; +"Hide review requests with no Markdown files — PullMark has nothing to show for them" = "隐藏不含 Markdown 文件的审查请求——PullMark 对它们无可展示"; +"History" = "历史"; +"Home" = "Home"; +"Hover any block for the note bubble (select text first to quote it), or press ⌥⌘M. Edit and delete from each bubble; deleting a note is how it's resolved. Open Files rows show a count chip while a document still carries notes, and View → Hide Margin Notes clears the page for clean reading." = "悬停任意区块即可看到批注气泡(先选中文字即可引用它),也可以按 ⌥⌘M。在每个气泡上编辑和删除;删除一条批注就是解决它。文档还带着批注时,Open Files 中的行会显示一枚计数标签;想清净阅读时,用“显示”菜单里的 隐藏页边批注 清屏。"; +"How far text may stretch before it wraps. Standard keeps the classic book-like measure; Wide fits more on screen and still caps the line length; Full Width gives the document the whole window — handy in full screen. Applies everywhere, live, and plays with any theme." = "文字在折行前可以伸展多远。Standard 保持经典的书本式行长;Wide 在屏幕上容纳更多内容,同时仍为行长设上限;Full Width 把整个窗口都交给文档——全屏时很好用。处处生效、即时生效,也与任何主题相处融洽。"; +"How wide the rendered text column runs" = "渲染文本栏的宽度"; +"In a local document" = "在本地文档中"; +"In a pull request" = "在拉取请求中"; +"In a pull request file" = "在拉取请求文件中"; +"In a pull request file's Result view" = "在拉取请求文件的“结果”视图中"; +"Install pullmark Command…" = "安装 pullmark 命令…"; +"Jump to another Markdown file in this pull request" = "跳到此拉取请求中的另一个 Markdown 文件"; +"Jump to any file, heading, or pull request" = "跳到任意文件、标题或拉取请求"; +"Jump to the GitHub connection section" = "跳到 GitHub 连接部分"; +"Keep" = "保留"; +"Keep Open" = "保持打开"; +"Keep Using" = "继续使用"; +"Keyboard" = "键盘"; +"Large repo — not all files shown" = "大型仓库——未显示全部文件"; +"Last seen at %@. " = "上次出现于 %@。 "; +"Layout" = "布局"; +"Left Arrow" = "左箭头"; +"Light" = "浅色"; +"Light, Dark, or match the system — the window and every rendered page follow, and each theme brings its own light and dark looks." = "浅色、深色,或跟随系统——窗口和每个渲染页面都会随之改变,每套主题也自带浅色与深色两副面孔。"; +"Line %lld (new)" = "第 %lld 行(新)"; +"Line %lld (old)" = "第 %lld 行(旧)"; +"Line numbers" = "行号"; +"Loading repo files…" = "正在载入仓库文件…"; +"Locations" = "Locations"; +"Make Default Again" = "重新设为默认"; +"Make PullMark the Default" = "把 PullMark 设为默认"; +"Make the document bigger" = "放大文档"; +"Make the document bigger — text, images, and the content column scale together" = "放大文档——文字、图片和内容栏一起缩放"; +"Make the document smaller" = "缩小文档"; +"Make the page writable — then click any block" = "让页面可写——然后点击任意区块"; +"Make this choice the default for GitHub Markdown links" = "把这个选择设为 GitHub Markdown 链接的默认行为"; +"Margin Notes" = "页边批注"; +"Margin notes are experimental (beta): the design may still shift between versions, and Settings → Experimental turns them off any time. [How margin notes work](https://pullmark.app/docs/experimental/margin-notes/)" = "页边批注是实验性功能(beta):其设计在版本之间仍可能变动,在“设置 → 实验性功能”中随时可以关闭。[页边批注的工作方式](https://pullmark.app/docs/experimental/margin-notes/)"; +"Margin notes are hidden — choose View → Show Margin Notes first." = "页边批注已隐藏——请先在“显示”菜单中选择 显示页边批注。"; +"Margin notes are off — turn them back on in Settings → Experimental." = "页边批注已关闭——请在“设置 → 实验性功能”中重新开启。"; +"Margin notes are off — turn them on in Settings → Experimental." = "页边批注已关闭——请在“设置 → 实验性功能”中开启。"; +"Margin-note bubbles ( comments) in rendered documents" = "渲染文档中的页边批注气泡( 注释)"; +"Markdown files open in PullMark" = "Markdown 文件在 PullMark 中打开"; +"Mission Control" = "调度中心"; +"Move PullMark to your Applications folder?" = "要把 PullMark 移到“应用程序”文件夹吗?"; +"Move to Applications" = "移到“应用程序”文件夹"; +"Move to Trash" = "移到废纸篓"; +"Next File" = "下一个文件"; +"Next Markdown file in this pull request" = "此拉取请求中的下一个 Markdown 文件"; +"Next match" = "下一个匹配项"; +"No Markdown files found in %@." = "在 %@ 中未找到 Markdown 文件。"; +"No changes to commit." = "没有可提交的更改。"; +"No headings" = "没有标题"; +"None" = "无"; +"Not Now" = "以后"; +"Not a Homebrew user? [Download the CLI from cli.github.com](https://cli.github.com), then sign in the same way." = "不是 Homebrew 用户?[从 cli.github.com 下载 CLI](https://cli.github.com),然后用同样的方式登录。"; +"Not available in this build" = "此构建版本中不可用"; +"Not connected" = "未连接"; +"Not connected to GitHub — private repositories and reviewing are unavailable." = "未连接到 GitHub——私有仓库和审查功能不可用。"; +"Notes are written so agents can read and act on them. Paste the snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in this file\" becomes a complete handoff." = "批注的写法便于智能体读取并据此行动。把这段片段粘贴到智能体的指令文件(CLAUDE.md、AGENTS.md……)中,一句“处理这个文件里的页边批注”就是一次完整的交接。"; +"OK" = "好"; +"Off shows a quiet banner instead — the notes stay one click away" = "关闭时改为显示一条安静的横幅——批注依然一键可达"; +"Only requests that change Markdown" = "仅显示改动 Markdown 的请求"; +"Open" = "打开"; +"Open Branch Separately" = "单独打开分支"; +"Open File or Folder" = "打开文件或文件夹"; +"Open Files" = "Open Files"; +"Open File…" = "打开文件…"; +"Open Folder…" = "打开文件夹…"; +"Open Fully" = "完整打开"; +"Open GitHub Markdown links in PullMark?" = "在 PullMark 中打开 GitHub Markdown 链接吗?"; +"Open Markdown files" = "打开 Markdown 文件"; +"Open Markdown files or a folder containing them" = "打开 Markdown 文件,或包含它们的文件夹"; +"Open Pull Request" = "打开拉取请求"; +"Open Pull Request…" = "打开拉取请求…"; +"Open Quickly — files, headings, pull requests, or paths" = "快速打开——文件、标题、拉取请求或路径"; +"Open Quickly…" = "快速打开…"; +"Open Recent" = "打开最近使用"; +"Open Release Page" = "打开发布页面"; +"Open Themes Folder" = "打开 Themes 文件夹"; +"Open Worktree" = "打开工作树"; +"Open a GitHub pull request" = "打开一个 GitHub 拉取请求"; +"Open a Markdown file or a GitHub pull request" = "打开一个 Markdown 文件或一个 GitHub 拉取请求"; +"Open a folder containing Markdown files" = "打开一个包含 Markdown 文件的文件夹"; +"Open files, folders, and worktrees from the shell — [about the pullmark command](https://pullmark.app/docs/cli/)." = "从命令行打开文件、文件夹和工作树——[关于 pullmark 命令](https://pullmark.app/docs/cli/)。"; +"Open in Browser" = "在浏览器中打开"; +"Open in PullMark" = "在 PullMark 中打开"; +"Open local Markdown files or a folder" = "打开本地 Markdown 文件或文件夹"; +"Open on GitHub" = "在 GitHub 上打开"; +"Open pull requests where your review is requested" = "请求你审查的开放拉取请求"; +"Open the review — pending comments, summary, and verdict" = "打开审查——待提交评论、总结和结论"; +"Opens the release page on GitHub" = "在 GitHub 上打开发布页面"; +"Opens the release page on GitHub to update manually" = "在 GitHub 上打开发布页面以手动更新"; +"Open…" = "打开…"; +"Option" = "Option"; +"Outdated" = "已过时"; +"Outdated — was line %lld" = "已过时——原为第 %lld 行"; +"Outline" = "大纲"; +"PR Overview" = "PR 总览"; +"Page Down" = "Page Down"; +"Page Setup…" = "页面设置…"; +"Page Up" = "Page Up"; +"Paper size and orientation for printing" = "打印用的纸张大小和方向"; +"Paste the copied snippet into your agent's instructions file (CLAUDE.md, AGENTS.md, …) and \"address the margin notes in the file\" becomes a complete handoff — the agent deletes each note as it resolves it, and you watch the bubbles disappear." = "把拷贝好的片段粘贴到智能体的指令文件(CLAUDE.md、AGENTS.md……)中,一句“处理这个文件里的页边批注”就是一次完整的交接——智能体每解决一条就删掉一条,你会看着气泡一个个消失。"; +"Pending review on GitHub" = "GitHub 上的待提交审查"; +"Pinned to commit %@ — the ref's tip as of this session's last fetch." = "已钉在提交 %@ 上——即本次会话最后一次抓取时该 ref 的顶端。"; +"Posts immediately — file comments can't join a pending review." = "立即发表——文件评论无法加入待提交审查。"; +"Preview First" = "先预览"; +"Preview First shows a file with one click without keeping it — one italicized entry (in Open Files, or under its GitHub repo) that the next preview replaces. Double-click a file, or just start editing, to keep it open. Open Fully keeps every file you click." = "“先预览”让单击即可查看文件而不保留它——只有一条斜体条目(在 Open Files 中,或在它所属的 GitHub 仓库下),下一次预览会把它替换掉。双击文件,或者直接开始编辑,就能把它保持打开。“完整打开”则会保留你点击的每一个文件。"; +"Previous File" = "上一个文件"; +"Previous Markdown file in this pull request" = "此拉取请求中的上一个 Markdown 文件"; +"Previous match" = "上一个匹配项"; +"Print the rendered document" = "打印渲染后的文档"; +"Print…" = "打印…"; +"Private repositories, commenting, and reviewing are ready." = "私有仓库、评论和审查均已就绪。"; +"Pull Requests" = "拉取请求"; +"PullMark %@ is available." = "PullMark %@ 已可用。"; +"PullMark Website" = "PullMark 网站"; +"PullMark borrows the GitHub credentials your own tools already have — the GitHub CLI or a git credential helper. It has no login of its own, stores nothing, and never sees a password." = "PullMark 借用你自己的工具已有的 GitHub 凭据——GitHub CLI 或 git 凭据助手。它没有自己的登录,不存储任何东西,也从不接触密码。"; +"PullMark borrows the credentials your own tools already have — the GitHub CLI or a git credential helper. It has no login of its own, stores nothing, and never sees a password. [About GitHub access](https://pullmark.app/docs/troubleshooting/#github-access)" = "PullMark 借用你自己的工具已有的凭据——GitHub CLI 或 git 凭据助手。它没有自己的登录,不存储任何东西,也从不接触密码。[关于 GitHub 访问](https://pullmark.app/docs/troubleshooting/#github-access)"; +"PullMark can fetch this file and render it in-app, or send it to your browser. Hold ⌘ while clicking a link for the other behavior; the default lives in Settings → General." = "PullMark 可以抓取这个文件并在应用内渲染,也可以把它交给你的浏览器。点击链接时按住 ⌘ 可执行另一种行为;默认设置在“设置 → 通用”中。"; +"PullMark is in demo mode — network access is disabled." = "PullMark 处于演示模式——网络访问已停用。"; +"PullMark is installed — the disk image is no longer needed. This ejects it and moves “%@” to the Trash." = "PullMark 已安装——不再需要这个磁盘映像。此操作会推出它,并把“%@”移到废纸篓。"; +"PullMark is no longer your default Markdown app." = "PullMark 已不再是你的默认 Markdown 应用。"; +"PullMark is running from its disk image. Moving it to Applications installs it properly and enables one-click updates." = "PullMark 正在从磁盘映像运行。把它移到“应用程序”文件夹才算正确安装,并可启用一键更新。"; +"Push to origin after committing" = "提交后推送到 origin"; +"Quick Look previews:" = "快速查看预览:"; +"Raw Source" = "原始源码"; +"Re-read credentials from the GitHub CLI and git credential helpers" = "重新从 GitHub CLI 和 git 凭据助手读取凭据"; +"Re-read credentials from the GitHub CLI and git credential helpers — after gh auth login, this connects without relaunching" = "重新从 GitHub CLI 和 git 凭据助手读取凭据——执行 gh auth login 之后,无需重启即可连上"; +"Re-read this file from disk" = "从磁盘重新读取此文件"; +"Reaction state unavailable — try refreshing the PR." = "表情回应状态不可用——请尝试刷新此 PR。"; +"Reading" = "阅读"; +"Recents" = "最近使用"; +"Redo" = "重做"; +"Refresh" = "刷新"; +"Refresh Folder" = "刷新文件夹"; +"Release Notes" = "发行说明"; +"Release notes couldn't be loaded — they're also at github.com/jedijashwa/pullmark/releases." = "无法载入发行说明——它们也在 github.com/jedijashwa/pullmark/releases。"; +"Reload" = "重新载入"; +"Reload Document" = "重新载入文档"; +"Remember my selection" = "记住我的选择"; +"Remote Branches" = "远程分支"; +"Remove from Recents" = "从最近使用中移除"; +"Remove from Sidebar" = "从边栏中移除"; +"Remove the PullMark disk image?" = "要移除 PullMark 磁盘映像吗?"; +"Rendered" = "渲染后"; +"Rendered Diff" = "渲染差异"; +"Reopen what was in the sidebar when PullMark last quit" = "重新打开 PullMark 上次退出时边栏里的内容"; +"Reopening…" = "正在重新打开…"; +"Report a Bug…" = "报告 Bug…"; +"Report an Issue…" = "报告问题…"; +"Request a Feature…" = "请求新功能…"; +"Required" = "必需"; +"Reset the zoom to 100%" = "把缩放重置为 100%"; +"Restore Defaults" = "恢复默认"; +"Restore Defaults…" = "恢复默认…"; +"Restore all keyboard shortcuts to their defaults?" = "要将所有键盘快捷键恢复为默认吗?"; +"Restore files and pull requests from the last session" = "恢复上次会话中的文件和拉取请求"; +"Restore the default" = "恢复默认"; +"Restore the file as it was before PullMark's last edit" = "把文件恢复到 PullMark 上次编辑之前的样子"; +"Result" = "结果"; +"Retry" = "重试"; +"Retry Upload" = "重试上传"; +"Return" = "Return"; +"Reveal in Finder" = "在访达中显示"; +"Reveal in Location" = "在 Locations 中显示"; +"Reveal on GitHub" = "在 GitHub 上显示"; +"Reveal resolved review conversations in the Result view" = "在“结果”视图中显示已解决的审查会话"; +"Revert Last Edit" = "还原上次编辑"; +"Reverted the last edit to %@." = "已还原对 %@ 的上次编辑。"; +"Review Changes…" = "审查更改…"; +"Review Requests" = "审查请求"; +"Review changes" = "审查更改"; +"Review comments couldn't be loaded — existing threads may be missing." = "无法载入审查评论——已有的会话可能缺失。"; +"Review requested from %@" = "已请求 %@ 审查"; +"Review required" = "需要审查"; +"Review submitted." = "审查已提交。"; +"Review summary (optional)" = "审查总结(可选)"; +"Review verdict" = "审查结论"; +"Reviewing" = "审查"; +"Right Arrow" = "右箭头"; +"Runs “%@” and relaunches PullMark" = "运行“%@”并重新启动 PullMark"; +"Save the rendered document as a PDF" = "把渲染后的文档存储为 PDF"; +"Save the rendered document as a self-contained HTML file" = "把渲染后的文档存储为一个自包含的 HTML 文件"; +"Saved as a pending review — visible only to you until you submit" = "已存为待提交审查——在你提交之前只有你能看到"; +"Search All Files…" = "搜索所有文件…"; +"Search all files" = "搜索所有文件"; +"See if something even newer is available" = "看看是否有更新的版本"; +"Set Up GitHub Access…" = "设置 GitHub 访问…"; +"Set Up…" = "设置…"; +"Set up the GitHub CLI" = "设置 GitHub CLI"; +"Share" = "共享"; +"Shift" = "Shift"; +"Show" = "显示"; +"Show Alpha Features" = "显示 Alpha 功能"; +"Show Hidden Files" = "显示隐藏文件"; +"Show Margin Notes" = "显示页边批注"; +"Show Markdown Source" = "显示 Markdown 源码"; +"Show Outline" = "显示大纲"; +"Show Resolved Conversations" = "显示已解决的会话"; +"Show What's New after an update" = "更新后显示“新增功能”"; +"Show alpha features" = "显示 alpha 功能"; +"Show alpha features?" = "要显示 alpha 功能吗?"; +"Show hidden files" = "显示隐藏文件"; +"Show or hide the document outline" = "显示或隐藏文档大纲"; +"Show review discussion on the PR overview" = "在 PR 总览上显示审查讨论"; +"Show review requests in the sidebar" = "在边栏中显示审查请求"; +"Show the next document" = "显示下一篇文档"; +"Show the previous document" = "显示上一篇文档"; +"Show the raw Markdown behind the rendered document" = "显示渲染文档背后的原始 Markdown"; +"Show who last changed each block (git blame)" = "显示每个区块最后由谁改动(git blame)"; +"Show/Hide Hidden Files" = "显示/隐藏隐藏文件"; +"Show/Hide Margin Notes" = "显示/隐藏页边批注"; +"Show/Hide Markdown Source" = "显示/隐藏 Markdown 源码"; +"Show/Hide Outline" = "显示/隐藏大纲"; +"Show/Hide Resolved Conversations" = "显示/隐藏已解决的会话"; +"Showing 500 of %lld changed files — Markdown files are preselected either way." = "已显示 %lld 个改动文件中的 500 个——无论如何,Markdown 文件都已预先选中。"; +"Showing the first %lld Markdown files" = "仅显示前 %lld 个 Markdown 文件"; +"Sign in to GitHub" = "登录 GitHub"; +"Sign notes as:" = "批注署名为:"; +"Something went wrong" = "出了点问题"; +"Source" = "源码"; +"Source Diff" = "源码差异"; +"Space" = "Space"; +"Spotlight" = "聚焦"; +"Stage and commit changes in this file's repository" = "在此文件所属的仓库中暂存并提交更改"; +"Standard" = "Standard"; +"Submit review" = "提交审查"; +"Submit the review with the selected verdict (⌘↩)" = "以所选结论提交审查(⌘↩)"; +"Support PullMark ❤️" = "支持 PullMark ❤️"; +"Switch between light, dark, and system appearance" = "在浅色、深色和跟随系统的外观之间切换"; +"Switch or Open Branch…" = "切换或打开分支…"; +"System" = "系统"; +"Tab" = "Tab"; +"Tags" = "标签"; +"Teach your agent" = "教会你的智能体"; +"Tell your agent" = "告诉你的智能体"; +"Temporarily show the raw Markdown behind the rendered document" = "临时显示渲染文档背后的原始 Markdown"; +"That link needs a different version of PullMark" = "该链接需要另一个版本的 PullMark"; +"The @name your notes carry — empty uses your GitHub login, or this Mac's account name when signed out" = "批注署上的 @name——留空则使用你的 GitHub 登录名,未登录时使用这台 Mac 的账户名"; +"The GitHub CLI is installed but signed out. Run this in your terminal — it opens a browser to sign in:" = "GitHub CLI 已安装但尚未登录。在终端里运行这条命令——它会打开浏览器供你登录:"; +"The PR session is no longer available — the draft could not be saved to disk." = "此 PR 会话已不再可用——草稿无法存储到磁盘。"; +"The comment will be removed from GitHub. Replies from others will stay." = "该评论会从 GitHub 上移除。其他人的回复会保留。"; +"The document's headings, in a sidebar" = "文档的标题,显示在边栏中"; +"The pull request overview (%@ #%lld)" = "拉取请求总览(%@ #%lld)"; +"The pullmark command is installed" = "pullmark 命令已安装"; +"Theme" = "主题"; +"Themes restyle rendered Markdown and diffs, and follow the Light/Dark appearance. Drop .css files into the Themes folder to add your own — they apply on top of the GitHub look. Quick Look previews follow your theme too (custom themes fall back to their GitHub base there)." = "主题会重新装点渲染后的 Markdown 和差异,并跟随浅色/深色外观。把 .css 文件放进 Themes 文件夹即可添加自己的主题——它们叠加在 GitHub 外观之上。快速查看预览也跟随你的主题(自定义主题在那里回落到它们的 GitHub 基底)。"; +"These keys are fixed and can't be changed." = "这些按键是固定的,无法更改。"; +"This comment is still syncing with GitHub — try discarding it again in a moment." = "该评论仍在与 GitHub 同步——请稍后再试着丢弃它。"; +"This folder has more Markdown files than PullMark scans — open a subfolder as its own Location to see the rest" = "这个文件夹的 Markdown 文件多于 PullMark 扫描的上限——把子文件夹作为独立的 Location 打开即可看到其余部分"; +"This pull request was updated on GitHub." = "此拉取请求在 GitHub 上有更新。"; +"This repository has no GitHub remote." = "此仓库没有 GitHub 远端。"; +"This version (%@) doesn't know %@ — it may point at a feature from a newer release, or one that has moved. Checking for updates usually resolves it." = "此版本(%@)不认识 %@——它可能指向某个更新版本中的功能,或指向已经挪走的功能。检查更新通常就能解决。"; +"Thread state unavailable — try refreshing the PR." = "会话状态不可用——请尝试刷新此 PR。"; +"Turn Off" = "关闭"; +"Up Arrow" = "上箭头"; +"Update Now" = "立即更新"; +"Update failed: %@" = "更新失败:%@"; +"Updated to PullMark %@." = "已更新到 PullMark %@。"; +"Updates" = "更新"; +"Upload the remaining comments into your pending review on GitHub" = "把剩余的评论上传到你在 GitHub 上的待提交审查中"; +"Use Anyway" = "仍要使用"; +"Using it" = "使用方法"; +"View" = "显示"; +"View All Release Notes" = "查看全部发行说明"; +"View as List" = "以列表显示"; +"View as Tree" = "以树状显示"; +"Viewing signed out — commenting and reviewing are unavailable" = "以未登录状态查看——无法评论和审查"; +"Walk through connecting PullMark to GitHub" = "带你一步步把 PullMark 连接到 GitHub"; +"What Copy GitHub Link copies — hold ⌥ in the menu for the other flavor" = "“拷贝 GitHub 链接”拷贝的内容——在菜单中按住 ⌥ 可得到另一种"; +"What changed since the last commit, rendered like a PR diff — the toolbar's Compare button offers older revisions and branches" = "自上次提交以来的改动,像 PR 差异那样渲染——工具栏的“比较”按钮还提供更早的修订版本和分支"; +"What clicking a link to a Markdown file on GitHub does — hold ⌘ while clicking for the other behavior" = "点击指向 GitHub 上 Markdown 文件的链接时会发生什么——按住 ⌘ 点击可执行另一种行为"; +"What pressing space in Finder shows for Markdown files" = "在访达中对 Markdown 文件按空格键时显示什么"; +"What's New" = "新增功能"; +"While the find bar is open" = "查找栏打开时"; +"Whole file" = "整个文件"; +"Wide" = "Wide"; +"With a folder selected" = "选中文件夹时"; +"With a local file or folder in a GitHub repository selected" = "选中位于 GitHub 仓库中的本地文件或文件夹时"; +"With a local file or folder selected" = "选中本地文件或文件夹时"; +"With files in Open Files" = "Open Files 中有文件时"; +"Works with private repos using your existing gh or git credentials." = "使用你现有的 gh 或 git 凭据即可处理私有仓库。"; +"You're on %@." = "你当前在 %@ 上。"; +"Your custom shortcuts will be removed. This can't be undone." = "你自定的快捷键将被移除。此操作无法撤销。"; +"Zoom In" = "放大"; +"Zoom Out" = "缩小"; +"and %lld more" = "另有 %lld 位"; +"confirming sheets" = "确认对话框"; +"cycling windows" = "在窗口间循环"; +"dismissing sheets" = "关闭对话框"; +"https://github.com/owner/repo/pull/123 or owner/repo#123" = "https://github.com/owner/repo/pull/123 或 owner/repo#123"; +"just now" = "刚刚"; +"on base branch" = "在基础分支上"; +"opened by %@" = "由 %@ 发起"; +"the Help menu" = "帮助菜单"; +"the app switcher" = "应用程序切换器"; +" · was {r}" = " · 原为 {r}"; +"(empty)" = "(空)"; +"Add a margin note" = "添加页边批注"; +"Add a suggestion" = "添加建议"; +"Add reaction" = "添加表情回应"; +"Add single comment" = "添加单条评论"; +"Click the gutter for history" = "点击页边可查看历史"; +"Comment actions" = "评论操作"; +"Comment on line {n}" = "评论第 {n} 行"; +"Comment on lines {a}–{b}" = "评论第 {a}–{b} 行"; +"Comment on new line {n}" = "评论新文件第 {n} 行"; +"Comment on new line {n} — shift-click extends the range" = "评论新文件第 {n} 行——按住 shift 点击可扩展范围"; +"Comment on new lines {a}–{b}" = "评论新文件第 {a}–{b} 行"; +"Comment on old line {n} — shift-click extends the range" = "评论旧文件第 {n} 行——按住 shift 点击可扩展范围"; +"Comment on old lines {a}–{b}" = "评论旧文件第 {a}–{b} 行"; +"Comment on the pull request conversation" = "在拉取请求的会话中评论"; +"Conversation" = "会话"; +"Copy full SHA" = "拷贝完整 SHA"; +"Couldn't load this image from GitHub · " = "无法从 GitHub 载入这张图片 · "; +"File comments" = "文件评论"; +"Front matter" = "前置元数据"; +"Hide {n} resolved conversation" = "隐藏 {n} 场已解决的会话"; +"Hide {n} resolved conversations" = "隐藏 {n} 场已解决的会话"; +"Insert a ```suggestion block pre-filled with the current lines" = "插入一个 ```suggestion 区块,并预先填入当前的行"; +"LEFT" = "LEFT"; +"Leave a comment" = "留下评论"; +"Line {n}" = "第 {n} 行"; +"Lines {a}–{b}" = "第 {a}–{b} 行"; +"Moved from line {n} — content unchanged" = "从第 {n} 行移来——内容未变"; +"Not synced" = "未同步"; +"Old line {n}" = "旧文件第 {n} 行"; +"Old lines {a}–{b}" = "旧文件第 {a}–{b} 行"; +"Open this conversation on GitHub — PullMark doesn't render this file" = "在 GitHub 上打开这场会话——PullMark 不渲染这个文件"; +"Open {path} and jump to this conversation" = "打开 {path} 并跳到这场会话"; +"Outdated review comments" = "已过时的审查评论"; +"Pending" = "待提交"; +"Pending comment — click to expand" = "待提交评论——点击可展开"; +"Pending comments — click to expand" = "待提交评论——点击可展开"; +"Post to the PR conversation right away — not part of a review (⌘↩)" = "立即发到 PR 会话中——不属于任何审查(⌘↩)"; +"Reply" = "回复"; +"Reply to this thread (⌘↩)" = "回复这场会话(⌘↩)"; +"Resolve" = "解决"; +"Resolved" = "已解决"; +"Review discussion" = "审查讨论"; +"Save" = "存储"; +"Save your edit (⌘↩)" = "存储你的编辑(⌘↩)"; +"Show on GitHub" = "在 GitHub 上显示"; +"Show {n} resolved conversation" = "显示 {n} 场已解决的会话"; +"Show {n} resolved conversations" = "显示 {n} 场已解决的会话"; +"Suggested change" = "建议的更改"; +"Suggestions can only target new-file lines — GitHub applies them in place of the commented lines." = "建议只能针对新文件的行——GitHub 会用它替换掉被评论的那些行。"; +"The conversation could not be loaded — retrying." = "无法载入这场会话——正在重试。"; +"The targeted lines aren't available to suggest an edit to." = "目标行无法用于提出修改建议。"; +"This block isn't part of the pull request's diff — GitHub can only attach comments to changed lines." = "这个区块不属于此拉取请求的差异——GitHub 只能把评论附到有改动的行上。"; +"This file is empty on both sides of the diff." = "这个文件在差异的两侧都是空的。"; +"Unresolve" = "取消解决"; +"View commit on GitHub" = "在 GitHub 上查看提交"; +"View in File" = "在文件中查看"; +"Write a reply" = "写一条回复"; +"Write at the end of the document" = "在文档末尾续写"; +"all conversations resolved" = "所有会话均已解决"; +"approved these changes" = "批准了这些更改"; +"bot" = "机器人"; +"copied" = "已拷贝"; +"dismissed their review" = "撤销了审查"; +"moved" = "已移动"; +"requested changes" = "请求了更改"; +"reviewed" = "提交了审查"; +"whole document" = "整篇文档"; +"{n} comment" = "{n} 条评论"; +"{n} comments" = "{n} 条评论"; +"{n} review" = "{n} 份审查"; +"{n} reviews" = "{n} 份审查"; +"{n} unresolved conversation" = "{n} 场未解决的会话"; +"{n} unresolved conversations" = "{n} 场未解决的会话"; +" · edited" = " · 已编辑"; +"· asks where to open" = "· 询问在哪里打开"; +"· opens in PullMark" = "· 在 PullMark 中打开"; +"· opens in browser" = "· 在浏览器中打开"; +"{n} comment — click to expand" = "{n} 条评论 — 点击展开"; +"{n} comments — click to expand" = "{n} 条评论 — 点击展开"; +"Closed" = "已关闭"; +"Draft" = "草稿"; +"Merged" = "已合并"; +"Unavailable" = "不可用"; +"View on GitHub" = "在 GitHub 上查看"; +"View all checks on GitHub" = "在 GitHub 上查看所有检查"; +"%lld of %lld done" = "%lld/%lld 已完成"; +"%lld of %lld failing" = "%lld/%lld 失败"; +"A clean margin, numbers on demand in Source" = "页边整洁,需要时在“源码”中显示行号"; +"A workflow is waiting for approval" = "有工作流正在等待批准"; +"Added" = "已添加"; +"Changed" = "已更改"; +"Connected" = "已连接"; +"Copied" = "已拷贝"; +"Copy GitHub Branch Link" = "拷贝 GitHub 分支链接"; +"Copy GitHub Permalink" = "拷贝 GitHub 永久链接"; +"Deleted" = "已删除"; +"Each block's source line in the margin" = "在页边显示每个区块的源码行号"; +"GitHub CLI" = "GitHub CLI"; +"Hidden" = "已隐藏"; +"Language" = "语言"; +"Language:" = "语言:"; +"Line numbers hidden" = "行号已隐藏"; +"Line numbers shown" = "行号已显示"; +"Modified" = "已修改"; +"Renamed" = "已重命名"; +"Shown" = "已显示"; +"Takes effect after PullMark relaunches." = "PullMark 重新启动后生效。"; +"Untracked" = "未跟踪"; +"git credential helper" = "git 凭证助手"; +"Relaunch Now" = "立即重新启动"; diff --git a/scripts/check-strings.py b/scripts/check-strings.py new file mode 100755 index 0000000..518161b --- /dev/null +++ b/scripts/check-strings.py @@ -0,0 +1,288 @@ +#!/usr/bin/env python3 +"""Localization gate (spec: app-i18n). Run by `make test`. + +A missing key fails SILENTLY to English at runtime, and no Apple +tooling can inventory SwiftUI string literals outside Xcode — so this +script is the whole safety net: + + * inventories every localizable key: SwiftUI literal call sites, + String(localized:)/NSLocalizedString sites, and PageStrings.keys + (the rendered page's table) + * verifies PageStrings.keys covers every pmString/pmFormat key in + app.js (page strings that miss the table silently stay English) + * diffs the inventory against each locale's Localizable.strings: + missing keys and orphans are both failures + * verifies format specifiers (%@, %lld, …) in every translation + match its key — a mismatch garbles or crashes at runtime + +With no loc/*.lproj present (pre-translation), only the app.js/ +PageStrings consistency check runs, plus the inventory is written to +loc/_inventory.json for the translation step. + +Exit 0 = clean; 1 = problems, each on its own line. + +Usage: check-strings.py [--write-inventory] +""" + +import json +import re +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +SOURCES = ROOT / "Sources" / "PullMark" +LOC = ROOT / "loc" + +problems = [] + + +def problem(msg): + problems.append(msg) + + +# ---------- Swift-side key extraction ---------- + +# SwiftUI initializers whose FIRST string-literal argument is a +# LocalizedStringKey. Interpolated literals become format keys the way +# String.LocalizationValue renders them (\(x) → %@ by default — matches +# String(localized:) runtime behavior for the common String/Int cases +# only approximately; interpolated SwiftUI literals are flagged). +SWIFTUI_CALLS = r"(?:Text|Button|Label|Toggle|Picker|TextField|Menu|Section|CommandMenu|Link)" + +STRING_LIT = r'"(?:[^"\\\n]|\\.)*"' + + +def scan_swift_literal(s, start): + """Scan a Swift string literal beginning at s[start] == '"'. Handles + escapes and \\(...) interpolations containing nested strings and + parens — the naive regex truncated keys like `\\(branch ?? "main")`. + Returns (raw_inner_text, index_after_closing_quote).""" + i = start + 1 + out = [] + while i < len(s): + c = s[i] + if c == "\\": + if i + 1 < len(s) and s[i + 1] == "(": + depth = 1 + j = i + 2 + while j < len(s) and depth: + if s[j] == '"': + _, j = scan_swift_literal(s, j) + continue + if s[j] == "(": + depth += 1 + elif s[j] == ")": + depth -= 1 + j += 1 + out.append(s[i:j]) + i = j + continue + out.append(s[i:i + 2]) + i += 2 + continue + if c == '"': + return "".join(out), i + 1 + if c == "\n": + return "".join(out), i # unterminated — bail at the line end + out.append(c) + i += 1 + return "".join(out), i + + +# Int-typed interpolations render as %lld in the runtime lookup key +# (String.LocalizationValue / LocalizedStringKey overload resolution), +# NOT %@ — a mismatched specifier silently falls back to English. The +# repo convention: count-like expressions are Int. Verified against +# every interpolated call site when introduced (spec: app-i18n). +INT_EXPR = re.compile( + r"^(?:" + r"[\w.]*[cC]ount|overflow|minutes|hours|days|line|number|original|index" + r"|[\w.]*[cC]ount [-+] \d+|index [-+] \d+|line [-+] \d+" + r"|\w+ - [\w.]*[cC]ount|hidden|md|other|status|failing|done|total" + r"|[\w.]+\.(?:minutes|number|status|line|originalLine)" + r"|\w+\[[01]\]|mapped\[[01]\]" + r"|session\.markdownFiles\.count" + r")$") + + +def swift_literal_to_key(body, flag_interpolated=None, where=""): + # interpolations → %lld for Int-like expressions, %@ otherwise, + # with a balanced scan so nested strings/parens inside \(...) + # survive intact. + out = [] + i = 0 + n = 0 + while i < len(body): + if body.startswith("\\(", i): + depth = 1 + j = i + 2 + while j < len(body) and depth: + if body[j] == '"': + _, j = scan_swift_literal(body, j) + continue + if body[j] == "(": + depth += 1 + elif body[j] == ")": + depth -= 1 + j += 1 + expr = body[i + 2:j - 1].strip() + out.append("%lld" if INT_EXPR.match(expr) else "%@") + n += 1 + i = j + else: + out.append(body[i]) + i += 1 + key = "".join(out) + if n and flag_interpolated is not None: + flag_interpolated.add((where, key)) + key = key.replace('\\"', '"').replace("\\n", "\n").replace("\\\\", "\\") + return key + + +def collect_swift_keys(): + keys = {} + interpolated = set() + starts = re.compile( + r"(?:\b" + SWIFTUI_CALLS + r"\(|\.help\(|\.alert\(|\.confirmationDialog\(|" + r"\.navigationTitle\(|String\(localized:|NSLocalizedString\()\s*") + for path in sorted(SOURCES.rglob("*.swift")): + s = path.read_text(encoding="utf-8") + rel = str(path.relative_to(ROOT)) + for m in starts.finditer(s): + i = m.end() + if i >= len(s) or s[i] != '"': + continue + inner, _ = scan_swift_literal(s, i) + key = swift_literal_to_key(inner, interpolated, rel) + if key == "%@" and "NSLocalizedString" in m.group(0): + continue # PageStrings' dynamic lookup call + # Localizable content only: a key must contain letters beyond + # its specifiers (bare "%lld"/"+%lld" badges aren't language). + if re.search(r"[A-Za-z]", re.sub(r"%(?:lld|llu|ld|lu|@|d|u|f)", "", key)): + keys.setdefault(key, rel) + return keys, interpolated + + +# ---------- Page strings (app.js ↔ PageStrings.swift) ---------- + +def collect_pagestrings_keys(): + s = (SOURCES / "Rendering" / "PageStrings.swift").read_text(encoding="utf-8") + body = s.split("static let keys", 1)[1] + return set(lit[1:-1].replace('\\"', '"').replace("\\\\", "\\") + for lit in re.findall(STRING_LIT, body)) + + +def collect_js_keys(): + s = (SOURCES / "Resources" / "app.js").read_text(encoding="utf-8") + + def balanced(text, start): + depth = 0 + for i in range(start, len(text)): + c = text[i] + if c == "(": + depth += 1 + elif c == ")": + if depth == 0: + return text[start:i] + depth -= 1 + return text[start:] + + keys = set() + for m in re.finditer(r"pm(?:String|Format)\(", s): + if s[max(0, m.start() - 9):m.start()].endswith("function "): + continue + arg = balanced(s, m.end()) + depth, first = 0, arg + for i, c in enumerate(arg): + if c in "([{": + depth += 1 + elif c in ")]}": + depth -= 1 + elif c == "," and depth == 0: + first = arg[:i] + break + for lit in re.findall(r'"((?:[^"\\]|\\.)+)"', first): + keys.add(lit.replace('\\"', '"').replace("\\'", "'")) + return keys + + +# ---------- .strings parsing ---------- + +def parse_strings(path): + """Minimal Localizable.strings parser: "key" = "value"; with + escaped quotes, // and /* */ comments.""" + s = path.read_text(encoding="utf-8") + s = re.sub(r"/\*.*?\*/", "", s, flags=re.S) + s = re.sub(r"^\s*//.*$", "", s, flags=re.M) + entries = {} + for m in re.finditer( + r'"((?:[^"\\]|\\.)*)"\s*=\s*"((?:[^"\\]|\\.)*)"\s*;', s): + key = m.group(1).replace('\\"', '"').replace("\\n", "\n").replace("\\\\", "\\") + value = m.group(2).replace('\\"', '"').replace("\\n", "\n").replace("\\\\", "\\") + if key in entries: + problem(f"{path.name}: duplicate key {key!r}") + entries[key] = value + return entries + + +SPEC = re.compile(r"%(?:\d+\$)?[@dDuUxXoOfeEgGcCsSpaAF]|%lld|%llu|%ld|%lu") + + +def specifiers(text): + return sorted(SPEC.findall(text.replace("%%", ""))) + + +def main(): + write_inventory = "--write-inventory" in sys.argv + + swift_keys, interpolated = collect_swift_keys() + page_keys = collect_pagestrings_keys() + js_keys = collect_js_keys() + + # app.js ↔ PageStrings consistency + for key in sorted(js_keys - page_keys): + problem(f"PageStrings.keys missing app.js key: {key!r}") + for key in sorted(page_keys - js_keys): + problem(f"PageStrings.keys has orphan (no app.js use): {key!r}") + + inventory = dict(sorted(swift_keys.items())) + for key in sorted(page_keys): + inventory.setdefault(key, "Sources/PullMark/Rendering/PageStrings.swift") + + if write_inventory: + LOC.mkdir(exist_ok=True) + (LOC / "_inventory.json").write_text( + json.dumps(inventory, ensure_ascii=False, indent=1) + "\n", + encoding="utf-8") + print(f"inventory: {len(inventory)} keys → loc/_inventory.json" + f" ({len(interpolated)} interpolated, flagged in-file)") + + lprojs = sorted(LOC.glob("*.lproj")) if LOC.exists() else [] + for lproj in lprojs: + strings_path = lproj / "Localizable.strings" + if not strings_path.exists(): + problem(f"{lproj.name}: Localizable.strings missing") + continue + entries = parse_strings(strings_path) + missing = set(inventory) - set(entries) + orphans = set(entries) - set(inventory) + for key in sorted(missing): + problem(f"{lproj.name}: missing {key!r}") + for key in sorted(orphans): + problem(f"{lproj.name}: orphan {key!r}") + for key, value in sorted(entries.items()): + if key in inventory and specifiers(key) != specifiers(value): + problem(f"{lproj.name}: format specifiers differ for {key!r}: " + f"{specifiers(key)} vs {specifiers(value)}") + + if problems: + print("\n".join(problems)) + print(f"\n{len(problems)} problem(s).") + return 1 + locales = ", ".join(p.name.removesuffix(".lproj") for p in lprojs) or "none yet" + print(f"strings OK: {len(inventory)} keys; locales checked: {locales}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/make-app.sh b/scripts/make-app.sh index 1e0bb15..e59f18b 100755 --- a/scripts/make-app.sh +++ b/scripts/make-app.sh @@ -25,6 +25,12 @@ cp assets/AppIcon.icns "$APP/Contents/Resources/AppIcon.icns" # License notices ship with every distribution (MIT/BSD terms). cp LICENSE "$APP/Contents/Resources/LICENSE" cp ACKNOWLEDGMENTS.md "$APP/Contents/Resources/ACKNOWLEDGMENTS.md" +# Localizations: hand-authored .lproj folders live at loc/ — outside +# Sources/ so SwiftPM never buries them in the resource bundle where +# Bundle.main lookup can't see them (spec: app-i18n). +if compgen -G "loc/*.lproj" > /dev/null; then + cp -R loc/*.lproj "$APP/Contents/Resources/" +fi # The `pullmark` shell command: lives inside the bundle so it ships (and # is signed) with the app; the Homebrew cask's binary stanza symlinks it # into the brew prefix. @@ -60,6 +66,19 @@ cat > "$APP/Contents/Info.plist" < + CFBundleDevelopmentRegion + en + CFBundleLocalizations + + en + zh-Hans + ja + fr + de + nl + es + pt-BR + CFBundleName PullMark CFBundleDisplayName @@ -155,6 +174,10 @@ EOF APPEX="$APP/Contents/PlugIns/PullMarkQuickLook.appex" mkdir -p "$APPEX/Contents/MacOS" "$APPEX/Contents/Resources" cp .build/release/PullMarkQuickLook "$APPEX/Contents/MacOS/PullMarkQuickLook" +if compgen -G "loc/*.lproj" > /dev/null; then + mkdir -p "$APPEX/Contents/Resources" + cp -R loc/*.lproj "$APPEX/Contents/Resources/" +fi cp -R .build/release/PullMark_PullMark.bundle "$APPEX/Contents/Resources/" cat > "$APPEX/Contents/Info.plist" </dev/null 2>&1 || true; if [[ -n "$APP_PID" ]]; then kill "$APP_PID" 2>/dev/null || true; fi' EXIT + APP_PID="" failures=0 @@ -52,7 +60,16 @@ launch() { # $1 = appearance # which is how a green-accent generation of captures once escaped. local flags=(-AppleAccentColor 4 -AppleHighlightColor "0.698039 0.843137 1.000000 Blue" -pm.appearance $1) - [[ -n $lang ]] && flags+=(-AppleLanguages "($lang)") + if [[ -n $lang ]]; then + # Language AND locale: language alone leaves US date/number formats. + local region + case $lang in + ja) region=ja_JP ;; de) region=de_DE ;; fr) region=fr_FR ;; + nl) region=nl_NL ;; es) region=es_ES ;; pt-BR) region=pt_BR ;; + zh-Hans) region=zh_CN ;; *) region=en_US ;; + esac + flags+=(-AppleLanguages "($lang)" -AppleLocale "$region") + fi # Launch BARE (no document argument): opening a document at launch # makes Launch Services respawn the process, which keeps the # environment but silently drops the argument domain — the @@ -66,7 +83,7 @@ launch() { # $1 = appearance sleep 0.2 done open -a "$PWD/dist/PullMark.app" ~/Code/meridian-docs - sleep 2 + sleep 2.5 swift $DRIVE/winframe.swift $APP_PID 1052 784 >/dev/null sleep 1 } @@ -84,7 +101,6 @@ quit_app() { kill -0 $APP_PID 2>/dev/null && kill -9 $APP_PID 2>/dev/null || true APP_PID="" } -trap 'if [[ -n "$APP_PID" ]]; then kill "$APP_PID" 2>/dev/null || true; fi' EXIT for mode in $appearances; do for name in $scenes; do