diff --git a/Sources/PullMark/App/AppLinkRouter.swift b/Sources/PullMark/App/AppLinkRouter.swift index 45ccd03..9d19def 100644 --- a/Sources/PullMark/App/AppLinkRouter.swift +++ b/Sources/PullMark/App/AppLinkRouter.swift @@ -20,6 +20,10 @@ enum AppLinkRouter { SettingsOpener.open(tab: target.tab, anchor: target.anchor) } else if let compare = AppLinks.compareTarget(url) { AppState.deliverCompareOpen(file: compare.file, request: compare.request) + } else if CaptureChrome.isActive, url.host == "capture" { + // Screenshot-generator drive channel — only routable in + // capture runs, never in a normally launched app. + CaptureChrome.handleCaptureURL(url) } else { presentUnsupported(url) } diff --git a/Sources/PullMark/App/CaptureChrome.swift b/Sources/PullMark/App/CaptureChrome.swift new file mode 100644 index 0000000..35339a1 --- /dev/null +++ b/Sources/PullMark/App/CaptureChrome.swift @@ -0,0 +1,105 @@ +import AppKit +import ObjectiveC +import WebKit + +/// Screenshot-generator hook (`-pm.captureChrome 1`, argument domain +/// only): windows draw ACTIVE chrome — colored traffic lights, accent +/// selection — while the app stays backgrounded. The generator captures +/// many instances in parallel without ever stealing focus, and the +/// pixels come out identical to a frontmost window's. +/// +/// AppKit and SwiftUI consult isKeyWindow / isMainWindow / +/// NSApp.isActive when drawing window chrome and resolving +/// controlActiveState; there is no supported per-window "appear +/// active" switch on macOS 13, so the getters are swizzled to return +/// true. Capture instances are driven purely through AX and +/// pid-targeted events and never see real user input, so the lie has +/// no one to confuse. Never set this flag on a normal run. +enum CaptureChrome { + static var isActive: Bool { + UserDefaults.standard.bool(forKey: "pm.captureChrome") + } + + static func installIfRequested() { + guard isActive else { return } + forceTrue(NSWindow.self, #selector(getter: NSWindow.isKeyWindow)) + forceTrue(NSWindow.self, #selector(getter: NSWindow.isMainWindow)) + forceTrue(NSApplication.self, #selector(getter: NSApplication.isActive)) + // Selection color: row views draw the accent only when + // "emphasized" (their table in the key responder chain) — + // force it so sidebar selection captures blue, not gray. + forceTrue(NSTableRowView.self, #selector(getter: NSTableRowView.isEmphasized)) + // A never-activated app has no key window, so AppKit DROPS posted + // keyboard events (and menu key equivalents). Nominate one: the + // most recently created visible window that can take key status — + // panels (Open Quickly, Open) appear after the main window and + // win while they're up, which is exactly the routing a user's + // focus would produce. + let keyWindowGetter = #selector(getter: NSApplication.keyWindow) + if let method = class_getInstanceMethod(NSApplication.self, keyWindowGetter) { + let nominate: @convention(block) (AnyObject) -> NSWindow? = { _ in + // orderedWindows is front-to-back z-order: an open panel + // (Open Quickly, Open) floats above the main window and + // wins, exactly as real focus would. + NSApp.orderedWindows.first { $0.isVisible && $0.canBecomeKey } + ?? NSApp.windows.last { $0.isVisible && $0.canBecomeKey } + } + method_setImplementation(method, imp_implementationWithBlock(nominate)) + } + // Make new windows GENUINELY key and main. A background app's + // window can hold real key status without the app activating — + // proof: the Open Quickly panel scene always photographed with + // colored lights, because closing the panel handed real key + // status back to the main window. Faked become-key + // notifications were tried twice (once-per-window and repeated) + // and both raced AppKit into gray traffic lights the moment + // anything re-laid-out the titlebar. Real state is + // resize-proof, and it also gives posted keyboard events a real + // key window to land in. + let blessed = NSHashTable.weakObjects() + let blessAll = { + for window in NSApp.windows where window.isVisible && !blessed.contains(window) { + blessed.add(window) + if window.canBecomeMain { window.makeMain() } + if window.canBecomeKey { window.makeKey() } + if window.firstResponder === window, + let responder = window.initialFirstResponder ?? window.contentView { + window.makeFirstResponder(responder) + } + } + } + Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { _ in blessAll() } + } + + private static func forceTrue(_ cls: AnyClass, _ selector: Selector) { + guard let method = class_getInstanceMethod(cls, selector) else { return } + let alwaysTrue: @convention(block) (AnyObject) -> Bool = { _ in true } + method_setImplementation(method, imp_implementationWithBlock(alwaysTrue)) + } + + /// pullmark://capture/… — the generator's drive channel for the few + /// page interactions no accessibility or keyboard path can reach. + /// Routed only when the capture flag is set (see AppLinkRouter). + @MainActor + static func handleCaptureURL(_ url: URL) { + guard url.path == "/reveal", + let components = URLComponents(url: url, resolvingAgainstBaseURL: false), + let lineText = components.queryItems?.first(where: { $0.name == "line" })?.value, + let line = Int(lineText) + else { return } + let webView = NSApp.orderedWindows.lazy + .compactMap { $0.contentView.flatMap(findWebView) } + .first + webView?.evaluateJavaScript( + "window.__pmRevealBlock && __pmRevealBlock(\(line));", + completionHandler: nil) + } + + private static func findWebView(in view: NSView) -> WKWebView? { + if let webView = view as? WKWebView { return webView } + for subview in view.subviews { + if let found = findWebView(in: subview) { return found } + } + return nil + } +} diff --git a/Sources/PullMark/App/DemoMode.swift b/Sources/PullMark/App/DemoMode.swift index 4107495..a16a701 100644 --- a/Sources/PullMark/App/DemoMode.swift +++ b/Sources/PullMark/App/DemoMode.swift @@ -20,7 +20,12 @@ enum DemoMode { /// The isolated defaults domain demo launches read and write — never /// the app's real `app.pullmark.PullMark` domain. - static let defaultsSuiteName = "app.pullmark.PullMark.demo" + /// Per-process: the screenshot generator runs MANY demo instances in + /// parallel, each wiping its suite at startup — with a shared name, + /// every launch nuked every other instance's live state (@AppStorage + /// observed the wipe and reset blame mid-scene). Demo state is + /// throwaway by definition, so nothing is lost by never sharing it. + static let defaultsSuiteName = "app.pullmark.PullMark.demo.\(ProcessInfo.processInfo.processIdentifier)" } extension UserDefaults { @@ -37,6 +42,21 @@ extension UserDefaults { /// on every demo launch, so nothing persists between demo runs either. static let pullmark: UserDefaults = { guard DemoMode.active else { return .standard } + // Janitor: per-pid suites (see defaultsSuiteName) would leave a + // plist per past demo instance — clear the ones whose owner is + // gone. kill(pid, 0) probes liveness without signaling, so + // parallel LIVE instances are never touched. + let preferences = FileManager.default.homeDirectoryForCurrentUser + .appendingPathComponent("Library/Preferences") + let prefix = "app.pullmark.PullMark.demo." + if let entries = try? FileManager.default.contentsOfDirectory(atPath: preferences.path) { + for entry in entries where entry.hasPrefix(prefix) && entry.hasSuffix(".plist") { + let stem = String(entry.dropFirst(prefix.count).dropLast(".plist".count)) + if let pid = Int32(stem), kill(pid, 0) != 0 { + UserDefaults().removePersistentDomain(forName: String(entry.dropLast(".plist".count))) + } + } + } let name = DemoMode.defaultsSuiteName guard let suite = UserDefaults(suiteName: name) else { return .standard } suite.removePersistentDomain(forName: name) diff --git a/Sources/PullMark/App/DemoSession.swift b/Sources/PullMark/App/DemoSession.swift index 0999d7d..78fd8e5 100644 --- a/Sources/PullMark/App/DemoSession.swift +++ b/Sources/PullMark/App/DemoSession.swift @@ -597,9 +597,11 @@ enum DemoSession { ] state.checks = [ CheckItem(name: "build", group: "CI", state: .passed, - detailsUrl: nil, isRequired: true, durationLabel: "1m 32s"), + detailsUrl: nil, isRequired: true, + durationLabel: CheckItem.durationLabel(seconds: 92)), CheckItem(name: "docs-links", group: "CI", state: .passed, - detailsUrl: nil, isRequired: false, durationLabel: "48s"), + detailsUrl: nil, isRequired: false, + durationLabel: CheckItem.durationLabel(seconds: 48)), CheckItem(name: "spellcheck", group: "CI", state: .skipped, detailsUrl: nil, isRequired: false, durationLabel: nil), CheckItem(name: "license/cla", group: nil, state: .passed, @@ -718,6 +720,9 @@ enum DemoSession { .appendingPathComponent("PullMark Demo", isDirectory: true) try? FileManager.default.removeItem(at: root) try? FileManager.default.createDirectory(at: root, withIntermediateDirectories: true) + // Titlebars, tooltips, and Open Quickly rows show the plausible + // "~/Documents/PullMark Demo" instead of the raw temp path. + PathAbbreviator.demoRoot = root.path var docs: [LocalFile] = [] var texts = [(path: String, text: String)]() for path in [gettingStartedPath, calibrationPath, exportFormatsPath] { diff --git a/Sources/PullMark/App/PullMarkApp.swift b/Sources/PullMark/App/PullMarkApp.swift index 4571210..771e0b3 100644 --- a/Sources/PullMark/App/PullMarkApp.swift +++ b/Sources/PullMark/App/PullMarkApp.swift @@ -83,7 +83,7 @@ struct PullMarkApp: App { .keyboardShortcut(shortcuts.keyboardShortcut(for: .prResult)) .disabled(!prFileSelected) Button(diffLayoutRaw == PRFileView.DiffLayout.inline.rawValue - ? "Side-by-Side Diffs" : "Inline Diffs") { + ? String(localized: "Side-by-Side Diffs") : String(localized: "Inline Diffs")) { state?.send(.flipDiffLayout) } .keyboardShortcut(shortcuts.keyboardShortcut(for: .prFlipLayout)) @@ -370,16 +370,15 @@ struct PullMarkApp: App { .disabled(!marginNotesEnabled || activeLocalFileURL == nil || state?.sourceViewVisible == true) .help(marginNotesEnabled - ? "Leave a note on the block you're reading — it's saved into the " - + "file as a comment" - : "Turn on margin notes in Settings → Experimental") + ? String(localized: "Leave a note on the block you're reading — it's saved into the file as a comment") + : String(localized: "Turn on margin notes in Settings → Experimental")) Button("File Margin Note…") { state?.send(.addFileMarginNote) } .keyboardShortcut(shortcuts.keyboardShortcut(for: .addFileMarginNote)) .disabled(!marginNotesEnabled || activeLocalFileURL == nil || state?.sourceViewVisible == true) .help(marginNotesEnabled - ? "Leave a note about the whole document, at the top" - : "Turn on margin notes in Settings → Experimental") + ? String(localized: "Leave a note about the whole document, at the top") + : String(localized: "Turn on margin notes in Settings → Experimental")) } CommandGroup(replacing: .help) { Button("Release Notes") { @@ -580,7 +579,13 @@ final class AppDelegate: NSObject, NSApplicationDelegate { // Needed when launched via `swift run` (no bundle): become a regular, // focusable app with a menu bar. NSApp.setActivationPolicy(.regular) - NSApp.activate(ignoringOtherApps: true) + // Capture instances draw active chrome without focus and must + // NOT activate — the whole point is not stealing the user's + // input while the generator drives many instances at once. + CaptureChrome.installIfRequested() + if !CaptureChrome.isActive { + 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. diff --git a/Sources/PullMark/Core/ContentWidth.swift b/Sources/PullMark/Core/ContentWidth.swift index d47d44c..67f7c03 100644 --- a/Sources/PullMark/Core/ContentWidth.swift +++ b/Sources/PullMark/Core/ContentWidth.swift @@ -25,9 +25,9 @@ enum ContentWidth: String, CaseIterable, Identifiable { var descriptor: String { switch self { - case .standard: return "A classic reading measure" - case .wide: return "Longer lines, more on screen" - case .full: return "Text uses the whole window" + case .standard: return String(localized: "A classic reading measure") + case .wide: return String(localized: "Longer lines, more on screen") + case .full: return String(localized: "Text uses the whole window") } } diff --git a/Sources/PullMark/Core/PathAbbreviator.swift b/Sources/PullMark/Core/PathAbbreviator.swift index 371ee06..dc0ebea 100644 --- a/Sources/PullMark/Core/PathAbbreviator.swift +++ b/Sources/PullMark/Core/PathAbbreviator.swift @@ -4,7 +4,18 @@ import Foundation /// UI (titlebar subtitles, tooltips, search-result subtitles). Pure string /// logic so it stays unit-testable; pass `home` explicitly in tests. enum PathAbbreviator { + /// Demo mode only: the demo session's real files live in a temp dir, + /// and `/var/folders/…/T/PullMark Demo` in the titlebar ruins every + /// published screenshot. Set by DemoSession when it writes the docs; + /// display shows the path a real user would plausibly have. Never + /// set outside demo mode — real paths are never masked. + static var demoRoot: String? + static let demoDisplayRoot = "~/Documents/PullMark Demo" + static func abbreviate(_ path: String, home: String = NSHomeDirectory()) -> String { + if let demoRoot, path.hasPrefix(demoRoot) { + return demoDisplayRoot + path.dropFirst(demoRoot.count) + } guard !home.isEmpty, home != "/" else { return path } let home = home.hasSuffix("/") ? String(home.dropLast()) : home if path == home { return "~" } diff --git a/Sources/PullMark/Core/ReviewControl.swift b/Sources/PullMark/Core/ReviewControl.swift index 9530997..4826a97 100644 --- a/Sources/PullMark/Core/ReviewControl.swift +++ b/Sources/PullMark/Core/ReviewControl.swift @@ -12,17 +12,17 @@ enum ReviewVerdict: String, CaseIterable, Identifiable { var label: String { switch self { - case .comment: return "Comment" - case .approve: return "Approve" - case .requestChanges: return "Request changes" + case .comment: return String(localized: "Comment") + case .approve: return String(localized: "Approve") + case .requestChanges: return String(localized: "Request changes") } } var help: String { switch self { - case .comment: return "Submit general feedback without explicit approval" - case .approve: return "Approve merging these changes" - case .requestChanges: return "Ask for changes before this can merge" + case .comment: return String(localized: "Submit general feedback without explicit approval") + case .approve: return String(localized: "Approve merging these changes") + case .requestChanges: return String(localized: "Ask for changes before this can merge") } } } diff --git a/Sources/PullMark/Core/Theme.swift b/Sources/PullMark/Core/Theme.swift index 588997f..d596c84 100644 --- a/Sources/PullMark/Core/Theme.swift +++ b/Sources/PullMark/Core/Theme.swift @@ -24,9 +24,9 @@ enum Theme: String, CaseIterable, Identifiable { /// One-line descriptor shown under the theme's preview card. var descriptor: String { switch self { - case .github: return "The classic look, exactly as on github.com" - case .editorial: return "Bookish serif headers on warm paper" - case .terminal: return "Monospace with a phosphor-green accent" + case .github: return String(localized: "The classic look, exactly as on github.com") + case .editorial: return String(localized: "Bookish serif headers on warm paper") + case .terminal: return String(localized: "Monospace with a phosphor-green accent") } } diff --git a/Sources/PullMark/GitHub/PRCockpit.swift b/Sources/PullMark/GitHub/PRCockpit.swift index ffef200..a6ef725 100644 --- a/Sources/PullMark/GitHub/PRCockpit.swift +++ b/Sources/PullMark/GitHub/PRCockpit.swift @@ -97,17 +97,26 @@ struct CheckItem: Equatable, Identifiable { } } - /// "58s" / "3m 12s" / "1h 4m" between two ISO-8601 stamps. + /// "58s" / "3m 12s" / "1h 4m" between two ISO-8601 stamps — + /// abbreviated in the launch language's own units (ja: 3分12秒). static func durationLabel(startedAt: String?, completedAt: String?) -> String? { guard let startedAt, let completedAt, let start = GitHubDate.parse(startedAt), let end = GitHubDate.parse(completedAt) else { return nil } let seconds = Int(end.timeIntervalSince(start).rounded()) + return durationLabel(seconds: seconds) + } + + /// Seconds-based core (the demo session feeds it directly so demo + /// checks render native units too, not baked English strings). + static func durationLabel(seconds: Int) -> String? { guard seconds >= 0 else { return nil } - if seconds < 60 { return "\(seconds)s" } - let minutes = seconds / 60 - if minutes < 60 { return "\(minutes)m \(seconds % 60)s" } - return "\(minutes / 60)h \(minutes % 60)m" + let formatter = DateComponentsFormatter() + formatter.unitsStyle = .abbreviated + formatter.allowedUnits = seconds < 60 ? [.second] + : seconds < 3600 ? [.minute, .second] + : [.hour, .minute] + return formatter.string(from: TimeInterval(seconds)) } } diff --git a/Sources/PullMark/Rendering/MarkdownWebView.swift b/Sources/PullMark/Rendering/MarkdownWebView.swift index a4a66f3..0f037f5 100644 --- a/Sources/PullMark/Rendering/MarkdownWebView.swift +++ b/Sources/PullMark/Rendering/MarkdownWebView.swift @@ -314,6 +314,15 @@ struct MarkdownWebView: NSViewRepresentable { forURLScheme: RemoteResourceSchemeHandler.scheme) configuration.setURLSchemeHandler(context.coordinator.attachmentHandler, forURLScheme: AttachmentSchemeHandler.scheme) + // Capture runs only: parallel instances overlap on cascaded + // frames, and WebKit suspends a fully occluded window's + // WebContent process — sometimes before first paint, which + // captured as a permanently blank pane. Keep rendering alive + // regardless of visibility while the generator drives us. + if CaptureChrome.isActive { + configuration.preferences.setValue( + false, forKey: "pageVisibilityBasedProcessSuppressionEnabled") + } let webView = interactive ? ZoomableWebView(frame: .zero, configuration: configuration) : PassthroughWebView(frame: .zero, configuration: configuration) diff --git a/Sources/PullMark/Resources/app.js b/Sources/PullMark/Resources/app.js index c889424..75f4465 100644 --- a/Sources/PullMark/Resources/app.js +++ b/Sources/PullMark/Resources/app.js @@ -5113,6 +5113,28 @@ var parts = host.getAttribute("data-pm-lines").split("-"); reveal(host, parseInt(parts[0], 10), parseInt(parts[1], 10)); }); + + // Screenshot-generator hook (pullmark://capture/reveal, gated + // Swift-side to capture runs): reveal the block containing a + // source line. Blocks aren't individually reachable through the + // accessibility tree — the click listener above is delegated — + // so scene scripts can't activate one without a real cursor. + window.__pmRevealBlock = function (line) { + // Mirror the click path: close any open editor first (edit-mode + // entry auto-reveals the focused block) or two editors stack. + if (revealState) { commitReveal(); } + var host = null; + content.querySelectorAll(".pm-editable[data-pm-lines]").forEach(function (el) { + if (host || el.style.display === "none") { return; } + var parts = el.getAttribute("data-pm-lines").split("-"); + if (parseInt(parts[0], 10) <= line && line <= parseInt(parts[1], 10)) { + host = el; + } + }); + if (!host) { return; } + var parts = host.getAttribute("data-pm-lines").split("-"); + reveal(host, parseInt(parts[0], 10), parseInt(parts[1], 10)); + }; } var blameAnnotated = payload.blame && payload.blame.length && linesAnnotated; diff --git a/Sources/PullMark/Views/AppToolbar.swift b/Sources/PullMark/Views/AppToolbar.swift index d0b76e4..371e1c7 100644 --- a/Sources/PullMark/Views/AppToolbar.swift +++ b/Sources/PullMark/Views/AppToolbar.swift @@ -291,7 +291,7 @@ private struct LocalFileToolbarItems: CustomizableToolbarContent { var body: some CustomizableToolbarContent { ToolbarItem(id: "local-share") { ShareSheetButton(mode: .document, state: state, surface: surface, - help: "Share this document") + help: String(localized: "Share this document")) } ToolbarItem(id: "local-edit") { EditToolbarToggle(surface: surface) @@ -343,7 +343,7 @@ private struct RemoteDocToolbarItems: CustomizableToolbarContent { } ToolbarItem(id: "remote-share", showsByDefault: false) { ShareSheetButton(mode: .link, state: state, surface: surface, - help: "Share a link to this document on GitHub") + help: String(localized: "Share a link to this document on GitHub")) } ToolbarItem(id: "remote-reload", showsByDefault: false) { ReloadToolbarButton(state: state, @@ -372,7 +372,9 @@ private struct PRFileToolbarItems: CustomizableToolbarContent { set: { surface?.setMode?($0) } )) { ForEach(surface?.modeOptions ?? [], id: \.self) { option in - Text(option).tag(option) + // Options are Mode raw values (selection tokens); + // render the localized label, tag the token. + Text(PRFileView.Mode(rawValue: option)?.label ?? option).tag(option) } } .pickerStyle(.segmented) @@ -386,7 +388,7 @@ private struct PRFileToolbarItems: CustomizableToolbarContent { ToolbarItem(id: "pr-layout") { Picker("Layout", selection: $layoutRaw) { ForEach(PRFileView.DiffLayout.allCases) { layout in - Text(layout.rawValue).tag(layout.rawValue) + Text(layout.label).tag(layout.rawValue) } } .pickerStyle(.menu) @@ -398,9 +400,9 @@ private struct PRFileToolbarItems: CustomizableToolbarContent { // Mode first: on an added file in Result mode both reasons are // true, but the mode is why the picker does nothing HERE. .help(surface?.showsLayout != true - ? "Inline or side-by-side rendered diff — for the Rendered Diff view" + ? String(localized: "Inline or side-by-side rendered diff — for the Rendered Diff view") : (surface?.layoutDisabledReason - ?? "Inline or side-by-side rendered diff")) + ?? String(localized: "Inline or side-by-side rendered diff"))) } // Unconditional (structure never follows the registration); // blame annotates the Result view only, other modes disable it. @@ -443,7 +445,7 @@ private struct PROverviewToolbarItems: CustomizableToolbarContent { var body: some CustomizableToolbarContent { ToolbarItem(id: "overview-share") { ShareSheetButton(mode: .link, state: state, surface: surface, - help: "Share a link to this pull request") + help: String(localized: "Share a link to this pull request")) } } } @@ -546,8 +548,8 @@ private struct EditToolbarToggle: View { // The key equivalent lives on Edit → Edit Mode; binding it here too // would give one combo two owners. .help(surface?.editMode == true - ? "Done editing\(shortcuts.hint(.editMode))" - : "Edit this document\(shortcuts.hint(.editMode)) — then click any block") + ? String(localized: "Done editing\(shortcuts.hint(.editMode))") + : String(localized: "Edit this document\(shortcuts.hint(.editMode)) — then click any block")) .disabled(surface?.editDisabled ?? true) } } @@ -594,10 +596,10 @@ private struct CompareToolbarButton: View { .background(MenuAnchorReader(box: anchor)) .disabled(surface?.compareAvailable != true) .help(surface?.compareAvailable != true - ? (surface?.compareUnavailableReason ?? "Comparing is unavailable here") + ? (surface?.compareUnavailableReason ?? String(localized: "Comparing is unavailable here")) : surface?.compareHasChanges == true - ? "This file has uncommitted changes — compare with a previous revision or branch" - : "Compare with a previous revision or branch") + ? String(localized: "This file has uncommitted changes — compare with a previous revision or branch") + : String(localized: "Compare with a previous revision or branch")) } } @@ -612,7 +614,7 @@ private struct ReloadToolbarButton: View { Label("Reload", systemImage: "arrow.clockwise") } .disabled(disabledReason != nil) - .help(disabledReason ?? "Reload this document") + .help(disabledReason ?? String(localized: "Reload this document")) } } diff --git a/Sources/PullMark/Views/BlameHistorySheet.swift b/Sources/PullMark/Views/BlameHistorySheet.swift index a6cc301..877e4f2 100644 --- a/Sources/PullMark/Views/BlameHistorySheet.swift +++ b/Sources/PullMark/Views/BlameHistorySheet.swift @@ -135,7 +135,7 @@ struct BlameHistorySheet: View { .contentShape(Rectangle()) } .buttonStyle(.plain) - .help(entry.url != nil ? "Open commit on GitHub" : "Copy full SHA") + .help(entry.url != nil ? String(localized: "Open commit on GitHub") : String(localized: "Copy full SHA")) } private func activate(_ entry: HistoryEntry) { diff --git a/Sources/PullMark/Views/CompareRevisionsSheet.swift b/Sources/PullMark/Views/CompareRevisionsSheet.swift index 5f58ddd..fec98e5 100644 --- a/Sources/PullMark/Views/CompareRevisionsSheet.swift +++ b/Sources/PullMark/Views/CompareRevisionsSheet.swift @@ -24,10 +24,10 @@ struct CompareRevisionsSheet: View { 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, - placeholder: "branch, tag, or commit") - refRow(title: "New side", text: $newRef, - placeholder: "the working file") + refRow(title: String(localized: "Old side"), text: $oldRef, + placeholder: String(localized: "branch, tag, or commit")) + refRow(title: String(localized: "New side"), text: $newRef, + placeholder: String(localized: "the working file")) HStack { Spacer() Button("Cancel") { dismiss() } diff --git a/Sources/PullMark/Views/ContentView.swift b/Sources/PullMark/Views/ContentView.swift index 7bc580c..fbf99c4 100644 --- a/Sources/PullMark/Views/ContentView.swift +++ b/Sources/PullMark/Views/ContentView.swift @@ -82,17 +82,17 @@ struct ContentView: View { .sheet(isPresented: $updates.showReleaseNotes) { // Version-less on purpose: the notes carry their versions as // headings in the content, matching the post-update sheet. - ReleaseNotesSheet(title: "What's New in PullMark", + ReleaseNotesSheet(title: String(localized: "What's New in PullMark"), markdown: updates.availableNotes, fullHistory: { await updates.releaseNotesHistory() }) } .sheet(isPresented: $updates.showWhatsNew) { - ReleaseNotesSheet(title: "What's New in PullMark", + ReleaseNotesSheet(title: String(localized: "What's New in PullMark"), markdown: updates.whatsNewMarkdown, fullHistory: { await updates.releaseNotesHistory() }) } .sheet(isPresented: $updates.showHistory) { - ReleaseNotesSheet(title: "PullMark Release Notes", + ReleaseNotesSheet(title: String(localized: "PullMark Release Notes"), markdown: updates.historyMarkdown) } .alert("Something went wrong", isPresented: errorPresented) { @@ -254,7 +254,7 @@ struct SidebarView: View { CollapsibleSection(String(localized: "Open Files"), isExpanded: $filesExpanded, headerActions: state.hasOpenFiles ? [ SectionHeaderAction(id: "close-all", symbol: "xmark.circle.fill", - help: "Close All") { state.closeAllOpenFiles() } + help: String(localized: "Close All")) { state.closeAllOpenFiles() } ] : [], headerMenu: { // Close All only — the menu mirrors the header's own // affordances, and this header deliberately has no + @@ -297,7 +297,7 @@ struct SidebarView: View { CollapsibleSection(String(localized: "Locations"), isExpanded: $foldersExpanded, headerActions: [ SectionHeaderAction(id: "add-folder", symbol: "plus", - help: "Open Folder…") { state.openFolderPanel() } + help: String(localized: "Open Folder…")) { state.openFolderPanel() } ], headerMenu: { AnyView(Group { Button("Open Folder…") { state.openFolderPanel() } @@ -321,7 +321,7 @@ struct SidebarView: View { CollapsibleSection(String(localized: "Pull Requests"), isExpanded: $prsExpanded, headerActions: [ SectionHeaderAction(id: "add-pr", symbol: "plus", - help: "Open Pull Request…") { state.showAddPR = true } + help: String(localized: "Open Pull Request…")) { state.showAddPR = true } ], headerMenu: { AnyView(Group { Button("Open Pull Request…") { state.showAddPR = true } @@ -515,7 +515,7 @@ private struct SidebarFileRow: View { var body: some View { let fonts = ChromeFonts(zoom: zoom) - RemovableRow(help: isPreview ? "Dismiss Preview" : "Remove from Sidebar", + RemovableRow(help: isPreview ? String(localized: "Dismiss Preview") : String(localized: "Remove from Sidebar"), remove: { isPreview ? state.dismissPreview() : state.removeLocalFile(file) }) { HStack(spacing: 4) { @@ -550,7 +550,7 @@ private struct SidebarFileRow: View { .font(fonts.caption) .foregroundStyle(.secondary) .labelStyle(.titleAndIcon) - .help(count == 1 ? "1 margin note" : "\(count) margin notes") + .help(count == 1 ? String(localized: "1 margin note") : String(localized: "\(count) margin notes")) .accessibilityLabel("\(count) margin note\(count == 1 ? "" : "s")") } } @@ -588,7 +588,7 @@ private struct RemotePreviewRow: View { var body: some View { let fonts = ChromeFonts(zoom: zoom) - RemovableRow(help: "Dismiss Preview", + RemovableRow(help: String(localized: "Dismiss Preview"), remove: { state.dismissPreview() }) { Label { VStack(alignment: .leading, spacing: 1) { @@ -875,8 +875,7 @@ private struct FolderRootGroup: View { } .tag(SidebarSelection.folder(folder.rootURL)) .help(folder.missing - ? "Folder not found — last seen at " - + PathAbbreviator.abbreviate(folder.rootURL.path) + ? String(localized: "Folder not found — last seen at \(PathAbbreviator.abbreviate(folder.rootURL.path))") : PathAbbreviator.abbreviate(folder.rootURL.path)) .contextMenu { Button("Remove from Sidebar") { state.removeFolder(folder.rootURL) } @@ -1156,7 +1155,7 @@ private struct InboxRow: View { .font(fonts.caption) .foregroundStyle(.secondary) .labelStyle(.titleAndIcon) - .help(count == 1 ? "1 Markdown file" : "\(count) Markdown files") + .help(count == 1 ? String(localized: "1 Markdown file") : String(localized: "\(count) Markdown files")) } } .contentShape(Rectangle()) @@ -1164,7 +1163,7 @@ private struct InboxRow: View { // row still highlights and arrow keys merely select. .simultaneousGesture(TapGesture().onEnded { state.openInboxItem(item) }) .help(state.inboxMDCount(item) == 0 - ? "No Markdown files in this pull request" : item.title) + ? String(localized: "No Markdown files in this pull request") : item.title) .contextMenu { Button("Open") { state.openInboxItem(item) } Button("Reveal on GitHub") { @@ -1190,7 +1189,7 @@ private struct RecentRow: View { var body: some View { let fonts = ChromeFonts(zoom: zoom) - RemovableRow(help: "Remove from Recents", + RemovableRow(help: String(localized: "Remove from Recents"), remove: { state.removeRecent(id: item.id) }) { Label { VStack(alignment: .leading, spacing: 1) { @@ -1249,7 +1248,7 @@ private struct RecentRow: View { switch item.kind { case .file, .folder: let path = item.path.map { PathAbbreviator.abbreviate($0) } ?? item.title - return missing ? "File not found — last seen at \(path)" : path + return missing ? String(localized: "File not found — last seen at \(path)") : path case .pr: let status = item.prStatus.map { " — \($0.label)" } ?? "" return "\(item.owner ?? "")/\(item.repo ?? "")#\(item.number ?? 0)\(status)" @@ -1335,8 +1334,8 @@ private struct PRSidebarGroup: View { .font(fonts.caption) .monospacedDigit() .foregroundStyle(.secondary) - .help(count == 1 ? "1 changed Markdown file" - : "\(count) changed Markdown files") + .help(count == 1 ? String(localized: "1 changed Markdown file") + : String(localized: "\(count) changed Markdown files")) } .tag(SidebarSelection.prOverview(session.id)) .help(status.label) @@ -1409,8 +1408,8 @@ private struct PRNodeView: View { .font(fonts.caption) .foregroundStyle(.secondary) .labelStyle(.titleAndIcon) - .help(count == 1 ? "1 unresolved review comment" - : "\(count) unresolved review comments") + .help(count == 1 ? String(localized: "1 unresolved review comment") + : String(localized: "\(count) unresolved review comments")) .accessibilityLabel("\(count) unresolved review comment\(count == 1 ? "" : "s")") } } diff --git a/Sources/PullMark/Views/KeyboardSettingsTab.swift b/Sources/PullMark/Views/KeyboardSettingsTab.swift index 5bcb09e..73c73c2 100644 --- a/Sources/PullMark/Views/KeyboardSettingsTab.swift +++ b/Sources/PullMark/Views/KeyboardSettingsTab.swift @@ -175,8 +175,8 @@ struct KeyboardSettingsTab: View { .padding(-2) .opacity(recording == action ? 1 : 0)) .help(recording == action - ? "Recording — press the new shortcut" - : "Click, then press the new shortcut") + ? String(localized: "Recording — press the new shortcut") + : String(localized: "Click, then press the new shortcut")) .accessibilityHidden(true) // the row carries the label // Always present so the shortcut column stays flush; only diff --git a/Sources/PullMark/Views/Lightbox.swift b/Sources/PullMark/Views/Lightbox.swift index 4d59888..d76a9a3 100644 --- a/Sources/PullMark/Views/Lightbox.swift +++ b/Sources/PullMark/Views/Lightbox.swift @@ -476,20 +476,20 @@ private struct LightboxControls: View { var body: some View { HStack(spacing: 2) { - barButton("minus.magnifyingglass", "Zoom out (-)") { model.zoomBy(0.8) } + barButton("minus.magnifyingglass", String(localized: "Zoom out (-)")) { model.zoomBy(0.8) } percentControl - barButton("plus.magnifyingglass", "Zoom in (+)") { model.zoomBy(1.25) } - barButton("arrow.up.left.and.arrow.down.right", "Fit (0)") { model.fit() } - barButton("1.magnifyingglass", "Actual size (1)") { model.setScale(1) } + barButton("plus.magnifyingglass", String(localized: "Zoom in (+)")) { model.zoomBy(1.25) } + barButton("arrow.up.left.and.arrow.down.right", String(localized: "Fit (0)")) { model.fit() } + barButton("1.magnifyingglass", String(localized: "Actual size (1)")) { model.setScale(1) } divider if content.kind == .diagram { - barButton("square.and.arrow.down", "Save As…") { + barButton("square.and.arrow.down", String(localized: "Save As…")) { popFormatMenu(from: saveAnchor.view, svgTitle: "Save as SVG…", pngTitle: "Save as PNG…", action: save) } .background(AnchorReader(box: saveAnchor)) - barButton("square.and.arrow.up", "Share") { + barButton("square.and.arrow.up", String(localized: "Share")) { popFormatMenu(from: anchor.view, svgTitle: "Share as SVG", pngTitle: "Share as PNG", action: share) diff --git a/Sources/PullMark/Views/LocalFileView.swift b/Sources/PullMark/Views/LocalFileView.swift index 4801211..95dfcea 100644 --- a/Sources/PullMark/Views/LocalFileView.swift +++ b/Sources/PullMark/Views/LocalFileView.swift @@ -435,7 +435,7 @@ struct LocalFileView: View { private var subtitle: String { var parts = PathAbbreviator.abbreviate(file.url.deletingLastPathComponent().path) if let currentBranch { parts += " · \(currentBranch)" } - if editMode { parts += " · editing" } + if editMode { parts += " · " + String(localized: "editing") } return parts } diff --git a/Sources/PullMark/Views/NavHistoryControl.swift b/Sources/PullMark/Views/NavHistoryControl.swift index 4f4c8d9..878d4c1 100644 --- a/Sources/PullMark/Views/NavHistoryControl.swift +++ b/Sources/PullMark/Views/NavHistoryControl.swift @@ -16,14 +16,12 @@ struct NavHistoryControl: View { state: state, direction: -1, symbol: "chevron.backward", label: "Back", enabled: state.canGoBack, - help: "Show the previous document\(shortcuts.hint(.goBack))" - + " — click and hold to see history") + help: String(localized: "Show the previous document\(shortcuts.hint(.goBack)) — click and hold to see history")) NavHistoryButton( state: state, direction: 1, symbol: "chevron.forward", label: "Forward", enabled: state.canGoForward, - help: "Show the next document\(shortcuts.hint(.goForward))" - + " — click and hold to see history") + help: String(localized: "Show the next document\(shortcuts.hint(.goForward)) — click and hold to see history")) } } } diff --git a/Sources/PullMark/Views/OpenQuicklyPalette.swift b/Sources/PullMark/Views/OpenQuicklyPalette.swift index b4b13cd..e8600e4 100644 --- a/Sources/PullMark/Views/OpenQuicklyPalette.swift +++ b/Sources/PullMark/Views/OpenQuicklyPalette.swift @@ -106,7 +106,7 @@ struct OpenQuicklyPalette: View { items.append(QuickItem( id: "h:" + heading.slug, title: heading.title, - subtitle: "Heading · \(document.exportBaseName)", + subtitle: String(localized: "Heading · \(document.exportBaseName)"), icon: "number", action: { document.proxy.scrollToAnchor(heading.slug) })) } @@ -139,7 +139,7 @@ struct OpenQuicklyPalette: View { items.append(QuickItem( id: "pr:" + session.id, title: refTitle, - subtitle: "Pull request · \(session.details.title)", + subtitle: String(localized: "Pull request · \(session.details.title)"), icon: "arrow.triangle.pull", action: { state.selection = .prOverview(session.id) })) for file in session.markdownFiles { @@ -155,7 +155,7 @@ struct OpenQuicklyPalette: View { items.append(QuickItem( id: "in:" + item.id, title: item.title, - subtitle: "Review requested · \(item.ref.owner)/\(item.ref.repo)#\(item.ref.number)", + subtitle: String(localized: "Review requested · \(item.ref.owner)/\(item.ref.repo)#\(item.ref.number)"), icon: "tray", action: { state.openInboxItem(item) })) } @@ -163,7 +163,7 @@ struct OpenQuicklyPalette: View { items.append(QuickItem( id: "r:" + recent.id, title: recent.title, - subtitle: "Recent", + subtitle: String(localized: "Recent"), icon: "clock", action: { state.openRecent(recent) })) } @@ -210,15 +210,15 @@ struct OpenQuicklyPalette: View { let url = URL(fileURLWithPath: path) return [QuickItem( id: "direct:path:" + path, - title: "Open " + url.lastPathComponent, + title: String(localized: "Open \(url.lastPathComponent)"), subtitle: PathAbbreviator.abbreviate(path), icon: direct.isDirectory ? "folder" : "doc.text", action: { state.add(url: url) })] case .pullRequest(let ref): return [QuickItem( id: "direct:pr:\(ref.owner)/\(ref.repo)/\(ref.number)", - title: "Open \(ref.owner)/\(ref.repo) #\(ref.number)", - subtitle: "Pull request", + title: String(localized: "Open \(ref.owner)/\(ref.repo) #\(ref.number)"), + subtitle: String(localized: "Pull request"), icon: "arrow.triangle.pull", action: { Task { @@ -233,14 +233,14 @@ struct OpenQuicklyPalette: View { case .remoteDoc(let link): return [QuickItem( id: "direct:remote:\(link.owner)/\(link.repo)@\(link.ref)/\(link.path)", - title: "Open " + ((link.path as NSString).lastPathComponent), - subtitle: "\(link.owner)/\(link.repo) @ \(link.ref) — from GitHub", + title: String(localized: "Open \((link.path as NSString).lastPathComponent)"), + subtitle: String(localized: "\(link.owner)/\(link.repo) @ \(link.ref) — from GitHub"), icon: "book.closed", action: { state.openGitHubDoc(link, pin: true) })] case .remoteRepo(let owner, let repo, let ref): return [QuickItem( id: "direct:repo:\(owner)/\(repo)@\(ref ?? "")", - title: "Browse \(owner)/\(repo)", + title: String(localized: "Browse \(owner)/\(repo)"), subtitle: ref.map { "GitHub repo @ \($0)" } ?? "GitHub repo", icon: "book.closed", action: { diff --git a/Sources/PullMark/Views/PRCockpitHeader.swift b/Sources/PullMark/Views/PRCockpitHeader.swift index bc242e1..0cc9769 100644 --- a/Sources/PullMark/Views/PRCockpitHeader.swift +++ b/Sources/PullMark/Views/PRCockpitHeader.swift @@ -136,8 +136,9 @@ private struct ChecksCapsule: View { case .awaitingApproval: return String(localized: "A workflow is waiting for approval") case .passed(let passed, let skipped): - return skipped > 0 ? "\(passed) passed, \(skipped) skipped" - : "\(passed) passed" + return skipped > 0 + ? String(localized: "\(passed) passed, \(skipped) skipped") + : String(localized: "\(passed) passed") } } @@ -250,7 +251,7 @@ private struct CheckRow: View { .background(hovering && check.detailsUrl != nil ? AnyShapeStyle(.quaternary) : AnyShapeStyle(.clear), in: RoundedRectangle(cornerRadius: 5)) - .help(check.detailsUrl == nil ? "" : "Open on GitHub") + .help(check.detailsUrl == nil ? "" : String(localized: "Open on GitHub")) } @State private var hovering = false diff --git a/Sources/PullMark/Views/PRStatus.swift b/Sources/PullMark/Views/PRStatus.swift index cb4df2d..433cf64 100644 --- a/Sources/PullMark/Views/PRStatus.swift +++ b/Sources/PullMark/Views/PRStatus.swift @@ -24,7 +24,12 @@ enum PRStatus: String, Codable, CaseIterable { var label: String { switch self { case .draft: return String(localized: "Draft") - case .open: return String(localized: "Open") + // Distinct key from the "Open" ACTION buttons: this is the PR + // state, an adjective — German needs "Offen" here but "Öffnen" + // there, and sharing one key made the chip conjugate wrong + // (same collision ja carried as 開く). English falls back to + // the value since there is no en.lproj. + case .open: return NSLocalizedString("pr-status-open", value: "Open", comment: "PR state chip: the pull request is 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 a2f87c9..ca63a66 100644 --- a/Sources/PullMark/Views/PRViews.swift +++ b/Sources/PullMark/Views/PRViews.swift @@ -267,8 +267,8 @@ struct PROverviewView: View { if !prDiscussionEnabled, hiddenCommentCount(session) > 0 { let count = hiddenCommentCount(session) Text(count == 1 - ? "1 unresolved review comment on files not shown in PullMark" - : "\(count) unresolved review comments on files not shown in PullMark") + ? String(localized: "1 unresolved review comment on files not shown in PullMark") + : String(localized: "\(count) unresolved review comments on files not shown in PullMark")) .font(.callout) .foregroundStyle(.secondary) } @@ -336,12 +336,27 @@ struct PRFileView: View { case sourceDiff = "Source Diff" case result = "Result" var id: String { rawValue } + // Raw values are selection tokens (SurfaceToolbar round-trips + // them); display goes through the localized label. + var label: String { + switch self { + case .renderedDiff: return String(localized: "Rendered Diff") + case .sourceDiff: return String(localized: "Source Diff") + case .result: return String(localized: "Result") + } + } } enum DiffLayout: String, CaseIterable, Identifiable { case inline = "Inline" case split = "Side by Side" var id: String { rawValue } + var label: String { + switch self { + case .inline: return String(localized: "Inline") + case .split: return String(localized: "Side by Side") + } + } } @State private var mode: Mode = .renderedDiff @@ -424,7 +439,7 @@ struct PRFileView: View { // A brand-new file renders inline regardless: split mode would show // an all-hatched old column against the untinted document. surface.layoutDisabledReason = file?.status == "added" - ? "New files always render inline — there is no old side to compare" + ? String(localized: "New files always render inline — there is no old side to compare") : nil surface.blameAvailable = mode == .result state.registerSurfaceToolbar(surface) diff --git a/Sources/PullMark/Views/RemoteDocView.swift b/Sources/PullMark/Views/RemoteDocView.swift index cea829c..8648978 100644 --- a/Sources/PullMark/Views/RemoteDocView.swift +++ b/Sources/PullMark/Views/RemoteDocView.swift @@ -203,12 +203,12 @@ struct RemoteDocView: View { ref: session.displayRef, path: path) if RemoteDocLink.isCommitSHA(session.displayRef) { - surface.reloadDisabledReason = "This document was opened at a " - + "specific commit — its content can't change" + surface.reloadDisabledReason = String(localized: + "This document was opened at a specific commit — its content can't change") } } surface.compareAvailable = !loading && loadError == nil - surface.compareUnavailableReason = "The document hasn't finished loading" + surface.compareUnavailableReason = String(localized: "The document hasn't finished loading") surface.popCompare = { popCompareMenu(from: $0) } state.registerSurfaceToolbar(surface) } diff --git a/Sources/PullMark/Views/ReviewPopover.swift b/Sources/PullMark/Views/ReviewPopover.swift index 4fdca8a..864357b 100644 --- a/Sources/PullMark/Views/ReviewPopover.swift +++ b/Sources/PullMark/Views/ReviewPopover.swift @@ -53,8 +53,10 @@ struct ReviewToolbarButton: View { // so the popover arrow can point at the actual button. .background(TrackedViewCapture { tracker.buttonView = $0 }) .help((count == 0 - ? "Review these changes — summary, verdict, and your pending comments" - : "Finish your review — \(count) pending comment\(count == 1 ? "" : "s")") + ? String(localized: "Review these changes — summary, verdict, and your pending comments") + : count == 1 + ? String(localized: "Finish your review — 1 pending comment") + : String(localized: "Finish your review — \(count) pending comments")) + shortcuts.hint(.reviewChanges)) } } @@ -371,8 +373,8 @@ struct ReviewPopover: View { // VoiceOver hears which comment dies, not the glyph's name. .accessibilityLabel("Discard comment, \(comment.path) \(comment.lineDescription)") .help(comment.serverID != nil - ? "Discard this comment from the pending review on GitHub" - : "Discard this comment") + ? String(localized: "Discard this comment from the pending review on GitHub") + : String(localized: "Discard this comment")) } .padding(6) .background(.quaternary.opacity(0.5), in: RoundedRectangle(cornerRadius: 6)) diff --git a/Sources/PullMark/Views/SettingsView.swift b/Sources/PullMark/Views/SettingsView.swift index 1d45301..7b618dd 100644 --- a/Sources/PullMark/Views/SettingsView.swift +++ b/Sources/PullMark/Views/SettingsView.swift @@ -306,7 +306,7 @@ struct GeneralSettingsTab: View { updates.detectUpdateMethodIfNeeded() } .sheet(isPresented: $showAvailableNotes) { - ReleaseNotesSheet(title: "What's New in PullMark", + ReleaseNotesSheet(title: String(localized: "What's New in PullMark"), markdown: updates.availableNotes) } } diff --git a/Tests/PullMarkTests/DemoSessionTests.swift b/Tests/PullMarkTests/DemoSessionTests.swift index 041e798..99b31fe 100644 --- a/Tests/PullMarkTests/DemoSessionTests.swift +++ b/Tests/PullMarkTests/DemoSessionTests.swift @@ -18,7 +18,11 @@ import Testing @Test func demoDefaultsSuiteIsNotTheRealDomain() { #expect(DemoMode.defaultsSuiteName != "app.pullmark.PullMark") - #expect(DemoMode.defaultsSuiteName.hasSuffix(".demo")) + // Per-process since the parallel screenshot generator: shared + // demo suites let one instance's startup wipe reset another's + // live state (see DemoMode.defaultsSuiteName). + #expect(DemoMode.defaultsSuiteName.hasPrefix("app.pullmark.PullMark.demo.")) + #expect(Int32(DemoMode.defaultsSuiteName.split(separator: ".").last ?? "") != nil) } // MARK: - Patch / document consistency diff --git a/loc/_inventory.json b/loc/_inventory.json index 5011e44..65ec4f5 100644 --- a/loc/_inventory.json +++ b/loc/_inventory.json @@ -16,8 +16,12 @@ "%@ 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", + "%@/%@ @ %@ — from GitHub": "Sources/PullMark/Views/OpenQuicklyPalette.swift", + "%lld Markdown files": "Sources/PullMark/Views/ContentView.swift", "%lld Markdown files changed": "Sources/PullMark/Views/PRViews.swift", + "%lld changed Markdown files": "Sources/PullMark/Views/ContentView.swift", "%lld files": "Sources/PullMark/Views/PRViews.swift", + "%lld margin notes": "Sources/PullMark/Views/ContentView.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", @@ -25,16 +29,27 @@ "%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", + "%lld passed": "Sources/PullMark/Views/PRCockpitHeader.swift", + "%lld passed, %lld skipped": "Sources/PullMark/Views/PRCockpitHeader.swift", + "%lld unresolved review comments": "Sources/PullMark/Views/ContentView.swift", + "%lld unresolved review comments on files not shown in PullMark": "Sources/PullMark/Views/PRViews.swift", + "1 Markdown file": "Sources/PullMark/Views/ContentView.swift", "1 Markdown file changed": "Sources/PullMark/Views/PRViews.swift", + "1 changed Markdown file": "Sources/PullMark/Views/ContentView.swift", "1 file": "Sources/PullMark/Views/PRViews.swift", + "1 margin note": "Sources/PullMark/Views/ContentView.swift", "1 more reviewer": "Sources/PullMark/Views/PRCockpitHeader.swift", "1 other file not shown": "Sources/PullMark/Views/PRViews.swift", + "1 unresolved review comment": "Sources/PullMark/Views/ContentView.swift", + "1 unresolved review comment on files not shown in PullMark": "Sources/PullMark/Views/PRViews.swift", + "A classic reading measure": "Sources/PullMark/Core/ContentWidth.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", + "Actual size (1)": "Sources/PullMark/Views/Lightbox.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", @@ -48,14 +63,19 @@ "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", + "Approve": "Sources/PullMark/Core/ReviewControl.swift", + "Approve merging these changes": "Sources/PullMark/Core/ReviewControl.swift", "Approved": "Sources/PullMark/Views/PRCockpitHeader.swift", + "Ask for changes before this can merge": "Sources/PullMark/Core/ReviewControl.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", + "Bookish serif headers on warm paper": "Sources/PullMark/Core/Theme.swift", "Branch name": "Sources/PullMark/Views/CommitSheet.swift", "Branches": "Sources/PullMark/Views/CompareRevisionsSheet.swift", "Branches and worktrees": "Sources/PullMark/Views/RemoteDocView.swift", + "Browse %@/%@": "Sources/PullMark/Views/OpenQuicklyPalette.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", @@ -78,13 +98,14 @@ "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", + "Click, then press the new shortcut": "Sources/PullMark/Views/KeyboardSettingsTab.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": "Sources/PullMark/Core/ReviewControl.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", @@ -101,7 +122,9 @@ "Committed 1 file on new branch “%@”": "Sources/PullMark/Views/CommitSheet.swift", "Compare": "Sources/PullMark/Views/CompareRevisionsSheet.swift", "Compare Revisions": "Sources/PullMark/Views/CompareRevisionsSheet.swift", + "Compare with a previous revision or branch": "Sources/PullMark/Views/AppToolbar.swift", "Comparing ": "Sources/PullMark/Views/LocalFileView.swift", + "Comparing is unavailable here": "Sources/PullMark/Views/AppToolbar.swift", "Comparing with %@": "Sources/PullMark/Views/LocalFileView.swift", "Connected": "Sources/PullMark/Views/GitHubSetupSheet.swift", "Connection status…": "Sources/PullMark/Views/PRViews.swift", @@ -120,6 +143,7 @@ "Copy GitHub links as:": "Sources/PullMark/Views/SettingsView.swift", "Copy Path": "Sources/PullMark/App/PullMarkApp.swift", "Copy as Markdown": "Sources/PullMark/App/PullMarkApp.swift", + "Copy full SHA": "Sources/PullMark/Views/BlameHistorySheet.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", @@ -154,12 +178,15 @@ "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", + "Discard this comment": "Sources/PullMark/Views/ReviewPopover.swift", + "Discard this comment from the pending review on GitHub": "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", + "Done editing%@": "Sources/PullMark/Views/AppToolbar.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", @@ -171,6 +198,7 @@ "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", + "Edit this document%@ — then click any block": "Sources/PullMark/Views/AppToolbar.swift", "Enable margin notes": "Sources/PullMark/Views/SettingsView.swift", "End": "Sources/PullMark/Core/KeyboardShortcuts.swift", "Escape": "Sources/PullMark/Core/KeyboardShortcuts.swift", @@ -184,6 +212,7 @@ "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", + "File not found — last seen at %@": "Sources/PullMark/Views/ContentView.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", @@ -192,7 +221,9 @@ "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", + "Fit (0)": "Sources/PullMark/Views/Lightbox.swift", "Flip Diff Layout": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "Folder not found — last seen at %@": "Sources/PullMark/Views/ContentView.swift", "Forward": "Sources/PullMark/App/PullMarkApp.swift", "Forward Delete": "Sources/PullMark/Core/KeyboardShortcuts.swift", "Full Width": "Sources/PullMark/Core/ContentWidth.swift", @@ -203,6 +234,7 @@ "GitHub CLI": "Sources/PullMark/GitHub/SystemGitCredentials.swift", "GitHub Markdown links:": "Sources/PullMark/Views/SettingsView.swift", "Go": "Sources/PullMark/App/PullMarkApp.swift", + "Heading · %@": "Sources/PullMark/Views/OpenQuicklyPalette.swift", "Hidden": "Sources/PullMark/Views/SettingsView.swift", "Hide Hidden Files": "Sources/PullMark/App/PullMarkApp.swift", "Hide Margin Notes": "Sources/PullMark/App/PullMarkApp.swift", @@ -219,6 +251,10 @@ "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", + "Inline": "Sources/PullMark/Views/PRViews.swift", + "Inline Diffs": "Sources/PullMark/App/PullMarkApp.swift", + "Inline or side-by-side rendered diff": "Sources/PullMark/Views/AppToolbar.swift", + "Inline or side-by-side rendered diff — for the Rendered Diff view": "Sources/PullMark/Views/AppToolbar.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", @@ -232,6 +268,8 @@ "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", + "Leave a note about the whole document, at the top": "Sources/PullMark/App/PullMarkApp.swift", + "Leave a note on the block you're reading — it's saved into the file as a comment": "Sources/PullMark/App/PullMarkApp.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", @@ -242,6 +280,7 @@ "Line numbers shown": "Sources/PullMark/Views/SettingsView.swift", "Loading repo files…": "Sources/PullMark/Views/ContentView.swift", "Locations": "Sources/PullMark/Views/ContentView.swift", + "Longer lines, more on screen": "Sources/PullMark/Core/ContentWidth.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", @@ -259,13 +298,17 @@ "Merged": "Sources/PullMark/Views/PRStatus.swift", "Mission Control": "Sources/PullMark/Core/KeyboardShortcuts.swift", "Modified": "Sources/PullMark/Views/CommitSheet.swift", + "Monospace with a phosphor-green accent": "Sources/PullMark/Core/Theme.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", + "New files always render inline — there is no old side to compare": "Sources/PullMark/Views/PRViews.swift", + "New side": "Sources/PullMark/Views/CompareRevisionsSheet.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 Markdown files in this pull request": "Sources/PullMark/Views/ContentView.swift", "No changes to commit.": "Sources/PullMark/Views/CommitSheet.swift", "No headings": "Sources/PullMark/Views/PageAccessories.swift", "None": "Sources/PullMark/Views/KeyboardSettingsTab.swift", @@ -277,8 +320,11 @@ "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", + "Old side": "Sources/PullMark/Views/CompareRevisionsSheet.swift", "Only requests that change Markdown": "Sources/PullMark/Views/SettingsView.swift", "Open": "Sources/PullMark/Views/ContentView.swift", + "Open %@": "Sources/PullMark/Views/OpenQuicklyPalette.swift", + "Open %@/%@ #%lld": "Sources/PullMark/Views/OpenQuicklyPalette.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", @@ -299,6 +345,7 @@ "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 commit on GitHub": "Sources/PullMark/Views/BlameHistorySheet.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", @@ -331,7 +378,10 @@ "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", + "Pull request": "Sources/PullMark/Views/OpenQuicklyPalette.swift", + "Pull request · %@": "Sources/PullMark/Views/OpenQuicklyPalette.swift", "PullMark %@ is available.": "Sources/PullMark/Views/PageAccessories.swift", + "PullMark Release Notes": "Sources/PullMark/Views/ContentView.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", @@ -348,14 +398,18 @@ "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", + "Recent": "Sources/PullMark/Views/OpenQuicklyPalette.swift", "Recents": "Sources/PullMark/Views/ContentView.swift", + "Recording — press the new shortcut": "Sources/PullMark/Views/KeyboardSettingsTab.swift", "Redo": "Sources/PullMark/Core/KeyboardShortcuts.swift", "Refresh": "Sources/PullMark/Views/PageAccessories.swift", "Refresh Folder": "Sources/PullMark/App/PullMarkApp.swift", + "Relaunch Now": "Sources/PullMark/Views/SettingsView.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", + "Reload this document": "Sources/PullMark/Views/AppToolbar.swift", "Remember my selection": "Sources/PullMark/Views/RemoteDocView.swift", "Remote Branches": "Sources/PullMark/Views/CompareRevisionsSheet.swift", "Remove from Recents": "Sources/PullMark/Views/ContentView.swift", @@ -369,6 +423,7 @@ "Report a Bug…": "Sources/PullMark/App/PullMarkApp.swift", "Report an Issue…": "Sources/PullMark/App/AppLinkRouter.swift", "Request a Feature…": "Sources/PullMark/App/PullMarkApp.swift", + "Request changes": "Sources/PullMark/Core/ReviewControl.swift", "Required": "Sources/PullMark/Views/PRCockpitHeader.swift", "Reset the zoom to 100%": "Sources/PullMark/App/PullMarkApp.swift", "Restore Defaults": "Sources/PullMark/Views/KeyboardSettingsTab.swift", @@ -392,13 +447,16 @@ "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 requested · %@/%@#%lld": "Sources/PullMark/Views/OpenQuicklyPalette.swift", "Review required": "Sources/PullMark/Views/PRCockpitHeader.swift", "Review submitted.": "Sources/PullMark/Views/ReviewPopover.swift", "Review summary (optional)": "Sources/PullMark/Views/ReviewPopover.swift", + "Review these changes — summary, verdict, and your pending comments": "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 As…": "Sources/PullMark/Views/Lightbox.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", @@ -409,6 +467,9 @@ "Set Up…": "Sources/PullMark/Views/PRViews.swift", "Set up the GitHub CLI": "Sources/PullMark/Views/GitHubSetupSheet.swift", "Share": "Sources/PullMark/Views/AppToolbar.swift", + "Share a link to this document on GitHub": "Sources/PullMark/Views/AppToolbar.swift", + "Share a link to this pull request": "Sources/PullMark/Views/AppToolbar.swift", + "Share this document": "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", @@ -425,7 +486,9 @@ "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 next document%@ — click and hold to see history": "Sources/PullMark/Views/NavHistoryControl.swift", "Show the previous document": "Sources/PullMark/App/PullMarkApp.swift", + "Show the previous document%@ — click and hold to see history": "Sources/PullMark/Views/NavHistoryControl.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", @@ -436,6 +499,8 @@ "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", + "Side by Side": "Sources/PullMark/Views/PRViews.swift", + "Side-by-Side Diffs": "Sources/PullMark/App/PullMarkApp.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", @@ -445,6 +510,7 @@ "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 general feedback without explicit approval": "Sources/PullMark/Core/ReviewControl.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", @@ -453,15 +519,18 @@ "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", + "Takes effect after PullMark relaunches.": "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", + "Text uses the whole window": "Sources/PullMark/Core/ContentWidth.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 classic look, exactly as on github.com": "Sources/PullMark/Core/Theme.swift", "The comment will be removed from GitHub. Replies from others will stay.": "Sources/PullMark/Views/ThreadCardActions.swift", + "The document hasn't finished loading": "Sources/PullMark/Views/RemoteDocView.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", @@ -469,12 +538,15 @@ "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 document was opened at a specific commit — its content can't change": "Sources/PullMark/Views/RemoteDocView.swift", + "This file has uncommitted changes — compare with a previous revision or branch": "Sources/PullMark/Views/AppToolbar.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", + "Turn on margin notes in Settings → Experimental": "Sources/PullMark/App/PullMarkApp.swift", "Unavailable": "Sources/PullMark/Views/PRStatus.swift", "Untracked": "Sources/PullMark/Views/CommitSheet.swift", "Up Arrow": "Sources/PullMark/Core/KeyboardShortcuts.swift", @@ -498,6 +570,7 @@ "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", + "What's New in PullMark": "Sources/PullMark/Views/ContentView.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", @@ -510,7 +583,10 @@ "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", + "Zoom in (+)": "Sources/PullMark/Views/Lightbox.swift", + "Zoom out (-)": "Sources/PullMark/Views/Lightbox.swift", "and %lld more": "Sources/PullMark/Views/PRCockpitHeader.swift", + "branch, tag, or commit": "Sources/PullMark/Views/CompareRevisionsSheet.swift", "confirming sheets": "Sources/PullMark/Core/KeyboardShortcuts.swift", "cycling windows": "Sources/PullMark/Core/KeyboardShortcuts.swift", "dismissing sheets": "Sources/PullMark/Core/KeyboardShortcuts.swift", @@ -521,6 +597,7 @@ "opened by %@": "Sources/PullMark/Views/PRViews.swift", "the Help menu": "Sources/PullMark/Core/KeyboardShortcuts.swift", "the app switcher": "Sources/PullMark/Core/KeyboardShortcuts.swift", + "the working file": "Sources/PullMark/Views/CompareRevisionsSheet.swift", " · was {r}": "Sources/PullMark/Rendering/PageStrings.swift", "(empty)": "Sources/PullMark/Rendering/PageStrings.swift", "Add a margin note": "Sources/PullMark/Rendering/PageStrings.swift", @@ -538,7 +615,6 @@ "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", diff --git a/loc/de.lproj/Localizable.strings b/loc/de.lproj/Localizable.strings index 280dbd5..b306690 100644 --- a/loc/de.lproj/Localizable.strings +++ b/loc/de.lproj/Localizable.strings @@ -1,8 +1,10 @@ // 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. +// Darstellung/Gehe zu); sidebar section names follow Finder's German +// (Locations = Orte, Recents = Zuletzt benutzt), with Open Files as +// Geöffnete Dateien — only Pull Requests stays English, as in German +// developer usage. " (none)" = " (ohne)"; "%lld Markdown files changed" = "%lld Markdown-Dateien geändert"; @@ -74,10 +76,10 @@ "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"; +"Clear Recents" = "„Zuletzt benutzt“ 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:"; +"Clicking files in Locations:" = "Klick auf Dateien in „Orte“:"; "Close" = "Schließen"; "Close All" = "Alle schließen"; "Close All Files" = "Alle Dateien schließen"; @@ -153,8 +155,8 @@ "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"; +"Dotfiles and hidden folders in Locations — like ⇧⌘. in Finder" = "Dotfiles und versteckte Ordner in „Orte“ — wie ⇧⌘. im Finder"; +"Dotfiles and hidden folders in Locations — ⇧⌘. toggles this too, like Finder" = "Dotfiles und versteckte Ordner in „Orte“ — ⇧⌘. 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"; @@ -201,7 +203,7 @@ "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."; +"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. Zeilen in „Geöffnete Dateien“ 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"; @@ -226,7 +228,7 @@ "Line %lld (old)" = "Zeile %lld (alt)"; "Line numbers" = "Zeilennummern"; "Loading repo files…" = "Repo-Dateien werden geladen…"; -"Locations" = "Locations"; +"Locations" = "Orte"; "Make Default Again" = "Wieder zum Standard machen"; "Make PullMark the Default" = "PullMark zum Standard machen"; "Make the document bigger" = "Das Dokument größer machen"; @@ -264,7 +266,7 @@ "Open" = "Öffnen"; "Open Branch Separately" = "Branch separat öffnen"; "Open File or Folder" = "Datei oder Ordner öffnen"; -"Open Files" = "Open Files"; +"Open Files" = "Geöffnete Dateien"; "Open File…" = "Datei öffnen…"; "Open Folder…" = "Ordner öffnen…"; "Open Fully" = "Ganz öffnen"; @@ -306,7 +308,7 @@ "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."; +"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 „Geöffnete Dateien“ 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"; @@ -331,7 +333,7 @@ "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"; +"Recents" = "Zuletzt benutzt"; "Redo" = "Wiederholen"; "Refresh" = "Aktualisieren"; "Refresh Folder" = "Ordner aktualisieren"; @@ -341,7 +343,7 @@ "Reload Document" = "Dokument neu laden"; "Remember my selection" = "Meine Auswahl merken"; "Remote Branches" = "Remote-Branches"; -"Remove from Recents" = "Aus Recents entfernen"; +"Remove from Recents" = "Aus „Zuletzt benutzt“ entfernen"; "Remove from Sidebar" = "Aus der Seitenleiste entfernen"; "Remove the PullMark disk image?" = "Das PullMark-Disk-Image entfernen?"; "Rendered" = "Gerendert"; @@ -364,7 +366,7 @@ "Retry Upload" = "Upload erneut versuchen"; "Return" = "Return"; "Reveal in Finder" = "Im Finder zeigen"; -"Reveal in Location" = "In Location zeigen"; +"Reveal in Location" = "Im Ort 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"; @@ -449,7 +451,7 @@ "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 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 eigenen Ort, 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."; @@ -480,7 +482,7 @@ "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"; +"With files in Open Files" = "Mit Dateien in „Geöffnete Dateien“"; "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."; @@ -608,3 +610,80 @@ "Untracked" = "Nicht versioniert"; "git credential helper" = "git credential helper"; "Relaunch Now" = "Jetzt neu starten"; +"A classic reading measure" = "Ein klassisches Lesemaß"; +"Approve" = "Genehmigen"; +"Approve merging these changes" = "Das Zusammenführen dieser Änderungen genehmigen"; +"Ask for changes before this can merge" = "Änderungen verlangen, bevor das hier zusammengeführt werden kann"; +"Bookish serif headers on warm paper" = "Buchähnliche Serifen-Überschriften auf warmem Papier"; +"Inline" = "Inline"; +"Longer lines, more on screen" = "Längere Zeilen, mehr auf dem Schirm"; +"Monospace with a phosphor-green accent" = "Monospace mit einem Akzent in Phosphorgrün"; +"Request changes" = "Änderungen anfordern"; +"Side by Side" = "Nebeneinander"; +"Submit general feedback without explicit approval" = "Allgemeines Feedback ohne ausdrückliche Genehmigung abschicken"; +"Text uses the whole window" = "Der Text nutzt das ganze Fenster"; +"The classic look, exactly as on github.com" = "Der klassische Look, genau wie auf github.com"; +"%@/%@ @ %@ — from GitHub" = "%@/%@ @ %@ — von GitHub"; +"%lld Markdown files" = "%lld Markdown-Dateien"; +"%lld changed Markdown files" = "%lld geänderte Markdown-Dateien"; +"%lld margin notes" = "%lld Randnotizen"; +"%lld passed" = "%lld bestanden"; +"%lld passed, %lld skipped" = "%lld bestanden, %lld übersprungen"; +"%lld unresolved review comments" = "%lld unaufgelöste Review-Kommentare"; +"%lld unresolved review comments on files not shown in PullMark" = "%lld unaufgelöste Review-Kommentare an Dateien, die PullMark nicht zeigt"; +"1 Markdown file" = "1 Markdown-Datei"; +"1 changed Markdown file" = "1 geänderte Markdown-Datei"; +"1 margin note" = "1 Randnotiz"; +"1 unresolved review comment" = "1 unaufgelöster Review-Kommentar"; +"1 unresolved review comment on files not shown in PullMark" = "1 unaufgelöster Review-Kommentar an Dateien, die PullMark nicht zeigt"; +"Actual size (1)" = "Tatsächliche Größe (1)"; +"Browse %@/%@" = "%@/%@ durchstöbern"; +"Click, then press the new shortcut" = "Klicken, dann das neue Kürzel drücken"; +"Compare with a previous revision or branch" = "Mit einer früheren Revision oder einem Branch vergleichen"; +"Comparing is unavailable here" = "Vergleichen ist hier nicht verfügbar"; +"Discard this comment" = "Diesen Kommentar verwerfen"; +"Discard this comment from the pending review on GitHub" = "Diesen Kommentar aus dem ausstehenden Review auf GitHub verwerfen"; +"Done editing%@" = "Bearbeiten beenden%@"; +"Edit this document%@ — then click any block" = "Dieses Dokument bearbeiten%@ — dann einen beliebigen Block anklicken"; +"File not found — last seen at %@" = "Datei nicht gefunden — zuletzt gesehen unter %@"; +"Fit (0)" = "Einpassen (0)"; +"Folder not found — last seen at %@" = "Ordner nicht gefunden — zuletzt gesehen unter %@"; +"Heading · %@" = "Überschrift · %@"; +"Inline Diffs" = "Inline-Diffs"; +"Inline or side-by-side rendered diff" = "Gerendertes Diff inline oder nebeneinander"; +"Inline or side-by-side rendered diff — for the Rendered Diff view" = "Gerendertes Diff inline oder nebeneinander — für die Ansicht „Gerendertes Diff“"; +"Leave a note about the whole document, at the top" = "Eine Notiz zum ganzen Dokument anbringen, ganz oben"; +"Leave a note on the block you're reading — it's saved into the file as a comment" = "Eine Notiz an dem Block anbringen, den du gerade liest — sie wird als -Kommentar in der Datei gesichert"; +"New files always render inline — there is no old side to compare" = "Neue Dateien werden immer inline gerendert — es gibt keine alte Seite zum Vergleichen"; +"New side" = "Neue Seite"; +"No Markdown files in this pull request" = "Keine Markdown-Dateien in diesem Pull Request"; +"Old side" = "Alte Seite"; +"Open %@" = "%@ öffnen"; +"Open %@/%@ #%lld" = "%@/%@ #%lld öffnen"; +"Open commit on GitHub" = "Commit auf GitHub öffnen"; +"Pull request" = "Pull Request"; +"Pull request · %@" = "Pull Request · %@"; +"PullMark Release Notes" = "PullMark Release Notes"; +"Recent" = "Zuletzt benutzt"; +"Recording — press the new shortcut" = "Aufnahme — drück das neue Kürzel"; +"Reload this document" = "Dieses Dokument neu laden"; +"Review requested · %@/%@#%lld" = "Review angefragt · %@/%@#%lld"; +"Review these changes — summary, verdict, and your pending comments" = "Diese Änderungen reviewen — Zusammenfassung, Urteil und deine ausstehenden Kommentare"; +"Save As…" = "Sichern unter…"; +"Share a link to this document on GitHub" = "Einen Link zu diesem Dokument auf GitHub teilen"; +"Share a link to this pull request" = "Einen Link zu diesem Pull Request teilen"; +"Share this document" = "Dieses Dokument teilen"; +"Show the next document%@ — click and hold to see history" = "Das nächste Dokument zeigen%@ — klicken und halten für die Historie"; +"Show the previous document%@ — click and hold to see history" = "Das vorherige Dokument zeigen%@ — klicken und halten für die Historie"; +"Side-by-Side Diffs" = "Diffs nebeneinander"; +"The document hasn't finished loading" = "Das Dokument ist noch nicht fertig geladen"; +"This document was opened at a specific commit — its content can't change" = "Dieses Dokument wurde an einem bestimmten Commit geöffnet — sein Inhalt kann sich nicht ändern"; +"This file has uncommitted changes — compare with a previous revision or branch" = "Diese Datei hat nicht committete Änderungen — mit einer früheren Revision oder einem Branch vergleichen"; +"Turn on margin notes in Settings → Experimental" = "Randnotizen in Einstellungen → Experimentell einschalten"; +"What's New in PullMark" = "Neuerungen in PullMark"; +"Zoom in (+)" = "Einzoomen (+)"; +"Zoom out (-)" = "Auszoomen (-)"; +"branch, tag, or commit" = "Branch, Tag oder Commit"; +"the working file" = "die Arbeitsdatei"; +"editing" = "wird bearbeitet"; +"pr-status-open" = "Offen"; diff --git a/loc/es.lproj/Localizable.strings b/loc/es.lproj/Localizable.strings index 110d348..35927cf 100644 --- a/loc/es.lproj/Localizable.strings +++ b/loc/es.lproj/Localizable.strings @@ -75,7 +75,7 @@ "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:"; +"Clicking files in Locations:" = "Al hacer clic en archivos de Ubicaciones:"; "Close" = "Cerrar"; "Close All" = "Cerrar todo"; "Close All Files" = "Cerrar todos los archivos"; @@ -138,7 +138,7 @@ "Current branch" = "Rama actual"; "Custom themes" = "Temas personalizados"; "Customize Toolbar…" = "Personalizar barra de herramientas…"; -"Dark" = "Dark"; +"Dark" = "Oscuro"; "Default diff layout:" = "Disposición del diff por defecto:"; "Delete" = "Eliminar"; "Delete comment" = "Eliminar comentario"; @@ -151,8 +151,8 @@ "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"; +"Dotfiles and hidden folders in Locations — like ⇧⌘. in Finder" = "Los dotfiles y las carpetas ocultas en Ubicaciones — como ⇧⌘. en el Finder"; +"Dotfiles and hidden folders in Locations — ⇧⌘. toggles this too, like Finder" = "Los dotfiles y las carpetas ocultas en Ubicaciones — ⇧⌘. 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"; @@ -199,7 +199,7 @@ "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."; +"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 Archivos abiertos 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"; @@ -218,13 +218,13 @@ "Last seen at %@. " = "Visto por última vez en %@. "; "Layout" = "Disposición"; "Left Arrow" = "Flecha izquierda"; -"Light" = "Light"; +"Light" = "Claro"; "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"; +"Locations" = "Ubicaciones"; "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"; @@ -262,7 +262,7 @@ "Open" = "Abrir"; "Open Branch Separately" = "Abrir la rama por separado"; "Open File or Folder" = "Abrir archivo o carpeta"; -"Open Files" = "Open Files"; +"Open Files" = "Archivos abiertos"; "Open File…" = "Abrir archivo…"; "Open Folder…" = "Abrir carpeta…"; "Open Fully" = "Abrir del todo"; @@ -304,7 +304,7 @@ "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."; +"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 Archivos abiertos, 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"; @@ -478,7 +478,7 @@ "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"; +"With files in Open Files" = "Cuando hay archivos en Archivos abiertos"; "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."; @@ -606,3 +606,80 @@ "Untracked" = "Sin seguimiento"; "git credential helper" = "asistente de credenciales de git"; "Relaunch Now" = "Reiniciar ahora"; +"A classic reading measure" = "Una medida de lectura clásica"; +"Approve" = "Aprobar"; +"Approve merging these changes" = "Aprueba la fusión de estos cambios"; +"Ask for changes before this can merge" = "Pide cambios antes de que esto pueda fusionarse"; +"Bookish serif headers on warm paper" = "Títulos con serifa de libro, sobre papel cálido"; +"Inline" = "En línea"; +"Longer lines, more on screen" = "Líneas más largas, más en pantalla"; +"Monospace with a phosphor-green accent" = "Monoespaciada con un acento verde fósforo"; +"Request changes" = "Solicitar cambios"; +"Side by Side" = "Lado a lado"; +"Submit general feedback without explicit approval" = "Envía comentarios generales sin aprobación explícita"; +"Text uses the whole window" = "El texto ocupa toda la ventana"; +"The classic look, exactly as on github.com" = "El aspecto clásico, igual que en github.com"; +"%@/%@ @ %@ — from GitHub" = "%@/%@ @ %@ — desde GitHub"; +"%lld Markdown files" = "%lld archivos Markdown"; +"%lld changed Markdown files" = "%lld archivos Markdown modificados"; +"%lld margin notes" = "%lld notas al margen"; +"%lld passed" = "%lld superadas"; +"%lld passed, %lld skipped" = "%lld superadas, %lld omitidas"; +"%lld unresolved review comments" = "%lld comentarios de revisión sin resolver"; +"%lld unresolved review comments on files not shown in PullMark" = "%lld comentarios de revisión sin resolver en archivos que no se muestran en PullMark"; +"1 Markdown file" = "1 archivo Markdown"; +"1 changed Markdown file" = "1 archivo Markdown modificado"; +"1 margin note" = "1 nota al margen"; +"1 unresolved review comment" = "1 comentario de revisión sin resolver"; +"1 unresolved review comment on files not shown in PullMark" = "1 comentario de revisión sin resolver en archivos que no se muestran en PullMark"; +"Actual size (1)" = "Tamaño real (1)"; +"Browse %@/%@" = "Explorar %@/%@"; +"Click, then press the new shortcut" = "Haz clic y luego pulsa el atajo nuevo"; +"Compare with a previous revision or branch" = "Comparar con una revisión anterior o una rama"; +"Comparing is unavailable here" = "Aquí no se puede comparar"; +"Discard this comment" = "Descartar este comentario"; +"Discard this comment from the pending review on GitHub" = "Descartar este comentario de la revisión pendiente en GitHub"; +"Done editing%@" = "Terminar de editar%@"; +"Edit this document%@ — then click any block" = "Editar este documento%@ — luego haz clic en cualquier bloque"; +"File not found — last seen at %@" = "Archivo no encontrado — visto por última vez en %@"; +"Fit (0)" = "Ajustar (0)"; +"Folder not found — last seen at %@" = "Carpeta no encontrada — vista por última vez en %@"; +"Heading · %@" = "Encabezado · %@"; +"Inline Diffs" = "Diffs en línea"; +"Inline or side-by-side rendered diff" = "Diff renderizado en línea o lado a lado"; +"Inline or side-by-side rendered diff — for the Rendered Diff view" = "Diff renderizado en línea o lado a lado — para la vista Diff renderizado"; +"Leave a note about the whole document, at the top" = "Deja una nota sobre todo el documento, arriba del todo"; +"Leave a note on the block you're reading — it's saved into the file as a comment" = "Deja una nota en el bloque que estás leyendo — se guarda en el archivo como un comentario "; +"New files always render inline — there is no old side to compare" = "Los archivos nuevos siempre se renderizan en línea — no hay lado antiguo con el que comparar"; +"New side" = "Lado nuevo"; +"No Markdown files in this pull request" = "Sin archivos Markdown en este pull request"; +"Old side" = "Lado antiguo"; +"Open %@" = "Abrir %@"; +"Open %@/%@ #%lld" = "Abrir %@/%@ #%lld"; +"Open commit on GitHub" = "Abrir el commit en GitHub"; +"Pull request" = "Pull request"; +"Pull request · %@" = "Pull request · %@"; +"PullMark Release Notes" = "Notas de versión de PullMark"; +"Recent" = "Reciente"; +"Recording — press the new shortcut" = "Grabando — pulsa el atajo nuevo"; +"Reload this document" = "Recargar este documento"; +"Review requested · %@/%@#%lld" = "Revisión solicitada · %@/%@#%lld"; +"Review these changes — summary, verdict, and your pending comments" = "Revisa estos cambios — resumen, veredicto y tus comentarios pendientes"; +"Save As…" = "Guardar como…"; +"Share a link to this document on GitHub" = "Compartir un enlace a este documento en GitHub"; +"Share a link to this pull request" = "Compartir un enlace a este pull request"; +"Share this document" = "Compartir este documento"; +"Show the next document%@ — click and hold to see history" = "Muestra el documento siguiente%@ — mantén pulsado para ver el historial"; +"Show the previous document%@ — click and hold to see history" = "Muestra el documento anterior%@ — mantén pulsado para ver el historial"; +"Side-by-Side Diffs" = "Diffs lado a lado"; +"The document hasn't finished loading" = "El documento aún no ha terminado de cargarse"; +"This document was opened at a specific commit — its content can't change" = "Este documento se abrió en un commit concreto — su contenido no puede cambiar"; +"This file has uncommitted changes — compare with a previous revision or branch" = "Este archivo tiene cambios sin commitear — compara con una revisión anterior o una rama"; +"Turn on margin notes in Settings → Experimental" = "Activa las notas al margen en Ajustes → Experimental"; +"What's New in PullMark" = "Novedades de PullMark"; +"Zoom in (+)" = "Acercar (+)"; +"Zoom out (-)" = "Alejar (-)"; +"branch, tag, or commit" = "rama, etiqueta o commit"; +"the working file" = "el archivo de trabajo"; +"editing" = "editando"; +"pr-status-open" = "Abierto"; diff --git a/loc/fr.lproj/Localizable.strings b/loc/fr.lproj/Localizable.strings index 59df574..3085f45 100644 --- a/loc/fr.lproj/Localizable.strings +++ b/loc/fr.lproj/Localizable.strings @@ -71,7 +71,7 @@ "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 :"; +"Clicking files in Locations:" = "Clic sur un fichier dans Emplacements :"; "Close" = "Fermer"; "Close All" = "Tout fermer"; "Close All Files" = "Fermer tous les fichiers"; @@ -147,8 +147,8 @@ "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"; +"Dotfiles and hidden folders in Locations — like ⇧⌘. in Finder" = "Les dotfiles et dossiers cachés dans Emplacements — comme ⇧⌘. dans le Finder"; +"Dotfiles and hidden folders in Locations — ⇧⌘. toggles this too, like Finder" = "Les dotfiles et dossiers cachés dans Emplacements — ⇧⌘. 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"; @@ -195,7 +195,7 @@ "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."; +"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 de Fichiers ouverts 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"; @@ -220,7 +220,7 @@ "Line %lld (old)" = "Ligne %lld (ancienne)"; "Line numbers" = "Numéros de ligne"; "Loading repo files…" = "Chargement des fichiers du dépôt…"; -"Locations" = "Locations"; +"Locations" = "Emplacements"; "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"; @@ -258,7 +258,7 @@ "Open" = "Ouvrir"; "Open Branch Separately" = "Ouvrir la branche à part"; "Open File or Folder" = "Ouvrir un fichier ou un dossier"; -"Open Files" = "Open Files"; +"Open Files" = "Fichiers ouverts"; "Open File…" = "Ouvrir un fichier…"; "Open Folder…" = "Ouvrir un dossier…"; "Open Fully" = "Ouvrir complètement"; @@ -300,7 +300,7 @@ "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."; +"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 Fichiers ouverts, 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"; @@ -358,7 +358,7 @@ "Retry Upload" = "Réessayer l'envoi"; "Return" = "Retour"; "Reveal in Finder" = "Afficher dans le Finder"; -"Reveal in Location" = "Afficher dans Locations"; +"Reveal in Location" = "Afficher dans Emplacements"; "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"; @@ -443,7 +443,7 @@ "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 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 emplacement à 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."; @@ -474,7 +474,7 @@ "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"; +"With files in Open Files" = "Avec des fichiers dans la section Fichiers ouverts"; "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."; @@ -602,3 +602,80 @@ "Untracked" = "Non suivi"; "git credential helper" = "assistant d'identification git"; "Relaunch Now" = "Relancer maintenant"; +"A classic reading measure" = "Une justification classique"; +"Approve" = "Approuver"; +"Approve merging these changes" = "Approuver la fusion de ces modifications"; +"Ask for changes before this can merge" = "Demander des modifications avant que cela puisse être fusionné"; +"Bookish serif headers on warm paper" = "Des titres à empattements façon livre, sur papier chaud"; +"Inline" = "En ligne"; +"Longer lines, more on screen" = "Des lignes plus longues, plus de texte à l'écran"; +"Monospace with a phosphor-green accent" = "Du monospace avec un accent vert phosphore"; +"Request changes" = "Demander des modifications"; +"Side by Side" = "Côte à côte"; +"Submit general feedback without explicit approval" = "Envoyer un retour général sans approbation explicite"; +"Text uses the whole window" = "Le texte occupe toute la fenêtre"; +"The classic look, exactly as on github.com" = "Le look classique, exactement comme sur github.com"; +"%@/%@ @ %@ — from GitHub" = "%@/%@ @ %@ — depuis GitHub"; +"%lld Markdown files" = "%lld fichiers Markdown"; +"%lld changed Markdown files" = "%lld fichiers Markdown modifiés"; +"%lld margin notes" = "%lld notes de marge"; +"%lld passed" = "%lld réussies"; +"%lld passed, %lld skipped" = "%lld réussies, %lld ignorées"; +"%lld unresolved review comments" = "%lld commentaires de révision non résolus"; +"%lld unresolved review comments on files not shown in PullMark" = "%lld commentaires de révision non résolus sur des fichiers que PullMark n'affiche pas"; +"1 Markdown file" = "1 fichier Markdown"; +"1 changed Markdown file" = "1 fichier Markdown modifié"; +"1 margin note" = "1 note de marge"; +"1 unresolved review comment" = "1 commentaire de révision non résolu"; +"1 unresolved review comment on files not shown in PullMark" = "1 commentaire de révision non résolu sur des fichiers que PullMark n'affiche pas"; +"Actual size (1)" = "Taille réelle (1)"; +"Browse %@/%@" = "Parcourir %@/%@"; +"Click, then press the new shortcut" = "Cliquez, puis appuyez sur le nouveau raccourci"; +"Compare with a previous revision or branch" = "Comparer avec une version antérieure ou une branche"; +"Comparing is unavailable here" = "La comparaison n'est pas disponible ici"; +"Discard this comment" = "Supprimer ce commentaire"; +"Discard this comment from the pending review on GitHub" = "Supprimer ce commentaire de la révision en attente sur GitHub"; +"Done editing%@" = "Terminer la modification%@"; +"Edit this document%@ — then click any block" = "Modifier ce document%@ — cliquez ensuite n'importe quel bloc"; +"File not found — last seen at %@" = "Fichier introuvable — vu pour la dernière fois à %@"; +"Fit (0)" = "Ajuster (0)"; +"Folder not found — last seen at %@" = "Dossier introuvable — vu pour la dernière fois à %@"; +"Heading · %@" = "Titre · %@"; +"Inline Diffs" = "Diffs en ligne"; +"Inline or side-by-side rendered diff" = "Diff rendu en ligne ou côte à côte"; +"Inline or side-by-side rendered diff — for the Rendered Diff view" = "Diff rendu en ligne ou côte à côte — pour la vue Diff rendu"; +"Leave a note about the whole document, at the top" = "Laisser une note sur le document entier, tout en haut"; +"Leave a note on the block you're reading — it's saved into the file as a comment" = "Laisser une note sur le bloc que vous lisez — elle est enregistrée dans le fichier sous forme de commentaire "; +"New files always render inline — there is no old side to compare" = "Les nouveaux fichiers sont toujours rendus en ligne — il n'y a pas de côté ancien à comparer"; +"New side" = "Côté nouveau"; +"No Markdown files in this pull request" = "Aucun fichier Markdown dans cette pull request"; +"Old side" = "Côté ancien"; +"Open %@" = "Ouvrir %@"; +"Open %@/%@ #%lld" = "Ouvrir %@/%@ #%lld"; +"Open commit on GitHub" = "Ouvrir le commit sur GitHub"; +"Pull request" = "Pull request"; +"Pull request · %@" = "Pull request · %@"; +"PullMark Release Notes" = "Notes de version de PullMark"; +"Recent" = "Récent"; +"Recording — press the new shortcut" = "Enregistrement — appuyez sur le nouveau raccourci"; +"Reload this document" = "Recharger ce document"; +"Review requested · %@/%@#%lld" = "Révision demandée · %@/%@#%lld"; +"Review these changes — summary, verdict, and your pending comments" = "Réviser ces modifications — résumé, verdict et vos commentaires en attente"; +"Save As…" = "Enregistrer sous…"; +"Share a link to this document on GitHub" = "Partager un lien vers ce document sur GitHub"; +"Share a link to this pull request" = "Partager un lien vers cette pull request"; +"Share this document" = "Partager ce document"; +"Show the next document%@ — click and hold to see history" = "Affiche le document suivant%@ — cliquez et maintenez pour voir l'historique"; +"Show the previous document%@ — click and hold to see history" = "Affiche le document précédent%@ — cliquez et maintenez pour voir l'historique"; +"Side-by-Side Diffs" = "Diffs côte à côte"; +"The document hasn't finished loading" = "Le document n'a pas fini de charger"; +"This document was opened at a specific commit — its content can't change" = "Ce document a été ouvert à un commit précis — son contenu ne peut pas changer"; +"This file has uncommitted changes — compare with a previous revision or branch" = "Ce fichier a des modifications non committées — comparez avec une version antérieure ou une branche"; +"Turn on margin notes in Settings → Experimental" = "Activez les notes de marge dans Réglages → Expérimental"; +"What's New in PullMark" = "Nouveautés de PullMark"; +"Zoom in (+)" = "Zoom avant (+)"; +"Zoom out (-)" = "Zoom arrière (-)"; +"branch, tag, or commit" = "branche, tag ou commit"; +"the working file" = "le fichier de travail"; +"editing" = "édition"; +"pr-status-open" = "Ouverte"; diff --git a/loc/ja.lproj/Localizable.strings b/loc/ja.lproj/Localizable.strings index 198a4ed..e44909f 100644 --- a/loc/ja.lproj/Localizable.strings +++ b/loc/ja.lproj/Localizable.strings @@ -74,7 +74,7 @@ "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 内のファイルをクリックしたとき:"; +"Clicking files in Locations:" = "「場所」内のファイルをクリックしたとき:"; "Close" = "閉じる"; "Close All" = "すべて閉じる"; "Close All Files" = "すべてのファイルを閉じる"; @@ -150,8 +150,8 @@ "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 と同じく ⇧⌘. でも切り替えられます"; +"Dotfiles and hidden folders in Locations — like ⇧⌘. in Finder" = "「場所」内のドットファイルと隠しフォルダ — Finder の ⇧⌘. と同じです"; +"Dotfiles and hidden folders in Locations — ⇧⌘. toggles this too, like Finder" = "「場所」内のドットファイルと隠しフォルダ — Finder と同じく ⇧⌘. でも切り替えられます"; "Down Arrow" = "下矢印"; "Download" = "ダウンロード"; "Downloads the update, verifies its signature, and installs it in place" = "アップデートをダウンロードし、署名を検証して、その場にインストールします"; @@ -198,7 +198,7 @@ "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 の行には件数のチップが付き、表示 → マージンノートを非表示 はきれいに読むためにページを片づけます。"; +"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 でも構いません。編集と削除は各吹き出しから。ノートを削除することが、解決するということです。文書がまだノートを抱えているあいだ、「開いているファイル」の行には件数のチップが付き、表示 → マージンノートを非表示 はきれいに読むためにページを片づけます。"; "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" = "ローカル文書で"; @@ -223,7 +223,7 @@ "Line %lld (old)" = "%lld 行目 (旧)"; "Line numbers" = "行番号"; "Loading repo files…" = "リポジトリのファイルを読み込んでいます…"; -"Locations" = "Locations"; +"Locations" = "場所"; "Make Default Again" = "もう一度デフォルトにする"; "Make PullMark the Default" = "PullMark をデフォルトにする"; "Make the document bigger" = "文書を大きくします"; @@ -261,7 +261,7 @@ "Open" = "開く"; "Open Branch Separately" = "ブランチを別に開く"; "Open File or Folder" = "ファイルまたはフォルダを開く"; -"Open Files" = "Open Files"; +"Open Files" = "開いているファイル"; "Open File…" = "ファイルを開く…"; "Open Folder…" = "フォルダを開く…"; "Open Fully" = "完全に開く"; @@ -303,7 +303,7 @@ "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 リポジトリの下に)現れ、次のプレビューがそれを置き換えます。ファイルをダブルクリックするか、編集を始めるだけで、開いたままになります。「完全に開く」は、クリックしたファイルをすべて残します。"; +"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 回でファイルを見せながら、手元には残しません — 斜体の項目がひとつ(「開いているファイル」、またはその GitHub リポジトリの下に)現れ、次のプレビューがそれを置き換えます。ファイルをダブルクリックするか、編集を始めるだけで、開いたままになります。「完全に開く」は、クリックしたファイルをすべて残します。"; "Previous File" = "前のファイル"; "Previous Markdown file in this pull request" = "このプルリクエストの前の Markdown ファイル"; "Previous match" = "前の一致"; @@ -477,7 +477,7 @@ "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 にファイルがあるとき"; +"With files in 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." = "カスタムのショートカットは削除されます。この操作は取り消せません。"; @@ -605,3 +605,80 @@ "Untracked" = "未追跡"; "git credential helper" = "git 認証ヘルパー"; "Relaunch Now" = "今すぐ再起動"; +"A classic reading measure" = "古典的な行長"; +"Approve" = "承認"; +"Approve merging these changes" = "これらの変更のマージを承認します"; +"Ask for changes before this can merge" = "マージできるようになる前に、変更を求めます"; +"Bookish serif headers on warm paper" = "本のようなセリフ体の見出しと、温かみのある紙"; +"Inline" = "インライン"; +"Longer lines, more on screen" = "行は長く、画面に載る量は多く"; +"Monospace with a phosphor-green accent" = "等幅フォントに、蛍光グリーンのアクセント"; +"Request changes" = "変更をリクエスト"; +"Side by Side" = "並べて表示"; +"Submit general feedback without explicit approval" = "明確な承認はせずに、全体的なフィードバックを送ります"; +"Text uses the whole window" = "テキストがウィンドウいっぱいに"; +"The classic look, exactly as on github.com" = "github.com そのままの、おなじみの見た目"; +"%@/%@ @ %@ — from GitHub" = "%@/%@ @ %@ — GitHub から"; +"%lld Markdown files" = "Markdown ファイル %lld 個"; +"%lld changed Markdown files" = "変更された Markdown ファイル %lld 個"; +"%lld margin notes" = "マージンノート %lld 件"; +"%lld passed" = "%lld 件成功"; +"%lld passed, %lld skipped" = "%lld 件成功、%lld 件スキップ"; +"%lld unresolved review comments" = "未解決のレビューコメント %lld 件"; +"%lld unresolved review comments on files not shown in PullMark" = "PullMark に表示されないファイルの未解決レビューコメント %lld 件"; +"1 Markdown file" = "Markdown ファイル 1 個"; +"1 changed Markdown file" = "変更された Markdown ファイル 1 個"; +"1 margin note" = "マージンノート 1 件"; +"1 unresolved review comment" = "未解決のレビューコメント 1 件"; +"1 unresolved review comment on files not shown in PullMark" = "PullMark に表示されないファイルの未解決レビューコメント 1 件"; +"Actual size (1)" = "実際のサイズ (1)"; +"Browse %@/%@" = "%@/%@ をブラウズ"; +"Click, then press the new shortcut" = "クリックしてから、新しいショートカットを押します"; +"Compare with a previous revision or branch" = "以前のリビジョンやブランチと比較します"; +"Comparing is unavailable here" = "ここでは比較できません"; +"Discard this comment" = "このコメントを破棄"; +"Discard this comment from the pending review on GitHub" = "GitHub 上の保留中のレビューから、このコメントを破棄します"; +"Done editing%@" = "編集を終了%@"; +"Edit this document%@ — then click any block" = "この文書を編集%@ — あとはどれかのブロックをクリック"; +"File not found — last seen at %@" = "ファイルが見つかりません — 最後に見かけたのは %@ でした"; +"Fit (0)" = "ウインドウに合わせる (0)"; +"Folder not found — last seen at %@" = "フォルダが見つかりません — 最後に見かけたのは %@ でした"; +"Heading · %@" = "見出し · %@"; +"Inline Diffs" = "差分をインライン表示"; +"Inline or side-by-side rendered diff" = "レンダリング差分をインラインまたは並べて表示"; +"Inline or side-by-side rendered diff — for the Rendered Diff view" = "レンダリング差分をインラインまたは並べて表示 — 「レンダリング差分」ビュー用です"; +"Leave a note about the whole document, at the top" = "文書全体についてのノートを、いちばん上に残します"; +"Leave a note on the block you're reading — it's saved into the file as a comment" = "いま読んでいるブロックにノートを残します — コメントとしてファイルに保存されます"; +"New files always render inline — there is no old side to compare" = "新規ファイルはつねにインラインで表示されます — 比較する古い側がありません"; +"New side" = "新しい側"; +"No Markdown files in this pull request" = "このプルリクエストに Markdown ファイルはありません"; +"Old side" = "古い側"; +"Open %@" = "%@ を開く"; +"Open %@/%@ #%lld" = "%@/%@ #%lld を開く"; +"Open commit on GitHub" = "GitHub でコミットを開く"; +"Pull request" = "プルリクエスト"; +"Pull request · %@" = "プルリクエスト · %@"; +"PullMark Release Notes" = "PullMark のリリースノート"; +"Recent" = "最近使った項目"; +"Recording — press the new shortcut" = "記録中 — 新しいショートカットを押してください"; +"Reload this document" = "この文書を再読み込みします"; +"Review requested · %@/%@#%lld" = "レビュー依頼 · %@/%@#%lld"; +"Review these changes — summary, verdict, and your pending comments" = "これらの変更をレビューします — 要約、判定、そしてあなたの保留中のコメント"; +"Save As…" = "別名で保存…"; +"Share a link to this document on GitHub" = "GitHub 上のこの文書へのリンクを共有します"; +"Share a link to this pull request" = "このプルリクエストへのリンクを共有します"; +"Share this document" = "この文書を共有します"; +"Show the next document%@ — click and hold to see history" = "次の文書を表示します%@ — クリックしたままにすると履歴が出ます"; +"Show the previous document%@ — click and hold to see history" = "前の文書を表示します%@ — クリックしたままにすると履歴が出ます"; +"Side-by-Side Diffs" = "差分を並べて表示"; +"The document hasn't finished loading" = "文書の読み込みがまだ終わっていません"; +"This document was opened at a specific commit — its content can't change" = "この文書は特定のコミットで開かれています — 内容が変わることはありません"; +"This file has uncommitted changes — compare with a previous revision or branch" = "このファイルには未コミットの変更があります — 以前のリビジョンやブランチと比較します"; +"Turn on margin notes in Settings → Experimental" = "設定 → 実験的機能 でマージンノートをオンにしてください"; +"What's New in PullMark" = "PullMark の新機能"; +"Zoom in (+)" = "拡大 (+)"; +"Zoom out (-)" = "縮小 (-)"; +"branch, tag, or commit" = "ブランチ、タグ、コミット"; +"the working file" = "作業中のファイル"; +"editing" = "編集中"; +"pr-status-open" = "オープン"; diff --git a/loc/nl.lproj/Localizable.strings b/loc/nl.lproj/Localizable.strings index 9daaba1..7057121 100644 --- a/loc/nl.lproj/Localizable.strings +++ b/loc/nl.lproj/Localizable.strings @@ -74,7 +74,7 @@ "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:"; +"Clicking files in Locations:" = "Klikken op bestanden in Locaties:"; "Close" = "Sluit"; "Close All" = "Sluit alles"; "Close All Files" = "Sluit alle bestanden"; @@ -137,7 +137,7 @@ "Current branch" = "Huidige branch"; "Custom themes" = "Eigen thema's"; "Customize Toolbar…" = "Pas toolbar aan…"; -"Dark" = "Dark"; +"Dark" = "Donker"; "Default diff layout:" = "Standaard diff-indeling:"; "Delete" = "Verwijder"; "Delete comment" = "Verwijder comment"; @@ -150,8 +150,8 @@ "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"; +"Dotfiles and hidden folders in Locations — like ⇧⌘. in Finder" = "Dotfiles en verborgen mappen in Locaties — net als ⇧⌘. in de Finder"; +"Dotfiles and hidden folders in Locations — ⇧⌘. toggles this too, like Finder" = "Dotfiles en verborgen mappen in Locaties — ⇧⌘. 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"; @@ -198,7 +198,7 @@ "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."; +"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 Geopende bestanden 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"; @@ -217,13 +217,13 @@ "Last seen at %@. " = "Laatst gezien op %@. "; "Layout" = "Indeling"; "Left Arrow" = "Pijl links"; -"Light" = "Light"; +"Light" = "Licht"; "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"; +"Locations" = "Locaties"; "Make Default Again" = "Maak weer standaard"; "Make PullMark the Default" = "Maak PullMark de standaard"; "Make the document bigger" = "Maak het document groter"; @@ -261,7 +261,7 @@ "Open" = "Open"; "Open Branch Separately" = "Open branch apart"; "Open File or Folder" = "Open bestand of map"; -"Open Files" = "Open Files"; +"Open Files" = "Geopende bestanden"; "Open File…" = "Open bestand…"; "Open Folder…" = "Open map…"; "Open Fully" = "Volledig openen"; @@ -303,7 +303,7 @@ "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."; +"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 Geopende bestanden, 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"; @@ -328,7 +328,7 @@ "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"; +"Recents" = "Recent"; "Redo" = "Herhaal"; "Refresh" = "Ververs"; "Refresh Folder" = "Ververs map"; @@ -338,7 +338,7 @@ "Reload Document" = "Herlaad document"; "Remember my selection" = "Onthoud mijn keuze"; "Remote Branches" = "Remote branches"; -"Remove from Recents" = "Verwijder uit Recents"; +"Remove from Recents" = "Verwijder uit Recent"; "Remove from Sidebar" = "Verwijder uit zijbalk"; "Remove the PullMark disk image?" = "PullMark-schijfkopie verwijderen?"; "Rendered" = "Gerenderd"; @@ -361,7 +361,7 @@ "Retry Upload" = "Upload opnieuw"; "Return" = "Return"; "Reveal in Finder" = "Toon in Finder"; -"Reveal in Location" = "Toon in Locations"; +"Reveal in Location" = "Toon in Locaties"; "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"; @@ -477,7 +477,7 @@ "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"; +"With files in Open Files" = "Met bestanden onder Geopende bestanden"; "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."; @@ -605,3 +605,80 @@ "Untracked" = "Niet gevolgd"; "git credential helper" = "git credential helper"; "Relaunch Now" = "Nu opnieuw starten"; +"A classic reading measure" = "Een klassieke leesbreedte"; +"Approve" = "Keur goed"; +"Approve merging these changes" = "Keur het mergen van deze wijzigingen goed"; +"Ask for changes before this can merge" = "Vraag wijzigingen voordat dit gemerged kan worden"; +"Bookish serif headers on warm paper" = "Boekachtige koppen met schreef, op warm papier"; +"Inline" = "Inline"; +"Longer lines, more on screen" = "Langere regels, meer op het scherm"; +"Monospace with a phosphor-green accent" = "Monospace met een fosforgroen accent"; +"Request changes" = "Vraag wijzigingen"; +"Side by Side" = "Naast elkaar"; +"Submit general feedback without explicit approval" = "Dien algemene feedback in zonder expliciete goedkeuring"; +"Text uses the whole window" = "Tekst gebruikt het hele venster"; +"The classic look, exactly as on github.com" = "De klassieke look, precies als op github.com"; +"%@/%@ @ %@ — from GitHub" = "%@/%@ @ %@ — van GitHub"; +"%lld Markdown files" = "%lld Markdown-bestanden"; +"%lld changed Markdown files" = "%lld gewijzigde Markdown-bestanden"; +"%lld margin notes" = "%lld margin notes"; +"%lld passed" = "%lld geslaagd"; +"%lld passed, %lld skipped" = "%lld geslaagd, %lld overgeslagen"; +"%lld unresolved review comments" = "%lld onopgeloste reviewcomments"; +"%lld unresolved review comments on files not shown in PullMark" = "%lld onopgeloste reviewcomments op bestanden die PullMark niet toont"; +"1 Markdown file" = "1 Markdown-bestand"; +"1 changed Markdown file" = "1 gewijzigd Markdown-bestand"; +"1 margin note" = "1 margin note"; +"1 unresolved review comment" = "1 onopgeloste reviewcomment"; +"1 unresolved review comment on files not shown in PullMark" = "1 onopgeloste reviewcomment op bestanden die PullMark niet toont"; +"Actual size (1)" = "Werkelijke grootte (1)"; +"Browse %@/%@" = "Blader door %@/%@"; +"Click, then press the new shortcut" = "Klik en druk dan op de nieuwe sneltoets"; +"Compare with a previous revision or branch" = "Vergelijk met een eerdere revisie of branch"; +"Comparing is unavailable here" = "Vergelijken is hier niet beschikbaar"; +"Discard this comment" = "Verwijder deze comment"; +"Discard this comment from the pending review on GitHub" = "Verwijder deze comment uit de pending review op GitHub"; +"Done editing%@" = "Klaar met bewerken%@"; +"Edit this document%@ — then click any block" = "Bewerk dit document%@ — klik daarna op een blok"; +"File not found — last seen at %@" = "Bestand niet gevonden — laatst gezien op %@"; +"Fit (0)" = "Passend (0)"; +"Folder not found — last seen at %@" = "Map niet gevonden — laatst gezien op %@"; +"Heading · %@" = "Kop · %@"; +"Inline Diffs" = "Inline diffs"; +"Inline or side-by-side rendered diff" = "Gerenderde diff inline of naast elkaar"; +"Inline or side-by-side rendered diff — for the Rendered Diff view" = "Gerenderde diff inline of naast elkaar — voor de weergave Gerenderde diff"; +"Leave a note about the whole document, at the top" = "Laat een notitie over het hele document achter, bovenaan"; +"Leave a note on the block you're reading — it's saved into the file as a comment" = "Laat een notitie achter bij het blok dat je leest — die wordt in het bestand bewaard als een -comment"; +"New files always render inline — there is no old side to compare" = "Nieuwe bestanden worden altijd inline gerenderd — er is geen oude kant om mee te vergelijken"; +"New side" = "Nieuwe kant"; +"No Markdown files in this pull request" = "Geen Markdown-bestanden in deze pull request"; +"Old side" = "Oude kant"; +"Open %@" = "Open %@"; +"Open %@/%@ #%lld" = "Open %@/%@ #%lld"; +"Open commit on GitHub" = "Open commit op GitHub"; +"Pull request" = "Pull request"; +"Pull request · %@" = "Pull request · %@"; +"PullMark Release Notes" = "PullMark-releasenotes"; +"Recent" = "Recent"; +"Recording — press the new shortcut" = "Opnemen — druk op de nieuwe sneltoets"; +"Reload this document" = "Herlaad dit document"; +"Review requested · %@/%@#%lld" = "Review gevraagd · %@/%@#%lld"; +"Review these changes — summary, verdict, and your pending comments" = "Review deze wijzigingen — samenvatting, oordeel en je pending comments"; +"Save As…" = "Bewaar als…"; +"Share a link to this document on GitHub" = "Deel een link naar dit document op GitHub"; +"Share a link to this pull request" = "Deel een link naar deze pull request"; +"Share this document" = "Deel dit document"; +"Show the next document%@ — click and hold to see history" = "Toon het volgende document%@ — klik en houd vast voor de geschiedenis"; +"Show the previous document%@ — click and hold to see history" = "Toon het vorige document%@ — klik en houd vast voor de geschiedenis"; +"Side-by-Side Diffs" = "Diffs naast elkaar"; +"The document hasn't finished loading" = "Het document is nog niet klaar met laden"; +"This document was opened at a specific commit — its content can't change" = "Dit document is op een specifieke commit geopend — de inhoud kan niet veranderen"; +"This file has uncommitted changes — compare with a previous revision or branch" = "Dit bestand heeft niet-gecommitte wijzigingen — vergelijk met een eerdere revisie of branch"; +"Turn on margin notes in Settings → Experimental" = "Zet margin notes aan in Instellingen → Experimenteel"; +"What's New in PullMark" = "Wat is er nieuw in PullMark"; +"Zoom in (+)" = "Zoom in (+)"; +"Zoom out (-)" = "Zoom uit (-)"; +"branch, tag, or commit" = "branch, tag of commit"; +"the working file" = "het werkbestand"; +"editing" = "wordt bewerkt"; +"pr-status-open" = "Open"; diff --git a/loc/pt-BR.lproj/Localizable.strings b/loc/pt-BR.lproj/Localizable.strings index c53e5be..099e547 100644 --- a/loc/pt-BR.lproj/Localizable.strings +++ b/loc/pt-BR.lproj/Localizable.strings @@ -70,10 +70,10 @@ "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"; +"Clear Recents" = "Limpar Recentes"; "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:"; +"Clicking files in Locations:" = "Clicar em arquivos em Localizações:"; "Close" = "Fechar"; "Close All" = "Fechar Tudo"; "Close All Files" = "Fechar Todos os Arquivos"; @@ -136,7 +136,7 @@ "Current branch" = "Branch atual"; "Custom themes" = "Temas personalizados"; "Customize Toolbar…" = "Personalizar Barra de Ferramentas…"; -"Dark" = "Dark"; +"Dark" = "Escuro"; "Default diff layout:" = "Layout padrão do diff:"; "Delete" = "Apagar"; "Delete comment" = "Apagar comentário"; @@ -149,8 +149,8 @@ "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"; +"Dotfiles and hidden folders in Locations — like ⇧⌘. in Finder" = "Dotfiles e pastas ocultas em Localizações — como ⇧⌘. no Finder"; +"Dotfiles and hidden folders in Locations — ⇧⌘. toggles this too, like Finder" = "Dotfiles e pastas ocultas em Localizações — ⇧⌘. 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"; @@ -197,7 +197,7 @@ "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."; +"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 Arquivos Abertos 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"; @@ -216,13 +216,13 @@ "Last seen at %@. " = "Visto pela última vez em %@. "; "Layout" = "Layout"; "Left Arrow" = "Seta para a esquerda"; -"Light" = "Light"; +"Light" = "Claro"; "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"; +"Locations" = "Localizações"; "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"; @@ -260,7 +260,7 @@ "Open" = "Abrir"; "Open Branch Separately" = "Abrir a Branch Separadamente"; "Open File or Folder" = "Abrir Arquivo ou Pasta"; -"Open Files" = "Open Files"; +"Open Files" = "Arquivos Abertos"; "Open File…" = "Abrir Arquivo…"; "Open Folder…" = "Abrir Pasta…"; "Open Fully" = "Abrir por Completo"; @@ -302,7 +302,7 @@ "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."; +"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 Arquivos Abertos, 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"; @@ -327,7 +327,7 @@ "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"; +"Recents" = "Recentes"; "Redo" = "Refazer"; "Refresh" = "Atualizar"; "Refresh Folder" = "Atualizar Pasta"; @@ -337,7 +337,7 @@ "Reload Document" = "Recarregar Documento"; "Remember my selection" = "Lembrar minha escolha"; "Remote Branches" = "Branches Remotas"; -"Remove from Recents" = "Remover de Recents"; +"Remove from Recents" = "Remover dos Recentes"; "Remove from Sidebar" = "Remover da Barra Lateral"; "Remove the PullMark disk image?" = "Remover a imagem de disco do PullMark?"; "Rendered" = "Renderizado"; @@ -360,7 +360,7 @@ "Retry Upload" = "Reenviar"; "Return" = "Return"; "Reveal in Finder" = "Mostrar no Finder"; -"Reveal in Location" = "Mostrar no Location"; +"Reveal in Location" = "Mostrar na Localização"; "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"; @@ -445,7 +445,7 @@ "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 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 sua própria Localização 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."; @@ -476,7 +476,7 @@ "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"; +"With files in Open Files" = "Com arquivos em Arquivos Abertos"; "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."; @@ -604,3 +604,80 @@ "Untracked" = "Não rastreado"; "git credential helper" = "auxiliar de credenciais do git"; "Relaunch Now" = "Reiniciar agora"; +"A classic reading measure" = "Uma medida de leitura clássica"; +"Approve" = "Aprovar"; +"Approve merging these changes" = "Aprovar a mesclagem destas alterações"; +"Ask for changes before this can merge" = "Pedir alterações antes que isso possa ser mesclado"; +"Bookish serif headers on warm paper" = "Títulos serifados de livro, sobre papel de tom quente"; +"Inline" = "Em linha"; +"Longer lines, more on screen" = "Linhas mais longas, mais na tela"; +"Monospace with a phosphor-green accent" = "Monoespaçada com um toque de verde fósforo"; +"Request changes" = "Solicitar alterações"; +"Side by Side" = "Lado a lado"; +"Submit general feedback without explicit approval" = "Enviar feedback geral sem aprovação explícita"; +"Text uses the whole window" = "O texto usa a janela inteira"; +"The classic look, exactly as on github.com" = "O visual clássico, exatamente como em github.com"; +"%@/%@ @ %@ — from GitHub" = "%@/%@ @ %@ — do GitHub"; +"%lld Markdown files" = "%lld arquivos Markdown"; +"%lld changed Markdown files" = "%lld arquivos Markdown alterados"; +"%lld margin notes" = "%lld notas de margem"; +"%lld passed" = "%lld bem-sucedidas"; +"%lld passed, %lld skipped" = "%lld bem-sucedidas, %lld puladas"; +"%lld unresolved review comments" = "%lld comentários de revisão não resolvidos"; +"%lld unresolved review comments on files not shown in PullMark" = "%lld comentários de revisão não resolvidos em arquivos que o PullMark não mostra"; +"1 Markdown file" = "1 arquivo Markdown"; +"1 changed Markdown file" = "1 arquivo Markdown alterado"; +"1 margin note" = "1 nota de margem"; +"1 unresolved review comment" = "1 comentário de revisão não resolvido"; +"1 unresolved review comment on files not shown in PullMark" = "1 comentário de revisão não resolvido em arquivos que o PullMark não mostra"; +"Actual size (1)" = "Tamanho real (1)"; +"Browse %@/%@" = "Navegar por %@/%@"; +"Click, then press the new shortcut" = "Clique e então pressione o atalho novo"; +"Compare with a previous revision or branch" = "Comparar com uma revisão anterior ou uma branch"; +"Comparing is unavailable here" = "Comparar não está disponível aqui"; +"Discard this comment" = "Descartar este comentário"; +"Discard this comment from the pending review on GitHub" = "Descartar este comentário da revisão pendente no GitHub"; +"Done editing%@" = "Concluir a edição%@"; +"Edit this document%@ — then click any block" = "Editar este documento%@ — depois clique em qualquer bloco"; +"File not found — last seen at %@" = "Arquivo não encontrado — visto pela última vez em %@"; +"Fit (0)" = "Ajustar (0)"; +"Folder not found — last seen at %@" = "Pasta não encontrada — vista pela última vez em %@"; +"Heading · %@" = "Título · %@"; +"Inline Diffs" = "Diffs em Linha"; +"Inline or side-by-side rendered diff" = "Diff renderizado em linha ou lado a lado"; +"Inline or side-by-side rendered diff — for the Rendered Diff view" = "Diff renderizado em linha ou lado a lado — para a visão Diff Renderizado"; +"Leave a note about the whole document, at the top" = "Deixe uma nota sobre o documento inteiro, no topo"; +"Leave a note on the block you're reading — it's saved into the file as a comment" = "Deixe uma nota no bloco que você está lendo — ela é salva no arquivo como um comentário "; +"New files always render inline — there is no old side to compare" = "Arquivos novos sempre são renderizados em linha — não há lado antigo para comparar"; +"New side" = "Lado novo"; +"No Markdown files in this pull request" = "Nenhum arquivo Markdown neste pull request"; +"Old side" = "Lado antigo"; +"Open %@" = "Abrir %@"; +"Open %@/%@ #%lld" = "Abrir %@/%@ #%lld"; +"Open commit on GitHub" = "Abrir o commit no GitHub"; +"Pull request" = "Pull request"; +"Pull request · %@" = "Pull request · %@"; +"PullMark Release Notes" = "Notas de Versão do PullMark"; +"Recent" = "Recente"; +"Recording — press the new shortcut" = "Gravando — pressione o atalho novo"; +"Reload this document" = "Recarregar este documento"; +"Review requested · %@/%@#%lld" = "Revisão solicitada · %@/%@#%lld"; +"Review these changes — summary, verdict, and your pending comments" = "Revisar estas alterações — resumo, veredito e seus comentários pendentes"; +"Save As…" = "Salvar Como…"; +"Share a link to this document on GitHub" = "Compartilhar um link para este documento no GitHub"; +"Share a link to this pull request" = "Compartilhar um link para este pull request"; +"Share this document" = "Compartilhar este documento"; +"Show the next document%@ — click and hold to see history" = "Mostrar o próximo documento%@ — clique e segure para ver o histórico"; +"Show the previous document%@ — click and hold to see history" = "Mostrar o documento anterior%@ — clique e segure para ver o histórico"; +"Side-by-Side Diffs" = "Diffs Lado a Lado"; +"The document hasn't finished loading" = "O documento ainda não terminou de carregar"; +"This document was opened at a specific commit — its content can't change" = "Este documento foi aberto num commit específico — seu conteúdo não pode mudar"; +"This file has uncommitted changes — compare with a previous revision or branch" = "Este arquivo tem alterações não commitadas — compare com uma revisão anterior ou uma branch"; +"Turn on margin notes in Settings → Experimental" = "Ative as notas de margem em Ajustes → Experimental"; +"What's New in PullMark" = "Novidades do PullMark"; +"Zoom in (+)" = "Mais zoom (+)"; +"Zoom out (-)" = "Menos zoom (-)"; +"branch, tag, or commit" = "branch, tag ou commit"; +"the working file" = "o arquivo de trabalho"; +"editing" = "editando"; +"pr-status-open" = "Aberto"; diff --git a/loc/zh-Hans.lproj/Localizable.strings b/loc/zh-Hans.lproj/Localizable.strings index fdcee43..b3f4fa5 100644 --- a/loc/zh-Hans.lproj/Localizable.strings +++ b/loc/zh-Hans.lproj/Localizable.strings @@ -74,7 +74,7 @@ "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 中的文件:"; +"Clicking files in Locations:" = "点击“位置”中的文件:"; "Close" = "关闭"; "Close All" = "全部关闭"; "Close All Files" = "关闭所有文件"; @@ -150,8 +150,8 @@ "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 中的点文件和隐藏文件夹——⇧⌘. 同样可以切换,和访达一样"; +"Dotfiles and hidden folders in Locations — like ⇧⌘. in Finder" = "“位置”中的点文件和隐藏文件夹——与访达里的 ⇧⌘. 相同"; +"Dotfiles and hidden folders in Locations — ⇧⌘. toggles this too, like Finder" = "“位置”中的点文件和隐藏文件夹——⇧⌘. 同样可以切换,和访达一样"; "Down Arrow" = "下箭头"; "Download" = "下载"; "Downloads the update, verifies its signature, and installs it in place" = "下载更新、校验签名,并就地安装"; @@ -198,7 +198,7 @@ "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 中的行会显示一枚计数标签;想清净阅读时,用“显示”菜单里的 隐藏页边批注 清屏。"; +"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。在每个气泡上编辑和删除;删除一条批注就是解决它。文档还带着批注时,“打开的文件”中的行会显示一枚计数标签;想清净阅读时,用“显示”菜单里的 隐藏页边批注 清屏。"; "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" = "在本地文档中"; @@ -223,7 +223,7 @@ "Line %lld (old)" = "第 %lld 行(旧)"; "Line numbers" = "行号"; "Loading repo files…" = "正在载入仓库文件…"; -"Locations" = "Locations"; +"Locations" = "位置"; "Make Default Again" = "重新设为默认"; "Make PullMark the Default" = "把 PullMark 设为默认"; "Make the document bigger" = "放大文档"; @@ -261,7 +261,7 @@ "Open" = "打开"; "Open Branch Separately" = "单独打开分支"; "Open File or Folder" = "打开文件或文件夹"; -"Open Files" = "Open Files"; +"Open Files" = "打开的文件"; "Open File…" = "打开文件…"; "Open Folder…" = "打开文件夹…"; "Open Fully" = "完整打开"; @@ -303,7 +303,7 @@ "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 仓库下),下一次预览会把它替换掉。双击文件,或者直接开始编辑,就能把它保持打开。“完整打开”则会保留你点击的每一个文件。"; +"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." = "“先预览”让单击即可查看文件而不保留它——只有一条斜体条目(在“打开的文件”中,或在它所属的 GitHub 仓库下),下一次预览会把它替换掉。双击文件,或者直接开始编辑,就能把它保持打开。“完整打开”则会保留你点击的每一个文件。"; "Previous File" = "上一个文件"; "Previous Markdown file in this pull request" = "此拉取请求中的上一个 Markdown 文件"; "Previous match" = "上一个匹配项"; @@ -361,7 +361,7 @@ "Retry Upload" = "重试上传"; "Return" = "Return"; "Reveal in Finder" = "在访达中显示"; -"Reveal in Location" = "在 Locations 中显示"; +"Reveal in Location" = "在“位置”中显示"; "Reveal on GitHub" = "在 GitHub 上显示"; "Reveal resolved review conversations in the Result view" = "在“结果”视图中显示已解决的审查会话"; "Revert Last Edit" = "还原上次编辑"; @@ -446,7 +446,7 @@ "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 folder has more Markdown files than PullMark scans — open a subfolder as its own Location to see the rest" = "这个文件夹的 Markdown 文件多于 PullMark 扫描的上限——把子文件夹作为独立的“位置”打开即可看到其余部分"; "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." = "此版本(%@)不认识 %@——它可能指向某个更新版本中的功能,或指向已经挪走的功能。检查更新通常就能解决。"; @@ -477,7 +477,7 @@ "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 中有文件时"; +"With files in 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." = "你自定的快捷键将被移除。此操作无法撤销。"; @@ -605,3 +605,80 @@ "Untracked" = "未跟踪"; "git credential helper" = "git 凭证助手"; "Relaunch Now" = "立即重新启动"; +"A classic reading measure" = "经典的阅读行长"; +"Approve" = "批准"; +"Approve merging these changes" = "批准合并这些更改"; +"Ask for changes before this can merge" = "在能够合并之前先要求做出更改"; +"Bookish serif headers on warm paper" = "书本般的衬线标题,落在暖色纸面上"; +"Inline" = "内联"; +"Longer lines, more on screen" = "行更长,屏幕上容纳更多"; +"Monospace with a phosphor-green accent" = "等宽字体,点缀一抹荧光绿"; +"Request changes" = "请求更改"; +"Side by Side" = "并排"; +"Submit general feedback without explicit approval" = "提交总体反馈,但不做明确批准"; +"Text uses the whole window" = "文字用满整个窗口"; +"The classic look, exactly as on github.com" = "经典外观,与 github.com 上一模一样"; +"%@/%@ @ %@ — from GitHub" = "%@/%@ @ %@ —— 来自 GitHub"; +"%lld Markdown files" = "%lld 个 Markdown 文件"; +"%lld changed Markdown files" = "%lld 个已更改的 Markdown 文件"; +"%lld margin notes" = "%lld 条页边批注"; +"%lld passed" = "%lld 项通过"; +"%lld passed, %lld skipped" = "%lld 项通过,%lld 项跳过"; +"%lld unresolved review comments" = "%lld 条未解决的审查评论"; +"%lld unresolved review comments on files not shown in PullMark" = "%lld 条未解决的审查评论位于 PullMark 未显示的文件上"; +"1 Markdown file" = "1 个 Markdown 文件"; +"1 changed Markdown file" = "1 个已更改的 Markdown 文件"; +"1 margin note" = "1 条页边批注"; +"1 unresolved review comment" = "1 条未解决的审查评论"; +"1 unresolved review comment on files not shown in PullMark" = "1 条未解决的审查评论位于 PullMark 未显示的文件上"; +"Actual size (1)" = "实际大小(1)"; +"Browse %@/%@" = "浏览 %@/%@"; +"Click, then press the new shortcut" = "点击,然后按下新的快捷键"; +"Compare with a previous revision or branch" = "与更早的修订版本或分支比较"; +"Comparing is unavailable here" = "此处无法比较"; +"Discard this comment" = "丢弃这条评论"; +"Discard this comment from the pending review on GitHub" = "从 GitHub 上的待提交审查中丢弃这条评论"; +"Done editing%@" = "结束编辑%@"; +"Edit this document%@ — then click any block" = "编辑这篇文档%@——然后点击任意区块"; +"File not found — last seen at %@" = "找不到文件——上次出现于 %@"; +"Fit (0)" = "适合窗口(0)"; +"Folder not found — last seen at %@" = "找不到文件夹——上次出现于 %@"; +"Heading · %@" = "标题 · %@"; +"Inline Diffs" = "内联差异"; +"Inline or side-by-side rendered diff" = "渲染差异的内联或并排布局"; +"Inline or side-by-side rendered diff — for the Rendered Diff view" = "渲染差异的内联或并排布局——用于“渲染差异”视图"; +"Leave a note about the whole document, at the top" = "在最上方为整篇文档留下一条批注"; +"Leave a note on the block you're reading — it's saved into the file as a comment" = "在你正在阅读的区块上留下一条批注——它会以 注释的形式存进文件"; +"New files always render inline — there is no old side to compare" = "新文件始终以内联方式渲染——没有可供比较的旧的一侧"; +"New side" = "新的一侧"; +"No Markdown files in this pull request" = "此拉取请求中没有 Markdown 文件"; +"Old side" = "旧的一侧"; +"Open %@" = "打开 %@"; +"Open %@/%@ #%lld" = "打开 %@/%@ #%lld"; +"Open commit on GitHub" = "在 GitHub 上打开该提交"; +"Pull request" = "拉取请求"; +"Pull request · %@" = "拉取请求 · %@"; +"PullMark Release Notes" = "PullMark 发行说明"; +"Recent" = "最近使用"; +"Recording — press the new shortcut" = "正在录制——请按下新的快捷键"; +"Reload this document" = "重新载入这篇文档"; +"Review requested · %@/%@#%lld" = "请求审查 · %@/%@#%lld"; +"Review these changes — summary, verdict, and your pending comments" = "审查这些更改——总结、结论,以及你待提交的评论"; +"Save As…" = "存储为…"; +"Share a link to this document on GitHub" = "共享指向 GitHub 上这篇文档的链接"; +"Share a link to this pull request" = "共享指向此拉取请求的链接"; +"Share this document" = "共享这篇文档"; +"Show the next document%@ — click and hold to see history" = "显示下一篇文档%@——点住不放可查看历史"; +"Show the previous document%@ — click and hold to see history" = "显示上一篇文档%@——点住不放可查看历史"; +"Side-by-Side Diffs" = "并排差异"; +"The document hasn't finished loading" = "文档尚未载入完成"; +"This document was opened at a specific commit — its content can't change" = "这篇文档是在某个特定提交上打开的——它的内容不会改变"; +"This file has uncommitted changes — compare with a previous revision or branch" = "此文件有未提交的更改——可与更早的修订版本或分支比较"; +"Turn on margin notes in Settings → Experimental" = "在“设置 → 实验性功能”中开启页边批注"; +"What's New in PullMark" = "PullMark 新增功能"; +"Zoom in (+)" = "放大(+)"; +"Zoom out (-)" = "缩小(-)"; +"branch, tag, or commit" = "分支、标签或提交"; +"the working file" = "工作区文件"; +"editing" = "编辑中"; +"pr-status-open" = "开启"; diff --git a/scripts/check-site-i18n.py b/scripts/check-site-i18n.py index c713d3a..c0ec2db 100755 --- a/scripts/check-site-i18n.py +++ b/scripts/check-site-i18n.py @@ -11,6 +11,9 @@ and the i18n.css/i18n.js includes * locale pages reference shared assets absolutely (no ../ or bare relative src/href that would resolve inside the locale dir) + * app screenshots are served in the page's own language: localized + pages from /img//, English from /img/ — and every referenced + image file exists on disk (a bad path silently 404s to alt text) * sitemap.xml covers exactly the shipped URL set Exit code 0 = clean; 1 = problems (each printed on its own line). @@ -100,6 +103,18 @@ def check_page(code, base): problem(f"{rel}: switcher aria-current is " f"{cur.group(1) if cur else 'missing'}, want {want_lang}") + # Image references (src, srcset, meta content, JSON-LD — anywhere in + # the document; the charset stops before ?v= cache-busters). Every + # file must exist, and app screenshots (app-*.png, the generator's + # output) must come from the page's own language directory. + img_dir = "/img/" if code == "en" else f"/img/{LOCALES[code]}/" + for ref in set(re.findall(r'(?:https://pullmark\.app)?(/img/[A-Za-z0-9._/\-]+)', s)): + if not (ROOT / ref.lstrip("/")).exists(): + problem(f"{rel}: referenced image missing on disk: {ref}") + name = ref.rsplit("/", 1)[-1] + if name.startswith("app-") and ref != f"{img_dir}{name}": + problem(f"{rel}: app screenshot {ref} must be {img_dir}{name}") + if code != "en": # Locale pages must not fetch assets relative to the locale dir. for attr, value in re.findall(r'(src|href)="([^"]+)"', s): @@ -136,7 +151,8 @@ def main(): print(f"\n{len(problems)} problem(s).") return 1 total = len(BASES) * (len(LOCALES) + 1) - print(f"site i18n OK: {total} pages verified, sitemap consistent.") + print(f"site i18n OK: {total} pages verified (incl. per-language " + f"screenshot refs), sitemap consistent.") return 0 diff --git a/scripts/check-strings.py b/scripts/check-strings.py index 518161b..87a6527 100755 --- a/scripts/check-strings.py +++ b/scripts/check-strings.py @@ -96,7 +96,7 @@ def scan_swift_literal(s, start): # 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|overflow|minutes|hours|days|line|number|original|index|passed|skipped" 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)" diff --git a/scripts/drive/README.md b/scripts/drive/README.md index bbe2e26..6b7747a 100644 --- a/scripts/drive/README.md +++ b/scripts/drive/README.md @@ -13,12 +13,16 @@ step. focus. Use it for menus, buttons, checkboxes, links: anything with a name and an AXPress action. This is the default for everything it can express. -2. **Pid-targeted raw events (`pclick.swift`, `pkey.swift`)** — CGEvents +2. **Pid-targeted raw events (`pkey.swift`, `ptype.swift`)** — CGEvents delivered straight to a pid with `CGEvent.postToPid`. The visible - cursor never moves, but see the residue below: a fully inactive app - discards them, so they only help when the target app is already - active and you need a raw event AX can't express (exact-coordinate - clicks, key events with modifiers). + cursor never moves. A fully inactive app normally DISCARDS key + events (no key window to route to); PullMark's `-pm.captureChrome` + flag nominates one, which is how the screenshot generator types + into backgrounded instances. Pid-posted MOUSE events go nowhere + useful in this app — SwiftUI rows and WKWebView content both drop + them (a `pclick.swift` existed briefly and was removed for lying + about that) — use `ax.swift select-row` or the app's + `pullmark://capture/…` channel instead. 3. **Global HID events (`click.swift`, `key.swift`, `drag.swift`, `hover.swift`, `gscroll.swift`) — last resort.** They move the real cursor and land on whatever is frontmost, locking the human out @@ -48,16 +52,52 @@ step. windows for a pressable element whose AXTitle/AXDescription matches (exact match preferred, substring accepted) and AXPress it. Reaches SwiftUI toolbar buttons and web-content links/checkboxes alike. -- Both check `AXIsProcessTrusted()` and fail with a one-line error if +- `ax.swift menuitem ` — like `menu`, but finds the item + anywhere in the menu bar (Apple menu excluded). For localized runs: + top-level menu names are system-localized, item titles resolve from + `loc/` — so the caller passes just the item. +- `ax.swift <pid> menukey <char> <modifiers>` — AXPress the menu item + carrying that keyboard equivalent (`menukey , cmd` = Settings…, + `menukey q cmd` = Quit). Language-independent; the way to hit + system-titled items no `.strings` file covers. +- `ax.swift <pid> sidebar-state` — prints `visible` or `hidden`: is + there a native list outside the web area? Lets scenes toggle the + sidebar deterministically instead of blind-pressing. +- `ax.swift <pid> menulist` — every menu item with its keyboard + equivalent as `[modifier-mask+char]`; discovery for `menukey`. +- `ax.swift <pid> select-row [<nth>] <text>` — select a sidebar row by + its text via AX selection on the backing outline. SwiftUI rows + discard posted clicks and carry no AXPress; this is the background- + tier replacement for clicking them. Exact matches rank before + substring matches; `<nth>` picks among duplicates. +- `ax.swift <pid> disclose <text>` — expand the matching row + (AXDisclosing). +- `ax.swift <pid> rows` — dump every sidebar row's text; discovery for + select-row. +- `ax.swift <pid> id <identifier>` — press by AXIdentifier, for system + chrome with stable ids (the Open panel's OKButton) whose titles are + localized. +- All check `AXIsProcessTrusted()` and fail with a one-line error if the Accessibility permission is missing. +## Pid-addressed AppleEvents (no Launch Services) + +- `aeopen.swift <pid> <path>` — deliver an open-document ('odoc') + event straight to the pid. `open -a` resolves through Launch + Services by bundle id and, with /Applications and dist both alive, + has spawned a THIRD instance for the document instead of delivering; + pid addressing can't miss. +- `aeurl.swift <pid> <url>` — same for GetURL ('GURL'): pullmark:// + links, including the screenshot generator's `pullmark://capture/…` + drive channel (routed only under `-pm.captureChrome`). + ## Pid-targeted raw events -- `pclick.swift <pid> <x> <y>` — mouse down/up posted to the pid. The - location is still a global screen point (the app resolves which of - its windows is hit) but the visible cursor does not move. -- `pkey.swift <pid> <keycode> [cmd]` — key press posted to the pid, - flags cleared unless `cmd` is given. +- `pkey.swift <pid> <keycode> [cmd] [shift] [opt] [ctrl]` — key press + posted to the pid; modifier args combine (`5 cmd shift` = ⇧⌘G). +- `ptype.swift <pid> <text>` — type text as unicode key events. Never + touches the shared clipboard, so parallel instances (and the + human's copy buffer) stay unmolested. ## Global HID events (real cursor) diff --git a/scripts/drive/aeopen.swift b/scripts/drive/aeopen.swift new file mode 100644 index 0000000..a23714f --- /dev/null +++ b/scripts/drive/aeopen.swift @@ -0,0 +1,37 @@ +import AppKit +import Foundation + +// Usage: swift aeopen.swift <pid> <path> — deliver an open-document +// ('odoc') AppleEvent to the process with that pid. +// +// This exists because every other delivery route resolves the TARGET +// through Launch Services by bundle id, and with two copies of the +// app alive (/Applications + dist) LS sometimes launches a THIRD +// instance for the document instead of handing it to the one under +// test. Addressing the event by pid skips LS entirely, works with +// the app backgrounded, and is safe to run against many instances +// in parallel. +guard CommandLine.arguments.count == 3, + let pid = pid_t(CommandLine.arguments[1]) +else { + FileHandle.standardError.write(Data("usage: swift aeopen.swift <pid> <path>\n".utf8)) + exit(1) +} +let url = URL(fileURLWithPath: CommandLine.arguments[2]) +let target = NSAppleEventDescriptor(processIdentifier: pid) +let event = NSAppleEventDescriptor( + eventClass: AEEventClass(kCoreEventClass), + eventID: AEEventID(kAEOpenDocuments), + targetDescriptor: target, + returnID: AEReturnID(kAutoGenerateReturnID), + transactionID: AETransactionID(kAnyTransactionID)) +let list = NSAppleEventDescriptor.list() +list.insert(NSAppleEventDescriptor(fileURL: url), at: 1) +event.setParam(list, forKeyword: keyDirectObject) +do { + try event.sendEvent(options: [.noReply], timeout: 10) + print("sent odoc \(url.path) → pid \(pid)") +} catch { + FileHandle.standardError.write(Data("error: sendEvent failed: \(error)\n".utf8)) + exit(1) +} diff --git a/scripts/drive/aeurl.swift b/scripts/drive/aeurl.swift new file mode 100644 index 0000000..a26b3f0 --- /dev/null +++ b/scripts/drive/aeurl.swift @@ -0,0 +1,30 @@ +import AppKit +import Foundation + +// Usage: swift aeurl.swift <pid> <url> — deliver a GetURL ('GURL') +// AppleEvent to the process with that pid. The pid-addressed sibling of +// aeopen.swift for pullmark:// links: `open <url>` resolves the handler +// through Launch Services by bundle id, which can hit the INSTALLED +// copy instead of the capture instance. Addressing by pid can't. +guard CommandLine.arguments.count == 3, + let pid = pid_t(CommandLine.arguments[1]) +else { + FileHandle.standardError.write(Data("usage: swift aeurl.swift <pid> <url>\n".utf8)) + exit(1) +} +let urlString = CommandLine.arguments[2] +let target = NSAppleEventDescriptor(processIdentifier: pid) +let event = NSAppleEventDescriptor( + eventClass: AEEventClass(kInternetEventClass), + eventID: AEEventID(kAEGetURL), + targetDescriptor: target, + returnID: AEReturnID(kAutoGenerateReturnID), + transactionID: AETransactionID(kAnyTransactionID)) +event.setParam(NSAppleEventDescriptor(string: urlString), forKeyword: keyDirectObject) +do { + try event.sendEvent(options: [.noReply], timeout: 10) + print("sent GURL \(urlString) → pid \(pid)") +} catch { + FileHandle.standardError.write(Data("error: sendEvent failed: \(error)\n".utf8)) + exit(1) +} diff --git a/scripts/drive/ax.swift b/scripts/drive/ax.swift index ff2ebba..bf02690 100644 --- a/scripts/drive/ax.swift +++ b/scripts/drive/ax.swift @@ -6,8 +6,20 @@ import Foundation // // Usage: // swift ax.swift <pid> menu <Menu> <Item> [<Subitem>] AXPress a menu item +// swift ax.swift <pid> menuitem <title> AXPress a menu item found anywhere in the menu bar +// swift ax.swift <pid> menukey <char> <modifiers> AXPress a menu item by keyboard equivalent // swift ax.swift <pid> press <title> AXPress a control by title +// swift ax.swift <pid> sidebar-state print "visible" or "hidden" // swift ax.swift <pid> list [<depth>] dump actionable elements +// +// menuitem and menukey exist for localized runs (the screenshot +// generator's --lang matrix): menu/press match visible titles, which +// change with AppleLanguages. menuitem still takes a title — the +// caller resolves it from loc/<lang>.lproj — but doesn't need the +// menu-bar path, whose top-level names are system-localized. menukey +// is for SYSTEM items we can't resolve from loc/ (sidebar toggle, +// Settings, Quit): keyboard equivalents are language-independent. +// Modifiers: comma-separated shift/opt/ctrl/cmd, e.g. "ctrl,cmd". func fail(_ message: String) -> Never { FileHandle.standardError.write(Data((message + "\n").utf8)) @@ -20,7 +32,7 @@ guard AXIsProcessTrusted() else { let args = CommandLine.arguments guard args.count >= 3, let pid = pid_t(args[1]) else { - fail("usage: swift ax.swift <pid> menu <Menu> <Item> [<Subitem>] | press <title> | list [<depth>]") + fail("usage: swift ax.swift <pid> menu <Menu> <Item> [<Subitem>] | menuitem <title> | menukey <char> <modifiers> | press <title> | sidebar-state | list [<depth>]") } let app = AXUIElementCreateApplication(pid) @@ -72,6 +84,38 @@ func label(_ element: AXUIElement) -> String { return t.isEmpty ? description(element) : t } +func identifier(_ element: AXUIElement) -> String { + (attribute(element, kAXIdentifierAttribute) as? String) ?? "" +} + +/// Every pressable menu item in the menu bar, skipping the Apple menu +/// (system items there are never scene targets, and substring matches +/// against it would be hazardous). Breadth-first through submenus. +func menuBarItems() -> [AXUIElement] { + guard let menuBar = attribute(app, kAXMenuBarAttribute), + CFGetTypeID(menuBar) == AXUIElementGetTypeID() else { + fail("error: no menu bar for pid \(pid) (app still launching, or not a regular app)") + } + var queue = Array(children(menuBar as! AXUIElement).dropFirst()) // drop Apple menu + var items: [AXUIElement] = [] + var visited = 0 + while !queue.isEmpty, visited < 5_000 { + let element = queue.removeFirst() + visited += 1 + if role(element) == "AXMenuItem", !title(element).isEmpty { + items.append(element) + } + queue.append(contentsOf: children(element)) + } + return items +} + +func pressMenuItem(_ item: AXUIElement, described: String) { + let pressedTitle = title(item) // capture before pressing (see `press`) + press(item) + print("pressed menu item: \"\(pressedTitle)\" (\(described))") +} + // MARK: - commands switch args[2] { @@ -103,12 +147,270 @@ case "menu": } } -case "press": +case "menuitem": let name = args.dropFirst(3).joined(separator: " ") - guard !name.isEmpty else { fail("usage: swift ax.swift <pid> press <title>") } + guard !name.isEmpty else { fail("usage: swift ax.swift <pid> menuitem <title>") } + let items = menuBarItems() + let match = items.first { title($0).caseInsensitiveCompare(name) == .orderedSame } + ?? items.first { title($0).range(of: name, options: .caseInsensitive) != nil } + guard let match else { + fail("error: no menu item titled '\(name)' anywhere in the menu bar (\(items.count) items searched)") + } + pressMenuItem(match, described: "matched '\(name)'") + +case "menukey": + guard args.count >= 5 else { fail("usage: swift ax.swift <pid> menukey <char> <modifiers>") } + let char = args[3] + var mask = 0 + for part in args[4].split(separator: ",") { + switch part { + case "shift": mask |= 1 + case "opt", "option": mask |= 2 + case "ctrl", "control": mask |= 4 + case "cmd", "command": break // command is the AX baseline (mask 0) + default: fail("error: unknown modifier '\(part)' (expected shift, opt, ctrl, cmd)") + } + } + let match = menuBarItems().first { + guard let cmdChar = attribute($0, "AXMenuItemCmdChar") as? String, + cmdChar.caseInsensitiveCompare(char) == .orderedSame else { return false } + let modifiers = (attribute($0, "AXMenuItemCmdModifiers") as? Int) ?? 0 + return modifiers == mask + } + guard let match else { + fail("error: no menu item with keyboard equivalent \(args[4])+\(char)") + } + pressMenuItem(match, described: "\(args[4])+\(char)") + +case "id": + // Press by AXIdentifier — language-independent, for system chrome + // with stable ids (the Open panel's OKButton/CancelButton; plain + // Return never reaches the panel's bridged content, and its + // window exposes no AXDefaultButton). + let wanted = args.count > 3 ? args[3] : "" + guard !wanted.isEmpty else { fail("usage: swift ax.swift <pid> id <identifier>") } + guard let windows = attribute(app, kAXWindowsAttribute) as? [AXUIElement] else { + fail("error: no windows for pid \(pid)") + } + var queue = windows + var visited = 0 + var found: AXUIElement? + while !queue.isEmpty, visited < 20_000, found == nil { + let element = queue.removeFirst() + visited += 1 + if identifier(element) == wanted, actions(element).contains(kAXPressAction) { + found = element + } + queue.append(contentsOf: children(element)) + } + guard let found else { + fail("error: no pressable element with identifier '\(wanted)' (searched \(visited))") + } + let foundTitle = title(found) + press(found) + print("pressed: id=\(wanted) \"\(foundTitle)\"") + +case "select-row", "disclose", "rows": + // Sidebar rows: SwiftUI lists discard pid-posted clicks and the + // rows carry no AXPress, but the backing outline honors AX + // selection — the background-tier replacement for global clicks. + // select-row sets the outline's selection to the matching row; + // disclose expands it (AXDisclosing). Rows are matched by their + // descendant text (file/folder names — data, language-independent). + // Optional ordinal for duplicate row texts (`select-row 2 <text>` = + // second match in row order): Open Files and a PR can both list a + // getting-started.md. + var rest = Array(args.dropFirst(3)) + var wantedIndex = 1 + if let first = rest.first, let n = Int(first), n >= 1 { + wantedIndex = n + rest.removeFirst() + } + let name = rest.joined(separator: " ") + guard args[2] == "rows" || !name.isEmpty else { + fail("usage: swift ax.swift <pid> \(args[2]) [<nth>] <row text>") + } guard let windows = attribute(app, kAXWindowsAttribute) as? [AXUIElement] else { fail("error: no windows for pid \(pid)") } + + func rowText(_ row: AXUIElement) -> String { + var texts: [String] = [] + var queue = [row] + var visited = 0 + while !queue.isEmpty, visited < 200 { + let element = queue.removeFirst() + visited += 1 + // Labels hide in different places per row kind: static-text + // values on file rows, heading values on section/repo rows, + // titles/descriptions elsewhere. Take everything non-empty. + if let value = attribute(element, kAXValueAttribute) as? String, !value.isEmpty { + texts.append(value) + } + for candidate in [title(element), description(element)] where !candidate.isEmpty { + texts.append(candidate) + } + queue.append(contentsOf: children(element)) + } + return texts.joined(separator: " ") + } + + var tables: [AXUIElement] = [] + var queue = windows + var visited = 0 + while !queue.isEmpty, visited < 20_000 { + let element = queue.removeFirst() + visited += 1 + let elementRole = role(element) + if elementRole == "AXWebArea" { continue } // content tables aren't the sidebar + if elementRole == "AXOutline" || elementRole == "AXTable" { tables.append(element) } + queue.append(contentsOf: children(element)) + } + if args[2] == "rows" { // discovery: dump every row's text and child roles + for (t, table) in tables.enumerated() { + let rows = (attribute(table, "AXRows") as? [AXUIElement]) ?? [] + print("table \(t): \(rows.count) rows") + for row in rows { + let kids = children(row).map { "\(role($0))\(title($0).isEmpty ? "" : "(\(title($0)))")" } + print(" [\(rowText(row))] kids: \(kids.joined(separator: " "))") + } + } + exit(0) + } + var exactMatches: [(AXUIElement, AXUIElement)] = [] + var looseMatches: [(AXUIElement, AXUIElement)] = [] + for table in tables { + guard let rows = attribute(table, "AXRows") as? [AXUIElement] else { continue } + for row in rows { + let text = rowText(row) + if text.caseInsensitiveCompare(name) == .orderedSame { exactMatches.append((table, row)) } + else if text.range(of: name, options: .caseInsensitive) != nil { + looseMatches.append((table, row)) + } + } + } + // Exact matches first, then substring matches, both in row order — + // `select-row 2 calibration.md` can name a row whose text carries a + // localized suffix (comment counts) past a bare exact match. + let matches = exactMatches + looseMatches + guard matches.count >= wantedIndex else { + fail("error: no sidebar row matching '\(name)'" + + (wantedIndex > 1 ? " (wanted match #\(wantedIndex), found \(matches.count))" : "") + + " (\(tables.count) tables searched)") + } + let (table, row) = matches[wantedIndex - 1] + let matchedText = rowText(row) + if args[2] == "disclose" { + let error = AXUIElementSetAttributeValue(row, "AXDisclosing" as CFString, kCFBooleanTrue) + guard error == .success else { fail("error: AXDisclosing set failed (AXError \(error.rawValue))") } + print("disclosed: \"\(matchedText)\"") + } else { + let error = AXUIElementSetAttributeValue(table, "AXSelectedRows" as CFString, [row] as CFArray) + guard error == .success else { fail("error: AXSelectedRows set failed (AXError \(error.rawValue))") } + print("selected: \"\(matchedText)\"") + } + +case "setcheck": + // Ensure a titled checkbox is in the wanted state, pressing only on + // mismatch. Blind presses TOGGLE — and sticky flags live in a + // defaults domain shared across capture instances and runs, so half + // the parallel fleet was flipping blame OFF for the other half. + guard args.count >= 5, let wanted = Int(args[3]), wanted == 0 || wanted == 1 else { + fail("usage: swift ax.swift <pid> setcheck <0|1> <title>") + } + let checkTitle = args.dropFirst(4).joined(separator: " ") + guard let windows = attribute(app, kAXWindowsAttribute) as? [AXUIElement] else { + fail("error: no windows for pid \(pid)") + } + var queue = windows + var visited = 0 + var found: AXUIElement? + while !queue.isEmpty, visited < 20_000, found == nil { + let element = queue.removeFirst() + visited += 1 + if actions(element).contains(kAXPressAction), + attribute(element, kAXValueAttribute) != nil { + for candidate in [title(element), description(element)] where !candidate.isEmpty { + if candidate.caseInsensitiveCompare(checkTitle) == .orderedSame { found = element } + } + } + queue.append(contentsOf: children(element)) + } + guard let found else { + fail("error: no checkable element titled '\(checkTitle)' (searched \(visited))") + } + let current = (attribute(found, kAXValueAttribute) as? Int) ?? 0 + if current == wanted { + print("already \(wanted): \"\(checkTitle)\"") + } else { + press(found) + print("pressed to \(wanted): \"\(checkTitle)\"") + } + +case "titles": + // Every window's AXTitle, one per line — scene scripts confirm tab + // switches by title (the Settings window is titled after its + // current tab). + guard let windows = attribute(app, kAXWindowsAttribute) as? [AXUIElement] else { + fail("error: no windows for pid \(pid)") + } + for window in windows { print(title(window)) } + +case "menulist": + for item in menuBarItems() { + let cmdChar = (attribute(item, "AXMenuItemCmdChar") as? String) ?? "" + let modifiers = (attribute(item, "AXMenuItemCmdModifiers") as? Int) ?? 0 + let key = cmdChar.isEmpty ? "" : " [\(modifiers)+\(cmdChar)]" + print("\"\(title(item))\"\(key)") + } + +case "sidebar-state": + // The sidebar is the only native list in the main window — content + // is an AXWebArea, whose descendants (which can contain tables of + // their own) are skipped. Scenes run this before Settings opens, + // so every window is fair game. + guard let windows = attribute(app, kAXWindowsAttribute) as? [AXUIElement] else { + fail("error: no windows for pid \(pid)") + } + var queue = windows + var visited = 0 + var found = false + while !queue.isEmpty, visited < 20_000, !found { + let element = queue.removeFirst() + visited += 1 + let elementRole = role(element) + if elementRole == "AXWebArea" { continue } + if ["AXOutline", "AXList", "AXTable"].contains(elementRole) { found = true } + queue.append(contentsOf: children(element)) + } + print(found ? "visible" : "hidden") + +case "press", "presswin": + // presswin <skipWidth> <title>: like press, but ignores windows of + // exactly that width — scene scripts use it to target the Settings + // window while the 1052-wide capture window holds a same-titled + // control (the Appearance toolbar menu once stole the Settings + // tab's press when the Settings window was slow to appear). + var rest = Array(args.dropFirst(3)) + var skipWidth: Double? + if args[2] == "presswin" { + guard let first = rest.first, let width = Double(first) else { + fail("usage: swift ax.swift <pid> presswin <skipWidth> <title>") + } + skipWidth = width + rest.removeFirst() + } + let name = rest.joined(separator: " ") + guard !name.isEmpty else { fail("usage: swift ax.swift <pid> \(args[2]) <title>") } + guard var windows = attribute(app, kAXWindowsAttribute) as? [AXUIElement] else { + fail("error: no windows for pid \(pid)") + } + if let skipWidth { + windows = windows.filter { abs(frame($0).width - skipWidth) > 0.5 } + guard !windows.isEmpty else { + fail("error: no window besides the \(Int(skipWidth))-wide one (Settings not open yet?)") + } + } // Breadth-first over every window; collect pressable elements, then prefer // an exact (case-insensitive) label match over a substring match. var queue = windows @@ -151,7 +453,8 @@ case "list": if actions(element).contains(kAXPressAction) { let box = frame(element) let bounds = box.isNull ? "?" : "\(Int(box.origin.x)) \(Int(box.origin.y)) \(Int(box.width)) \(Int(box.height))" - print("\(role(element)) \"\(label(element))\" \(bounds)") + let id = identifier(element) + print("\(role(element)) \"\(label(element))\" \(bounds)\(id.isEmpty ? "" : " id=\(id)")") } if depth < maxDepth { queue.append(contentsOf: children(element).map { ($0, depth + 1) }) @@ -159,5 +462,5 @@ case "list": } default: - fail("error: unknown command '\(args[2])' (expected menu, press, or list)") + fail("error: unknown command '\(args[2])' (expected menu, menuitem, menukey, press, sidebar-state, or list)") } diff --git a/scripts/drive/blankcheck.swift b/scripts/drive/blankcheck.swift new file mode 100644 index 0000000..5c28aef --- /dev/null +++ b/scripts/drive/blankcheck.swift @@ -0,0 +1,48 @@ +import AppKit +import Foundation + +// Usage: swift blankcheck.swift <png> — exit 0 if the capture's content +// region has actual content, 1 if it is uniform (blank). Under parallel +// load WebKit occasionally hadn't painted a backgrounded window's page +// at capture time; the generator retries those instead of shipping an +// empty pane to the site. +// +// The sampled region sits in the right half, clear of the sidebar, +// titlebar, and window edges, and works for both appearances: any +// rendered scene puts text or diagram pixels there, and a stddev near +// zero means nothing was painted. +guard CommandLine.arguments.count == 2, + let image = NSImage(contentsOfFile: CommandLine.arguments[1]), + let cg = image.cgImage(forProposedRect: nil, context: nil, hints: nil) +else { + FileHandle.standardError.write(Data("usage: swift blankcheck.swift <png>\n".utf8)) + exit(2) +} +let width = cg.width, height = cg.height +let rect = CGRect(x: Int(Double(width) * 0.55), y: Int(Double(height) * 0.2), + width: Int(Double(width) * 0.4), height: Int(Double(height) * 0.6)) +guard let region = cg.cropping(to: rect), + let data = region.dataProvider?.data, + let bytes = CFDataGetBytePtr(data) +else { exit(2) } +let bytesPerRow = region.bytesPerRow +let bpp = region.bitsPerPixel / 8 +var sum = 0.0, sumSq = 0.0, n = 0.0 +var y = 0 +while y < region.height { + var x = 0 + while x < region.width { + let p = y * bytesPerRow + x * bpp + let luminance = 0.3 * Double(bytes[p]) + 0.6 * Double(bytes[p + 1]) + 0.1 * Double(bytes[p + 2]) + sum += luminance + sumSq += luminance * luminance + n += 1 + x += 8 + } + y += 8 +} +let mean = sum / n +let variance = max(0, sumSq / n - mean * mean) +let stddev = variance.squareRoot() +print(String(format: "stddev %.2f", stddev)) +exit(stddev < 2.0 ? 1 : 0) diff --git a/scripts/drive/lightcheck.swift b/scripts/drive/lightcheck.swift new file mode 100644 index 0000000..cdeca2a --- /dev/null +++ b/scripts/drive/lightcheck.swift @@ -0,0 +1,34 @@ +import AppKit +import Foundation + +// Usage: swift lightcheck.swift <png>... — for each capture, verify the +// close button renders COLORED (red), i.e. the window photographed with +// active chrome. Gray lights mean the capture raced a focus change. +// Prints failures; exit 1 if any. The red button is the universal +// check: main windows show red/yellow/green and Settings windows +// red/gray/gray, but red leads in both. +var failures = 0 +for path in CommandLine.arguments.dropFirst() { + guard let image = NSImage(contentsOfFile: path), + let cg = image.cgImage(forProposedRect: nil, context: nil, hints: nil), + let data = cg.dataProvider?.data, + let bytes = CFDataGetBytePtr(data) + else { print("UNREADABLE \(path)"); failures += 1; continue } + let scale = cg.width >= 1600 ? 2 : 1 // Retina captures are 2x + let bytesPerRow = cg.bytesPerRow + let bpp = cg.bitsPerPixel / 8 + // Sample a small box around the close button's center (~26,25 pt + // in the window; captures are window-cropped so origin is the + // window corner). Look for any strongly red pixel. + var redFound = false + for dy in stride(from: 18 * scale, to: 32 * scale, by: 2) { + for dx in stride(from: 18 * scale, to: 36 * scale, by: 2) { + let p = dy * bytesPerRow + dx * bpp + let r = Int(bytes[p]), g = Int(bytes[p + 1]), b = Int(bytes[p + 2]) + if r > 190 && g < 140 && b < 140 { redFound = true } + } + if redFound { break } + } + if !redFound { print("GRAY LIGHTS \(path)"); failures += 1 } +} +exit(failures == 0 ? 0 : 1) diff --git a/scripts/drive/pclick.swift b/scripts/drive/pclick.swift deleted file mode 100644 index b92f02b..0000000 --- a/scripts/drive/pclick.swift +++ /dev/null @@ -1,27 +0,0 @@ -import CoreGraphics -import Foundation - -// Usage: swift pclick.swift <pid> <x> <y> — left click delivered straight to -// the pid's event queue via CGEvent.postToPid. Coordinates are still global -// screen points (the app resolves which of its windows contains them), but -// the visible cursor never moves and the target app need not be frontmost. -guard CommandLine.arguments.count >= 4, - let pid = pid_t(CommandLine.arguments[1]), - let x = Double(CommandLine.arguments[2]), - let y = Double(CommandLine.arguments[3]) -else { - FileHandle.standardError.write(Data("usage: swift pclick.swift <pid> <x> <y>\n".utf8)) - exit(1) -} -let pt = CGPoint(x: x, y: y) -let down = CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown, - mouseCursorPosition: pt, mouseButton: .left)! -down.flags = [] -down.setIntegerValueField(.mouseEventClickState, value: 1) -down.postToPid(pid) -usleep(90_000) -let up = CGEvent(mouseEventSource: nil, mouseType: .leftMouseUp, - mouseCursorPosition: pt, mouseButton: .left)! -up.flags = [] -up.setIntegerValueField(.mouseEventClickState, value: 1) -up.postToPid(pid) diff --git a/scripts/drive/pkey.swift b/scripts/drive/pkey.swift index e79ec14..8a22b0d 100644 --- a/scripts/drive/pkey.swift +++ b/scripts/drive/pkey.swift @@ -1,22 +1,27 @@ import CoreGraphics import Foundation -// Usage: swift pkey.swift <pid> <keycode> [cmd] — key press delivered straight -// to the pid's event queue via CGEvent.postToPid. Does not require the app to -// be frontmost and never disturbs whatever the human is typing into. +// Usage: swift pkey.swift <pid> <keycode> [cmd] [shift] [opt] [ctrl] — key +// press delivered straight to the pid's event queue via CGEvent.postToPid. +// Does not require the app to be frontmost and never disturbs whatever the +// human is typing into. Modifier args combine (e.g. `5 cmd shift` = ⇧⌘G). guard CommandLine.arguments.count >= 3, let pid = pid_t(CommandLine.arguments[1]), let raw = UInt16(CommandLine.arguments[2]) else { - FileHandle.standardError.write(Data("usage: swift pkey.swift <pid> <keycode> [cmd]\n".utf8)) + FileHandle.standardError.write(Data("usage: swift pkey.swift <pid> <keycode> [cmd] [shift] [opt] [ctrl]\n".utf8)) exit(1) } let code = CGKeyCode(raw) -let cmd = CommandLine.arguments.contains("cmd") +var flags: CGEventFlags = [] +if CommandLine.arguments.contains("cmd") { flags.insert(.maskCommand) } +if CommandLine.arguments.contains("shift") { flags.insert(.maskShift) } +if CommandLine.arguments.contains("opt") { flags.insert(.maskAlternate) } +if CommandLine.arguments.contains("ctrl") { flags.insert(.maskControl) } let down = CGEvent(keyboardEventSource: nil, virtualKey: code, keyDown: true)! -down.flags = cmd ? .maskCommand : [] +down.flags = flags down.postToPid(pid) usleep(80_000) let up = CGEvent(keyboardEventSource: nil, virtualKey: code, keyDown: false)! -up.flags = cmd ? .maskCommand : [] +up.flags = flags up.postToPid(pid) diff --git a/scripts/drive/ptype.swift b/scripts/drive/ptype.swift new file mode 100644 index 0000000..2a73b48 --- /dev/null +++ b/scripts/drive/ptype.swift @@ -0,0 +1,25 @@ +import CoreGraphics +import Foundation + +// Usage: swift ptype.swift <pid> <text> — type text into the pid's event +// queue as unicode keyboard events. Replaces pbcopy+⌘V flows: it never +// touches the shared clipboard, so parallel capture instances (and the +// human's copy buffer) stay unmolested. +guard CommandLine.arguments.count >= 3, + let pid = pid_t(CommandLine.arguments[1]) +else { + FileHandle.standardError.write(Data("usage: swift ptype.swift <pid> <text>\n".utf8)) + exit(1) +} +let text = CommandLine.arguments.dropFirst(2).joined(separator: " ") +for character in text { + let units = Array(String(character).utf16) + let down = CGEvent(keyboardEventSource: nil, virtualKey: 0, keyDown: true)! + down.keyboardSetUnicodeString(stringLength: units.count, unicodeString: units) + down.postToPid(pid) + usleep(30_000) + let up = CGEvent(keyboardEventSource: nil, virtualKey: 0, keyDown: false)! + up.keyboardSetUnicodeString(stringLength: units.count, unicodeString: units) + up.postToPid(pid) + usleep(30_000) +} diff --git a/scripts/screenshots/README.md b/scripts/screenshots/README.md index 2a3cfa4..2ce37f4 100644 --- a/scripts/screenshots/README.md +++ b/scripts/screenshots/README.md @@ -2,46 +2,110 @@ Replayable captures of the site's app screenshots — the committed alternative to hand-driven capture sessions (spec: -`docs/specs/site-dark-mode.md`). +`docs/specs/site-dark-mode.md`; localized/background/parallel rework +in the localized-screenshots PR). ## Run make app - scripts/screenshots/generate.sh all --appearance both + scripts/screenshots/generate.sh all --appearance both --lang all -Single scene / appearance: `generate.sh diff --appearance dark`. -Future locales (once app-i18n ships): `--lang ja` adds -`-AppleLanguages` to the launch and a `-ja` suffix to outputs. +That is the full site matrix: 8 scenes × light/dark × English + 7 +locales, 128 captures. Languages run in PARALLEL (one instance per +language on cascaded window frames) and instances stay BACKGROUNDED +throughout — no focus steal, no cursor, no clipboard — so the whole +matrix lands in roughly one language's wall clock (~6 minutes) while +the machine stays usable. Don't minimize or close the capture windows +while a run is live, and don't CLICK INTO them (that activates the +instance and routes your input inside); occluding them with other +windows and hovering for tooltips are both fine. -Outputs land in `out/` (gitignored). Review them, then promote to -`site/img/` and bump the `?v=` cache-busters on the pages. +Every capture is machine-verified before it counts: blankcheck.swift +(content-region stddev — WebKit under eightfold load sometimes hasn't +painted) and lightcheck.swift (colored traffic lights — a capture can +race a key-status handoff). capture() retries both in place, and +combos that still fail re-run SOLO in an automatic fix-up pass at the +end of the run, where flakes essentially never survive. + +Narrower runs compose the same flags: `generate.sh diff --appearance +dark`, `generate.sh pr --lang ja`, `generate.sh all --appearance both` +(English only). + +Outputs land in `out/` (gitignored): English at the top level, +localized captures in `out/<site-code>/` (zh, ja, fr, de, nl, es, +pt) with the same basenames — mirroring `site/img/`. Review, then +promote: + + rsync -a scripts/screenshots/out/ site/img/ --include='*/' \ + --include='app-*.png' --exclude='*' + +and bump the `?v=` cache-busters on the pages. +`scripts/check-site-i18n.py` verifies every page references its own +language's screenshots and that all referenced files exist. + +## How instances are driven (all pid-targeted, all background-safe) + +- **Delivery**: the demo Location and pullmark:// capture URLs arrive + as pid-addressed AppleEvents (`aeopen.swift`, `aeurl.swift`) — never + `open`/`open -a`, which resolve through Launch Services by bundle id + and have handed documents to a freshly spawned third instance when + /Applications and dist were both alive. Delivery is VERIFIED via AX + before any scene runs; a launch whose Location never arrives fails + that scene loudly instead of capturing a wrong window. +- **Sidebar rows**: `ax.swift select-row` / `disclose` (AX selection on + the backing outline; SwiftUI rows discard posted clicks and carry no + AXPress). Rows are matched by fixture filenames — data, so language- + independent; an ordinal disambiguates duplicates + (`select-row 2 calibration.md`). +- **App controls**: AX press by localized title, resolved at run time + through `loc-lookup.py` from `loc/<lang>.lproj` (the same files the + app renders — scenes can't drift from the UI) and, for the system + sidebar toggle, from SwiftUI's own Localizable.loctable. System menu + items (Settings ⌘, · Quit ⌘Q) go by keyboard equivalent + (`ax.swift menukey`), which no language changes. +- **Keys and typing**: `pkey.swift` / `ptype.swift` post to the pid; + `-pm.captureChrome` nominates a key window so a background instance + routes them (AppKit drops key events for never-activated apps + otherwise). Typing never touches the shared clipboard. +- **Page interactions with no AX/keyboard path** (the edit scene's + block reveal — the page's click listener is delegated, so blocks + aren't individually pressable): `pullmark://capture/…` URLs, a drive + channel the app only routes when launched with `-pm.captureChrome`. +- **Active-looking chrome**: `-pm.captureChrome` draws colored traffic + lights and accent selection without focus (CaptureChrome.swift — + windows get GENUINELY made key/main, which a background app is + allowed to do; faked notifications raced AppKit into gray), so + captures are pixel-identical to a frontmost window's. +- **Sticky state is PINNED, never toggled**: demo instances each own a + per-pid defaults suite (a shared suite meant every fresh launch's + startup wipe reset other live instances' state mid-scene), and + per-scene flags ride the argument domain (`-pm.blame 1` on the blame + scene only). Nothing a capture instance does can leak into another + instance or into the human's own app. ## Prereqs and rules - The terminal needs the Screen Recording permission (captures come back empty otherwise) and the Accessibility permission (drive kit). -- Scenes use global mouse events: **hands off the machine** during a - run (~5 min for all 16). - Captures wear the classic Mac BLUE accent via argument-domain - flags. This only works because scenes launch the app BARE: a - document argument at launch makes Launch Services respawn the - process, which keeps the environment but silently drops the - argument domain (that is how a green-accent generation once - escaped). The demo Location is handed to the running instance via - `open -a` afterwards. + flags. This only works because instances launch BARE: a document + argument at launch makes Launch Services respawn the process, which + keeps the environment but silently drops the argument domain (that + is how a green-accent generation once escaped). +- `--lang` pairs `-AppleLanguages` with `-AppleLocale` so dates and + numbers render natively, not just translated labels. - The demo fixtures live in `~/Code/meridian-docs` (fictional origin, deliberately kept) and the app's built-in PM_DEMO session. Never point scenes at real repos or documents. -- Window geometry is pinned at 1052×784 logical points at (160, 60); - scene coordinates in `scenes.sh` are global screen points derived - from that frame. If a scene drifts (app UI changed), re-derive - coordinates from a fresh screenshot before editing them. - -## Cleanup (mandatory) - -The generator quits each instance itself. After a session that -launched `dist/PullMark.app` in any other way: +- The window is pinned at 1052×784 logical points per instance + (cascaded origins in parallel runs). Scenes carry no screen + coordinates — targets are named, not pointed at — so cascading + can't break them. - make unregister-dist +## Cleanup -and relaunch /Applications/PullMark.app if it was displaced. +The generator quits each instance itself and sweeps stragglers on +exit; nothing is registered with Launch Services, so there is nothing +to unregister. After a session that launched `dist/PullMark.app` any +OTHER way (e.g. `open dist/PullMark.app` for a trial), the standing +`make unregister-dist` rule still applies. diff --git a/scripts/screenshots/generate.sh b/scripts/screenshots/generate.sh index 4469cb2..f5bd147 100755 --- a/scripts/screenshots/generate.sh +++ b/scripts/screenshots/generate.sh @@ -1,12 +1,25 @@ #!/bin/zsh -# Scene-scripted screenshot generator (spec: site-dark-mode). +# Scene-scripted screenshot generator (spec: site-dark-mode; background/ +# parallel rework in the localized-screenshots PR). # -# scripts/screenshots/generate.sh <scene|all> [--appearance light|dark|both] [--lang <code>] +# scripts/screenshots/generate.sh <scene|all> [--appearance light|dark|both] [--lang <code>|all] # # Replays committed scenes against dist/PullMark.app in demo mode and -# captures the main window — the replacement for hand-driven capture -# sessions. Build first: `make app`. See README.md for the runbook, -# including the mandatory cleanup (`make unregister-dist`). +# captures the window — the replacement for hand-driven capture +# sessions. Build first: `make app`. See README.md for the runbook. +# +# Instances run BACKGROUNDED and never take focus, the cursor, or the +# clipboard: scenes drive through pid-targeted channels only, and the +# -pm.captureChrome flag makes windows draw active chrome (colored +# traffic lights, accent selection) without being key. Languages run +# in PARALLEL — one instance per language on cascaded window frames — +# so `all --appearance both --lang all` (8 scenes × light/dark × +# English + 7 locales, 128 captures) fits in roughly one language's +# wall clock, with the machine usable throughout. +# +# English lands in out/ (matching site/img/), localized captures in +# out/<site-code>/ (zh, ja, fr, de, nl, es, pt — matching +# site/img/<code>/), same basenames throughout. set -euo pipefail cd "$(dirname "$0")/../.." @@ -28,7 +41,7 @@ while [[ $# -gt 0 ]]; do *) echo "unknown argument: $1" >&2; exit 2 ;; esac done -[[ -n $scene ]] || { echo "usage: generate.sh <scene|all> [--appearance light|dark|both] [--lang <code>]" >&2; exit 2; } +[[ -n $scene ]] || { echo "usage: generate.sh <scene|all> [--appearance light|dark|both] [--lang <code>|all]" >&2; exit 2; } case $appearance in light|dark) appearances=($appearance) ;; @@ -37,29 +50,58 @@ case $appearance in esac if [[ $scene == all ]]; then scenes=($SCENES_ALL); else scenes=($scene); fi +# Empty string = English (no language override; keys ARE the English +# strings). The list mirrors loc/*.lproj. +if [[ $lang == all ]]; then + langs=("" zh-Hans ja fr de nl es pt-BR) +else + langs=("$lang") +fi + +site_dir() { # locale code → site directory name ('' for English) + case $1 in + zh-Hans) echo zh ;; pt-BR) echo pt ;; *) echo $1 ;; + esac +} + source scripts/screenshots/scenes.sh mkdir -p $OUT +rm -f $OUT/.status-*(N) -# Launch Services must know this bundle or document delivery (the demo -# Location via `open -a`) silently routes to Finder — and the standing -# cleanup rule unregisters dist after every trial, so register fresh -# per run and unregister again on exit. -LSREGISTER=/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -"$LSREGISTER" -f "$PWD/dist/PullMark.app" -trap '"$LSREGISTER" -u "$PWD/dist/PullMark.app" >/dev/null 2>&1 || true; if [[ -n "$APP_PID" ]]; then kill "$APP_PID" 2>/dev/null || true; fi' EXIT +# dist shares the real defaults domain, and the blame scene writes the +# sticky pm.blame flag there — snapshot it and put it back so capture +# runs never change what the human's own app shows next launch. +blame_before=$(defaults read app.pullmark.PullMark pm.blame 2>/dev/null || echo ABSENT) +restore_blame() { + if [[ $blame_before == ABSENT ]]; then + defaults delete app.pullmark.PullMark pm.blame 2>/dev/null || true + else + defaults write app.pullmark.PullMark pm.blame "$blame_before" + fi +} -APP_PID="" -failures=0 +# The EXIT trap reaps stray capture instances and restores the shared +# flag — no Launch Services registration exists to undo (delivery is +# pid-addressed). +trap 'pkill -f "$PWD/dist/PullMark.app/Contents/MacOS/PullMark" 2>/dev/null || true; restore_blame' EXIT -launch() { # $1 = appearance +launch() { # $1 = appearance, $2 = window x, $3 = window y, $4 = scene # Published screenshots wear the classic Mac BLUE accent (Josh's # standing rule) — forced via the argument domain so captures are - # machine-independent. These flags only survive because the launch - # is BARE (see below): a document argument at launch makes Launch - # Services respawn the app and silently drop the argument domain, - # which is how a green-accent generation of captures once escaped. + # machine-independent. -pm.captureChrome draws active window chrome + # without focus and suppresses the launch activation; the flags only + # survive because the launch is BARE (a document argument makes + # Launch Services respawn the app and drop the argument domain). + # + # pm.blame is PINNED per scene: the sticky flag lives in a shared + # defaults domain and parallel instances' lazily-synced caches lost + # every toggle-choreography race (blind press AND ensure-state). + # Argument domains are per-process, so each scene simply launches + # with the state it wants and nothing ever writes the shared flag. + local blame_pin=0 + [[ ${4:-} == blame ]] && blame_pin=1 local flags=(-AppleAccentColor 4 -AppleHighlightColor "0.698039 0.843137 1.000000 Blue" - -pm.appearance $1) + -pm.appearance $1 -pm.captureChrome 1 -pm.blame $blame_pin) if [[ -n $lang ]]; then # Language AND locale: language alone leaves US date/number formats. local region @@ -70,11 +112,6 @@ launch() { # $1 = appearance 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 - # appearance flag never applied that way. The demo Location is - # handed to the running instance afterwards instead. PM_DEMO=1 $APP $flags & APP_PID=$! CAPTURE_ID="" @@ -82,44 +119,152 @@ launch() { # $1 = appearance swift $DRIVE/winid.swift $APP_PID >/dev/null 2>&1 && break sleep 0.2 done - open -a "$PWD/dist/PullMark.app" ~/Code/meridian-docs + sleep 1 + # Deliver the demo Location by pid-addressed AppleEvent — NEVER + # `open -a`: with several same-bundle-id copies alive, Launch + # Services sometimes spawns yet another instance for the document + # and the scene captures a folderless window. + swift $DRIVE/aeopen.swift $APP_PID ~/Code/meridian-docs >/dev/null sleep 2.5 - swift $DRIVE/winframe.swift $APP_PID 1052 784 >/dev/null + set_sidebar visible # location_present needs the headings on screen + if ! location_present; then + echo "launch: demo Location missing — retrying delivery" >&2 + swift $DRIVE/aeopen.swift $APP_PID ~/Code/meridian-docs >/dev/null + sleep 2.5 + location_present || { echo "launch: demo Location never arrived" >&2; return 1; } + fi + swift $DRIVE/winframe.swift $APP_PID 1052 784 $2 $3 >/dev/null sleep 1 } +# The folder Location is in place when the sidebar shows TWO plain +# meridian-docs headings (folder + demo remote repo; the closing quote +# in the pattern excludes the "meridian-docs #128" PR row). Folder +# names are fixture data, so this is locale-proof. +location_present() { + for _ in {1..8}; do + local count + count=$(swift $DRIVE/ax.swift $APP_PID list 10 2>/dev/null \ + | grep -Fc 'AXHeading "meridian-docs"') || count=0 + (( count >= 2 )) && return 0 + sleep 0.8 + done + return 1 +} + capture() { # $1 = output basename (no extension) local id id=${CAPTURE_ID:-$(swift $DRIVE/winid.swift $APP_PID | head -1)} - screencapture -x -o -l $id "$OUT/$1.png" - echo "captured $OUT/$1.png" + # Two capture-time verifiers, both retried: a blank content region + # (WebKit hasn't painted yet — eight instances rendering mermaid at + # once can take a while) and gray traffic lights (the capture raced + # a key-status handoff; the blessing timer re-keys within a tick). + for attempt in 1 2 3 4 5 6; do + screencapture -x -o -l $id "$OUT/$1.png" + if ! swift $DRIVE/blankcheck.swift "$OUT/$1.png" >/dev/null; then + echo "capture $1: blank content pane — waiting for render" >&2 + elif ! swift $DRIVE/lightcheck.swift "$OUT/$1.png" >/dev/null; then + echo "capture $1: gray traffic lights — waiting for re-key" >&2 + else + echo "captured $OUT/$1.png" + return 0 + fi + (( attempt == 6 )) && { echo "capture $1: still bad after retries" >&2; return 1; } + sleep 3 + done } quit_app() { - swift $DRIVE/ax.swift $APP_PID menu PullMark "Quit PullMark" >/dev/null 2>&1 || kill $APP_PID 2>/dev/null || true - for _ in {1..25}; do kill -0 $APP_PID 2>/dev/null || break; sleep 0.2; done - kill -0 $APP_PID 2>/dev/null && kill -9 $APP_PID 2>/dev/null || true + # By keyboard equivalent (⌘Q), not menu title — titles are localized + # under --lang. Kills only THIS worker's instance: other languages' + # instances are alive in parallel. + if [[ -n $APP_PID ]]; then + swift $DRIVE/ax.swift $APP_PID menukey q cmd >/dev/null 2>&1 || kill $APP_PID 2>/dev/null || true + for _ in {1..25}; do kill -0 $APP_PID 2>/dev/null || break; sleep 0.2; done + kill -0 $APP_PID 2>/dev/null && kill -9 $APP_PID 2>/dev/null || true + fi APP_PID="" } -for mode in $appearances; do - for name in $scenes; do - suffix="" - [[ $mode == dark ]] && suffix="-dark" - [[ -n $lang ]] && suffix="$suffix-$lang" - echo "── scene $name ($mode${lang:+, $lang})" - launch $mode - if scene_$name; then - capture "app-$name$suffix" - else - echo "scene $name FAILED — skipping capture" >&2 +# One worker = one language, scenes sequential within it. Runs as a +# subshell so APP_PID/CAPTURE_ID/lang stay private to the worker. +run_language() { # $1 = lang, $2 = worker index + lang=$1 + local index=$2 failures=0 + local subdir=$(site_dir "$lang") + # Cascaded frames keep every window fully on screen (occluded is + # fine — the window server keeps backing stores current — but + # offscreen regions would capture stale). + local x=$((120 + index * 56)) y=$((48 + index * 36)) + mkdir -p "$OUT${subdir:+/$subdir}" + for mode in $appearances; do + for name in $scenes; do + suffix="" + [[ $mode == dark ]] && suffix="-dark" + echo "── scene $name ($mode${lang:+, $lang})" + if ! { launch $mode $x $y $name && scene_$name \ + && capture "${subdir:+$subdir/}app-$name$suffix"; }; then + echo "scene $name FAILED${lang:+ ($lang)}" >&2 + failures=$((failures + 1)) + echo "$name $mode" >> "$OUT/.retry-${subdir:-en}" + fi + quit_app + done + done + echo $failures > "$OUT/.status-${subdir:-en}" +} + +# Stagger worker starts so eight cold WebKit launches don't collide. +index=0 +for worker_lang in "${langs[@]}"; do + if (( ${#langs[@]} > 1 )); then + ( run_language "$worker_lang" $index ) & + sleep 2 + else + run_language "$worker_lang" $index + fi + index=$((index + 1)) +done +wait + +failures=0 +for status_file in $OUT/.status-*(N); do + failures=$((failures + $(cat "$status_file"))) +done +rm -f $OUT/.status-*(N) + +# Fix-up pass: parallel runs flake at ~5% (WebKit under eightfold +# load); the same combos succeed solo essentially always. Re-run each +# failure sequentially before declaring defeat. PM_GEN_FIXUP guards +# recursion — a fix-up run that still fails just reports. +if (( failures > 0 )) && [[ -z ${PM_GEN_FIXUP:-} ]]; then + echo "── fix-up pass: re-running $failures failed capture(s) solo" + # Consume the retry files BEFORE re-invoking: each child run clears + # $OUT bookkeeping at its own exit and would delete them mid-loop. + combos=() + for retry_file in $OUT/.retry-*(N); do + code=${retry_file##*.retry-} + while read -r retry_scene retry_mode; do + combos+=("$retry_scene $retry_mode $code") + done < "$retry_file" + done + rm -f $OUT/.retry-*(N) + failures=0 + for combo in "${combos[@]}"; do + read -r retry_scene retry_mode code <<< "$combo" + case $code in + en) retry_lang="" ;; zh) retry_lang=zh-Hans ;; pt) retry_lang=pt-BR ;; + *) retry_lang=$code ;; + esac + if ! PM_GEN_FIXUP=1 "$0" "$retry_scene" --appearance "$retry_mode" \ + ${retry_lang:+--lang "$retry_lang"}; then failures=$((failures + 1)) fi - quit_app done -done +fi +rm -f $OUT/.retry-*(N) if (( failures > 0 )); then - echo "done with $failures FAILED scene(s) — fix and rerun those." >&2 + echo "done with $failures FAILED scene(s) even after solo retries." >&2 exit 1 fi echo "done — review the results in $OUT before promoting to site/img." diff --git a/scripts/screenshots/loc-lookup.py b/scripts/screenshots/loc-lookup.py new file mode 100755 index 0000000..955b8ed --- /dev/null +++ b/scripts/screenshots/loc-lookup.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +"""Resolve a UI string to its localized form for scene driving. + + loc-lookup.py app <lang> <key> PullMark's own strings (loc/*.lproj) + loc-lookup.py system <lang> <key> SwiftUI framework strings (loctable) + +The generator's --lang matrix drives the app by ACCESSIBILITY TITLE, +and titles follow AppleLanguages. App-owned controls resolve from the +shipped translations in loc/ — the same files the app renders, so +scenes can never drift from the UI. System-owned controls (the +sidebar toggle is the only one scenes touch) resolve from SwiftUI's +own Localizable.loctable, so Apple's translations are read, never +guessed. An empty or "en" lang echoes the key: English is the key. + +Exit 1 with a message on stderr when the key is missing — a scene +driving a control that lost its translation should fail loudly, not +click nothing. +""" + +import plistlib +import re +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent.parent +SWIFTUI_LOCTABLE = Path( + "/System/Library/Frameworks/SwiftUI.framework/Resources/Localizable.loctable") + +# loc/ uses BCP-47 (matching .lproj names); Apple's loctables key some +# locales with underscores. +LOCTABLE_LANG = {"zh-Hans": "zh_CN", "pt-BR": "pt_BR"} + + +def unescape(s): + return s.replace('\\"', '"').replace("\\n", "\n").replace("\\\\", "\\") + + +def app_lookup(lang, key): + path = ROOT / "loc" / f"{lang}.lproj" / "Localizable.strings" + if not path.exists(): + sys.exit(f"loc-lookup: no translations at {path}") + text = path.read_text(encoding="utf-8") + text = re.sub(r"/\*.*?\*/", "", text, flags=re.S) + text = re.sub(r"^\s*//.*$", "", text, flags=re.M) + for m in re.finditer(r'"((?:[^"\\]|\\.)*)"\s*=\s*"((?:[^"\\]|\\.)*)"\s*;', text): + if unescape(m.group(1)) == key: + return unescape(m.group(2)) + sys.exit(f"loc-lookup: key {key!r} missing from {path.name} ({lang})") + + +def system_lookup(lang, key): + with SWIFTUI_LOCTABLE.open("rb") as f: + table = plistlib.load(f) + entry = table.get(LOCTABLE_LANG.get(lang, lang), {}) + value = entry.get(key) + if value is None: + sys.exit(f"loc-lookup: system key {key!r} missing for {lang!r} " + f"in {SWIFTUI_LOCTABLE.name}") + return value + + +def main(): + if len(sys.argv) != 4 or sys.argv[1] not in ("app", "system"): + sys.exit("usage: loc-lookup.py app|system <lang> <key>") + mode, lang, key = sys.argv[1:4] + if lang in ("", "en"): + print(key) + return + print(app_lookup(lang, key) if mode == "app" else system_lookup(lang, key)) + + +if __name__ == "__main__": + main() diff --git a/scripts/screenshots/scenes.sh b/scripts/screenshots/scenes.sh index 7585eb4..4ae97e1 100755 --- a/scripts/screenshots/scenes.sh +++ b/scripts/screenshots/scenes.sh @@ -1,124 +1,156 @@ #!/bin/zsh -# Scene definitions for the screenshot generator (spec: site-dark-mode). +# Scene definitions for the screenshot generator (spec: site-dark-mode; +# background/parallel rework: spec follows the localized-screenshots PR). # # Every scene starts from a FRESH demo launch with ~/Code/meridian-docs -# opened as a Location (generate.sh passes it as a CLI argument), the -# sidebar visible, the PR overview selected, and the window pinned at -# 1052x784 logical points at (160, 60). All coordinates below are -# GLOBAL screen points derived from that layout — pinned geometry is -# what makes them replayable. Rows aren't reachable by AXPress and -# pid-posted clicks are discarded by SwiftUI lists, so scenes use the -# global-event tier (click.swift): hands off the machine during a run. +# delivered as a Location (generate.sh sends it by pid-addressed +# AppleEvent), the sidebar visible, the PR overview selected, and the +# window pinned by winframe. Scenes drive the app ENTIRELY through +# pid-targeted channels — AX row selection, AX presses, pid-posted +# keys, capture URLs — so instances run backgrounded and in parallel +# without ever taking the cursor, the keyboard focus, or the clipboard. +# The -pm.captureChrome flag makes windows draw active chrome anyway. # # Scene inventory mirrors the site: doc notes pr diff blame edit # remote themes. drive() { swift scripts/drive/"$@"; } -activate() { - osascript -e "tell application \"System Events\" to set frontmost of (first process whose unix id is $APP_PID) to true" >/dev/null 2>&1 || true - sleep 0.5 -} +# Localized titles for AX driving ($lang comes from generate.sh; empty +# means English). App-owned controls resolve from loc/, the system +# sidebar toggle from SwiftUI's own loctable — see loc-lookup.py. +t() { scripts/screenshots/loc-lookup.py app "$lang" "$1"; } +t_sys() { scripts/screenshots/loc-lookup.py system "$lang" "$1"; } # Sidebar visibility is not deterministic across launches — force it. -# The toggle's title reveals the state: "Show Sidebar" only exists -# while hidden, "Hide Sidebar" only while visible. -show_sidebar() { - drive ax.swift $APP_PID press "Show Sidebar" >/dev/null 2>&1 || true - sleep 1 -} -hide_sidebar() { - drive ax.swift $APP_PID press "Hide Sidebar" >/dev/null 2>&1 || true - sleep 1 +# State comes from AX (sidebar-state: is there a native list outside +# the web area?), the toggle from its localized toolbar title. +set_sidebar() { # $1 = visible|hidden + local want=$1 verb=Show + [[ $want == hidden ]] && verb=Hide + for _ in 1 2; do + [[ $(drive ax.swift $APP_PID sidebar-state) == $want ]] && return 0 + drive ax.swift $APP_PID press "$(t_sys "$verb Sidebar")" >/dev/null + sleep 1 + done + [[ $(drive ax.swift $APP_PID sidebar-state) == $want ]] || { + echo "set_sidebar: still not $want" >&2; return 1 + } } +show_sidebar() { set_sidebar visible; } +hide_sidebar() { set_sidebar hidden; } + +# Every drive step that shapes the capture ends with `|| return 1`: +# `set -e` is suppressed inside functions called in a condition, so +# without it a missed press (wrong title, user interference) would +# silently capture the wrong picture. # Folder tree browsing: expanded guides, quick-start as an italic -# preview entry — "folders come in as living trees". +# preview entry — "folders come in as living trees". Row titles are +# fixture filenames (data), so selection is language-independent. scene_doc() { - activate - show_sidebar - drive click.swift 199 339 # guides disclosure + drive ax.swift $APP_PID disclose guides >/dev/null || return 1 sleep 1 - drive click.swift 291 371 # quick-start.md → preview + drive ax.swift $APP_PID select-row quick-start.md >/dev/null || return 1 sleep 2.5 } # The margin-notes fixture: three signed notes rendered in place. +# ⌘K Open Quickly + typed query — pid-posted keys reach the panel +# because captureChrome nominates a key window for the instance. scene_notes() { - activate - show_sidebar - drive pkey.swift $APP_PID 40 cmd # ⌘K Open Quickly + drive pkey.swift $APP_PID 40 cmd || return 1 # ⌘K Open Quickly sleep 1 - printf 'wind-gust' | pbcopy - drive pkey.swift $APP_PID 9 cmd # paste query + drive ptype.swift $APP_PID wind-gust || return 1 # typed, never the clipboard sleep 1 - drive pkey.swift $APP_PID 36 # Return + drive pkey.swift $APP_PID 36 || return 1 # Return sleep 2.5 } # PR overview: description, cockpit chrome, conversation with the -# rendered table. Selected at launch — just focus the content. +# rendered table. Selected EXPLICITLY — the folder delivery can steal +# the launch selection for the folder's README, and a human clicking +# around a capture window mid-run can move it anywhere. scene_pr() { - activate - hide_sidebar - drive pkey.swift $APP_PID 121 # Page Down + drive ax.swift $APP_PID select-row "meridian-docs #128" >/dev/null || return 1 + sleep 2 + hide_sidebar || return 1 + drive pkey.swift $APP_PID 121 || return 1 # Page Down sleep 2 } # Rendered diff: word-level highlights + the added mermaid flowchart. +# `2 calibration.md` = second matching row: Open Files has the local +# calibration.md, the PR file row follows it. scene_diff() { - activate - show_sidebar - drive click.swift 289 659 # PR file calibration.md + show_sidebar || return 1 + drive ax.swift $APP_PID select-row 2 calibration.md >/dev/null || return 1 sleep 3 } # Result view with the blame gutter — avatars per run of blocks. scene_blame() { - activate - show_sidebar - # Toggle blame from the remote doc's toolbar, where the checkbox is - # inline at capture width (the PR-file view's mode picker pushes it - # into unreachable overflow). The toggle is sticky, so the PR file - # picks it up. - drive click.swift 308 499 # remote docs/getting-started.md - sleep 2.5 - drive ax.swift $APP_PID press "Blame" >/dev/null - sleep 1 - drive click.swift 289 723 # PR file getting-started.md + # Blame is ON via the launch's argument-domain pin (generate.sh + # passes -pm.blame 1 for this scene only) — no toggle choreography. + # The sticky flag lives in a defaults domain shared across parallel + # instances with lazily-synced caches, and BOTH toggle strategies + # (blind press, ensure-state) lost races to other instances' stale + # views. Argument domains are per-process: deterministic, no writes. + show_sidebar || return 1 + drive ax.swift $APP_PID select-row 2 getting-started.md >/dev/null || return 1 sleep 2.5 - drive ax.swift $APP_PID menu View "Result" >/dev/null + # menuitem, not `menu View …`: the top-level View menu's own title is + # system-localized, but the item title is ours to resolve. + drive ax.swift $APP_PID menuitem "$(t Result)" >/dev/null || return 1 sleep 2.5 } -# Edit mode: the active block shows its source, the rest stays rendered. +# Edit mode: the active block shows its source, the rest stays +# rendered. Block activation goes through the capture URL channel — +# the page's click targets aren't reachable from the accessibility +# tree (the listener is delegated), and that channel exists for +# exactly this. Line 9 = the "When to calibrate" paragraph. scene_edit() { - activate - show_sidebar - drive click.swift 280 179 # local calibration.md + drive ax.swift $APP_PID select-row calibration.md >/dev/null || return 1 sleep 2 - drive ax.swift $APP_PID menu Edit "Edit Mode" >/dev/null - sleep 1 - drive click.swift 791 354 # activate the "When to calibrate" paragraph + drive ax.swift $APP_PID menuitem "$(t "Edit Mode")" >/dev/null || return 1 + sleep 1.5 + drive aeurl.swift $APP_PID "pullmark://capture/reveal?line=9" >/dev/null || return 1 sleep 1.5 } # Browsed-from-GitHub doc with the provenance bar (demo remote session). scene_remote() { - activate - drive click.swift 308 499 # remote docs/getting-started.md + drive ax.swift $APP_PID select-row docs/getting-started.md >/dev/null || return 1 sleep 2.5 - drive ax.swift $APP_PID press "Hide Sidebar" >/dev/null - sleep 1 + hide_sidebar || return 1 } # Settings → Appearance: the three live theme cards. Captures the -# settings window, not the main one. +# settings window, not the main one. ⌘, is system-titled — pressed by +# keyboard equivalent, which no language changes. scene_themes() { - activate - drive ax.swift $APP_PID menu PullMark "Settings…" >/dev/null - sleep 2 - drive ax.swift $APP_PID press "Appearance" >/dev/null - sleep 1.5 + drive ax.swift $APP_PID menukey , cmd >/dev/null || return 1 + # WAIT for the Settings window (any non-1052-wide window), then press + # the tab in THAT window only — pressing early once matched the main + # window's same-titled Appearance toolbar menu and captured General. + local waited=0 + until drive winlist.swift $APP_PID | awk '$4 != 1052 {found=1} END {exit !found}'; do + waited=$((waited + 1)); (( waited > 16 )) && return 1 + sleep 0.5 + done + sleep 1 + # CONFIRM the switch by window title (Settings titles itself after + # the current tab) and re-press until it lands — a press delivered + # while the tab bar was still mounting was silently ignored on some + # slower parallel workers, capturing the General tab. + local tab_title=$(t Appearance) tries=0 + until drive ax.swift $APP_PID titles 2>/dev/null | grep -qxF "$tab_title"; do + tries=$((tries + 1)); (( tries > 8 )) && return 1 + drive ax.swift $APP_PID presswin 1052 "$tab_title" >/dev/null 2>&1 || true + sleep 1 + done + sleep 2.5 # the theme cards are live previews and render like pages CAPTURE_ID=$(drive winlist.swift $APP_PID | awk '$4 != 1052 {print $1}' | head -1) + [[ -n $CAPTURE_ID ]] || return 1 } diff --git a/site/de/docs/cli/index.html b/site/de/docs/cli/index.html index c83829a..fac07d1 100644 --- a/site/de/docs/cli/index.html +++ b/site/de/docs/cli/index.html @@ -100,10 +100,10 @@ <h2 id="semantics">Was Öffnen bedeutet</h2> verlassen kann:</p> <ul> <li><strong>Dateien</strong> landen als feste Einträge im Bereich - <a href="/de/docs/sidebar/#open-files">Open Files</a> der Seitenleiste, - und angezeigt wird die zuletzt übergebene.</li> + <a href="/de/docs/sidebar/#open-files">Geöffnete Dateien</a> der + Seitenleiste, und angezeigt wird die zuletzt übergebene.</li> <li><strong>Ordner</strong> — Git-Worktrees eingeschlossen — werden zu - <a href="/de/docs/sidebar/#locations">Locations</a>: durchstöberbare + <a href="/de/docs/sidebar/#locations">Orten</a>: durchstöberbare Bäume der Markdown-Dateien darin.</li> <li><strong>Läuft schon?</strong> Alles öffnet im vordersten Fenster. Eine zweite Instanz der App wird nie gestartet.</li> @@ -115,15 +115,15 @@ <h2 id="semantics">Was Öffnen bedeutet</h2> <h2 id="worktrees">Worktrees — und auf eine Datei zeigen</h2> <p>Übergib einen Ordner und eine Datei zusammen und du bekommst beides - auf einmal: Der Ordner öffnet als Location, die Datei öffnet fest und + auf einmal: Der Ordner öffnet als Ort, die Datei öffnet fest und wird angezeigt. Das ist das ganze Rezept für „öffne diesen Worktree und zeig mir dieses Doc":</p> <pre><code><span class="p">$ </span>pullmark ~/wt/feature ~/wt/feature/docs/plan.md</code></pre> - <p>Der Baum des Worktrees landet in Locations (mit seinem Branch-Chip, + <p>Der Baum des Worktrees landet unter „Orte" (mit seinem Branch-Chip, denn ein Worktree ist einfach ein Git-Checkout), <code>plan.md</code> - sitzt fest in Open Files und ist gerendert. Rechtsklick darauf und + sitzt fest in „Geöffnete Dateien" und ist gerendert. Rechtsklick darauf und <strong>Reveal in Location</strong> springt dahin, wo sie im Baum wohnt. - Das läuft genauso, wenn die Location schon offen war — eine Datei zu + Das läuft genauso, wenn der Ort schon offen war — eine Datei zu öffnen, die darin liegt, erzeugt nie eine zweite Welt, nur einen Eintrag im Arbeitsset.</p> <p>Fürs Ordner-Datei-Paar ist die Reihenfolge egal, angezeigt wird aber @@ -144,7 +144,7 @@ <h2 id="diff">Gerenderte Diffs aus der Shell</h2> <span class="p">$ </span>pullmark --diff-with=old.md new.md <span class="c"># zwei Dateien, old.md die Basis</span> <span class="p">$ </span>pullmark --diff ~/wt/feature ~/wt/feature/docs/plan.md <span class="c"># ein Worktree, plan.md als Diff</span></code></pre> - <p>Ordner, die du danebenstellst, öffnen weiterhin als Locations, und + <p>Ordner, die du danebenstellst, öffnen weiterhin als Orte, und jede Form hat ihren Zwilling in der App, im Compare-Menü der Toolbar (samt <strong>Compare Revisions…</strong> und <strong>Compare with File…</strong>). Weil <code>--diff</code> und <code>--diff-with</code> @@ -162,7 +162,7 @@ <h2 id="exit-codes">Exit-Codes</h2> <h2 id="examples">Beispiele</h2> <pre><code><span class="p">$ </span>pullmark README.md <span class="c"># eine Datei lesen</span> <span class="p">$ </span>pullmark ~/notes <span class="c"># einen Ordner durchstöbern</span> -<span class="p">$ </span>pullmark docs specs/design.md <span class="c"># eine Location plus ein Dokument</span> +<span class="p">$ </span>pullmark docs specs/design.md <span class="c"># ein Ort plus ein Dokument</span> <span class="p">$ </span>pullmark ~/wt/feature docs/plan.md <span class="c"># ein Worktree, ein Doc im Bild</span> <span class="p">$ </span>pullmark --diff docs/plan.md <span class="c"># was die letzten Edits geändert haben</span> <span class="p">$ </span>pullmark -- --weird-filename.md <span class="c"># -- beendet das Parsen von Optionen</span></code></pre> diff --git a/site/de/docs/experimental/margin-notes/index.html b/site/de/docs/experimental/margin-notes/index.html index 392d775..36c086b 100644 --- a/site/de/docs/experimental/margin-notes/index.html +++ b/site/de/docs/experimental/margin-notes/index.html @@ -106,8 +106,8 @@ <h2 id="using">In PullMark benutzen</h2> Aktionen. Eine Notiz zu löschen <em>ist</em>, wie sie aufgelöst wird: kein Status, kein Archiv — eine abgearbeitete Notiz ist eine abwesende Notiz.</li> - <li><strong>Der Chip</strong> — Open-Files-Zeilen zeigen einen Chip mit - der Kommentarzahl, solange ein Dokument noch Notizen trägt. Er ist + <li><strong>Der Chip</strong> — Zeilen unter „Geöffnete Dateien" + zeigen einen Chip mit der Kommentarzahl, solange ein Dokument noch Notizen trägt. Er ist live: Während ein Agent die Datei durcharbeitet und Notizen löscht, fällt die Zahl und die Blasen verschwinden vor deinen Augen.</li> <li><strong>Überall sonst</strong> — in durchstöberten GitHub-Dateien diff --git a/site/de/docs/features/index.html b/site/de/docs/features/index.html index 2b07129..ddab295 100644 --- a/site/de/docs/features/index.html +++ b/site/de/docs/features/index.html @@ -84,7 +84,7 @@ <h2 id="reading">Lesen</h2> irgendein Editor speichert; relative Bilder und Links lösen auf, und ein Klick auf einen Link zu einer anderen Markdown-Datei öffnet sie an Ort und Stelle (als <a href="/de/docs/sidebar/#previews">Vorschau</a>, wenn - sie in einer offenen Location liegt).</li> + sie in einem offenen Ort liegt).</li> <li><strong>Navigation</strong> — die Gliederungs-Seitenleiste (⌥⌘O), ⌘F für die Suche auf der Seite, ⇧⌘F für die Suche über alle Dateien in der Seitenleiste und ⌘K Open Quickly für Überschriften, Dateien, PRs, @@ -142,12 +142,12 @@ <h2 id="github">GitHub, ohne den Browser</h2> Herkunftsleiste pinnt <code>owner/repo @ ref · path</code> fest, mit einem Weg zurück zu GitHub.</li> <li><strong>Ganze Repos durchstöbern</strong> — lade den Markdown-Baum - eines Repos in <a href="/de/docs/sidebar/#locations">Locations</a>, + eines Repos unter <a href="/de/docs/sidebar/#locations">Orte</a>, wechsle Branches, vergleiche gegen andere Branches, sieh dir Blame an — private Repos nutzen die Zugangsdaten, die PRs schon nutzen, und nichts Geladenes berührt je die Platte.</li> <li><strong>Branches und Worktrees</strong> — lokale Checkouts tragen - einen Branch-Chip; sein Menü öffnet Worktrees als eigene Locations und + einen Branch-Chip; sein Menü öffnet Worktrees als eigene Orte und liest andere Branches remote. Lokal schlägt remote, wenn ein Worktree den Branch schon hat.</li> </ul> diff --git a/site/de/docs/index.html b/site/de/docs/index.html index 186c682..4a56aa3 100644 --- a/site/de/docs/index.html +++ b/site/de/docs/index.html @@ -74,8 +74,8 @@ <h1>PullMark, dokumentiert</h1> </a></li> <li><a href="/de/docs/sidebar/"> <p class="card-title">Die Seitenleiste</p> - <p class="card-sub">Open Files, Vorschauen, Locations, Pull Requests, - Recents — und was jedes Icon und jeder Chip bedeutet.</p> + <p class="card-sub">Geöffnete Dateien, Vorschauen, Orte, Pull Requests, + Zuletzt benutzt — und was jedes Icon und jeder Chip bedeutet.</p> </a></li> <li><a href="/de/docs/settings/"> <p class="card-title">Einstellungen</p> diff --git a/site/de/docs/settings/index.html b/site/de/docs/settings/index.html index 21e10cf..bb0a9de 100644 --- a/site/de/docs/settings/index.html +++ b/site/de/docs/settings/index.html @@ -78,10 +78,10 @@ <h3>Lesen</h3> — Dateien, Ordner, PRs, durchstöberte Repos und den Vorschau-Eintrag (weiterhin als Vorschau).</td></tr> <tr><td><a class="setting-link" href="pullmark://settings/general/show-hidden-files" title="Diese Einstellung in PullMark öffnen (ab 0.28.3)">Show hidden files</a></td><td>an/aus — <em>aus</em></td> - <td>Dotfiles und versteckte Ordner in Locations — + <td>Dotfiles und versteckte Ordner in „Orte" — <code>.github/</code>-Docs und Konsorten. Auch mit <kbd>⇧⌘.</kbd> umschaltbar (Finders eigener Griff) oder über View → Show Hidden - Files; jede offene Location scannt beim Umschalten neu.</td></tr> + Files; jeder offene Ort scannt beim Umschalten neu.</td></tr> <tr><td><a class="setting-link" href="pullmark://settings/general/github-links" title="Diese Einstellung in PullMark öffnen (ab 0.28.3)">GitHub Markdown links</a></td> <td>Ask on first click · Open in PullMark · Open in Browser — <em>Ask on first click</em></td> @@ -92,8 +92,8 @@ <h3>Lesen</h3> <tr><td id="clicking-files"><a class="setting-link" href="pullmark://settings/general/clicking-files" title="Diese Einstellung in PullMark öffnen (ab 0.28.3)">Clicking files in Locations</a></td> <td>Preview First · Open Fully — <em>Preview First</em></td> <td>Preview First zeigt eine Datei mit einem Klick, ohne sie zu - behalten — ein kursiver Eintrag (in Open Files, oder unter seinem - GitHub-Repo), den die nächste Vorschau ersetzt; Doppelklick oder + behalten — ein kursiver Eintrag (in „Geöffnete Dateien" oder unter + seinem GitHub-Repo), den die nächste Vorschau ersetzt; Doppelklick oder Anfangen zu bearbeiten behält sie. Open Fully behält jede Datei, die du klickst. Gilt für lokale Ordner und durchstöberte GitHub-Repos gleichermaßen. Siehe diff --git a/site/de/docs/shortcuts/index.html b/site/de/docs/shortcuts/index.html index a562d3f..758527e 100644 --- a/site/de/docs/shortcuts/index.html +++ b/site/de/docs/shortcuts/index.html @@ -101,7 +101,7 @@ <h2 id="view">View</h2> <tr><td>Show/Hide Outline</td><td><kbd>⌥⌘O</kbd></td><td>In einem lokalen Dokument</td></tr> <tr><td>Show/Hide Markdown Source</td><td><kbd>⌥⌘U</kbd></td><td></td></tr> <tr><td>Reload Document</td><td><kbd>⌘R</kbd></td><td>In einem lokalen Dokument</td></tr> - <tr><td>Show/Hide Hidden Files</td><td><kbd>⇧⌘.</kbd></td><td>Dotfiles in Locations — Finders eigener Griff</td></tr> + <tr><td>Show/Hide Hidden Files</td><td><kbd>⇧⌘.</kbd></td><td>Dotfiles in „Orte" — Finders eigener Griff</td></tr> <tr><td>Show/Hide Margin Notes</td><td>—</td><td>Notizblasen in gerenderten Dokumenten</td></tr> <tr><td>Zoom In / Out</td><td><kbd>⌘=</kbd> / <kbd>⌘-</kbd></td><td><kbd>⌘+</kbd> geht auch; auf der Seite außerdem Pinch und ⌘-Scrollen</td></tr> <tr><td>Actual Size</td><td><kbd>⌘0</kbd></td><td></td></tr> diff --git a/site/de/docs/sidebar/index.html b/site/de/docs/sidebar/index.html index 0ec68db..89bfe9a 100644 --- a/site/de/docs/sidebar/index.html +++ b/site/de/docs/sidebar/index.html @@ -4,7 +4,7 @@ <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Die Seitenleiste — PullMark-Doku - + @@ -16,7 +16,7 @@ - + @@ -62,22 +62,22 @@

docs

Die Seitenleiste

Vier Bereiche, geordnet danach, was Dinge - bedeuten, nicht woher sie kommen: was du offen hast (Open - Files), die Orte, die du durchstöberst (Locations), die Pull Requests, - die du reviewst — und wo du gewesen bist (Recents).

+ bedeuten, nicht woher sie kommen: was du offen hast (Geöffnete + Dateien), die Ordner und Repos, die du durchstöberst (Orte), die Pull + Requests, die du reviewst — und wo du gewesen bist (Zuletzt benutzt).

-

Open Files

+

Geöffnete Dateien

Das Arbeitsset: jedes Dokument, das du ausdrücklich geöffnet hast — aus dem Finder, per Drag & Drop, mit ⌘O, über die Kommandozeile oder indem du eine Datei aus - einer Location behalten hast. Flach, per Ziehen umsortierbar, jede Zeile + einem Ort behalten hast. Flach, per Ziehen umsortierbar, jede Zeile mit dem Hover-✕ entfernbar (oder ⌫ auf der ausgewählten Zeile). Rechtsklick auf die Bereichsüberschrift für Close All.

Vorschauen

-

Ein Einzelklick auf eine Datei in einer Location rendert sie sofort — - und sie erscheint in Open Files als Vorschau: ein kursiver - Eintrag, immer zuletzt im Bereich. Klick eine andere Datei und der +

Ein Einzelklick auf eine Datei in einem Ort rendert sie sofort — + und sie erscheint in „Geöffnete Dateien" als Vorschau: ein + kursiver Eintrag, immer zuletzt im Bereich. Klick eine andere Datei und der Vorschau-Eintrag wird ersetzt — Stöbern durch einen großen Baum stapelt also nie Zeilen auf. Es ist dieselbe Idee wie die Vorschau-Tabs in VS Code oder Xcodes temporärer Editor, mit derselben Kursivschrift.

@@ -97,19 +97,20 @@

Vorschauen

in den Einstellungen um.

Remote-Repos previewen genauso, am selben Ort. Beim Stöbern durch den Baum eines GitHub-Repos, oder beim Folgen von Links in - einem Remote-Dokument, landet derselbe eine kursive Eintrag in Open - Files — mit Buch-Icon und einer owner/repo @ ref-Zweitzeile, - weil die Datei nicht auf deinem Mac liegt. Es gibt immer nur + einem Remote-Dokument, landet derselbe eine kursive Eintrag in + „Geöffnete Dateien" — mit Buch-Icon und einer + owner/repo @ ref-Zweitzeile, weil die Datei nicht auf + deinem Mac liegt. Es gibt immer nur eine Vorschau pro Fenster, lokal oder remote: Etwas anderes zu previewen ersetzt, was du davor angesehen hast. Ein Remote-Doc zu behalten (Doppelklick oder Keep Open) heftet es bei seinem Repo ab — es - wandert in die feste Liste des Repos unter Locations. ⌘K öffnet direkt + wandert in die feste Liste des Repos unter „Orte". ⌘K öffnet direkt fest, denn eine URL einzufügen ist ausdrückliche Absicht.

-

Jede Open-Files-Zeile, die in einer offenen Location liegt, bekommt - Reveal in Location ins Rechtsklick-Menü — der Sprung - zurück von „was ich lese" zu „wo es wohnt".

+

Jede Zeile unter „Geöffnete Dateien", die in einem offenen Ort liegt, + bekommt Reveal in Location ins Rechtsklick-Menü — der + Sprung zurück von „was ich lese" zu „wo es wohnt".

-

Locations

+

Orte

Durchstöberbare Wurzeln, wo immer sie liegen. Zwei Arten teilen sich den Bereich, unterschieden per Icon:

@@ -126,8 +127,8 @@

Locations

Branches-und-Worktrees-Menü:

  • Worktrees — jeder Worktree des Repos, mit Häkchen - auf dem, der diese Zeile ist; wähl einen anderen, um ihn als eigene - Location zu öffnen. Worktrees werden von PullMark nie ausgecheckt oder + auf dem, der diese Zeile ist; wähl einen anderen, um ihn als eigenen + Ort zu öffnen. Worktrees werden von PullMark nie ausgecheckt oder gewechselt — es öffnet den Ordner, der schon da ist.
  • View Branch from GitHub — lies die Dateien eines anderen Branches remote, ohne deinen Checkout anzufassen. Ein Branch, @@ -143,8 +144,8 @@

    Locations

    Markdown-Baum des Repos. Die behaltenen Docs des Repos sitzen über dem Baum, damit sie in einem großen Repo nie untergehen; ein behaltenes Doc, das im Baum sichtbar ist, wird einfach dort dargestellt. (Ein Doc, das du - nur previewst, erscheint in Open Files, nicht - hier.)

    + nur previewst, erscheint unter Geöffnete Dateien, + nicht hier.)

    Ein Ordner, dessen Pfad nicht mehr auflöst (ein ausgeworfenes Volume, ein gelöschter Worktree), wird mit Fragezeichen-Badge gedimmt, statt zu verschwinden — er erwacht von selbst wieder, wenn der Pfad @@ -172,10 +173,10 @@

    Pull Requests

    hinzugefügt, -Kreis (rot) für entfernt, -Kreis für umbenannt, Stift-Kreis für geändert.

    -

    Recents

    +

    Zuletzt benutzt

    Kürzlich geöffnete Dateien, Ordner und Pull Requests, die oben nicht schon sichtbar sind. PR-Einträge tragen ihr Live-Status-Icon; ein - Recent, dessen Datei verschwunden ist, wird gedimmt (Uhr-Badge), statt + Eintrag, dessen Datei verschwunden ist, wird gedimmt (Uhr-Badge), statt zu verschwinden, und erwacht wieder, wenn der Pfad zurückkommt — gebaut für Branch-Wechsel und ausgeworfene Volumes. Rechtsklick auf die Überschrift für Clear Recents.

    @@ -184,7 +185,7 @@

    Dinge entfernen

    Fahr über eine beliebige Zeile der obersten Ebene für das ✕ — es entfernt die Zeile aus der Seitenleiste, nie etwas von der Platte oder von GitHub. ⌫ auf einer ausgewählten Zeile tut dasselbe. Dateien im Baum - einer Location haben kein ✕: Sie sind Inhalt eines Ortes, keine + eines Ortes haben kein ✕: Sie sind sein Inhalt, keine Seitenleisten-Einträge.

    Icon-Glossar

    @@ -194,14 +195,14 @@

    Icon-Glossar

- + + Zeile unter „Geöffnete Dateien": Randnotizen, die noch im Dokument sind
Dokument, kursiver NameDie Vorschau — ersetzt durch deinen nächsten Einzelklick
OrdnerEin lokaler Ordner
Ordner + ?Ordner gerade nicht auffindbar — gedimmt, erwacht wieder
Dokument + UhrEin Recent, dessen Datei fehlt
Dokument + UhrEin Eintrag unter „Zuletzt benutzt", dessen Datei fehlt
Geschlossenes BuchEin GitHub-Repository (als Zeilen-Icon: remote durchstöbert; als kleine nachgestellte Marke: dieser lokale Ordner ist ein Checkout davon)
Branch-Glyphe + NameDer Branch-Chip — Klick für Branches und Worktrees
Pull-Request-PfeileEin Pull Request
AblagefachReview Requests — PRs, die auf dein Review warten
Sprechblase + ZahlAn einer PR-Datei: unaufgelöste Review-Kommentare. An einer - Open-Files-Zeile: Randnotizen, die noch im Dokument sind
Farbiger Punkt (linke Kante)Eine ungelesene Review-Anfrage
✕ im Kreis (bei Hover)Aus der Seitenleiste entfernen / Vorschau verwerfen
diff --git a/site/de/docs/toolbar/index.html b/site/de/docs/toolbar/index.html index 4325797..20ecf6a 100644 --- a/site/de/docs/toolbar/index.html +++ b/site/de/docs/toolbar/index.html @@ -91,7 +91,7 @@

In jeder Ansicht

Fenster am längsten: Der Review-Status bleibt sichtbar, wenn andere Elemente ins Overflow-Menü rutschen. Open File or Foldersichtbar - Lokales Markdown oder einen Ordner als Location öffnen. + Lokales Markdown oder einen Ordner als Ort öffnen. Open Pull Requestsichtbar Einen GitHub-Pull-Request per URL öffnen. Appearancesichtbar @@ -123,7 +123,7 @@

Lokale Dateien

GitHub-Dokumente

Dokumente, die direkt aus einem Repo gelesen werden — geöffnet über - Links, ⌘K oder eine durchstöberte Repo-Location.

+ Links, ⌘K oder ein durchstöbertes Repo unter „Orte".

diff --git a/site/de/docs/troubleshooting/index.html b/site/de/docs/troubleshooting/index.html index 40c9678..99c6d0a 100644 --- a/site/de/docs/troubleshooting/index.html +++ b/site/de/docs/troubleshooting/index.html @@ -142,12 +142,13 @@

„… changed while you were editing this block — nothing wa Datei gar nicht gibt, wird schlicht gemeldet, statt ein leeres Diff zu zeigen.

-

Gedimmte Zeilen: Ordner und Recents, die „nicht da" sind

-

Eine Location mit Fragezeichen-Badge oder ein ausgegrautes Recent - heißt: Der Pfad löst gerade nicht auf — ein nicht eingebundenes Volume, - ein gewechselter Git-Branch, ein gelöschter Worktree. Zeilen dimmen +

Gedimmte Zeilen: Ordner und zuletzt benutzte Einträge, die „nicht da" sind

+

Ein Ort mit Fragezeichen-Badge oder ein ausgegrauter Eintrag unter + „Zuletzt benutzt" heißt: Der Pfad löst gerade nicht auf — ein nicht + eingebundenes Volume, ein gewechselter Git-Branch, ein gelöschter + Worktree. Zeilen dimmen absichtlich, statt zu verschwinden: Sie erwachen von selbst wieder, wenn - der Pfad zurückkommt. Klickst du ein totes Recent an, gibt es + der Pfad zurückkommt. Klickst du einen toten Eintrag an, gibt es Remove from Recents oder Keep.

Pull Requests: Banner und ausstehende Kommentare

diff --git a/site/de/index.html b/site/de/index.html index 5514617..1ac7e44 100644 --- a/site/de/index.html +++ b/site/de/index.html @@ -36,7 +36,7 @@ "license": "https://github.com/jedijashwa/pullmark/blob/main/LICENSE", "url": "https://pullmark.app/de/", "downloadUrl": "https://github.com/jedijashwa/pullmark/releases/latest/download/PullMark.dmg", - "screenshot": "https://pullmark.app/img/app-doc.png", + "screenshot": "https://pullmark.app/img/de/app-doc.png", "description": "Eine native macOS-App, die lokales Markdown so rendert, wie Leser es sehen werden, und dokumentationslastige GitHub-Pull-Requests als gerenderte Diffs mit wortgenauen Hervorhebungen reviewt.", "softwareHelp": { "@type": "CreativeWork", "url": "https://pullmark.app/docs/" }, "inLanguage": "de" @@ -561,8 +561,8 @@

Docs sind zum Diffen Lesen da.

- - + PullMark rendert die Dokumentation eines Projekts als formatierte Seite, mit eingeschalteter Blame-Spalte: Autoren-Avatare sitzen am linken Rand, einer pro Folge von Blöcken, die zuletzt derselbe Commit berührt hat
Eine Projekt-Doku, formatiert — mit der Historie am Rand: ein Avatar pro Blockfolge, jeder eine Tür zu seinem Commit.
@@ -598,8 +598,8 @@

Dein Agent schreibt Pläne.
Reviewe sie wie die eines Kollegen.

- - + PullMark rendert eine von einem Agenten geschriebene Design-Spec mit dem Titel Wind Gust Alerts, mit drei Randnotizen als signierten Karten des Reviewers — eine Notiz auf Dateiebene, die um eine saubere zweite Revision bittet, eine, die die Sampling-Rate-Annahme der Spec infrage stellt, und eine, die bei einem Feature YAGNI ruft — während die Seitenleiste die Spec in einem docs/superpowers/specs-Ordner eines Git-Repositorys auf dem Branch main zeigt
Die Spec eines Agenten, an Ort und Stelle reviewt: drei signierte @@ -669,9 +669,9 @@

Das ganze Docs-Review, von der gerenderten Seite aus.

- - PullMark beim Review eines Dokumentations-Pull-Requests: ein gerendertes Diff, in dem ein geänderter Absatz wortgenaue Hervorhebungen trägt, ein hinzugefügtes Mermaid-Flussdiagramm auf grünem Hinzugefügt-Ton rendert, die Seitenleiste eine Kommentarzahl an der Datei zeigt und das Review-Element der Toolbar „Finish your review + + PullMark beim Review eines Dokumentations-Pull-Requests: ein gerendertes Diff, in dem ein geänderter Absatz wortgenaue Hervorhebungen trägt, ein hinzugefügtes Mermaid-Flussdiagramm auf grünem Hinzugefügt-Ton rendert, die Seitenleiste eine Kommentarzahl an der Datei zeigt und das Review-Element der Toolbar „Finish your review“ mit drei ausstehenden Kommentaren anzeigt
Ein Dokumentations-PR als gerendertes Diff: der eine geänderte Satz trägt wortgenaue Hervorhebungen, und das neue Flussdiagramm kommt als @@ -701,9 +701,9 @@

Das ganze Docs-Review, von der gerenderten Seite aus.

- - PullMarks Pull-Request-Übersicht: der PR-Titel mit einem Open-Chip, eine Kapsel „Changes requested + + PullMarks Pull-Request-Übersicht: der PR-Titel mit einem Open-Chip, eine Kapsel „Changes requested“, eine Kapsel „Checks passed“, Reviewer-Avatare mit Urteils-Badges, ein docs-guild-Team-Chip, die gerenderte PR-Beschreibung und die Unterhaltungs-Timeline, deren erster Review-Kommentar eine gerenderte Tabelle zeigt
Die Unterhaltung als Dokument: Review-Kommentare rendern ihre Tabellen als Tabellen, und der Avatar jedes Reviewers trägt sein Urteil.
@@ -731,13 +731,13 @@

Ein richtiger Reader für das Markdown, das schon auf deiner Platte liegt. - - PullMark rendert eine lokale Markdown-Datei aus einem Docs-Repo: der Bereich Open Files der Seitenleiste listet drei behaltene Dokumente und einen kursiven Vorschau-Eintrag; der Bereich Locations zeigt den Ordner als Baum aus Unterordnern und Markdown-Dateien, mit Git-Branch-Chip und einer GitHub-Repo-Marke; die geänderten Dateien eines offenen Pull Requests bilden einen Baum mit Status-Icons und einem Kommentarzahl-Badge; das gerenderte Dokument zeigt Überschriften, Listen, einen Link und einen Tip-Alert; die Titelleiste zeigt Ordner und Git-Branch der Datei, mit einer Wortzahl-Pille in der Ecke + + PullMark rendert eine lokale Markdown-Datei aus einem Docs-Repo: der Bereich Geöffnete Dateien der Seitenleiste listet drei behaltene Dokumente und einen kursiven Vorschau-Eintrag; der Bereich Orte zeigt den Ordner als Baum aus Unterordnern und Markdown-Dateien, mit Git-Branch-Chip und einer GitHub-Repo-Marke; die geänderten Dateien eines offenen Pull Requests bilden einen Baum mit Status-Icons und einem Kommentarzahl-Badge; das gerenderte Dokument zeigt Überschriften, Listen, einen Link und einen Tip-Alert; die Titelleiste zeigt Ordner und Git-Branch der Datei, mit einer Wortzahl-Pille in der Ecke
Ordner kommen als lebende Bäume herein, jeder Ort trägt seinen Git-Branch, - und beim Stöbern erscheinen Dateien als Vorschau — der kursive Eintrag in Open - Files, den der nächste Klick ersetzt. Pull Requests sitzen neben deinen lokalen Dateien, + und beim Stöbern erscheinen Dateien als Vorschau — der kursive Eintrag in + „Geöffnete Dateien", den der nächste Klick ersetzt. Pull Requests sitzen neben deinen lokalen Dateien, und die Titelleiste weiß, wo du bist.

@@ -753,7 +753,8 @@

Ein richtiger Reader für das Markdown, das schon auf deiner Platte liegt.
  • Stöbern, ohne dich zuzuschütten — Einzelklick durch einen Ordner oder ein Repo, und jede Datei erscheint als Vorschau: ein kursiver Eintrag - in Open Files, den der nächste Klick ersetzt. Doppelklick (oder einfach lostippen) + in „Geöffnete Dateien", den der nächste Klick ersetzt. Doppelklick (oder einfach + lostippen) behält sie.
  • Gliederungs-Seitenleiste — eine Navigator-artige Karte deiner Überschriften, einen Schalter entfernt.
  • @@ -801,8 +802,8 @@

    Les
    - - + Ein gerendertes Dokument im Edit-Modus: ein Absatz zeigt an Ort und Stelle sein rohes Markdown, umgeben von gerendertem Inhalt
    Edit-Modus: der aktive Block zeigt seinen Quelltext; alles andere bleibt gerendert.
    @@ -823,9 +824,9 @@

    Git
    - - PullMark rendert eine aus einem GitHub-Repository geladene Markdown-Datei: eine Herkunftsleiste über dem Inhalt zeigt den Repository-Namen, einen Branch-Chip, den Dateipfad und den gepinnten Commit, mit einem Open-on-GitHub-Link; der Bereich Locations der Seitenleiste zeigt das Repository mit Buch-Icon und seinem Markdown-Dateibaum + + PullMark rendert eine aus einem GitHub-Repository geladene Markdown-Datei: eine Herkunftsleiste über dem Inhalt zeigt den Repository-Namen, einen Branch-Chip, den Dateipfad und den gepinnten Commit, mit einem Open-on-GitHub-Link; der Bereich Orte der Seitenleiste zeigt das Repository mit Buch-Icon und seinem Markdown-Dateibaum
    Ein Doc, direkt von GitHub gelesen: die Herkunftsleiste sagt immer, wo du bist — Repo, Branch, gepinnter Commit — und der Branch-Chip wechselt oder öffnet @@ -834,8 +835,8 @@

    Git
    - - + PullMarks Settings-Fenster auf dem Appearance-Tab: drei Live-Theme-Vorschaukarten — GitHub, Editorial und Terminal — rendern jeweils dasselbe Beispieldokument durch die echte Pipeline, Editorial ist ausgewählt, darunter Buttons zum Öffnen des eigenen Themes-Ordners
    Settings → Appearance: drei Live-Theme-Vorschauen, gerendert von der echten Pipeline — klick eine Karte zum Wechseln.
    diff --git a/site/de/uses/agents/index.html b/site/de/uses/agents/index.html index 8b3a4ed..ae83c33 100644 --- a/site/de/uses/agents/index.html +++ b/site/de/uses/agents/index.html @@ -453,8 +453,8 @@

    Gerendert lesen. Vor Ort notieren. Zurückgeben.

    - - + PullMark rendert eine von einem Agenten geschriebene Design-Spec mit dem Titel Wind Gust Alerts, mit drei Randnotizen als signierten Karten des Reviewers — eine Notiz auf Dateiebene, die um eine saubere zweite Revision bittet, eine, die die Sampling-Rate-Annahme der Spec infrage stellt, und eine, die bei einem Feature YAGNI ruft — während die Seitenleiste die Spec in einem docs/superpowers/specs-Ordner eines Git-Repositorys auf dem Branch main zeigt
    Die Spec eines Agenten, erster Review-Durchgang: signierte Notizen, @@ -559,9 +559,9 @@

    Und wenn das Doc doch ins Review geht …

    - - PullMarks Pull-Request-Übersicht: der PR-Titel mit einem Open-Chip, eine Kapsel „Changes requested + + PullMarks Pull-Request-Übersicht: der PR-Titel mit einem Open-Chip, eine Kapsel „Changes requested“, eine Kapsel „Checks passed“, Reviewer-Avatare mit Urteils-Badges, ein docs-guild-Team-Chip, die gerenderte PR-Beschreibung und die Unterhaltungs-Timeline, deren erster Review-Kommentar eine gerenderte Tabelle zeigt
    Dieselben Review-Instinkte, auf einen Pull Request gerichtet — die Startseite erzählt die ganze diff --git a/site/es/docs/cli/index.html b/site/es/docs/cli/index.html index 288e4e3..c131372 100644 --- a/site/es/docs/cli/index.html +++ b/site/es/docs/cli/index.html @@ -101,13 +101,12 @@

    Qué pasa al abrir

    confiar en ellas:

    • Los archivos caen en la sección - Open Files (archivos - abiertos) de la barra lateral como entradas conservadas, y se muestra - el último archivo que pasaste.
    • + Archivos abiertos de la + barra lateral como entradas conservadas, y se muestra el último + archivo que pasaste.
    • Las carpetas — worktrees de git incluidos — se - convierten en Locations - (ubicaciones): árboles navegables de los archivos Markdown que hay - dentro.
    • + convierten en Ubicaciones: + árboles navegables de los archivos Markdown que hay dentro.
    • ¿Ya está abierta? Todo se abre en la ventana frontal. Nunca se lanza una segunda instancia de la app.
    • Las rutas relativas se resuelven contra tu @@ -118,18 +117,19 @@

      Qué pasa al abrir

      Worktrees, y apuntar a un archivo

      Pasa juntos una carpeta y un archivo y tienes los dos - comportamientos a la vez: la carpeta se abre como Location, el archivo + comportamientos a la vez: la carpeta se abre como Ubicación, el archivo se abre conservado y a la vista. Esa es la receta entera de «abre este worktree y muéstrame este doc»:

      $ pullmark ~/wt/feature ~/wt/feature/docs/plan.md
      -

      El árbol del worktree aterriza en Locations (con su chip de rama, +

      El árbol del worktree aterriza en Ubicaciones (con su chip de rama, porque un worktree no es más que un checkout de git), - plan.md queda conservado en Open Files y renderizado. Haz - clic derecho y elige Reveal in Location (mostrar en su - ubicación) para saltar al punto del árbol donde vive. Funciona igual - cuando la Location ya estaba abierta — abrir un archivo que vive dentro - de ella nunca crea un mundo duplicado, solo una entrada en el conjunto - de trabajo.

      + plan.md queda conservado en Archivos abiertos y + renderizado. Haz clic derecho y elige + Reveal in Location (mostrar en su ubicación) para + saltar al punto del árbol donde vive. Funciona igual cuando la + Ubicación ya estaba abierta — abrir un archivo que vive dentro de ella + nunca crea un mundo duplicado, solo una entrada en el conjunto de + trabajo.

      Para emparejar carpeta y archivo el orden da igual, pero el que se muestra es el último archivo que pases, así que deja para el final el documento que quieres en pantalla.

      @@ -149,7 +149,7 @@

      Diffs renderizados desde la terminal

      $ pullmark --diff-with=old.md new.md # dos archivos, old.md como base $ pullmark --diff ~/wt/feature ~/wt/feature/docs/plan.md # un worktree, con plan.md en diff -

      Las carpetas que pases al lado siguen abriéndose como Locations, y +

      Las carpetas que pases al lado siguen abriéndose como Ubicaciones, y cada forma tiene su gemela dentro de la app, en el menú Compare de la barra de herramientas (incluidas Compare Revisions… y Compare with File…). Como --diff y @@ -167,7 +167,7 @@

      Códigos de salida

      Ejemplos

      $ pullmark README.md                      # leer un archivo
       $ pullmark ~/notes                        # navegar una carpeta
      -$ pullmark docs specs/design.md           # una Location más un documento
      +$ pullmark docs specs/design.md           # una Ubicación más un documento
       $ pullmark ~/wt/feature docs/plan.md      # un worktree, mostrando un doc
       $ pullmark --diff docs/plan.md            # qué cambiaron las últimas ediciones
       $ pullmark -- --weird-filename.md         # -- termina el análisis de opciones
      diff --git a/site/es/docs/experimental/margin-notes/index.html b/site/es/docs/experimental/margin-notes/index.html index 71facfd..df36e7e 100644 --- a/site/es/docs/experimental/margin-notes/index.html +++ b/site/es/docs/experimental/margin-notes/index.html @@ -106,9 +106,9 @@

      Usarlas en PullMark

      una nota para ver sus acciones. Borrar una nota es la forma de darla por resuelta: sin estados, sin archivo histórico — una nota atendida es una nota ausente.
    • -
    • El chip — las filas de Open Files (archivos - abiertos) llevan un chip con la cuenta de comentarios mientras el - documento aún cargue notas. Está vivo: según el agente recorre el +
    • El chip — las filas de Archivos abiertos llevan + un chip con la cuenta de comentarios mientras el documento aún + cargue notas. Está vivo: según el agente recorre el archivo borrando notas, la cuenta baja y los globos desaparecen delante de ti.
    • En todo lo demás — las notas se renderizan en diff --git a/site/es/docs/features/index.html b/site/es/docs/features/index.html index f868617..b6e28b1 100644 --- a/site/es/docs/features/index.html +++ b/site/es/docs/features/index.html @@ -86,7 +86,7 @@

      Lectura

      relativos se resuelven, y hacer clic en un enlace a otro archivo Markdown lo abre en el sitio (como vista previa cuando vive en - una Location abierta).
    • + una Ubicación abierta).
    • Navegación — la barra lateral de esquema (⌥⌘O), buscar en la página con ⌘F, buscar con ⇧⌘F en todos los archivos de la barra lateral a la vez, y Open Quickly (abrir rápidamente, ⌘K) para @@ -149,12 +149,12 @@

      GitHub, sin el navegador

      barra de procedencia fija owner/repo @ ref · ruta con un camino de vuelta a GitHub.
    • Navega repos enteros — carga el árbol Markdown de - un repo en Locations, cambia + un repo en Ubicaciones, cambia de rama, compara contra otras ramas, consulta el blame — los repos privados usan las credenciales que los PR ya usan, y nada de lo descargado toca el disco.
    • Ramas y worktrees — los checkouts locales llevan - un chip de rama; su menú abre worktrees como Locations propias y lee + un chip de rama; su menú abre worktrees como Ubicaciones propias y lee otras ramas en remoto. Lo local siempre gana a lo remoto cuando un worktree ya tiene la rama.
    diff --git a/site/es/docs/index.html b/site/es/docs/index.html index 4375f12..3fbbd3a 100644 --- a/site/es/docs/index.html +++ b/site/es/docs/index.html @@ -75,8 +75,9 @@

    PullMark, documentado

  • La barra lateral

    -

    Open Files, vistas previas, Locations, Pull - Requests, Recents — y qué significa cada icono y cada chip.

    +

    Archivos abiertos, vistas previas, Ubicaciones, + Pull Requests, Recientes — y qué significa cada icono y cada + chip.

  • Ajustes

    diff --git a/site/es/docs/settings/index.html b/site/es/docs/settings/index.html index d4003e1..c06a327 100644 --- a/site/es/docs/settings/index.html +++ b/site/es/docs/settings/index.html @@ -79,10 +79,10 @@

    Lectura

    PullMark se cerró — archivos, carpetas, PRs, repos navegados y la entrada de vista previa (aún como vista previa).
  • - + Hidden Files; cada Ubicación abierta se reescanea al cambiarlo. @@ -93,9 +93,10 @@

    Lectura

    ElementStandardWas es tut
    ComparesichtbarDasselbe Dokument auf einem anderen Branch, als gerendertes Diff.
    Show hidden fileson/off — offLos dotfiles y carpetas ocultas en Locations — los docs de + Los dotfiles y carpetas ocultas en Ubicaciones — los docs de .github/ y compañía. También se alterna con ⇧⌘. (la combinación del propio Finder) o View → Show - Hidden Files; cada Location abierta se reescanea al cambiarlo.
    GitHub Markdown links Ask on first click · Open in PullMark · Open in Browser — Ask on first click
    Clicking files in Locations Preview First · Open Fully — Preview First Preview First muestra un archivo con un clic sin conservarlo — - una entrada en cursiva (en Open Files, o bajo su repo de GitHub) - que la siguiente vista previa reemplaza; doble clic o empezar a - editar la conserva. Open Fully conserva cada archivo que clicas. + una entrada en cursiva (en Archivos abiertos, o bajo su repo de + GitHub) que la siguiente vista previa reemplaza; doble clic o + empezar a editar la conserva. Open Fully conserva cada archivo que + clicas. Vale igual para carpetas locales y repos de GitHub navegados. Ver Vistas previas.
    diff --git a/site/es/docs/shortcuts/index.html b/site/es/docs/shortcuts/index.html index 34ebe1a..9613386 100644 --- a/site/es/docs/shortcuts/index.html +++ b/site/es/docs/shortcuts/index.html @@ -100,7 +100,7 @@

    View (visualización)

    Show/Hide Outline⌥⌘OEn un documento local Show/Hide Markdown Source⌥⌘U Reload Document⌘REn un documento local - Show/Hide Hidden Files⇧⌘.Dotfiles en Locations — la combinación del propio Finder + Show/Hide Hidden Files⇧⌘.Dotfiles en Ubicaciones — la combinación del propio Finder Show/Hide Margin Notes—Los globos de nota en documentos renderizados Zoom In / Out⌘= / ⌘-⌘+ también funciona; el pellizco y ⌘-desplazamiento sobre la página, además Actual Size⌘0 diff --git a/site/es/docs/sidebar/index.html b/site/es/docs/sidebar/index.html index 2eeafcd..c8dada6 100644 --- a/site/es/docs/sidebar/index.html +++ b/site/es/docs/sidebar/index.html @@ -4,7 +4,7 @@ La barra lateral — Docs de PullMark - + @@ -16,7 +16,7 @@ - + @@ -66,18 +66,18 @@

    La barra lateral

    lugares que navegas, los pull requests que estás revisando y por dónde has pasado.

    -

    Open Files (archivos abiertos)

    +

    Archivos abiertos

    El conjunto de trabajo: cada documento que has abierto explícitamente — desde el Finder, arrastrar y soltar, ⌘O, la línea de comandos o al conservar un archivo - de una Location. Plano, reordenable arrastrando, cada fila eliminable + de una Ubicación. Plano, reordenable arrastrando, cada fila eliminable con la ✕ que aparece al pasar el cursor (o ⌫ en la fila seleccionada). Clic derecho en la cabecera de la sección para Close All (cerrar todo).

    Vistas previas

    -

    Un solo clic en un archivo dentro de una Location y se renderiza al - instante — y aparece en Open Files como vista previa: una única +

    Un solo clic en un archivo dentro de una Ubicación y se renderiza al + instante — y aparece en Archivos abiertos como vista previa: una única entrada en cursiva, siempre la última de la sección. Haz clic en otro archivo y la entrada de vista previa se reemplaza, así que navegar un árbol grande nunca acumula filas. Es la misma idea que las pestañas de @@ -101,20 +101,20 @@

    Vistas previas

    Los repos remotos se previsualizan igual, en el mismo lugar. Navegar el árbol de un repo de GitHub, o seguir enlaces dentro de un documento remoto, pone la misma entrada única en cursiva - en Open Files — con un icono de libro y una segunda línea + en Archivos abiertos — con un icono de libro y una segunda línea owner/repo @ ref, ya que el archivo no está en tu Mac. Solo existe una vista previa por ventana, local o remota: previsualizar algo reemplaza lo que estuvieras previsualizando antes. Conservar un doc remoto (doble clic o Keep Open) es lo que lo archiva - con su repo — pasa a la lista de fijados del repo bajo Locations. ⌘K + con su repo — pasa a la lista de fijados del repo bajo Ubicaciones. ⌘K abre fijando directamente, porque pegar una URL es intención explícita.

    -

    Cualquier fila de Open Files que viva dentro de una Location abierta - tiene Reveal in Location (mostrar en su ubicación) en - su menú contextual — el salto de vuelta de «lo que estoy leyendo» a - «donde vive».

    +

    Cualquier fila de Archivos abiertos que viva dentro de una Ubicación + abierta tiene Reveal in Location (mostrar en su + ubicación) en su menú contextual — el salto de vuelta de «lo que estoy + leyendo» a «donde vive».

    -

    Locations (ubicaciones)

    +

    Ubicaciones

    Raíces navegables, vivan donde vivan. Dos clases comparten la sección, distinguidas por el icono:

    @@ -132,7 +132,7 @@

    Locations (ubicaciones)

    • Worktrees — cada worktree del repo, con una marca en el que corresponde a esta fila; elige otro para abrirlo como su - propia Location. PullMark nunca hace checkout ni cambia de worktree — + propia Ubicación. PullMark nunca hace checkout ni cambia de worktree — abre la carpeta que ya está ahí.
    • View Branch from GitHub (ver rama desde GitHub) — lee los archivos de otra rama en remoto, sin tocar tu checkout. Una @@ -150,7 +150,7 @@

      Locations (ubicaciones)

      del árbol, para que nunca se ahoguen bajo un repo grande; un doc conservado que ya es visible en el árbol simplemente se representa ahí. (Un doc que solo estás previsualizando aparece en - Open Files, no aquí.)

      + Archivos abiertos, no aquí.)

      Una carpeta cuya ruta deja de resolverse (un volumen desmontado, un worktree borrado) se atenúa con una insignia de interrogación en vez de desaparecer — revive por sí sola cuando la ruta vuelve.

      @@ -178,7 +178,7 @@

      Pull Requests

      círculo para renombrado, círculo con lápiz para modificado.

      -

      Recents (recientes)

      +

      Recientes

      Archivos, carpetas y pull requests abiertos hace poco que no estén ya visibles arriba. Las entradas de PR llevan su icono de estado en vivo; un reciente cuyo archivo desapareció se atenúa (insignia de @@ -190,7 +190,7 @@

      Quitar cosas

      Pasa el cursor por cualquier fila de primer nivel para la ✕ — quita la fila de la barra lateral, jamás nada del disco ni de GitHub. ⌫ en una fila seleccionada hace lo mismo. Los archivos dentro del árbol de - una Location no tienen ✕: son contenidos de un lugar, no elementos de + una Ubicación no tienen ✕: son contenidos de un lugar, no elementos de la barra lateral.

      Glosario de iconos

      @@ -207,7 +207,7 @@

      Glosario de iconos

    diff --git a/site/es/docs/toolbar/index.html b/site/es/docs/toolbar/index.html index 41ffa44..6979b77 100644 --- a/site/es/docs/toolbar/index.html +++ b/site/es/docs/toolbar/index.html @@ -94,7 +94,7 @@

    En todas las vistas

    visible cuando otros elementos se pliegan en el desbordamiento. - + @@ -126,7 +126,7 @@

    Archivos locales

    Documentos de GitHub

    Documentos leídos directamente de un repo — abiertos desde enlaces, - ⌘K o una Location de repo navegado.

    + ⌘K o una Ubicación de repo navegado.

    Flechas de pull requestUn pull request
    BandejaReview Requests — PRs que esperan tu revisión
    Globo de diálogo + contadorEn un archivo de PR: comentarios de revisión sin - resolver. En una fila de Open Files: notas al + resolver. En una fila de Archivos abiertos: notas al margen aún presentes en el documento
    Punto de color (borde izquierdo)Una solicitud de revisión sin leer
    ✕ en un círculo (al pasar el cursor)Quitar de la barra lateral / descartar la vista previa
    Open File or FoldervisibleAbre Markdown local o una carpeta como Location.
    Abre Markdown local o una carpeta como Ubicación.
    Open Pull Requestvisible Abre un pull request de GitHub por URL.
    Appearancevisible
    diff --git a/site/es/docs/troubleshooting/index.html b/site/es/docs/troubleshooting/index.html index f676076..9733cfa 100644 --- a/site/es/docs/troubleshooting/index.html +++ b/site/es/docs/troubleshooting/index.html @@ -145,9 +145,9 @@

    «… changed while you were editing this block — nothing was un diff vacío.

    Filas atenuadas: carpetas y recientes que «no están»

    -

    Una Location (ubicación) con una insignia de interrogación, o un - reciente en gris, significa que la ruta no se resuelve ahora mismo — un - volumen desmontado, una rama de git cambiada, un worktree borrado. Las +

    Una Ubicación con una insignia de interrogación, o un reciente en + gris, significa que la ruta no se resuelve ahora mismo — un volumen + desmontado, una rama de git cambiada, un worktree borrado. Las filas se atenúan en vez de desaparecer a propósito: reviven solas cuando la ruta vuelve. Clicar un reciente muerto ofrece Remove from Recents (quitar de recientes) o diff --git a/site/es/index.html b/site/es/index.html index 6824771..539c19c 100644 --- a/site/es/index.html +++ b/site/es/index.html @@ -36,7 +36,7 @@ "license": "https://github.com/jedijashwa/pullmark/blob/main/LICENSE", "url": "https://pullmark.app/es/", "downloadUrl": "https://github.com/jedijashwa/pullmark/releases/latest/download/PullMark.dmg", - "screenshot": "https://pullmark.app/img/app-doc.png", + "screenshot": "https://pullmark.app/img/es/app-doc.png", "description": "Una app nativa para macOS que renderiza el Markdown local tal como lo verán sus lectores y revisa pull requests de GitHub cargados de documentación como diffs renderizados, con resaltado palabra por palabra.", "softwareHelp": { "@type": "CreativeWork", "url": "https://pullmark.app/docs/" }, "inLanguage": "es" @@ -560,8 +560,8 @@

    Los docs están para diffearse leerse.

    - - + PullMark renderizando la documentación de un proyecto como una página con formato, con el margen de blame activo: los avatares de los autores se alinean en el margen izquierdo, uno por cada grupo de bloques tocados por el mismo commit
    Un doc del proyecto, con formato — y la historia en el margen: un avatar por grupo de bloques, cada uno una puerta a su commit.
    @@ -598,8 +598,8 @@

    Tu agente escribe planes.
    Revísalos como los de un colega.

    - - + PullMark renderizando una especificación de diseño escrita por un agente, titulada Wind Gust Alerts, con tres notas al margen mostradas como tarjetas firmadas por el revisor — una nota a nivel de archivo que pide una segunda versión limpia, otra que cuestiona el supuesto de frecuencia de muestreo de la especificación y otra que declara YAGNI sobre una función — mientras la barra lateral muestra la especificación en una carpeta docs/superpowers/specs de un repositorio git en la rama main
    La especificación de un agente, revisada en el sitio: tres notas @@ -668,8 +668,8 @@

    Toda la revisión de docs, desde la página renderizada.

    - - + PullMark revisando un pull request de documentación: un diff renderizado donde un párrafo modificado lleva resaltado palabra por palabra, un diagrama de flujo Mermaid añadido se renderiza sobre el tinte verde de bloque añadido, la barra lateral muestra un contador de comentarios en el archivo y el control de revisión de la barra de herramientas dice Finish your review con tres comentarios pendientes
    Un PR de documentación como diff renderizado: la única frase @@ -699,8 +699,8 @@

    Toda la revisión de docs, desde la página renderizada.

    - - + El resumen de pull request de PullMark: el título del PR con una insignia Open, una cápsula Changes requested, una cápsula Checks passed, avatares de revisores con insignias de veredicto, una etiqueta del equipo docs-guild, la descripción del PR renderizada y la cronología de la conversación, cuyo primer comentario de revisión muestra una tabla renderizada
    La conversación como documento: los comentarios de revisión renderizan @@ -729,9 +729,9 @@

    Un lector de verdad para el Markdown que ya vive en tu disco.

    - - PullMark renderizando un archivo Markdown local de un repo de documentación: la sección Open Files de la barra lateral lista tres documentos conservados y una entrada de vista previa en cursiva; la sección Locations muestra la carpeta como un árbol de subcarpetas y archivos Markdown, con un chip de rama git y una marca de repo de GitHub; los archivos modificados de un pull request abierto forman un árbol con iconos de estado y un contador de comentarios; el documento renderizado muestra encabezados, listas, un enlace y una alerta Tip; la barra de título muestra la carpeta del archivo y la rama git, con una píldora de recuento de palabras en la esquina + + PullMark renderizando un archivo Markdown local de un repo de documentación: la sección Archivos abiertos de la barra lateral lista tres documentos conservados y una entrada de vista previa en cursiva; la sección Ubicaciones muestra la carpeta como un árbol de subcarpetas y archivos Markdown, con un chip de rama git y una marca de repo de GitHub; los archivos modificados de un pull request abierto forman un árbol con iconos de estado y un contador de comentarios; el documento renderizado muestra encabezados, listas, un enlace y una alerta Tip; la barra de título muestra la carpeta del archivo y la rama git, con una píldora de recuento de palabras en la esquina
    Las carpetas entran como árboles vivos, cada ubicación lleva su rama git, y navegar muestra los archivos como vistas previas — la entrada en cursiva de Open @@ -798,8 +798,8 @@

    Lee
    - - + Un documento renderizado en modo de edición: un párrafo revelado como código Markdown crudo en su sitio, rodeado de contenido renderizado
    Modo de edición: el bloque activo muestra su código fuente; todo lo demás sigue renderizado.
    @@ -819,9 +819,9 @@

    Git
    - - PullMark renderizando un archivo Markdown descargado de un repositorio de GitHub: una barra de procedencia sobre el contenido muestra el nombre del repositorio, un chip de rama, la ruta del archivo y el commit fijado, con un enlace Open on GitHub; la sección Locations de la barra lateral muestra el repositorio con un icono de libro y su árbol de archivos Markdown + + PullMark renderizando un archivo Markdown descargado de un repositorio de GitHub: una barra de procedencia sobre el contenido muestra el nombre del repositorio, un chip de rama, la ruta del archivo y el commit fijado, con un enlace Open on GitHub; la sección Ubicaciones de la barra lateral muestra el repositorio con un icono de libro y su árbol de archivos Markdown
    Un doc leído directamente de GitHub: la barra de procedencia siempre dice dónde estás — repo, rama, commit fijado — y el chip de rama cambia o abre ramas sin @@ -830,8 +830,8 @@

    Git
    - - + La ventana de Settings de PullMark en la pestaña Appearance: tres tarjetas de vista previa de tema en vivo — GitHub, Editorial y Terminal — cada una renderizando el mismo documento de muestra con el pipeline real, con Editorial seleccionado, sobre botones para abrir la carpeta de temas personalizados
    Settings → Appearance: tres vistas previas de tema en vivo, renderizadas por el pipeline real — haz clic en una tarjeta para cambiar.
    diff --git a/site/es/uses/agents/index.html b/site/es/uses/agents/index.html index 6f677c1..c7db381 100644 --- a/site/es/uses/agents/index.html +++ b/site/es/uses/agents/index.html @@ -451,8 +451,8 @@

    Lee renderizado. Anota en el sitio. Devuélvelo.

    - - + PullMark renderizando una especificación de diseño escrita por un agente, titulada Wind Gust Alerts, con tres notas al margen mostradas como tarjetas firmadas por el revisor — una nota a nivel de archivo que pide una segunda versión limpia, otra que cuestiona el supuesto de frecuencia de muestreo de la especificación y otra que declara YAGNI sobre una función — mientras la barra lateral muestra la especificación en una carpeta docs/superpowers/specs de un repositorio git en la rama main
    La especificación de un agente, una primera pasada de revisión: notas @@ -558,8 +558,8 @@

    Y cuando el doc sí sube a revisión…

    - - + El resumen de pull request de PullMark: el título del PR con una insignia Open, una cápsula Changes requested, una cápsula Checks passed, avatares de revisores con insignias de veredicto, una etiqueta del equipo docs-guild, la descripción del PR renderizada y la cronología de la conversación, cuyo primer comentario de revisión muestra una tabla renderizada
    Los mismos instintos de revisión, apuntados a un pull request — la diff --git a/site/fr/docs/cli/index.html b/site/fr/docs/cli/index.html index 8a3862b..ff1f8f4 100644 --- a/site/fr/docs/cli/index.html +++ b/site/fr/docs/cli/index.html @@ -100,10 +100,10 @@

    Ce que fait l'ouverture

    dessus :

    • Les fichiers atterrissent dans la section - Open Files de la barre latérale en + Fichiers ouverts de la barre latérale en entrées épinglées, et le dernier fichier passé est affiché.
    • Les dossiers — worktrees git compris — deviennent des - Locations : des arborescences + Emplacements : des arborescences navigables des fichiers Markdown qu'ils contiennent.
    • Déjà lancée ? Tout s'ouvre dans la fenêtre au premier plan. Une seconde instance de l'app n'est jamais démarrée.
    • @@ -115,16 +115,16 @@

      Ce que fait l'ouverture

      Les worktrees, et viser un seul fichier

      Passez un dossier et un fichier ensemble et vous obtenez les deux - comportements d'un coup : le dossier s'ouvre en Location, le fichier + comportements d'un coup : le dossier s'ouvre en emplacement, le fichier s'ouvre épinglé et affiché. C'est toute la recette de « ouvre ce worktree et montre-moi cette doc » :

      $ pullmark ~/wt/feature ~/wt/feature/docs/plan.md
      -

      L'arborescence du worktree atterrit dans Locations (avec sa pastille de +

      L'arborescence du worktree atterrit dans Emplacements (avec sa pastille de branche, un worktree n'étant qu'une copie de travail git), - plan.md est épinglé dans Open Files et rendu. Clic droit dessus et + plan.md est épinglé dans Fichiers ouverts et rendu. Clic droit dessus et Reveal in Location (afficher dans l'emplacement) saute vers sa - place dans l'arborescence. Cela marche pareil quand la Location était déjà - ouverte — ouvrir un fichier qui vit dedans ne crée jamais un monde en double, + place dans l'arborescence. Cela marche pareil quand l'emplacement était déjà + ouvert — ouvrir un fichier qui vit dedans ne crée jamais un monde en double, juste une entrée dans l'ensemble de travail.

      L'ordre n'importe pas pour l'appariement dossier/fichier, mais le dernier fichier passé est celui affiché : mettez en dernier le @@ -144,7 +144,7 @@

      Des diffs rendus depuis le shell

      $ pullmark --diff-with=old.md new.md # deux fichiers, old.md comme référence $ pullmark --diff ~/wt/feature ~/wt/feature/docs/plan.md # un worktree, plan.md diffé -

      Les dossiers passés à côté s'ouvrent toujours en Locations, et chaque forme a +

      Les dossiers passés à côté s'ouvrent toujours en emplacements, et chaque forme a son jumeau dans le menu Compare de la barre d'outils (y compris Compare Revisions… et Compare with File…). Parce que --diff et --diff-with sont des drapeaux, @@ -162,7 +162,7 @@

      Codes de sortie

      Exemples

      $ pullmark README.md                      # lire un fichier
       $ pullmark ~/notes                        # parcourir un dossier
      -$ pullmark docs specs/design.md           # une Location plus un document
      +$ pullmark docs specs/design.md           # un emplacement plus un document
       $ pullmark ~/wt/feature docs/plan.md      # un worktree, une doc affichée
       $ pullmark --diff docs/plan.md            # ce que les dernières éditions ont changé
       $ pullmark -- --weird-filename.md         # -- termine l'analyse des options
      diff --git a/site/fr/docs/experimental/margin-notes/index.html b/site/fr/docs/experimental/margin-notes/index.html index 8f4374f..cf2d9c9 100644 --- a/site/fr/docs/experimental/margin-notes/index.html +++ b/site/fr/docs/experimental/margin-notes/index.html @@ -109,8 +109,8 @@

      Les utiliser dans PullMark

      ses actions. Supprimer une note, c'est ainsi qu'on la résout : pas d'état, pas d'archive — une note traitée est une note absente. -
    • La pastille — les lignes d'Open Files (fichiers - ouverts) portent une pastille de compte de commentaires tant que le +
    • La pastille — les lignes de Fichiers ouverts + portent une pastille de compte de commentaires tant que le document porte encore des notes. Elle est vivante : à mesure que l'agent traverse le fichier en supprimant les notes, le compteur descend et les bulles disparaissent sous vos yeux.
    • diff --git a/site/fr/docs/features/index.html b/site/fr/docs/features/index.html index 59a64c1..5cd3196 100644 --- a/site/fr/docs/features/index.html +++ b/site/fr/docs/features/index.html @@ -82,7 +82,7 @@

      Lecture

      l'enregistrement depuis n'importe quel éditeur ; les images et liens relatifs se résolvent, et cliquer un lien vers un autre fichier Markdown l'ouvre sur place (en aperçu quand il - vit dans une Location ouverte). + vit dans un emplacement ouvert).
    • Navigation — le plan en barre latérale (⌥⌘O), la recherche dans la page ⌘F, la recherche ⇧⌘F dans tous les fichiers de la barre latérale, et ⌘K Open Quickly (ouvrir rapidement) pour les titres, fichiers, PR et @@ -140,12 +140,12 @@

      GitHub, sans le navigateur

      épingle owner/repo @ ref · path avec un chemin de retour vers GitHub.
    • Parcourez des dépôts entiers — chargez l'arborescence - Markdown d'un dépôt dans Locations, + Markdown d'un dépôt dans Emplacements, changez de branche, comparez avec d'autres branches, consultez le blame — les dépôts privés utilisent les identifiants que les PR utilisent déjà, et rien de ce qui est récupéré ne touche jamais le disque.
    • Branches et worktrees — les copies locales portent une - pastille de branche ; son menu ouvre les worktrees comme Locations à part + pastille de branche ; son menu ouvre les worktrees comme emplacements à part et lit les autres branches à distance. Le local l'emporte toujours sur le distant quand un worktree a déjà la branche.
    diff --git a/site/fr/docs/index.html b/site/fr/docs/index.html index 0021e0f..508f317 100644 --- a/site/fr/docs/index.html +++ b/site/fr/docs/index.html @@ -74,8 +74,8 @@

    PullMark, documenté

  • La barre latérale

    -

    Open Files, aperçus, Locations, Pull Requests, - Recents — et la signification de chaque icône et pastille.

    +

    Fichiers ouverts, aperçus, Emplacements, Pull Requests, + Récents — et la signification de chaque icône et pastille.

  • Réglages

    diff --git a/site/fr/docs/settings/index.html b/site/fr/docs/settings/index.html index 14aee77..8b76b90 100644 --- a/site/fr/docs/settings/index.html +++ b/site/fr/docs/settings/index.html @@ -79,10 +79,10 @@

    Lecture

    PullMark — fichiers, dossiers, PR, dépôts parcourus, et l'entrée d'aperçu (toujours en aperçu).
  • - + combo du Finder lui-même) ou View → Show Hidden Files ; chaque emplacement + ouvert re-scanne à la bascule. @@ -92,7 +92,7 @@

    Lecture

    - + diff --git a/site/fr/docs/sidebar/index.html b/site/fr/docs/sidebar/index.html index b3bd829..da21a76 100644 --- a/site/fr/docs/sidebar/index.html +++ b/site/fr/docs/sidebar/index.html @@ -4,7 +4,7 @@ La barre latérale — Docs PullMark - + @@ -16,7 +16,7 @@ - + @@ -66,17 +66,17 @@

    La barre latérale

    lieux que vous parcourez, les pull requests que vous révisez, et là où vous êtes passé.

    -

    Open Files

    -

    Open Files (fichiers ouverts), c'est l'ensemble de travail : chaque +

    Fichiers ouverts

    +

    Fichiers ouverts, c'est l'ensemble de travail : chaque document explicitement ouvert — depuis le Finder, par glisser-déposer, ⌘O, la - ligne de commande, ou en gardant un fichier d'une - Location. À plat, réordonnable en glissant, chaque ligne retirable avec le ✕ au + ligne de commande, ou en gardant un fichier d'un + emplacement. À plat, réordonnable en glissant, chaque ligne retirable avec le ✕ au survol (ou ⌫ sur la ligne sélectionnée). Clic droit sur l'en-tête de section pour Close All (tout fermer).

    Aperçus

    -

    Cliquez une fois un fichier dans une Location : il se rend - immédiatement — et apparaît dans Open Files en aperçu, une seule entrée +

    Cliquez une fois un fichier dans un emplacement : il se rend + immédiatement — et apparaît dans Fichiers ouverts en aperçu, une seule entrée en italique, toujours dernière de la section. Cliquez un autre fichier et l'entrée d'aperçu est remplacée : parcourir une grande arborescence n'empile jamais de lignes. C'est la même idée que les onglets d'aperçu de VS @@ -97,22 +97,22 @@

    Aperçus

    dans Settings (réglages).

    Les dépôts distants s'aperçoivent de la même façon, au même endroit. Parcourir l'arborescence d'un dépôt GitHub, ou suivre des liens - dans un document distant, place la même entrée italique unique dans Open - Files — avec une icône de livre et une seconde ligne + dans un document distant, place la même entrée italique unique dans + Fichiers ouverts — avec une icône de livre et une seconde ligne owner/repo @ ref, puisque le fichier n'est pas sur votre Mac. Il n'y a jamais qu'un seul aperçu par fenêtre, local ou distant : apercevoir quoi que ce soit remplace ce que vous aperceviez avant. Garder un document distant (double-clic ou Keep Open) est ce qui le classe avec son - dépôt — il rejoint la liste épinglée du dépôt sous Locations. ⌘K ouvre + dépôt — il rejoint la liste épinglée du dépôt sous Emplacements. ⌘K ouvre directement épinglé, coller une URL étant une intention explicite.

    -

    Toute ligne d'Open Files qui vit dans une Location ouverte gagne - Reveal in Location (afficher dans l'emplacement) dans son menu - contextuel — le saut retour de « ce que je lis » vers « là où ça - vit ».

    +

    Toute ligne de Fichiers ouverts qui vit dans un emplacement ouvert + gagne Reveal in Location (afficher dans l'emplacement) dans + son menu contextuel — le saut retour de « ce que je lis » vers + « là où ça vit ».

    -

    Locations

    -

    Locations (emplacements) regroupe les racines navigables, où qu'elles vivent. - Deux espèces partagent la section, distinguées par l'icône :

    +

    Emplacements

    +

    La section Emplacements regroupe les racines navigables, où qu'elles + vivent. Deux espèces partagent la section, distinguées par l'icône :

    ElementoPor defectoQué hace
    ComparevisibleEl mismo documento en otra rama, como diff renderizado.
    Show hidden filesactivé/désactivé — désactivéLes dotfiles et dossiers cachés dans Locations — les docs de + Les dotfiles et dossiers cachés dans Emplacements — les docs de .github/ et compagnie. Se bascule aussi avec ⇧⌘. (le - combo du Finder lui-même) ou View → Show Hidden Files ; chaque Location - ouverte re-scanne à la bascule.
    GitHub Markdown links Ask on first click · Open in PullMark · Open in Browser — Ask on first click
    Clicking files in Locations Preview First · Open Fully — Preview First Preview First montre un fichier d'un seul clic sans le garder — une - entrée en italique (dans Open Files, ou sous son dépôt GitHub) que l'aperçu + entrée en italique (dans Fichiers ouverts, ou sous son dépôt GitHub) que l'aperçu suivant remplace ; double-cliquez ou commencez à éditer pour le garder. Open Fully garde chaque fichier cliqué. Vaut pour les dossiers locaux comme pour les dépôts GitHub parcourus. Voir diff --git a/site/fr/docs/shortcuts/index.html b/site/fr/docs/shortcuts/index.html index f6fb03c..2fe3c98 100644 --- a/site/fr/docs/shortcuts/index.html +++ b/site/fr/docs/shortcuts/index.html @@ -101,7 +101,7 @@

    View (présentation)

    Show/Hide Outline⌥⌘ODans un document local
    Show/Hide Markdown Source⌥⌘U
    Reload Document⌘RDans un document local
    Show/Hide Hidden Files⇧⌘.Les dotfiles dans Locations — le combo du Finder lui-même
    Show/Hide Hidden Files⇧⌘.Les dotfiles dans Emplacements — le combo du Finder lui-même
    Show/Hide Margin NotesLes bulles de note dans les documents rendus
    Zoom In / Out⌘= / ⌘-⌘+ marche aussi ; le pincement et ⌘-défilement sur la page également
    Actual Size⌘0
    + une ligne de Fichiers ouverts : des notes de marge encore dans le document
    LigneSignification
    📁 icône dossierUn dossier local — ses fichiers Markdown en arborescence (ou en @@ -126,7 +126,7 @@

    Locations

    dépôt. Cliquer la pastille de branche ouvre le menu branches-et-worktrees :

    • Worktrees — chaque worktree du dépôt, avec une coche sur - celui de cette ligne ; choisissez-en un autre pour l'ouvrir comme Location + celui de cette ligne ; choisissez-en un autre pour l'ouvrir comme emplacement à part. Les worktrees ne sont jamais « checkout » ni basculés depuis PullMark — il ouvre le dossier qui est déjà là.
    • View Branch from GitHub (voir la branche depuis GitHub) — @@ -145,7 +145,7 @@

      Locations

      au-dessus de l'arborescence, pour ne jamais se noyer sous un gros dépôt ; une doc gardée visible dans l'arborescence y est simplement représentée. (Une doc simplement en cours d'aperçu s'affiche dans - Open Files, pas ici.)

      + Fichiers ouverts, pas ici.)

      Un dossier dont le chemin cesse de se résoudre (volume démonté, worktree supprimé) s'estompe avec un badge point d'interrogation au lieu de disparaître — il ressuscite tout seul quand le chemin revient.

      @@ -171,8 +171,8 @@

      Pull Requests

      pour ajouté, cercle (rouge) pour supprimé, cercle pour renommé, cercle crayon pour modifié.

      -

      Recents

      -

      Recents (récents) : les fichiers, dossiers et pull requests récemment +

      Récents

      +

      Récents : les fichiers, dossiers et pull requests récemment ouverts qui ne sont pas déjà visibles au-dessus. Les entrées de PR portent leur icône d'état en direct ; un récent dont le fichier a disparu s'estompe (badge horloge) au lieu de s'effacer, et ressuscite quand le chemin revient — @@ -182,7 +182,7 @@

      Recents

      Retirer des éléments

      Survolez n'importe quelle ligne de premier niveau pour le ✕ — il retire la ligne de la barre latérale, jamais rien du disque ni de GitHub. ⌫ sur une ligne - sélectionnée fait de même. Les fichiers dans l'arborescence d'une Location n'ont + sélectionnée fait de même. Les fichiers dans l'arborescence d'un emplacement n'ont pas de ✕ : ce sont les contenus d'un lieu, pas des éléments de la barre latérale.

      @@ -200,7 +200,7 @@

      Glossaire des icônes

    Flèches de pull requestUne pull request
    Bac de réceptionReview Requests — les PR qui attendent votre révision
    Bulle + compteurSur un fichier de PR : commentaires de révision non résolus. Sur - une ligne d'Open Files : des notes de marge encore dans le document
    Point coloré (bord gauche)Une demande de révision non lue
    ✕ dans un cercle (au survol)Retirer de la barre latérale / congédier l'aperçu
    diff --git a/site/fr/docs/toolbar/index.html b/site/fr/docs/toolbar/index.html index 80416cf..2c870e7 100644 --- a/site/fr/docs/toolbar/index.html +++ b/site/fr/docs/toolbar/index.html @@ -91,7 +91,7 @@

    Dans toutes les vues

    longtemps à une fenêtre étroite : l'état de la révision reste visible quand les autres éléments se replient dans le débordement. Open File or Folderaffiché - Ouvrir du Markdown local ou un dossier en Location. + Ouvrir du Markdown local ou un dossier en emplacement. Open Pull Requestaffiché Ouvrir une pull request GitHub par URL. Appearanceaffiché @@ -122,7 +122,7 @@

    Fichiers locaux

    Documents GitHub

    Les documents lus directement depuis un dépôt — ouverts via des liens, ⌘K, ou - une Location de dépôt parcouru.

    + un emplacement de dépôt parcouru.

    diff --git a/site/fr/docs/troubleshooting/index.html b/site/fr/docs/troubleshooting/index.html index 3341af9..1df081f 100644 --- a/site/fr/docs/troubleshooting/index.html +++ b/site/fr/docs/troubleshooting/index.html @@ -141,7 +141,7 @@

    « … changed while you were editing this block — nothi franchement au lieu d'afficher un diff vide.

    Lignes estompées : dossiers et récents « absents »

    -

    Une Location avec un badge point d'interrogation, ou un récent grisé, +

    Un emplacement avec un badge point d'interrogation, ou un récent grisé, signifie que le chemin ne se résout pas pour l'instant — un volume démonté, une branche git changée, un worktree supprimé. Les lignes s'estompent au lieu de disparaître, à dessein : elles ressuscitent d'elles-mêmes quand le chemin diff --git a/site/fr/index.html b/site/fr/index.html index a92ed37..102a0da 100644 --- a/site/fr/index.html +++ b/site/fr/index.html @@ -37,7 +37,7 @@ "url": "https://pullmark.app/fr/", "inLanguage": "fr", "downloadUrl": "https://github.com/jedijashwa/pullmark/releases/latest/download/PullMark.dmg", - "screenshot": "https://pullmark.app/img/app-doc.png", + "screenshot": "https://pullmark.app/img/fr/app-doc.png", "description": "Une app macOS native qui affiche le Markdown local tel que les lecteurs le verront et révise les pull requests GitHub riches en documentation sous forme de diffs rendus, avec les mots modifiés surlignés.", "softwareHelp": { "@type": "CreativeWork", "url": "https://pullmark.app/docs/" } } @@ -560,8 +560,8 @@

    La doc est faite pour être diffée lue.

    - - + PullMark affichant la documentation d'un projet comme une page mise en forme, gouttière de blame activée : les avatars des auteurs occupent la marge gauche, un par suite de blocs modifiés en dernier par le même commit
    La doc d'un projet, mise en forme — avec l'historique dans la marge : un avatar par suite de blocs, chacun ouvrant sur son commit.
    @@ -596,8 +596,8 @@

    Votre agent écrit des plans.
    Relisez-les comme ceux d'un collègue.

    - - + PullMark affichant une spec de conception écrite par un agent, intitulée Wind Gust Alerts, avec trois notes de marge présentées comme des cartes signées du relecteur — une note au niveau du fichier demandant une seconde version propre, une contestant l'hypothèse de fréquence d'échantillonnage de la spec, et une invoquant YAGNI sur une fonctionnalité — tandis que la barre latérale montre la spec dans un dossier docs/superpowers/specs d'un dépôt git sur la branche main
    La spec d'un agent, relue sur place : trois notes signées ancrées @@ -666,8 +666,8 @@

    Toute la révision de la doc, depuis la page rendue.

    - - + PullMark révisant une pull request de documentation : un diff rendu où un paragraphe modifié porte un surlignage mot à mot, un organigramme Mermaid ajouté s'affiche sur un fond vert de bloc ajouté, la barre latérale montre un compteur de commentaires sur le fichier, et le contrôle de révision de la barre d'outils affiche Finish your review avec trois commentaires en attente
    Une PR de documentation en diff rendu : l'unique phrase modifiée porte @@ -697,8 +697,8 @@

    Toute la révision de la doc, depuis la page rendue.

    - - + La vue d'ensemble de pull request de PullMark : le titre de la PR avec une pastille Open, une capsule Changes requested, une capsule Checks passed, les avatars des réviseurs portant leur badge de verdict, une pastille d'équipe docs-guild, la description de la PR rendue, et la chronologie de conversation dont le premier commentaire de révision montre un tableau rendu
    La conversation comme un document : les commentaires de révision @@ -728,13 +728,13 @@

    Un vrai lecteur pour le Markdown déjà sur votre disque.

    - - PullMark affichant un fichier Markdown local d'un dépôt de docs : la section Open Files de la barre latérale liste trois documents conservés et une entrée d'aperçu en italique ; la section Locations montre le dossier en arborescence de sous-dossiers et de fichiers Markdown, portant une pastille de branche git et une marque de dépôt GitHub ; les fichiers modifiés d'une pull request ouverte forment une arborescence avec icônes d'état et badge de compteur de commentaires ; le document rendu montre des titres, des listes, un lien et une alerte Tip ; la barre de titre affiche le dossier du fichier et la branche git, avec une pastille de compte de mots dans le coin + + PullMark affichant un fichier Markdown local d'un dépôt de docs : la section Fichiers ouverts de la barre latérale liste trois documents conservés et une entrée d'aperçu en italique ; la section Emplacements montre le dossier en arborescence de sous-dossiers et de fichiers Markdown, portant une pastille de branche git et une marque de dépôt GitHub ; les fichiers modifiés d'une pull request ouverte forment une arborescence avec icônes d'état et badge de compteur de commentaires ; le document rendu montre des titres, des listes, un lien et une alerte Tip ; la barre de titre affiche le dossier du fichier et la branche git, avec une pastille de compte de mots dans le coin
    Les dossiers arrivent en arborescences vivantes, chaque emplacement porte sa branche git, et la navigation montre les fichiers en aperçus — l'entrée en - italique d'Open Files que le clic suivant remplace. Les pull requests voisinent avec vos + italique de Fichiers ouverts que le clic suivant remplace. Les pull requests voisinent avec vos fichiers locaux, et la barre de titre sait où vous êtes.
    @@ -751,7 +751,7 @@

    Un vrai lecteur pour le Markdown déjà sur votre disque.

    vient de changer dans ma doc ».
  • Parcourez sans vous ensevelir — cliquez de fichier en fichier dans un dossier ou un dépôt : chacun s'affiche en aperçu, une seule entrée - en italique dans Open Files (fichiers ouverts) que le clic suivant remplace. + en italique dans Fichiers ouverts que le clic suivant remplace. Double-cliquez (ou commencez simplement à éditer) pour le garder.
  • Le plan en barre latérale — une carte de vos titres, façon navigateur, à un bouton de distance.
  • @@ -800,8 +800,8 @@

    Lir
    - - + Un document rendu en mode édition : un paragraphe révélé en source Markdown brute sur place, entouré de contenu rendu
    Le mode édition : le bloc actif montre sa source ; tout le reste demeure rendu.
    @@ -822,9 +822,9 @@

    Git
    - - PullMark affichant un fichier Markdown récupéré d'un dépôt GitHub : une barre de provenance au-dessus du contenu donne le nom du dépôt, une pastille de branche, le chemin du fichier et le commit épinglé, avec un lien Open on GitHub ; la section Locations de la barre latérale montre le dépôt avec une icône de livre et son arborescence de fichiers Markdown + + PullMark affichant un fichier Markdown récupéré d'un dépôt GitHub : une barre de provenance au-dessus du contenu donne le nom du dépôt, une pastille de branche, le chemin du fichier et le commit épinglé, avec un lien Open on GitHub ; la section Emplacements de la barre latérale montre le dépôt avec une icône de livre et son arborescence de fichiers Markdown
    Une doc lue directement depuis GitHub : la barre de provenance dit toujours où vous êtes — dépôt, branche, commit épinglé — et la pastille de branche @@ -833,8 +833,8 @@

    Git
    - - + La fenêtre Settings de PullMark sur l'onglet Appearance : trois cartes d'aperçu de thème en direct — GitHub, Editorial et Terminal — chacune rendant le même document d'exemple via le vrai pipeline, Editorial sélectionné, au-dessus de boutons ouvrant le dossier de thèmes personnalisés
    Settings → Appearance (réglages → apparence) : trois aperçus de thème en direct, rendus par le vrai pipeline — cliquez une carte pour changer.
    diff --git a/site/fr/uses/agents/index.html b/site/fr/uses/agents/index.html index 2452739..5eb1a02 100644 --- a/site/fr/uses/agents/index.html +++ b/site/fr/uses/agents/index.html @@ -451,8 +451,8 @@

    Lisez rendu. Notez sur place. Rendez la main.

    - - + PullMark affichant une spec de conception écrite par un agent, intitulée Wind Gust Alerts, avec trois notes de marge présentées comme des cartes signées du relecteur — une note au niveau du fichier demandant une seconde version propre, une contestant l'hypothèse de fréquence d'échantillonnage de la spec, et une invoquant YAGNI sur une fonctionnalité — tandis que la barre latérale montre la spec dans un dossier docs/superpowers/specs d'un dépôt git sur la branche main
    La spec d'un agent, première passe de relecture : des notes signées @@ -556,8 +556,8 @@

    Et quand la doc part bel et bien en révision…

    - - + La vue d'ensemble de pull request de PullMark : le titre de la PR avec une pastille Open, une capsule Changes requested, une capsule Checks passed, les avatars des réviseurs portant leur badge de verdict, une pastille d'équipe docs-guild, la description de la PR rendue, et la chronologie de conversation dont le premier commentaire de révision montre un tableau rendu
    Les mêmes réflexes de révision, tournés vers une pull request — la diff --git a/site/img/app-blame-dark.png b/site/img/app-blame-dark.png index e0d801c..c0482bd 100644 Binary files a/site/img/app-blame-dark.png and b/site/img/app-blame-dark.png differ diff --git a/site/img/app-blame.png b/site/img/app-blame.png index df90298..76e94bb 100644 Binary files a/site/img/app-blame.png and b/site/img/app-blame.png differ diff --git a/site/img/app-diff-dark.png b/site/img/app-diff-dark.png index 57d4f79..5b11a3d 100644 Binary files a/site/img/app-diff-dark.png and b/site/img/app-diff-dark.png differ diff --git a/site/img/app-diff.png b/site/img/app-diff.png index 773e9ba..c935c81 100644 Binary files a/site/img/app-diff.png and b/site/img/app-diff.png differ diff --git a/site/img/app-doc-dark.png b/site/img/app-doc-dark.png index f3d4122..e19e0f1 100644 Binary files a/site/img/app-doc-dark.png and b/site/img/app-doc-dark.png differ diff --git a/site/img/app-doc.png b/site/img/app-doc.png index 77eeece..56d627b 100644 Binary files a/site/img/app-doc.png and b/site/img/app-doc.png differ diff --git a/site/img/app-edit-dark.png b/site/img/app-edit-dark.png index 705102f..e2627ca 100644 Binary files a/site/img/app-edit-dark.png and b/site/img/app-edit-dark.png differ diff --git a/site/img/app-edit.png b/site/img/app-edit.png index cfd46c0..bb45923 100644 Binary files a/site/img/app-edit.png and b/site/img/app-edit.png differ diff --git a/site/img/app-notes-dark.png b/site/img/app-notes-dark.png index 18c1b3c..4b1e12d 100644 Binary files a/site/img/app-notes-dark.png and b/site/img/app-notes-dark.png differ diff --git a/site/img/app-notes.png b/site/img/app-notes.png index 0b01d63..d23ff2c 100644 Binary files a/site/img/app-notes.png and b/site/img/app-notes.png differ diff --git a/site/img/app-themes-dark.png b/site/img/app-themes-dark.png index 6400589..3c441f2 100644 Binary files a/site/img/app-themes-dark.png and b/site/img/app-themes-dark.png differ diff --git a/site/img/app-themes.png b/site/img/app-themes.png index 2a19764..7128483 100644 Binary files a/site/img/app-themes.png and b/site/img/app-themes.png differ diff --git a/site/img/de/app-blame-dark.png b/site/img/de/app-blame-dark.png new file mode 100644 index 0000000..2c0cab3 Binary files /dev/null and b/site/img/de/app-blame-dark.png differ diff --git a/site/img/de/app-blame.png b/site/img/de/app-blame.png new file mode 100644 index 0000000..a23f1d4 Binary files /dev/null and b/site/img/de/app-blame.png differ diff --git a/site/img/de/app-diff-dark.png b/site/img/de/app-diff-dark.png new file mode 100644 index 0000000..0c4d864 Binary files /dev/null and b/site/img/de/app-diff-dark.png differ diff --git a/site/img/de/app-diff.png b/site/img/de/app-diff.png new file mode 100644 index 0000000..618156a Binary files /dev/null and b/site/img/de/app-diff.png differ diff --git a/site/img/de/app-doc-dark.png b/site/img/de/app-doc-dark.png new file mode 100644 index 0000000..17e7616 Binary files /dev/null and b/site/img/de/app-doc-dark.png differ diff --git a/site/img/de/app-doc.png b/site/img/de/app-doc.png new file mode 100644 index 0000000..51a64dd Binary files /dev/null and b/site/img/de/app-doc.png differ diff --git a/site/img/de/app-edit-dark.png b/site/img/de/app-edit-dark.png new file mode 100644 index 0000000..4bbc079 Binary files /dev/null and b/site/img/de/app-edit-dark.png differ diff --git a/site/img/de/app-edit.png b/site/img/de/app-edit.png new file mode 100644 index 0000000..d8eccff Binary files /dev/null and b/site/img/de/app-edit.png differ diff --git a/site/img/de/app-notes-dark.png b/site/img/de/app-notes-dark.png new file mode 100644 index 0000000..16148f3 Binary files /dev/null and b/site/img/de/app-notes-dark.png differ diff --git a/site/img/de/app-notes.png b/site/img/de/app-notes.png new file mode 100644 index 0000000..095c1eb Binary files /dev/null and b/site/img/de/app-notes.png differ diff --git a/site/img/de/app-pr-dark.png b/site/img/de/app-pr-dark.png new file mode 100644 index 0000000..e4ceabd Binary files /dev/null and b/site/img/de/app-pr-dark.png differ diff --git a/site/img/de/app-pr.png b/site/img/de/app-pr.png new file mode 100644 index 0000000..fd8c3e3 Binary files /dev/null and b/site/img/de/app-pr.png differ diff --git a/site/img/de/app-remote-dark.png b/site/img/de/app-remote-dark.png new file mode 100644 index 0000000..e25e36f Binary files /dev/null and b/site/img/de/app-remote-dark.png differ diff --git a/site/img/de/app-remote.png b/site/img/de/app-remote.png new file mode 100644 index 0000000..a3d1ee6 Binary files /dev/null and b/site/img/de/app-remote.png differ diff --git a/site/img/de/app-themes-dark.png b/site/img/de/app-themes-dark.png new file mode 100644 index 0000000..8011877 Binary files /dev/null and b/site/img/de/app-themes-dark.png differ diff --git a/site/img/de/app-themes.png b/site/img/de/app-themes.png new file mode 100644 index 0000000..f39ce8d Binary files /dev/null and b/site/img/de/app-themes.png differ diff --git a/site/img/es/app-blame-dark.png b/site/img/es/app-blame-dark.png new file mode 100644 index 0000000..c6be520 Binary files /dev/null and b/site/img/es/app-blame-dark.png differ diff --git a/site/img/es/app-blame.png b/site/img/es/app-blame.png new file mode 100644 index 0000000..35c424d Binary files /dev/null and b/site/img/es/app-blame.png differ diff --git a/site/img/es/app-diff-dark.png b/site/img/es/app-diff-dark.png new file mode 100644 index 0000000..e0410a0 Binary files /dev/null and b/site/img/es/app-diff-dark.png differ diff --git a/site/img/es/app-diff.png b/site/img/es/app-diff.png new file mode 100644 index 0000000..76fdb7a Binary files /dev/null and b/site/img/es/app-diff.png differ diff --git a/site/img/es/app-doc-dark.png b/site/img/es/app-doc-dark.png new file mode 100644 index 0000000..1a04a39 Binary files /dev/null and b/site/img/es/app-doc-dark.png differ diff --git a/site/img/es/app-doc.png b/site/img/es/app-doc.png new file mode 100644 index 0000000..da70dde Binary files /dev/null and b/site/img/es/app-doc.png differ diff --git a/site/img/es/app-edit-dark.png b/site/img/es/app-edit-dark.png new file mode 100644 index 0000000..9e2cb58 Binary files /dev/null and b/site/img/es/app-edit-dark.png differ diff --git a/site/img/es/app-edit.png b/site/img/es/app-edit.png new file mode 100644 index 0000000..b7090eb Binary files /dev/null and b/site/img/es/app-edit.png differ diff --git a/site/img/es/app-notes-dark.png b/site/img/es/app-notes-dark.png new file mode 100644 index 0000000..0ded882 Binary files /dev/null and b/site/img/es/app-notes-dark.png differ diff --git a/site/img/es/app-notes.png b/site/img/es/app-notes.png new file mode 100644 index 0000000..d940a13 Binary files /dev/null and b/site/img/es/app-notes.png differ diff --git a/site/img/es/app-pr-dark.png b/site/img/es/app-pr-dark.png new file mode 100644 index 0000000..d531d30 Binary files /dev/null and b/site/img/es/app-pr-dark.png differ diff --git a/site/img/es/app-pr.png b/site/img/es/app-pr.png new file mode 100644 index 0000000..c96025a Binary files /dev/null and b/site/img/es/app-pr.png differ diff --git a/site/img/es/app-remote-dark.png b/site/img/es/app-remote-dark.png new file mode 100644 index 0000000..bcf686c Binary files /dev/null and b/site/img/es/app-remote-dark.png differ diff --git a/site/img/es/app-remote.png b/site/img/es/app-remote.png new file mode 100644 index 0000000..6148cf9 Binary files /dev/null and b/site/img/es/app-remote.png differ diff --git a/site/img/es/app-themes-dark.png b/site/img/es/app-themes-dark.png new file mode 100644 index 0000000..d14373a Binary files /dev/null and b/site/img/es/app-themes-dark.png differ diff --git a/site/img/es/app-themes.png b/site/img/es/app-themes.png new file mode 100644 index 0000000..dc90f5c Binary files /dev/null and b/site/img/es/app-themes.png differ diff --git a/site/img/fr/app-blame-dark.png b/site/img/fr/app-blame-dark.png new file mode 100644 index 0000000..513cfc0 Binary files /dev/null and b/site/img/fr/app-blame-dark.png differ diff --git a/site/img/fr/app-blame.png b/site/img/fr/app-blame.png new file mode 100644 index 0000000..304b2a3 Binary files /dev/null and b/site/img/fr/app-blame.png differ diff --git a/site/img/fr/app-diff-dark.png b/site/img/fr/app-diff-dark.png new file mode 100644 index 0000000..2dff0e8 Binary files /dev/null and b/site/img/fr/app-diff-dark.png differ diff --git a/site/img/fr/app-diff.png b/site/img/fr/app-diff.png new file mode 100644 index 0000000..ca2ea20 Binary files /dev/null and b/site/img/fr/app-diff.png differ diff --git a/site/img/fr/app-doc-dark.png b/site/img/fr/app-doc-dark.png new file mode 100644 index 0000000..9953e9f Binary files /dev/null and b/site/img/fr/app-doc-dark.png differ diff --git a/site/img/fr/app-doc.png b/site/img/fr/app-doc.png new file mode 100644 index 0000000..e9a9d8f Binary files /dev/null and b/site/img/fr/app-doc.png differ diff --git a/site/img/fr/app-edit-dark.png b/site/img/fr/app-edit-dark.png new file mode 100644 index 0000000..f6f749b Binary files /dev/null and b/site/img/fr/app-edit-dark.png differ diff --git a/site/img/fr/app-edit.png b/site/img/fr/app-edit.png new file mode 100644 index 0000000..7b6b875 Binary files /dev/null and b/site/img/fr/app-edit.png differ diff --git a/site/img/fr/app-notes-dark.png b/site/img/fr/app-notes-dark.png new file mode 100644 index 0000000..47cdac1 Binary files /dev/null and b/site/img/fr/app-notes-dark.png differ diff --git a/site/img/fr/app-notes.png b/site/img/fr/app-notes.png new file mode 100644 index 0000000..c4bd6f8 Binary files /dev/null and b/site/img/fr/app-notes.png differ diff --git a/site/img/fr/app-pr-dark.png b/site/img/fr/app-pr-dark.png new file mode 100644 index 0000000..d020520 Binary files /dev/null and b/site/img/fr/app-pr-dark.png differ diff --git a/site/img/fr/app-pr.png b/site/img/fr/app-pr.png new file mode 100644 index 0000000..0adeacd Binary files /dev/null and b/site/img/fr/app-pr.png differ diff --git a/site/img/fr/app-remote-dark.png b/site/img/fr/app-remote-dark.png new file mode 100644 index 0000000..209136d Binary files /dev/null and b/site/img/fr/app-remote-dark.png differ diff --git a/site/img/fr/app-remote.png b/site/img/fr/app-remote.png new file mode 100644 index 0000000..08c7fb6 Binary files /dev/null and b/site/img/fr/app-remote.png differ diff --git a/site/img/fr/app-themes-dark.png b/site/img/fr/app-themes-dark.png new file mode 100644 index 0000000..5d9e6f8 Binary files /dev/null and b/site/img/fr/app-themes-dark.png differ diff --git a/site/img/fr/app-themes.png b/site/img/fr/app-themes.png new file mode 100644 index 0000000..cef0c7b Binary files /dev/null and b/site/img/fr/app-themes.png differ diff --git a/site/img/ja/app-blame-dark.png b/site/img/ja/app-blame-dark.png new file mode 100644 index 0000000..5a60b9c Binary files /dev/null and b/site/img/ja/app-blame-dark.png differ diff --git a/site/img/ja/app-blame.png b/site/img/ja/app-blame.png new file mode 100644 index 0000000..37ef0f0 Binary files /dev/null and b/site/img/ja/app-blame.png differ diff --git a/site/img/ja/app-diff-dark.png b/site/img/ja/app-diff-dark.png new file mode 100644 index 0000000..9ad08db Binary files /dev/null and b/site/img/ja/app-diff-dark.png differ diff --git a/site/img/ja/app-diff.png b/site/img/ja/app-diff.png new file mode 100644 index 0000000..d780bbf Binary files /dev/null and b/site/img/ja/app-diff.png differ diff --git a/site/img/ja/app-doc-dark.png b/site/img/ja/app-doc-dark.png new file mode 100644 index 0000000..5d36248 Binary files /dev/null and b/site/img/ja/app-doc-dark.png differ diff --git a/site/img/ja/app-doc.png b/site/img/ja/app-doc.png new file mode 100644 index 0000000..1dde3d8 Binary files /dev/null and b/site/img/ja/app-doc.png differ diff --git a/site/img/ja/app-edit-dark.png b/site/img/ja/app-edit-dark.png new file mode 100644 index 0000000..d5fe273 Binary files /dev/null and b/site/img/ja/app-edit-dark.png differ diff --git a/site/img/ja/app-edit.png b/site/img/ja/app-edit.png new file mode 100644 index 0000000..32fa292 Binary files /dev/null and b/site/img/ja/app-edit.png differ diff --git a/site/img/ja/app-notes-dark.png b/site/img/ja/app-notes-dark.png new file mode 100644 index 0000000..8ab1daf Binary files /dev/null and b/site/img/ja/app-notes-dark.png differ diff --git a/site/img/ja/app-notes.png b/site/img/ja/app-notes.png new file mode 100644 index 0000000..7ec91ff Binary files /dev/null and b/site/img/ja/app-notes.png differ diff --git a/site/img/ja/app-pr-dark.png b/site/img/ja/app-pr-dark.png new file mode 100644 index 0000000..8aa5076 Binary files /dev/null and b/site/img/ja/app-pr-dark.png differ diff --git a/site/img/ja/app-pr.png b/site/img/ja/app-pr.png new file mode 100644 index 0000000..30d7506 Binary files /dev/null and b/site/img/ja/app-pr.png differ diff --git a/site/img/ja/app-remote-dark.png b/site/img/ja/app-remote-dark.png new file mode 100644 index 0000000..8d63d9d Binary files /dev/null and b/site/img/ja/app-remote-dark.png differ diff --git a/site/img/ja/app-remote.png b/site/img/ja/app-remote.png new file mode 100644 index 0000000..3bd56d9 Binary files /dev/null and b/site/img/ja/app-remote.png differ diff --git a/site/img/ja/app-themes-dark.png b/site/img/ja/app-themes-dark.png new file mode 100644 index 0000000..54b7cbe Binary files /dev/null and b/site/img/ja/app-themes-dark.png differ diff --git a/site/img/ja/app-themes.png b/site/img/ja/app-themes.png new file mode 100644 index 0000000..3306fe9 Binary files /dev/null and b/site/img/ja/app-themes.png differ diff --git a/site/img/nl/app-blame-dark.png b/site/img/nl/app-blame-dark.png new file mode 100644 index 0000000..f15c455 Binary files /dev/null and b/site/img/nl/app-blame-dark.png differ diff --git a/site/img/nl/app-blame.png b/site/img/nl/app-blame.png new file mode 100644 index 0000000..35f32e9 Binary files /dev/null and b/site/img/nl/app-blame.png differ diff --git a/site/img/nl/app-diff-dark.png b/site/img/nl/app-diff-dark.png new file mode 100644 index 0000000..92005ff Binary files /dev/null and b/site/img/nl/app-diff-dark.png differ diff --git a/site/img/nl/app-diff.png b/site/img/nl/app-diff.png new file mode 100644 index 0000000..ef50de8 Binary files /dev/null and b/site/img/nl/app-diff.png differ diff --git a/site/img/nl/app-doc-dark.png b/site/img/nl/app-doc-dark.png new file mode 100644 index 0000000..0d43b65 Binary files /dev/null and b/site/img/nl/app-doc-dark.png differ diff --git a/site/img/nl/app-doc.png b/site/img/nl/app-doc.png new file mode 100644 index 0000000..b1c0ac8 Binary files /dev/null and b/site/img/nl/app-doc.png differ diff --git a/site/img/nl/app-edit-dark.png b/site/img/nl/app-edit-dark.png new file mode 100644 index 0000000..d3a43b4 Binary files /dev/null and b/site/img/nl/app-edit-dark.png differ diff --git a/site/img/nl/app-edit.png b/site/img/nl/app-edit.png new file mode 100644 index 0000000..69492a1 Binary files /dev/null and b/site/img/nl/app-edit.png differ diff --git a/site/img/nl/app-notes-dark.png b/site/img/nl/app-notes-dark.png new file mode 100644 index 0000000..989d485 Binary files /dev/null and b/site/img/nl/app-notes-dark.png differ diff --git a/site/img/nl/app-notes.png b/site/img/nl/app-notes.png new file mode 100644 index 0000000..6d87e8e Binary files /dev/null and b/site/img/nl/app-notes.png differ diff --git a/site/img/nl/app-pr-dark.png b/site/img/nl/app-pr-dark.png new file mode 100644 index 0000000..39772a0 Binary files /dev/null and b/site/img/nl/app-pr-dark.png differ diff --git a/site/img/nl/app-pr.png b/site/img/nl/app-pr.png new file mode 100644 index 0000000..4090e06 Binary files /dev/null and b/site/img/nl/app-pr.png differ diff --git a/site/img/nl/app-remote-dark.png b/site/img/nl/app-remote-dark.png new file mode 100644 index 0000000..533422b Binary files /dev/null and b/site/img/nl/app-remote-dark.png differ diff --git a/site/img/nl/app-remote.png b/site/img/nl/app-remote.png new file mode 100644 index 0000000..0141c54 Binary files /dev/null and b/site/img/nl/app-remote.png differ diff --git a/site/img/nl/app-themes-dark.png b/site/img/nl/app-themes-dark.png new file mode 100644 index 0000000..a44f680 Binary files /dev/null and b/site/img/nl/app-themes-dark.png differ diff --git a/site/img/nl/app-themes.png b/site/img/nl/app-themes.png new file mode 100644 index 0000000..a45acf4 Binary files /dev/null and b/site/img/nl/app-themes.png differ diff --git a/site/img/pt/app-blame-dark.png b/site/img/pt/app-blame-dark.png new file mode 100644 index 0000000..7e48076 Binary files /dev/null and b/site/img/pt/app-blame-dark.png differ diff --git a/site/img/pt/app-blame.png b/site/img/pt/app-blame.png new file mode 100644 index 0000000..13511ff Binary files /dev/null and b/site/img/pt/app-blame.png differ diff --git a/site/img/pt/app-diff-dark.png b/site/img/pt/app-diff-dark.png new file mode 100644 index 0000000..604a812 Binary files /dev/null and b/site/img/pt/app-diff-dark.png differ diff --git a/site/img/pt/app-diff.png b/site/img/pt/app-diff.png new file mode 100644 index 0000000..50ed991 Binary files /dev/null and b/site/img/pt/app-diff.png differ diff --git a/site/img/pt/app-doc-dark.png b/site/img/pt/app-doc-dark.png new file mode 100644 index 0000000..e44333d Binary files /dev/null and b/site/img/pt/app-doc-dark.png differ diff --git a/site/img/pt/app-doc.png b/site/img/pt/app-doc.png new file mode 100644 index 0000000..74fa9a4 Binary files /dev/null and b/site/img/pt/app-doc.png differ diff --git a/site/img/pt/app-edit-dark.png b/site/img/pt/app-edit-dark.png new file mode 100644 index 0000000..f6e5205 Binary files /dev/null and b/site/img/pt/app-edit-dark.png differ diff --git a/site/img/pt/app-edit.png b/site/img/pt/app-edit.png new file mode 100644 index 0000000..68cd322 Binary files /dev/null and b/site/img/pt/app-edit.png differ diff --git a/site/img/pt/app-notes-dark.png b/site/img/pt/app-notes-dark.png new file mode 100644 index 0000000..24d7cf3 Binary files /dev/null and b/site/img/pt/app-notes-dark.png differ diff --git a/site/img/pt/app-notes.png b/site/img/pt/app-notes.png new file mode 100644 index 0000000..2c23014 Binary files /dev/null and b/site/img/pt/app-notes.png differ diff --git a/site/img/pt/app-pr-dark.png b/site/img/pt/app-pr-dark.png new file mode 100644 index 0000000..93ba614 Binary files /dev/null and b/site/img/pt/app-pr-dark.png differ diff --git a/site/img/pt/app-pr.png b/site/img/pt/app-pr.png new file mode 100644 index 0000000..1f9bc9d Binary files /dev/null and b/site/img/pt/app-pr.png differ diff --git a/site/img/pt/app-remote-dark.png b/site/img/pt/app-remote-dark.png new file mode 100644 index 0000000..fcbb943 Binary files /dev/null and b/site/img/pt/app-remote-dark.png differ diff --git a/site/img/pt/app-remote.png b/site/img/pt/app-remote.png new file mode 100644 index 0000000..6a999e1 Binary files /dev/null and b/site/img/pt/app-remote.png differ diff --git a/site/img/pt/app-themes-dark.png b/site/img/pt/app-themes-dark.png new file mode 100644 index 0000000..bf75d67 Binary files /dev/null and b/site/img/pt/app-themes-dark.png differ diff --git a/site/img/pt/app-themes.png b/site/img/pt/app-themes.png new file mode 100644 index 0000000..e4ae291 Binary files /dev/null and b/site/img/pt/app-themes.png differ diff --git a/site/img/zh/app-blame-dark.png b/site/img/zh/app-blame-dark.png new file mode 100644 index 0000000..5ef1b7f Binary files /dev/null and b/site/img/zh/app-blame-dark.png differ diff --git a/site/img/zh/app-blame.png b/site/img/zh/app-blame.png new file mode 100644 index 0000000..4e36ce9 Binary files /dev/null and b/site/img/zh/app-blame.png differ diff --git a/site/img/zh/app-diff-dark.png b/site/img/zh/app-diff-dark.png new file mode 100644 index 0000000..fe1da3c Binary files /dev/null and b/site/img/zh/app-diff-dark.png differ diff --git a/site/img/zh/app-diff.png b/site/img/zh/app-diff.png new file mode 100644 index 0000000..a93e34d Binary files /dev/null and b/site/img/zh/app-diff.png differ diff --git a/site/img/zh/app-doc-dark.png b/site/img/zh/app-doc-dark.png new file mode 100644 index 0000000..050412f Binary files /dev/null and b/site/img/zh/app-doc-dark.png differ diff --git a/site/img/zh/app-doc.png b/site/img/zh/app-doc.png new file mode 100644 index 0000000..26e66fa Binary files /dev/null and b/site/img/zh/app-doc.png differ diff --git a/site/img/zh/app-edit-dark.png b/site/img/zh/app-edit-dark.png new file mode 100644 index 0000000..822f52f Binary files /dev/null and b/site/img/zh/app-edit-dark.png differ diff --git a/site/img/zh/app-edit.png b/site/img/zh/app-edit.png new file mode 100644 index 0000000..761b591 Binary files /dev/null and b/site/img/zh/app-edit.png differ diff --git a/site/img/zh/app-notes-dark.png b/site/img/zh/app-notes-dark.png new file mode 100644 index 0000000..3c5bca8 Binary files /dev/null and b/site/img/zh/app-notes-dark.png differ diff --git a/site/img/zh/app-notes.png b/site/img/zh/app-notes.png new file mode 100644 index 0000000..f5bce73 Binary files /dev/null and b/site/img/zh/app-notes.png differ diff --git a/site/img/zh/app-pr-dark.png b/site/img/zh/app-pr-dark.png new file mode 100644 index 0000000..fe6e69f Binary files /dev/null and b/site/img/zh/app-pr-dark.png differ diff --git a/site/img/zh/app-pr.png b/site/img/zh/app-pr.png new file mode 100644 index 0000000..7cabd50 Binary files /dev/null and b/site/img/zh/app-pr.png differ diff --git a/site/img/zh/app-remote-dark.png b/site/img/zh/app-remote-dark.png new file mode 100644 index 0000000..2e33355 Binary files /dev/null and b/site/img/zh/app-remote-dark.png differ diff --git a/site/img/zh/app-remote.png b/site/img/zh/app-remote.png new file mode 100644 index 0000000..8a637ef Binary files /dev/null and b/site/img/zh/app-remote.png differ diff --git a/site/img/zh/app-themes-dark.png b/site/img/zh/app-themes-dark.png new file mode 100644 index 0000000..759c73c Binary files /dev/null and b/site/img/zh/app-themes-dark.png differ diff --git a/site/img/zh/app-themes.png b/site/img/zh/app-themes.png new file mode 100644 index 0000000..3bd3d19 Binary files /dev/null and b/site/img/zh/app-themes.png differ diff --git a/site/index.html b/site/index.html index b3d0f46..ed5b617 100644 --- a/site/index.html +++ b/site/index.html @@ -559,8 +559,8 @@

    Docs are meant to be diffed read.

    - - + PullMark rendering a project's documentation as a formatted page, with the blame gutter on: author avatars sit in the left margin, one per run of blocks last touched by the same commit
    A project doc, formatted — with history in the margin: one avatar per run of blocks, each one a doorway to its commit.
    @@ -594,8 +594,8 @@

    Your agent writes plans.
    Review them like a coworker's.

    - - + PullMark rendering an agent-written design spec titled Wind Gust Alerts with three margin notes shown as signed cards from the reviewer — a file-level note asking for a clean second revision, one challenging the spec's sampling-rate assumption, and one calling YAGNI on a feature — while the sidebar shows the spec in a docs/superpowers/specs folder of a git repository on branch main
    An agent's spec, reviewed in place: three signed notes anchored @@ -659,8 +659,8 @@

    The whole docs review, from the rendered page.

    - - + PullMark reviewing a documentation pull request: a rendered diff where a changed paragraph carries word-level highlights, an added Mermaid flowchart renders on a green added-block tint, the sidebar shows a comment count on the file, and the toolbar's review control reads Finish your review with three pending comments
    A documentation PR as a rendered diff: the one changed sentence @@ -689,8 +689,8 @@

    The whole docs review, from the rendered page.

    - - + PullMark's pull-request overview: the PR title with an Open chip, a Changes requested capsule, a Checks passed capsule, reviewer avatars wearing verdict badges, a docs-guild team chip, the PR description rendered, and the conversation timeline whose first review comment shows a rendered table
    The conversation as a document: review comments render their @@ -719,8 +719,8 @@

    A proper reader for the Markdown already on your disk.

    - - + PullMark rendering a local Markdown file from a docs repo: the sidebar's Open Files section lists three kept documents and one italicized preview entry; the Locations section shows the folder as a tree of subfolders and Markdown files, wearing a git branch chip and a GitHub repo mark; an open pull request's changed files form a tree with status icons and a comment-count badge; the rendered document shows headings, lists, a link, and a Tip alert; the titlebar shows the file's folder and git branch, with a word-count pill in the corner
    Folders come in as living trees, every location wears its git branch, and @@ -783,8 +783,8 @@

    Rea
    - - + A rendered document in edit mode: one paragraph revealed as raw Markdown source in place, surrounded by rendered content
    Edit mode: the active block shows its source; everything else stays rendered.
    @@ -803,8 +803,8 @@

    Git
    - - + PullMark rendering a Markdown file fetched from a GitHub repository: a provenance bar above the content reads the repository name, a branch chip, the file path, and the pinned commit, with an Open on GitHub link; the sidebar's Locations section shows the repository with a book icon and its Markdown file tree
    A doc read straight from GitHub: the provenance bar always says where you @@ -814,8 +814,8 @@

    Git
    - - + PullMark's Settings window on the Appearance tab: three live theme preview cards — GitHub, Editorial, and Terminal — each rendering the same sample document through the real pipeline, with Editorial selected, above buttons for opening the custom Themes folder
    Settings → Appearance: three live theme previews, rendered by the real pipeline — click a card to switch.
    diff --git a/site/ja/docs/cli/index.html b/site/ja/docs/cli/index.html index 211eed4..f671762 100644 --- a/site/ja/docs/cli/index.html +++ b/site/ja/docs/cli/index.html @@ -97,10 +97,10 @@

    開くと何が起きるか

    ルールはあえて退屈にしてあります。スクリプトが安心して頼れるように。

    • ファイルは、サイドバーの - Open Files セクションにピン留めされた項目として + 「開いているファイル」セクションにピン留めされた項目として 並び、最後に渡したファイルが表示されます。
    • フォルダは——git のワークツリーも含めて—— - Locations になります。中の Markdown ファイルを + 「場所」になります。中の Markdown ファイルを ブラウズできるツリーです。
    • すでに起動している? すべては最前面のウィンドウで開きます。アプリの 2 つ目のインスタンスが立ち上がることはありません。
    • @@ -111,14 +111,14 @@

      開くと何が起きるか

    ワークツリーと、ひとつのファイルを指し示すこと

    -

    フォルダとファイルを一緒に渡せば、両方のふるまいが同時に起きます。フォルダは Location として +

    フォルダとファイルを一緒に渡せば、両方のふるまいが同時に起きます。フォルダは「場所」として 開き、ファイルはピン留めされて表示される。「このワークツリーを開いて、このドキュメントを見せて」 のレシピは、これで全部です。

    $ pullmark ~/wt/feature ~/wt/feature/docs/plan.md
    -

    ワークツリーのツリーは Locations に着地し(ワークツリーもただの git チェックアウトなので、 - ブランチチップ付きで)、plan.md は Open Files にピン留めされてレンダリングされます。 +

    ワークツリーのツリーは「場所」に着地し(ワークツリーもただの git チェックアウトなので、 + ブランチチップ付きで)、plan.md は「開いているファイル」にピン留めされてレンダリングされます。 右クリックして Reveal in Location を選べば、ツリーの中のその居場所へ飛べます。 - Location がすでに開いていたときも同じです——その中にあるファイルを開いても、世界がもうひとつ + 「場所」がすでに開いていたときも同じです——その中にあるファイルを開いても、世界がもうひとつ できることはなく、作業セットに 1 行が増えるだけです。

    フォルダとファイルの組み合わせに順番は関係ありませんが、表示されるのは最後に渡した ファイルです。画面に出したい文書は、最後に置いてください。

    @@ -135,7 +135,7 @@

    シェルから、レンダリングされた差分を

    $ pullmark --diff-with=old.md new.md # 2 つのファイル、old.md が基準 $ pullmark --diff ~/wt/feature ~/wt/feature/docs/plan.md # ワークツリーと、差分の plan.md -

    一緒に渡したフォルダは変わらず Location として開きますし、どの形にも、ツールバーの +

    一緒に渡したフォルダは変わらず「場所」として開きますし、どの形にも、ツールバーの Compare メニューにアプリ内の双子がいます(Compare Revisions…Compare with File… を含めて)。--diff--diff-with はあくまでフラグであってサブコマンドではないので、たまたま @@ -152,7 +152,7 @@

    終了コード

    $ pullmark README.md                      # ファイルをひとつ読む
     $ pullmark ~/notes                        # フォルダをブラウズする
    -$ pullmark docs specs/design.md           # Location ひとつと文書ひとつ
    +$ pullmark docs specs/design.md           # 「場所」ひとつと文書ひとつ
     $ pullmark ~/wt/feature docs/plan.md      # ワークツリーと、見せたい文書
     $ pullmark --diff docs/plan.md            # 直近の編集が変えたもの
     $ pullmark -- --weird-filename.md         # -- でオプション解析を終える
    diff --git a/site/ja/docs/experimental/margin-notes/index.html b/site/ja/docs/experimental/margin-notes/index.html index 852cbf0..b2ef3da 100644 --- a/site/ja/docs/experimental/margin-notes/index.html +++ b/site/ja/docs/experimental/margin-notes/index.html @@ -96,7 +96,7 @@

    PullMark で使う

  • Edit / Delete — ノートの吹き出しにホバーすると操作が出ます。ノートを 削除することが、解決するということ。状態もアーカイブもありません——対応されたノートとは、 そこに無いノートです。
  • -
  • チップ — 文書がまだノートを抱えているあいだ、Open Files の行には +
  • チップ — 文書がまだノートを抱えているあいだ、「開いているファイル」の行には コメント数のチップが付きます。それは生きています。エージェントがファイルを片づけながら ノートを消していくにつれ、数は減り、吹き出しは目の前で消えていきます。
  • そのほかの場所では — ブラウズ中の GitHub ファイルでは読み取り専用で diff --git a/site/ja/docs/features/index.html b/site/ja/docs/features/index.html index a574365..8daaf9a 100644 --- a/site/ja/docs/features/index.html +++ b/site/ja/docs/features/index.html @@ -78,7 +78,7 @@

    読む

    書き出します(図は本物の SVG として)。
  • 生きているファイル — どのエディタから保存しても文書は再レンダリング されます。相対パスの画像とリンクは解決され、別の Markdown ファイルへのリンクをクリック - すればその場で開きます(開いている Location 内にあるファイルは + すればその場で開きます(開いている「場所」内にあるファイルは プレビューとして)。
  • ナビゲーション — アウトラインサイドバー(⌥⌘O)、⌘F のページ内検索、 ⇧⌘F のサイドバー全ファイル検索、そして ⌘K の Open Quickly。見出し・ファイル・PR・最近の @@ -124,11 +124,11 @@

    GitHub を、ブラウザなしで

    デフォルトの逆)。出所バーが owner/repo @ ref · path を固定表示し、GitHub への 戻り道も用意します。
  • リポジトリ丸ごとブラウズ — リポジトリの Markdown ツリーを - Locations に読み込み、ブランチを切り替え、 + 「場所」に読み込み、ブランチを切り替え、 他ブランチと比較し、blame を表示。プライベートリポジトリは PR がすでに使っている認証情報を 使い、取得した内容はディスクに一切触れません。
  • ブランチとワークツリー — ローカルのチェックアウトにはブランチチップが - 付き、そのメニューからワークツリーを独立した Location として開いたり、他のブランチを + 付き、そのメニューからワークツリーを独立した「場所」として開いたり、他のブランチを リモートから読んだりできます。ブランチをすでに持つワークツリーがあれば、つねにローカルが リモートに勝ちます。
  • diff --git a/site/ja/docs/index.html b/site/ja/docs/index.html index 921e57d..bba6910 100644 --- a/site/ja/docs/index.html +++ b/site/ja/docs/index.html @@ -73,7 +73,7 @@

    PullMark を、文書で読む

  • サイドバー

    -

    Open Files、プレビュー、Locations、Pull Requests、Recents——そして +

    「開いているファイル」、プレビュー、「場所」、Pull Requests、「最近使った項目」——そして すべてのアイコンとチップの意味。

  • diff --git a/site/ja/docs/settings/index.html b/site/ja/docs/settings/index.html index b8cd75f..4c991fa 100644 --- a/site/ja/docs/settings/index.html +++ b/site/ja/docs/settings/index.html @@ -77,9 +77,9 @@

    読む

  • - + 切り替えられ、切り替えるたびに開いているすべての「場所」が再スキャンされます。 @@ -89,7 +89,7 @@

    読む

    diff --git a/site/ja/docs/shortcuts/index.html b/site/ja/docs/shortcuts/index.html index ebfe28f..04ab475 100644 --- a/site/ja/docs/shortcuts/index.html +++ b/site/ja/docs/shortcuts/index.html @@ -100,7 +100,7 @@

    View(表示)

    - + diff --git a/site/ja/docs/sidebar/index.html b/site/ja/docs/sidebar/index.html index d0187d7..918d160 100644 --- a/site/ja/docs/sidebar/index.html +++ b/site/ja/docs/sidebar/index.html @@ -4,7 +4,7 @@ サイドバー — PullMark ドキュメント - + @@ -16,7 +16,7 @@ - + @@ -65,16 +65,16 @@

    サイドバー

    整理されています。いま開いているもの、ブラウズする場所、レビュー中のプルリクエスト、そして これまでの足取り。

    -

    Open Files(開いているファイル)

    +

    開いているファイル

    作業セットです。Finder から、ドラッグ & ドロップで、⌘O で、 - コマンドラインから、あるいは Location のファイルを確定して—— + コマンドラインから、あるいは「場所」のファイルを確定して—— 明示的に開いたすべての文書が並びます。フラットな一覧で、ドラッグで並べ替えられ、各行はホバーで 現れる ✕(または選択して ⌫)で外せます。セクション見出しを右クリックすると Close All(すべて閉じる)。

    プレビュー

    -

    Location 内のファイルをシングルクリックすると、すぐにレンダリングされます——そして - Open Files にはプレビューとして現れます。斜体の 1 行が、つねにセクションの最後に +

    「場所」内のファイルをシングルクリックすると、すぐにレンダリングされます——そして + 「開いているファイル」にはプレビューとして現れます。斜体の 1 行が、つねにセクションの最後に 置かれるのです。別のファイルをクリックすればプレビュー行は入れ替わるので、大きなツリーを ブラウズしても行が積み上がりません。VS Code のプレビュータブや Xcode の一時エディタと同じ 発想で、同じ斜体をまとっています。

    @@ -90,18 +90,18 @@

    プレビュー

    Clicking files in Locations を切り替えて ください。

    リモートリポジトリも、同じ場所で同じようにプレビューされます。 - GitHub リポジトリのツリーをブラウズしても、リモート文書内のリンクをたどっても、Open Files に + GitHub リポジトリのツリーをブラウズしても、リモート文書内のリンクをたどっても、「開いているファイル」に 現れるのは同じ斜体の 1 行——ただしファイルが Mac 上にないので、本のアイコンと owner/repo @ ref の 2 行目が付きます。プレビューはウィンドウごとにつねに ひとつだけ、ローカルでもリモートでも同じ。何かをプレビューすれば、それまでの プレビューは置き換わります。リモート文書の確定(ダブルクリックまたは Keep Open)は、その文書を - リポジトリのもとへ整理すること——Locations にあるそのリポジトリのピン留めリストに移ります。 + リポジトリのもとへ整理すること——「場所」にあるそのリポジトリのピン留めリストに移ります。 ⌘K からは直接ピン留めで開きます。URL を貼り付けるのは、明確な意図だからです。

    -

    開いている Location の中にある Open Files の行には、右クリックメニューに +

    開いた「場所」の中にある「開いているファイル」の行には、右クリックメニューに Reveal in Location が加わります。「いま読んでいるもの」から「それが住んでいる 場所」への帰り道です。

    -

    Locations(場所)

    +

    場所

    ブラウズできるルートたち。どこにあるかは問いません。アイコンで区別される 2 種類が 同居します。

    ÉlémentDéfautRôle
    CompareaffichéLe même document sur une autre branche, en diff rendu.
    PullMark を最後に終了したとき、サイドバーにあったものを開き直します——ファイル、 フォルダ、PR、ブラウズ中のリポジトリ、そしてプレビューの項目も(プレビューのまま)。
    Show hidden fileson/off — offLocations の中のドットファイルと隠しフォルダ——.github/ のドキュメントや + 「場所」の中のドットファイルと隠しフォルダ——.github/ のドキュメントや その仲間たち。⇧⌘.(Finder と同じ組み合わせ)や View → Show Hidden Files でも - 切り替えられ、切り替えるたびに開いているすべての Location が再スキャンされます。
    GitHub Markdown links Ask on first click ・ Open in PullMark ・ Open in Browser — Ask on first click
    Clicking files in Locations Preview First ・ Open Fully — Preview First Preview First は、クリック 1 回でファイルを見せながら、手元には残しません——斜体の - 1 行(Open Files、またはその GitHub リポジトリの下)が、次のプレビューで入れ替わります。 + 1 行(「開いているファイル」、またはその GitHub リポジトリの下)が、次のプレビューで入れ替わります。 ダブルクリックか、編集を始めれば残ります。Open Fully はクリックしたファイルをすべて 残します。ローカルフォルダにも、ブラウズ中の GitHub リポジトリにも同じように働きます。 プレビューを参照。
    Show/Hide Outline⌥⌘Oローカル文書で
    Show/Hide Markdown Source⌥⌘U
    Reload Document⌘Rローカル文書で
    Show/Hide Hidden Files⇧⌘.Locations の中のドットファイル——Finder と同じ組み合わせ
    Show/Hide Hidden Files⇧⌘.「場所」の中のドットファイル——Finder と同じ組み合わせ
    Show/Hide Margin Notesレンダリングされた文書の中の、ノートの吹き出し
    Zoom In / Out⌘= / ⌘-⌘+ でも動きます。ページ上でのピンチと ⌘ + スクロールも同様に
    Actual Size⌘0
    @@ -117,7 +117,7 @@

    Locations(場所)

    開きます。

    • Worktrees — リポジトリの全ワークツリー。この行のワークツリーに - チェックマークが付き、別のものを選ぶと独立した Location として開きます。ワークツリーの + チェックマークが付き、別のものを選ぶと独立した「場所」として開きます。ワークツリーの チェックアウトや切り替えを PullMark が行うことはありません——すでにそこにあるフォルダを 開くだけです。
    • View Branch from GitHub — チェックアウトに触れずに、別ブランチの @@ -130,12 +130,12 @@

      Locations(場所)

      Open Branch Separately で並べて読めます。Browse Repo Files… はリポジトリの Markdown ツリー全体を読み込みます。確定済みの文書はツリーの上に並ぶので、 大きなリポジトリに埋もれません。ツリー内に見えている確定済みの文書は、単にそこで表される - だけです。(単にプレビュー中の文書は Open Files に表示され、ここには + だけです。(単にプレビュー中の文書は「開いているファイル」に表示され、ここには 現れません。)

      パスが解決できなくなったフォルダ(マウント解除されたボリューム、削除されたワークツリー)は、 消える代わりに疑問符バッジ付きで淡色表示になり、パスが戻れば自動的に復活します。

      -

      Pull Requests(プルリクエスト)

      +

      プルリクエスト

      開いた PR はそれぞれグループになります。概要行(ステータスアイコン + 変更された Markdown の 数)に続いて、変更された Markdown ファイルが並び、未解決のレビュースレッドがあるファイルには 件数付きのコメントバブルが付きます。開いた PR の下には Review Requests—— @@ -153,7 +153,7 @@

      Pull Requests(プルリクエスト)

      PR 内のファイルごとのマーカーは、追加が + の丸(緑)、削除が の丸(赤)、リネームが の丸、変更が鉛筆の丸です。

      -

      Recents(最近の項目)

      +

      最近使った項目

      最近開いたファイル・フォルダ・プルリクエストのうち、上のセクションにまだ見えていないもの。 PR の行はライブなステータスアイコンをまといます。ファイルが行方不明になった項目は、消える 代わりに(時計バッジ付きで)淡色表示になり、パスが戻れば復活します——ブランチの切り替えや @@ -162,7 +162,7 @@

      Recents(最近の項目)

      項目を取り除く

      最上位の行にホバーすると ✕ が現れます——外れるのはサイドバーの行だけで、ディスクや GitHub - からは何も消えません。選択した行での ⌫ も同じです。Location のツリー内のファイルに ✕ は + からは何も消えません。選択した行での ⌫ も同じです。「場所」のツリー内のファイルに ✕ は ありません。それらは場所の中身であって、サイドバーの項目ではないからです。

      アイコン一覧

      @@ -178,7 +178,7 @@

      アイコン一覧

    - diff --git a/site/ja/docs/toolbar/index.html b/site/ja/docs/toolbar/index.html index df4a8b3..724ba46 100644 --- a/site/ja/docs/toolbar/index.html +++ b/site/ja/docs/toolbar/index.html @@ -85,7 +85,7 @@

    すべてのビューで

    送信。狭いウィンドウでいちばん長く生き残ります。ほかの項目がオーバーフローに畳まれても、 レビューの状態は見えたままです。 - + @@ -114,7 +114,7 @@

    ローカルファイル

    ブランチ記号 + 名前ブランチチップ——クリックでブランチとワークツリー
    プルリクエストの矢印プルリクエスト
    トレイReview Requests——あなたのレビュー待ちの PR
    吹き出し + 件数PR のファイル上では、未解決のレビューコメント。Open Files の +
    吹き出し + 件数PR のファイル上では、未解決のレビューコメント。「開いているファイル」の 行では、文書に残っているマージンノート
    色付きドット(左端)未読のレビューリクエスト
    丸の中の ✕(ホバー時)サイドバーから取り除く/プレビューを閉じる
    Open File or Folder表示ローカルの Markdown、またはフォルダの Location を開きます。
    ローカルの Markdown、またはフォルダを「場所」として開きます。
    Open Pull Request表示 GitHub のプルリクエストを URL で開きます。
    Appearance表示

    GitHub のドキュメント

    -

    リポジトリから直に読む文書です——リンク、⌘K、あるいはブラウズ中のリポジトリ Location から +

    リポジトリから直に読む文書です——リンク、⌘K、あるいはブラウズ中のリポジトリの「場所」から 開いたもの。

    diff --git a/site/ja/docs/troubleshooting/index.html b/site/ja/docs/troubleshooting/index.html index d720319..0abc693 100644 --- a/site/ja/docs/troubleshooting/index.html +++ b/site/ja/docs/troubleshooting/index.html @@ -128,7 +128,7 @@

    「… changed while you were editing this block — nothing wa 代わりに、そうとはっきり伝えます。

    淡くなった行——「そこに無い」フォルダと最近の項目

    -

    疑問符バッジの付いた Location や、グレーになった最近の項目は、いまそのパスが解決できない +

    疑問符バッジの付いた「場所」や、グレーになった最近の項目は、いまそのパスが解決できない という意味です——マウント解除されたボリューム、切り替えた git ブランチ、削除されたワーク ツリー。行が消えずに淡くなるのは、わざとです。パスが戻れば、自動的に復活します。もう生きて いない最近の項目をクリックすると、Remove from Recents か diff --git a/site/ja/index.html b/site/ja/index.html index 7b085c5..73a2ffa 100644 --- a/site/ja/index.html +++ b/site/ja/index.html @@ -36,7 +36,7 @@ "license": "https://github.com/jedijashwa/pullmark/blob/main/LICENSE", "url": "https://pullmark.app/ja/", "downloadUrl": "https://github.com/jedijashwa/pullmark/releases/latest/download/PullMark.dmg", - "screenshot": "https://pullmark.app/img/app-doc.png", + "screenshot": "https://pullmark.app/img/ja/app-doc.png", "description": "ローカルの Markdown を読み手が目にするその姿でレンダリングし、ドキュメント中心の GitHub プルリクエストを、単語単位のハイライト付きレンダリング差分としてレビューできるネイティブ macOS アプリ。", "softwareHelp": { "@type": "CreativeWork", "url": "https://pullmark.app/docs/" }, "inLanguage": "ja" @@ -559,8 +559,8 @@

    ドキュメントは、差分を取る 読むため
    - - + プロジェクトのドキュメントを整形されたページとしてレンダリングする PullMark。blame ガターがオンで、左余白には作者のアバターが、同じコミットで最後に変更された連続ブロックのまとまりごとにひとつずつ並んでいる
    整形されたプロジェクトドキュメント。余白には履歴——連続するブロックのまとまりごとにアバターがひとつ、それぞれがコミットへの入り口です。
    @@ -591,8 +591,8 @@

    エージェントは計画を書く。
    それを、同僚の文書のよ

    - - + Wind Gust Alerts と題されたエージェント作の設計仕様書をレンダリングする PullMark。レビュアーの署名付きカードとして 3 件のマージンノートが表示されている——きれいな第 2 稿を求めるファイルレベルのノート、仕様のサンプリングレートの前提に異議を唱えるノート、ある機能に YAGNI を宣告するノート。サイドバーには、ブランチ main の git リポジトリの docs/superpowers/specs フォルダにこの仕様書が見えている
    エージェントの仕様書を、その場でレビュー。3 件の署名付きノートが異議のあるブロックに @@ -653,8 +653,8 @@

    ドキュメントレビューのすべてを、レンダリングされた
    - - + ドキュメントのプルリクエストをレビューする PullMark。レンダリングされた差分では変更された段落に単語単位のハイライトが乗り、追加された Mermaid フローチャートが緑の追加ブロックの色合いの上にレンダリングされている。サイドバーはファイルのコメント数を示し、ツールバーのレビューコントロールには保留中のコメント 3 件とともに Finish your review と表示されている
    レンダリングされた差分としてのドキュメント PR。変わった一文には単語単位のハイライトが @@ -683,8 +683,8 @@

    ドキュメントレビューのすべてを、レンダリングされた
    - - + PullMark のプルリクエスト概要。Open チップ付きの PR タイトル、Changes requested カプセル、Checks passed カプセル、判定バッジをまとったレビュアーのアバター、docs-guild チームのチップ、レンダリングされた PR 説明、そして最初のレビューコメントに表が表として表示されている会話のタイムライン
    会話もドキュメントとして。レビューコメントの中の表は表としてレンダリングされ、 @@ -713,12 +713,12 @@

    ディスクの上にすでにある Markdown のための、ちゃんとし
    - - docs リポジトリのローカル Markdown ファイルをレンダリングする PullMark。サイドバーの Open Files セクションには確定済みの文書 3 件と斜体のプレビュー 1 件。Locations セクションにはフォルダがサブフォルダと Markdown ファイルのツリーとして表示され、git ブランチのチップと GitHub リポジトリのマークをまとっている。開いているプルリクエストの変更ファイルはステータスアイコンとコメント数バッジ付きのツリーを成し、レンダリングされた文書には見出し・リスト・リンク・Tip アラートが見える。タイトルバーにはファイルのフォルダと git ブランチ、隅には語数のピルが表示されている + + docs リポジトリのローカル Markdown ファイルをレンダリングする PullMark。サイドバーの「開いているファイル」セクションには確定済みの文書 3 件と斜体のプレビュー 1 件。「場所」セクションにはフォルダがサブフォルダと Markdown ファイルのツリーとして表示され、git ブランチのチップと GitHub リポジトリのマークをまとっている。開いているプルリクエストの変更ファイルはステータスアイコンとコメント数バッジ付きのツリーを成し、レンダリングされた文書には見出し・リスト・リンク・Tip アラートが見える。タイトルバーにはファイルのフォルダと git ブランチ、隅には語数のピルが表示されている
    フォルダは生きたツリーとして並び、どの場所にも git ブランチが添えられ、ブラウズ中の - ファイルはプレビュー——Open Files(開いているファイル)に現れる斜体の 1 行で、次の + ファイルはプレビュー——「開いているファイル」に現れる斜体の 1 行で、次の クリックで入れ替わります。プルリクエストはローカルファイルの隣に並び、タイトルバーは今いる場所を 心得ています。
    @@ -733,7 +733,7 @@

    ディスクの上にすでにある Markdown のための、ちゃんとし pullmark --diff ならターミナルから——「エージェントはいま自分のドキュメントに 何をした?」への最速の答えです。
  • 埋もれないブラウズ — フォルダやリポジトリをシングルクリックでたどると、 - 各ファイルはプレビューとして開きます。Open Files に置かれる斜体の 1 行だけが使われ、 + 各ファイルはプレビューとして開きます。「開いているファイル」に置かれる斜体の 1 行だけが使われ、 次のクリックで入れ替わります。ダブルクリック(または編集の開始)で確定です。
  • アウトラインサイドバー — 見出しを一望するナビゲータ風マップ。トグル ひとつで現れます。
  • @@ -774,8 +774,8 @@

    - - + 編集モードのレンダリングされた文書。ひとつの段落だけが生の Markdown ソースとしてその場に現れ、まわりはレンダリングされた内容のまま
    編集モード。アクティブなブロックはソースを見せ、それ以外はレンダリングされたままです。
    @@ -794,9 +794,9 @@

    Git
    - - GitHub リポジトリから取得した Markdown ファイルをレンダリングする PullMark。本文の上の出所バーにはリポジトリ名、ブランチのチップ、ファイルパス、固定されたコミットが並び、Open on GitHub リンクがある。サイドバーの Locations セクションには本のアイコン付きのリポジトリとその Markdown ファイルツリーが見えている + + GitHub リポジトリから取得した Markdown ファイルをレンダリングする PullMark。本文の上の出所バーにはリポジトリ名、ブランチのチップ、ファイルパス、固定されたコミットが並び、Open on GitHub リンクがある。サイドバーの「場所」セクションには本のアイコン付きのリポジトリとその Markdown ファイルツリーが見えている
    GitHub から直接読むドキュメント。出所バーがつねに現在地——リポジトリ、ブランチ、 固定されたコミット——を告げ、ブランチのチップはページを離れずに切り替えも別ブランチのオープンも @@ -805,8 +805,8 @@

    Git
    - - + PullMark の設定ウィンドウ、Appearance タブ。GitHub・Editorial・Terminal の 3 枚のライブテーマプレビューカードが同じサンプル文書を実際のパイプラインでレンダリングしており、Editorial が選択されている。下にはカスタムの Themes フォルダを開くボタン
    Settings → Appearance(設定 → 外観)。実際のパイプラインでレンダリングされる 3 枚の diff --git a/site/ja/uses/agents/index.html b/site/ja/uses/agents/index.html index 7409195..62d1abe 100644 --- a/site/ja/uses/agents/index.html +++ b/site/ja/uses/agents/index.html @@ -447,8 +447,8 @@

    レンダリングで読む。その場に書き込む。そのまま返す
    - - + Wind Gust Alerts と題されたエージェント作の設計仕様書をレンダリングする PullMark。レビュアーの署名付きカードとして 3 件のマージンノートが表示されている——きれいな第 2 稿を求めるファイルレベルのノート、仕様のサンプリングレートの前提に異議を唱えるノート、ある機能に YAGNI を宣告するノート。サイドバーには、ブランチ main の git リポジトリの docs/superpowers/specs フォルダにこの仕様書が見えている
    エージェントの仕様書への、最初のレビューパス。署名付きノートが該当ブロックに @@ -542,8 +542,8 @@

    そして、ドキュメントが本当にレビューへ上がるときは
    - - + PullMark のプルリクエスト概要。Open チップ付きの PR タイトル、Changes requested カプセル、Checks passed カプセル、判定バッジをまとったレビュアーのアバター、docs-guild チームのチップ、レンダリングされた PR 説明、そして最初のレビューコメントに表が表として表示されている会話のタイムライン
    同じレビューの勘どころを、プルリクエストに向けただけ——レビュー機能の全体は diff --git a/site/nl/docs/cli/index.html b/site/nl/docs/cli/index.html index e9517c6..dacc6a7 100644 --- a/site/nl/docs/cli/index.html +++ b/site/nl/docs/cli/index.html @@ -100,11 +100,11 @@

    Wat openen doet

    bouwen:

    • Bestanden landen in de sectie - Open Files van de zijbalk + Geopende bestanden van de zijbalk als vastgezette regels, en het laatst doorgegeven bestand wordt getoond.
    • Mappen — inclusief git-worktrees — worden - Locations: doorbladerbare + Locaties: doorbladerbare bomen van de Markdown-bestanden erin.
    • Draait de app al? Alles opent in het voorste venster. Er wordt nooit een tweede app-instantie gestart.
    • @@ -117,15 +117,15 @@

      Wat openen doet

      Worktrees, en naar één bestand wijzen

      Geef een map en een bestand samen door en je krijgt beide - gedragingen tegelijk: de map opent als Location, het bestand opent + gedragingen tegelijk: de map opent als Locatie, het bestand opent vastgezet en wordt getoond. Dat is het hele recept voor "open deze worktree en laat me dit doc zien":

      $ pullmark ~/wt/feature ~/wt/feature/docs/plan.md
      -

      De boom van de worktree landt in Locations (met zijn branch-chip, +

      De boom van de worktree landt in Locaties (met zijn branch-chip, want een worktree is gewoon een git-checkout), plan.md - wordt vastgezet in Open Files en gerenderd. Rechtsklik erop en kies + wordt vastgezet in Geopende bestanden en gerenderd. Rechtsklik erop en kies Reveal in Location om te springen naar waar het in - de boom zit. Dit werkt hetzelfde wanneer de Location al open was — + de boom zit. Dit werkt hetzelfde wanneer de Locatie al open was — een bestand openen dat erin woont maakt nooit een dubbele wereld, alleen een regel in de werkset.

      De volgorde maakt niet uit voor het map/bestand-paar, maar het @@ -148,7 +148,7 @@

      Gerenderde diffs vanuit de shell

      $ pullmark --diff-with=old.md new.md # twee bestanden, old.md als basis $ pullmark --diff ~/wt/feature ~/wt/feature/docs/plan.md # een worktree, plan.md als diff -

      Mappen die je erbij doorgeeft openen nog steeds als Locations, en +

      Mappen die je erbij doorgeeft openen nog steeds als Locaties, en elke vorm heeft een tweelingbroer in de app, in het Compare-menu van de toolbar (inclusief Compare Revisions… en Compare with File…). Omdat --diff en @@ -166,7 +166,7 @@

      Exitcodes

      Voorbeelden

      $ pullmark README.md                      # één bestand lezen
       $ pullmark ~/notes                        # een map doorbladeren
      -$ pullmark docs specs/design.md           # een Location plus één document
      +$ pullmark docs specs/design.md           # een Locatie plus één document
       $ pullmark ~/wt/feature docs/plan.md      # een worktree met één document
       $ pullmark --diff docs/plan.md            # wat de laatste bewerkingen veranderden
       $ pullmark -- --weird-filename.md         # -- beëindigt de optieverwerking
      diff --git a/site/nl/docs/experimental/margin-notes/index.html b/site/nl/docs/experimental/margin-notes/index.html index 0f41062..56154bd 100644 --- a/site/nl/docs/experimental/margin-notes/index.html +++ b/site/nl/docs/experimental/margin-notes/index.html @@ -108,7 +108,7 @@

      Gebruiken in PullMark

      de bijbehorende acties. Een notitie verwijderen is hoe je haar afhandelt: geen status, geen archief — een verwerkte notitie is een afwezige notitie. -
    • De chip — rijen in Open Files dragen een chip +
    • De chip — rijen in Geopende bestanden dragen een chip met het aantal notities zolang een document ze nog bevat. Hij leeft mee: terwijl een agent het bestand doorwerkt en notities verwijdert, loopt de teller terug en verdwijnen de ballonnetjes voor je diff --git a/site/nl/docs/features/index.html b/site/nl/docs/features/index.html index 9b165a5..adacc71 100644 --- a/site/nl/docs/features/index.html +++ b/site/nl/docs/features/index.html @@ -85,7 +85,7 @@

      Lezen

      afbeeldingen en links werken, en een klik op een link naar een ander Markdown-bestand opent het ter plekke (als preview wanneer het in een - open Location staat).
    • + open Locatie staat).
    • Navigatie — de outline-zijbalk (⌥⌘O), ⌘F zoeken op de pagina, ⇧⌘F zoeken door alle bestanden in de zijbalk, en ⌘K Open Quickly voor koppen, bestanden, PR's, recente items — of plak @@ -145,13 +145,13 @@

      GitHub, zonder de browser

      herkomstbalk pint owner/repo @ ref · pad vast, met een weg terug naar GitHub.
    • Blader door hele repo's — laad de Markdown-boom - van een repo in Locations, + van een repo in Locaties, wissel van branch, vergelijk met andere branches, bekijk blame — privérepo's gebruiken de credentials die PR's al gebruiken, en niets van wat wordt opgehaald raakt ooit de schijf.
    • Branches en worktrees — lokale checkouts dragen een branch-chip; het bijbehorende menu opent worktrees als eigen - Locations en leest andere branches op afstand. Lokaal wint altijd + Locaties en leest andere branches op afstand. Lokaal wint altijd van remote wanneer een worktree de branch al heeft.
    diff --git a/site/nl/docs/index.html b/site/nl/docs/index.html index 58b656e..5127486 100644 --- a/site/nl/docs/index.html +++ b/site/nl/docs/index.html @@ -75,8 +75,8 @@

    PullMark, gedocumenteerd

  • De zijbalk

    -

    Open Files, previews, Locations, Pull Requests, - Recents — en wat elk icoon en elke chip betekent.

    +

    Geopende bestanden, previews, Locaties, Pull Requests, + Recent — en wat elk icoon en elke chip betekent.

  • Instellingen

    diff --git a/site/nl/docs/settings/index.html b/site/nl/docs/settings/index.html index 9a3ec2b..4d391ba 100644 --- a/site/nl/docs/settings/index.html +++ b/site/nl/docs/settings/index.html @@ -80,10 +80,10 @@

    Reading

    laatst afsloot — bestanden, mappen, PR's, doorbladerde repo's en de preview-regel (nog steeds als preview).
  • - - + diff --git a/site/nl/docs/sidebar/index.html b/site/nl/docs/sidebar/index.html index f901ba8..326adb2 100644 --- a/site/nl/docs/sidebar/index.html +++ b/site/nl/docs/sidebar/index.html @@ -4,7 +4,7 @@ De zijbalk — PullMark Docs - + @@ -16,7 +16,7 @@ - + @@ -66,17 +66,17 @@

    De zijbalk

    hebt, de plekken waar je bladert, de pull requests die je reviewt, en waar je bent geweest.

    -

    Open Files

    +

    Geopende bestanden

    De werkset: elk document dat je expliciet hebt geopend — vanuit de Finder, met slepen & neerzetten, ⌘O, de command line, of door een bestand uit een - Location vast te houden. Plat, herordenbaar door te slepen, elke rij + Locatie vast te houden. Plat, herordenbaar door te slepen, elke rij te verwijderen met de ✕ bij hover (of ⌫ op de geselecteerde rij). Rechtsklik op de sectiekop voor Close All.

    Previews

    -

    Eén klik op een bestand binnen een Location en het rendert direct — - en verschijnt in Open Files als preview: één cursieve regel, +

    Eén klik op een bestand binnen een Locatie en het rendert direct — + en verschijnt in Geopende bestanden als preview: één cursieve regel, altijd als laatste in de sectie. Klik op een ander bestand en de preview-regel wordt vervangen, dus bladeren door een grote boom stapelt nooit rijen op. Het is hetzelfde idee als de preview-tabs van @@ -98,19 +98,19 @@

    Previews

    Remote repo's previewen op dezelfde manier, op dezelfde plek. Bladeren door de boom van een GitHub-repo, of links volgen binnen een remote document, zet dezelfde ene cursieve regel in - Open Files — met een boekicoon en een tweede regel + Geopende bestanden — met een boekicoon en een tweede regel owner/repo @ ref, omdat het bestand niet op je Mac staat. Er is altijd maar één preview per venster, lokaal of remote: iets previewen vervangt wat je daarvoor aan het previewen was. Een remote doc vasthouden (dubbelklik of Keep Open) is wat hem bij zijn repo archiveert — hij verhuist naar de vastgezette lijst van - de repo onder Locations. ⌘K opent direct vastgezet, want een URL + de repo onder Locaties. ⌘K opent direct vastgezet, want een URL plakken is expliciete intentie.

    -

    Elke rij in Open Files die binnen een open Location woont krijgt +

    Elke rij in Geopende bestanden die binnen een open Locatie woont krijgt Reveal in Location in zijn rechtsklikmenu — de sprong terug van "wat ik aan het lezen ben" naar "waar het woont".

    -

    Locations

    +

    Locaties

    Doorbladerbare startpunten, waar ze ook wonen. Twee soorten delen de sectie, te onderscheiden aan het icoon:

    項目初期状態はたらき
    Show hidden filesaan/uit — uitDotfiles en verborgen mappen in Locations — + Dotfiles en verborgen mappen in Locaties — .github/-docs en verwanten. Ook te schakelen met ⇧⌘. (de combinatie van de Finder zelf) of View → Show - Hidden Files; elke open Location scant opnieuw bij het + Hidden Files; elke open Locatie scant opnieuw bij het omzetten.
    GitHub Markdown links Ask on first click · Open in PullMark · Open in Browser — @@ -95,7 +95,7 @@

    Reading

    Clicking files in Locations Preview First · Open Fully — Preview First Preview First toont een bestand met één klik zonder het vast - te houden — één cursieve regel (in Open Files, of onder zijn + te houden — één cursieve regel (in Geopende bestanden, of onder zijn GitHub-repo) die de volgende preview vervangt; dubbelklik of begin te bewerken om het te houden. Open Fully houdt elk bestand dat je aanklikt vast. Geldt voor lokale mappen en doorbladerde diff --git a/site/nl/docs/shortcuts/index.html b/site/nl/docs/shortcuts/index.html index e959c87..bca89de 100644 --- a/site/nl/docs/shortcuts/index.html +++ b/site/nl/docs/shortcuts/index.html @@ -101,7 +101,7 @@

    View (het weergavemenu)

    Show/Hide Outline⌥⌘OIn een lokaal document
    Show/Hide Markdown Source⌥⌘U
    Reload Document⌘RIn een lokaal document
    Show/Hide Hidden Files⇧⌘.Dotfiles in Locations — de combinatie van de Finder zelf
    Show/Hide Hidden Files⇧⌘.Dotfiles in Locaties — de combinatie van de Finder zelf
    Show/Hide Margin NotesNotitieballonnetjes in gerenderde documenten
    Zoom In / Out⌘= / ⌘-⌘+ werkt ook; knijpen en ⌘-scrollen op de pagina eveneens
    Actual Size⌘0
    @@ -128,7 +128,7 @@

    Locations

    • Worktrees — elke worktree van de repo, met een vinkje op degene die deze rij is; kies een andere om die als eigen - Location te openen. Worktrees worden vanuit PullMark nooit + Locatie te openen. Worktrees worden vanuit PullMark nooit uitgecheckt of omgeschakeld — de app opent de map die er al staat.
    • View Branch from GitHub — lees de bestanden van @@ -146,7 +146,7 @@

      Locations

      vastgehouden docs van de repo staan boven de boom, zodat ze nooit verdrinken onder een grote repo; een vastgehouden doc die in de boom zichtbaar is wordt daar gewoon weergegeven. (Een doc die je alleen - aan het previewen bent staat in Open Files, + aan het previewen bent staat in Geopende bestanden, niet hier.)

      Een map waarvan het pad niet meer oplost (een niet-geactiveerd volume, een verwijderde worktree) dimt met een vraagtekenbadge in @@ -176,7 +176,7 @@

      Pull Requests

      voor verwijderd, in cirkel voor hernoemd, potlood in cirkel voor gewijzigd.

      -

      Recents

      +

      Recent

      Recent geopende bestanden, mappen en pull requests die hierboven niet al zichtbaar zijn. PR-regels dragen hun live statusicoon; een recent item waarvan het bestand zoek is dimt (klokbadge) in plaats @@ -188,7 +188,7 @@

      Dingen verwijderen

      Hover over een rij op het hoogste niveau voor de ✕ — die haalt de rij uit de zijbalk, nooit iets van schijf of van GitHub. ⌫ op een geselecteerde rij doet hetzelfde. Bestanden binnen de boom van een - Location hebben geen ✕: ze zijn de inhoud van een plek, geen + Locatie hebben geen ✕: ze zijn de inhoud van een plek, geen zijbalkitems.

      Icoonoverzicht

      diff --git a/site/nl/docs/toolbar/index.html b/site/nl/docs/toolbar/index.html index d5abbe4..7157cce 100644 --- a/site/nl/docs/toolbar/index.html +++ b/site/nl/docs/toolbar/index.html @@ -91,7 +91,7 @@

      In elke weergave

      venster het langst: de reviewstatus blijft zichtbaar wanneer andere items in het overloopmenu verdwijnen.
    - + @@ -123,7 +123,7 @@

    Lokale bestanden

    GitHub-documenten

    Documenten die rechtstreeks uit een repo worden gelezen — geopend - via links, ⌘K of een doorbladerde repo-Location.

    + via links, ⌘K of een doorbladerde repo-Locatie.

    Open File or FolderzichtbaarOpen lokale Markdown of een map als Location.
    Open lokale Markdown of een map als Locatie.
    Open Pull Requestzichtbaar Open een GitHub-pull request via een URL.
    Appearancezichtbaar
    diff --git a/site/nl/docs/troubleshooting/index.html b/site/nl/docs/troubleshooting/index.html index 20d5849..e6ccb0a 100644 --- a/site/nl/docs/troubleshooting/index.html +++ b/site/nl/docs/troubleshooting/index.html @@ -145,7 +145,7 @@

    "… changed while you were editing this block — nothing was diff te tonen.

    Gedimde rijen: mappen en recente items die "er niet zijn"

    -

    Een Location met een vraagtekenbadge, of een grijs recent item, +

    Een Locatie met een vraagtekenbadge, of een grijs recent item, betekent dat het pad op dit moment niet oplost — een niet-geactiveerd volume, een gewisselde git-branch, een verwijderde worktree. Rijen dimmen met opzet in plaats van te verdwijnen: ze diff --git a/site/nl/index.html b/site/nl/index.html index c40059e..9cc0fcd 100644 --- a/site/nl/index.html +++ b/site/nl/index.html @@ -36,7 +36,7 @@ "license": "https://github.com/jedijashwa/pullmark/blob/main/LICENSE", "url": "https://pullmark.app/nl/", "downloadUrl": "https://github.com/jedijashwa/pullmark/releases/latest/download/PullMark.dmg", - "screenshot": "https://pullmark.app/img/app-doc.png", + "screenshot": "https://pullmark.app/img/nl/app-doc.png", "description": "Een native macOS-app die lokale Markdown rendert zoals lezers die te zien krijgen en documentatiezware pull requests op GitHub reviewt als gerenderde diffs met markering op woordniveau.", "inLanguage": "nl", "softwareHelp": { "@type": "CreativeWork", "url": "https://pullmark.app/docs/" } @@ -560,8 +560,8 @@

    Docs zijn er om te diffen lezen.

    - - + PullMark rendert de documentatie van een project als opgemaakte pagina, met de blame-kantlijn aan: avatars van auteurs staan in de linkermarge, één per reeks blokken die het laatst door dezelfde commit is aangeraakt
    Een projectdoc, opgemaakt — met de geschiedenis in de kantlijn: één avatar per reeks blokken, elk een deur naar zijn commit.
    @@ -597,8 +597,8 @@

    Je agent schrijft plannen.
    Review ze als het werk van een collega.

    - - + PullMark rendert een door een agent geschreven ontwerpspec met de titel Wind Gust Alerts, met drie margin notes als ondertekende kaarten van de reviewer — een notitie op bestandsniveau die om een schone tweede revisie vraagt, één die de aanname over de samplefrequentie in twijfel trekt, en één die YAGNI roept over een functie — terwijl de zijbalk de spec toont in een map docs/superpowers/specs van een git-repository op branch main
    De spec van een agent, ter plekke gereviewd: drie ondertekende @@ -670,8 +670,8 @@

    De hele documentatiereview, vanaf de gerenderde pagina.

    - - + PullMark reviewt een documentatie-pull request: een gerenderde diff waarin een gewijzigde alinea markeringen op woordniveau draagt, een toegevoegd Mermaid-stroomdiagram rendert op de groene tint van een toegevoegd blok, de zijbalk toont een commentaarteller op het bestand, en de reviewknop in de toolbar meldt Finish your review met drie openstaande comments
    Een documentatie-PR als gerenderde diff: de ene gewijzigde zin @@ -701,8 +701,8 @@

    De hele documentatiereview, vanaf de gerenderde pagina.

    - - + Het pull request-overzicht van PullMark: de PR-titel met een Open-chip, een capsule Changes requested, een capsule Checks passed, reviewer-avatars met oordeelbadges, een teamchip docs-guild, de PR-beschrijving gerenderd, en de conversatietijdlijn waarvan de eerste reviewcomment een gerenderde tabel toont
    De conversatie als document: reviewcomments renderen hun tabellen @@ -731,12 +731,12 @@

    Een echte reader voor de Markdown die al op je schijf staat.

    - - PullMark rendert een lokaal Markdown-bestand uit een docs-repo: de sectie Open Files in de zijbalk toont drie vastgehouden documenten en één cursieve preview-regel; de sectie Locations toont de map als boom van submappen en Markdown-bestanden, met een git-branch-chip en een GitHub-repomarkering; de gewijzigde bestanden van een open pull request vormen een boom met statusiconen en een commentaarteller; het gerenderde document toont koppen, lijsten, een link en een Tip-alert; de titelbalk toont de map en git-branch van het bestand, met een woordenteller in de hoek + + PullMark rendert een lokaal Markdown-bestand uit een docs-repo: de sectie Geopende bestanden in de zijbalk toont drie vastgehouden documenten en één cursieve preview-regel; de sectie Locaties toont de map als boom van submappen en Markdown-bestanden, met een git-branch-chip en een GitHub-repomarkering; de gewijzigde bestanden van een open pull request vormen een boom met statusiconen en een commentaarteller; het gerenderde document toont koppen, lijsten, een link en een Tip-alert; de titelbalk toont de map en git-branch van het bestand, met een woordenteller in de hoek
    Mappen komen binnen als levende bomen, elke locatie draagt haar git-branch, - en bladeren toont bestanden als previews — de cursieve regel in Open Files die + en bladeren toont bestanden als previews — de cursieve regel in Geopende bestanden die door je volgende klik wordt vervangen. Pull requests staan naast je lokale bestanden, en de titelbalk weet waar je bent.
    @@ -754,7 +754,7 @@

    Een echte reader voor de Markdown die al op je schijf staat.

    veranderd".
  • Bladeren zonder jezelf te bedelven — klik je met één klik door een map of repo, dan verschijnt elk bestand als preview: één cursieve - regel in Open Files die je volgende klik vervangt. Dubbelklik (of begin gewoon te + regel in Geopende bestanden die je volgende klik vervangt. Dubbelklik (of begin gewoon te bewerken) om hem te houden.
  • Outline-zijbalk — een kaart van je koppen in navigatorstijl, één schakelaar verwijderd.
  • @@ -802,8 +802,8 @@

    Lez
    - - + Een gerenderd document in editmodus: één alinea ter plekke onthuld als ruwe Markdown-bron, omringd door gerenderde inhoud
    Editmodus: het actieve blok toont zijn bron; al het andere blijft gerenderd.
    @@ -823,9 +823,9 @@

    Git
    - - PullMark rendert een Markdown-bestand opgehaald uit een GitHub-repository: een herkomstbalk boven de inhoud toont de repositorynaam, een branch-chip, het bestandspad en de vastgepinde commit, met een link Open on GitHub; de sectie Locations in de zijbalk toont de repository met een boekicoon en zijn boom van Markdown-bestanden + + PullMark rendert een Markdown-bestand opgehaald uit een GitHub-repository: een herkomstbalk boven de inhoud toont de repositorynaam, een branch-chip, het bestandspad en de vastgepinde commit, met een link Open on GitHub; de sectie Locaties in de zijbalk toont de repository met een boekicoon en zijn boom van Markdown-bestanden
    Een doc rechtstreeks van GitHub gelezen: de herkomstbalk zegt altijd waar je bent — repo, branch, vastgepinde commit — en de branch-chip wisselt of opent @@ -834,8 +834,8 @@

    Git
    - - + Het Settings-venster van PullMark op het tabblad Appearance: drie live themapreviewkaarten — GitHub, Editorial en Terminal — die elk hetzelfde voorbeelddocument renderen via de echte pipeline, met Editorial geselecteerd, boven knoppen om de map met eigen thema's te openen
    Settings → Appearance (instellingen → weergave): drie live themapreviews, gerenderd door de echte pipeline — klik op een kaart om te wisselen.
    diff --git a/site/nl/uses/agents/index.html b/site/nl/uses/agents/index.html index 05c0070..39f486f 100644 --- a/site/nl/uses/agents/index.html +++ b/site/nl/uses/agents/index.html @@ -453,8 +453,8 @@

    Lees gerenderd. Noteer ter plekke. Geef het terug.

    - - + PullMark rendert een door een agent geschreven ontwerpspec met de titel Wind Gust Alerts, met drie margin notes als ondertekende kaarten van de reviewer — een notitie op bestandsniveau die om een schone tweede revisie vraagt, één die de aanname over de samplefrequentie in twijfel trekt, en één die YAGNI roept over een functie — terwijl de zijbalk de spec toont in een map docs/superpowers/specs van een git-repository op branch main
    De spec van een agent, een eerste reviewronde: ondertekende @@ -561,8 +561,8 @@

    En als het document wél ter review gaat…

    - - + Het pull request-overzicht van PullMark: de PR-titel met een Open-chip, een capsule Changes requested, een capsule Checks passed, reviewer-avatars met oordeelbadges, een teamchip docs-guild, de PR-beschrijving gerenderd, en de conversatietijdlijn waarvan de eerste reviewcomment een gerenderde tabel toont
    Dezelfde reviewinstincten, gericht op een pull request — de diff --git a/site/pt/docs/cli/index.html b/site/pt/docs/cli/index.html index 557ca37..2044008 100644 --- a/site/pt/docs/cli/index.html +++ b/site/pt/docs/cli/index.html @@ -99,11 +99,11 @@

    O que abrir faz

    confiar nelas:

    • Arquivos caem na seção - Open Files (arquivos - abertos) da barra lateral como entradas fixadas, e o último arquivo - passado é o exibido.
    • + Arquivos Abertos da barra + lateral como entradas fixadas, e o último arquivo passado é o + exibido.
    • Pastas — incluindo worktrees git — viram - Locations: árvores + Localizações: árvores navegáveis dos arquivos Markdown lá dentro.
    • Já em execução? Tudo abre na janela da frente. Uma segunda instância do app nunca é iniciada.
    • @@ -115,17 +115,18 @@

      O que abrir faz

      Worktrees, e apontando para um arquivo

      Passe uma pasta e um arquivo juntos e você ganha os dois - comportamentos de uma vez: a pasta abre como Location, o arquivo abre + comportamentos de uma vez: a pasta abre como Localização, o arquivo abre fixado e exibido. Essa é a receita inteira de “abra esta worktree e me mostre este doc”:

      $ pullmark ~/wt/feature ~/wt/feature/docs/plan.md
      -

      A árvore da worktree cai em Locations (com seu chip de branch, já +

      A árvore da worktree cai em Localizações (com seu chip de branch, já que uma worktree é só um checkout git), plan.md fica - fixado em Open Files e renderizado. Clique nele com o botão direito e - escolha Reveal in Location (revelar no Location) para - pular até onde ele está na árvore. Funciona igual quando o Location já - estava aberto — abrir um arquivo que mora dentro dele nunca cria um - mundo duplicado, só uma entrada no conjunto de trabalho.

      + fixado em Arquivos Abertos e renderizado. Clique nele com o botão + direito e escolha Reveal in Location (revelar na + Localização) para pular até onde ele está na árvore. Funciona igual + quando a Localização já estava aberta — abrir um arquivo que mora + dentro dela nunca cria um mundo duplicado, só uma entrada no conjunto + de trabalho.

      A ordem não importa para o par pasta/arquivo, mas o último arquivo passado é o exibido, então deixe por último o documento que você quer na tela.

      @@ -144,7 +145,7 @@

      Diffs renderizados a partir do shell

      $ pullmark --diff-with=old.md new.md # dois arquivos, old.md como base $ pullmark --diff ~/wt/feature ~/wt/feature/docs/plan.md # uma worktree, plan.md em diff -

      Pastas passadas junto ainda abrem como Locations, e cada forma tem +

      Pastas passadas junto ainda abrem como Localizações, e cada forma tem um gêmeo dentro do app no menu Compare da barra de ferramentas (incluindo Compare Revisions… e Compare with File…). Como --diff e --diff-with @@ -162,7 +163,7 @@

      Códigos de saída

      Exemplos

      $ pullmark README.md                      # ler um arquivo
       $ pullmark ~/notes                        # navegar por uma pasta
      -$ pullmark docs specs/design.md           # um Location mais um documento
      +$ pullmark docs specs/design.md           # uma Localização mais um documento
       $ pullmark ~/wt/feature docs/plan.md      # uma worktree, exibindo um doc
       $ pullmark --diff docs/plan.md            # o que as últimas edições mudaram
       $ pullmark -- --weird-filename.md         # -- encerra a análise de opções
      diff --git a/site/pt/docs/experimental/margin-notes/index.html b/site/pt/docs/experimental/margin-notes/index.html index 70e1489..f5cca4a 100644 --- a/site/pt/docs/experimental/margin-notes/index.html +++ b/site/pt/docs/experimental/margin-notes/index.html @@ -106,7 +106,7 @@

      Usando no PullMark

      uma nota para suas ações. Apagar uma nota é como ela se resolve: sem estado, sem arquivo morto — uma nota resolvida é uma nota ausente. -
    • O chip — linhas de Open Files mostram um chip +
    • O chip — linhas de Arquivos Abertos mostram um chip com a contagem de comentários enquanto um documento ainda carrega notas. É ao vivo: conforme um agente trabalha pelo arquivo apagando notas, a contagem cai e os balões desaparecem na sua frente.
    • diff --git a/site/pt/docs/features/index.html b/site/pt/docs/features/index.html index 979a7e3..f125af5 100644 --- a/site/pt/docs/features/index.html +++ b/site/pt/docs/features/index.html @@ -83,8 +83,8 @@

      Leitura

    • Arquivos vivos — documentos re-renderizam ao serem salvos em qualquer editor; imagens e links relativos resolvem, e clicar num link para outro arquivo Markdown o abre no lugar (como - prévia quando ele mora num - Location aberto).
    • + prévia quando ele mora numa + Localização aberta).
    • Navegação — a barra lateral de estrutura (⌥⌘O), busca na página com ⌘F, busca em todos os arquivos da barra lateral com ⇧⌘F, e o Open Quickly (abrir rapidamente) com ⌘K para títulos, @@ -147,12 +147,12 @@

      GitHub, sem o navegador

      caminho de volta ao GitHub.
    • Navegue por repositórios inteiros — carregue a árvore Markdown de um repositório em - Locations, troque de + Localizações, troque de branch, compare com outras branches, veja o blame — repositórios privados usam as credenciais que os PRs já usam, e nada do que é buscado toca o disco.
    • Branches e worktrees — checkouts locais vestem um - chip de branch; seu menu abre worktrees como Locations próprios e lê + chip de branch; seu menu abre worktrees como Localizações próprias e lê outras branches remotamente. Local sempre ganha do remoto quando uma worktree já tem a branch.
    diff --git a/site/pt/docs/index.html b/site/pt/docs/index.html index 0ca08e6..b3a61f6 100644 --- a/site/pt/docs/index.html +++ b/site/pt/docs/index.html @@ -74,8 +74,8 @@

    PullMark, documentado

  • A barra lateral

    -

    Open Files, prévias, Locations, Pull Requests, - Recents — e o que cada ícone e chip significa.

    +

    Arquivos Abertos, prévias, Localizações, + Pull Requests, Recentes — e o que cada ícone e chip significa.

  • Ajustes

    diff --git a/site/pt/docs/settings/index.html b/site/pt/docs/settings/index.html index af85600..207b9c3 100644 --- a/site/pt/docs/settings/index.html +++ b/site/pt/docs/settings/index.html @@ -79,10 +79,10 @@

    Leitura

    encerrado — arquivos, pastas, PRs, repositórios navegados e a entrada de prévia (ainda como prévia).
  • - + Files; cada Localização aberta re-escaneia na troca. @@ -92,7 +92,7 @@

    Leitura

    - + diff --git a/site/pt/docs/sidebar/index.html b/site/pt/docs/sidebar/index.html index e2eed04..bee1099 100644 --- a/site/pt/docs/sidebar/index.html +++ b/site/pt/docs/sidebar/index.html @@ -4,7 +4,7 @@ A barra lateral — Documentação do PullMark - + @@ -16,7 +16,7 @@ - + @@ -66,18 +66,18 @@

    A barra lateral

    pelos quais navega, os pull requests que está revisando e por onde você já passou.

    -

    Open Files

    -

    O conjunto de trabalho (arquivos abertos): cada documento que você +

    Arquivos Abertos

    +

    O conjunto de trabalho: cada documento que você abriu explicitamente — pelo Finder, arrastar & soltar, ⌘O, a linha de comando, ou mantendo um arquivo de - um Location. Plano, reordenável por arrasto, cada linha removível com o + uma Localização. Plano, reordenável por arrasto, cada linha removível com o ✕ que aparece ao passar o mouse (ou ⌫ na linha selecionada). Clique com o botão direito no cabeçalho da seção para Close All (fechar tudo).

    Prévias

    -

    Um clique num arquivo dentro de um Location e ele renderiza - imediatamente — e aparece em Open Files como prévia: uma +

    Um clique num arquivo dentro de uma Localização e ele renderiza + imediatamente — e aparece em Arquivos Abertos como prévia: uma entrada em itálico, sempre a última da seção. Clique em outro arquivo e a entrada de prévia é substituída, então navegar por uma árvore grande nunca acumula linhas. É a mesma ideia das abas de prévia do VS Code ou @@ -100,21 +100,21 @@

    Prévias

    Repositórios remotos fazem prévia do mesmo jeito, no mesmo lugar. Navegar pela árvore de um repositório do GitHub, ou seguir links dentro de um documento remoto, coloca a mesma entrada - única em itálico em Open Files — com um ícone de livro e uma segunda + única em itálico em Arquivos Abertos — com um ícone de livro e uma segunda linha owner/repo @ ref, já que o arquivo não está no seu Mac. Só existe uma prévia por janela, local ou remota: pré-visualizar qualquer coisa substitui o que você estava pré-visualizando antes. Manter um doc remoto (clique duplo ou Keep Open) é o que o arquiva com seu repositório — ele se move para a lista - fixada do repositório sob Locations. ⌘K abre já fixando, porque colar + fixada do repositório sob Localizações. ⌘K abre já fixando, porque colar uma URL é intenção explícita.

    -

    Qualquer linha de Open Files que more dentro de um Location aberto - ganha Reveal in Location (revelar no Location) no menu - do botão direito — o salto de volta de “o que estou lendo” para “onde - isso mora”.

    +

    Qualquer linha de Arquivos Abertos que more dentro de uma + Localização aberta ganha Reveal in Location (revelar + na Localização) no menu do botão direito — o salto de volta de “o que + estou lendo” para “onde isso mora”.

    -

    Locations

    -

    Raízes navegáveis (locais), onde quer que morem. Dois tipos dividem +

    Localizações

    +

    Raízes navegáveis, onde quer que morem. Dois tipos dividem a seção, distinguidos pelo ícone:

    ItemStandaardWat het doet
    ComparezichtbaarHetzelfde document op een andere branch, als gerenderde diff.
    Show hidden fileson/off — offDotfiles e pastas ocultas em Locations — docs em + Dotfiles e pastas ocultas em Localizações — docs em .github/ e afins. Também alternável com ⇧⌘. (o mesmo atalho do Finder) ou View → Show Hidden - Files; cada Location aberto re-escaneia na troca.
    GitHub Markdown links Ask on first click · Open in PullMark · Open in Browser — Ask on first click
    Clicking files in Locations Preview First · Open Fully — Preview First Preview First mostra um arquivo com um clique sem mantê-lo — - uma entrada em itálico (em Open Files, ou sob seu repositório do + uma entrada em itálico (em Arquivos Abertos, ou sob seu repositório do GitHub) que a próxima prévia substitui; clique duas vezes ou comece a editar para mantê-lo. Open Fully mantém cada arquivo que você clica. Vale para pastas locais e repositórios navegados do GitHub diff --git a/site/pt/docs/shortcuts/index.html b/site/pt/docs/shortcuts/index.html index 0d8dd9e..c0b1bd2 100644 --- a/site/pt/docs/shortcuts/index.html +++ b/site/pt/docs/shortcuts/index.html @@ -101,7 +101,7 @@

    View

    Show/Hide Outline⌥⌘ONum documento local
    Show/Hide Markdown Source⌥⌘U
    Reload Document⌘RNum documento local
    Show/Hide Hidden Files⇧⌘.Dotfiles em Locations — o mesmo atalho do Finder
    Show/Hide Hidden Files⇧⌘.Dotfiles em Localizações — o mesmo atalho do Finder
    Show/Hide Margin NotesOs balões de nota em documentos renderizados
    Zoom In / Out⌘= / ⌘-⌘+ também funciona; pinça e ⌘-rolagem na página igualmente
    Actual Size⌘0
    @@ -130,8 +130,8 @@

    Locations

    de branches e worktrees:

    • Worktrees — cada worktree do repositório, com uma - marca na que esta linha é; escolha outra para abri-la como Location - próprio. Worktrees nunca sofrem checkout nem troca pelo PullMark — + marca na que esta linha é; escolha outra para abri-la como Localização + própria. Worktrees nunca sofrem checkout nem troca pelo PullMark — ele abre a pasta que já está lá.
    • View Branch from GitHub (ver branch do GitHub) — leia os arquivos de outra branch remotamente, sem tocar no seu @@ -149,7 +149,7 @@

      Locations

      repositório ficam acima da árvore, para nunca se afogarem num repositório grande; um doc mantido que está visível na árvore é simplesmente representado ali. (Um doc que você está apenas - pré-visualizando aparece em Open Files, não + pré-visualizando aparece em Arquivos Abertos, não aqui.)

      Uma pasta cujo caminho para de resolver (um volume desmontado, uma worktree apagada) escurece com um selo de interrogação em vez de sumir @@ -178,8 +178,8 @@

      Pull Requests

      removido, círculo para renomeado, círculo com lápis para modificado.

      -

      Recents

      -

      Arquivos, pastas e pull requests abertos recentemente (recentes) que +

      Recentes

      +

      Arquivos, pastas e pull requests abertos recentemente que não estão visíveis acima. Entradas de PR carregam seu ícone de status ao vivo; um recente cujo arquivo sumiu escurece (selo de relógio) em vez de desaparecer, e revive quando o caminho volta — feito para trocas @@ -189,7 +189,7 @@

      Recents

      Removendo coisas

      Passe o mouse sobre qualquer linha de nível superior para o ✕ — ele remove a linha da barra lateral, nunca nada do disco ou do GitHub. ⌫ na - linha selecionada faz o mesmo. Arquivos dentro da árvore de um Location + linha selecionada faz o mesmo. Arquivos dentro da árvore de uma Localização não têm ✕: eles são conteúdo de um lugar, não itens da barra lateral.

      @@ -207,7 +207,7 @@

      Glossário de ícones

    + Numa linha de Arquivos Abertos: notas de margem ainda no documento
    LinhaSignificado
    Setas de pull requestUm pull request
    BandejaReview Requests — PRs aguardando a sua revisão
    Balão de fala + númeroNum arquivo de PR: comentários de revisão não resolvidos. - Numa linha de Open Files: notas de margem ainda no documento
    Ponto colorido (borda esquerda)Uma solicitação de revisão não lida
    ✕ num círculo (ao passar o mouse)Remover da barra lateral / dispensar a prévia
    diff --git a/site/pt/docs/toolbar/index.html b/site/pt/docs/toolbar/index.html index d9cfa02..e160f94 100644 --- a/site/pt/docs/toolbar/index.html +++ b/site/pt/docs/toolbar/index.html @@ -91,7 +91,7 @@

    Em toda visão

    tempo a uma janela estreita: o status da revisão continua visível quando os outros itens recolhem para o overflow. Open File or Folderexibido - Abrir Markdown local ou uma pasta como Location. + Abrir Markdown local ou uma pasta como Localização. Open Pull Requestexibido Abrir um pull request do GitHub por URL. Appearanceexibido @@ -123,7 +123,7 @@

    Arquivos locais

    Documentos do GitHub

    Documentos lidos direto de um repositório — abertos por links, ⌘K ou - um Location de repositório navegado.

    + uma Localização de repositório navegado.

    diff --git a/site/pt/docs/troubleshooting/index.html b/site/pt/docs/troubleshooting/index.html index 406aa46..5eb6e13 100644 --- a/site/pt/docs/troubleshooting/index.html +++ b/site/pt/docs/troubleshooting/index.html @@ -143,7 +143,7 @@

    “… changed while you were editing this block — nothing wa relatado com clareza, em vez de mostrar um diff vazio.

    Linhas escurecidas: pastas e recentes que “não estão lá”

    -

    Um Location com selo de interrogação, ou um recente acinzentado, +

    Uma Localização com selo de interrogação, ou um recente acinzentado, significa que o caminho não resolve agora — um volume desmontado, uma branch git trocada, uma worktree apagada. As linhas escurecem em vez de sumir de propósito: elas revivem sozinhas quando o caminho volta. diff --git a/site/pt/index.html b/site/pt/index.html index b38589e..ab3c69c 100644 --- a/site/pt/index.html +++ b/site/pt/index.html @@ -36,7 +36,7 @@ "license": "https://github.com/jedijashwa/pullmark/blob/main/LICENSE", "url": "https://pullmark.app/pt/", "downloadUrl": "https://github.com/jedijashwa/pullmark/releases/latest/download/PullMark.dmg", - "screenshot": "https://pullmark.app/img/app-doc.png", + "screenshot": "https://pullmark.app/img/pt/app-doc.png", "description": "Um app nativo para macOS que renderiza Markdown local do jeito que os leitores vão vê-lo e revisa pull requests do GitHub carregados de documentação como diffs renderizados, com destaques palavra por palavra.", "softwareHelp": { "@type": "CreativeWork", "url": "https://pullmark.app/docs/" }, "inLanguage": "pt-BR" @@ -560,8 +560,8 @@

    Docs existem para ser diffados lidos.

    - - + PullMark renderizando a documentação de um projeto como uma página formatada, com a régua de blame ativa: avatares dos autores na margem esquerda, um por sequência de blocos tocados pela última vez pelo mesmo commit
    Um doc de projeto, formatado — com a história na margem: um avatar por sequência de blocos, cada um uma porta para o seu commit.
    @@ -597,8 +597,8 @@

    Seu agente escreve planos.
    Revise como se fossem de um colega.

    - - + PullMark renderizando uma especificação de design escrita por um agente, intitulada Wind Gust Alerts, com três notas de margem exibidas como cartões assinados pelo revisor — uma nota sobre o arquivo inteiro pedindo uma segunda revisão limpa, uma questionando a premissa de taxa de amostragem da spec e uma declarando YAGNI sobre um recurso — enquanto a barra lateral mostra a spec numa pasta docs/superpowers/specs de um repositório git na branch main
    A spec de um agente, revisada no lugar: três notas assinadas, @@ -668,8 +668,8 @@

    A revisão de docs inteira, direto da página renderizada.

    - - + PullMark revisando um pull request de documentação: um diff renderizado em que um parágrafo alterado carrega destaques palavra por palavra, um fluxograma Mermaid adicionado renderiza sobre o tom verde de bloco adicionado, a barra lateral mostra um contador de comentários no arquivo e o controle de revisão da barra de ferramentas diz Finish your review com três comentários pendentes
    Um PR de documentação como diff renderizado: a única frase alterada @@ -700,8 +700,8 @@

    A revisão de docs inteira, direto da página renderizada.

    - - + A visão geral de pull request do PullMark: o título do PR com um chip Open, uma cápsula Changes requested, uma cápsula Checks passed, avatares de revisores vestindo selos de veredito, um chip do time docs-guild, a descrição do PR renderizada e a linha do tempo da conversa, cujo primeiro comentário de revisão mostra uma tabela renderizada
    A conversa como documento: comentários de revisão renderizam suas @@ -730,13 +730,13 @@

    Um leitor de verdade para o Markdown que já está no seu disco.

    - - PullMark renderizando um arquivo Markdown local de um repositório de docs: a seção Open Files da barra lateral lista três documentos mantidos e uma entrada de prévia em itálico; a seção Locations mostra a pasta como uma árvore de subpastas e arquivos Markdown, vestindo um chip de branch git e uma marca de repositório do GitHub; os arquivos alterados de um pull request aberto formam uma árvore com ícones de status e um selo de contagem de comentários; o documento renderizado mostra títulos, listas, um link e um alerta Tip; a barra de título mostra a pasta do arquivo e a branch git, com uma pílula de contagem de palavras no canto + + PullMark renderizando um arquivo Markdown local de um repositório de docs: a seção Arquivos Abertos da barra lateral lista três documentos mantidos e uma entrada de prévia em itálico; a seção Localizações mostra a pasta como uma árvore de subpastas e arquivos Markdown, vestindo um chip de branch git e uma marca de repositório do GitHub; os arquivos alterados de um pull request aberto formam uma árvore com ícones de status e um selo de contagem de comentários; o documento renderizado mostra títulos, listas, um link e um alerta Tip; a barra de título mostra a pasta do arquivo e a branch git, com uma pílula de contagem de palavras no canto
    Pastas entram como árvores vivas, cada local veste sua branch git, e - navegar mostra os arquivos como prévias — a entrada em itálico em Open Files - (arquivos abertos) que o próximo clique substitui. Pull requests ficam ao lado dos seus + navegar mostra os arquivos como prévias — a entrada em itálico em + Arquivos Abertos que o próximo clique substitui. Pull requests ficam ao lado dos seus arquivos locais, e a barra de título sabe onde você está.
    @@ -753,7 +753,7 @@

    Um leitor de verdade para o Markdown que já está no seu disco.

    doc”.
  • Navegue sem se soterrar — vá de clique em clique por uma pasta ou um repositório e cada arquivo aparece como prévia: uma única entrada em - itálico em Open Files que o próximo clique substitui. Clique duas vezes (ou + itálico em Arquivos Abertos que o próximo clique substitui. Clique duas vezes (ou simplesmente comece a editar) para mantê-lo.
  • Outline (estrutura) — um mapa dos seus títulos no estilo navegador, a um toque de distância.
  • @@ -801,8 +801,8 @@

    Lei
    - - + Um documento renderizado em modo de edição: um parágrafo revelado como código Markdown cru no lugar, cercado de conteúdo renderizado
    Modo de edição: o bloco ativo mostra seu código-fonte; todo o resto continua renderizado.
    @@ -822,9 +822,9 @@

    O G
    - - PullMark renderizando um arquivo Markdown buscado de um repositório do GitHub: uma barra de procedência acima do conteúdo traz o nome do repositório, um chip de branch, o caminho do arquivo e o commit fixado, com um link Open on GitHub; a seção Locations da barra lateral mostra o repositório com um ícone de livro e sua árvore de arquivos Markdown + + PullMark renderizando um arquivo Markdown buscado de um repositório do GitHub: uma barra de procedência acima do conteúdo traz o nome do repositório, um chip de branch, o caminho do arquivo e o commit fixado, com um link Open on GitHub; a seção Localizações da barra lateral mostra o repositório com um ícone de livro e sua árvore de arquivos Markdown
    Um doc lido direto do GitHub: a barra de procedência sempre diz onde você está — repositório, branch, commit fixado — e o chip de branch troca ou abre branches @@ -833,8 +833,8 @@

    O G
    - - + A janela Settings do PullMark na aba Appearance: três cartões de prévia de tema ao vivo — GitHub, Editorial e Terminal — cada um renderizando o mesmo documento de amostra pelo pipeline de verdade, com Editorial selecionado, acima de botões para abrir a pasta de temas personalizados
    Settings → Appearance (Ajustes → Aparência): três prévias de tema ao vivo, renderizadas pelo pipeline de verdade — clique num cartão para trocar.
    diff --git a/site/pt/uses/agents/index.html b/site/pt/uses/agents/index.html index a89681d..0ac1929 100644 --- a/site/pt/uses/agents/index.html +++ b/site/pt/uses/agents/index.html @@ -451,8 +451,8 @@

    Leia renderizado. Anote no lugar. Devolva.

    - - + PullMark renderizando uma especificação de design escrita por um agente, intitulada Wind Gust Alerts, com três notas de margem exibidas como cartões assinados pelo revisor — uma nota sobre o arquivo inteiro pedindo uma segunda revisão limpa, uma questionando a premissa de taxa de amostragem da spec e uma declarando YAGNI sobre um recurso — enquanto a barra lateral mostra a spec numa pasta docs/superpowers/specs de um repositório git na branch main
    A spec de um agente, primeira passada de revisão: notas assinadas, @@ -557,8 +557,8 @@

    E quando o doc sobe mesmo para revisão…

    - - + A visão geral de pull request do PullMark: o título do PR com um chip Open, uma cápsula Changes requested, uma cápsula Checks passed, avatares de revisores vestindo selos de veredito, um chip do time docs-guild, a descrição do PR renderizada e a linha do tempo da conversa, cujo primeiro comentário de revisão mostra uma tabela renderizada
    Os mesmos instintos de revisão, apontados para um pull request — a diff --git a/site/uses/agents/index.html b/site/uses/agents/index.html index 845f719..8b9f5c9 100644 --- a/site/uses/agents/index.html +++ b/site/uses/agents/index.html @@ -451,8 +451,8 @@

    Read rendered. Note in place. Hand it back.

    - - + PullMark rendering an agent-written design spec titled Wind Gust Alerts with three margin notes shown as signed cards from the reviewer — a file-level note asking for a clean second revision, one challenging the spec's sampling-rate assumption, and one calling YAGNI on a feature — while the sidebar shows the spec in a docs/superpowers/specs folder of a git repository on branch main
    An agent's spec, a first review pass: signed notes anchored to @@ -556,8 +556,8 @@

    And when the doc does go up for review…

    - - + PullMark's pull-request overview: the PR title with an Open chip, a Changes requested capsule, a Checks passed capsule, reviewer avatars wearing verdict badges, a docs-guild team chip, the PR description rendered, and the conversation timeline whose first review comment shows a rendered table
    The same review instincts, pointed at a pull request — the diff --git a/site/zh/docs/cli/index.html b/site/zh/docs/cli/index.html index 3bc22aa..40d5bc0 100644 --- a/site/zh/docs/cli/index.html +++ b/site/zh/docs/cli/index.html @@ -96,10 +96,10 @@

    打开时会发生什么

    规则刻意乏味,好让脚本可以放心依赖:

    • 文件落进侧边栏的 - Open Files 分区,作为固定 + “打开的文件”分区,作为固定 条目,最后传入的文件会被显示。
    • 文件夹——包括 git 工作树——成为 - Locations:其中 Markdown + “位置”:其中 Markdown 文件的可浏览树。
    • 应用已在运行?一切都在最前面的窗口打开。绝不会 启动第二个应用实例。
    • @@ -110,14 +110,14 @@

      打开时会发生什么

    工作树,以及指定单个文件

    -

    同时传一个文件夹和一个文件,两种行为一起发生:文件夹作为 Location +

    同时传一个文件夹和一个文件,两种行为一起发生:文件夹作为“位置” 打开,文件固定并显示。这就是“打开这个工作树、给我看这份文档”的 完整配方:

    $ pullmark ~/wt/feature ~/wt/feature/docs/plan.md
    -

    工作树的文件树进入 Locations(带分支标签,因为工作树就是一个 git - 检出),plan.md 固定在 Open Files 中并渲染出来。右键它选 - Reveal in Location(在位置中显示)即可跳到它在树中的 - 位置。Location 已经打开时行为完全相同——打开位于其中的文件绝不会 +

    工作树的文件树进入“位置”(带分支标签,因为工作树就是一个 git + 检出),plan.md 固定在“打开的文件”中并渲染出来。右键它选 + Reveal in Location(在“位置”中显示)即可跳到它在树中的 + 落点。若该“位置”早已打开,行为完全相同——打开位于其中的文件绝不会 造出一个重复的世界,只会多一条工作集条目。

    文件夹/文件的配对不看顺序,但显示的是最后传入的文件, 所以把你想上屏的文档放在最后。

    @@ -134,7 +134,7 @@

    来自 shell 的渲染差异

    $ pullmark --diff-with=old.md new.md # 两个文件,old.md 为基准 $ pullmark --diff ~/wt/feature ~/wt/feature/docs/plan.md # 一个工作树,plan.md 以差异显示 -

    一同传入的文件夹照常作为 Location 打开,每种形式在工具栏的 +

    一同传入的文件夹照常作为“位置”打开,每种形式在工具栏的 Compare 菜单里都有应用内的孪生兄弟(包括 Compare Revisions…Compare with File…)。因为 --diff--diff-with @@ -152,7 +152,7 @@

    退出码

    示例

    $ pullmark README.md                      # 阅读单个文件
     $ pullmark ~/notes                        # 浏览文件夹
    -$ pullmark docs specs/design.md           # 一个 Location(位置)外加一份文档
    +$ pullmark docs specs/design.md           # 一个“位置”外加一份文档
     $ pullmark ~/wt/feature docs/plan.md      # 一个工作树,显示一份文档
     $ pullmark --diff docs/plan.md            # 最近的编辑改了什么
     $ pullmark -- --weird-filename.md         # -- 结束选项解析
    diff --git a/site/zh/docs/experimental/margin-notes/index.html b/site/zh/docs/experimental/margin-notes/index.html index 0c6fee9..051089c 100644 --- a/site/zh/docs/experimental/margin-notes/index.html +++ b/site/zh/docs/experimental/margin-notes/index.html @@ -95,7 +95,7 @@

    在 PullMark 中使用

  • Edit / Delete(编辑 / 删除)——悬停批注气泡见 操作。删除批注就是解决它:没有状态,没有归档——处理完的批注就是 不存在的批注。
  • -
  • 计数标签——文档还带着批注时,Open Files 行上 +
  • 计数标签——文档还带着批注时,“打开的文件”行上 会显示一枚评论计数标签。它是活的:智能体一边处理一边删批注, 计数就在你眼前下降,气泡逐个消失。
  • 其他地方——批注在浏览的 GitHub 文件中只读 diff --git a/site/zh/docs/features/index.html b/site/zh/docs/features/index.html index e53b2e4..92570bf 100644 --- a/site/zh/docs/features/index.html +++ b/site/zh/docs/features/index.html @@ -78,7 +78,7 @@

    阅读

    (图表为真正的 SVG)。
  • 活的文件——在任何编辑器里保存,文档随即重新渲染; 相对路径的图片与链接自动解析,点击指向另一个 Markdown 文件的链接会 - 就地打开它(当它位于已打开的 Location 中时,以预览方式)。
  • + 就地打开它(当它位于已打开的“位置”中时,以预览方式)。
  • 导航——大纲侧边栏(⌥⌘O)、⌘F 页内查找、⇧⌘F 搜索侧边栏里的所有文件,以及 ⌘K 的 Open Quickly(快速打开),可达 标题、文件、PR、最近使用——也可以直接把路径或 GitHub 链接粘进去。
  • @@ -123,11 +123,11 @@

    GitHub,不必开浏览器

    会询问;⌘-点击执行你默认的反面)。来源栏钉着 owner/repo @ ref · path,并留着回 GitHub 的路。
  • 浏览整个仓库——把仓库的 Markdown 树装进 - Locations(位置),切换分支、 + “位置”,切换分支、 与其他分支比较、查看 blame——私有仓库用的就是 PR 已在用的凭据, 抓取的内容从不落盘。
  • 分支与工作树——本地检出佩戴分支标签;标签的菜单 - 能把工作树作为独立 Location 打开,也能远程读取其他分支。某个分支 + 能把工作树作为独立的“位置”打开,也能远程读取其他分支。某个分支 已有本地工作树时,本地永远优先于远程。
  • diff --git a/site/zh/docs/index.html b/site/zh/docs/index.html index b3ffbe0..916d937 100644 --- a/site/zh/docs/index.html +++ b/site/zh/docs/index.html @@ -73,8 +73,8 @@

    PullMark,白纸黑字

  • 侧边栏

    -

    Open Files(打开的文件)、预览、Locations(位置)、 - Pull Requests(拉取请求)、Recents(最近使用)——以及每个图标和标签的含义。

    +

    “打开的文件”与预览、“位置”、 + “拉取请求”、“最近使用”——以及每个图标和标签的含义。

  • 设置

    diff --git a/site/zh/docs/settings/index.html b/site/zh/docs/settings/index.html index acd514a..67cff86 100644 --- a/site/zh/docs/settings/index.html +++ b/site/zh/docs/settings/index.html @@ -77,9 +77,9 @@

    阅读

  • - diff --git a/site/zh/docs/shortcuts/index.html b/site/zh/docs/shortcuts/index.html index a439b6f..c0b6d71 100644 --- a/site/zh/docs/shortcuts/index.html +++ b/site/zh/docs/shortcuts/index.html @@ -100,7 +100,7 @@

    View(显示)

    - + diff --git a/site/zh/docs/sidebar/index.html b/site/zh/docs/sidebar/index.html index e95fef5..5dfae2a 100644 --- a/site/zh/docs/sidebar/index.html +++ b/site/zh/docs/sidebar/index.html @@ -4,7 +4,7 @@ 侧边栏 — PullMark 文档 - + @@ -16,7 +16,7 @@ - + @@ -65,15 +65,15 @@

    侧边栏

    来源:你打开了什么、你浏览的地方、你在审查的拉取请求,以及你去过 哪里。

    -

    Open Files(打开的文件)

    +

    打开的文件

    工作集:每一份你明确打开过的文档——来自 Finder、拖放、⌘O、 - 命令行,或从某个 Location 保留下来的文件。 + 命令行,或从某个“位置”保留下来的文件。 平铺排列,可拖动排序,悬停任意一行出现 ✕ 即可移除(选中行按 ⌫ 亦可)。 右键分区标题有 Close All(全部关闭)

    预览

    -

    在 Location 里单击一个文件,它立即渲染——并以预览的身份 - 出现在 Open Files 中:一条斜体条目,始终排在分区最后。再点另一个文件, +

    在“位置”里单击一个文件,它立即渲染——并以预览的身份 + 出现在“打开的文件”中:一条斜体条目,始终排在分区最后。再点另一个文件, 预览条目就被替换,所以浏览一棵大树永远不会堆出一摞行。这与 VS Code 的 预览标签页或 Xcode 的临时编辑器是同一个思路,连斜体都一样。

    当你对一份预览表现出阅读之外的投入,它就转正为普通的固定条目:

    @@ -87,17 +87,17 @@

    预览

    如果你更希望每次点击都完整打开文件,请在设置里改 Clicking files in Locations

    远程仓库以同样的方式、在同样的位置预览。浏览 GitHub - 仓库的文件树,或跟随远程文档内部的链接,会在 Open Files 中放同一条 + 仓库的文件树,或跟随远程文档内部的链接,会在“打开的文件”中放同一条 斜体条目——带书本图标和 owner/repo @ ref 的第二行,因为 文件不在你的 Mac 上。每个窗口永远只有一条预览,本地远程皆然: 预览任何新内容都会替换你之前预览的东西。保留一份远程文档(双击或 - Keep Open)才把它归档到它的仓库——它会移到 Locations 中该仓库的固定 + Keep Open)才把它归档到它的仓库——它会移到“位置”中该仓库的固定 列表里。⌘K 打开的内容直接固定,因为粘贴 URL 是明确的意图。

    -

    任何位于已打开 Location 内的 Open Files 行,右键菜单里都有 - Reveal in Location(在位置中显示)——从“我在读什么” +

    凡是位于某个已打开“位置”内的“打开的文件”行,右键菜单里都有 + Reveal in Location(在“位置”中显示)——从“我在读什么” 跳回“它住在哪里”。

    -

    Locations(位置)

    +

    位置

    可浏览的根,无论它们住在哪里。两种行共享这一分区,靠图标区分:

    ItemPadrãoO que faz
    CompareexibidoO mesmo documento em outra branch, como diff renderizado.
    重新打开 PullMark 上次退出时侧边栏里的内容——文件、文件夹、 PR、浏览中的仓库,以及预览条目(依旧作为预览)。
    Show hidden files开/关 — 在 Locations 中显示点文件和隐藏文件夹——.github/ + 在“位置”中显示点文件和隐藏文件夹——.github/ 文档之类。也可用 ⇧⌘.(Finder 同款组合键)或 - View → Show Hidden Files 切换;每次切换,所有打开的 Location + View → Show Hidden Files 切换;每次切换,所有打开的“位置” 都会重新扫描。
    GitHub Markdown links Ask on first click · Open in PullMark · Open in Browser — @@ -90,7 +90,7 @@

    阅读

    Clicking files in Locations Preview First · Open Fully — Preview First Preview First 让单击即可查看文件而不保留它——一条斜体条目 - (在 Open Files 中,或在其 GitHub 仓库之下),下一次预览就替换; + (在“打开的文件”中,或在其 GitHub 仓库之下),下一次预览就替换; 双击或开始编辑才保留。Open Fully 则保留你点过的每个文件。对本地 文件夹和浏览中的 GitHub 仓库一视同仁。见 预览
    Show/Hide Outline⌥⌘O在本地文档中
    Show/Hide Markdown Source⌥⌘U
    Reload Document⌘R在本地文档中
    Show/Hide Hidden Files⇧⌘.Locations 里的点文件——Finder 同款组合键
    Show/Hide Hidden Files⇧⌘.“位置”里的点文件——Finder 同款组合键
    Show/Hide Margin Notes渲染文档中的批注气泡
    Zoom In / Out⌘= / ⌘-⌘+ 也行;页面上的双指捏合和 ⌘-滚轮同样有效
    Actual Size⌘0
    @@ -111,7 +111,7 @@

    Locations(位置)

    标记——悬停可见对应哪个仓库。点击分支标签打开分支与工作树菜单:

    • Worktrees(工作树)——仓库的每个工作树,当前行 - 对应的那个打勾;选择另一个即作为独立 Location 打开。PullMark 从不 + 对应的那个打勾;选择另一个即作为独立的“位置”打开。PullMark 从不 检出或切换工作树——它只是打开已经在那里的文件夹。
    • View Branch from GitHub(从 GitHub 查看分支)—— 远程读取另一个分支的文件,不动你的检出。已有本地工作树的分支会 @@ -125,11 +125,11 @@

      Locations(位置)

      Browse Repo Files…(浏览仓库文件…)载入仓库完整的 Markdown 树。仓库保留的文档排在树上方,永远不会淹没在大仓库里; 已在树中可见的保留文档就在树里表示。(仅在预览的文档显示在 - Open Files,不在这里。)

      + “打开的文件”,不在这里。)

      路径解析不了的文件夹(未挂载的卷、被删除的工作树)会变暗并带上 问号角标,而不是消失——路径回来时它自己复活。

      -

      Pull Requests(拉取请求)

      +

      拉取请求

      每个打开的 PR 是一组:先是总览行(状态图标 + 改动的 Markdown 数量),然后是它改动的 Markdown 文件——带计数的评论气泡标记着有 未解决审查会话的文件。在你打开的 PR 之下,Review Requests @@ -148,7 +148,7 @@

      Pull Requests(拉取请求)

      圆圈为删除, 圆圈为重命名, 铅笔圆圈为修改。

      -

      Recents(最近使用)

      +

      最近使用

      最近打开、且没有在上方出现的文件、文件夹和拉取请求。PR 条目带着 实时状态图标;文件已丢失的最近条目会变暗(时钟角标)而不是消失, 路径回来时复活——为切换分支和未挂载的卷而生。右键分区标题可 @@ -156,7 +156,7 @@

      Recents(最近使用)

      移除

      悬停任意顶层行出现 ✕——它把行从侧边栏移走,绝不删除磁盘或 - GitHub 上的任何东西。选中行按 ⌫ 效果相同。Location 树内的文件没有 ✕: + GitHub 上的任何东西。选中行按 ⌫ 效果相同。“位置”树内的文件没有 ✕: 它们是一个地方的内容,不是侧边栏条目。

      图标词汇表

      diff --git a/site/zh/docs/toolbar/index.html b/site/zh/docs/toolbar/index.html index 6d83a17..254148e 100644 --- a/site/zh/docs/toolbar/index.html +++ b/site/zh/docs/toolbar/index.html @@ -84,7 +84,7 @@

      每个视图都有

      窗口收窄时它坚持得最久:其他项目折进溢出菜单后,审查状态依然 可见。
    - + @@ -113,7 +113,7 @@

    本地文件

    含义
    Open File or Folder(打开文件或文件夹)显示打开本地 Markdown 或一个文件夹 Location。
    打开本地 Markdown 或一个文件夹“位置”。
    Open Pull Request(打开拉取请求)显示 按 URL 打开 GitHub 拉取请求。
    Appearance(外观)显示

    GitHub 文档

    -

    直接从仓库读取的文档——经由链接、⌘K 或浏览中的仓库 Location +

    直接从仓库读取的文档——经由链接、⌘K 或浏览中的仓库“位置” 打开。

    diff --git a/site/zh/docs/troubleshooting/index.html b/site/zh/docs/troubleshooting/index.html index 9ac6f25..57a18d4 100644 --- a/site/zh/docs/troubleshooting/index.html +++ b/site/zh/docs/troubleshooting/index.html @@ -130,7 +130,7 @@

    "… changed while you were editing this block — nothing was 明说,而不是展示一个空差异。

    变暗的行:那些“不在了”的文件夹与最近条目

    -

    带问号角标的 Location,或者变灰的最近条目,表示路径此刻解析 +

    带问号角标的“位置”,或者变灰的最近条目,表示路径此刻解析 不了——未挂载的卷、切换了的 git 分支、被删除的工作树。行变暗而不 消失是有意为之:路径回来时它们自动复活。点击一条失效的最近条目会 提供 Remove from Recents(从最近使用中移除)或 diff --git a/site/zh/index.html b/site/zh/index.html index b729ccd..0ad8f05 100644 --- a/site/zh/index.html +++ b/site/zh/index.html @@ -36,7 +36,7 @@ "license": "https://github.com/jedijashwa/pullmark/blob/main/LICENSE", "url": "https://pullmark.app/zh/", "downloadUrl": "https://github.com/jedijashwa/pullmark/releases/latest/download/PullMark.dmg", - "screenshot": "https://pullmark.app/img/app-doc.png", + "screenshot": "https://pullmark.app/img/zh/app-doc.png", "description": "一款原生 macOS 应用:把本地 Markdown 渲染成读者将会看到的样子,并把以文档为主的 GitHub 拉取请求作为渲染后的差异来审查,只高亮改动的词。", "softwareHelp": { "@type": "CreativeWork", "url": "https://pullmark.app/docs/" }, "inLanguage": "zh-Hans" @@ -558,8 +558,8 @@

    文档,是拿来比对 阅读的。

    - - + PullMark 把一份项目文档渲染成排好版的页面,并开启了 blame 边栏:作者头像列在左侧页边,每一段由同一次提交最后改动的连续区块对应一个头像
    一份项目文档,排好了版——历史留在页边:每段连续区块一个头像,每个头像都是通往那次提交的门。
    @@ -588,8 +588,8 @@

    你的智能体在写计划。
    把它当同事的稿子来审。

    - - + PullMark 渲染一份由智能体撰写、标题为 Wind Gust Alerts 的设计规格,三条页边批注以审查者的署名卡片呈现——一条文件级批注要求重写一版干净的第二稿,一条质疑规格里的采样率假设,还有一条对某个功能喊了 YAGNI——侧边栏则显示这份规格位于某个 git 仓库 main 分支下的 docs/superpowers/specs 文件夹中
    智能体的一份规格,就地审查完毕:三条署名批注锚在它们所质疑的区块上,以普通 @@ -643,8 +643,8 @@

    整场文档审查,都在渲染好的页面上完成。

    - - + PullMark 正在审查一个文档拉取请求:渲染出来的差异中,改动过的段落带着词级高亮,新增的 Mermaid 流程图渲染在绿色的新增区块底色上,侧边栏在该文件上显示评论数,工具栏的审查控件写着 Finish your review,并标着三条待提交的评论
    一个文档 PR 作为渲染差异:唯一改动的那句话带着词级高亮,新来的流程图以 @@ -671,8 +671,8 @@

    整场文档审查,都在渲染好的页面上完成。

    - - + PullMark 的拉取请求总览:PR 标题旁挂着 Open 标签,一枚 Changes requested 胶囊,一枚 Checks passed 胶囊,审查者头像佩戴着裁定徽章,一枚 docs-guild 团队标签,渲染好的 PR 描述,以及会话时间线——其中第一条审查评论里的表格是渲染过的
    会话本身就是一份文档:审查评论里的表格渲染成表格,每位审查者的头像都佩戴着 @@ -700,12 +700,12 @@

    给你硬盘里那些 Markdown,一个像样的阅读器。

    - - PullMark 渲染一个 docs 仓库里的本地 Markdown 文件:侧边栏的 Open Files 区列出三份留驻的文档和一条斜体的预览条目;Locations 区把该文件夹显示为子文件夹与 Markdown 文件的树,佩戴着 git 分支标签和 GitHub 仓库标记;一个打开的拉取请求,其改动文件排成带状态图标和评论计数徽章的树;渲染出的文档里可见标题、列表、一个链接和一个 Tip 提示框;标题栏显示文件所在的文件夹和 git 分支,角落里是一枚字数统计药丸 + + PullMark 渲染一个 docs 仓库里的本地 Markdown 文件:侧边栏的“打开的文件”区列出三份留驻的文档和一条斜体的预览条目;“位置”区把该文件夹显示为子文件夹与 Markdown 文件的树,佩戴着 git 分支标签和 GitHub 仓库标记;一个打开的拉取请求,其改动文件排成带状态图标和评论计数徽章的树;渲染出的文档里可见标题、列表、一个链接和一个 Tip 提示框;标题栏显示文件所在的文件夹和 git 分支,角落里是一枚字数统计药丸
    文件夹以活的树进来,每个位置都佩戴着自己的 git 分支,浏览时文件以预览 - 出现——Open Files(打开的文件)里那条斜体条目,下一次点击就把它替换掉。拉取请求就挨着 + 出现——“打开的文件”里那条斜体条目,下一次点击就把它替换掉。拉取请求就挨着 你的本地文件,标题栏知道你身在何处。
    @@ -718,7 +718,7 @@

    给你硬盘里那些 Markdown,一个像样的阅读器。

    pullmark --diff 在终端里做同一件事——回答“智能体刚刚把我的文档改成 什么样了”最快的方式。
  • 浏览而不至于把自己埋了——在文件夹或仓库里单击,每个文件都以 - 预览出现:Open Files 里一条斜体条目,下次点击就被替换。双击(或者直接开始 + 预览出现:“打开的文件”里一条斜体条目,下次点击就被替换。双击(或者直接开始 编辑)就把它留下。
  • 大纲侧边栏——一张导航器式的标题地图,一个开关的距离。
  • 什么都找得到——⌘F 在页面上逐个走过匹配项; @@ -754,8 +754,8 @@

    - - + 处于编辑模式的渲染文档:其中一个段落就地显出 Markdown 源码,四周仍是渲染好的内容
    编辑模式:当前区块显示源码,其余一切保持渲染。
    @@ -772,9 +772,9 @@

    Git
    - - PullMark 渲染一个从 GitHub 仓库抓取的 Markdown 文件:内容上方的来源栏写着仓库名、一枚分支标签、文件路径和钉住的提交,并带一个 Open on GitHub 链接;侧边栏的 Locations 区以书本图标显示该仓库及其 Markdown 文件树 + + PullMark 渲染一个从 GitHub 仓库抓取的 Markdown 文件:内容上方的来源栏写着仓库名、一枚分支标签、文件路径和钉住的提交,并带一个 Open on GitHub 链接;侧边栏的“位置”区以书本图标显示该仓库及其 Markdown 文件树
    直接从 GitHub 读一份文档:来源栏始终说明你身在何处——仓库、分支、钉住的 提交——分支标签不必离开页面就能切换或打开分支。
    @@ -782,8 +782,8 @@

    Git
    - - + PullMark 的设置窗口停在 Appearance 标签页:三张实时主题预览卡片——GitHub、Editorial 和 Terminal——各自用真实的渲染管线渲染同一份示例文档,其中 Editorial 处于选中状态,下方是打开自定义 Themes 文件夹的按钮
    Settings → Appearance(设置 → 外观):三张实时主题预览,由真实的 diff --git a/site/zh/uses/agents/index.html b/site/zh/uses/agents/index.html index 3381e6c..4f30edb 100644 --- a/site/zh/uses/agents/index.html +++ b/site/zh/uses/agents/index.html @@ -442,8 +442,8 @@

    渲染着读。就地批注。把它递回去。

    - - + PullMark 渲染一份由智能体撰写、标题为 Wind Gust Alerts 的设计规格,三条页边批注以审查者的署名卡片呈现——一条文件级批注要求重写一版干净的第二稿,一条质疑规格里的采样率假设,还有一条对某个功能喊了 YAGNI——侧边栏则显示这份规格位于某个 git 仓库 main 分支下的 docs/superpowers/specs 文件夹中
    智能体的一份规格,第一遍审查过后:署名批注锚在确切的区块上——不用提交, @@ -534,8 +534,8 @@

    而当文档真要交上去审查时……

    - - + PullMark 的拉取请求总览:PR 标题旁挂着 Open 标签,一枚 Changes requested 胶囊,一枚 Checks passed 胶囊,审查者头像佩戴着裁定徽章,一枚 docs-guild 团队标签,渲染好的 PR 描述,以及会话时间线——其中第一条审查评论里的表格是渲染过的
    同一套审查的本能,对准一个拉取请求——首页讲了完整的审查故事。

  • 项目默认作用