diff --git a/apple/TablePro/Core/Menu/AboutPanelCredits.swift b/apple/TablePro/Core/Menu/AboutPanelCredits.swift new file mode 100644 index 0000000000..8492b87d06 --- /dev/null +++ b/apple/TablePro/Core/Menu/AboutPanelCredits.swift @@ -0,0 +1,79 @@ +// +// AboutPanelCredits.swift +// TablePro +// + +import AppKit +import os + +/// The About panel's credits: the project links, then the license holders who asked to be thanked +/// by name. +enum AboutPanelCredits { + static func attributedString(supporters: [String] = SupporterList.load()) -> NSAttributedString { + let style: [NSAttributedString.Key: Any] = [ + .font: NSFont.systemFont(ofSize: 11), + .foregroundColor: NSColor.secondaryLabelColor + ] + let credits = NSMutableAttributedString() + let links: [(String, String)] = [ + ("Website", MainMenuLink.website), + ("GitHub", MainMenuLink.repository), + (String(localized: "Documentation"), MainMenuLink.documentation), + (String(localized: "Sponsor"), SupportLinks.sponsors(.aboutPanel).absoluteString) + ] + for (index, link) in links.enumerated() { + if index > 0 { + credits.append(NSAttributedString(string: " | ", attributes: style)) + } + let attributed = NSMutableAttributedString(string: link.0, attributes: style) + if let url = URL(string: link.1) { + attributed.addAttribute(.link, value: url, range: NSRange(location: 0, length: attributed.length)) + } + credits.append(attributed) + } + + if !supporters.isEmpty { + let heading = String(localized: "Thanks to these license holders") + credits.append(NSAttributedString(string: "\n\n\(heading)\n", attributes: style)) + credits.append(NSAttributedString(string: supporters.joined(separator: ", "), attributes: style)) + } + + let centered = NSMutableParagraphStyle() + centered.alignment = .center + credits.addAttribute(.paragraphStyle, value: centered, range: NSRange(location: 0, length: credits.length)) + return credits + } +} + +/// License holders who asked, by email, to be named in the About panel. +/// +/// `Supporters.json` in the app's resources is the only copy of the list. A name goes in, or comes +/// out, through a pull request, and only after its owner said yes, using the spelling they gave. +enum SupporterList { + static let resourceName = "Supporters" + + private struct File: Decodable { + let supporters: [String] + } + + private static let logger = Logger(subsystem: "com.TablePro", category: "SupporterList") + + static func load(from bundle: Bundle = .main) -> [String] { + guard let url = bundle.url(forResource: resourceName, withExtension: "json") else { + logger.error("Supporters.json is missing from the app bundle") + return [] + } + do { + return try decode(Data(contentsOf: url)) + } catch { + logger.error("Could not read Supporters.json: \(error.publicLogShape, privacy: .public)") + return [] + } + } + + static func decode(_ data: Data) throws -> [String] { + try JSONDecoder().decode(File.self, from: data).supporters + .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) } + .filter { !$0.isEmpty } + } +} diff --git a/apple/TablePro/Core/Menu/AppDelegate+MainMenuActions.swift b/apple/TablePro/Core/Menu/AppDelegate+MainMenuActions.swift index 352d9e93a3..7f81715475 100644 --- a/apple/TablePro/Core/Menu/AppDelegate+MainMenuActions.swift +++ b/apple/TablePro/Core/Menu/AppDelegate+MainMenuActions.swift @@ -156,35 +156,3 @@ enum MainMenuLink { static let repository = "https://github.com/TableProApp/TablePro" static let issues = "https://github.com/TableProApp/TablePro/issues" } - -/// The About panel's credits line, kept out of the delegate so the menu action stays -/// a single call. -enum AboutPanelCredits { - static func attributedString() -> NSAttributedString { - let style: [NSAttributedString.Key: Any] = [ - .font: NSFont.systemFont(ofSize: 11), - .foregroundColor: NSColor.secondaryLabelColor - ] - let credits = NSMutableAttributedString() - let links: [(String, String)] = [ - ("Website", MainMenuLink.website), - ("GitHub", MainMenuLink.repository), - (String(localized: "Documentation"), MainMenuLink.documentation), - (String(localized: "Sponsor"), SupportLinks.sponsors(.aboutPanel).absoluteString) - ] - for (index, link) in links.enumerated() { - if index > 0 { - credits.append(NSAttributedString(string: " | ", attributes: style)) - } - let attributed = NSMutableAttributedString(string: link.0, attributes: style) - if let url = URL(string: link.1) { - attributed.addAttribute(.link, value: url, range: NSRange(location: 0, length: attributed.length)) - } - credits.append(attributed) - } - let centered = NSMutableParagraphStyle() - centered.alignment = .center - credits.addAttribute(.paragraphStyle, value: centered, range: NSRange(location: 0, length: credits.length)) - return credits - } -} diff --git a/apple/TablePro/Resources/Localizable.xcstrings b/apple/TablePro/Resources/Localizable.xcstrings index f9c6cadf13..21e1731fe7 100644 --- a/apple/TablePro/Resources/Localizable.xcstrings +++ b/apple/TablePro/Resources/Localizable.xcstrings @@ -74,792 +74,6 @@ } } } - }, - "\"%@\" is a name the database keeps for itself. Choose another name." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "\"%@\" is an attached database. Change its tables' structure from a connection that opens it." : { - - }, - "%1$@ column of %2$@" : { - - }, - "%1$d only left, %2$d only right, %3$d changed, %4$d same" : { - - }, - "%@" : { - - }, - "%@ connections do not support adding rows from Shortcuts." : { - - }, - "%@ has no column named %@." : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "%1$@ has no column named %2$@." - } - } - } - }, - "%@ holds values that cannot be compared, so the row cannot be found again." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "%@ is read-only, so rows cannot be added." : { - - }, - "%@, without checking stored values" : { - - }, - "A check needs an expression." : { - - }, - "A dictionary for each row, keyed by column" : { - - }, - "A field needs a type." : { - - }, - "A foreign key named “%@” already exists." : { - - }, - "A foreign key staged in this diagram uses “%1$@.%2$@”. Save or undo that key before renaming the column." : { - - }, - "A label cannot be empty." : { - - }, - "A label cannot be removed or moved once it exists." : { - - }, - "A larger binary value stays on the server until you open, copy or export it. Applies to tables with a primary key." : { - - }, - "A name cannot be empty." : { - - }, - "A row still holds the values the change was made on. Refresh the table before saving again." : { - - }, - "A transaction is open on this connection. Commit or roll it back in TablePro, then run the shortcut again." : { - - }, - "AI Policy controls in-app AI agents. External Clients controls Raycast, Cursor, Claude Desktop, other MCP clients, AppleScript, and Shortcuts. Effective scope is the minimum of the requesting token's scope and the External Clients level." : { - - }, - "Add Check" : { - - }, - "Add Field" : { - - }, - "Add Foreign Key…" : { - - }, - "Add Row to Table" : { - - }, - "Add Row to Table expects one row. Use Add Rows to Table for multiple rows." : { - - }, - "Add Rows to Table" : { - - }, - "Add a row to ${table}" : { - - }, - "Add check %@" : { - - }, - "Add check “%1$@”: %2$@" : { - - }, - "Add field “%1$@” %2$@" : { - - }, - "Add label “%1$@” after “%2$@”" : { - - }, - "Add label “%1$@” before “%2$@”" : { - - }, - "Add label “%@” at the end" : { - - }, - "Add multiple rows to a table on a saved connection. Provide the rows as a JSON array, CSV text, or a file." : { - - }, - "Add one row to a table on a saved connection. Provide the row as a JSON object or a CSV row." : { - - }, - "Add plugin_debugger to shared_preload_libraries and restart the server." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "Add rows to ${table}" : { - - }, - "Added %lld rows to %@." : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Added %1$lld rows to %2$@." - } - } - } - }, - "Added one row to %@." : { - - }, - "After" : { - - }, - "Allow NULL" : { - - }, - "Also drop the columns, functions and other objects that use this type" : { - - }, - "Ask the SSH server's administrator to turn on a method TablePro supports." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "At the End" : { - - }, - "Attach" : { - - }, - "Attach Database" : { - - }, - "Attach Database…" : { - - }, - "Attached Databases" : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "Attached databases open only for a database file on this Mac, not for a database on a server." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "Attached each time the connection opens. Reach a table as name.table, and browse each database in the sidebar." : { - - }, - "Base Type" : { - - }, - "Before" : { - - }, - "Binary values limit must be between 1 and 1,048,576 KB." : { - - }, - "Both results stopped at the row cap and are compared on the rows they hold. A row past the cap can show as only on one side." : { - - }, - "Build Join Query" : { - - }, - "Build Join Query…" : { - - }, - "Build a join query from the selected tables" : { - - }, - "Cannot Compare" : { - - }, - "Change field “%1$@” to %2$@" : { - - }, - "Check" : { - - }, - "Check the values already stored" : { - - }, - "Check the values already stored against the selected constraint" : { - - }, - "Checks" : { - - }, - "Choose a Result" : { - - }, - "Choose a Type" : { - - }, - "Choose the base type." : { - - }, - "Choose the database files to attach each time this connection opens." : { - - }, - "Compare Result With…" : { - - }, - "Compare Results" : { - - }, - "Compare With" : { - - }, - "Comparing" : { - - }, - "Comparing…" : { - - }, - "Constraint Name" : { - - }, - "Controls how external clients (Raycast, Cursor, Claude Desktop, AppleScript, Shortcuts) access this connection. Tokens cannot exceed this level even with full-access scope." : { - - }, - "Could Not Load Value" : { - - }, - "Could Not Refresh the Diagram" : { - - }, - "Could Not Stage the Change" : { - - }, - "Could not attach \"%@\": %@" : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "Could not connect to the database: %@" : { - - }, - "Could not read the columns of %@." : { - - }, - "Couldn't Rename Type" : { - - }, - "Create Type" : { - - }, - "Database or Schema" : { - - }, - "Delete Foreign Key %@" : { - - }, - "Drop Constraint" : { - - }, - "Drop Field" : { - - }, - "Drop constraint “%@”" : { - - }, - "Drop field “%@”" : { - - }, - "Drop type “%@”?" : { - - }, - "Dropped" : { - - }, - "Edit Field" : { - - }, - "Every field needs a name." : { - - }, - "First Value" : { - - }, - "Inner Join" : { - - }, - "It supports these host key types: %@." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "Joins" : { - - }, - "Jump host %1$@ failed: %2$@" : { - - }, - "KB" : { - - }, - "Key %@ matches more than one row in the left result. Choose key columns that identify a single row, or match whole rows." : { - - }, - "Key %@ matches more than one row in the right result. Choose key columns that identify a single row, or match whole rows." : { - - }, - "Left" : { - - }, - "Left Join" : { - - }, - "Line %lld of the file is not valid %@ text." : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Line %1$lld of the file is not valid %2$@ text." - } - } - } - }, - "Load binary values up to" : { - - }, - "Match Whole Rows" : { - - }, - "More than one attached database is named \"%@\"." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "Name the type." : { - - }, - "Named by the server" : { - - }, - "New Name" : { - - }, - "New Type" : { - - }, - "No Attached Databases" : { - - }, - "No Columns in Common" : { - - }, - "No Result to Compare With" : { - - }, - "No data was provided to add." : { - - }, - "No foreign key links %@ to the tables before it, so it is cross joined." : { - - }, - "No Foreign Keys" : { - - }, - "No row holds the values it was loaded with. Another client may have changed or deleted it." : { - - }, - "No tables picked" : { - - }, - "None (Cross Join)" : { - - }, - "Not Null" : { - - }, - "Not loaded, %@" : { - - }, - "Not validated" : { - - }, - "Only Left" : { - - }, - "Only PL/pgSQL functions and procedures can be debugged." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "Only Right" : { - - }, - "Only in the left result, not compared: %@" : { - - }, - "Only in the right result, not compared: %@" : { - - }, - "Open in Query Tab" : { - - }, - "Opens a database connection in TablePro" : { - - }, - "Other rows hold exactly the same values, so the change cannot reach this row alone." : { - - }, - "Pick the result to compare this one with." : { - - }, - "Pick the tables to join. Their foreign keys become the join conditions." : { - - }, - "Position" : { - - }, - "Provide a JSON object or an array of objects." : { - - }, - "References" : { - - }, - "Refuse NULL" : { - - }, - "Remove Attached Database" : { - - }, - "Remove the comment" : { - - }, - "Remove the default" : { - - }, - "Remove this change from the queue" : { - - }, - "Remove “%@”" : { - - }, - "Rename Label" : { - - }, - "Rename Type" : { - - }, - "Rename field “%1$@” to “%2$@”" : { - - }, - "Rename label “%1$@” to “%2$@”" : { - - }, - "Rename the selected label" : { - - }, - "Rename to “%@”" : { - - }, - "Result %1$d: %2$@" : { - - }, - "Result Closed" : { - - }, - "Result Format" : { - - }, - "Right" : { - - }, - "Row (JSON or CSV)" : { - - }, - "Row Limit" : { - - }, - "Rows (JSON or CSV)" : { - - }, - "Rows with the same values in these columns are compared. With none chosen, whole rows are matched." : { - - }, - "Run ${query} on ${connection}" : { - - }, - "Run Query" : { - - }, - "Run a SQL statement on a saved connection and pass the result to the next action." : { - - }, - "Run another query in this tab, or pin a result in another tab." : { - - }, - "Save Type Changes" : { - - }, - "Second value" : { - - }, - "Section" : { - - }, - "Set the comment" : { - - }, - "Set the default to %@" : { - - }, - "Shortcuts" : { - - }, - "Shortcuts wants to add %1$lld rows to \"%2$@\"" : { - - }, - "Shortcuts wants to add a row to \"%@\"" : { - - }, - "Show Structure of %@" : { - - }, - "Some rows are no longer in the table, so their values could not be read." : { - - }, - "Statement" : { - - }, - "Subtype" : { - - }, - "Table Data" : { - - }, - "TablePro and the SSH server could not agree on how to encrypt the connection." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "TablePro and the SSH server have no cipher in common." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "TablePro and the SSH server have no key exchange or host key method in common." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "TablePro and the SSH server have no MAC algorithm in common." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "TablePro and the SSH server have no signature algorithm in common for this key." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "TablePro can't pass any value of type %2$@ to %1$@." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "TablePro can't read %@. Check that this account can see its source." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "TablePro can't read this unit's source." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "TablePro can't turn text into a %2$@ value for %1$@." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "TablePro signs RSA keys with rsa-sha2-256 or rsa-sha2-512, not with ssh-rsa, which uses SHA-1." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "TablePro supports these ciphers: %@." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "TablePro supports these key exchange methods: %@." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "TablePro supports these MAC algorithms: %@." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "That connection no longer exists in TablePro." : { - - }, - "That result is no longer open. Choose another one." : { - - }, - "The CSV data has no header row." : { - - }, - "The JSON array must contain only objects." : { - - }, - "The attached database \"%@\" has no file." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "The attached file \"%@\" has no name." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "The changes were saved, but the type could not be read back. Reload before editing it again." : { - - }, - "The changes you have not saved will be lost." : { - - }, - "The client certificate and key could not be written to a temporary file." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "The column “%1$@” is no longer in “%2$@”." : { - - }, - "The data could not be read: %@" : { - - }, - "The data has no values to insert into %@." : { - - }, - "The diagram is saving its changes. Make this change once the save has finished." : { - - }, - "The first column of the first row" : { - - }, - "The foreign key “%1$@” is no longer on “%2$@”." : { - - }, - "The left result stopped at the row cap and is compared on the %@ rows it holds. A row past the cap can show as only on the right." : { - - }, - "The name a statement uses for this database, as in name.table." : { - - }, - "The request timed out." : { - - }, - "The right result stopped at the row cap and is compared on the %@ rows it holds. A row past the cap can show as only on the left." : { - - }, - "The row could not be looked up: %@" : { - - }, - "The row has no loaded values to be found by." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "The row's loaded values are missing, so it cannot be found again." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "The saved list could not be read. Adding a database replaces it." : { - - }, - "The saved list of attached databases is not in a format TablePro can read." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "The schema changes staged in this diagram will be lost." : { - - }, - "The server refused a change, so nothing was saved." : { - - }, - "The server refused a change. The changes before it were saved." : { - - }, - "The server offers only ciphers TablePro no longer supports: %@." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "The server offers only host key types TablePro no longer supports: %@." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "The server offers only key exchange methods TablePro no longer supports: %@." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "The server offers only MAC algorithms TablePro no longer supports: %@." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "The server runs %@." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "The SSH server closed the connection during the handshake." : { - - }, - "The SSH server ended the connection during the handshake: %@" : { - - }, - "The structure of a table in an attached database cannot be changed here." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "The text encoding is invalid." : { - - }, - "The two results share no column name, so there is nothing to compare." : { - - }, - "The type changed on the server since it was read. Reload it, then save again." : { - - }, - "This Tab" : { - - }, - "This cannot be undone. The drop fails while a column or other object still uses it." : { - - }, - "This cannot be undone. Without Cascade, the drop fails while a column, function or other type still uses it." : { - - }, - "This change does not apply to this kind of type." : { - - }, - "This _id reads as more than one value type in this collection, such as text and an ObjectId, so TablePro cannot tell which document the row names. Use a query." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, - "This connection's startup commands leave a transaction open, so rows added from Shortcuts could not be committed." : { - - }, - "This database cannot make the change “%@”." : { - - }, - "This database reports no tables to join." : { - - }, - "This server cannot rename a label." : { - - }, - "Too many rows. Add up to %lld rows at a time." : { - - }, - "Turn off to add the check now and validate the stored values later." : { - - }, - "Validate" : { - - }, - "Validate constraint “%@”" : { - - }, - "Validated on save" : { - - }, - "Was %@" : { - - }, - "Was “%@”" : { - - }, - "Whole row" : { - - }, - "^[%lld change](inflect: true)" : { - }, "__name__ is the document's ID in this collection, such as alice." : { "extractionState" : "manual", @@ -1016,45 +230,6 @@ } } } - }, - "connection" : { - - }, - "database" : { - - }, - "import" : { - - }, - "insert" : { - - }, - "left value, differs" : { - - }, - "only in the left result" : { - - }, - "only in the right result" : { - - }, - "open" : { - - }, - "query" : { - - }, - "right value, differs" : { - - }, - "row" : { - - }, - "rows" : { - - }, - "select" : { - }, "—" : { "extractionState" : "stale", @@ -1226,33 +401,6 @@ }, ":%@" : { "shouldTranslate" : false - }, - "“%@” already has a column with that name." : { - - }, - "“%@” is already a constraint." : { - - }, - "“%@” is already a field." : { - - }, - "“%@” is already a label." : { - - }, - "“%@” is already validated." : { - - }, - "“%@” is listed twice." : { - - }, - "“%@” is not a constraint any more." : { - - }, - "“%@” is not a field any more." : { - - }, - "“%@” is not a label any more." : { - }, "…and %d more lines" : { "localizations" : { @@ -1581,6 +729,9 @@ } } } + }, + "“%@” already has a column with that name." : { + }, "“%@” and its token are removed from this Mac. Sessions lose its tools." : { "localizations" : { @@ -1597,10 +748,29 @@ }, "“%@” holds no file to import." : { + }, + "\"%@\" is a name the database keeps for itself. Choose another name." : { + "extractionState" : "manual", + "generatesSymbol" : false }, "\"%@\" is a reserved theme identifier." : { "extractionState" : "manual", "generatesSymbol" : false + }, + "“%@” is already a constraint." : { + + }, + "“%@” is already a field." : { + + }, + "“%@” is already a label." : { + + }, + "“%@” is already validated." : { + + }, + "\"%@\" is an attached database. Change its tables' structure from a connection that opens it." : { + }, "“%@” is compressed." : { "localizations" : { @@ -1635,6 +805,9 @@ } } } + }, + "“%@” is listed twice." : { + }, "“%@” is no longer at that location." : { "localizations" : { @@ -1661,6 +834,9 @@ "\"%@\" is not a column. Name it as family:qualifier." : { "extractionState" : "manual", "generatesSymbol" : false + }, + "“%@” is not a constraint any more." : { + }, "\"%@\" is not a DynamoDB action this editor runs" : { "extractionState" : "manual", @@ -1685,6 +861,9 @@ } } } + }, + "“%@” is not a field any more." : { + }, "\"%@\" is not a file." : { "extractionState" : "manual", @@ -1716,6 +895,9 @@ }, "“%@” is not a host or host:port" : { + }, + "“%@” is not a label any more." : { + }, "\"%@\" is not a library." : { "localizations" : { @@ -2511,12 +1693,6 @@ "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "(%lld instructions)" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -3037,6 +2213,9 @@ } } } + }, + "%@" : { + }, "%@\nPreview tab. Double-click to keep it open." : { "localizations" : { @@ -3941,6 +3120,9 @@ } } } + }, + "%@ connections do not support adding rows from Shortcuts." : { + }, "%@ connections open a server, not a database file, so there is nothing to fetch over SSH." : { "localizations" : { @@ -4322,6 +3504,16 @@ } } }, + "%@ has no column named %@." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@ has no column named %2$@." + } + } + } + }, "%@ has no column order of its own to change." : { "localizations" : { "fr" : { @@ -4391,6 +3583,10 @@ } } }, + "%@ holds values that cannot be compared, so the row cannot be found again." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, "%@ in the workbook expands to far more data than it holds, so it was not read." : { "extractionState" : "manual", "generatesSymbol" : false, @@ -4828,6 +4024,9 @@ } } } + }, + "%@ is read-only, so rows cannot be added." : { + }, "%@ is required" : { "localizations" : { @@ -6619,6 +5818,9 @@ } } } + }, + "%@, without checking stored values" : { + }, "%@: %@" : { "extractionState" : "manual", @@ -7555,12 +6757,6 @@ "formatSpecifier" : "d", "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%arg points" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -7625,6 +6821,9 @@ } } } + }, + "%1$@ column of %2$@" : { + }, "%1$@ could not be read again before generating the script. %2$@" : { "localizations" : { @@ -8606,6 +7805,9 @@ } } } + }, + "%1$d only left, %2$d only right, %3$d changed, %4$d same" : { + }, "%1$d rows match. The first %2$d are listed." : { "localizations" : { @@ -9225,12 +8427,6 @@ "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d octets" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -9347,12 +8543,6 @@ "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d modifications" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -10628,12 +9818,6 @@ "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d lignes contiennent NULL dans une colonne de clé et ont été exclues. Choisissez une clé sans NULL pour les comparer." - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -10715,12 +9899,6 @@ "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d lignes correspondent. Les lignes identiques sont comptées sans être listées, pour qu’aucune différence ne soit noyée dans cette liste." - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -11758,12 +10936,6 @@ "formatSpecifier" : "lld", "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%arg lignes" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -11826,12 +10998,6 @@ "formatSpecifier" : "lld", "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%arg lignes" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -12726,12 +11892,6 @@ "formatSpecifier" : "lld", "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%arg lignes" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -12794,12 +11954,6 @@ "formatSpecifier" : "lld", "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%arg lignes" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -13010,18 +12164,15 @@ } } } + }, + "^[%lld change](inflect: true)" : { + }, "^[%lld column](inflect: true)" : { "localizations" : { "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%lld colonnes" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -13074,12 +12225,6 @@ "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%lld connexions utilisent ce profil. Elles en conservent les identifiants." - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -13115,12 +12260,6 @@ "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%lld lignes" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -13143,12 +12282,6 @@ "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%lld lignes" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -13201,12 +12334,6 @@ "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%lld lignes à exporter" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -13229,12 +12356,6 @@ "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%lld tables à exporter" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -15778,6 +14899,9 @@ } } } + }, + "A check needs an expression." : { + }, "A client certificate needs its client key. On the connection's Network tab, choose the client key, or clear the client certificate." : { "extractionState" : "manual", @@ -16251,6 +15375,9 @@ } } } + }, + "A dictionary for each row, keyed by column" : { + }, "A different file already exists at %@." : { "extractionState" : "stale", @@ -16384,6 +15511,9 @@ } } } + }, + "A field needs a type." : { + }, "A file" : { "localizations" : { @@ -16451,6 +15581,9 @@ } } } + }, + "A foreign key named “%@” already exists." : { + }, "A foreign key needs as many referenced columns as it has columns." : { "localizations" : { @@ -16461,6 +15594,9 @@ } } } + }, + "A foreign key staged in this diagram uses “%1$@.%2$@”. Save or undo that key before renaming the column." : { + }, "A foreign table" : { "localizations" : { @@ -16648,6 +15784,15 @@ } } } + }, + "A label cannot be empty." : { + + }, + "A label cannot be removed or moved once it exists." : { + + }, + "A larger binary value stays on the server until you open, copy or export it. Applies to tables with a primary key." : { + }, "A local secondary index is part of its table and is removed only with the table." : { "extractionState" : "manual", @@ -16740,6 +15885,9 @@ } } } + }, + "A name cannot be empty." : { + }, "A new child needs at least one value. The Realtime Database does not store empty nodes." : { "extractionState" : "manual", @@ -17170,6 +16318,9 @@ "A row needs a key. Bigtable has no empty row key." : { "extractionState" : "manual", "generatesSymbol" : false + }, + "A row still holds the values the change was made on. Refresh the table before saving again." : { + }, "A row the filter hides holds %@ in column “%@”, which %@ cannot store. Clear the filter to find it, or choose Save As and pick UTF-8." : { "localizations" : { @@ -17942,6 +17093,9 @@ }, "A transaction is open on this connection, and its uncommitted rows aren't in these counts." : { + }, + "A transaction is open on this connection. Commit or roll it back in TablePro, then run the shortcut again." : { + }, "A tunnel forwards one address, and the node Sentinel names is on the server's own network, so Sentinel mode cannot run through one. Connect to a data node directly, or turn the tunnel off." : { "extractionState" : "manual", @@ -19865,6 +19019,9 @@ } } } + }, + "Add a row to ${table}" : { + }, "Add a saved query to watch its result here." : { @@ -19960,6 +19117,15 @@ } } } + }, + "Add Check" : { + + }, + "Add check “%1$@”: %2$@" : { + + }, + "Add check %@" : { + }, "Add Check Constraint" : { "localizations" : { @@ -20329,6 +19495,12 @@ } } } + }, + "Add Field" : { + + }, + "Add field “%1$@” %2$@" : { + }, "Add filter" : { "localizations" : { @@ -20532,6 +19704,9 @@ }, "Add foreign key “%@”" : { + }, + "Add Foreign Key…" : { + }, "Add Global Index" : { "extractionState" : "manual", @@ -20711,7 +19886,6 @@ } }, "Add Label" : { - "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -20720,6 +19894,15 @@ } } } + }, + "Add label “%@” at the end" : { + + }, + "Add label “%1$@” after “%2$@”" : { + + }, + "Add label “%1$@” before “%2$@”" : { + }, "Add Label After…" : { "extractionState" : "stale", @@ -20797,6 +19980,16 @@ } } }, + "Add multiple rows to a table on a saved connection. Provide the rows as a JSON array, CSV text, or a file." : { + + }, + "Add one row to a table on a saved connection. Provide the row as a JSON object or a CSV row." : { + + }, + "Add plugin_debugger to shared_preload_libraries and restart the server." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, "Add Provider" : { "extractionState" : "stale", "localizations" : { @@ -20927,6 +20120,15 @@ } } } + }, + "Add Row to Table" : { + + }, + "Add Row to Table expects one row. Use Add Rows to Table for multiple rows." : { + + }, + "Add rows to ${table}" : { + }, "Add rows to it" : { "localizations" : { @@ -20937,6 +20139,9 @@ } } } + }, + "Add Rows to Table" : { + }, "Add Rule" : { "localizations" : { @@ -21214,6 +20419,19 @@ } } } + }, + "Added %lld rows to %@." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Added %1$lld rows to %2$@." + } + } + } + }, + "Added one row to %@." : { + }, "Adding check constraint %@ scans the table and fails if any existing row violates it." : { "localizations" : { @@ -21752,9 +20970,15 @@ } } } + }, + "After" : { + }, "After keyword expansion, Tab moves through fields such as %1$@, and %2$@ marks where the cursor ends up." : { + }, + "After the values already in %@" : { + }, "Agent" : { "localizations" : { @@ -22300,6 +21524,7 @@ } }, "AI Policy controls in-app AI agents. External Clients controls Raycast, Cursor, Claude Desktop, other MCP clients, and AppleScript. Effective scope is the minimum of the requesting token's scope and the External Clients level." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -22338,6 +21563,9 @@ } } } + }, + "AI Policy controls in-app AI agents. External Clients controls Raycast, Cursor, Claude Desktop, other MCP clients, AppleScript, and Shortcuts. Effective scope is the minimum of the requesting token's scope and the External Clients level." : { + }, "AI Provider" : { "extractionState" : "stale", @@ -22539,9 +21767,6 @@ } } } - }, - "After the values already in %@" : { - }, "Airplane" : { "extractionState" : "manual", @@ -22849,12 +22074,6 @@ "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "Toutes les %lld lignes sélectionnées" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -23861,6 +23080,9 @@ } } } + }, + "Allow NULL" : { + }, "Allowed Connections" : { "localizations" : { @@ -24075,6 +23297,9 @@ }, "already saved" : { + }, + "Also drop the columns, functions and other objects that use this type" : { + }, "Also handles" : { "localizations" : { @@ -28613,6 +27838,10 @@ } } }, + "Ask the SSH server's administrator to turn on a method TablePro supports." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, "Ask your administrator to register postgres/host.domain.com in the realm, and connect by hostname rather than IP address." : { "extractionState" : "manual", "generatesSymbol" : false @@ -28820,6 +28049,9 @@ } } } + }, + "At the End" : { + }, "At the end of the line" : { @@ -28860,6 +28092,9 @@ "Atom" : { "extractionState" : "manual", "generatesSymbol" : false + }, + "Attach" : { + }, "Attach a connection to this conversation first." : { "localizations" : { @@ -28910,6 +28145,12 @@ } } } + }, + "Attach Database" : { + + }, + "Attach Database…" : { + }, "Attached %1$d of %2$d files. %3$@" : { "localizations" : { @@ -28920,6 +28161,17 @@ } } } + }, + "Attached Databases" : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "Attached databases open only for a database file on this Mac, not for a database on a server." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "Attached each time the connection opens. Reach a table as name.table, and browse each database in the sidebar." : { + }, "Attachments" : { "extractionState" : "stale", @@ -31477,6 +30729,9 @@ "Bar Chart" : { "extractionState" : "manual", "generatesSymbol" : false + }, + "Base Type" : { + }, "Base URL" : { "localizations" : { @@ -31684,6 +30939,9 @@ } } } + }, + "Before" : { + }, "BEFORE, AFTER, or INSTEAD OF" : { "localizations" : { @@ -31988,6 +31246,9 @@ }, "Binary File" : { + }, + "Binary values limit must be between 1 and 1,048,576 KB." : { + }, "Block" : { "extractionState" : "stale", @@ -32372,6 +31633,9 @@ } } } + }, + "Both results stopped at the row cap and are compared on the rows they hold. A row past the cap can show as only on one side." : { + }, "Both sides are one connection, so the server copies the rows itself. There is no row-by-row progress, and Stop cannot interrupt it." : { "localizations" : { @@ -32768,6 +32032,15 @@ "Bug" : { "extractionState" : "manual", "generatesSymbol" : false + }, + "Build a join query from the selected tables" : { + + }, + "Build Join Query" : { + + }, + "Build Join Query…" : { + }, "Build the SQL that brings the target in line" : { "localizations" : { @@ -34387,6 +33660,9 @@ }, "Cannot be NULL." : { + }, + "Cannot Compare" : { + }, "Cannot connect to Ollama at %@. Is Ollama running?" : { "localizations" : { @@ -35817,6 +35093,9 @@ } } } + }, + "Change field “%1$@” to %2$@" : { + }, "Change File" : { "extractionState" : "stale", @@ -36108,6 +35387,7 @@ } }, "Change Primary Key" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -36824,6 +36104,7 @@ } }, "Charset:" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -37184,6 +36465,9 @@ } } } + }, + "Check" : { + }, "Check a query for correctness, cost, and risk against the live schema before running it" : { "localizations" : { @@ -37591,6 +36875,12 @@ } } } + }, + "Check the values already stored" : { + + }, + "Check the values already stored against the selected constraint" : { + }, "Checkered Flag" : { "extractionState" : "manual", @@ -37741,6 +37031,9 @@ "Checkmark" : { "extractionState" : "manual", "generatesSymbol" : false + }, + "Checks" : { + }, "Chinook (Sample)" : { "localizations" : { @@ -38144,6 +37437,7 @@ }, "Choose a location to save the diagram as PNG." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -38292,6 +37586,9 @@ } } } + }, + "Choose a Result" : { + }, "Choose a SAP HANA schema first." : { "extractionState" : "manual", @@ -38631,6 +37928,9 @@ } } } + }, + "Choose a Type" : { + }, "Choose AI provider and model" : { "localizations" : { @@ -39047,6 +38347,9 @@ } } } + }, + "Choose the base type." : { + }, "Choose the client certificate and key on the connection's Network tab." : { "extractionState" : "manual", @@ -39099,6 +38402,9 @@ } } } + }, + "Choose the database files to attach each time this connection opens." : { + }, "Choose the extension's file again in Edit Connection." : { "extractionState" : "manual", @@ -39135,6 +38441,7 @@ } }, "Choose Type" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -39175,6 +38482,7 @@ } }, "Choose Value" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -43480,6 +42788,7 @@ } }, "Collation:" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -45346,9 +44655,6 @@ } } } - }, - "Comment:" : { - }, "Comments" : { "localizations" : { @@ -45827,6 +45133,12 @@ } } } + }, + "Compare Result With…" : { + + }, + "Compare Results" : { + }, "Compare structure or data" : { "localizations" : { @@ -45997,6 +45309,9 @@ } } } + }, + "Compare With" : { + }, "Compared %@ keys in key order. Rows past the limit were not read on either side, and rows with NULL in a key column are not read under a limit." : { "localizations" : { @@ -46169,6 +45484,9 @@ } } } + }, + "Comparing" : { + }, "Comparing only. Changes applied earlier stay in the target." : { "localizations" : { @@ -46219,6 +45537,9 @@ } } } + }, + "Comparing…" : { + }, "Comparison cancelled." : { "localizations" : { @@ -46705,6 +46026,7 @@ }, "Configure an active provider to enable inline suggestions." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -47159,12 +46481,6 @@ "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connecter %lld connexions" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -48062,6 +47378,9 @@ } } } + }, + "connection" : { + }, "Connection" : { "localizations" : { @@ -49764,6 +49083,9 @@ } } } + }, + "Constraint Name" : { + }, "Constraints" : { "localizations" : { @@ -50110,8 +49432,12 @@ } } } + }, + "Controls how external clients (Raycast, Cursor, Claude Desktop, AppleScript, Shortcuts) access this connection. Tokens cannot exceed this level even with full-access scope." : { + }, "Controls how external clients (Raycast, Cursor, Claude Desktop, AppleScript) access this connection. Tokens cannot exceed this level even with full-access scope." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -50944,9 +50270,6 @@ } } } - }, - "Copy CREATE INDEX" : { - }, "Copy Cell Value" : { @@ -51113,6 +50436,9 @@ }, "Copy Count" : { + }, + "Copy CREATE INDEX" : { + }, "Copy DDL" : { "localizations" : { @@ -52603,6 +51929,10 @@ } } }, + "Could not attach \"%@\": %@" : { + "extractionState" : "manual", + "generatesSymbol" : false + }, "Could not attach %1$d files. %2$@" : { "localizations" : { "fr" : { @@ -52744,6 +52074,7 @@ }, "Could not build the column reorder for this table. If this engine's driver was installed before column reorder shipped, update it in Settings > Plugins." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -52800,6 +52131,7 @@ }, "Could not build the table rebuild for this change. If this engine's driver was installed before foreign key editing shipped, update it in Settings > Plugins." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -53016,6 +52348,9 @@ } } } + }, + "Could not connect to the database: %@" : { + }, "Could not create %@." : { "localizations" : { @@ -53666,6 +53001,9 @@ } } } + }, + "Could Not Load Value" : { + }, "Could not make another value for (%@) that does not repeat. Widen its range or generate fewer rows." : { @@ -54176,6 +53514,9 @@ } } } + }, + "Could not read the columns of %@." : { + }, "Could not read the file. It may have been deleted or moved." : { "localizations" : { @@ -54338,6 +53679,9 @@ }, "Could not read which rows are already in the table" : { + }, + "Could Not Refresh the Diagram" : { + }, "Could not release the file" : { "localizations" : { @@ -54541,6 +53885,9 @@ } } } + }, + "Could Not Stage the Change" : { + }, "Could not start a new TablePro instance. Quit and reopen manually." : { "localizations" : { @@ -55059,6 +54406,9 @@ }, "Couldn't Rename the Theme" : { + }, + "Couldn't Rename Type" : { + }, "Couldn't Restore Version" : { "localizations" : { @@ -56256,6 +55606,9 @@ } } } + }, + "Create Type" : { + }, "Create your own slash commands. Use {{query}}, {{schema}}, {{database}}, or {{body}} in the template to insert chat context at runtime." : { "localizations" : { @@ -56430,6 +55783,7 @@ } }, "Creating…" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -58494,6 +57848,9 @@ } } } + }, + "database" : { + }, "Database" : { "extractionState" : "manual", @@ -59494,6 +58851,9 @@ } } } + }, + "Database or Schema" : { + }, "Database Schema" : { "extractionState" : "manual", @@ -62131,12 +61491,6 @@ "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "Supprimer %lld connexions" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -62595,6 +61949,9 @@ }, "Delete foreign key “%@”" : { + }, + "Delete Foreign Key %@" : { + }, "Delete Group" : { "localizations" : { @@ -63038,6 +62395,7 @@ } }, "Delete Selected" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -67611,6 +66969,12 @@ } } } + }, + "Drop Constraint" : { + + }, + "Drop constraint “%@”" : { + }, "Drop Database" : { "extractionState" : "stale", @@ -67772,6 +67136,12 @@ } } } + }, + "Drop Field" : { + + }, + "Drop field “%@”" : { + }, "Drop Foreign Table" : { "localizations" : { @@ -68291,6 +67661,9 @@ }, "Drop Type" : { + }, + "Drop type “%@”?" : { + }, "Drop Type…" : { @@ -68374,6 +67747,9 @@ } } } + }, + "Dropped" : { + }, "dropping %@ '%@'" : { "localizations" : { @@ -69934,6 +69310,9 @@ } } } + }, + "Edit Field" : { + }, "Edit Foreign Key" : { "localizations" : { @@ -70192,16 +69571,16 @@ "Edit Search" : { }, - "Edit Settings" : { + "Edit Sequence" : { }, - "Edit Table Options" : { + "Edit Sequence…" : { }, - "Edit Sequence" : { + "Edit Settings" : { }, - "Edit Sequence…" : { + "Edit Table Options" : { }, "Edit the connection and choose its database type." : { @@ -70918,6 +70297,7 @@ } }, "Embedded analytical SQL" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -72130,6 +71510,7 @@ } }, "Engine:" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -72530,6 +71911,7 @@ } }, "Enter table name" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -73817,6 +73199,13 @@ } } }, + "Estimated impact %.1f%%" : { + + }, + "Estimated Plan" : { + "extractionState" : "manual", + "generatesSymbol" : false + }, "Estimated row count" : { "localizations" : { "fr" : { @@ -74057,13 +73446,6 @@ } } }, - "Estimated impact %.1f%%" : { - - }, - "Estimated Plan" : { - "extractionState" : "manual", - "generatesSymbol" : false - }, "etcd cannot filter with %@." : { "extractionState" : "manual", "generatesSymbol" : false, @@ -74418,6 +73800,9 @@ } } } + }, + "Every field needs a name." : { + }, "Every file in this folder matches the last commit." : { @@ -75891,12 +75276,6 @@ "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%lld instructions exécutées" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -77257,6 +76636,7 @@ } }, "Export as PNG" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -80499,6 +79879,7 @@ } }, "Failed to render the diagram image." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -82965,12 +82346,6 @@ "formatSpecifier" : "lld", "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%arg lignes" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -83253,6 +82628,7 @@ } }, "Find in file" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -83263,6 +82639,7 @@ } }, "Find in loaded rows" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -83853,6 +83230,9 @@ } } } + }, + "First Value" : { + }, "Fish" : { "extractionState" : "manual", @@ -85241,6 +84621,7 @@ }, "Formatter error: %@" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -85412,10 +84793,10 @@ } } }, - "From" : { + "Freeze Up to This Column" : { }, - "Freeze Up to This Column" : { + "From" : { }, "From %@…" : { @@ -90508,9 +89889,6 @@ }, "iCloud could not complete the sync. TablePro tries again on the next sync." : { - }, - "iCloud Full" : { - }, "iCloud Is Not Ready" : { @@ -90565,6 +89943,7 @@ } }, "iCloud Sync is active" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -91207,6 +90586,9 @@ } } } + }, + "import" : { + }, "Import" : { "extractionState" : "manual", @@ -94430,6 +93812,12 @@ }, "Inline suggestions and Review, Explain, Optimize and Fix run on this Mac and send nothing over the network." : { + }, + "Inner Join" : { + + }, + "insert" : { + }, "Insert" : { "extractionState" : "manual", @@ -97327,11 +96715,15 @@ "It stays on this Mac and never syncs, because it can name a command to run." : { }, - "It stopped after adding ^[%lld row](inflect: true)." : { + "It stays on this Mac and never syncs, because it names where your Vault token is sent." : { }, - "It stays on this Mac and never syncs, because it names where your Vault token is sent." : { + "It stopped after adding ^[%lld row](inflect: true)." : { + }, + "It supports these host key types: %@." : { + "extractionState" : "manual", + "generatesSymbol" : false }, "It was changed outside TablePro and no longer loads. Settings > Appearance lists it under Not Loaded with the reason." : { @@ -97521,6 +96913,9 @@ }, "Join condition:" : { + }, + "Joins" : { + }, "Joins this column with the one to its right." : { "localizations" : { @@ -97797,6 +97192,9 @@ } } } + }, + "Jump host %1$@ failed: %2$@" : { + }, "Jump host configuration is invalid" : { "localizations" : { @@ -98051,6 +97449,9 @@ } } } + }, + "KB" : { + }, "Keep a Table Open" : { "localizations" : { @@ -98673,6 +98074,12 @@ } } } + }, + "Key %@ matches more than one row in the left result. Choose key columns that identify a single row, or match whole rows." : { + + }, + "Key %@ matches more than one row in the right result. Choose key columns that identify a single row, or match whole rows." : { + }, "Key %@ was not found in the secret JSON." : { "localizations" : { @@ -99404,13 +98811,6 @@ } } }, - "This sequence's settings could not be read, so they cannot be changed here." : { - - }, - "This server can't show the default value of %@, so enter a value for it." : { - "extractionState" : "manual", - "generatesSymbol" : false - }, "keyword: %@" : { "localizations" : { "fr" : { @@ -99726,7 +99126,6 @@ } }, "Labels" : { - "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -100441,6 +99840,7 @@ } }, "Last synced %@" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -100954,13 +100354,7 @@ "extractionState" : "manual", "generatesSymbol" : false }, - "Set Next Value" : { - - }, - "Start" : { - - }, - "The increment cannot be zero." : { + "Left" : { }, "left curly bracket" : { @@ -101003,6 +100397,9 @@ } } } + }, + "Left Join" : { + }, "Left out" : { "localizations" : { @@ -101101,6 +100498,9 @@ } } } + }, + "left value, differs" : { + }, "Legacy UUID Encoding" : { "extractionState" : "manual", @@ -101441,6 +100841,7 @@ } }, "License expired, sync paused" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -101728,6 +101129,7 @@ } }, "License not verified in 30 days, sync paused. Click to check again." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -102491,6 +101893,16 @@ }, "Line %d" : { + }, + "Line %lld of the file is not valid %@ text." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Line %1$lld of the file is not valid %2$@ text." + } + } + } }, "Line break" : { "extractionState" : "manual", @@ -104669,6 +104081,9 @@ } } } + }, + "Load binary values up to" : { + }, "Load Extensions" : { "localizations" : { @@ -107304,6 +106719,9 @@ } } } + }, + "Match Whole Rows" : { + }, "Matched name" : { "localizations" : { @@ -110017,12 +109435,6 @@ } } } - }, - "Missing Index" : { - - }, - "Missing Indexes" : { - }, "Missing argument: %@" : { "extractionState" : "manual", @@ -110065,6 +109477,12 @@ } } } + }, + "Missing Index" : { + + }, + "Missing Indexes" : { + }, "Missing Profile" : { "localizations" : { @@ -110792,6 +110210,10 @@ } } }, + "More than one attached database is named \"%@\"." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, "More than one check constraint is named %@. Change or delete all of them in the same save." : { "localizations" : { "fr" : { @@ -112741,6 +112163,9 @@ "Name the table before the key, as in GET events/user#42." : { "extractionState" : "manual", "generatesSymbol" : false + }, + "Name the type." : { + }, "Name this selection" : { "localizations" : { @@ -112791,6 +112216,9 @@ } } } + }, + "Named by the server" : { + }, "Namespace" : { "extractionState" : "manual", @@ -113318,7 +112746,6 @@ } }, "New" : { - "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -114001,9 +113428,6 @@ } } } - }, - "New Sequence…" : { - }, "New image" : { "extractionState" : "manual", @@ -114059,6 +113483,9 @@ } } } + }, + "New Name" : { + }, "New password:" : { "localizations" : { @@ -114192,6 +113619,9 @@ }, "New Seed" : { + }, + "New Sequence…" : { + }, "New Session" : { "localizations" : { @@ -114405,7 +113835,6 @@ } }, "New Table" : { - "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -114610,9 +114039,11 @@ } } } + }, + "New Type" : { + }, "New Type…" : { - "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -115297,6 +114728,9 @@ } } } + }, + "No Attached Databases" : { + }, "No available local port for SSH tunnel" : { "localizations" : { @@ -115676,6 +115110,9 @@ } } } + }, + "No Columns in Common" : { + }, "No columns in common." : { "localizations" : { @@ -116259,6 +115696,9 @@ } } } + }, + "No data was provided to add." : { + }, "No database connection" : { "localizations" : { @@ -116581,6 +116021,7 @@ } }, "No DDL available" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -117039,6 +116480,12 @@ } } } + }, + "No foreign key links %@ to the tables before it, so it is cross joined." : { + + }, + "No Foreign Keys" : { + }, "No Foreign Keys Yet" : { "localizations" : { @@ -117201,6 +116648,7 @@ } }, "No iCloud" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -119233,6 +118681,9 @@ } } } + }, + "No Result to Compare With" : { + }, "No Results" : { "localizations" : { @@ -119343,6 +118794,9 @@ } } } + }, + "No row holds the values it was loaded with. Another client may have changed or deleted it." : { + }, "No Row Selected" : { "localizations" : { @@ -119935,6 +119389,9 @@ } } } + }, + "No sequences" : { + }, "No servers yet." : { "localizations" : { @@ -120257,7 +119714,6 @@ } }, "No Tables" : { - "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -120346,6 +119802,9 @@ } } } + }, + "No tables picked" : { + }, "No tables selected for export" : { "localizations" : { @@ -120728,9 +120187,6 @@ } } } - }, - "No sequences" : { - }, "No valid rows found in clipboard data." : { "localizations" : { @@ -121190,6 +120646,9 @@ } } } + }, + "None (Cross Join)" : { + }, "None (Top Level)" : { "localizations" : { @@ -122390,6 +121849,9 @@ } } } + }, + "Not loaded, %@" : { + }, "Not Now" : { "localizations" : { @@ -122430,6 +121892,9 @@ } } } + }, + "Not Null" : { + }, "NOT NULL" : { "extractionState" : "stale", @@ -122992,6 +122457,9 @@ } } } + }, + "Not validated" : { + }, "Not visible" : { "localizations" : { @@ -126120,6 +125588,18 @@ } } } + }, + "only in the left result" : { + + }, + "Only in the left result, not compared: %@" : { + + }, + "only in the right result" : { + + }, + "Only in the right result, not compared: %@" : { + }, "only in the source" : { "localizations" : { @@ -126140,6 +125620,16 @@ } } } + }, + "Only Left" : { + + }, + "Only PL/pgSQL functions and procedures can be debugged." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "Only Right" : { + }, "Only the first %1$lld nodes were loaded, so this value was not searched in full. Switch to %2$@ to search all of it." : { "localizations" : { @@ -126306,6 +125796,9 @@ } } } + }, + "open" : { + }, "Open" : { "localizations" : { @@ -127415,6 +126908,9 @@ }, "Open in Query Editor takes up to %@ rows." : { + }, + "Open in Query Tab" : { + }, "Open in Window" : { "localizations" : { @@ -128441,6 +127937,9 @@ } } } + }, + "Opens a database connection in TablePro" : { + }, "Opens an AWS Systems Manager port forwarding session through a target instance." : { "localizations" : { @@ -129497,6 +128996,9 @@ } } } + }, + "Other rows hold exactly the same values, so the change cannot reach this row alone." : { + }, "Other sessions keep reading the view. Slower, because the new rows are compared with the old ones." : { "localizations" : { @@ -129920,12 +129422,6 @@ } } } - }, - "Owned by" : { - - }, - "Owned by %@" : { - }, "output_path must end in .%@ for this format." : { "localizations" : { @@ -130066,6 +129562,12 @@ } } } + }, + "Owned by" : { + + }, + "Owned by %@" : { + }, "Owned objects" : { "localizations" : { @@ -133260,6 +132762,12 @@ } } } + }, + "Pick the result to compare this one with." : { + + }, + "Pick the tables to join. Their foreign keys become the join conditions." : { + }, "Pick the type of database you want to connect to." : { "localizations" : { @@ -134443,6 +133951,7 @@ } }, "Plugin requires app version %@ or later, but current version is %@" : { + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -134969,6 +134478,9 @@ } } } + }, + "Position" : { + }, "Position in the parent's declared order" : { "extractionState" : "manual", @@ -135242,6 +134754,7 @@ }, "Pre-connect script timed out after 10 seconds" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -135282,6 +134795,7 @@ } }, "Pre-connect script was cancelled" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -136932,6 +136446,7 @@ } }, "Priority %d" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -138488,6 +138003,9 @@ } } } + }, + "Provide a JSON object or an array of objects." : { + }, "Providers" : { "localizations" : { @@ -139462,6 +138980,9 @@ } } } + }, + "query" : { + }, "Query" : { "localizations" : { @@ -142616,9 +142137,6 @@ }, "Read the live server panels TablePro shows: active sessions, server metrics, and slow queries. Available on every engine that has a Server Dashboard in TablePro." : { - }, - "Read the live server panels TablePro shows: active sessions, server metrics, and slow queries. Available on PostgreSQL, MySQL, SQL Server, ClickHouse, and Typesense." : { - }, "Read the live server panels TablePro shows: active sessions, server metrics, and slow queries. Available on PostgreSQL, MySQL, SQL Server, ClickHouse, DuckDB, and SQLite." : { "extractionState" : "stale", @@ -144471,6 +143989,9 @@ }, "Referenced Value" : { + }, + "References" : { + }, "references %@" : { "localizations" : { @@ -144819,6 +144340,9 @@ } } } + }, + "Refuse NULL" : { + }, "Refuse the statement unless it only reads, even where the connection allows writes." : { @@ -145676,6 +145200,9 @@ } } } + }, + "Remove “%@”" : { + }, "Remove “%@”?" : { "localizations" : { @@ -145839,6 +145366,9 @@ } } } + }, + "Remove Attached Database" : { + }, "Remove attachment" : { "localizations" : { @@ -146959,6 +146489,12 @@ } } } + }, + "Remove the comment" : { + + }, + "Remove the default" : { + }, "Remove the extensions from this connection in Edit Connection." : { "extractionState" : "manual", @@ -146986,6 +146522,9 @@ } } } + }, + "Remove this change from the queue" : { + }, "Remove this rule" : { "localizations" : { @@ -147307,6 +146846,9 @@ } } } + }, + "Rename field “%1$@” to “%2$@”" : { + }, "Rename Folder" : { "localizations" : { @@ -147317,9 +146859,23 @@ } } } + }, + "Rename Label" : { + + }, + "Rename label “%1$@” to “%2$@”" : { + + }, + "Rename the selected label" : { + + }, + "Rename to “%@”" : { + + }, + "Rename Type" : { + }, "Rename…" : { - "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -147933,6 +147489,7 @@ } }, "Replace…" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -149010,13 +148567,14 @@ } } }, - "Resolve the conflict in a Git client before committing this file." : { + "Resident Memory" : { }, - "Resident Memory" : { + "Resolve the conflict in a Git client before committing this file." : { }, "Resolved on every connect. It stays on this Mac and never syncs, because it can name a command to run." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -150310,6 +149868,9 @@ } } } + }, + "Result %1$d: %2$@" : { + }, "Result %d" : { "localizations" : { @@ -150390,6 +149951,12 @@ } } } + }, + "Result Closed" : { + + }, + "Result Format" : { + }, "Result Options" : { "localizations" : { @@ -151400,6 +150967,9 @@ }, "Rewrites every text column to this character set. TEXT can grow to MEDIUMTEXT, and the table is copied while it runs." : { + }, + "Right" : { + }, "right curly bracket" : { "extractionState" : "manual", @@ -151523,6 +151093,9 @@ } } } + }, + "right value, differs" : { + }, "Right-click a cell and choose Highlight to color rows by value." : { "localizations" : { @@ -151986,6 +151559,9 @@ } } } + }, + "row" : { + }, "Row" : { "localizations" : { @@ -152026,6 +151602,9 @@ } } } + }, + "Row (JSON or CSV)" : { + }, "Row %@ already exists. Edit that row, or give the new one another key." : { "extractionState" : "manual", @@ -152630,6 +152209,9 @@ } } } + }, + "Row Limit" : { + }, "Row no longer exists" : { "localizations" : { @@ -152844,6 +152426,9 @@ } } } + }, + "rows" : { + }, "Rows" : { "localizations" : { @@ -152884,6 +152469,9 @@ } } } + }, + "Rows (JSON or CSV)" : { + }, "Rows %lld-%lld" : { "localizations" : { @@ -152985,9 +152573,6 @@ } } } - }, - "Rows in %1$@ break the foreign key %2$@." : { - }, "Rows in %@ changed after they were compared. Compare again before generating the script." : { "localizations" : { @@ -153001,6 +152586,9 @@ }, "Rows in %@ may block the delete (not counted)" : { + }, + "Rows in %1$@ break the foreign key %2$@." : { + }, "Rows in this export" : { "localizations" : { @@ -153519,6 +153107,9 @@ } } } + }, + "Rows with the same values in these columns are compared. With none chosen, whole rows are matched." : { + }, "Rows, each an array aligned with columns" : { "extractionState" : "manual", @@ -153705,6 +153296,9 @@ } } } + }, + "Run ${query} on ${connection}" : { + }, "Run a maintenance operation the engine supports, on one table or on the whole database. TablePro generates the statements; the user approves them. Needs tools:write." : { "localizations" : { @@ -153748,6 +153342,9 @@ }, "Run a saved query on the Server Dashboard" : { + }, + "Run a SQL statement on a saved connection and pass the result to the next action." : { + }, "Run All Statements" : { "localizations" : { @@ -153758,6 +153355,9 @@ } } } + }, + "Run another query in this tab, or pin a result in another tab." : { + }, "Run button beside each statement" : { "localizations" : { @@ -154080,6 +153680,9 @@ } } } + }, + "Run Query" : { + }, "Run Script" : { "localizations" : { @@ -156159,6 +155762,9 @@ } } } + }, + "Save Type Changes" : { + }, "Save…" : { "localizations" : { @@ -159326,6 +158932,9 @@ } } } + }, + "Second value" : { + }, "Second value is required for BETWEEN" : { "localizations" : { @@ -159590,6 +159199,9 @@ }, "Secret ID File" : { + }, + "Section" : { + }, "Section Header" : { "extractionState" : "stale", @@ -159723,6 +159335,9 @@ }, "Seed %@ made these rows. The next run starts from a new seed." : { + }, + "select" : { + }, "Select" : { "localizations" : { @@ -162810,9 +162425,6 @@ } } } - }, - "Set Next Value…" : { - }, "Set as Active" : { "localizations" : { @@ -163016,6 +162628,12 @@ }, "Set in connections.json." : { + }, + "Set Next Value" : { + + }, + "Set Next Value…" : { + }, "Set NULL" : { "localizations" : { @@ -163099,6 +162717,9 @@ } } } + }, + "Set the comment" : { + }, "Set the connection's username to the IAM principal (a user email, or `name@project.iam` for a service account). The database password is not used." : { "localizations" : { @@ -163139,6 +162760,9 @@ } } } + }, + "Set the default to %@" : { + }, "Set the Microsoft Entra ID application (client) ID for this connection." : { "extractionState" : "manual", @@ -163162,6 +162786,7 @@ }, "Set to NULL" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -163699,6 +163324,7 @@ } }, "Shell script to run before connecting. Non-zero exit aborts connection." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -163821,6 +163447,15 @@ } } } + }, + "Shortcuts" : { + + }, + "Shortcuts wants to add %1$lld rows to \"%2$@\"" : { + + }, + "Shortcuts wants to add a row to \"%@\"" : { + }, "Shortest" : { @@ -165498,6 +165133,9 @@ } } } + }, + "Show Structure of %@" : { + }, "Show system databases and schemas" : { "localizations" : { @@ -165857,12 +165495,6 @@ "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "%lld lignes affichées" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -168813,6 +168445,9 @@ } } } + }, + "Some rows are no longer in the table, so their values could not be read." : { + }, "Some rows couldn't be counted, so more rows may change than shown." : { @@ -169283,6 +168918,7 @@ } }, "Sorted ascending" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -169327,6 +168963,7 @@ "generatesSymbol" : false }, "Sorted descending" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -172074,6 +171711,9 @@ } } } + }, + "Start" : { + }, "Start one to ask about this connection." : { "localizations" : { @@ -172477,6 +172117,9 @@ } } } + }, + "Statement" : { + }, "Statement %1$d of %2$d failed: %3$@" : { "extractionState" : "manual", @@ -174298,7 +173941,6 @@ "generatesSymbol" : false }, "Stopping…" : { - "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -174973,6 +174615,9 @@ } } } + }, + "Subtype" : { + }, "Succeeded" : { "localizations" : { @@ -176506,11 +176151,9 @@ } } } - }, - "Sync Delayed" : { - }, "Sync Error" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -176767,6 +176410,7 @@ } }, "Synced" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -176853,6 +176497,7 @@ } }, "Syncing with iCloud…" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -177851,6 +177496,9 @@ }, "Table Created with Errors" : { + }, + "Table Data" : { + }, "Table DDL" : { "extractionState" : "manual", @@ -179110,7 +178758,6 @@ }, "TablePro" : { - "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -179150,6 +178797,42 @@ } } }, + "TablePro and the SSH server could not agree on how to encrypt the connection." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "TablePro and the SSH server have no cipher in common." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "TablePro and the SSH server have no key exchange or host key method in common." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "TablePro and the SSH server have no MAC algorithm in common." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "TablePro and the SSH server have no signature algorithm in common for this key." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "TablePro can't pass any value of type %2$@ to %1$@." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "TablePro can't read %@. Check that this account can see its source." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "TablePro can't read this unit's source." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "TablePro can't turn text into a %2$@ value for %1$@." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, "TablePro cannot sign an RDS token for \"%@\". Enter the RDS Endpoint (for example mydb.abc123.us-east-1.rds.amazonaws.com:5432) when you connect through a port forward or bastion." : { "extractionState" : "manual", "generatesSymbol" : false, @@ -180055,6 +179738,10 @@ } } }, + "TablePro signs RSA keys with rsa-sha2-256 or rsa-sha2-512, not with ssh-rsa, which uses SHA-1." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, "TablePro supports Oracle Database 11.1 and later. This server reports an older release (10g or earlier)." : { "extractionState" : "manual", "generatesSymbol" : false, @@ -180067,6 +179754,18 @@ } } }, + "TablePro supports these ciphers: %@." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "TablePro supports these key exchange methods: %@." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "TablePro supports these MAC algorithms: %@." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, "TablePro takes no funding and sells no data. If you want to do more, sponsorship goes to the same place." : { "localizations" : { "fr" : { @@ -182264,6 +181963,46 @@ } } }, + "Thanks to these license holders" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Merci à ces détenteurs de licence" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "라이선스를 구매해 주신 분들께 감사드립니다" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bu lisans sahiplerine teşekkürler" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cảm ơn những người đã mua giấy phép" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "感谢这些许可证持有者" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "感謝這些授權持有者" + } + } + } + }, "Thanks. Your license is what pays for the next release." : { "localizations" : { "fr" : { @@ -182313,6 +182052,9 @@ } } } + }, + "That connection no longer exists in TablePro." : { + }, "That destination is not valid for this engine." : { "extractionState" : "stale", @@ -182687,6 +182429,9 @@ } } } + }, + "That result is no longer open. Choose another one." : { + }, "That tab is not open." : { "localizations" : { @@ -183331,6 +183076,14 @@ } } }, + "The attached database \"%@\" has no file." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "The attached file \"%@\" has no name." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, "The authenticity of host '%@' can't be established.\n\n%@ key fingerprint is:\n%@\n\nAre you sure you want to continue connecting?" : { "localizations" : { "en" : { @@ -183839,6 +183592,9 @@ } } } + }, + "The cache must be at least 1." : { + }, "The catalog location is not a folder: %@" : { "localizations" : { @@ -183917,6 +183673,12 @@ }, "The changes were edited while the save was checking other tables. Save again to include them." : { + }, + "The changes were saved, but the type could not be read back. Reload before editing it again." : { + + }, + "The changes you have not saved will be lost." : { + }, "The chat and Agent mode keep the active provider." : { @@ -184004,12 +183766,13 @@ "The CHECK on column %@ names column %@, which this save renames. Save the rename on its own first." : { "extractionState" : "manual", "generatesSymbol" : false - }, - "The cache must be at least 1." : { - }, "The chosen theme is not on this Mac, so %@ is used." : { + }, + "The client certificate and key could not be written to a temporary file." : { + "extractionState" : "manual", + "generatesSymbol" : false }, "The client certificate at %@ could not be read as a PEM or DER certificate." : { "extractionState" : "manual", @@ -184549,6 +184312,9 @@ } } } + }, + "The column “%1$@” is no longer in “%2$@”." : { + }, "The column keeps %1$lld of its %2$lld digits after the point, so a longer fraction is rounded." : { "localizations" : { @@ -185326,6 +185092,9 @@ } } } + }, + "The CSV data has no header row." : { + }, "The Dameng connection is closed." : { "extractionState" : "manual", @@ -185390,6 +185159,12 @@ "The data changed after it was read." : { "extractionState" : "manual", "generatesSymbol" : false + }, + "The data could not be read: %@" : { + + }, + "The data has no values to insert into %@." : { + }, "The database “%@” has an open transaction. Closing rolls it back and discards its uncommitted changes." : { "localizations" : { @@ -185802,6 +185577,7 @@ }, "The diagram could not be converted to a PNG image." : { "comment" : "Error message when the ER diagram could not be exported as PNG.", + "extractionState" : "stale", "isCommentAutoGenerated" : true, "localizations" : { "fr" : { @@ -185844,6 +185620,9 @@ }, "The diagram could not be rendered as %@." : { + }, + "The diagram is saving its changes. Make this change once the save has finished." : { + }, "The disconnect was cancelled." : { "localizations" : { @@ -186530,6 +186309,9 @@ } } } + }, + "The first column of the first row" : { + }, "The first sheet has no header row to map columns from." : { "extractionState" : "manual", @@ -186679,6 +186461,9 @@ } } } + }, + "The foreign key “%1$@” is no longer on “%2$@”." : { + }, "The form produced no statements to run." : { "localizations" : { @@ -186778,6 +186563,9 @@ } } } + }, + "The increment cannot be zero." : { + }, "The index %@ is left out" : { "localizations" : { @@ -186813,9 +186601,6 @@ }, "The installed %1$@ does not support %2$@. Update it in Settings > Extensions." : { - }, - "The installed %1$@ does not support %2$@. Update it in Settings > Plugins." : { - }, "The instance connection name must be in the form project:region:instance." : { "localizations" : { @@ -186883,6 +186668,9 @@ } } } + }, + "The JSON array must contain only objects." : { + }, "The JSON is nested more deeply than DynamoDB allows" : { "extractionState" : "manual", @@ -187032,6 +186820,9 @@ } } } + }, + "The left result stopped at the row cap and is compared on the %@ rows it holds. A row past the cap can show as only on the right." : { + }, "The license has been suspended." : { "localizations" : { @@ -187703,6 +187494,9 @@ } } } + }, + "The minimum must be less than the maximum." : { + }, "The MongoDB client library will not insert a field whose name is empty. Remove the field, then set it on the saved document." : { "extractionState" : "manual", @@ -187727,6 +187521,9 @@ } } } + }, + "The name a statement uses for this database, as in name.table." : { + }, "The name of a DIRECTORY object, not a path. The DBA who created it chose where it points." : { "extractionState" : "stale", @@ -189316,6 +189113,9 @@ } } } + }, + "The request timed out." : { + }, "The request to BigQuery timed out." : { "extractionState" : "manual", @@ -189388,6 +189188,9 @@ } } } + }, + "The right result stopped at the row cap and is compared on the %@ rows it holds. A row past the cap can show as only on the left." : { + }, "The rollback did not undo everything. A statement in the file, such as COMMIT, CREATE, ALTER or DROP, committed the import's transaction as it ran, so some of the statements before the failure were kept." : { @@ -189418,6 +189221,9 @@ "The routine was stopped, and its uncommitted changes were rolled back." : { "extractionState" : "manual", "generatesSymbol" : false + }, + "The row could not be looked up: %@" : { + }, "The row filter on %@ was not a single expression, so every row was exported." : { "extractionState" : "manual", @@ -189443,6 +189249,14 @@ "extractionState" : "manual", "generatesSymbol" : false }, + "The row has no loaded values to be found by." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "The row's loaded values are missing, so it cannot be found again." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, "The row's primary key is not loaded, so the row cannot be found." : { "extractionState" : "manual", "generatesSymbol" : false, @@ -189601,9 +189415,6 @@ } } } - }, - "The minimum must be less than the maximum." : { - }, "The save also truncated or dropped a table." : { "localizations" : { @@ -189783,6 +189594,9 @@ } } } + }, + "The saved list could not be read. Adding a database replaces it." : { + }, "The saved list could not be read. Adding an extension replaces it." : { "localizations" : { @@ -189794,6 +189608,10 @@ } } }, + "The saved list of attached databases is not in a format TablePro can read." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, "The saved Microsoft Entra ID sign-in expired. Sign in again." : { "extractionState" : "manual", "generatesSymbol" : false, @@ -189903,6 +189721,9 @@ } } } + }, + "The schema changes staged in this diagram will be lost." : { + }, "The script already ran. Compare again to see where the target stands." : { "localizations" : { @@ -190346,6 +190167,22 @@ } } }, + "The server offers only ciphers TablePro no longer supports: %@." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "The server offers only host key types TablePro no longer supports: %@." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "The server offers only key exchange methods TablePro no longer supports: %@." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "The server offers only MAC algorithms TablePro no longer supports: %@." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, "The server redirected the request to %@. TablePro does not follow redirects, and the coordinator never sends one, so a proxy in front of it did. Check the host, port and SSL Mode." : { "extractionState" : "manual", "generatesSymbol" : false @@ -190373,6 +190210,12 @@ } } } + }, + "The server refused a change, so nothing was saved." : { + + }, + "The server refused a change. The changes before it were saved." : { + }, "The server rejected TablePro's credential." : { "localizations" : { @@ -190442,6 +190285,10 @@ } } }, + "The server runs %@." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, "The server sent an unexpected message and the connection was reset. Run the query again." : { "extractionState" : "manual", "generatesSymbol" : false, @@ -191139,6 +190986,9 @@ } } } + }, + "The SSH server closed the connection during the handshake." : { + }, "The SSH server closed the connection while the agent's keys were being offered. Servers accept a limited number of tries, 6 by default, and an agent holding more keys than that runs out before the right one. Name the key with IdentityFile and IdentitiesOnly yes for this host in ~/.ssh/config, or set Identity File on this connection." : { "localizations" : { @@ -191331,6 +191181,9 @@ } } } + }, + "The SSH server ended the connection during the handshake: %@" : { + }, "The SSH server is asking for additional verification." : { "localizations" : { @@ -191547,6 +191400,7 @@ } }, "The statement that was sent, with its prefix" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -191679,6 +191533,10 @@ } } }, + "The structure of a table in an attached database cannot be changed here." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, "The structure of the tables this query uses is read when the request is sent." : { "localizations" : { "fr" : { @@ -192424,6 +192282,9 @@ } } } + }, + "The text encoding is invalid." : { + }, "The text is not valid JSON." : { "extractionState" : "manual", @@ -192788,6 +192649,12 @@ } } } + }, + "The two results share no column name, so there is nothing to compare." : { + + }, + "The type changed on the server since it was read. Reload it, then save again." : { + }, "The type's shape, such as enum, composite, domain, range, aliasType, tableType or clrType" : { "localizations" : { @@ -193769,6 +193636,10 @@ } } }, + "This _id reads as more than one value type in this collection, such as text and an ObjectId, so TablePro cannot tell which document the row names. Use a query." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, "This account signs in with Kerberos. Set Authentication to Kerberos (GSSAPI), then reconnect." : { "extractionState" : "manual", "generatesSymbol" : false @@ -193970,6 +193841,15 @@ "This call matches more than one overload of %@, so Oracle can't run it (PLS-00307)." : { "extractionState" : "manual", "generatesSymbol" : false + }, + "This cannot be undone. The drop fails while a column or other object still uses it." : { + + }, + "This cannot be undone. Without Cascade, the drop fails while a column, function or other type still uses it." : { + + }, + "This change does not apply to this kind of type." : { + }, "This change needs %@ to be recreated, and it cannot be recreated from the definition the database stored for it. Virtual tables, such as full-text search tables, are the usual reason." : { "localizations" : { @@ -194793,6 +194673,9 @@ } } } + }, + "This connection's startup commands leave a transaction open, so rows added from Shortcuts could not be committed." : { + }, "This conversation is too long to continue. Start a new conversation and send your message there." : { "localizations" : { @@ -194964,6 +194847,9 @@ } } } + }, + "This database cannot make the change “%@”." : { + }, "This database cannot reference a table in another schema." : { "localizations" : { @@ -195310,6 +195196,9 @@ } } } + }, + "This database reports no tables to join." : { + }, "This database reports no tables to search." : { @@ -198163,6 +198052,7 @@ } }, "This plugin requires TablePro %@ or later" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -198567,6 +198457,16 @@ } } } + }, + "This sequence's settings could not be read, so they cannot be changed here." : { + + }, + "This server can't show the default value of %@, so enter a value for it." : { + "extractionState" : "manual", + "generatesSymbol" : false + }, + "This server cannot rename a label." : { + }, "This server did not identify as Databend. Check the host and port of its MySQL handler." : { "extractionState" : "manual", @@ -199013,6 +198913,9 @@ } } } + }, + "This Tab" : { + }, "This tab is on %@. Switch the connection to that database to run it." : { "localizations" : { @@ -201544,6 +201447,9 @@ } } } + }, + "Too many rows. Add up to %lld rows at a time." : { + }, "Tool" : { "localizations" : { @@ -203441,6 +203347,7 @@ }, "Try again, or install the plugin from Settings > Plugins." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -203609,6 +203516,9 @@ } } } + }, + "Turn off to add the check now and validate the stored values later." : { + }, "Turn on Apple Intelligence in System Settings > Apple Intelligence & Siri." : { @@ -203771,6 +203681,7 @@ }, "Type %@ in the query to set where the cursor lands after keyword expansion." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -206655,9 +206566,6 @@ } } } - }, - "Update Needed" : { - }, "Update Now" : { "localizations" : { @@ -206703,6 +206611,7 @@ }, "Update or reinstall the plugin in Settings > Plugins." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -206888,6 +206797,7 @@ }, "Update the database driver in Settings > Plugins to run a batch more than once with GO." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -206898,6 +206808,7 @@ } }, "Update the database driver in Settings > Plugins to run several statements in one call." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -209108,6 +209019,15 @@ } } } + }, + "Validate" : { + + }, + "Validate constraint “%@”" : { + + }, + "Validated on save" : { + }, "Validation Failed" : { "localizations" : { @@ -209819,12 +209739,6 @@ "fr" : { "variations" : { "plural" : { - "many" : { - "stringUnit" : { - "state" : "translated", - "value" : "Valeurs de %lld lignes chargées" - } - }, "one" : { "stringUnit" : { "state" : "translated", @@ -211120,6 +211034,7 @@ } }, "Vim mode" : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -211448,6 +211363,12 @@ }, "Warnings: %d" : { + }, + "Was “%@”" : { + + }, + "Was %@" : { + }, "Watch shared folders for connection files." : { "localizations" : { @@ -213518,6 +213439,9 @@ } } } + }, + "Whole row" : { + }, "Whole Words" : { "localizations" : { @@ -215040,6 +214964,7 @@ } }, "You have unsaved changes to the table structure. Refreshing will discard these changes." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { diff --git a/apple/TablePro/Resources/Supporters.json b/apple/TablePro/Resources/Supporters.json new file mode 100644 index 0000000000..75d509d60e --- /dev/null +++ b/apple/TablePro/Resources/Supporters.json @@ -0,0 +1,3 @@ +{ + "supporters": [] +} diff --git a/apple/TableProTests/Core/Menu/AboutPanelCreditsTests.swift b/apple/TableProTests/Core/Menu/AboutPanelCreditsTests.swift new file mode 100644 index 0000000000..0dbdad099f --- /dev/null +++ b/apple/TableProTests/Core/Menu/AboutPanelCreditsTests.swift @@ -0,0 +1,44 @@ +// +// AboutPanelCreditsTests.swift +// TableProTests +// + +import Foundation +@testable import TablePro +import Testing + +@MainActor +struct AboutPanelCreditsTests { + @Test("Named license holders follow the project links") + func listsSupporters() throws { + let credits = AboutPanelCredits.attributedString(supporters: ["Ada Lovelace", "Grace Hopper"]).string + + #expect(credits.contains("Thanks to these license holders")) + #expect(credits.contains("Ada Lovelace, Grace Hopper")) + let links = try #require(credits.range(of: "GitHub")) + let names = try #require(credits.range(of: "Ada Lovelace")) + #expect(links.lowerBound < names.lowerBound) + } + + @Test("With nobody listed, the credits stay the project links alone") + func emptyListAddsNothing() { + let credits = AboutPanelCredits.attributedString(supporters: []).string + + #expect(!credits.contains("Thanks to these license holders")) + #expect(!credits.contains("\n")) + } + + @Test("Blank entries and stray spaces in the list never reach the panel") + func decodeTrimsAndDropsBlanks() throws { + let data = Data(#"{"supporters": [" Ada Lovelace ", "", " ", "Grace Hopper"]}"#.utf8) + + #expect(try SupporterList.decode(data) == ["Ada Lovelace", "Grace Hopper"]) + } + + @Test("The list the app ships decodes") + func bundledListDecodes() throws { + let url = try #require(Bundle.main.url(forResource: SupporterList.resourceName, withExtension: "json")) + + _ = try SupporterList.decode(Data(contentsOf: url)) + } +} diff --git a/apple/changelog.d/3923.added.md b/apple/changelog.d/3923.added.md new file mode 100644 index 0000000000..09d17d7b1c --- /dev/null +++ b/apple/changelog.d/3923.added.md @@ -0,0 +1 @@ +The About panel thanks, by name, license holders who asked to be listed.