diff --git a/.github/workflows/appcast.yml b/.github/workflows/appcast.yml index aae935a..7a10112 100644 --- a/.github/workflows/appcast.yml +++ b/.github/workflows/appcast.yml @@ -9,13 +9,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout 🛎 - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: - # If you're using actions/checkout@v3 you must set persist-credentials to false in most cases for the deployment to work correctly. + # If you're using actions/checkout@v4 you must set persist-credentials to false in most cases for the deployment to work correctly. persist-credentials: false - name: Cache 📦 - uses: actions/cache@v3.3.1 + uses: actions/cache@v3.3.2 with: path: AppCast/vendor/bundle key: ${{ runner.os }}-gems-v1.0-${{ hashFiles('AppCast/Gemfile') }} @@ -23,7 +23,7 @@ jobs: ${{ runner.os }}-gems- - name: Setup Ruby, JRuby and TruffleRuby - uses: ruby/setup-ruby@v1.144.2 + uses: ruby/setup-ruby@v1.161.0 with: ruby-version: '2.7' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3a4a580..788f9af 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,10 +8,10 @@ on: jobs: test: - runs-on: macos-12 + runs-on: macos-13 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Run tests env: - DEVELOPER_DIR: /Applications/Xcode_13.2.1.app + DEVELOPER_DIR: /Applications/Xcode_15.0.1.app run: xcodebuild test -scheme Xcodes diff --git a/README.md b/README.md index ef13d84..e18c941 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,12 @@ The easiest way to install and switch between multiple versions of Xcode. _If you're looking for a command-line version of Xcodes.app, try [`xcodes`](https://github.com/XcodesOrg/xcodes)._ -![CI](https://github.com/XcodesOrg/Xcodes.app/workflows/CI/badge.svg) +![CI](https://github.com/XcodesOrg/XcodesApp/workflows/CI/badge.svg) ![](screenshot_light.png#gh-light-mode-only) ![](screenshot_dark.png#gh-dark-mode-only) -### :tada: Announcment +### :tada: Announcement XcodesApp is now part of the `XcodesOrg` - [read more here](nextstep.md) @@ -25,14 +25,14 @@ XcodesApp is now part of the `XcodesOrg` - [read more here](nextstep.md) ## Experiments -- Thanks to the wonderful work of [https://github.com/saagarjha/unxip](https://github.com/saagarjha/unxip), turn on the experiment to increase your unxipping time by up to 70%! More can be found on his repo, but bugs, high memory may occur if used. +- Thanks to the wonderful work of [https://github.com/saagarjha/unxip](https://github.com/saagarjha/unxip), turn on the experiment to increase your unxipping time by up to 70%! More can be found on his repo, but bugs, high memory may occur if used. -![](experiment_light.jpg#gh-light-mode-only) -![](experiment_dark.jpg#gh-dark-mode-only) +![](experiment_light.png#gh-light-mode-only) +![](experiment_dark.png#gh-dark-mode-only) ## Localization -Xcodes supports localization in several languages. +Xcodes supports localization in several languages. The following languages are supported because of the following community users! @@ -45,22 +45,23 @@ The following languages are supported because of the following community users! |Finnish 🇫🇮 |[@marcusziade](https://github.com/marcusziade)|Chinese-Traditional 🇹🇼|[@itszero](https://github.com/itszero)| |Ukranian 🇺🇦 |[@gelosi](https://github.com/gelosi)|Japanese 🇯🇵|[@tatsuz0u](https://github.com/tatsuz0u)| |German 🇩🇪|[@drct](https://github.com/drct)|Dutch 🇳🇱|[@jfversluis](https://github/com/jfversluis)| -|Brazilian Portuguese 🇧🇷|[@brunomunizaf](https://github.com/brunomunizaf)|| +|Brazilian Portuguese 🇧🇷|[@brunomunizaf](https://github.com/brunomunizaf)|Polish 🇵🇱|[@jakex7](https://github.com/jakex7)| +|Catalan|[@ferranabello](https://github.com/ferranabello)| -Want to add more languages? Simply create a PR with the updated strings file. +Want to add more languages? Simply create a PR with the updated strings file. ## Installation Xcodes.app runs on macOS Big Sur 11.0 or later. -### Homebrew Cask +### Install with Homebrew + +Developer ID-signed and notarized release builds are available on Homebrew. These don't require Xcode to already be installed in order to use. ```sh brew install --cask xcodes - -# These are Developer ID-signed and notarized release builds and don't require Xcode to already be installed in order to use. ``` -### Download a release +### Manually install 1. Download the latest version [here](https://github.com/XcodesOrg/XcodesApp/releases/latest) using the **Xcodes.zip** asset. These are Developer ID-signed and notarized release builds and don't require Xcode to already be installed in order to use. 2. Move the unzipped `Xcodes.app` to your `/Applications` directory @@ -79,7 +80,7 @@ You'll need macOS 12 Big Sur and Xcode 13 in order to build and run Xcodes.app. # combine for universal binary lipo -create -output unxip unxip_intel unxip_m1 # check it - lipo -archs unxip + lipo -archs unxip ``` Notable design decisions are recorded in [DECISIONS.md](./DECISIONS.md). The Apple authentication flow is described in [Apple.paw](./Apple.paw), which will allow you to play with the API endpoints that are involved using the [Paw](https://paw.cloud) app. diff --git a/Xcodes.xcodeproj/project.pbxproj b/Xcodes.xcodeproj/project.pbxproj index 17491bf..86eb5b4 100644 --- a/Xcodes.xcodeproj/project.pbxproj +++ b/Xcodes.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -100,6 +100,7 @@ CAFE4AB425B7D3AF0064FE51 /* AdvancedPreferencePane.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFE4AB325B7D3AF0064FE51 /* AdvancedPreferencePane.swift */; }; CAFE4ABC25B7D54B0064FE51 /* UpdatesPreferencePane.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFE4ABB25B7D54B0064FE51 /* UpdatesPreferencePane.swift */; }; CAFFFED8259CDA5000903F81 /* XcodeListViewRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFFFED7259CDA5000903F81 /* XcodeListViewRow.swift */; }; + E689540325BE8C64000EBCEA /* DockProgress in Frameworks */ = {isa = PBXBuildFile; productRef = E689540225BE8C64000EBCEA /* DockProgress */; }; E81D7EA02805250100A205FC /* Collection+.swift in Sources */ = {isa = PBXBuildFile; fileRef = E81D7E9F2805250100A205FC /* Collection+.swift */; }; E872EE4E2808D4F100D3DD8B /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E872EE502808D4F100D3DD8B /* Localizable.strings */; }; E87AB3C52939B65E00D72F43 /* Hardware.swift in Sources */ = {isa = PBXBuildFile; fileRef = E87AB3C42939B65E00D72F43 /* Hardware.swift */; }; @@ -175,6 +176,7 @@ /* Begin PBXFileReference section */ 15FAD1652811D15600B63259 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/Localizable.strings; sourceTree = ""; }; + 23703D6E29EBF63500DFA346 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; }; 25E2FA26284769A00014A318 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; 327DF109286ABE6B00D694D5 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; }; 36741BFC291E4FDB00A85AAE /* DownloadPreferencePane.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DownloadPreferencePane.swift; sourceTree = ""; }; @@ -185,6 +187,7 @@ 53CBAB2B263DCC9100410495 /* XcodesAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodesAlert.swift; sourceTree = ""; }; 58F743C02810A34900EEC0F3 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; 5AA8A6102877EDAD009ECDB0 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; }; + 5C3927ED28E4B486007B5119 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = ""; }; 63EAA4EA259944450046AB8F /* ProgressButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressButton.swift; sourceTree = ""; }; 6CA3A090282EBE72005A6E35 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Localizable.strings"; sourceTree = ""; }; 7CBF284E28606D2C001AA66B /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = ""; }; @@ -330,6 +333,7 @@ E8F81FC4282D8A17006CBD0F /* Sparkle in Frameworks */, CABFA9E42592F08E00380FEE /* Version in Frameworks */, CABFA9FD2592F13300380FEE /* LegibleError in Frameworks */, + E689540325BE8C64000EBCEA /* DockProgress in Frameworks */, CA9FF86D25951C6E00E47BAF /* XCModel in Frameworks */, CABFA9F82592F0F900380FEE /* KeychainAccess in Frameworks */, CAA858CD25A3D8BC00ACF8C0 /* ErrorHandling in Frameworks */, @@ -672,6 +676,7 @@ CA9FF86C25951C6E00E47BAF /* XCModel */, CAA858CC25A3D8BC00ACF8C0 /* ErrorHandling */, E8F81FC3282D8A17006CBD0F /* Sparkle */, + E689540225BE8C64000EBCEA /* DockProgress */, E8FD5726291EE4AC001E004C /* AsyncNetworkService */, E8C0EB19291EF43E0081528A /* XcodesKit */, E8F44A1D296B4CD7002D6592 /* Path */, @@ -743,8 +748,10 @@ de, uk, fi, + ca, "pt-BR", nl, + pl, ); mainGroup = CAD2E7952449574E00113D76; packageReferences = ( @@ -756,6 +763,7 @@ CAA858CB25A3D8BC00ACF8C0 /* XCRemoteSwiftPackageReference "ErrorHandling" */, CAC28186259EE27200B8AB0B /* XCRemoteSwiftPackageReference "CombineExpectations" */, E8F81FC2282D8A17006CBD0F /* XCRemoteSwiftPackageReference "Sparkle" */, + E689540125BE8C64000EBCEA /* XCRemoteSwiftPackageReference "DockProgress" */, E8FD5725291EE4AC001E004C /* XCRemoteSwiftPackageReference "AsyncHTTPNetworkService" */, E8F44A1C296B4CD7002D6592 /* XCRemoteSwiftPackageReference "Path" */, ); @@ -963,8 +971,10 @@ A0187D39285792D1002F46F9 /* de */, 7CBF284E28606D2C001AA66B /* uk */, 5AA8A6102877EDAD009ECDB0 /* fi */, + 5C3927ED28E4B486007B5119 /* ca */, 327DF109286ABE6B00D694D5 /* pt-BR */, E2AFDCCA28F024D000864ADD /* nl */, + 23703D6E29EBF63500DFA346 /* pl */, ); name = Localizable.strings; sourceTree = ""; @@ -1090,7 +1100,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CODE_SIGN_STYLE = Automatic; CREATE_INFOPLIST_SECTION_IN_BINARY = YES; - DEVELOPMENT_TEAM = PBH8V487HB; + DEVELOPMENT_TEAM = ZU6GR6B2FY; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = "$(SRCROOT)/$(TARGET_NAME)/Info.plist"; MARKETING_VERSION = 1.0.3; @@ -1140,7 +1150,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CODE_SIGN_STYLE = Automatic; CREATE_INFOPLIST_SECTION_IN_BINARY = YES; - DEVELOPMENT_TEAM = PBH8V487HB; + DEVELOPMENT_TEAM = ZU6GR6B2FY; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = "$(SRCROOT)/$(TARGET_NAME)/Info.plist"; MARKETING_VERSION = 1.0.3; @@ -1332,7 +1342,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = PBH8V487HB; + DEVELOPMENT_TEAM = ZU6GR6B2FY; INFOPLIST_FILE = XcodesTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -1353,7 +1363,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = PBH8V487HB; + DEVELOPMENT_TEAM = ZU6GR6B2FY; INFOPLIST_FILE = XcodesTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -1417,6 +1427,8 @@ isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/xcodereleases/data"; requirement = { + kind = revision; + revision = a43ad89e536d7a3da525fcc23fb182c37b756ecc; branch = main; kind = branch; }; @@ -1469,6 +1481,14 @@ minimumVersion = 0.6.0; }; }; + E689540125BE8C64000EBCEA /* XCRemoteSwiftPackageReference "DockProgress" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/sindresorhus/DockProgress"; + requirement = { + kind = upToNextMinorVersion; + minimumVersion = 3.2.0; + }; + }; E8F44A1C296B4CD7002D6592 /* XCRemoteSwiftPackageReference "Path" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/mxcl/Path.swift"; @@ -1535,6 +1555,11 @@ package = CAC28186259EE27200B8AB0B /* XCRemoteSwiftPackageReference "CombineExpectations" */; productName = CombineExpectations; }; + E689540225BE8C64000EBCEA /* DockProgress */ = { + isa = XCSwiftPackageProductDependency; + package = E689540125BE8C64000EBCEA /* XCRemoteSwiftPackageReference "DockProgress" */; + productName = DockProgress; + }; E8C0EB19291EF43E0081528A /* XcodesKit */ = { isa = XCSwiftPackageProductDependency; productName = XcodesKit; diff --git a/Xcodes.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Xcodes.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 74dc3a7..25d8d5b 100644 --- a/Xcodes.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Xcodes.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -23,11 +23,20 @@ "package": "XcodeReleases", "repositoryURL": "https://github.com/xcodereleases/data", "state": { - "branch": "main", + "branch": null, "revision": "a43ad89e536d7a3da525fcc23fb182c37b756ecc", "version": null } }, + { + "package": "DockProgress", + "repositoryURL": "https://github.com/sindresorhus/DockProgress", + "state": { + "branch": null, + "revision": "7100b68571e2dafe3a06ad5905b80fc3b0107b4b", + "version": "3.2.0" + } + }, { "package": "ErrorHandling", "repositoryURL": "https://github.com/RobotsAndPencils/ErrorHandling", diff --git a/Xcodes/Backend/AppState+Install.swift b/Xcodes/Backend/AppState+Install.swift index 41d71cc..dd8eec6 100644 --- a/Xcodes/Backend/AppState+Install.swift +++ b/Xcodes/Backend/AppState+Install.swift @@ -5,6 +5,7 @@ import AppleAPI import Version import LegibleError import os.log +import DockProgress import XcodesKit /// Downloads and installs Xcodes @@ -44,6 +45,8 @@ extension AppState { Logger.appState.info("Using \(downloader) downloader") + setupDockProgress() + return validateSession() .flatMap { _ in self.getXcodeArchive(installationType, downloader: downloader) @@ -52,6 +55,8 @@ extension AppState { self.installArchivedXcode(xcode, at: url) } .catch { error -> AnyPublisher in + self.resetDockProgressTracking() + switch error { case InstallationError.damagedXIP(let damagedXIPURL): guard attemptNumber < 1 else { return Fail(error: error).eraseToAnyPublisher() } @@ -100,6 +105,7 @@ extension AppState { self.downloadOrUseExistingArchive(for: availableXcode, downloader: downloader, progressChanged: { [unowned self] progress in DispatchQueue.main.async { self.setInstallationStep(of: availableXcode.version, to: .downloading(progress: progress)) + self.overallProgress.addChild(progress, withPendingUnitCount: AppState.totalProgressUnits - AppState.unxipProgressWeight) } }) .map { return (availableXcode, $0) } @@ -152,6 +158,7 @@ extension AppState { cookies ) progressChanged(progress) + return publisher .map { _ in destination.url } .eraseToAnyPublisher() @@ -166,6 +173,7 @@ extension AppState { to: destination.url, resumingWith: resumeData ?? persistedResumeData) progressChanged(progress) + return publisher .map { $0.saveLocation } .eraseToAnyPublisher() @@ -177,6 +185,9 @@ extension AppState { } public func installArchivedXcode(_ availableXcode: AvailableXcode, at archiveURL: URL) -> AnyPublisher { + unxipProgress.completedUnitCount = 0 + overallProgress.addChild(unxipProgress, withPendingUnitCount: AppState.unxipProgressWeight) + do { let destinationURL = Path.installDirectory.join("Xcode-\(availableXcode.version.descriptionWithoutBuildMetadata).app").url switch archiveURL.pathExtension { @@ -416,6 +427,9 @@ extension AppState { } self.presentedAlert = .privilegedHelper } + + unxipProgress.completedUnitCount = AppState.totalProgressUnits + resetDockProgressTracking() return helperInstallConsentSubject .flatMap { @@ -456,6 +470,24 @@ extension AppState { .eraseToAnyPublisher() } + // MARK: - Dock Progress Tracking + + private func setupDockProgress() { + DockProgress.progressInstance = nil + DockProgress.style = .bar + + let progress = Progress(totalUnitCount: AppState.totalProgressUnits) + progress.kind = .file + progress.fileOperationKind = .downloading + overallProgress = progress + + DockProgress.progressInstance = overallProgress + } + + func resetDockProgressTracking() { + DockProgress.progress = 1 // Only way to completely remove overlay with DockProgress is setting progress to complete + } + // MARK: - func setInstallationStep(of version: Version, to step: InstallationStep) { diff --git a/Xcodes/Backend/AppState.swift b/Xcodes/Backend/AppState.swift index 2fb00b8..ae2d4af 100644 --- a/Xcodes/Backend/AppState.swift +++ b/Xcodes/Backend/AppState.swift @@ -7,6 +7,7 @@ import KeychainAccess import Path import Version import os.log +import DockProgress import XcodesKit class AppState: ObservableObject { @@ -115,6 +116,19 @@ class AppState: ObservableObject { private var selectPublisher: AnyCancellable? private var uninstallPublisher: AnyCancellable? private var autoInstallTimer: Timer? + + // MARK: - Dock Progress Tracking + + public static let totalProgressUnits = Int64(10) + public static let unxipProgressWeight = Int64(1) + var overallProgress = Progress() + var unxipProgress = { + let progress = Progress(totalUnitCount: totalProgressUnits) + progress.kind = .file + progress.fileOperationKind = .copying + return progress + }() + // MARK: - var dataSource: DataSource { @@ -512,6 +526,8 @@ class AppState: ObservableObject { // Cancel the publisher installationPublishers[id] = nil + + resetDockProgressTracking() // If the download is cancelled by the user, clean up the download files that aria2 creates. // This isn't done as part of the publisher with handleEvents(receiveCancel:) because it shouldn't happen when e.g. the app quits. diff --git a/Xcodes/Frontend/InfoPane/InfoPane.swift b/Xcodes/Frontend/InfoPane/InfoPane.swift index 7896426..625a5ae 100644 --- a/Xcodes/Frontend/InfoPane/InfoPane.swift +++ b/Xcodes/Frontend/InfoPane/InfoPane.swift @@ -181,6 +181,7 @@ struct InfoPane: View { ("iOS", \.iOS), ("watchOS", \.watchOS), ("tvOS", \.tvOS), + ("visionOS", \.visionOS), ], id: \.0) { row in if let sdk = sdks[keyPath: row.1] { Text("\(row.0): \(sdk.compactMap { $0.number }.joined(separator: ", "))") diff --git a/Xcodes/Frontend/SignIn/PinCodeTextView.swift b/Xcodes/Frontend/SignIn/PinCodeTextView.swift index 45465f3..f0b1c2a 100644 --- a/Xcodes/Frontend/SignIn/PinCodeTextView.swift +++ b/Xcodes/Frontend/SignIn/PinCodeTextView.swift @@ -6,10 +6,12 @@ struct PinCodeTextField: NSViewRepresentable { @Binding var code: String let numberOfDigits: Int + let complete: (String) -> Void func makeNSView(context: Context) -> NSViewType { let view = PinCodeTextView(numberOfDigits: numberOfDigits, itemSpacing: 10) - view.codeDidChange = { c in code = c } + view.codeDidChange = { c in code = c } + view.codeDidComplete = { complete($0) } return view } @@ -29,8 +31,9 @@ struct PinCodeTextField_Previews: PreviewProvider { struct PreviewContainer: View { @State private var code = "1234567890" var body: some View { - PinCodeTextField(code: $code, numberOfDigits: 11) - .padding() + PinCodeTextField(code: $code, numberOfDigits: 11) { + print("Input is complete \($0)") + }.padding() } } @@ -52,10 +55,16 @@ class PinCodeTextView: NSControl, NSTextFieldDelegate { handler(String(code.compactMap { $0 })) } updateText() + + if code.compactMap({ $0 }).count == numberOfDigits, + let handler = codeDidComplete { + handler(String(code.compactMap { $0 })) + } } } var codeDidChange: ((String) -> Void)? = nil - + var codeDidComplete: ((String) -> Void)? = nil + private let numberOfDigits: Int private let stackView: NSStackView = .init(frame: .zero) private var characterViews: [PinCodeCharacterTextField] = [] diff --git a/Xcodes/Frontend/SignIn/SignIn2FAView.swift b/Xcodes/Frontend/SignIn/SignIn2FAView.swift index 2e336e4..1095033 100644 --- a/Xcodes/Frontend/SignIn/SignIn2FAView.swift +++ b/Xcodes/Frontend/SignIn/SignIn2FAView.swift @@ -15,7 +15,9 @@ struct SignIn2FAView: View { HStack { Spacer() - PinCodeTextField(code: $code, numberOfDigits: authOptions.securityCode.length) + PinCodeTextField(code: $code, numberOfDigits: authOptions.securityCode.length) { + appState.submitSecurityCode(.device(code: $0), sessionData: sessionData) + } Spacer() } .padding() diff --git a/Xcodes/Frontend/SignIn/SignInSMSView.swift b/Xcodes/Frontend/SignIn/SignInSMSView.swift index 74d7af0..c8a04db 100644 --- a/Xcodes/Frontend/SignIn/SignInSMSView.swift +++ b/Xcodes/Frontend/SignIn/SignInSMSView.swift @@ -15,7 +15,9 @@ struct SignInSMSView: View { HStack { Spacer() - PinCodeTextField(code: $code, numberOfDigits: authOptions.securityCode.length) + PinCodeTextField(code: $code, numberOfDigits: authOptions.securityCode.length) { + appState.submitSecurityCode(.sms(code: $0, phoneNumberId: trustedPhoneNumber.id), sessionData: sessionData) + } Spacer() } .padding() diff --git a/Xcodes/Frontend/XcodeList/MainToolbar.swift b/Xcodes/Frontend/XcodeList/MainToolbar.swift index 69a48f2..e355304 100644 --- a/Xcodes/Frontend/XcodeList/MainToolbar.swift +++ b/Xcodes/Frontend/XcodeList/MainToolbar.swift @@ -86,16 +86,23 @@ struct MainToolbarModifier: ViewModifier { .keyboardShortcut(KeyboardShortcut("i", modifiers: [.command, .option])) .help("InfoDescription") - Button(action: { - if #available(macOS 13, *) { - NSApp.sendAction(Selector(("showSettingsWindow:")), to: nil, from: nil) - } else { - NSApp.sendAction(Selector(("showPreferencesWindow:")), to: nil, from: nil) - } - }, label: { - Label("Preferences", systemImage: "gearshape") - }) - .help("PreferencesDescription") + if #available(macOS 14, *) { + SettingsLink(label: { + Label("Preferences", systemImage: "gearshape") + }) + .help("PreferencesDescription") + } else { + Button(action: { + if #available(macOS 13, *) { + NSApp.sendAction(Selector(("showSettingsWindow:")), to: nil, from: nil) + } else { + NSApp.sendAction(Selector(("showPreferencesWindow:")), to: nil, from: nil) + } + }, label: { + Label("Preferences", systemImage: "gearshape") + }) + .help("PreferencesDescription") + } TextField("Search", text: $searchText) .textFieldStyle(RoundedBorderTextFieldStyle()) diff --git a/Xcodes/Resources/Licenses.rtf b/Xcodes/Resources/Licenses.rtf index 9d4ab70..d89a291 100644 --- a/Xcodes/Resources/Licenses.rtf +++ b/Xcodes/Resources/Licenses.rtf @@ -335,6 +335,21 @@ For more information, please refer to <>\ otherwise be required by Sections 4(a), 4(b) and 4(d) of the License.\ \ +\fs34 DockProgress\ +\ + +\fs26 MIT License\ +\ +Copyright (c) Sindre Sorhus (sindresorhus.com)\ +\ +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\ +\ +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\ +\ +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\ +\ +\ + \fs34 KeychainAccess\ \ diff --git a/Xcodes/Resources/ca.lproj/Localizable.strings b/Xcodes/Resources/ca.lproj/Localizable.strings new file mode 100644 index 0000000..1958baa --- /dev/null +++ b/Xcodes/Resources/ca.lproj/Localizable.strings @@ -0,0 +1,229 @@ +// Menu +"Menu.About" = "Sobre Xcodes"; +"Menu.CheckForUpdates" = "Cerca actualitzacions..."; +"Menu.Acknowledgements" = "Agraïments d'Xcodes"; +"Menu.GitHubRepo" = "Repositori de Github d'Xcodes"; +"Menu.ReportABug" = "Informa d'un error"; +"Menu.RequestNewFeature" = "Demana una nova funcionalitat"; + +// Common +"Install" = "Instal·lar"; +"InstallDescription" = "Instal·lar aquesta versió"; +"RevealInFinder" = "Obrir al Finder"; +"Active" = "Activa"; +"MakeActive" = "Fer-la activa"; +"Open" = "Obrir"; +"OpenDescription" = "Obrir aquesta versió"; +"CopyPath" = "Copiar la ruta"; +"CreateSymLink" = "Crear un Symlink com a Xcode.app"; +"Uninstall" = "Desinstal·lar"; +"Selected" = "Seleccionat"; +"Select" = "Seleccionar"; +"Cancel" = "Cancelar"; +"Next" = "Següent"; +"Continue" = "Continuar"; +"Close" = "Tancar"; +"OK" = "D'acord"; + +// Info Pane +"IdenticalBuilds" = "Builds idèntiques"; +"IdenticalBuilds.help" = "A vegades alguna versió provisional i algna versió definitiva son exactament iguals. L'Xcodes mostrarà automàticament aquestes versions conjuntament."; + +"ReleaseDate" = "Data de la versió"; +"ReleaseNotes" = "Notes de la versió"; +"ReleaseNotes.help" = "Veure les notes de la versió"; +"CopyReleaseNoteURL" = "Copiar l'URL"; +"Compatibility" = "Compatibilitat"; +"MacOSRequirement" = "És necessari macOS %@ o posterior"; +"SDKs" = "SDKs"; +"Compilers" = "Compiladors"; +"DownloadSize" = "Tamany de descàrrega"; +"NoXcodeSelected" = "Cap Xcode seleccionat"; + +// Installation Steps +// When localizing. Items will be replaced in order. ie "Step 1 of 6: Downloading" +// So if changing order, make sure the positional specficier is retained. ex: "%3$@: Step %1$d of %2$d" +"InstallationStepDescription" = "Pas %1$d de %2$d: %3$@"; +"DownloadingPercentDescription" = "Descarregant: %d%% completat"; +"StopInstallation" = "Aturar l'instal·lació"; +"DownloadingError" = "Cap informació de la descàrrega trobada"; + +// About +"VersionWithBuild" = "Versió %@ (%@)"; +"GithubRepo" = "Repositori de GitHub"; +"Acknowledgements" = "Agraïments"; +"UnxipExperiment" = "Experiment d'Unxip"; +"License" = "Llicència"; + +// General Preference Pane +"General" = "General"; +"AppleID" = "Apple ID"; +"SignIn" = "Iniciar sessió"; +"Notifications" = "Notificacions"; + +// Updates Preference Pane +"Updates" = "Actualitzacions"; +"Versions" = "Versions"; +"AutomaticInstallNewVersion" = "Instal·lar automàticament noves versions d'Xcode"; +"IncludePreRelease" = "Incloure versions provisionals/beta"; +"AppUpdates" = "Actualitzacions d'Xcodes.app"; +"CheckForAppUpdates" = "Cercar actualitzacions automàticament"; +"CheckNow" = "Revisar ara"; +"LastChecked" = "Última consulta: %@"; +"Never" = "Mai"; + +// Advanced Preference Pane +"Advanced" = "Avançat"; +"LocalCachePath" = "Ruta de la memòria cau local"; +"LocalCachePathDescription" = "L'Xcodes guarda a la memòria cau les versions d'Xcode disponibles i hi descarrega temporalment les noves versions"; +"Change" = "Canviar"; +"Active/Select" = "Activar/Seleccionar"; +"InstallDirectory" = "Directori d'instal·lació"; +"InstallPathDescription" = "L'Xcodes busca i instal·la en un sol directori. Per defecte (recomanat) utilitza la carpeta /Applications. Qualsevol canvi d'aquest directory pot provocar que altres aplicatius/serveis deixin de funcionar."; + +"OnSelectDoNothing" = "Mantenir el nom Xcode-X.X.X.app"; +"OnSelectDoNothingDescription" = "Al seleccionar aquesta opció es mantindrà el nom amb la versió, p.e. Xcode-13.4.1.app"; +"AutomaticallyCreateSymbolicLink" = "Crea automàticament un link simbòlic a Xcode.app"; +"AutomaticallyCreateSymbolicLinkDescription" = "Quan s'activa/selecciona una versió d'Xcode, prova de crear un enllaç simbòlic dins el directori d'instal·lació"; +"OnSelectRenameXcodeDescription" = "Al seleccionar aquesta opció, s'intentarà canviar el nom de la versió activa d'Xcode a Xcode.app; canviant així també el nom de l'antiga Xcode.app a el nom amb versió."; + +"DataSource" = "Font de dades"; +"DataSourceDescription" = "La font de dades d'Apple rebusca dins la pàgina web de desenvolupadors d'Apple. Això farà que sempre mostri les últimes versions disponibles, però també és una opció més inestable.\n\nXcode Releases es una llista no oficial de les versions d'Xcode. Està formada per dades ben composades, conté informació extra que no està disponible llegint les dades oficials d'Apple i és menys probable que es trenqui si Apple decideix redissenyar el seu portal de desenvolupadors."; +"Downloader" = "Descàrrega"; +"DownloaderDescription" = "aria2 utilitza fins a 16 connexions simultànies per a descarregar l'Xcode 3-5x vegades més de pressa que URLSesson. A més de l'executable, està empaquestat amb el seu codi font dins Xcodes per complir amb la llicència GPLv2.\n\nURLSession is la opció per defecte de l'API d'Apple per a fer crides URL."; +"PrivilegedHelper" = "Servei Privilegiat"; +"PrivilegedHelperDescription" = "L'Xcodes utilitza, a part, un servei que executa tasques com a root. Aquestes tasques son coses que requereixin la comanda sudo a la línia de comandes, incloent-hi les tasques al finalitzar l'instal·lació i canviar les versions d'Xcode seleccionades utilitzant xcode-select.\n\nEl sistema operatiu et demanarà la teva contrassenya per poder-lo instal·lar."; +"HelperInstalled" = "El servei està instal·lat"; +"HelperNotInstalled" = "El servei no està instal·lat"; +"InstallHelper" = "Instal·lar el servei"; + +// Experiment Preference Pane +"Experiments" = "Experiments"; +"FasterUnxip" = "Unxip més ràpid"; +"UseUnxipExperiment" = "Quan es fa l'unxip, utilitza l'experiment"; +"FasterUnxipDescription" = "Gràcies a @_saagarjha, aquest experiment pot incrementar la velocitat de l'unxip en un 70% en alguns sistemes.\n\nMés informació sobre com s'aconsegueix pot ser consultada en el seu repositori - https://github.com/saagarjha/unxip"; + +// Notifications +"AccessGranted" = "Accés garantit. Rebràs notificacions d'Xcodes."; +"AccessDenied" = "⚠️ Accés denegat ⚠️\n\nSi us plau, obre les preferències de les notificacions i selecciona Xcodes si vols garantir-li l'accés."; +"NotificationSettings" = "Preferències de notificacions"; +"EnableNotifications" = "Activar les notificacions"; + +// SignIn +"SignInWithApple" = "Inicia sessió amb el teu Apple ID."; +"AppleID" = "AppleID:"; +"Password" = "Contrassenya:"; +"Required" = "Requerida"; +"SignOut" = "Tancar sessió"; + +// SMS/2FA +"DigitCodeDescription" = "Introdueix el codi de %d dígits d'un dels teus dispositius de confiança:"; +"SendSMS" = "Enviar SMS"; +"EnterDigitCodeDescription" = "Introdueix el codi de %d dígits enviat a %@: "; +"SelectTrustedPhone" = "Selecciona un número de mòbil de confiança on rebre el codi de %d dígits a través d'SMS:"; +"NoTrustedPhones" = "El teu compte no té cap número de confiança, però se'n necessita un per a l'autenticació de dos factors.\n\nVeure https://support.apple.com/en-ca/HT204915."; + +// MainWindow +"UpdatedAt" = "Actualitzat el"; + +// ToolBar +"Login" = "Inici de sessió"; +"LoginDescription" = "Obrir l'inici de sessió"; +"Refresh" = "Actualitzar"; +"RefreshDescription" = "Actualitzar la llista d'Xcode"; +"All" = "Tot"; +"Release" = "Versió"; +"ReleaseOnly" = "Només versions oficials"; +"Beta" = "Beta"; +"BetaOnly" = "Només Beta"; +"Filter" = "Filtre"; +"FilterAvailableDescription" = "Filtrar versions disponibles"; +"FilterInstalledDescription" = "Filtrar versions instal·lades"; +"Info" = "Informació"; +"InfoDescription" = "Mostrar o ocultar el panell d'informació"; +"Preferences" = "Preferències"; +"PreferencesDescription" = "Obrir les preferències"; +"Search" = "Cercar..."; +"SearchDescription" = "Llistat de cerca"; + +// List +"ActiveVersionDescription" = "Aquesta és la versió activa"; +"MakeActiveVersionDescription" = "Fer aquesta versió activa"; + +// Alerts +// Uninstall +"Alert.Uninstall.Title" = "Desinstal·lar l'Xcode %@?"; +"Alert.Uninstall.Message" = "Es mourà a la paperera, però no es buidarà."; +"Alert.Uninstall.Error.Title" = "Incapaç de desinstal·lar l'Xcode"; + +// Cancel Install +"Alert.CancelInstall.Title" = "Estàs segur que vols aturar l'instal·lació de l'Xcode %@?"; +"Alert.CancelInstall.Message" = "Tot el progrés serà descartat."; +"Alert.CancelInstall.PrimaryButton" = "Aturar l'instal·lació"; + +// Privileged Helper +"Alert.PrivilegedHelper.Title" = "Servei privilegiat"; +"Alert.PrivilegedHelper.Message" = "L'Xcodes utilitza, a part, un servei que executa tasques com a root. Aquestes tasques son coses que requereixin la comanda sudo a la línia de comandes, incloent-hi les tasques al finalitzar l'instal·lació i canviar les versions d'Xcode seleccionades utilitzant xcode-select.\n\nEl sistema operatiu et demanarà la teva contrassenya per poder-lo instal·lar."; +"Alert.PrivilegedHelper.Error.Title" = "No ha sigut possible instal·lar el servei"; + +// Min MacOS Supported +"Alert.MinSupported.Title" = "No es compleixen els requeriments mínims"; +"Alert.MinSupported.Message" = "L'Xcode %@ necessita MacOS %@, però tu estàs utilitzant MacOS %@, vols instal·lar-lo igualment?"; + +// Install +"Alert.Install.Error.Title" = "Incapaç d'instal·lar l'Xcode"; +"Alert.InstallArchive.Error.Title" = "Incapaç d'instal·lar l'Xcode comprimit"; + +// Update +"Alert.Update.Error.Title" = "Incapaç d'actualitzar l'Xcode seleccionat"; + +// Active/Select +"Alert.Select.Error.Title" = "Incapaç de seleccionar l'Xcode"; + +// Symbolic Links +"Alert.SymLink.Title" = "Incapaç de crear un enllaç simbòlic"; +"Alert.SymLink.Message" = "L'Xcode.app existeix i no és un enllaç simbòlic"; + +// Post install +"Alert.PostInstall.Title" = "Incapaç de realitzar les tasques post instal·lació"; + +// InstallationErrors +"InstallationError.DamagedXIP" = "L'arxiu \"%@\" està malmès i no es pot expandir."; +"InstallationError.NotEnoughFreeSpaceToExpandArchive" = "L'arxiu \"%@\" no es pot expandir perquè el volum actual no té suficient espai lliure.\n\nAllibera més espai disponible per a poder expandir l'arxiu i llavors torna a instal·lar l'Xcode %@ des d'on ho havia deixat."; +"InstallationError.FailedToMoveXcodeToApplications" = "No s'ha pogut moure l'Xcode al directori %@."; +"InstallationError.FailedSecurityAssessment" = "L'Xcode %@ ha fallat l'avaluació de seguretat amb el següent missatge:\n%@\nEs manté instal·lat a %@ Si desitges continuar de totes maneres."; +"InstallationError.CodesignVerifyFailed" = "L'Xcode descarregat ha fallat en la verificació de la signatura de seguretat amb el següent missatge:\n%@"; +"InstallationError.UnexpectedCodeSigningIdentity" = "The downloaded Xcode doesn't have the expected code signing identity.\nGot:\n%@\n%@\nExpected:\n%@\n%@"; +"InstallationError.UnsupportedFileFormat" = "L'Xcodes no soporta (encara) instal·lar l'Xcode amb el format %@."; +"InstallationError.MissingSudoerPassword" = "Falta la contrassenya. Si us plau, torna-ho a intentar."; +"InstallationError.UnavailableVersion" = "No s'ha trobat la versió %@."; +"InstallationError.NoNonPrereleaseVersionAvailable" = "Cap versió que no sigui provisional disponible."; +"InstallationError.NoPrereleaseVersionAvailable" = "Cap versió provisional disponible."; +"InstallationError.MissingUsernameOrPassword" = "Falta l'usuari o la contrassenya. Si us plau, torna-ho a intentar."; +"InstallationError.VersionAlreadyInstalled" = "%@ ja està instal·lada a %@"; +"InstallationError.InvalidVersion" = "%@ no és un número de versió vàlid."; +"InstallationError.VersionNotInstalled" = "%@ no està instal·lada."; +"InstallationError.PostInstallStepsNotPerformed.Installed" = "L'instal·lació ha finalitzat, però algunes tasques post instal·lació no s'han executat de manera automàtica. S'executaran la primera vegada que obris l'Xcode %@."; +"InstallationError.PostInstallStepsNotPerformed.NotInstalled" = "L'instal·lació ha finalitzat, però algunes tasques post instal·lació no s'han executat de manera automàtica. L'Xcodes executa aquestes tasques amb el servei privilegiat, que sembla que no està instal·lat. El pots instal·lar des de les Preferències > Avançat.\n\nAquestes tasques s'executaran la primera vegada que obris l'Xcode %@."; + +// Installation Steps +"Downloading" = "Descarregant"; +"Unarchiving" = "Descomprimint (pot trigar una estona)"; +"Moving" = "Movent a %@"; +"TrashingArchive" = "Movent l'arxiu comprimit a la paperera"; +"CheckingSecurity" = "Verificació de seguretat"; +"Finishing" = "Acabant"; + +// Notifications +"Notification.NewVersionAvailable" = "Nova versió disponible"; +"Notification.FinishedInstalling" = "S'ha acabat d'instal·lar"; + + +"HelperClient.error" = "Incapaç de comunicar-se amb el servei privilegiat."; +///++ +// Notifications +"Notification.NewXcodeVersion.Title" = "Noves versions d'Xcode"; +"Notification.NewXcodeVersion.Body" = "Hi ha noves versions de l'Xcode disponibles per a descarregar."; + +// WWDC +"WWDC.Message" = "👨🏻‍💻👩🏼‍💻 Feliç WWDC %@! 👨🏽‍💻🧑🏻‍💻"; diff --git a/Xcodes/Resources/de.lproj/Localizable.strings b/Xcodes/Resources/de.lproj/Localizable.strings index e40d7cc..1a812a3 100644 --- a/Xcodes/Resources/de.lproj/Localizable.strings +++ b/Xcodes/Resources/de.lproj/Localizable.strings @@ -76,7 +76,7 @@ // Download Preference Pane "Downloads" = "Downloads"; "DataSource" = "Datenquelle"; -"DataSourceDescription" = "Die Apple-Datenquelle liest die Apple Developer-Website aus. Sie zeigt immer die neuesten Releases an, die verfügbar sind, ist allerdings etwas instabiler.\n\nXcode Releases ist eine inoffizielle Liste von Xcode-Veröffentlichungen. Sie wird als formatierte Daten bereitsgestellt, enthält Extrainformationen die nicht ohne weiteres von Apple erhältlich sind und ist mit höherer Wahrscheinlichkeit weiter verfügbar, sollte Apple seine Entwickler-Website neu gestalten."; +"DataSourceDescription" = "Die Apple-Datenquelle liest die Apple Developer-Website aus. Sie zeigt immer die neuesten Releases an, die verfügbar sind, ist allerdings etwas instabiler.\n\nXcode Releases ist eine inoffizielle Liste von Xcode-Veröffentlichungen. Sie wird als formatierte Daten bereitgestellt, enthält Extrainformationen die nicht ohne weiteres von Apple erhältlich sind und ist mit höherer Wahrscheinlichkeit weiter verfügbar, sollte Apple seine Entwickler-Website neu gestalten."; "Downloader" = "Downloader"; "DownloaderDescription" = "aria2 verwendet bis zu 16 Verbindungen, um Xcode 3-5x schneller als URLSession herunterzuladen. Es ist zusammen mit seinem Quellcode in Xcode enthalten, um seiner GPLv2-Lizenz nachzukommen.\n\nURLSession ist Apples Standard-API für URL-Requests."; @@ -87,7 +87,7 @@ "Change" = "Ändern"; "Active/Select" = "Aktiv/Auswählen"; "InstallDirectory" = "Installationsverzeichnis"; -"InstallPathDescription" = "Xcodes sucht and installiert in ein einzelnes Verzeichnis. Standard (und empfohlen beizubehalten) ist /Applications. Änderungen am Speicherort von Xcode können dazu führen, dass andere Apps/Dienste aufhören zu funktionieren. "; +"InstallPathDescription" = "Xcodes sucht and installiert in ein einzelnes Verzeichnis. Standard (und empfohlen beizubehalten) ist /Programme. Änderungen am Speicherort von Xcode können dazu führen, dass andere Apps/Dienste aufhören zu funktionieren. "; "OnSelectDoNothing" = "Name beibehalten als Xcode-X.X.X.app"; "OnSelectDoNothingDescription" = "Bei Auswahl wird der Name mit Version beibehalten, z. B. Xcode-13.4.1.app"; @@ -124,7 +124,7 @@ // SMS/2FA "DigitCodeDescription" = "Gib den %d-stelligen Code von einem Deiner Vertrauensgeräte ein:"; "SendSMS" = "SMS senden"; -"EnterDigitCodeDescription" = "Gib den %d-stelligen Code ein der an '%@' gesendet wurde."; +"EnterDigitCodeDescription" = "Gib den %1$d-stelligen Code ein der an '%2$@' gesendet wurde."; "SelectTrustedPhone" = "Wähle eine vertrauenswürdige Telefonnummer aus, um einen %d-stelligen Code via SMS zum empfangen:"; "NoTrustedPhones" = "Dein Account verfügt über keine vertrauenswürdigen Telefonnummern, diese sind aber für Zwei-Faktor-Authentifizierung erforderlich.\n\nInformationen dazu unter https://support.apple.com/HT204915."; @@ -163,7 +163,7 @@ "Alert.Uninstall.Error.Message.FileNotFound" = "Datei \"%@\" konnte nicht gefunden werden."; // Cancel Install -"Alert.CancelInstall.Title" = "Bist du sicher, dass Du die installation von Xcode %@ anhalten möchtest?"; +"Alert.CancelInstall.Title" = "Bist du sicher, dass Du die Installation von Xcode %@ anhalten möchtest?"; "Alert.CancelInstall.Message" = "Jeglicher Fortschritt wird verworfen."; "Alert.CancelInstall.PrimaryButton" = "Installation anhalten"; @@ -173,8 +173,8 @@ "Alert.PrivilegedHelper.Error.Title" = "Installation des Helfers nicht möglich"; // Min MacOS Supported -"Alert.MinSupported.Title" = "Minimalanforderungen nicht erfülltt"; -"Alert.MinSupported.Message" = "Xcode %@ erfordert MacOS %@ aber es läuft nur MacOS %@. Möchtest Du es trotzdem installieren?"; +"Alert.MinSupported.Title" = "Minimalanforderungen nicht erfüllt"; +"Alert.MinSupported.Message" = "Xcode %@ erfordert macOS %@ aber es läuft nur macOS %@. Möchtest Du es trotzdem installieren?"; // Install "Alert.Install.Error.Title" = "Installation von Xcode nicht möglich"; @@ -225,7 +225,7 @@ "Notification.FinishedInstalling" = "Installation beendet"; -"HelperClient.error" = "Unable to communicate with privileged helper."; +"HelperClient.error" = "Kommunikation mit privilegiertem Helfer nicht möglich."; ///++ // Notifications "Notification.NewXcodeVersion.Title" = "Neue Xcode-Versionen"; diff --git a/Xcodes/Resources/en.lproj/Localizable.strings b/Xcodes/Resources/en.lproj/Localizable.strings index 2ae234e..66b4ace 100644 --- a/Xcodes/Resources/en.lproj/Localizable.strings +++ b/Xcodes/Resources/en.lproj/Localizable.strings @@ -128,7 +128,7 @@ // SMS/2FA "DigitCodeDescription" = "Enter the %d digit code from one of your trusted devices:"; "SendSMS" = "Send SMS"; -"EnterDigitCodeDescription" = "Enter the %d digit code sent to %@: "; +"EnterDigitCodeDescription" = "Enter the %1$d digit code sent to %2$@: "; "SelectTrustedPhone" = "Select a trusted phone number to receive a %d digit code via SMS:"; "NoTrustedPhones" = "Your account doesn't have any trusted phone numbers, but they're required for two-factor authentication.\n\nSee https://support.apple.com/HT204915."; diff --git a/Xcodes/Resources/es.lproj/Localizable.strings b/Xcodes/Resources/es.lproj/Localizable.strings index a910bc7..0cce216 100644 --- a/Xcodes/Resources/es.lproj/Localizable.strings +++ b/Xcodes/Resources/es.lproj/Localizable.strings @@ -120,7 +120,7 @@ // SMS/2FA "DigitCodeDescription" = "Ingrese el código de %d dígitos de uno de sus dispositivos de confianza:"; "SendSMS" = "Enviar SMS"; -"EnterDigitCodeDescription" = "Ingrese el código de dígito %d enviado a %@: "; +"EnterDigitCodeDescription" = "Ingrese el código de dígito %1$d enviado a %2$@: "; "SelectTrustedPhone" = "Selecciona un número de teléfono de confianza para recibir un código de %d dígitos por SMS:"; "NoTrustedPhones" = "Su cuenta no tiene números de teléfono de confianza, pero son necesarios para la autenticación de dos factores.\n\nVer https://support.apple.com/HT204915."; diff --git a/Xcodes/Resources/fi.lproj/Localizable.strings b/Xcodes/Resources/fi.lproj/Localizable.strings index 905a1e0..b7fd612 100644 --- a/Xcodes/Resources/fi.lproj/Localizable.strings +++ b/Xcodes/Resources/fi.lproj/Localizable.strings @@ -115,7 +115,7 @@ // SMS/2FA "DigitCodeDescription" = "Anna %d numeroinen koodi jostakin luotetusta laitteesta:"; "SendSMS" = "Lähetä tekstiviesti"; -"EnterDigitCodeDescription" = "Anna %d numeroinen koodi, joka lähetettiin osoitteeseen %@: "; +"EnterDigitCodeDescription" = "Anna %1$d numeroinen koodi, joka lähetettiin osoitteeseen %2$@: "; "SelectTrustedPhone" = "Valitse luotettu puhelinnumero saadaksesi %d numeroisen koodin tekstiviestinä:"; "NoTrustedPhones" = "Tililläsi ei ole luotettuja puhelinnumeroita, mutta ne vaaditaan kaksivaiheiseen todentamiseen.\n\nKatso https://support.apple.com/HT204915."; diff --git a/Xcodes/Resources/fr.lproj/Localizable.strings b/Xcodes/Resources/fr.lproj/Localizable.strings index 0e619ef..254d933 100644 --- a/Xcodes/Resources/fr.lproj/Localizable.strings +++ b/Xcodes/Resources/fr.lproj/Localizable.strings @@ -120,7 +120,7 @@ // SMS/2FA "DigitCodeDescription" = "Saisissez le code à %d chiffres de l'un de vos appareils de confiance :"; "SendSMS" = "Envoyer un SMS"; -"EnterDigitCodeDescription" = "Entrez le code à %d chiffres envoyé à %@ : "; +"EnterDigitCodeDescription" = "Entrez le code à %1$d chiffres envoyé à %2$@ : "; "SelectTrustedPhone" = "Sélectionnez le numéro de téléphone de confiance pour recevoir un code à %d chiffres par SMS :"; "NoTrustedPhones" = "Votre compte n'a aucun numéro de téléphone de confiance, mais ils sont requis pour l'authentification à deux facteurs.\n\nVoir https://support.apple.com/HT204915."; diff --git a/Xcodes/Resources/hi.lproj/Localizable.strings b/Xcodes/Resources/hi.lproj/Localizable.strings index 22a672d..8a0e682 100644 --- a/Xcodes/Resources/hi.lproj/Localizable.strings +++ b/Xcodes/Resources/hi.lproj/Localizable.strings @@ -115,7 +115,7 @@ // SMS/2FA "DigitCodeDescription" = "अपने किसी विश्वसनीय डिवाइस से %d अंक कोड दर्ज करें:"; "SendSMS" = "SMS भेजें"; -"EnterDigitCodeDescription" = "%@ को भेजा गया %d अंक कोड दर्ज करें: "; +"EnterDigitCodeDescription" = "%2$@ को भेजा गया %1$d अंक कोड दर्ज करें: "; "SelectTrustedPhone" = "SMS के द्वारा %d अंक कोड प्राप्त करने के लिए विश्वसनीय फ़ोन नंबर चुनें:"; "NoTrustedPhones" = "आपके खाते में कोई विश्वसनीय फ़ोन नंबर नहीं है, लेकिन वे दो-कारक प्रमाणीकरण के लिए आवश्यक हैं।\n\nhttps://support.apple.com/HT204915 देखें।"; diff --git a/Xcodes/Resources/ja.lproj/Localizable.strings b/Xcodes/Resources/ja.lproj/Localizable.strings index 90aa86f..2be065e 100644 --- a/Xcodes/Resources/ja.lproj/Localizable.strings +++ b/Xcodes/Resources/ja.lproj/Localizable.strings @@ -127,7 +127,7 @@ // SMS/2FA "DigitCodeDescription" = "信頼できるデバイスから、%d桁のコードを入力してください。"; "SendSMS" = "SMS を送信"; -"EnterDigitCodeDescription" = "%d桁のコードを%@に送信したので入力してください。"; +"EnterDigitCodeDescription" = "%1$d桁のコードを%2$@に送信したので入力してください。"; "SelectTrustedPhone" = "信頼できる電話番号を選択し、%d桁のコードをSMSで受信します。"; "NoTrustedPhones" = "このアカウントに2要素認証に利用する、信頼できる電話番号がありません。\n\n詳しくはこちらをご確認ください。https://support.apple.com/HT204915"; diff --git a/Xcodes/Resources/ko.lproj/Localizable.strings b/Xcodes/Resources/ko.lproj/Localizable.strings index 24e0b6d..7f5653e 100644 --- a/Xcodes/Resources/ko.lproj/Localizable.strings +++ b/Xcodes/Resources/ko.lproj/Localizable.strings @@ -116,7 +116,7 @@ // SMS/2FA "DigitCodeDescription" = "신뢰할 수 있는 장치 중 하나에서 %d 자리 코드를 입력하세요."; "SendSMS" = "SMS 보내기"; -"EnterDigitCodeDescription" = "%@(으)로 전송된 %d 자리 코드를 입력하세요."; +"EnterDigitCodeDescription" = "%2$@(으)로 전송된 %1$d 자리 코드를 입력하세요."; "SelectTrustedPhone" = "SMS를 통해 %d 자리 코드를 수신하려면 신뢰할 수 있는 전화번호를 선택하세요."; "NoTrustedPhones" = "계정에 신뢰할 수 있는 전화번호가 없지만 이중 인증(2FA)에 필요합니다.\n\nhttps://support.apple.com/HT204915를 참조하세요."; diff --git a/Xcodes/Resources/nl.lproj/Localizable.strings b/Xcodes/Resources/nl.lproj/Localizable.strings index 2b52b12..e1fe455 100644 --- a/Xcodes/Resources/nl.lproj/Localizable.strings +++ b/Xcodes/Resources/nl.lproj/Localizable.strings @@ -120,7 +120,7 @@ // SMS/2FA "DigitCodeDescription" = "Voer de %d code in van een van je vertrouwde apparaten:"; "SendSMS" = "Verstuur SMS"; -"EnterDigitCodeDescription" = "Voer de %d code in die is verstuurd naar %@: "; +"EnterDigitCodeDescription" = "Voer de %1$d code in die is verstuurd naar %2$@: "; "SelectTrustedPhone" = "Selecteer een vertrouwd telefoonnumer on een %d code te ontvangen via SMS:"; "NoTrustedPhones" = "Je account heeft geen vertrouwde telefoonnummers, dit is nodig voor two-factor authenticatie.\n\nZie https://support.apple.com/HT204915."; diff --git a/Xcodes/Resources/pl.lproj/Localizable.strings b/Xcodes/Resources/pl.lproj/Localizable.strings new file mode 100644 index 0000000..f1a968e --- /dev/null +++ b/Xcodes/Resources/pl.lproj/Localizable.strings @@ -0,0 +1,239 @@ +// Menu +"Menu.About" = "O Xcodes"; +"Menu.CheckForUpdates" = "Sprawdź aktualizacje..."; +"Menu.Acknowledgements" = "Podziękowania Xcodes"; +"Menu.GitHubRepo" = "Repozytorium Xcodes na GitHubie"; +"Menu.ReportABug" = "Zgłoś błąd"; +"Menu.RequestNewFeature" = "Poproś o nową funkcję"; + +// Common +"Install" = "Zainstaluj"; +"InstallDescription" = "Zainstaluj tę wersję"; +"RevealInFinder" = "Pokaż w Finderze"; +"Active" = "Aktywny"; +"MakeActive" = "Ustaw jako aktywny"; +"Open" = "Otwórz"; +"OpenDescription" = "Otwórz tę wersję"; +"CopyPath" = "Kopiuj ścieżkę"; +"CreateSymLink" = "Utwórz Symlink jako Xcode.app"; +"CreateSymLinkBeta" = "Utwórz Symlink jako Xcode-Beta.app"; +"Uninstall" = "Odinstaluj"; +"Selected" = "Wybrany"; +"Select" = "Wybierz"; +"Cancel" = "Anuluj"; +"Next" = "Dalej"; +"Continue" = "Kontynuuj"; +"Close" = "Zamknij"; +"OK" = "OK"; + +// Info Pane +"IdenticalBuilds" = "Takie same wersje"; +"IdenticalBuilds.help" = "Czasami wersja przedpremierowa i wydana są dokładnie takie same. Xcodes automatycznie wyświetla te wersje razem."; + +"ReleaseDate" = "Data wydania"; +"ReleaseNotes" = "Notatki wydania"; +"ReleaseNotes.help" = "Wyświetl notatki wydania"; +"CopyReleaseNoteURL" = "Kopiuj adres URL"; +"Compatibility" = "Kompatybilność"; +"MacOSRequirement" = "Wymaga systemu macOS %@ lub nowszego"; +"SDKs" = "SDK"; +"Compilers" = "Kompilatory"; +"DownloadSize" = "Wielkość pobierania"; +"NoXcodeSelected" = "Nie wybrano Xcode"; + +// Installation Steps +// When localizing. Items will be replaced in order. ie "Step 1 of 6: Downloading" +// So if changing order, make sure the positional specficier is retained. ex: "%3$@: Step %1$d of %2$d" +"InstallationStepDescription" = "Krok %1$d z %2$d: %3$@"; +"DownloadingPercentDescription" = "Pobieranie: %d%% ukończone"; +"StopInstallation" = "Przerwij instalację"; +"DownloadingError" = "Nie znaleziono informacji o pobieraniu"; + +// About +"VersionWithBuild" = "Wersja %@ (%@)"; +"GithubRepo" = "Repozytorium GitHub"; +"Acknowledgements" = "Podziękowania"; +"UnxipExperiment" = "Eksperyment Unxip"; +"License" = "Licencja"; + +// General Preference Pane +"General" = "Ogólne"; +"AppleID" = "Apple ID"; +"SignIn" = "Zaloguj się"; +"Notifications" = "Powiadomienia"; + +// Updates Preference Pane +"Updates" = "Aktualizacje"; +"Versions" = "Wersje"; +"AutomaticInstallNewVersion" = "Automatycznie instaluj nowe wersje Xcode"; +"IncludePreRelease" = "Dołącz wersje beta/wstępne"; +"AppUpdates" = "Aktualizacje Xcodes.app"; +"CheckForAppUpdates" = "Automatycznie sprawdzaj aktualizacje aplikacji"; +"CheckNow" = "Sprawdź teraz"; +"LastChecked" = "Ostatnio sprawdzono: %@"; +"Never" = "Nigdy"; + +// Download Preference Pane +"Downloads" = "Pobieranie"; +"DataSource" = "Źródło danych"; +"DataSourceDescription" = "Źródło danych Apple przeszukuje stronę internetową Apple Developer. Zawsze wyświetla najnowsze dostępne wydania, ale jest bardziej podatne na problemy.\n\nXcode Releases to nieoficjalna lista wydań Xcode. Udostępnia ona dobrze sformatowane dane, zawiera dodatkowe informacje, które nie są łatwo dostępne w Apple, i jest mniej podatna na problemy, gdy Apple zmienia swoją stronę dla deweloperów."; +"Downloader" = "Pobieranie"; +"DownloaderDescription" = "aria2 używa do pobierania do 16 połączeń, co pozwala na pobieranie Xcode 3-5x szybciej niż URLSession. Jest on dostarczany jako plik wykonywalny wraz ze swoim kodem źródłowym w ramach Xcodes w celu przestrzegania jego licencji GPLv2.\n\nURLSession to domyślne API Apple do tworzenia żądań URL."; + +// Advanced Preference Pane +"Advanced" = "Zaawansowane"; +"LocalCachePath" = "Katalog cache"; +"LocalCachePathDescription" = "Xcodes przechowuje w cache dostępne wersje Xcode oraz tymczasowo pobiera nowe pliki do tego katalogu."; +"Change" = "Zmień"; +"Active/Select" = "Aktywny/wybrany"; +"InstallDirectory" = "Katalog instalacji"; +"InstallPathDescription" = "Xcodes wyszukuje i instaluje w jednym katalogu. Domyślnie (i zalecane) jest to /Applications. Wszelkie zmiany w miejscu przechowywania Xcode mogą spowodować, że inne aplikacje/usługi przestaną działać."; + +"OnSelectDoNothing" = "Zachowaj nazwę jako Xcode-X.X.X.app"; +"OnSelectDoNothingDescription" = "Po wybraniu, nazwa pozostanie w formacie z numerem wersji, np. Xcode-13.4.1.app"; +"AutomaticallyCreateSymbolicLink" = "Automatycznie twórz symboliczne połączenie do Xcode.app"; +"AutomaticallyCreateSymbolicLinkDescription" = "Przy ustawianiu Xcode jako aktywny/wybrany, próbuj automatycznie stworzyć symboliczne połączenie o nazwie Xcode.app w katalogu instalacji."; +"OnSelectRenameXcode" = "Zawsze zmieniaj nazwę na Xcode.app"; +"OnSelectRenameXcodeDescription" = "Po wybraniu, automatycznie zmienia aktywną wersję Xcode na Xcode.app, a poprzednie Xcode.app zostanie zmienione na nazwę wersji."; + +"PrivilegedHelper" = "Helper z uprawnieniami"; +"PrivilegedHelperDescription" = "Xcodes używa oddzielnego helpera z uprawnieniami do wykonywania zadań jako root. Są to rzeczy, które wymagałyby użycia komendy sudo w wierszu poleceń, w tym kroki po instalacji oraz przełączanie wersji Xcode za pomocą xcode-select.\n\nZostaniesz poproszony o podanie hasła do swojego konta macOS, aby go zainstalować."; +"HelperInstalled" = "Helper jest zainstalowany"; +"HelperNotInstalled" = "Helper nie jest zainstalowany"; +"InstallHelper" = "Zainstaluj helpera"; + +"ShowOpenInRosetta" = "Pokaż opcję Otwórz w Rosetta"; +"ShowOpenInRosettaDescription" = "Opcja Otwórz w Rosetta będzie wyświetlana, gdy dostępne są inne funkcje \"Otwórz\". Uwaga: Będzie to działać tylko na urządzeniach z Apple Silicon."; + +// Experiment Preference Pane +"Experiments" = "Eksperymenty"; +"FasterUnxip" = "Szybsze Unxip"; +"UseUnxipExperiment" = "Podczas rozpakowywania, użyj wersji eksperymentalnej"; +"FasterUnxipDescription" = "Dzięki @_saagarjha, wersja eksperymentalna może zwiększyć prędkość rozpakowywania o nawet 70% dla niektórych systemów.\n\nWięcej informacji na temat tego, jak to jest osiągane, można znaleźć w repozytorium unxip - https://github.com/saagarjha/unxip"; + +// Notifications +"AccessGranted" = "Dostęp przyznany. Będziesz otrzymywać powiadomienia z Xcodes."; +"AccessDenied" = "⚠️ Dostęp zabroniony ⚠️\n\nOtwórz ustawienia powiadomień i wybierz Xcodes, jeśli chcesz zezwolić na dostęp."; +"NotificationSettings" = "Ustawienia powiadomień"; +"EnableNotifications" = "Włącz powiadomienia"; + +// SignIn +"SignInWithApple" = "Zaloguj się przy użyciu Apple ID."; +"AppleID" = "AppleID:"; +"Password" = "Hasło:"; +"Required" = "Wymagane"; +"SignOut" = "Wyloguj się"; + +// SMS/2FA +"DigitCodeDescription" = "Wprowadź %d-cyfrowy kod z jednego ze swoich zaufanych urządzeń:"; +"SendSMS" = "Wyślij SMS"; +"EnterDigitCodeDescription" = "Wprowadź %1$d-cyfrowy kod wysłany do %2$@: "; +"SelectTrustedPhone" = "Wybierz zaufany numer telefonu, aby otrzymać %d-cyfrowy kod przez SMS:"; +"NoTrustedPhones" = "Twoje konto nie ma żadnych zaufanych numerów telefonów, ale są one wymagane do autoryzacji dwuskładnikowej.\n\nZobacz https://support.apple.com/HT204915."; + +// MainWindow +"UpdatedAt" = "Zaktualizowano o"; + +// ToolBar +"Login" = "Zaloguj się"; +"LoginDescription" = "Otwórz okno logowania"; +"Refresh" = "Odśwież"; +"RefreshDescription" = "Odśwież listę Xcode"; +"All" = "Wszystkie"; +"Release" = "Stabilne"; +"ReleaseOnly" = "Tylko stabilne"; +"Beta" = "Beta"; +"BetaOnly" = "Tylko beta"; +"Filter" = "Filtr"; +"FilterAvailableDescription" = "Filtruj dostępne wersje"; +"FilterInstalledDescription" = "Filtruj zainstalowane wersje"; +"Info" = "Informacje"; +"InfoDescription" = "Pokaż lub ukryj okno informacji"; +"Preferences" = "Ustawienia"; +"PreferencesDescription" = "Otwórz ustawienia"; +"Search" = "Szukaj..."; +"SearchDescription" = "Przeszukaj listę"; + +// List +"ActiveVersionDescription" = "To jest aktywna wersja"; +"MakeActiveVersionDescription" = "Ustaw jako aktywną wersję"; + +// Alerts +// Uninstall +"Alert.Uninstall.Title" = "Odinstalować Xcode %@?"; +"Alert.Uninstall.Message" = "Zostanie przeniesiony do kosza, ale nie zostanie opróżniony."; +"Alert.Uninstall.Error.Title" = "Nie można odinstalować Xcode"; +"Alert.Uninstall.Error.Message.FileNotFound" = "Nie znaleziono pliku \"%@\"."; + +// Cancel Install +"Alert.CancelInstall.Title" = "Czy na pewno chcesz przerwać instalację Xcode %@?"; +"Alert.CancelInstall.Message" = "Postęp zostanie utracony."; +"Alert.CancelInstall.PrimaryButton" = "Przerwij instalację"; + +// Privileged Helper +"Alert.PrivilegedHelper.Title" = "Helper z uprawnieniami"; +"Alert.PrivilegedHelper.Message" = "Xcodes używa oddzielnego helpera z uprawnieniami, aby wykonywać zadania jako root. Są to rzeczy, które wymagałyby sudo w wierszu poleceń, w tym kroki po instalacji i przełączanie wersji Xcode z xcode-select.\n\nBędziesz proszony o podanie hasła do konta macOS, aby go zainstalować."; +"Alert.PrivilegedHelper.Error.Title" = "Nie można zainstalować helpera"; + +// Min MacOS Supported +"Alert.MinSupported.Title" = "Niezgodność z minimalnymi wymaganiami"; +"Alert.MinSupported.Message" = "Xcode %@ wymaga macOS %@, a ty masz macOS %@. Czy nadal chcesz go zainstalować?"; + +// Install +"Alert.Install.Error.Title" = "Nie można zainstalować Xcode"; +"Alert.InstallArchive.Error.Title" = "Nie można zainstalować zarchiwizowanego Xcode"; + +// Update +"Alert.Update.Error.Title" = "Nie można zaktualizować wybranej wersji Xcode"; + +// Active/Select +"Alert.Select.Error.Title" = "Nie można wybrać Xcode"; + +// Symbolic Links +"Alert.SymLink.Title" = "Nie można utworzyć linku symbolicznego"; +"Alert.SymLink.Message" = "Xcode.app istnieje i nie jest linkiem symbolicznym"; + +// Post install +"Alert.PostInstall.Title" = "Nie można wykonać czynności po-instalacyjnych"; + +// InstallationErrors +"InstallationError.DamagedXIP" = "Archiwum \"%@\" jest uszkodzone i nie może zostać rozpakowane."; +"InstallationError.NotEnoughFreeSpaceToExpandArchive" = "Nie można rozpakować archiwum \"%@\", ponieważ wolumin nie ma wystarczającej ilości wolnego miejsca.\n\nZrób więcej miejsca, aby rozpakować archiwum, a następnie zainstaluj ponownie Xcode %@, aby kontynuować instalację od miejsca, w którym została wstrzymana."; +"InstallationError.FailedToMoveXcodeToApplications" = "Nie udało się przenieść Xcode do katalogu %@."; +"InstallationError.FailedSecurityAssessment" = "Xcode %@ nie przeszedł testu bezpieczeństwa z następującym wynikiem:\n%@\nPozostaje zainstalowany w %@, jeśli mimo to chcesz go używać."; +"InstallationError.CodesignVerifyFailed" = "Pobrany Xcode nie przeszedł weryfikacji sygnatury kodu z wynikiem:\n%@"; +"InstallationError.UnexpectedCodeSigningIdentity" = "Pobrany Xcode nie ma oczekiwanej sygnatury kodu.\nOtrzymano:\n%@\n%@\nOczekiwano:\n%@\n%@"; +"InstallationError.UnsupportedFileFormat" = "Xcodes nie obsługuje (jeszcze) instalowania Xcode z formatu %@."; + +"InstallationError.MissingSudoerPassword" = "Brak hasła. Spróbuj ponownie."; +"InstallationError.UnavailableVersion" = "Nie można znaleźć wersji %@."; +"InstallationError.NoNonPrereleaseVersionAvailable" = "Brak wersji nie-przedpremierowych."; +"InstallationError.NoPrereleaseVersionAvailable" = "Brak wersji przedpremierowych."; +"InstallationError.MissingUsernameOrPassword" = "Brak nazwy użytkownika lub hasła. Spróbuj ponownie."; +"InstallationError.VersionAlreadyInstalled" = "%@ jest już zainstalowany w %@."; +"InstallationError.InvalidVersion" = "%@ nie jest prawidłowym numerem wersji."; +"InstallationError.VersionNotInstalled" = "%@ nie jest zainstalowany."; +"InstallationError.PostInstallStepsNotPerformed.Installed" = "Instalacja została zakończona, ale niektóre kroki po instalacji nie zostały wykonane automatycznie. Zostaną one wykonane przy pierwszym uruchomieniu Xcode %@."; +"InstallationError.PostInstallStepsNotPerformed.NotInstalled" = "Instalacja została zakończona, ale niektóre kroki po instalacji nie zostały wykonane automatycznie. Xcodes wykonuje te kroki z pomocą helpera z uprawnieniami, który nie jest zainstalowany. Możesz go zainstalować w Ustawienia > Zaawansowane.\n\nTe kroki zostaną wykonane przy pierwszym uruchomieniu Xcode %@."; + +// Installation Steps +"Downloading" = "Pobieranie"; +"Unarchiving" = "Rozpakowywanie (To może chwilę potrwać)"; +"Moving" = "Przenoszenie do %@"; +"TrashingArchive" = "Przenoszenie archiwum do kosza"; +"CheckingSecurity" = "Weryfikacja zabezpieczeń"; +"Finishing" = "Kończenie"; + +// Notifications +"Notification.NewVersionAvailable" = "Dostępna jest nowa wersja"; +"Notification.FinishedInstalling" = "Zakończono instalację"; + + +"HelperClient.error" = "Nie można komunikować się z helperem z uprawnieniami."; +///++ +// Notifications +"Notification.NewXcodeVersion.Title" = "Nowe wersje Xcode"; +"Notification.NewXcodeVersion.Body" = "Dostępne są nowe wersje Xcode do pobrania."; + +// WWDC +"WWDC.Message" = "👨🏻‍💻👩🏼‍💻 Wesołego WWDC %@! 👨🏽‍💻🧑🏻‍💻"; diff --git a/Xcodes/Resources/pt-BR.lproj/Localizable.strings b/Xcodes/Resources/pt-BR.lproj/Localizable.strings index 68e69cf..605b2af 100644 --- a/Xcodes/Resources/pt-BR.lproj/Localizable.strings +++ b/Xcodes/Resources/pt-BR.lproj/Localizable.strings @@ -81,7 +81,7 @@ "AutomaticallyCreateSymbolicLink" = "Criar link simbólico para o Xcode.app automaticamente"; "AutomaticallyCreateSymbolicLinkDescription" = "Quando ativar/selecionar uma versão do Xcode, tentar criar um link simbólico chamado Xcode.app no diretório de instalação"; "DataSource" = "Fonte de dados"; -"DataSourceDescription" = "A fonte de dados da Apple copia o site Apple Developer. Sempre mostrará os lançamentos mais recentes que estão disponíveis, porém é mais frágil.\n\nLançamentos do Xcode é uma lista de lançamentos do Xcode não-oficial. É provido como dado formatado, contem informação extra que não está prontamente disponível pela Apple, e é menos provável que quebre se a Apple redesenhar o seu site de desenvolvedores."; +"DataSourceDescription" = "A fonte de dados da Apple copia o site Apple Developer. Sempre mostrará os lançamentos mais recentes que estão disponíveis, porém é mais frágil.\n\nLançamentos do Xcode (Xcode Releases) é uma lista de lançamentos do Xcode não-oficial. É provido como dado formatado, contem informação extra que não está prontamente disponível pela Apple, e é menos provável que quebre se a Apple redesenhar o seu site de desenvolvedores."; "Downloader" = "Baixador"; "DownloaderDescription" = "aria2 usa até 16 conexões para baixar o Xcode 3-5x mais rápido que URLSession. Está empacotado como um executável junto com o seu código fonte dentro do Xcodes para conformar com a licensa GPLv2.\n\nURLSession é a API padrão da Apple para performar requisições URL."; "PrivilegedHelper" = "Ajudante privilegiado"; @@ -89,6 +89,11 @@ "HelperInstalled" = "Ajudante está instalado"; "HelperNotInstalled" = "Ajudante não está instalado"; "InstallHelper" = "Instalar ajudante"; +"OnSelectDoNothing" = "Manter nome como Xcode-X.X.X.app"; +"OnSelectRenameXcode" = "Sempre renomear para Xcode.app"; +"OnSelectRenameXcodeDescription" = "Ao selecionar, tentar renomear o Xcode ativo para Xcode.app, renomeando o Xcode.app anterior para um nome com a versão."; +"ShowOpenInRosetta" = "Mostrar opçao abrir com Rosetta"; +"ShowOpenInRosettaDescription" = "Opção de abrir com o Rosetta será mostrar onde outras opções \"Abrir\" estão disponíveis. Nota: Isso só será mostrado pra máquinas Apple Silicon."; // Experiment Preference Pane "Experiments" = "Experiments"; @@ -112,7 +117,7 @@ // SMS/2FA "DigitCodeDescription" = "Insira o código de %d dígitos de um de seus dispositivos confiáveis:"; "SendSMS" = "Enviar SMS"; -"EnterDigitCodeDescription" = "Insira o código de %d dígitos enviado para %@: "; +"EnterDigitCodeDescription" = "Insira o código de %1$d dígitos enviado para %2$@: "; "SelectTrustedPhone" = "Selecione um número de telefone confiável para receber um código de %d dígitos via SMS:"; "NoTrustedPhones" = "Sua conta não possui nenhum telefone confiável, mas é necessário para autenticação de dois fatores.\n\nVer https://support.apple.com/en-ca/HT204915."; diff --git a/Xcodes/Resources/ru.lproj/Localizable.strings b/Xcodes/Resources/ru.lproj/Localizable.strings index e785967..4569fea 100644 --- a/Xcodes/Resources/ru.lproj/Localizable.strings +++ b/Xcodes/Resources/ru.lproj/Localizable.strings @@ -124,7 +124,7 @@ // SMS/2FA "DigitCodeDescription" = "Введите %d цифровой код с одного из ваших доверенных устройств:"; "SendSMS" = "Отправить SMS"; -"EnterDigitCodeDescription" = "Введите %d цифровой код, отправленный на %@: "; +"EnterDigitCodeDescription" = "Введите %1$d цифровой код, отправленный на %2$@: "; "SelectTrustedPhone" = "Выберите доверенный номер телефона для получения %d цифрового кода по SMS:"; "NoTrustedPhones" = "В вашем аккаунтe нет доверенных телефонных номеров, но они необходимы для двухфакторной аутентификации.\n\nСм. https://support.apple.com/HT204915."; diff --git a/Xcodes/Resources/tr.lproj/Localizable.strings b/Xcodes/Resources/tr.lproj/Localizable.strings index 1cbb514..7b1421b 100644 --- a/Xcodes/Resources/tr.lproj/Localizable.strings +++ b/Xcodes/Resources/tr.lproj/Localizable.strings @@ -127,7 +127,7 @@ // SMS/2FA "DigitCodeDescription" = "Güvenilir cihazından aldığın %d rakamlı kodu gir:"; "SendSMS" = "SMS Gönder"; -"EnterDigitCodeDescription" = "%@ kaynağından gönderilen %d rakamlı kodu gir: "; +"EnterDigitCodeDescription" = "%2$@ kaynağından gönderilen %1$d rakamlı kodu gir: "; "SelectTrustedPhone" = "%d rakamlı kodu SMS olarak almak için güvenilir telefon numarasını seç:"; "NoTrustedPhones" = "Hesabına tanımlı güvenli bir telefon numarası yok, fakat iki aşamalı doğrulama için gerekmektedir.\n\nDaha fazlası için https://support.apple.com/HT204915 adresine bakın."; diff --git a/Xcodes/Resources/uk.lproj/Localizable.strings b/Xcodes/Resources/uk.lproj/Localizable.strings index 8dd8df7..752586a 100644 --- a/Xcodes/Resources/uk.lproj/Localizable.strings +++ b/Xcodes/Resources/uk.lproj/Localizable.strings @@ -115,7 +115,7 @@ // SMS/2FA "DigitCodeDescription" = "Введіть %d-значний код з одного з довірених пристроїв:"; "SendSMS" = "Надіслати СМС"; -"EnterDigitCodeDescription" = "Введіть %d-значний код відправлений на %@:"; +"EnterDigitCodeDescription" = "Введіть %1$d-значний код відправлений на %2$@:"; "SelectTrustedPhone" = "Виберіть довірений номер телефону щоб отримати %d-значний код в СМС:"; "NoTrustedPhones" = "Ваш аккаунт не має перевіреного телефонного номеру, що вимагається для двофакторної авторизації.\n\nДивіться https://support.apple.com/HT204915."; diff --git a/Xcodes/Resources/unxip b/Xcodes/Resources/unxip index 022d50d..46a7f31 100755 Binary files a/Xcodes/Resources/unxip and b/Xcodes/Resources/unxip differ diff --git a/Xcodes/Resources/zh-Hans.lproj/Localizable.strings b/Xcodes/Resources/zh-Hans.lproj/Localizable.strings index c18bb9d..9b0fa82 100644 --- a/Xcodes/Resources/zh-Hans.lproj/Localizable.strings +++ b/Xcodes/Resources/zh-Hans.lproj/Localizable.strings @@ -90,7 +90,7 @@ "InstallPathDescription" = "Xcodes会在一个目录中检索及安装。默认(推荐)保持/Applications。任何对Xcode存储位置的变更都可能会导致其他App或服务停止工作。"; "OnSelectDoNothing" = "保持名称为Xcode-X.X.X.app"; -"OnSelectDoNothingDescription" = "选中时,将会将会保持各版本的名称。例如Xcode-13.4.1.app。"; +"OnSelectDoNothingDescription" = "选中时,将会保持各版本的名称。例如Xcode-13.4.1.app。"; "AutomaticallyCreateSymbolicLink" = "自动创建名为Xcode.app的软连接"; "AutomaticallyCreateSymbolicLinkDescription" = "当激活/选定某个Xcode版本时,尝试在安装目录创建一个名为Xcode.app的软链接。"; "OnSelectRenameXcode" = "总是重命名为Xcode.app"; @@ -102,6 +102,9 @@ "HelperNotInstalled" = "帮助程序未安装"; "InstallHelper" = "安装帮助程序"; +"ShowOpenInRosetta" = "显示“在Rosetta中打开”选项"; +"ShowOpenInRosettaDescription" = "“在Rosetta中打开”将会在有其他“打开”方式可用时显示。注:此选项只会在Apple Silicon设备上显示。"; + // Experiment Preference Pane "Experiments" = "实验性功能"; "FasterUnxip" = "更快的xip解压"; @@ -124,7 +127,7 @@ // SMS/2FA "DigitCodeDescription" = "请输入从信任的设备接收到的%d位代码:"; "SendSMS" = "发送短信"; -"EnterDigitCodeDescription" = "请输入%d位代码,已发送到%@:"; +"EnterDigitCodeDescription" = "请输入%1$d位代码,已发送到%2$@:"; "SelectTrustedPhone" = "请选择一个信任的手机号来从短信接收%d位代码:"; "NoTrustedPhones" = "您的账户没有任何信任的手机号,但这是两步验证所必须的。\n\n请参阅 https://support.apple.com/HT204915。"; @@ -160,6 +163,7 @@ "Alert.Uninstall.Title" = "要卸载Xcode %@吗?"; "Alert.Uninstall.Message" = "它会被移动到废纸篓,但废纸篓不会清空。"; "Alert.Uninstall.Error.Title" = "无法卸载Xcode"; +"Alert.Uninstall.Error.Message.FileNotFound" = "无法找到文件\"%@\"."; // Cancel Install "Alert.CancelInstall.Title" = "您确定要终止Xcode %@的安装吗?"; diff --git a/Xcodes/Resources/zh-Hant.lproj/Localizable.strings b/Xcodes/Resources/zh-Hant.lproj/Localizable.strings index 3f16514..b655c83 100644 --- a/Xcodes/Resources/zh-Hant.lproj/Localizable.strings +++ b/Xcodes/Resources/zh-Hant.lproj/Localizable.strings @@ -116,7 +116,7 @@ // SMS/2FA "DigitCodeDescription" = "請輸入顯示在你其中一個信任裝置中的 %d 位數密碼:"; "SendSMS" = "傳送簡訊"; -"EnterDigitCodeDescription" = "請輸入 %d 位數密碼,已傳送至 %@: "; +"EnterDigitCodeDescription" = "請輸入 %1$d 位數密碼,已傳送至 %2$@: "; "SelectTrustedPhone" = "請輸入一個你想用來接收 %d 位數密碼簡訊的電話號碼:"; "NoTrustedPhones" = "你的帳號沒有任何已信任的手機號碼,但兩階段認證需要信任的手機號碼。\n\n請參閱 https://support.apple.com/HT204915."; diff --git a/experiment_dark.jpg b/experiment_dark.jpg deleted file mode 100644 index b71f79b..0000000 Binary files a/experiment_dark.jpg and /dev/null differ diff --git a/experiment_dark.png b/experiment_dark.png new file mode 100644 index 0000000..bfb498a Binary files /dev/null and b/experiment_dark.png differ diff --git a/experiment_light.jpg b/experiment_light.jpg deleted file mode 100644 index a547328..0000000 Binary files a/experiment_light.jpg and /dev/null differ diff --git a/experiment_light.png b/experiment_light.png new file mode 100644 index 0000000..fc71b91 Binary files /dev/null and b/experiment_light.png differ diff --git a/screenshot_dark.png b/screenshot_dark.png index 3de73e4..cf4a6d7 100644 Binary files a/screenshot_dark.png and b/screenshot_dark.png differ diff --git a/screenshot_light.png b/screenshot_light.png index 62989ca..b4d2dec 100644 Binary files a/screenshot_light.png and b/screenshot_light.png differ