diff --git a/Account/Sources/Account/Resources/en-GB.lproj/Localizable.strings b/Account/Sources/Account/Resources/en-GB.lproj/Localizable.strings index 852c08f67..7dcf14c8f 100644 --- a/Account/Sources/Account/Resources/en-GB.lproj/Localizable.strings +++ b/Account/Sources/Account/Resources/en-GB.lproj/Localizable.strings @@ -1,16 +1,120 @@ -/* - Localizable.strings - +/* Feedly – Could not move a feed between folders/collections. */ +"“%@” may be in both “%@” and “%@”." = "“%1$@” may be in both “%2$@” and “%3$@”."; + +/* Status bar progress */ +"%@ of %@" = "%1$@ of %2$@"; + +/* Unknown error */ +"A Reddit Feed Provider error has occurred." = "A Reddit Feed Provider error has occurred."; + +/* Account name */ +"account.name.ipad" = "On My iPad"; + +/* Account name */ +"account.name.iphone" = "On My iPhone"; + +/* Account name */ +"account.name.mac" = "On My Mac"; + +/* All */ +"All" = "All"; + +/* Reddit Access */ +"An attempt to access your Reddit feed(s) failed.\n\nIf this problem persists, please deactivate and reactivate the Reddit extension to fix this problem.\n\n(error.localizedDescription)" = "An attempt to access your Reddit feed(s) failed.\n\nIf this problem persists, please deactivate and reactivate the Reddit extension to fix this problem."; + +/* Unknown error */ +"An error occurred while processing the “%@” account: %@" = "An error occurred while processing the “%1$@” account: %2$@"; + +/* An invalid parameter was passed. */ +"An invalid parameter was passed." = "An invalid parameter was passed."; + +/* An unexpected CloudKit error occurred. */ +"An unexpected CloudKit error occurred." = "An unexpected CloudKit error occurred."; + +/* An unexpected error occurred. */ +"An unexpected error occurred." = "An unexpected error occurred."; + +/* Best */ +"Best" = "Best"; + +/* OAuth - recovery suggestion - ensure browser selected supports web authentication. */ +"Check your default web browser in System Preferences or change it to Safari and try again." = "Check your default web browser in System Preferences or change it to Safari and try again."; + +/* Feedly – Could not create a folder/collection. */ +"Could not create a folder named “%@”." = "Could not create a folder named “%@”."; + +/* Feedly – Could not encode resource id to send to Feedly. */ +"Could not encode the identifier “%@”." = "Could not encode the identifier “%@”."; + +/* Feedly – Could not move a feed between folders/collections. */ +"Could not move “%@” to “%@”." = "Could not move “%1$@” to “%2$@”."; + +/* Feedly – Could not remove a feed. */ +"Could not remove “%@”." = "Could not remove “%@”."; + +/* Feedly – Could not remove a folder/collection. */ +"Could not remove the folder named “%@”." = "Could not remove the folder named “%@”."; + +/* Feedly – Could not rename a feed. + Feedly – Could not rename a folder/collection. */ +"Could not rename “%@” to “%@”." = "Could not rename “%1$@” to “%2$@”."; + +/* (No Comment) */ +"error.message.already-subscribed" = "You are already subscribed to this feed and can’t add it again."; + +/* Your ”%@” credentials have expired. */ +"error.message.credentials-expired.%@" = "Your ”%@” credentials have expired."; + +/* You are already subscribed to this feed and can’t add it again. */ +"error.message.feed-already-subscribed" = "You are already subscribed to this feed and can’t add it again."; - Created by Stuart Breckenridge on 11/03/2023. +/* Can’t add a feed because no feed was found. */ +"error.message.feed-not-found" = "Can’t add a feed because no feed was found."; + +/* An OPML import for this account is already running. */ +"error.message.opml-import-in-progress" = "An OPML import for this account is already running."; + +/* Already Subscribed */ +"error.title.already-subscribed" = "Already Subscribed"; + +/* Error */ +"error.title.error" = "Error"; + +/* Localizable.strings -*/ + Created by Stuart Breckenridge on 11/03/2023. */ "error.title.feed-not-found" = "Unable to Add Feed"; -"error.title.already-subscribed" = "Already Subscribed"; + +/* OPML Import in Progress */ "error.title.ompl-import-in-progress" = "OPML Import in Progress"; -"error.title.error" = "Error"; -"error.message.feed-not-found" = "Can’t add a feed because no feed was found."; -"error.message.already-subscribed" = "You are already subscribed to this feed and can’t add it again."; -"error.message.opml-import-in-progress" = "An OPML import for this account is already running."; +/* Feedbin */ +"Feedbin" = "Feedbin"; + +/* Feedly */ +"Feedly" = "Feedly"; + +/* Feedly – Feed can only be added to folders. */ +"Feeds cannot be added to the “%@” folder." = "Feedly – Feed can only be added to folders."; + +/* FreshRSS */ +"FreshRSS" = "FreshRSS"; + +/* Notify about new articles + Show notifications for new articles */ +"label.text.show-notifications-for-new-articles" = "Notify about new articles"; + +/* Notify about new posts + Show notifications for new posts */ +"label.text.show-notifications-for-new-posts" = "Notify about new posts"; + +/* New */ +"New" = "New"; + +/* NewsBlur */ +"NewsBlur" = "NewsBlur"; + +/* Feedly – Credentials not found. */ +"Please add the Feedly account again. If this problem persists, open Keychain Access and delete all feedly.com entries, then try again." = "Please add the Feedly account again. If this problem persists, open Keychain Access and delete all feedly.com entries, then try again."; + diff --git a/Account/Sources/Account/Resources/en.lproj/Localizable.strings b/Account/Sources/Account/Resources/en.lproj/Localizable.strings index 852c08f67..ff20bd26b 100644 --- a/Account/Sources/Account/Resources/en.lproj/Localizable.strings +++ b/Account/Sources/Account/Resources/en.lproj/Localizable.strings @@ -1,16 +1,27 @@ -/* - Localizable.strings - +/* Reddit Access */ +"An attempt to access your Reddit feed(s) failed.\n\nIf this problem persists, please deactivate and reactivate the Reddit extension to fix this problem.\n\n(error.localizedDescription)" = "An attempt to access your Reddit feed(s) failed.\n\nIf this problem persists, please deactivate and reactivate the Reddit extension to fix this problem."; + +/* (No Comment) */ +"error.message.already-subscribed" = "You are already subscribed to this feed and can’t add it again."; + +/* Can’t add a feed because no feed was found. */ +"error.message.feed-not-found" = "Can’t add a feed because no feed was found."; + +/* An OPML import for this account is already running. */ +"error.message.opml-import-in-progress" = "An OPML import for this account is already running."; + +/* Already Subscribed */ +"error.title.already-subscribed" = "Already Subscribed"; - Created by Stuart Breckenridge on 11/03/2023. +/* Error */ +"error.title.error" = "Error"; + +/* Localizable.strings -*/ + Created by Stuart Breckenridge on 11/03/2023. */ "error.title.feed-not-found" = "Unable to Add Feed"; -"error.title.already-subscribed" = "Already Subscribed"; + +/* OPML Import in Progress */ "error.title.ompl-import-in-progress" = "OPML Import in Progress"; -"error.title.error" = "Error"; -"error.message.feed-not-found" = "Can’t add a feed because no feed was found."; -"error.message.already-subscribed" = "You are already subscribed to this feed and can’t add it again."; -"error.message.opml-import-in-progress" = "An OPML import for this account is already running."; diff --git a/Mac/AppDelegate.swift b/Mac/AppDelegate.swift index 6cde701c4..435245cbf 100644 --- a/Mac/AppDelegate.swift +++ b/Mac/AppDelegate.swift @@ -610,8 +610,8 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations, if keyboardShortcutsWindowController == nil { keyboardShortcutsWindowController = WebViewWindowController(title: NSLocalizedString("window.title.keyboard-shortcuts", comment: "Keyboard Shortcuts")) - let htmlFile = Bundle(for: type(of: self)).path(forResource: "KeyboardShortcuts", ofType: "html")! - keyboardShortcutsWindowController?.displayContents(of: htmlFile) + keyboardShortcutsWindowController?.displayContents(of: KeyboardHTML().htmlFile()) + if let window = keyboardShortcutsWindowController?.window { let point = NSPoint(x: 128, y: 64) diff --git a/Mac/Base.lproj/Main.storyboard b/Mac/Base.lproj/Main.storyboard index 50342563a..bcd1664d4 100644 --- a/Mac/Base.lproj/Main.storyboard +++ b/Mac/Base.lproj/Main.storyboard @@ -1,8 +1,7 @@ - + - - + diff --git a/Mac/CrashReporter/en-GB.lproj/CrashReporterWindow.strings b/Mac/CrashReporter/en-GB.lproj/CrashReporterWindow.strings index 1b8a30ec8..0f479fe5a 100644 --- a/Mac/CrashReporter/en-GB.lproj/CrashReporterWindow.strings +++ b/Mac/CrashReporter/en-GB.lproj/CrashReporterWindow.strings @@ -1,13 +1,6 @@ - /* Class = "NSButtonCell"; title = "Send Crash Log"; ObjectID = "7ot-Ev-JTY"; */ "7ot-Ev-JTY.title" = "Send Crash Log"; -/* Class = "NSTextFieldCell"; title = "To help us fix crashing bugs, click Send Crash Log. Below is the text that will be sent to Brent. No other information will be sent."; ObjectID = "O6E-xl-G55"; */ -"O6E-xl-G55.title" = "To help us fix crashing bugs, click Send Crash Log. Below is the text that will be sent to Brent. No other information will be sent."; - -/* Class = "NSWindow"; title = "Crash Log Reporter"; ObjectID = "QvC-M9-y7g"; */ -"QvC-M9-y7g.title" = "Crash Log Reporter"; - /* Class = "NSTextFieldCell"; title = "Privacy Policy"; ObjectID = "a10-hs-ajA"; */ "a10-hs-ajA.title" = "Privacy Policy"; @@ -22,3 +15,10 @@ /* Class = "NSTextFieldCell"; title = "You can skip this window in the future by telling NetNewsWire to automatically send crash logs. You can also turn this setting on and off in the Preferences window, in the Advanced section."; ObjectID = "nou-5k-c1U"; */ "nou-5k-c1U.title" = "You can skip this window in the future by telling NetNewsWire to automatically send crash logs. You can also turn this setting on and off in the Preferences window, in the Advanced section."; + +/* Class = "NSTextFieldCell"; title = "To help us fix crashing bugs, click Send Crash Log. Below is the text that will be sent to Brent. No other information will be sent."; ObjectID = "O6E-xl-G55"; */ +"O6E-xl-G55.title" = "To help us fix crashing bugs, click Send Crash Log. Below is the text that will be sent to Brent. No other information will be sent."; + +/* Class = "NSWindow"; title = "Crash Log Reporter"; ObjectID = "QvC-M9-y7g"; */ +"QvC-M9-y7g.title" = "Crash Log Reporter"; + diff --git a/Mac/Inspector/en-GB.lproj/Inspector.strings b/Mac/Inspector/en-GB.lproj/Inspector.strings index b76eab0c0..13f4f20b7 100644 --- a/Mac/Inspector/en-GB.lproj/Inspector.strings +++ b/Mac/Inspector/en-GB.lproj/Inspector.strings @@ -1,10 +1,15 @@ - /* Class = "NSTextFieldCell"; title = "Label"; ObjectID = "3v9-Z7-d7l"; */ "3v9-Z7-d7l.title" = "Label"; /* Class = "NSTextFieldCell"; title = "Multiple selection"; ObjectID = "5oG-0x-T8O"; */ "5oG-0x-T8O.title" = "Multiple selection"; +/* Class = "NSButtonCell"; title = "Always use Reader view"; ObjectID = "aRe-yV-R0h"; */ +"aRe-yV-R0h.title" = "Always use Reader view"; + +/* Class = "NSWindow"; title = "Inspector"; ObjectID = "bma-LM-jVu"; */ +"bma-LM-jVu.title" = "Inspector"; + /* Class = "NSButtonCell"; title = "Show notifications for new articles"; ObjectID = "Bw5-c7-yDX"; */ "Bw5-c7-yDX.title" = "Show notifications for new articles"; @@ -17,27 +22,21 @@ /* Class = "NSTextFieldCell"; title = "http://example.com/feed"; ObjectID = "HpC-rK-YGK"; */ "HpC-rK-YGK.title" = "http://example.com/feed"; -/* Class = "NSTextFieldCell"; title = "http://example.com/"; ObjectID = "L2p-ur-j7a"; */ -"L2p-ur-j7a.title" = "http://example.com/"; - -/* Class = "NSTextFieldCell"; title = "Folder\nName\nField"; ObjectID = "Xl3-7D-9Mw"; */ -"Xl3-7D-9Mw.title" = "Folder\nName\nField"; - -/* Class = "NSButtonCell"; title = "Always use Reader view"; ObjectID = "aRe-yV-R0h"; */ -"aRe-yV-R0h.title" = "Always use Reader view"; - -/* Class = "NSWindow"; title = "Inspector"; ObjectID = "bma-LM-jVu"; */ -"bma-LM-jVu.title" = "Inspector"; - /* Class = "NSTextFieldCell"; title = "Nothing to inspect"; ObjectID = "iLD-8q-EAJ"; */ "iLD-8q-EAJ.title" = "Nothing to inspect"; +/* Class = "NSTextFieldCell"; title = "http://example.com/"; ObjectID = "L2p-ur-j7a"; */ +"L2p-ur-j7a.title" = "http://example.com/"; + /* Class = "NSViewController"; title = "Feed"; ObjectID = "sfH-oR-GXm"; */ "sfH-oR-GXm.title" = "Feed"; /* Class = "NSTextFieldCell"; title = "Feed\nName\nField"; ObjectID = "tAO-GI-MT1"; */ "tAO-GI-MT1.title" = "Feed\nName\nField"; +/* Class = "NSTextFieldCell"; title = "Folder\nName\nField"; ObjectID = "Xl3-7D-9Mw"; */ +"Xl3-7D-9Mw.title" = "Folder\nName\nField"; + /* Class = "NSViewController"; title = "Builtin Smart Feed"; ObjectID = "ye3-co-8lc"; */ "ye3-co-8lc.title" = "Builtin Smart Feed"; @@ -46,3 +45,4 @@ /* Class = "NSTextFieldCell"; title = "Feed"; ObjectID = "zzB-rX-1dK"; */ "zzB-rX-1dK.title" = "Feed"; + diff --git a/Mac/MainWindow/NNW3/en-GB.lproj/NNW3OpenPanelAccessoryView.strings b/Mac/MainWindow/NNW3/en-GB.lproj/NNW3OpenPanelAccessoryView.strings new file mode 100644 index 000000000..edca88e4b --- /dev/null +++ b/Mac/MainWindow/NNW3/en-GB.lproj/NNW3OpenPanelAccessoryView.strings @@ -0,0 +1,15 @@ +/* Class = "NSMenuItem"; title = "Item 3"; ObjectID = "hAU-Zh-UCo"; */ +"hAU-Zh-UCo.title" = "Item 3"; + +/* Class = "NSTextFieldCell"; title = "Choose a NetNewsWire 3 “Subscriptions.plist” file.\n\nThen choose the account to receive your imported subscriptions."; ObjectID = "IFj-4w-B03"; */ +"IFj-4w-B03.title" = "Choose a NetNewsWire 3 “Subscriptions.plist” file.\n\nThen choose the account to receive your imported subscriptions."; + +/* Class = "NSMenuItem"; title = "Item 1"; ObjectID = "OAk-KA-y5i"; */ +"OAk-KA-y5i.title" = "Item 1"; + +/* Class = "NSTextFieldCell"; title = "Account:"; ObjectID = "uoh-QY-7LX"; */ +"uoh-QY-7LX.title" = "Account:"; + +/* Class = "NSMenuItem"; title = "Item 2"; ObjectID = "zkS-Dx-uCM"; */ +"zkS-Dx-uCM.title" = "Item 2"; + diff --git a/Mac/MainWindow/OPML/en-GB.lproj/ExportOPMLSheet.strings b/Mac/MainWindow/OPML/en-GB.lproj/ExportOPMLSheet.strings new file mode 100644 index 000000000..904ae9114 --- /dev/null +++ b/Mac/MainWindow/OPML/en-GB.lproj/ExportOPMLSheet.strings @@ -0,0 +1,24 @@ +/* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "6lK-bV-Vwd"; */ +"6lK-bV-Vwd.title" = "Cancel"; + +/* Class = "NSTextFieldCell"; title = "Choose the account with the subscriptions you’d like to export. Subscriptions are exported in the standard OPML format, which most RSS readers can import."; ObjectID = "7Ap-KG-Lc7"; */ +"7Ap-KG-Lc7.title" = "Choose the account with the subscriptions you’d like to export. Subscriptions are exported in the standard OPML format, which most RSS readers can import."; + +/* Class = "NSMenuItem"; title = "Item 2"; ObjectID = "7U3-Y5-qeM"; */ +"7U3-Y5-qeM.title" = "Item 2"; + +/* Class = "NSButtonCell"; title = "Export as OPML…"; ObjectID = "bRz-cx-bmm"; */ +"bRz-cx-bmm.title" = "Export as OPML..."; + +/* Class = "NSTextFieldCell"; title = "Account:"; ObjectID = "Dao-jI-G6i"; */ +"Dao-jI-G6i.title" = "Account:"; + +/* Class = "NSMenuItem"; title = "Item 1"; ObjectID = "MJb-Bf-UJG"; */ +"MJb-Bf-UJG.title" = "Item 1"; + +/* Class = "NSWindow"; title = "Window"; ObjectID = "QvC-M9-y7g"; */ +"QvC-M9-y7g.title" = "Window"; + +/* Class = "NSMenuItem"; title = "Item 3"; ObjectID = "Uii-dd-siy"; */ +"Uii-dd-siy.title" = "Item 3"; + diff --git a/Mac/MainWindow/OPML/en-GB.lproj/ImportOPMLSheet.strings b/Mac/MainWindow/OPML/en-GB.lproj/ImportOPMLSheet.strings new file mode 100644 index 000000000..b67f9be47 --- /dev/null +++ b/Mac/MainWindow/OPML/en-GB.lproj/ImportOPMLSheet.strings @@ -0,0 +1,24 @@ +/* Class = "NSTextFieldCell"; title = "Choose the account to get the imported subscriptions. This requires an OPML file, which most RSS readers can create."; ObjectID = "1Vu-Te-PGl"; */ +"1Vu-Te-PGl.title" = "Choose the account to get the imported subscriptions. This requires an OPML file, which most RSS readers can create."; + +/* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "9ab-cB-hex"; */ +"9ab-cB-hex.title" = "Cancel"; + +/* Class = "NSMenuItem"; title = "Item 3"; ObjectID = "92e-hX-kYj"; */ +"92e-hX-kYj.title" = "Item 3"; + +/* Class = "NSButtonCell"; title = "Import from OPML…"; ObjectID = "dhV-on-ayM"; */ +"dhV-on-ayM.title" = "Import from OPML..."; + +/* Class = "NSTextFieldCell"; title = "Account:"; ObjectID = "e9g-7H-VWa"; */ +"e9g-7H-VWa.title" = "Account:"; + +/* Class = "NSMenuItem"; title = "Item 2"; ObjectID = "JGa-5R-SV5"; */ +"JGa-5R-SV5.title" = "Item 2"; + +/* Class = "NSWindow"; title = "Window"; ObjectID = "QvC-M9-y7g"; */ +"QvC-M9-y7g.title" = "Window"; + +/* Class = "NSMenuItem"; title = "Item 1"; ObjectID = "xsd-12-2yb"; */ +"xsd-12-2yb.title" = "Item 1"; + diff --git a/Mac/Preferences/Accounts/en-GB.lproj/AccountsAddCloudKit.strings b/Mac/Preferences/Accounts/en-GB.lproj/AccountsAddCloudKit.strings index bc3d4539e..e4e633cd7 100644 --- a/Mac/Preferences/Accounts/en-GB.lproj/AccountsAddCloudKit.strings +++ b/Mac/Preferences/Accounts/en-GB.lproj/AccountsAddCloudKit.strings @@ -1,18 +1,18 @@ - /* Class = "NSTextFieldCell"; title = "Use your iCloud account."; ObjectID = "1d2-Mx-TKe"; */ "1d2-Mx-TKe.title" = "Use your iCloud account."; -/* Class = "NSWindow"; title = "Window"; ObjectID = "QvC-M9-y7g"; */ -"QvC-M9-y7g.title" = "Window"; - /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "iVd-bO-4LN"; */ "iVd-bO-4LN.title" = "Cancel"; /* Class = "NSButtonCell"; title = "Use iCloud"; ObjectID = "oih-6c-KbS"; */ "oih-6c-KbS.title" = "Use iCloud"; +/* Class = "NSWindow"; title = "Window"; ObjectID = "QvC-M9-y7g"; */ +"QvC-M9-y7g.title" = "Window"; + /* Class = "NSTextFieldCell"; title = "iCloud Syncing Limitations & Solutions"; ObjectID = "rON-0r-jBU"; */ "rON-0r-jBU.title" = "iCloud Syncing Limitations & Solutions"; /* Class = "NSTextFieldCell"; title = "NetNewsWire will use your iCloud account to sync your feeds across your Mac and iOS devices."; ObjectID = "wfr-Dv-UIF"; */ "wfr-Dv-UIF.title" = "NetNewsWire will use your iCloud account to sync your feeds across your Mac and iOS devices."; + diff --git a/Mac/Preferences/Accounts/en-GB.lproj/AccountsAddLocal.strings b/Mac/Preferences/Accounts/en-GB.lproj/AccountsAddLocal.strings index 4dc2e6d1c..53bcab618 100644 --- a/Mac/Preferences/Accounts/en-GB.lproj/AccountsAddLocal.strings +++ b/Mac/Preferences/Accounts/en-GB.lproj/AccountsAddLocal.strings @@ -1,18 +1,18 @@ - /* Class = "NSTextFieldCell"; title = "Create a local account on your Mac."; ObjectID = "1d2-Mx-TKe"; */ "1d2-Mx-TKe.title" = "Create a local account on your Mac."; /* Class = "NSTextFieldCell"; title = "Name:"; ObjectID = "AVh-ns-LEN"; */ "AVh-ns-LEN.title" = "Name:"; -/* Class = "NSWindow"; title = "Window"; ObjectID = "QvC-M9-y7g"; */ -"QvC-M9-y7g.title" = "Window"; - /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "iVd-bO-4LN"; */ "iVd-bO-4LN.title" = "Cancel"; /* Class = "NSButtonCell"; title = "Create"; ObjectID = "oih-6c-KbS"; */ "oih-6c-KbS.title" = "Create"; +/* Class = "NSWindow"; title = "Window"; ObjectID = "QvC-M9-y7g"; */ +"QvC-M9-y7g.title" = "Window"; + /* Class = "NSTextFieldCell"; title = "Local accounts store their data on your Mac. They do not sync across your devices."; ObjectID = "wfr-Dv-UIF"; */ "wfr-Dv-UIF.title" = "Local accounts store their data on your Mac. They do not sync across your devices."; + diff --git a/Mac/Preferences/Accounts/en-GB.lproj/AccountsDetail.strings b/Mac/Preferences/Accounts/en-GB.lproj/AccountsDetail.strings index 1fac1bf5a..dca703a58 100644 --- a/Mac/Preferences/Accounts/en-GB.lproj/AccountsDetail.strings +++ b/Mac/Preferences/Accounts/en-GB.lproj/AccountsDetail.strings @@ -1,13 +1,12 @@ - /* Class = "NSTextFieldCell"; title = "iCloud Syncing Limitations & Solutions"; ObjectID = "0XE-hc-x09"; */ "0XE-hc-x09.title" = "iCloud Syncing Limitations & Solutions"; -/* Class = "NSTabViewItem"; label = "Account"; ObjectID = "35c-I3-wfs"; */ -"35c-I3-wfs.label" = "Account"; - /* Class = "NSTextFieldCell"; title = "On My Mac"; ObjectID = "6yI-bV-1Sh"; */ "6yI-bV-1Sh.title" = "On My Mac"; +/* Class = "NSTabViewItem"; label = "Account"; ObjectID = "35c-I3-wfs"; */ +"35c-I3-wfs.label" = "Account"; + /* Class = "NSTextFieldCell"; title = "The name appears in the sidebar. It can be anything you want. You can even use emoji. 🎸"; ObjectID = "MW0-mH-Gaa"; */ "MW0-mH-Gaa.title" = "The name appears in the sidebar. It can be anything you want. You can even use emoji. 🎸"; @@ -22,3 +21,4 @@ /* Class = "NSButtonCell"; title = "Active"; ObjectID = "wxB-dX-nGt"; */ "wxB-dX-nGt.title" = "Active"; + diff --git a/Mac/Preferences/Accounts/en-GB.lproj/AccountsFeedbin.strings b/Mac/Preferences/Accounts/en-GB.lproj/AccountsFeedbin.strings index 92e432cf6..4cf8bb757 100644 --- a/Mac/Preferences/Accounts/en-GB.lproj/AccountsFeedbin.strings +++ b/Mac/Preferences/Accounts/en-GB.lproj/AccountsFeedbin.strings @@ -1,4 +1,3 @@ - /* Class = "NSTextFieldCell"; title = "Password:"; ObjectID = "7g8-Kk-ISg"; */ "7g8-Kk-ISg.title" = "Password:"; @@ -8,6 +7,12 @@ /* Class = "NSWindow"; title = "Window"; ObjectID = "F0z-JX-Cv5"; */ "F0z-JX-Cv5.title" = "Window"; +/* Class = "NSTextFieldCell"; placeholderString = "me@email.com"; ObjectID = "fCk-Tf-q01"; */ +"fCk-Tf-q01.placeholderString" = "me@email.com"; + +/* Class = "NSButtonCell"; title = "Create one here."; ObjectID = "fx3-Uk-NVw"; */ +"fx3-Uk-NVw.title" = "Create one here."; + /* Class = "NSTextFieldCell"; title = "Your username and password will be encrypted and stored in Keychain. "; ObjectID = "HuQ-TS-tS3"; */ "HuQ-TS-tS3.title" = "Your username and password will be encrypted and stored in Keychain. "; @@ -17,12 +22,6 @@ /* Class = "NSTextFieldCell"; title = "Don’t have a Feedbin account?"; ObjectID = "QF5-gl-fjb"; */ "QF5-gl-fjb.title" = "Don’t have a Feedbin account?"; -/* Class = "NSTextFieldCell"; placeholderString = "me@email.com"; ObjectID = "fCk-Tf-q01"; */ -"fCk-Tf-q01.placeholderString" = "me@email.com"; - -/* Class = "NSButtonCell"; title = "Create one here."; ObjectID = "fx3-Uk-NVw"; */ -"fx3-Uk-NVw.title" = "Create one here."; - /* Class = "NSTextFieldCell"; title = "Sign in to your Feedbin account."; ObjectID = "ras-dj-nP8"; */ "ras-dj-nP8.title" = "Sign in to your Feedbin account."; @@ -31,3 +30,4 @@ /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "ufs-ar-BAY"; */ "ufs-ar-BAY.title" = "Cancel"; + diff --git a/Mac/Preferences/Accounts/en-GB.lproj/AccountsNewsBlur.strings b/Mac/Preferences/Accounts/en-GB.lproj/AccountsNewsBlur.strings index 27dfcec7c..5713600af 100644 --- a/Mac/Preferences/Accounts/en-GB.lproj/AccountsNewsBlur.strings +++ b/Mac/Preferences/Accounts/en-GB.lproj/AccountsNewsBlur.strings @@ -1,4 +1,3 @@ - /* Class = "NSTextFieldCell"; title = "Password:"; ObjectID = "7g8-Kk-ISg"; */ "7g8-Kk-ISg.title" = "Password:"; @@ -8,18 +7,15 @@ /* Class = "NSWindow"; title = "Window"; ObjectID = "F0z-JX-Cv5"; */ "F0z-JX-Cv5.title" = "Window"; -/* Class = "NSButtonCell"; title = "Create"; ObjectID = "IMO-YT-k9Z"; */ -"IMO-YT-k9Z.title" = "Create"; - -/* Class = "NSTextFieldCell"; title = "Your username and password will be encrypted and stored in Keychain. "; ObjectID = "VWI-0W-Duk"; */ -"VWI-0W-Duk.title" = "Your username and password will be encrypted and stored in Keychain. "; - /* Class = "NSTextFieldCell"; placeholderString = "me@email.com"; ObjectID = "fCk-Tf-q01"; */ "fCk-Tf-q01.placeholderString" = "me@email.com"; /* Class = "NSTextFieldCell"; title = "Don’t have a NewsBlur account?"; ObjectID = "fPs-Sh-GEf"; */ "fPs-Sh-GEf.title" = "Don’t have a NewsBlur account?"; +/* Class = "NSButtonCell"; title = "Create"; ObjectID = "IMO-YT-k9Z"; */ +"IMO-YT-k9Z.title" = "Create"; + /* Class = "NSButtonCell"; title = "Create one here."; ObjectID = "moP-jO-Ubz"; */ "moP-jO-Ubz.title" = "Create one here."; @@ -31,3 +27,7 @@ /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "ufs-ar-BAY"; */ "ufs-ar-BAY.title" = "Cancel"; + +/* Class = "NSTextFieldCell"; title = "Your username and password will be encrypted and stored in Keychain. "; ObjectID = "VWI-0W-Duk"; */ +"VWI-0W-Duk.title" = "Your username and password will be encrypted and stored in Keychain. "; + diff --git a/Mac/Preferences/Accounts/en-GB.lproj/AccountsReaderAPI.strings b/Mac/Preferences/Accounts/en-GB.lproj/AccountsReaderAPI.strings index 200ccd2ca..92273ec19 100644 --- a/Mac/Preferences/Accounts/en-GB.lproj/AccountsReaderAPI.strings +++ b/Mac/Preferences/Accounts/en-GB.lproj/AccountsReaderAPI.strings @@ -1,4 +1,3 @@ - /* Class = "NSTextFieldCell"; title = "Password:"; ObjectID = "7g8-Kk-ISg"; */ "7g8-Kk-ISg.title" = "Password:"; @@ -11,12 +10,12 @@ /* Class = "NSWindow"; title = "Window"; ObjectID = "F0z-JX-Cv5"; */ "F0z-JX-Cv5.title" = "Window"; -/* Class = "NSButtonCell"; title = "Create"; ObjectID = "IMO-YT-k9Z"; */ -"IMO-YT-k9Z.title" = "Create"; - /* Class = "NSTextFieldCell"; placeholderString = "username"; ObjectID = "fCk-Tf-q01"; */ "fCk-Tf-q01.placeholderString" = "username"; +/* Class = "NSButtonCell"; title = "Create"; ObjectID = "IMO-YT-k9Z"; */ +"IMO-YT-k9Z.title" = "Create"; + /* Class = "NSTextFieldCell"; title = "Don’t have a Reader account?"; ObjectID = "ker-hu-FEc"; */ "ker-hu-FEc.title" = "Don’t have a Reader account?"; @@ -34,3 +33,4 @@ /* Class = "NSTextFieldCell"; title = "API URL:"; ObjectID = "zBm-dZ-EF1"; */ "zBm-dZ-EF1.title" = "API URL:"; + diff --git a/Mac/Preferences/ExtensionPoints/Base.lproj/ExtensionPointDetail.xib b/Mac/Preferences/ExtensionPoints/Base.lproj/ExtensionPointDetail.xib index 898db2415..84dd70ea8 100644 --- a/Mac/Preferences/ExtensionPoints/Base.lproj/ExtensionPointDetail.xib +++ b/Mac/Preferences/ExtensionPoints/Base.lproj/ExtensionPointDetail.xib @@ -1,7 +1,6 @@ - diff --git a/Mac/Preferences/ExtensionPoints/en-GB.lproj/ExtensionPointDetail.strings b/Mac/Preferences/ExtensionPoints/en-GB.lproj/ExtensionPointDetail.strings index 9fffc448b..bea978cfb 100644 --- a/Mac/Preferences/ExtensionPoints/en-GB.lproj/ExtensionPointDetail.strings +++ b/Mac/Preferences/ExtensionPoints/en-GB.lproj/ExtensionPointDetail.strings @@ -1,6 +1,6 @@ - /* Class = "NSTextFieldCell"; title = "Extension"; ObjectID = "CGj-bV-rXW"; */ "CGj-bV-rXW.title" = "Extension"; /* Class = "NSTabViewItem"; label = "Extension"; ObjectID = "k6A-mz-zOF"; */ "k6A-mz-zOF.label" = "Extension"; + diff --git a/Mac/Resources/KeyboardShortcuts/KeyboardHTML.swift b/Mac/Resources/KeyboardShortcuts/KeyboardHTML.swift new file mode 100644 index 000000000..5b0d88006 --- /dev/null +++ b/Mac/Resources/KeyboardShortcuts/KeyboardHTML.swift @@ -0,0 +1,329 @@ +// +// KeyboardHTML.swift +// NetNewsWire +// +// Created by Stuart Breckenridge on 05/06/2023. +// Copyright © 2023 Ranchero Software. All rights reserved. +// + +import Html +import AppKit +import RSCore + +protocol LocalizedKeyboardShortcut { + var localizedDescription: String { get } + var localizedShortcut: String { get } +} + +enum KeyboardShortcuts { + + enum Everywhere: CaseIterable, LocalizedKeyboardShortcut { + + case scrollOrGoToNextUnread // space + case goToNextUnread // n or + + case toggleReadStatus // r or u + case markAllAsRead // k + case markOlderArticlesAsRead // o + case markAllAsReadGoToNextUnread // l + case markAsUnreadGoToNextUnread // m + case toggleStarredStatus // s + case openInBrowser // b or ⏎ or Enter + case previousSubscription // a + case nextSubscription // z + + var localizedDescription: String { + switch self { + case .scrollOrGoToNextUnread: + return NSLocalizedString("keyboard.text.scroll-or-go-to-next-unread", comment: "Scroll or go to next unread") + case .goToNextUnread: + return NSLocalizedString("keyboard.text.go-to-next-unread", comment: "Go to next unread") + case .toggleReadStatus: + return NSLocalizedString("keyboard.text.toggle-read-status", comment: "Toggle read status") + case .markAllAsRead: + return NSLocalizedString("keyboard.text.mark-all-as-read", comment: "Mark all as read") + case .markOlderArticlesAsRead: + return NSLocalizedString("keyboard.text.mark-older-articles-as-read", comment: "Mark older articles as read") + case .markAllAsReadGoToNextUnread: + return NSLocalizedString("keyboard.text.mark-all-as-read-go-to-next-unread", comment: "Mark all as read, go to next unread") + case .markAsUnreadGoToNextUnread: + return NSLocalizedString("keyboard.text.mark-as-unread-go-to-next-unread", comment: "Mark as unread, go to next unread") + case .toggleStarredStatus: + return NSLocalizedString("keyboard.text.toggle-starred-status", comment: "Toggle starred status") + case .openInBrowser: + return NSLocalizedString("keyboard.text.open-in-browser", comment: "Open in browser") + case .previousSubscription: + return NSLocalizedString("keyboard.text.previous-subscription", comment: "Previous subscription") + case .nextSubscription: + return NSLocalizedString("keyboard.text.next-subscription", comment: "Next subscription") + } + } + + var localizedShortcut: String { + switch self { + case .scrollOrGoToNextUnread: + return NSLocalizedString("keyboard.shortcut.scroll-or-go-to-next-unread", comment: "Space bar") + case .goToNextUnread: + return NSLocalizedString("keyboard.shortcut.go-to-next-unread", comment: "n or +") + case .toggleReadStatus: + return NSLocalizedString("keyboard.shortcut.toggle-read-status", comment: "r or u") + case .markAllAsRead: + return NSLocalizedString("keyboard.shortcut.mark-all-as-read", comment: "k") + case .markOlderArticlesAsRead: + return NSLocalizedString("keyboard.shortcut.mark-older-articles-as-read", comment: "o") + case .markAllAsReadGoToNextUnread: + return NSLocalizedString("keyboard.shortcut.mark-all-as-read-go-to-next-unread", comment: "l") + case .markAsUnreadGoToNextUnread: + return NSLocalizedString("keyboard.shortcut.mark-as-unread-go-to-next-unread", comment: "m") + case .toggleStarredStatus: + return NSLocalizedString("keyboard.shortcut.toggle-starred-status", comment: "s") + case .openInBrowser: + return NSLocalizedString("keyboard.shortcut.open-in-browser", comment: "b or ⏎ or Enter") + case .previousSubscription: + return NSLocalizedString("keyboard.shortcut.previous-subscription", comment: "a") + case .nextSubscription: + return NSLocalizedString("keyboard.shortcut.next-subscription", comment: "z") + } + + } + + } + + enum LeftSidebar: CaseIterable, LocalizedKeyboardShortcut { + + case collapse + case expand + case collapseAllExcludingGrouped + case expandAll + case moveFocusToHeadlines + + var localizedDescription: String { + switch self { + + case .collapse: + return NSLocalizedString("keyboard.text.collapse", comment: "Collapse") + case .expand: + return NSLocalizedString("keyboard.text.expand", comment: "Expand") + case .collapseAllExcludingGrouped: + return NSLocalizedString("keyboard.text.collapse-all-excluding-grouped", comment: "Collapse All (except for group items)") + case .expandAll: + return NSLocalizedString("keyboard.text.expand-all", comment: "Expand All") + case .moveFocusToHeadlines: + return NSLocalizedString("keyboard.text.move-focus-headline", comment: "Move focus to headlines") + } + } + + var localizedShortcut: String { + switch self { + case .collapse: + return NSLocalizedString("keyboard.shortcut.collapse", comment: "Keyboard shortcut: , or ⌥+←") + case .expand: + return NSLocalizedString("keyboard.shortcut.expand", comment: "Keyboard shortcut: . or ⌥+→") + case .collapseAllExcludingGrouped: + return NSLocalizedString("keyboard.shortcut.collapse-all-excluding-grouped", comment: "Keyboard shortcut: ; or ⌥+⌘+←") + case .expandAll: + return NSLocalizedString("keyboard.shortcut.expand-all", comment: "Keyboard shortcut: ' or ⌥+⌘+→") + case .moveFocusToHeadlines: + return NSLocalizedString("keyboard.shortcut.move-focus-headline", comment: "Keyboard shortcut: →") + } + } + + + } + + enum Timeline: CaseIterable, LocalizedKeyboardShortcut { + + case moveFocusToSubscriptions + case moveFocusToDetail + + var localizedDescription: String { + switch self { + case .moveFocusToSubscriptions: + return NSLocalizedString("keyboard.text.move-focus-to-subscriptions", comment: "Move focus to subscriptions") + case .moveFocusToDetail: + return NSLocalizedString("keyboard.text.move-focus-to-detail", comment: "Move focus to detail") + } + } + + var localizedShortcut: String { + switch self { + case .moveFocusToSubscriptions: + return NSLocalizedString("keyboard.shortcut.move-focus-to-subscriptions", comment: "Keyboard shortcut: ←") + case .moveFocusToDetail: + return NSLocalizedString("keyboard.shortcut.move-focus-to-detail", comment: "Keyboard shortcut: →") + } + } + } + + enum Detail: CaseIterable, LocalizedKeyboardShortcut { + + case moveFocusToHeadlines + + var localizedDescription: String { + switch self { + case .moveFocusToHeadlines: + return NSLocalizedString("keyboard.text.move-focus-to-headlines", comment: "Move focus to headlines") + } + } + + var localizedShortcut: String { + switch self { + case .moveFocusToHeadlines: + return NSLocalizedString("keyboard.shortcut.move-focus-to-headlines", comment: "Keyboard shortcut: ←") + } + } + + + } + +} + + +struct KeyboardHTML: Logging { + + private func stylesheet() -> StaticString { + """ + body { + margin: 2em; + color: #333333; + background-color: white; + line-height: 1.4em; + font-family: -apple-system; + } + @media (prefers-color-scheme: dark) { + body { + color: white; + background-color: #333333; + } + + table tr:nth-child(odd) { + background-color: #1E1E1E !important; + } + } + table { + width: 100%; + line-height: 2.0em; + border-collapse: collapse; + margin-top: 1.0em; + margin-bottom: 1.0em; + } + table tr:nth-child(odd) { + background-color: #F0F0F0; + } + table tr td:first-child { + width: 60%; + } + table td { + padding: 0; + } + table caption { + text-align: left; + font-weight: bold; + font-style: italic; + } + kbd { + font-family: -apple-system; + } + em { + font-weight: bold; + } + """ + } + + private func document() -> Node { + return Node.document( + .html( + .head( + .style(safe: stylesheet()), + .meta(contentType: .text(.html, charset: .utf8)) + ), + .body( + // Heading & Description + Node.h1(.text(NSLocalizedString("label.text.keyboard-shortcuts", comment: "Keyboard Shortcuts"))), + Node.p(.raw(NSLocalizedString("label.text.keyboard-shortcuts-description", comment: "Keyboard Shortcuts Description"))), + + // Shortcuts Available Everywhere + Node.em(.text(NSLocalizedString("label.text.keyboard-shortcuts-everywhere", comment: "Everywhere..."))), + Node.table( + .tbody( + .fragment( + KeyboardShortcuts.Everywhere.allCases.map { shortcut in + .tr( + .td(.text(shortcut.localizedDescription)), + .td(.kbd(.text(shortcut.localizedShortcut))) + ) + } + ) + ) + ), + + // Shortcuts Available in Left Sidebar + Node.em(.text(NSLocalizedString("label.text.keyboard-shortcuts-left-sidebar", comment: "Left Sidebar..."))), + Node.table( + .tbody( + .fragment( + KeyboardShortcuts.LeftSidebar.allCases.map { shortcut in + .tr( + .td(.text(shortcut.localizedDescription)), + .td(.kbd(.text(shortcut.localizedShortcut))) + ) + } + ) + ) + ), + + // Timeline + Node.em(.text(NSLocalizedString("label.text.keyboard-shortcuts-timeline", comment: "Timeline only..."))), + Node.table( + .tbody( + .fragment( + KeyboardShortcuts.Timeline.allCases.map { shortcut in + .tr( + .td(.text(shortcut.localizedDescription)), + .td(.kbd(.text(shortcut.localizedShortcut))) + ) + } + ) + ) + ), + + // Detail + Node.em(.text(NSLocalizedString("label.text.keyboard-shortcuts-detail", comment: "Detail only..."))), + Node.table( + .tbody( + .fragment( + KeyboardShortcuts.Detail.allCases.map { shortcut in + .tr( + .td(.text(shortcut.localizedDescription)), + .td(.kbd(.text(shortcut.localizedShortcut))) + ) + } + ) + ) + ) + + ) + ) + ) + } + + func renderedDocument() -> String { + return render(document()) + } + + func htmlFile() -> String { + let appSupport = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first! + let file = appSupport.appendingPathComponent("keyboardshortcuts", conformingTo: .html) + if FileManager.default.createFile(atPath: file.path(), contents: renderedDocument().data(using: .utf8)) { + return file.path() + } else { + KeyboardHTML.logger.error("Unable to create keyboard shortcuts HTML.") + return file.path() + } + } + +} + + + + + diff --git a/Mac/Resources/KeyboardShortcuts/KeyboardShortcuts.html b/Mac/Resources/KeyboardShortcuts/KeyboardShortcuts.html deleted file mode 100644 index 1d0e4a8c0..000000000 --- a/Mac/Resources/KeyboardShortcuts/KeyboardShortcuts.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - Keyboard Shortcuts - - - - -

Keyboard Shortcuts

- -

NetNewsWire has a number of keyboard shortcuts that aren’t listed in the menubar.

- -

The key to reading your news while holding your coffee is the space bar. The space bar scrolls the current article — and, when it’s scrolled all the way, it goes to the next unread article.

- -

This way you can go through all your news via the space bar.

- - - - - - - - - - - - - - - -
Everywhere…
Scroll or go to next unreadspace
Go to next unreadn or +
Toggle read statusr or u
Mark all as readk
Mark older articles as reado
Mark all as read, go to next unreadl
Mark as unread, go to next unreadm
Toggle starred statuss
Open in browserb or or Enter
Previous subscriptiona
Next subscriptionz
- - - - - - - - - -
Left sidebar only…
Collapse, or +
Expand. or +
Collapse All (except for group items); or ++
Expand All' or ++
Move focus to headlines
- - - - - - -
Timeline only…
Move focus to subscriptions
Move focus to detail
- - - - - -
Detail only…
Move focus to headlines
- - - - diff --git a/Mac/Resources/en-GB.lproj/InfoPlist.strings b/Mac/Resources/en-GB.lproj/InfoPlist.strings index 72e482ac9..af38a4b9c 100644 --- a/Mac/Resources/en-GB.lproj/InfoPlist.strings +++ b/Mac/Resources/en-GB.lproj/InfoPlist.strings @@ -8,5 +8,8 @@ "NSAppleEventsUsageDescription" = "NetNewsWire communicates with other apps on your Mac when you choose to share an article."; /* Copyright (human-readable) */ -"NSHumanReadableCopyright" = "Copyright © 2002-2022 Brent Simmons. All rights reserved."; +"NSHumanReadableCopyright" = "Copyright © 2002-2023 Brent Simmons. All rights reserved."; + +/* (No Comment) */ +"OPML" = "OPML"; diff --git a/Mac/Resources/en-GB.lproj/Localizable.strings b/Mac/Resources/en-GB.lproj/Localizable.strings index 53d9af2e4..49e3cbc36 100644 --- a/Mac/Resources/en-GB.lproj/Localizable.strings +++ b/Mac/Resources/en-GB.lproj/Localizable.strings @@ -98,7 +98,6 @@ /* To enable notifications, open Notifications in System Settings, then find NetNewsWire in the list. */ "alert.message.enable-notifications-in-system-settings" = "To enable notifications, open Notifications in System Settings, then find NetNewsWire in the list."; - /* A web browser will open the Feedly login for you to authorize access. */ "alert.message.feedly-web-browser-information" = "A web browser will open the Feedly login for you to authorise access."; @@ -108,6 +107,9 @@ /* Twitter Deprecation Message */ "alert.message.twitter-deprecation-message" = "On February 1, 2023, Twitter announced the end of free access to the Twitter API, effective February 9.\n\nSince Twitter does not provide RSS feeds, we’ve had to use the Twitter API. Without free access to that API, we can’t read feeds from Twitter.\n\nWe’ve left your Twitter feeds intact. If you have any starred items from those feeds, they will remain as long as you don’t delete those feeds.\n\nYou can still read whatever you have already downloaded. However, those feeds will no longer update."; +/* Twitter deprecation informative text. */ +"alert.message.twitter-integration-removed" = "Twitter Integration Removed"; + /* Author's website: */ "alert.title.authors-website" = "Author's website:"; @@ -442,6 +444,129 @@ /* Unable to create extension. */ "error.message.unable-to-create-extension" = "Unable to create extension."; +/* Keyboard shortcut: , or ⌥+← */ +"keyboard.shortcut.collapse" = ", or ⌥+←"; + +/* Keyboard shortcut: ; or ⌥+⌘+← */ +"keyboard.shortcut.collapse-all-excluding-grouped" = "; or ⌥+⌘+←"; + +/* Keyboard shortcut: . or ⌥+→ */ +"keyboard.shortcut.expand" = ". or ⌥+→"; + +/* Keyboard shortcut: ' or ⌥+⌘+→ */ +"keyboard.shortcut.expand-all" = "' or ⌥+⌘+→"; + +/* Keyboard shortcut: n or + */ +"keyboard.shortcut.go-to-next-unread" = "n or +"; + +/* Keyboard shortcut: k */ +"keyboard.shortcut.mark-all-as-read" = "k"; + +/* Keyboard shortcut: l */ +"keyboard.shortcut.mark-all-as-read-go-to-next-unread" = "l"; + +/* Keyboard shortcut: m */ +"keyboard.shortcut.mark-as-unread-go-to-next-unread" = "m"; + +/* Keyboard shortcut: o */ +"keyboard.shortcut.mark-older-articles-as-read" = "o"; + +/* Keyboard shortcut: → */ +"keyboard.shortcut.move-focus-headline" = "→"; + +/* Keyboard shortcut: → */ +"keyboard.shortcut.move-focus-to-detail" = "→"; + +/* Keyboard shortcut: ← */ +"keyboard.shortcut.move-focus-to-headlines" = "←"; + +/* Keyboard shortcut: ← */ +"keyboard.shortcut.move-focus-to-subscriptions" = "←"; + +/* Keyboard shortcut: z */ +"keyboard.shortcut.next-subscription" = "z"; + +/* Keyboard shortcut: b or ⏎ or Enter */ +"keyboard.shortcut.open-in-browser" = "b or ⏎ or Enter"; + +/* Keyboard shortcut: a */ +"keyboard.shortcut.previous-subscription" = "a"; + +/* Keyboard shortcut: space */ +"keyboard.shortcut.scroll-or-go-to-next-unread" = "space"; + +/* Keyboard shortcut: r or u */ +"keyboard.shortcut.toggle-read-status" = "r or u"; + +/* Keyboard shortcut: s */ +"keyboard.shortcut.toggle-starred-status" = "s"; + +/* Collapse */ +"keyboard.text.collapse" = "Collapse"; + +/* Collapse All (except for group items) */ +"keyboard.text.collapse-all-excluding-grouped" = "Collapse All (except for group items)"; + +/* Expand */ +"keyboard.text.expand" = "Expand"; + +/* Expand All */ +"keyboard.text.expand-all" = "Expand All"; + +/* Go to next unread */ +"keyboard.text.go-to-next-unread" = "Go to next unread"; + +/* Mark all as read */ +"keyboard.text.mark-all-as-read" = "Mark all as read"; + +/* Mark all as read, go to next unread */ +"keyboard.text.mark-all-as-read-go-to-next-unread" = "Mark all as read, go to next unread"; + +/* Mark as unread, go to next unread */ +"keyboard.text.mark-as-unread-go-to-next-unread" = "Mark as unread, go to next unread"; + +/* Mark older articles as read */ +"keyboard.text.mark-older-articles-as-read" = "Mark older articles as read"; + +/* Move focus to headlines */ +"keyboard.text.move-focus-headline" = "Move focus to headlines"; + +/* Move focus to detail */ +"keyboard.text.move-focus-to-detail" = "Move focus to detail"; + +/* Move focus to headlines */ +"keyboard.text.move-focus-to-headlines" = "Move focus to headlines"; + +/* Move focus to subscriptions */ +"keyboard.text.move-focus-to-subscriptions" = "Move focus to subscriptions"; + +/* Next subscription */ +"keyboard.text.next-subscription" = "Next subscription"; + +/* Multiple selection */ +"label.text.multiple-selection" = "Multiple selection"; + +/* Multiple selection */ +"label.text.no-selection" = "No selection"; + +/* Loading... */ +"label.text.loading" = "Loading..."; + +/* Open in browser */ +"keyboard.text.open-in-browser" = "Open in browser"; + +/* Previous subscription */ +"keyboard.text.previous-subscription" = "Previous subscription"; + +/* Scroll or go to next unread */ +"keyboard.text.scroll-or-go-to-next-unread" = "Scroll or go to next unread"; + +/* Toggle read status */ +"keyboard.text.toggle-read-status" = "Toggle read status"; + +/* Toggle starred status */ +"keyboard.text.toggle-starred-status" = "Toggle starred status"; + /* Markdown formatted link to netnewswire.com */ "label.markdown.netnewswire-website" = "[netnewswire.com](https://netnewswire.com)"; @@ -454,9 +579,6 @@ /* You've added all available extensions. */ "label.text.added-all-extensions" = "You've added all available extensions."; -/* Primary Contributors */ -"label.text.primary-contributors" = "Primary Contributors"; - /* Additional Contributors */ "label.text.additional-contributors" = "Additional Contributors"; @@ -496,6 +618,24 @@ /* Finding feed... */ "label.text.finding-feed" = "Finding feed..."; +/* Keyboard Shortcuts */ +"label.text.keyboard-shortcuts" = "Keyboard Shortcuts"; + +/* Keyboard Shortcuts Description */ +"label.text.keyboard-shortcuts-description" = "NetNewsWire has a number of keyboard shortcuts that aren't listed in the menubar.

The key to reading your news while holding your coffee is the space bar. The space bar scrolls the current article — and, when it's scrolled all the way, it goes to the next unread article.

This way you can go through all your news via the space bar."; + +/* Detail only... */ +"label.text.keyboard-shortcuts-detail" = "Detail only..."; + +/* Everywhere... */ +"label.text.keyboard-shortcuts-everywhere" = "Everywhere..."; + +/* Left Sidebar... */ +"label.text.keyboard-shortcuts-left-sidebar" = "Left Sidebar only..."; + +/* Timeline only... */ +"label.text.keyboard-shortcuts-timeline" = "Timeline only..."; + /* Large */ "label.text.large" = "Large"; @@ -538,6 +678,9 @@ /* Posts from r/%@ */ "label.text.posts-from-subreddit.%@" = "Posts from r/%@"; +/* Primary Contributors */ +"label.text.primary-contributors" = "Primary Contributors"; + /* Privacy Policy */ "label.text.privacy-policy" = "Privacy Policy"; @@ -602,10 +745,7 @@ "label.text.thanks" = "Thanks"; /* Thanks - Dedication */ -"label.text.thanks-details" = " -

Thanks to Sheila and my family; thanks to my friends in Seattle and around the globe; thanks to the ever-patient and ever-awesome NetNewsWire beta testers.

-

Thanks to Gus Mueller for FMDB by Flying Meat Software. Thanks to GitHub and Slack for making open source collaboration easy and fun. Thanks to Ben Ubois at Feedbin for all the extra help with syncing and article rendering — and for hosting the server for the Reader view.

-

NetNewsWire 6 is dedicated to everyone working to save democracy around the world.

"; +"label.text.thanks-details" = "\n

Thanks to Sheila and my family; thanks to my friends in Seattle and around the globe; thanks to the ever-patient and ever-awesome NetNewsWire beta testers.

\n

Thanks to Gus Mueller for FMDB by Flying Meat Software. Thanks to GitHub and Slack for making open source collaboration easy and fun. Thanks to Ben Ubois at Feedbin for all the extra help with syncing and article rendering — and for hosting the server for the Reader view.

\n

NetNewsWire 6 is dedicated to everyone working to save democracy around the world.

"; /* Built-in */ "label.text.themes-builtin" = "Built-in Themes"; @@ -697,6 +837,9 @@ /* Update your NewsBlur account credentials. */ "textfield.text.update-newsblur-credentials" = "Update your NewsBlur account credentials."; +/* Unknown Value */ +"Unknown" = "Unknown"; + /* %d unread */ "window.subtitle.unread-count.%d" = "%d unread"; diff --git a/Mac/Resources/en.lproj/InfoPlist.strings b/Mac/Resources/en.lproj/InfoPlist.strings new file mode 100644 index 000000000..af38a4b9c --- /dev/null +++ b/Mac/Resources/en.lproj/InfoPlist.strings @@ -0,0 +1,15 @@ +/* Bundle name */ +"CFBundleName" = "NetNewsWire"; + +/* (No Comment) */ +"NetNewsWire Theme" = "NetNewsWire Theme"; + +/* Privacy - AppleEvents Sending Usage Description */ +"NSAppleEventsUsageDescription" = "NetNewsWire communicates with other apps on your Mac when you choose to share an article."; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2002-2023 Brent Simmons. All rights reserved."; + +/* (No Comment) */ +"OPML" = "OPML"; + diff --git a/Mac/Resources/en.lproj/Localizable.strings b/Mac/Resources/en.lproj/Localizable.strings index c769a332f..0789fb350 100644 --- a/Mac/Resources/en.lproj/Localizable.strings +++ b/Mac/Resources/en.lproj/Localizable.strings @@ -435,6 +435,120 @@ /* Unable to create extension. */ "error.message.unable-to-create-extension" = "Unable to create extension."; +/* Keyboard shortcut: , or ⌥+← */ +"keyboard.shortcut.collapse" = ", or ⌥+←"; + +/* Keyboard shortcut: ; or ⌥+⌘+← */ +"keyboard.shortcut.collapse-all-excluding-grouped" = "; or ⌥+⌘+←"; + +/* Keyboard shortcut: . or ⌥+→ */ +"keyboard.shortcut.expand" = ". or ⌥+→"; + +/* Keyboard shortcut: ' or ⌥+⌘+→ */ +"keyboard.shortcut.expand-all" = "' or ⌥+⌘+→"; + +/* Keyboard shortcut: n or + */ +"keyboard.shortcut.go-to-next-unread" = "n or +"; + +/* Keyboard shortcut: k */ +"keyboard.shortcut.mark-all-as-read" = "k"; + +/* Keyboard shortcut: l */ +"keyboard.shortcut.mark-all-as-read-go-to-next-unread" = "l"; + +/* Keyboard shortcut: m */ +"keyboard.shortcut.mark-as-unread-go-to-next-unread" = "m"; + +/* Keyboard shortcut: o */ +"keyboard.shortcut.mark-older-articles-as-read" = "o"; + +/* Keyboard shortcut: → */ +"keyboard.shortcut.move-focus-headline" = "→"; + +/* Keyboard shortcut: → */ +"keyboard.shortcut.move-focus-to-detail" = "→"; + +/* Keyboard shortcut: ← */ +"keyboard.shortcut.move-focus-to-headlines" = "←"; + +/* Keyboard shortcut: ← */ +"keyboard.shortcut.move-focus-to-subscriptions" = "←"; + +/* Keyboard shortcut: z */ +"keyboard.shortcut.next-subscription" = "z"; + +/* Keyboard shortcut: b or ⏎ or Enter */ +"keyboard.shortcut.open-in-browser" = "b or ⏎ or Enter"; + +/* Keyboard shortcut: a */ +"keyboard.shortcut.previous-subscription" = "a"; + +/* Keyboard shortcut: space */ +"keyboard.shortcut.scroll-or-go-to-next-unread" = "space"; + +/* Keyboard shortcut: r or u */ +"keyboard.shortcut.toggle-read-status" = "r or u"; + +/* Keyboard shortcut: s */ +"keyboard.shortcut.toggle-starred-status" = "s"; + +/* Collapse */ +"keyboard.text.collapse" = "Collapse"; + +/* Collapse All (except for group items) */ +"keyboard.text.collapse-all-excluding-grouped" = "Collapse All (except for group items)"; + +/* Expand */ +"keyboard.text.expand" = "Expand"; + +/* Expand All */ +"keyboard.text.expand-all" = "Expand All"; + +/* Go to next unread */ +"keyboard.text.go-to-next-unread" = "Go to next unread"; + +/* Mark all as read */ +"keyboard.text.mark-all-as-read" = "Mark all as read"; + +/* Mark all as read, go to next unread */ +"keyboard.text.mark-all-as-read-go-to-next-unread" = "Mark all as read, go to next unread"; + +/* Mark as unread, go to next unread */ +"keyboard.text.mark-as-unread-go-to-next-unread" = "Mark as unread, go to next unread"; + +/* Mark older articles as read */ +"keyboard.text.mark-older-articles-as-read" = "Mark older articles as read"; + +/* Move focus to headlines */ +"keyboard.text.move-focus-headline" = "Move focus to headlines"; + +/* Move focus to detail */ +"keyboard.text.move-focus-to-detail" = "Move focus to detail"; + +/* Move focus to headlines */ +"keyboard.text.move-focus-to-headlines" = "Move focus to headlines"; + +/* Move focus to subscriptions */ +"keyboard.text.move-focus-to-subscriptions" = "Move focus to subscriptions"; + +/* Next subscription */ +"keyboard.text.next-subscription" = "Next subscription"; + +/* Open in browser */ +"keyboard.text.open-in-browser" = "Open in browser"; + +/* Previous subscription */ +"keyboard.text.previous-subscription" = "Previous subscription"; + +/* Scroll or go to next unread */ +"keyboard.text.scroll-or-go-to-next-unread" = "Scroll or go to next unread"; + +/* Toggle read status */ +"keyboard.text.toggle-read-status" = "Toggle read status"; + +/* Toggle starred status */ +"keyboard.text.toggle-starred-status" = "Toggle starred status"; + /* Markdown formatted link to netnewswire.com */ "label.markdown.netnewswire-website" = "[netnewswire.com](https://netnewswire.com)"; @@ -447,9 +561,6 @@ /* You've added all available extensions. */ "label.text.added-all-extensions" = "You've added all available extensions."; -/* Primary Contributors */ -"label.text.primary-contributors" = "Primary Contributors"; - /* Additional Contributors */ "label.text.additional-contributors" = "Additional Contributors"; @@ -489,6 +600,24 @@ /* Finding feed... */ "label.text.finding-feed" = "Finding feed..."; +/* Keyboard Shortcuts */ +"label.text.keyboard-shortcuts" = "Keyboard Shortcuts"; + +/* Keyboard Shortcuts Description */ +"label.text.keyboard-shortcuts-description" = "NetNewsWire has a number of keyboard shortcuts that aren't listed in the menubar.

The key to reading your news while holding your coffee is the space bar. The space bar scrolls the current article — and, when it's scrolled all the way, it goes to the next unread article.

This way you can go through all your news via the space bar."; + +/* Detail only... */ +"label.text.keyboard-shortcuts-detail" = "Detail only..."; + +/* Everywhere... */ +"label.text.keyboard-shortcuts-everywhere" = "Everywhere..."; + +/* Left Sidebar... */ +"label.text.keyboard-shortcuts-left-sidebar" = "Left Sidebar only..."; + +/* Timeline only... */ +"label.text.keyboard-shortcuts-timeline" = "Timeline only..."; + /* Large */ "label.text.large" = "Large"; @@ -513,6 +642,15 @@ /* By Brent Simmons and the NetNewsWire team. */ "label.text.netnewswire-byline" = "By Brent Simmons and the NetNewsWire team."; +/* Multiple selection */ +"label.text.multiple-selection" = "Multiple selection"; + +/* Multiple selection */ +"label.text.no-selection" = "No selection"; + +/* Loading... */ +"label.text.loading" = "Loading..."; + /* Don’t have a BazQux account? */ "label.text.no-bazqux" = "Don’t have a BazQux account?"; @@ -531,6 +669,9 @@ /* Posts from r/%@ */ "label.text.posts-from-subreddit.%@" = "Posts from r/%@"; +/* Primary Contributors */ +"label.text.primary-contributors" = "Primary Contributors"; + /* Privacy Policy */ "label.text.privacy-policy" = "Privacy Policy"; @@ -595,10 +736,7 @@ "label.text.thanks" = "Thanks"; /* Thanks - Dedication */ -"label.text.thanks-details" = " -

Thanks to Sheila and my family; thanks to my friends in Seattle and around the globe; thanks to the ever-patient and ever-awesome NetNewsWire beta testers.

-

Thanks to Gus Mueller for FMDB by Flying Meat Software. Thanks to GitHub and Slack for making open source collaboration easy and fun. Thanks to Ben Ubois at Feedbin for all the extra help with syncing and article rendering — and for hosting the server for the Reader view.

-

NetNewsWire 6 is dedicated to everyone working to save democracy around the world.

"; +"label.text.thanks-details" = "\n

Thanks to Sheila and my family; thanks to my friends in Seattle and around the globe; thanks to the ever-patient and ever-awesome NetNewsWire beta testers.

\n

Thanks to Gus Mueller for FMDB by Flying Meat Software. Thanks to GitHub and Slack for making open source collaboration easy and fun. Thanks to Ben Ubois at Feedbin for all the extra help with syncing and article rendering — and for hosting the server for the Reader view.

\n

NetNewsWire 6 is dedicated to everyone working to save democracy around the world.

"; /* Built-in */ "label.text.themes-builtin" = "Built-in Themes"; diff --git a/Mac/Resources/en.lproj/Localizable.stringsdict b/Mac/Resources/en.lproj/Localizable.stringsdict index 9a5aa2079..f271d95e3 100644 --- a/Mac/Resources/en.lproj/Localizable.stringsdict +++ b/Mac/Resources/en.lproj/Localizable.stringsdict @@ -12,10 +12,10 @@ NSStringPluralRuleType NSStringFormatValueTypeKey ld - other - Copy Article URLs one Copy Article URL + other + Copy Article URLs diff --git a/Mac/en-GB.lproj/Main.strings b/Mac/en-GB.lproj/Main.strings index 80b790d52..826b11622 100644 --- a/Mac/en-GB.lproj/Main.strings +++ b/Mac/en-GB.lproj/Main.strings @@ -190,9 +190,6 @@ /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */ "Kd2-mp-pUS.title" = "Show All"; -/* Class = "NSMenuItem"; title = "New Twitter Feed…"; ObjectID = "ki4-7l-tM6"; */ -"ki4-7l-tM6.title" = "New Twitter Feed…"; - /* Class = "NSMenuItem"; title = "Show Sidebar"; ObjectID = "kIP-vf-haE"; */ "kIP-vf-haE.title" = "Show Sidebar"; diff --git a/Mac/en-GB.lproj/Preferences.strings b/Mac/en-GB.lproj/Preferences.strings index f0bf2346b..06441d435 100644 --- a/Mac/en-GB.lproj/Preferences.strings +++ b/Mac/en-GB.lproj/Preferences.strings @@ -16,6 +16,9 @@ /* Class = "NSButtonCell"; title = "Check for Updates"; ObjectID = "AaA-Rr-UYD"; */ "AaA-Rr-UYD.title" = "Check for Updates"; +/* Class = "NSButtonCell"; title = "Mark articles as read on scroll"; ObjectID = "ANv-PZ-pn6"; */ +"ANv-PZ-pn6.title" = "Mark articles as read on scroll"; + /* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "CcS-BO-sdv"; */ "CcS-BO-sdv.title" = "Table View Cell"; @@ -64,6 +67,9 @@ /* Class = "NSButtonCell"; title = "Send automatically"; ObjectID = "jnc-C5-4oI"; */ "jnc-C5-4oI.title" = "Send automatically"; +/* Class = "NSButtonCell"; title = "Privacy Policy"; ObjectID = "kSv-Wu-NYx"; */ +"kSv-Wu-NYx.title" = "Privacy Policy"; + /* Class = "NSTextFieldCell"; title = "Article Theme:"; ObjectID = "MQe-Za-N8J"; */ "MQe-Za-N8J.title" = "Article Theme:"; @@ -85,9 +91,6 @@ /* Class = "NSMenuItem"; title = "Extra Large"; ObjectID = "qMe-6g-Vme"; */ "qMe-6g-Vme.title" = "Extra Large"; -/* Class = "NSTextFieldCell"; title = "Privacy Policy"; ObjectID = "rJu-r1-AW4"; */ -"rJu-r1-AW4.title" = "Privacy Policy"; - /* Class = "NSMenuItem"; title = "Small"; ObjectID = "roB-Mu-Ht7"; */ "roB-Mu-Ht7.title" = "Small"; @@ -106,6 +109,9 @@ /* Class = "NSButtonCell"; title = "Open feeds in NetNewsWire"; ObjectID = "uvx-O8-HvU"; */ "uvx-O8-HvU.title" = "Open feeds in NetNewsWire"; +/* Class = "NSTextFieldCell"; title = "Timeline:"; ObjectID = "wi9-yM-Ri0"; */ +"wi9-yM-Ri0.title" = "Timeline:"; + /* Class = "NSTextFieldCell"; title = "Article Text Size:"; ObjectID = "xQu-QV-91i"; */ "xQu-QV-91i.title" = "Article Text Size:"; diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index 692e98b0b..8d5fd512f 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -596,7 +596,6 @@ 65ED4056235DEF6C0081F399 /* NetNewsWire.sdef in Resources */ = {isa = PBXBuildFile; fileRef = 84C9FC8A22629E8F00D921D6 /* NetNewsWire.sdef */; }; 65ED4058235DEF6C0081F399 /* main.js in Resources */ = {isa = PBXBuildFile; fileRef = 517630032336215100E15FFF /* main.js */; }; 65ED405A235DEF6C0081F399 /* main_mac.js in Resources */ = {isa = PBXBuildFile; fileRef = 5142194A2353C1CF00E07E2C /* main_mac.js */; }; - 65ED405B235DEF6C0081F399 /* KeyboardShortcuts.html in Resources */ = {isa = PBXBuildFile; fileRef = 84C9FC8722629E8F00D921D6 /* KeyboardShortcuts.html */; }; 65ED405C235DEF6C0081F399 /* ImportOPMLSheet.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5144EA3A227A379E00D19003 /* ImportOPMLSheet.xib */; }; 65ED405D235DEF6C0081F399 /* SidebarKeyboardShortcuts.plist in Resources */ = {isa = PBXBuildFile; fileRef = 844B5B681FEA20DF00C7C76A /* SidebarKeyboardShortcuts.plist */; }; 65ED405E235DEF6C0081F399 /* DefaultFeeds.opml in Resources */ = {isa = PBXBuildFile; fileRef = 84A3EE52223B667F00557320 /* DefaultFeeds.opml */; }; @@ -719,7 +718,6 @@ 84C9FC7B22629E1200D921D6 /* PreferencesControlsBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C9FC7122629E1200D921D6 /* PreferencesControlsBackgroundView.swift */; }; 84C9FC7C22629E1200D921D6 /* AccountsPreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C9FC7222629E1200D921D6 /* AccountsPreferencesViewController.swift */; }; 84C9FC8222629E4800D921D6 /* Preferences.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84C9FC8022629E4800D921D6 /* Preferences.storyboard */; }; - 84C9FC8C22629E8F00D921D6 /* KeyboardShortcuts.html in Resources */ = {isa = PBXBuildFile; fileRef = 84C9FC8722629E8F00D921D6 /* KeyboardShortcuts.html */; }; 84C9FC8E22629E8F00D921D6 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 84C9FC8922629E8F00D921D6 /* Credits.rtf */; }; 84C9FC8F22629E8F00D921D6 /* NetNewsWire.sdef in Resources */ = {isa = PBXBuildFile; fileRef = 84C9FC8A22629E8F00D921D6 /* NetNewsWire.sdef */; }; 84C9FC9D2262A1A900D921D6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 84C9FC9B2262A1A900D921D6 /* Assets.xcassets */; }; @@ -848,6 +846,8 @@ DF84E563295122BA0045C334 /* TimelineCustomizerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF84E562295122BA0045C334 /* TimelineCustomizerView.swift */; }; DF93DB2B296A319000586C0E /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = DF93DB2D296A319000586C0E /* Localizable.stringsdict */; }; DF93DB2F296A42BD00586C0E /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = DF93DB31296A42BD00586C0E /* Localizable.stringsdict */; }; + DFACAE022A2D52F8007F7568 /* KeyboardHTML.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFACAE012A2D52F8007F7568 /* KeyboardHTML.swift */; }; + DFACAE032A2D52F8007F7568 /* KeyboardHTML.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFACAE012A2D52F8007F7568 /* KeyboardHTML.swift */; }; DFB3497A294A962D00BC81AD /* AddAccountListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB34979294A962D00BC81AD /* AddAccountListView.swift */; }; DFB34980294B085100BC81AD /* AccountInspectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB3497F294B085100BC81AD /* AccountInspectorView.swift */; }; DFB34988294B447F00BC81AD /* InjectedNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB34987294B447F00BC81AD /* InjectedNavigationView.swift */; }; @@ -1493,7 +1493,6 @@ 84C9FC7122629E1200D921D6 /* PreferencesControlsBackgroundView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesControlsBackgroundView.swift; sourceTree = ""; }; 84C9FC7222629E1200D921D6 /* AccountsPreferencesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsPreferencesViewController.swift; sourceTree = ""; }; 84C9FC8122629E4800D921D6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Mac/Base.lproj/Preferences.storyboard; sourceTree = SOURCE_ROOT; }; - 84C9FC8722629E8F00D921D6 /* KeyboardShortcuts.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = KeyboardShortcuts.html; sourceTree = ""; }; 84C9FC8922629E8F00D921D6 /* Credits.rtf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 84C9FC8A22629E8F00D921D6 /* NetNewsWire.sdef */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = NetNewsWire.sdef; sourceTree = ""; }; 84C9FC9022629ECB00D921D6 /* NetNewsWire.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NetNewsWire.entitlements; sourceTree = ""; }; @@ -1675,6 +1674,11 @@ DF93DB30296A42BD00586C0E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = ""; }; DF93DB33296A4A8F00586C0E /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/Localizable.strings"; sourceTree = ""; }; DF93DB34296A4A9300586C0E /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "en-GB"; path = "en-GB.lproj/Localizable.stringsdict"; sourceTree = ""; }; + DFACAE012A2D52F8007F7568 /* KeyboardHTML.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardHTML.swift; sourceTree = ""; }; + DFACAE042A2DD690007F7568 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/NNW3OpenPanelAccessoryView.strings"; sourceTree = ""; }; + DFACAE052A2DD690007F7568 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/ExportOPMLSheet.strings"; sourceTree = ""; }; + DFACAE062A2DD690007F7568 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/ImportOPMLSheet.strings"; sourceTree = ""; }; + DFACAE072A2DD9F0007F7568 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; DFB34979294A962D00BC81AD /* AddAccountListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddAccountListView.swift; sourceTree = ""; }; DFB3497F294B085100BC81AD /* AccountInspectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountInspectorView.swift; sourceTree = ""; }; DFB34987294B447F00BC81AD /* InjectedNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InjectedNavigationView.swift; sourceTree = ""; }; @@ -2790,7 +2794,7 @@ 84C9FC8622629E8F00D921D6 /* KeyboardShortcuts */ = { isa = PBXGroup; children = ( - 84C9FC8722629E8F00D921D6 /* KeyboardShortcuts.html */, + DFACAE012A2D52F8007F7568 /* KeyboardHTML.swift */, ); path = KeyboardShortcuts; sourceTree = ""; @@ -3594,7 +3598,6 @@ 65ED40A1235DEFF00081F399 /* container-migration.plist in Resources */, DF5124DA2A23107300BBAB1F /* AccountsAddLocal.xib in Resources */, 65ED405A235DEF6C0081F399 /* main_mac.js in Resources */, - 65ED405B235DEF6C0081F399 /* KeyboardShortcuts.html in Resources */, 65ED405C235DEF6C0081F399 /* ImportOPMLSheet.xib in Resources */, 51DEE81926FBFF84006DAA56 /* Promenade.nnwtheme in Resources */, 65ED405D235DEF6C0081F399 /* SidebarKeyboardShortcuts.plist in Resources */, @@ -3699,7 +3702,6 @@ 51DEE81826FBFF84006DAA56 /* Promenade.nnwtheme in Resources */, 5142194B2353C1CF00E07E2C /* main_mac.js in Resources */, DFCE4F9128EF26F100405869 /* About.plist in Resources */, - 84C9FC8C22629E8F00D921D6 /* KeyboardShortcuts.html in Resources */, B27EEBF9244D15F3000932E6 /* stylesheet.css in Resources */, DF6DE5142965924C002EC085 /* InfoPlist.strings in Resources */, 5144EA3B227A379E00D19003 /* ImportOPMLSheet.xib in Resources */, @@ -4051,6 +4053,7 @@ 65ED3FC4235DEF6C0081F399 /* OPMLExporter.swift in Sources */, 51DC07992552083500A3F79F /* ArticleTextSize.swift in Sources */, 65ED3FC6235DEF6C0081F399 /* UnreadFeed.swift in Sources */, + DFACAE032A2D52F8007F7568 /* KeyboardHTML.swift in Sources */, 65ED3FC8235DEF6C0081F399 /* SidebarCellLayout.swift in Sources */, 65ED3FC9235DEF6C0081F399 /* SmartFeedPasteboardWriter.swift in Sources */, 515A5149243E64BA0089E588 /* ExtensionPointEnableWindowController.swift in Sources */, @@ -4558,6 +4561,7 @@ 8454C3F8263F3AD400E3F9C7 /* IconImageCache.swift in Sources */, 518651B223555EB20078E021 /* NNW3Document.swift in Sources */, D5F4EDB5200744A700B9E363 /* ScriptingObject.swift in Sources */, + DFACAE022A2D52F8007F7568 /* KeyboardHTML.swift in Sources */, DFC14F0F28EA55BD00F6EE86 /* AboutWindowController.swift in Sources */, D5F4EDB920074D7C00B9E363 /* Folder+Scriptability.swift in Sources */, 849A97781ED9EC04007D329B /* TimelineCellLayout.swift in Sources */, @@ -4750,6 +4754,7 @@ children = ( 8FBBEE432304CC00007279FB /* Base */, C4A3967E2A2AEC5400C89D55 /* zh-Hans */, + DFACAE062A2DD690007F7568 /* en-GB */, ); name = ImportOPMLSheet.xib; sourceTree = ""; @@ -4819,6 +4824,7 @@ children = ( 8FB3CBC9235D307E0026324C /* Base */, C4A3967C2A2AEC5400C89D55 /* zh-Hans */, + DFACAE042A2DD690007F7568 /* en-GB */, ); name = NNW3OpenPanelAccessoryView.xib; sourceTree = ""; @@ -4828,6 +4834,7 @@ children = ( 8FBBEE4E2304CC06007279FB /* Base */, C4A3967D2A2AEC5400C89D55 /* zh-Hans */, + DFACAE052A2DD690007F7568 /* en-GB */, ); name = ExportOPMLSheet.xib; sourceTree = ""; @@ -5017,6 +5024,7 @@ children = ( DF6DE5132965924C002EC085 /* en-GB */, C473703E2A232A3200E77890 /* zh-Hans */, + DFACAE072A2DD9F0007F7568 /* en */, ); name = InfoPlist.strings; sourceTree = ""; diff --git a/Shared/Article Rendering/ArticleRenderer.swift b/Shared/Article Rendering/ArticleRenderer.swift index b44bb2374..41a3ce7f3 100644 --- a/Shared/Article Rendering/ArticleRenderer.swift +++ b/Shared/Article Rendering/ArticleRenderer.swift @@ -156,17 +156,17 @@ private extension ArticleRenderer { } private var multipleSelectionHTML: String { - let body = "

Multiple selection

" + let body = "

" + NSLocalizedString("label.text.multiple-selection", comment: "Multiple selection") + "

" return body } private var loadingHTML: String { - let body = "

Loading...

" + let body = "

" + NSLocalizedString("label.text.loading", comment: "Loading...") + "

" return body } private var noSelectionHTML: String { - let body = "

No selection

" + let body = "

" + NSLocalizedString("label.text.no-selection", comment: "No selection") + "

" return body } diff --git a/iOS/Add/en-GB.lproj/Add.strings b/iOS/Add/en-GB.lproj/Add.strings index 6b582f20c..7ecb664c8 100644 --- a/iOS/Add/en-GB.lproj/Add.strings +++ b/iOS/Add/en-GB.lproj/Add.strings @@ -1,25 +1,6 @@ - /* Class = "UILabel"; text = "Folder"; ObjectID = "3Tp-A7-7rS"; */ "3Tp-A7-7rS.text" = "Folder"; -/* Class = "UIBarButtonItem"; title = "Add"; ObjectID = "F8z-me-Hnx"; */ -"F8z-me-Hnx.title" = "Add"; - -/* Class = "UINavigationItem"; title = "Add Folder"; ObjectID = "LuA-AC-n99"; */ -"LuA-AC-n99.title" = "Add Folder"; - -/* Class = "UIBarButtonItem"; title = "Cancel"; ObjectID = "QpU-Ro-nHd"; */ -"QpU-Ro-nHd.title" = "Cancel"; - -/* Class = "UILabel"; text = "Folder"; ObjectID = "RtT-rR-5LA"; */ -"RtT-rR-5LA.text" = "Folder"; - -/* Class = "UILabel"; text = "Account"; ObjectID = "YRf-I7-nkL"; */ -"YRf-I7-nkL.text" = "Account"; - -/* Class = "UILabel"; text = "Account"; ObjectID = "ZQp-94-vJz"; */ -"ZQp-94-vJz.text" = "Account"; - /* Class = "UITableViewController"; title = "Web Feed Folder"; ObjectID = "acA-n7-ohN"; */ "acA-n7-ohN.title" = "Web Feed Folder"; @@ -29,6 +10,9 @@ /* Class = "UITextField"; placeholder = "URL"; ObjectID = "eRp-AP-WFq"; */ "eRp-AP-WFq.placeholder" = "URL"; +/* Class = "UIBarButtonItem"; title = "Add"; ObjectID = "F8z-me-Hnx"; */ +"F8z-me-Hnx.title" = "Add"; + /* Class = "UIBarButtonItem"; title = "Add"; ObjectID = "gXG-Xt-d9B"; */ "gXG-Xt-d9B.title" = "Add"; @@ -38,11 +22,27 @@ /* Class = "UINavigationItem"; title = "Add Web Feed"; ObjectID = "i1W-2z-PAk"; */ "i1W-2z-PAk.title" = "Add Web Feed"; +/* Class = "UINavigationItem"; title = "Add Folder"; ObjectID = "LuA-AC-n99"; */ +"LuA-AC-n99.title" = "Add Folder"; + /* Class = "UITextField"; placeholder = "Name"; ObjectID = "lZK-wx-jbo"; */ "lZK-wx-jbo.placeholder" = "Name"; /* Class = "UILabel"; text = "Label"; ObjectID = "mxj-Bw-Jfx"; */ "mxj-Bw-Jfx.text" = "Label"; +/* Class = "UIBarButtonItem"; title = "Cancel"; ObjectID = "QpU-Ro-nHd"; */ +"QpU-Ro-nHd.title" = "Cancel"; + +/* Class = "UILabel"; text = "Folder"; ObjectID = "RtT-rR-5LA"; */ +"RtT-rR-5LA.text" = "Folder"; + /* Class = "UITextField"; placeholder = "Title (Optional)"; ObjectID = "u7n-VL-Ho9"; */ "u7n-VL-Ho9.placeholder" = "Title (Optional)"; + +/* Class = "UILabel"; text = "Account"; ObjectID = "YRf-I7-nkL"; */ +"YRf-I7-nkL.text" = "Account"; + +/* Class = "UILabel"; text = "Account"; ObjectID = "ZQp-94-vJz"; */ +"ZQp-94-vJz.text" = "Account"; + diff --git a/iOS/Add/en-GB.lproj/AddFeedSelectFolderTableViewCell.strings b/iOS/Add/en-GB.lproj/AddFeedSelectFolderTableViewCell.strings index 94a8fe442..510bbf4af 100644 --- a/iOS/Add/en-GB.lproj/AddFeedSelectFolderTableViewCell.strings +++ b/iOS/Add/en-GB.lproj/AddFeedSelectFolderTableViewCell.strings @@ -1,6 +1,6 @@ - /* Class = "UILabel"; text = "Detail"; ObjectID = "jCz-VR-Elr"; */ "jCz-VR-Elr.text" = "Detail"; /* Class = "UILabel"; text = "Folder"; ObjectID = "xCU-fd-wms"; */ "xCU-fd-wms.text" = "Folder"; + diff --git a/iOS/Article/ImageViewController.swift b/iOS/Article/ImageViewController.swift index e1b9f0616..c6bee66e8 100644 --- a/iOS/Article/ImageViewController.swift +++ b/iOS/Article/ImageViewController.swift @@ -28,7 +28,7 @@ class ImageViewController: UIViewController { override var keyCommands: [UIKeyCommand]? { return [ UIKeyCommand( - title: NSLocalizedString("Close Image", comment: "Close Image"), + title: NSLocalizedString("button.title.close-image", comment: "Close Image"), action: #selector(done(_:)), input: " " ) diff --git a/iOS/MasterTimeline/en-GB.lproj/MasterTimelineTitleView.strings b/iOS/MasterTimeline/en-GB.lproj/MasterTimelineTitleView.strings index fca034322..516edc45f 100644 --- a/iOS/MasterTimeline/en-GB.lproj/MasterTimelineTitleView.strings +++ b/iOS/MasterTimeline/en-GB.lproj/MasterTimelineTitleView.strings @@ -1,3 +1,3 @@ - /* Class = "UILabel"; text = "Label"; ObjectID = "5F6-2v-qSS"; */ "5F6-2v-qSS.text" = "Label"; + diff --git a/iOS/Resources/en-GB.lproj/Localizable.strings b/iOS/Resources/en-GB.lproj/Localizable.strings index 1eab7fdf5..23b45859b 100644 --- a/iOS/Resources/en-GB.lproj/Localizable.strings +++ b/iOS/Resources/en-GB.lproj/Localizable.strings @@ -132,6 +132,9 @@ /* Twitter Deprecation Message */ "alert.message.twitter-deprecation-message" = "On February 1, 2023, Twitter announced the end of free access to the Twitter API, effective February 9.\n\nSince Twitter does not provide RSS feeds, we’ve had to use the Twitter API. Without free access to that API, we can’t read feeds from Twitter.\n\nWe’ve left your Twitter feeds intact. If you have any starred items from those feeds, they will remain as long as you don’t delete those feeds.\n\nYou can still read whatever you have already downloaded. However, those feeds will no longer update."; +/* Twitter deprecation message */ +"alert.message.twitter-integration-removed" = "Twitter Integration Removed"; + /* Are you sure you want to deactivate “%@“? */ "alert.title.deactivate-extension.%@" = "Are you sure you want to deactivate “%@“?"; @@ -196,21 +199,21 @@ /* Light */ "appdefaults.colorpalette.light" = "Light"; -/* Filter Read Feeds */ -"button.accessibility.title.filter-read-feeds" = "Filter Read Feeds"; - -/* Selected - Filter Read Feeds */ -"button.accessibility.title.selected-filter-read-feeds" = "Selected - Filter Read Feeds"; - /* Error - Reader View */ "button.accessibility.title.error-readerview" = "Error - Reader View"; +/* Filter Read Feeds */ +"button.accessibility.title.filter-read-feeds" = "Filter Read Feeds"; + /* Processing - Reader View */ "button.accessibility.title.processing-readerview" = "Processing - Reader View"; /* Reader View */ "button.accessibility.title.readerview" = "Reader View"; +/* Selected - Filter Read Feeds */ +"button.accessibility.title.selected-filter-read-feeds" = "Selected - Filter Read Feeds"; + /* Selected - Reader View */ "button.accessibility.title.selected-readerview" = "Selected - Reader View"; @@ -266,6 +269,9 @@ /* Close */ "button.title.close" = "Close"; +/* Close Image */ +"button.title.close-image" = "Close Image"; + /* Copy Article URL */ "button.title.copy-article-url" = "Copy Article URL"; @@ -505,21 +511,12 @@ /* Use iCloud */ "button.title.use-cloudkit" = "Use iCloud"; -/* Button title */ -"Cancel" = "Cancel"; - -/* Button title */ -"Done" = "Done"; - /* Unable to create extension. */ "error.message.unable-to-create-extension" = "Unable to create extension."; /* Unable to communicate with NetNewsWire. */ "errordescription.localized.communication-failure" = "Unable to communicate with NetNewsWire."; -/* Filter Read Feeds */ -"Filter Read Feeds" = "Filter Read Feeds"; - /* Add Feed */ "homescreen.action.add-feed" = "Add Feed"; @@ -628,6 +625,15 @@ /* Feed name */ "label.placeholder.feed-name" = "Feed name"; +/* Multiple selection */ +"label.text.multiple-selection" = "Multiple selection"; + +/* Multiple selection */ +"label.text.no-selection" = "No selection"; + +/* Loading... */ +"label.text.loading" = "Loading..."; + /* In English, this shows the current search result selection out of the total number of search results. Example: 3 of 5. The variables are ordered as current selection, total search results count. */ "label.search-results.%i.%i" = "%1$i of %2$i"; @@ -772,6 +778,10 @@ /* Created by %@ */ "label.text.theme-created-byline.%@" = "Created by %@"; +/* Built-in Themes + Other Themes */ +"label.text.themes-builtin" = "Built-in Themes"; + /* Sign in to your The Old Reader account and sync your feeds across your devices. Your username and password will be encrypted and stored in Keychain.\n\nDon’t have a The Old Reader account? [Sign Up Here](https://theoldreader.com) */ "label.text.theoldreader-explainer" = "Sign in to your The Old Reader account and sync your feeds across your devices. Your username and password will be encrypted and stored in Keychain.\n\nDon’t have a The Old Reader account? \n\n[Sign Up Here](https://theoldreader.com)"; @@ -812,6 +822,9 @@ /* Command */ "Mark as Read Older Than" = "Mark as Read Older Than"; +/* Mark As Read on Scroll */ +"Mark As Read on Scroll" = "Mark As Read on Scroll"; + /* Article Appearance menu title */ "menu.title.articleappearance" = "Article Appearance"; @@ -866,9 +879,6 @@ /* Title used when describing the search when scoped to the current timeline. */ "searchbar.scope.here" = "Here"; -/* Selected - Filter Read Feeds */ -"Selected - Filter Read Feeds" = "Selected - Filter Read Feeds"; - /* All Unread pseudo-feed title */ "smartfeed.title.allunread" = "All Unread"; @@ -929,6 +939,9 @@ /* Sort Oldest to Newest */ "toggle.title.sort-oldest-to-newest" = "Sort Oldest to Newest"; -/* Unread label for accessiblity */ +/* Unknown Value */ +"Unknown" = "Unknown"; + +/* Unread label for accessibility */ "unread" = "unread"; diff --git a/iOS/Resources/en.lproj/Localizable.strings b/iOS/Resources/en.lproj/Localizable.strings index 489e41610..89399b7d3 100644 --- a/iOS/Resources/en.lproj/Localizable.strings +++ b/iOS/Resources/en.lproj/Localizable.strings @@ -190,21 +190,21 @@ /* Light */ "appdefaults.colorpalette.light" = "Light"; -/* Filter Read Feeds */ -"button.accessibility.title.filter-read-feeds" = "Filter Read Feeds"; - -/* Selected - Filter Read Feeds */ -"button.accessibility.title.selected-filter-read-feeds" = "Selected - Filter Read Feeds"; - /* Error - Reader View */ "button.accessibility.title.error-readerview" = "Error - Reader View"; +/* Filter Read Feeds */ +"button.accessibility.title.filter-read-feeds" = "Filter Read Feeds"; + /* Processing - Reader View */ "button.accessibility.title.processing-readerview" = "Processing - Reader View"; /* Reader View */ "button.accessibility.title.readerview" = "Reader View"; +/* Selected - Filter Read Feeds */ +"button.accessibility.title.selected-filter-read-feeds" = "Selected - Filter Read Feeds"; + /* Selected - Reader View */ "button.accessibility.title.selected-readerview" = "Selected - Reader View"; @@ -260,6 +260,9 @@ /* Close */ "button.title.close" = "Close"; +/* Close Image */ +"button.title.close-image" = "Close Image"; + /* Copy Article URL */ "button.title.copy-article-url" = "Copy Article URL"; @@ -664,6 +667,15 @@ /* Device Permissions */ "label.text.device-permissions" = "Device Permissions"; +/* Multiple selection */ +"label.text.multiple-selection" = "Multiple selection"; + +/* Multiple selection */ +"label.text.no-selection" = "No selection"; + +/* Loading... */ +"label.text.loading" = "Loading..."; + /* Configure NetNewsWire's access to Siri, background app refresh, mobile data, and more. */ "label.text.device-permissions-explainer" = "Configure NetNewsWire's access to Siri, background app refresh, mobile data, and more."; diff --git a/iOS/Resources/zh-Hans.lproj/Localizable.strings b/iOS/Resources/zh-Hans.lproj/Localizable.strings index 09d699b32..777060d88 100644 --- a/iOS/Resources/zh-Hans.lproj/Localizable.strings +++ b/iOS/Resources/zh-Hans.lproj/Localizable.strings @@ -506,7 +506,7 @@ "button.title.use-cloudkit" = "使用 iCloud"; /* Close Image */ -"Close Image" = "关闭图像"; +"button.title.close-image" = "关闭图像"; /* Unable to create extension. */ "error.message.unable-to-create-extension" = "无法创建扩展。";