diff --git a/.github/workflows/appcast.yml b/.github/workflows/appcast.yml index ccfe648..fe8b09e 100644 --- a/.github/workflows/appcast.yml +++ b/.github/workflows/appcast.yml @@ -15,7 +15,7 @@ jobs: persist-credentials: false - name: Cache 📦 - uses: actions/cache@v3.0.8 + uses: actions/cache@v3.0.11 with: path: AppCast/vendor/bundle key: ${{ runner.os }}-gems-v1.0-${{ hashFiles('AppCast/Gemfile') }} diff --git a/.gitignore b/.gitignore index 18d371b..c32cb51 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,9 @@ Product/* timeline.xctimeline playground.xcworkspace +# Jetbrains IDEA +.idea + # Swift Package Manager # # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..e2e2249 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,43 @@ +# Contributing to Xcodes +We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's: + +- Reporting a bug +- Discussing the current state of the code +- Submitting a fix +- Proposing new features +- Becoming a maintainer + +## We Develop with Github +We use github to host code, to track issues and feature requests, as well as accept pull requests. + +## All Code Changes Happen Through Pull Requests +Pull requests are the best way to propose changes to the codebase We actively welcome your pull requests: + +1. Fork the repo and create your branch from `main`. +2. If you've added code that should be tested, add tests. +3. If you've added new functionality, add documentation +4. Ensure the test suite passes. +5. Make sure your code lints. +6. Issue that pull request! + +## Any contributions you make will be under the MIT Software License +In short, when you submit code changes, your submissions are understood to be under the same [MIT License](http://choosealicense.com/licenses/mit/) that covers the project. Feel free to contact the maintainers if that's a concern. + +## Report bugs using Github's [issues](https://github.com/robotsandpencils/xcodesapp/issues) +We use GitHub issues to track public bugs. Report a bug by [opening a new issue](); it's that easy! + +## Write bug reports with detail, background, and sample code + +**Great Bug Reports** tend to have: + +- A quick summary and/or background +- Steps to reproduce + - Be specific! +- What you expected would happen +- What actually happens +- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) + +People *love* thorough bug reports. + +## License +By contributing, you agree that your contributions will be licensed under its MIT License. diff --git a/README.md b/README.md index 0169687..96107ce 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,8 @@ The following languages are supported because of the following community users! |Hindi 🇮🇳 |[@KGurpreet](https://github.com/KGurpreet)|Chinese-Simplified 🇨🇳|[@megabitsenmzq](https://github.com/megabitsenmzq)| |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)|Catalan|[@ferranabello](https://github.com/ferranabello)|| +|German 🇩🇪|[@drct](https://github.com/drct)|Dutch 🇳🇱|[@jfversluis](https://github/com/jfversluis)| +|Brazilian Portuguese 🇧🇷|[@brunomunizaf](https://github.com/brunomunizaf)|Catalan|[@ferranabello](https://github.com/ferranabello)|| Want to add more languages? Simply create a PR with the updated strings file. ## Installation diff --git a/Xcodes.xcodeproj/project.pbxproj b/Xcodes.xcodeproj/project.pbxproj index 9d350f7..a298a5f 100644 --- a/Xcodes.xcodeproj/project.pbxproj +++ b/Xcodes.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 36741BFD291E4FDB00A85AAE /* DownloadPreferencePane.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36741BFC291E4FDB00A85AAE /* DownloadPreferencePane.swift */; }; + 36741BFF291E50F500A85AAE /* FileError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36741BFE291E50F500A85AAE /* FileError.swift */; }; 536CFDD2263C94DE00026CE0 /* SignedInView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 536CFDD1263C94DE00026CE0 /* SignedInView.swift */; }; 536CFDD4263C9A8000026CE0 /* XcodesSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 536CFDD3263C9A8000026CE0 /* XcodesSheet.swift */; }; 53CBAB2C263DCC9100410495 /* XcodesAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53CBAB2B263DCC9100410495 /* XcodesAlert.swift */; }; @@ -102,6 +104,7 @@ CAFFFED8259CDA5000903F81 /* XcodeListViewRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFFFED7259CDA5000903F81 /* XcodeListViewRow.swift */; }; 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 */; }; E87DD6EB25D053FA00D86808 /* Progress+.swift in Sources */ = {isa = PBXBuildFile; fileRef = E87DD6EA25D053FA00D86808 /* Progress+.swift */; }; E89342FA25EDCC17007CF557 /* NotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E89342F925EDCC17007CF557 /* NotificationManager.swift */; }; E8977EA325C11E1500835F80 /* PreferencesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8977EA225C11E1500835F80 /* PreferencesView.swift */; }; @@ -170,6 +173,9 @@ /* Begin PBXFileReference section */ 15FAD1652811D15600B63259 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.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 = ""; }; + 36741BFE291E50F500A85AAE /* FileError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileError.swift; sourceTree = ""; }; 4A5AAA1D28118FAD00528958 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; 536CFDD1263C94DE00026CE0 /* SignedInView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignedInView.swift; sourceTree = ""; }; 536CFDD3263C9A8000026CE0 /* XcodesSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodesSheet.swift; sourceTree = ""; }; @@ -290,8 +296,10 @@ CAFE4ABB25B7D54B0064FE51 /* UpdatesPreferencePane.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdatesPreferencePane.swift; sourceTree = ""; }; CAFFFED7259CDA5000903F81 /* XcodeListViewRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodeListViewRow.swift; sourceTree = ""; }; CAFFFEEE259CEAC400903F81 /* RingProgressViewStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RingProgressViewStyle.swift; sourceTree = ""; }; + E2AFDCCA28F024D000864ADD /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; E81D7E9F2805250100A205FC /* Collection+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Collection+.swift"; sourceTree = ""; }; E872EE4F2808D4F100D3DD8B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + E87AB3C42939B65E00D72F43 /* Hardware.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Hardware.swift; sourceTree = ""; }; E87DD6EA25D053FA00D86808 /* Progress+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Progress+.swift"; sourceTree = ""; }; E89342F925EDCC17007CF557 /* NotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManager.swift; sourceTree = ""; }; E8977EA225C11E1500835F80 /* PreferencesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesView.swift; sourceTree = ""; }; @@ -457,6 +465,7 @@ CAA858C325A2BE4E00ACF8C0 /* Downloader.swift */, CABFA9B22592EEEA00380FEE /* Entry+.swift */, CABFA9A92592EEE900380FEE /* Environment.swift */, + 36741BFE291E50F500A85AAE /* FileError.swift */, CABFA9B82592EEEA00380FEE /* FileManager+.swift */, CAFBDB942598FE96003DCC5A /* FocusedValues.swift */, CABFA9AC2592EEE900380FEE /* Foundation.swift */, @@ -483,6 +492,7 @@ E87DD6EA25D053FA00D86808 /* Progress+.swift */, E81D7E9F2805250100A205FC /* Collection+.swift */, E8D655BF288DD04700A139C2 /* SelectedActionType.swift */, + E87AB3C42939B65E00D72F43 /* Hardware.swift */, ); path = Backend; sourceTree = ""; @@ -589,6 +599,7 @@ isa = PBXGroup; children = ( CAFE4AB325B7D3AF0064FE51 /* AdvancedPreferencePane.swift */, + 36741BFC291E4FDB00A85AAE /* DownloadPreferencePane.swift */, CAFE4AAB25B7D2C70064FE51 /* GeneralPreferencePane.swift */, CAFE4ABB25B7D54B0064FE51 /* UpdatesPreferencePane.swift */, E8977EA225C11E1500835F80 /* PreferencesView.swift */, @@ -723,6 +734,8 @@ uk, fi, ca, + "pt-BR", + nl, ); mainGroup = CAD2E7952449574E00113D76; packageReferences = ( @@ -840,6 +853,7 @@ CAA1CB45255A5B60003FD669 /* SignIn2FAView.swift in Sources */, CABFA9C52592EEEA00380FEE /* FileManager+.swift in Sources */, CABFA9CD2592EEEA00380FEE /* Foundation.swift in Sources */, + 36741BFF291E50F500A85AAE /* FileError.swift in Sources */, CA9FF8872595607900E47BAF /* InstalledXcode.swift in Sources */, 53CBAB2C263DCC9100410495 /* XcodesAlert.swift in Sources */, CA42DD6E25AEA8B200BC0B0C /* Logger.swift in Sources */, @@ -850,6 +864,7 @@ CA9FF84E2595079F00E47BAF /* ScrollingTextView.swift in Sources */, CABFA9C12592EEEA00380FEE /* Version+.swift in Sources */, E8D655C0288DD04700A139C2 /* SelectedActionType.swift in Sources */, + 36741BFD291E4FDB00A85AAE /* DownloadPreferencePane.swift in Sources */, CA9FF8522595080100E47BAF /* AcknowledgementsView.swift in Sources */, CABFA9CE2592EEEA00380FEE /* Version+Xcode.swift in Sources */, CAFBDB912598FE80003DCC5A /* SelectedXcode.swift in Sources */, @@ -867,6 +882,7 @@ CAC281CD259F97FA00B8AB0B /* ObservingProgressIndicator.swift in Sources */, CABFA9C22592EEEA00380FEE /* Publisher+Resumable.swift in Sources */, CAFBDC68259A308B003DCC5A /* InfoPane.swift in Sources */, + E87AB3C52939B65E00D72F43 /* Hardware.swift in Sources */, CAA1CB4D255A5CFD003FD669 /* SignInPhoneListView.swift in Sources */, CAFBDC6C259A3098003DCC5A /* View+Conditional.swift in Sources */, CABFA9CF2592EEEA00380FEE /* Process.swift in Sources */, @@ -937,6 +953,8 @@ 7CBF284E28606D2C001AA66B /* uk */, 5AA8A6102877EDAD009ECDB0 /* fi */, 5C3927ED28E4B486007B5119 /* ca */, + 327DF109286ABE6B00D694D5 /* pt-BR */, + E2AFDCCA28F024D000864ADD /* nl */, ); name = Localizable.strings; sourceTree = ""; @@ -1015,7 +1033,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 16; + CURRENT_PROJECT_VERSION = 17; DEVELOPMENT_ASSET_PATHS = "\"Xcodes/Preview Content\""; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = NO; @@ -1025,7 +1043,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.8.0; + MARKETING_VERSION = 1.9.0; PRODUCT_BUNDLE_IDENTIFIER = com.robotsandpencils.XcodesApp; PRODUCT_NAME = Xcodes; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1256,7 +1274,7 @@ CODE_SIGN_ENTITLEMENTS = Xcodes/Resources/Xcodes.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 16; + CURRENT_PROJECT_VERSION = 17; DEVELOPMENT_ASSET_PATHS = "\"Xcodes/Preview Content\""; DEVELOPMENT_TEAM = PBH8V487HB; ENABLE_HARDENED_RUNTIME = YES; @@ -1266,7 +1284,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.8.0; + MARKETING_VERSION = 1.9.0; PRODUCT_BUNDLE_IDENTIFIER = com.robotsandpencils.XcodesApp; PRODUCT_NAME = Xcodes; SWIFT_VERSION = 5.0; @@ -1280,7 +1298,7 @@ CODE_SIGN_ENTITLEMENTS = Xcodes/Resources/Xcodes.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 16; + CURRENT_PROJECT_VERSION = 17; DEVELOPMENT_ASSET_PATHS = "\"Xcodes/Preview Content\""; DEVELOPMENT_TEAM = PBH8V487HB; ENABLE_HARDENED_RUNTIME = YES; @@ -1290,7 +1308,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.8.0; + MARKETING_VERSION = 1.9.0; PRODUCT_BUNDLE_IDENTIFIER = com.robotsandpencils.XcodesApp; PRODUCT_NAME = Xcodes; SWIFT_VERSION = 5.0; diff --git a/Xcodes/Backend/AppState+Install.swift b/Xcodes/Backend/AppState+Install.swift index b4ef931..ccf637d 100644 --- a/Xcodes/Backend/AppState+Install.swift +++ b/Xcodes/Backend/AppState+Install.swift @@ -43,7 +43,10 @@ extension AppState { Logger.appState.info("Using \(downloader) downloader") - return self.getXcodeArchive(installationType, downloader: downloader) + return validateSession() + .flatMap { _ in + self.getXcodeArchive(installationType, downloader: downloader) + } .flatMap { xcode, url -> AnyPublisher in self.installArchivedXcode(xcode, at: url) } @@ -93,15 +96,12 @@ extension AppState { } private func downloadXcode(availableXcode: AvailableXcode, downloader: Downloader) -> AnyPublisher<(AvailableXcode, URL), Error> { - return validateADCSession(path: availableXcode.downloadPath) - .flatMap { _ in - return self.downloadOrUseExistingArchive(for: availableXcode, downloader: downloader, progressChanged: { [unowned self] progress in - DispatchQueue.main.async { - self.setInstallationStep(of: availableXcode.version, to: .downloading(progress: progress)) - } - }) - .map { return (availableXcode, $0) } - } + self.downloadOrUseExistingArchive(for: availableXcode, downloader: downloader, progressChanged: { [unowned self] progress in + DispatchQueue.main.async { + self.setInstallationStep(of: availableXcode.version, to: .downloading(progress: progress)) + } + }) + .map { return (availableXcode, $0) } .eraseToAnyPublisher() } @@ -513,7 +513,7 @@ public enum InstallationError: LocalizedError, Equatable { case .unexpectedCodeSigningIdentity(let identity, let certificateAuthority): return String(format: localizeString("InstallationError.UnexpectedCodeSigningIdentity"), identity, certificateAuthority, XcodeTeamIdentifier, XcodeCertificateAuthority) case .unsupportedFileFormat(let fileExtension): - return String(format: localizeString("InstallationError.UnsuppoawwrtedFileFormat"), fileExtension) + return String(format: localizeString("InstallationError.UnsupportedFileFormat"), fileExtension) case .missingSudoerPassword: return localizeString("InstallationError.MissingSudoerPassword") case let .unavailableVersion(version): diff --git a/Xcodes/Backend/AppState.swift b/Xcodes/Backend/AppState.swift index a098642..ebd44b5 100644 --- a/Xcodes/Backend/AppState.swift +++ b/Xcodes/Backend/AppState.swift @@ -93,7 +93,12 @@ class AppState: ObservableObject { } } } - + + @Published var showOpenInRosettaOption = false { + didSet { + Current.defaults.set(showOpenInRosettaOption, forKey: "showOpenInRosettaOption") + } + } // MARK: - Publisher Cancellables var cancellables = Set() @@ -142,6 +147,7 @@ class AppState: ObservableObject { createSymLinkOnSelect = Current.defaults.bool(forKey: "createSymLinkOnSelect") ?? false onSelectActionType = SelectedActionType(rawValue: Current.defaults.string(forKey: "onSelectActionType") ?? "none") ?? .none installPath = Current.defaults.string(forKey: "installPath") ?? Path.defaultInstallDirectory.string + showOpenInRosettaOption = Current.defaults.bool(forKey: "showOpenInRosettaOption") ?? false } // MARK: Timer @@ -381,7 +387,7 @@ class AppState: ObservableObject { case .apple: install(id: id) case .xcodeReleases: - installWithoutLogin(id: id) + install(id: id) } } @@ -454,6 +460,7 @@ class AppState: ObservableObject { } /// Skips using the username/password to log in to Apple, and simply gets a Auth Cookie used in downloading + /// As of Nov 2022 this was returning a 403 forbidden func installWithoutLogin(id: Xcode.ID) { guard let availableXcode = availableXcodes.first(where: { $0.version == id }) else { return } @@ -584,13 +591,18 @@ class AppState: ObservableObject { ) } - func open(xcode: Xcode) { + func open(xcode: Xcode, openInRosetta: Bool? = false) { switch xcode.installState { - case let .installed(path): - NSWorkspace.shared.openApplication(at: path.url, configuration: .init()) - default: - Logger.appState.error("\(xcode.id) is not installed") - return + case let .installed(path): + let config = NSWorkspace.OpenConfiguration.init() + if (openInRosetta ?? false) { + config.architecture = CPU_TYPE_X86_64 + } + config.allowsRunningApplicationSubstitution = false + NSWorkspace.shared.openApplication(at: path.url, configuration: config) + default: + Logger.appState.error("\(xcode.id) is not installed") + return } } @@ -609,10 +621,10 @@ class AppState: ObservableObject { NSPasteboard.general.setString(url.absoluteString, forType: .string) } - func createSymbolicLink(xcode: Xcode) { + func createSymbolicLink(xcode: Xcode, isBeta: Bool = false) { guard let installedXcodePath = xcode.installedPath else { return } - let destinationPath: Path = Path.installDirectory/"Xcode.app" + let destinationPath: Path = Path.installDirectory/"Xcode\(isBeta ? "-Beta" : "").app" // does an Xcode.app file exist? if FileManager.default.fileExists(atPath: destinationPath.string) { @@ -634,7 +646,7 @@ class AppState: ObservableObject { do { try FileManager.default.createSymbolicLink(atPath: destinationPath.string, withDestinationPath: installedXcodePath.string) - Logger.appState.info("Successfully created symbolic link with Xcode.app") + Logger.appState.info("Successfully created symbolic link with Xcode\(isBeta ? "-Beta": "").app") } catch { Logger.appState.error("Unable to create symbolic Link") self.error = error diff --git a/Xcodes/Backend/FileError.swift b/Xcodes/Backend/FileError.swift new file mode 100644 index 0000000..c3965bb --- /dev/null +++ b/Xcodes/Backend/FileError.swift @@ -0,0 +1,23 @@ +// +// FileError.swift +// Xcodes +// +// Created by Leon Wolf on 06.10.22. +// Copyright © 2022 Robots and Pencils. All rights reserved. +// + +import Foundation +import LegibleError + +enum FileError: LocalizedError{ + case fileNotFound(_ fileName: String) +} + +extension FileError { + var errorDescription: String? { + switch self { + case .fileNotFound(let fileName): + return String(format: localizeString("Alert.Uninstall.Error.Message.FileNotFound"), fileName) + } + } +} diff --git a/Xcodes/Backend/FileManager+.swift b/Xcodes/Backend/FileManager+.swift index 12c96e1..72fd1ee 100644 --- a/Xcodes/Backend/FileManager+.swift +++ b/Xcodes/Backend/FileManager+.swift @@ -11,7 +11,11 @@ extension FileManager { @discardableResult func trashItem(at url: URL) throws -> URL { var resultingItemURL: NSURL! - try trashItem(at: url, resultingItemURL: &resultingItemURL) + if fileExists(atPath: url.path) { + try trashItem(at: url, resultingItemURL: &resultingItemURL) + } else { + throw FileError.fileNotFound(url.lastPathComponent) + } return resultingItemURL as URL } -} \ No newline at end of file +} diff --git a/Xcodes/Backend/Hardware.swift b/Xcodes/Backend/Hardware.swift new file mode 100644 index 0000000..0f7601b --- /dev/null +++ b/Xcodes/Backend/Hardware.swift @@ -0,0 +1,28 @@ +import Foundation + + +struct Hardware { + + /// + /// Determines the architecture of the Mac on which we're running. Returns `arm64` for Apple Silicon + /// and `x86_64` for Intel-based Macs or `nil` if the system call fails. + static func getMachineHardwareName() -> String? + { + var sysInfo = utsname() + let retVal = uname(&sysInfo) + var finalString: String? = nil + + if retVal == EXIT_SUCCESS + { + let bytes = Data(bytes: &sysInfo.machine, count: Int(_SYS_NAMELEN)) + finalString = String(data: bytes, encoding: .utf8) + } + + // _SYS_NAMELEN will include a billion null-terminators. Clear those out so string comparisons work as you expect. + return finalString?.trimmingCharacters(in: CharacterSet(charactersIn: "\0")) + } + + static func isAppleSilicon() -> Bool { + return Hardware.getMachineHardwareName() == "arm64" + } +} diff --git a/Xcodes/Backend/XcodeCommands.swift b/Xcodes/Backend/XcodeCommands.swift index 3120c0f..76e9924 100644 --- a/Xcodes/Backend/XcodeCommands.swift +++ b/Xcodes/Backend/XcodeCommands.swift @@ -92,16 +92,34 @@ struct OpenButton: View { @EnvironmentObject var appState: AppState let xcode: Xcode? + var openInRosetta: Bool { + appState.showOpenInRosettaOption && Hardware.isAppleSilicon() + } + var body: some View { - Button(action: open) { - Text("Open") + if openInRosetta { + Menu("Open") { + Button(action: open) { + Text("Open") + } + .help("Open") + Button(action: open) { + Text("Open In Rosetta") + } + .help("Open In Rosetta") + } + } else { + Button(action: open) { + Text("Open") + } + .help("Open") } - .help("Open") + } private func open() { guard let xcode = xcode else { return } - appState.open(xcode: xcode) + appState.open(xcode: xcode, openInRosetta: openInRosetta) } } @@ -189,6 +207,23 @@ struct CreateSymbolicLinkButton: View { } } +struct CreateSymbolicBetaLinkButton: View { + @EnvironmentObject var appState: AppState + let xcode: Xcode? + + var body: some View { + Button(action: createSymbolicBetaLink) { + Text("CreateSymLinkBeta") + } + .help("CreateSymLinkBeta") + } + + private func createSymbolicBetaLink() { + guard let xcode = xcode else { return } + appState.createSymbolicLink(xcode: xcode, isBeta: true) + } +} + // MARK: - Commands struct InstallCommand: View { diff --git a/Xcodes/Frontend/Preferences/AdvancedPreferencePane.swift b/Xcodes/Frontend/Preferences/AdvancedPreferencePane.swift index c908460..21d6b8c 100644 --- a/Xcodes/Frontend/Preferences/AdvancedPreferencePane.swift +++ b/Xcodes/Frontend/Preferences/AdvancedPreferencePane.swift @@ -4,19 +4,16 @@ import Path struct AdvancedPreferencePane: View { @EnvironmentObject var appState: AppState - - @AppStorage("dataSource") var dataSource: DataSource = .xcodeReleases - @AppStorage("downloader") var downloader: Downloader = .aria2 var body: some View { VStack(alignment: .leading, spacing: 20) { - + GroupBox(label: Text("InstallDirectory")) { VStack(alignment: .leading) { HStack(alignment: .top, spacing: 5) { Text(appState.installPath).font(.footnote) - .fixedSize(horizontal: false, vertical: true) - .lineLimit(2) + .fixedSize(horizontal: false, vertical: true) + .lineLimit(2) Button(action: { appState.reveal(path: appState.installPath) }) { Image(systemName: "arrow.right.circle.fill") } @@ -34,7 +31,7 @@ struct AdvancedPreferencePane: View { panel.directoryURL = URL(fileURLWithPath: appState.installPath) if panel.runModal() == .OK { - + guard let pathURL = panel.url, let path = Path(url: pathURL) else { return } self.appState.installPath = path.string } @@ -50,8 +47,8 @@ struct AdvancedPreferencePane: View { VStack(alignment: .leading) { HStack(alignment: .top, spacing: 5) { Text(appState.localPath).font(.footnote) - .fixedSize(horizontal: false, vertical: true) - .lineLimit(2) + .fixedSize(horizontal: false, vertical: true) + .lineLimit(2) Button(action: { appState.reveal(path: appState.localPath) }) { Image(systemName: "arrow.right.circle.fill") } @@ -69,7 +66,7 @@ struct AdvancedPreferencePane: View { panel.directoryURL = URL(fileURLWithPath: appState.localPath) if panel.runModal() == .OK { - + guard let pathURL = panel.url, let path = Path(url: pathURL) else { return } self.appState.localPath = path.string } @@ -102,44 +99,23 @@ struct AdvancedPreferencePane: View { Toggle("AutomaticallyCreateSymbolicLink", isOn: $appState.createSymLinkOnSelect) .disabled(appState.createSymLinkOnSelectDisabled) Text("AutomaticallyCreateSymbolicLinkDescription") - .font(.footnote) - .fixedSize(horizontal: false, vertical: true) + .font(.footnote) + .fixedSize(horizontal: false, vertical: true) } .fixedSize(horizontal: false, vertical: true) } .groupBoxStyle(PreferencesGroupBoxStyle()) - GroupBox(label: Text("DataSource")) { - VStack(alignment: .leading) { - Picker("DataSource", selection: $dataSource) { - ForEach(DataSource.allCases) { dataSource in - Text(dataSource.description) - .tag(dataSource) - } - } - .labelsHidden() - - AttributedText(dataSourceFootnote) + if Hardware.isAppleSilicon() { + GroupBox(label: Text("Apple Silicon")) { + Toggle("ShowOpenInRosetta", isOn: $appState.showOpenInRosettaOption) + .disabled(appState.createSymLinkOnSelectDisabled) + Text("ShowOpenInRosettaDescription") + .font(.footnote) + .fixedSize(horizontal: false, vertical: true) } - + .groupBoxStyle(PreferencesGroupBoxStyle()) } - .groupBoxStyle(PreferencesGroupBoxStyle()) - - GroupBox(label: Text("Downloader")) { - VStack(alignment: .leading) { - Picker("Downloader", selection: $downloader) { - ForEach(Downloader.allCases) { downloader in - Text(downloader.description) - .tag(downloader) - } - } - .labelsHidden() - - AttributedText(downloaderFootnote) - } - - } - .groupBoxStyle(PreferencesGroupBoxStyle()) GroupBox(label: Text("PrivilegedHelper")) { VStack(alignment: .leading, spacing: 8) { @@ -168,32 +144,6 @@ struct AdvancedPreferencePane: View { .groupBoxStyle(PreferencesGroupBoxStyle()) } } - - private var dataSourceFootnote: NSAttributedString { - let string = localizeString("DataSourceDescription") - let attributedString = NSMutableAttributedString( - string: string, - attributes: [ - .font: NSFont.preferredFont(forTextStyle: .footnote, options: [:]), - .foregroundColor: NSColor.labelColor - ] - ) - attributedString.addAttribute(.link, value: URL(string: "https://xcodereleases.com")!, range: NSRange(string.range(of: "Xcode Releases")!, in: string)) - return attributedString - } - - private var downloaderFootnote: NSAttributedString { - let string = localizeString("DownloaderDescription") - let attributedString = NSMutableAttributedString( - string: string, - attributes: [ - .font: NSFont.preferredFont(forTextStyle: .footnote, options: [:]), - .foregroundColor: NSColor.labelColor - ] - ) - attributedString.addAttribute(.link, value: URL(string: "https://github.com/aria2/aria2")!, range: NSRange(string.range(of: "aria2")!, in: string)) - return attributedString - } } struct AdvancedPreferencePane_Previews: PreviewProvider { diff --git a/Xcodes/Frontend/Preferences/DownloadPreferencePane.swift b/Xcodes/Frontend/Preferences/DownloadPreferencePane.swift new file mode 100644 index 0000000..e453dc2 --- /dev/null +++ b/Xcodes/Frontend/Preferences/DownloadPreferencePane.swift @@ -0,0 +1,82 @@ +import AppleAPI +import SwiftUI + +struct DownloadPreferencePane: View { + @EnvironmentObject var appState: AppState + + @AppStorage("dataSource") var dataSource: DataSource = .xcodeReleases + @AppStorage("downloader") var downloader: Downloader = .aria2 + + var body: some View { + VStack(alignment: .leading) { + GroupBox(label: Text("DataSource")) { + VStack(alignment: .leading) { + Picker("DataSource", selection: $dataSource) { + ForEach(DataSource.allCases) { dataSource in + Text(dataSource.description) + .tag(dataSource) + } + } + .labelsHidden() + + AttributedText(dataSourceFootnote) + } + + } + .groupBoxStyle(PreferencesGroupBoxStyle()) + + GroupBox(label: Text("Downloader")) { + VStack(alignment: .leading) { + Picker("Downloader", selection: $downloader) { + ForEach(Downloader.allCases) { downloader in + Text(downloader.description) + .tag(downloader) + } + } + .labelsHidden() + + AttributedText(downloaderFootnote) + } + + } + .groupBoxStyle(PreferencesGroupBoxStyle()) + + } + } + + private var dataSourceFootnote: NSAttributedString { + let string = localizeString("DataSourceDescription") + let attributedString = NSMutableAttributedString( + string: string, + attributes: [ + .font: NSFont.preferredFont(forTextStyle: .footnote, options: [:]), + .foregroundColor: NSColor.labelColor + ] + ) + attributedString.addAttribute(.link, value: URL(string: "https://xcodereleases.com")!, range: NSRange(string.range(of: "Xcode Releases")!, in: string)) + return attributedString + } + + private var downloaderFootnote: NSAttributedString { + let string = localizeString("DownloaderDescription") + let attributedString = NSMutableAttributedString( + string: string, + attributes: [ + .font: NSFont.preferredFont(forTextStyle: .footnote, options: [:]), + .foregroundColor: NSColor.labelColor + ] + ) + attributedString.addAttribute(.link, value: URL(string: "https://github.com/aria2/aria2")!, range: NSRange(string.range(of: "aria2")!, in: string)) + return attributedString + } +} + +struct DownloadPreferencePane_Previews: PreviewProvider { + static var previews: some View { + Group { + GeneralPreferencePane() + .environmentObject(AppState()) + .frame(maxWidth: 500) + } + } +} diff --git a/Xcodes/Frontend/Preferences/PreferencesView.swift b/Xcodes/Frontend/Preferences/PreferencesView.swift index 7442236..83ab775 100644 --- a/Xcodes/Frontend/Preferences/PreferencesView.swift +++ b/Xcodes/Frontend/Preferences/PreferencesView.swift @@ -21,6 +21,11 @@ struct PreferencesView: View { Label("Updates", systemImage: "arrow.triangle.2.circlepath.circle") } .tag(Tabs.updates) + DownloadPreferencePane() + .environmentObject(appState) + .tabItem { + Label("Downloads", systemImage: "icloud.and.arrow.down") + } AdvancedPreferencePane() .environmentObject(appState) .tabItem { diff --git a/Xcodes/Frontend/XcodeList/MainToolbar.swift b/Xcodes/Frontend/XcodeList/MainToolbar.swift index 69cb16e..dcff73a 100644 --- a/Xcodes/Frontend/XcodeList/MainToolbar.swift +++ b/Xcodes/Frontend/XcodeList/MainToolbar.swift @@ -86,7 +86,13 @@ struct MainToolbarModifier: ViewModifier { .keyboardShortcut(KeyboardShortcut("i", modifiers: [.command, .option])) .help("InfoDescription") - Button(action: { NSApp.sendAction(Selector(("showPreferencesWindow:")), to: nil, from: nil) }, label: { + 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") diff --git a/Xcodes/Frontend/XcodeList/XcodeListViewRow.swift b/Xcodes/Frontend/XcodeList/XcodeListViewRow.swift index 10f3cfb..555c361 100644 --- a/Xcodes/Frontend/XcodeList/XcodeListViewRow.swift +++ b/Xcodes/Frontend/XcodeList/XcodeListViewRow.swift @@ -6,16 +6,16 @@ struct XcodeListViewRow: View { let xcode: Xcode let selected: Bool let appState: AppState - + var body: some View { HStack { appIconView(for: xcode) - + VStack(alignment: .leading) { HStack { Text(verbatim: "\(xcode.description) \(xcode.version.buildMetadataIdentifiersDisplay)") .font(.body) - + if !xcode.identicalBuilds.isEmpty { Image(systemName: "square.fill.on.square.fill") .font(.subheadline) @@ -25,7 +25,7 @@ struct XcodeListViewRow: View { .help("IdenticalBuilds.help") } } - + if case let .installed(path) = xcode.installState { Text(verbatim: path.string) .font(.caption) @@ -35,9 +35,9 @@ struct XcodeListViewRow: View { .font(.caption) } } - + Spacer() - + selectControl(for: xcode) .padding(.trailing, 16) installControl(for: xcode) @@ -54,14 +54,17 @@ struct XcodeListViewRow: View { RevealButton(xcode: xcode) CopyPathButton(xcode: xcode) CreateSymbolicLinkButton(xcode: xcode) + if xcode.version.isPrerelease { + CreateSymbolicBetaLinkButton(xcode: xcode) + } Divider() UninstallButton(xcode: xcode) - + #if DEBUG - Divider() - Button("Perform post-install steps") { - appState.performPostInstallSteps(for: InstalledXcode(path: path)!) as Void - } + Divider() + Button("Perform post-install steps") { + appState.performPostInstallSteps(for: InstalledXcode(path: path)!) as Void + } #endif } } @@ -77,7 +80,7 @@ struct XcodeListViewRow: View { .foregroundColor(.secondary) } } - + @ViewBuilder private func selectControl(for xcode: Xcode) -> some View { if xcode.installState.installed { @@ -97,7 +100,7 @@ struct XcodeListViewRow: View { EmptyView() } } - + @ViewBuilder private func installControl(for xcode: Xcode) -> some View { switch xcode.installState { @@ -129,31 +132,31 @@ struct XcodeListViewRow_Previews: PreviewProvider { selected: false, appState: AppState() ) - + XcodeListViewRow( xcode: Xcode(version: Version("12.2.0")!, installState: .notInstalled, selected: false, icon: nil), selected: false, appState: AppState() ) - + XcodeListViewRow( xcode: Xcode(version: Version("12.1.0")!, installState: .installing(.downloading(progress: configure(Progress(totalUnitCount: 100)) { $0.completedUnitCount = 40 })), selected: false, icon: nil), selected: false, appState: AppState() ) - + XcodeListViewRow( xcode: Xcode(version: Version("12.0.0")!, installState: .installed(Path("/Applications/Xcode-12.3.0.app")!), selected: false, icon: nil), selected: false, appState: AppState() ) - + XcodeListViewRow( xcode: Xcode(version: Version("12.0.0+1234A")!, installState: .installed(Path("/Applications/Xcode-12.3.0.app")!), selected: false, icon: nil), selected: false, appState: AppState() ) - + XcodeListViewRow( xcode: Xcode(version: Version("12.0.0+1234A")!, identicalBuilds: [Version("12.0.0-RC+1234A")!], installState: .installed(Path("/Applications/Xcode-12.3.0.app")!), selected: false, icon: nil), selected: false, diff --git a/Xcodes/Resources/Licenses.rtf b/Xcodes/Resources/Licenses.rtf index 68f9b51..93bc0ff 100644 --- a/Xcodes/Resources/Licenses.rtf +++ b/Xcodes/Resources/Licenses.rtf @@ -1,4 +1,4 @@ -{\rtf1\ansi\ansicpg1252\cocoartf2638 +{\rtf1\ansi\ansicpg1252\cocoartf2639 \cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fnil\fcharset0 .SFNS-Regular;} {\colortbl;\red255\green255\blue255;} {\*\expandedcolortbl;;} diff --git a/Xcodes/Resources/de.lproj/Localizable.strings b/Xcodes/Resources/de.lproj/Localizable.strings index 06abf2a..e40d7cc 100644 --- a/Xcodes/Resources/de.lproj/Localizable.strings +++ b/Xcodes/Resources/de.lproj/Localizable.strings @@ -16,6 +16,7 @@ "OpenDescription" = "Diese Version öffnen"; "CopyPath" = "Pfad kopieren"; "CreateSymLink" = "Symlink als Xcode.app erstellen"; +"CreateSymLinkBeta" = "Symlink als Xcode-Beta.app erstellen"; "Uninstall" = "Deinstallieren"; "Selected" = "Ausgewählt"; "Select" = "Auswählen"; @@ -72,6 +73,13 @@ "LastChecked" = "Letzte Prüfung: %@"; "Never" = "Nie"; +// 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."; +"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."; + // Advanced Preference Pane "Advanced" = "Erweitert"; "LocalCachePath" = "Lokaler Cache-Pfad"; @@ -88,10 +96,6 @@ "OnSelectRenameXcode" = "Immer in Xcode.app umbenennen"; "OnSelectRenameXcodeDescription" = "Bei Auswahl wird versucht das aktive Xcode in Xcode.app umzubenennen. Die vorherige Xcode.app wird dazu in den Versionsnamen umbenannt."; -"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."; -"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."; "PrivilegedHelper" = "Privilegierter Helfer"; "PrivilegedHelperDescription" = "Xcodes verwendet einen separaten privilegierten Helfer, um Aufgaben als root zu erledigen. Das sind Dinge, die sudo in der Kommandozeile erfordern würden, einschließlich Post-Installationsschritte sowie das Umstellen von Xcode-Versionen mit xcode-select.\n\nUm ihn zu installieren, erfolgt eine Aufforderung zur Eingabe des Passworts für Dein macOS-Benutzerkonto."; "HelperInstalled" = "Helfer ist installiert"; @@ -122,10 +126,10 @@ "SendSMS" = "SMS senden"; "EnterDigitCodeDescription" = "Gib den %d-stelligen Code ein der an '%@' 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/en-ca/HT204915."; +"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."; // MainWindow -"UpdatedAt" = "Aktalisiert am"; +"UpdatedAt" = "Aktualisiert am"; // ToolBar "Login" = "Login"; @@ -156,6 +160,7 @@ "Alert.Uninstall.Title" = "Xcode %@ deinstallieren?"; "Alert.Uninstall.Message" = "Die Anwendung wird in den Papierkorb verschoben, dieser wird aber nicht geleert."; "Alert.Uninstall.Error.Title" = "Die Deinstallation von Xcode ist nicht möglich"; +"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?"; diff --git a/Xcodes/Resources/en.lproj/Localizable.strings b/Xcodes/Resources/en.lproj/Localizable.strings index 9d45c5e..59a8676 100644 --- a/Xcodes/Resources/en.lproj/Localizable.strings +++ b/Xcodes/Resources/en.lproj/Localizable.strings @@ -16,6 +16,7 @@ "OpenDescription" = "Open this version"; "CopyPath" = "Copy Path"; "CreateSymLink" = "Create Symlink as Xcode.app"; +"CreateSymLinkBeta" = "Create Symlink as Xcode-Beta.app"; "Uninstall" = "Uninstall"; "Selected" = "Selected"; "Select" = "Select"; @@ -72,6 +73,13 @@ "LastChecked" = "Last checked: %@"; "Never" = "Never"; +// Download Preference Pane +"Downloads" = "Downloads"; +"DataSource" = "Data Source"; +"DataSourceDescription" = "The Apple data source scrapes the Apple Developer website. It will always show the latest releases that are available, but is more fragile.\n\nXcode Releases is an unofficial list of Xcode releases. It's provided as well-formed data, contains extra information that is not readily available from Apple, and is less likely to break if Apple redesigns their developer website."; +"Downloader" = "Downloader"; +"DownloaderDescription" = "aria2 uses up to 16 connections to download Xcode 3-5x faster than URLSession. It's bundled as an executable along with its source code within Xcodes to comply with its GPLv2 license.\n\nURLSession is the default Apple API for making URL requests."; + // Advanced Preference Pane "Advanced" = "Advanced"; "LocalCachePath" = "Local Cache Path"; @@ -88,16 +96,15 @@ "OnSelectRenameXcode" = "Always rename to Xcode.app"; "OnSelectRenameXcodeDescription" = "On select, will automatically try and rename the active Xcode to Xcode.app, renaming the previous Xcode.app to the version name."; -"DataSource" = "Data Source"; -"DataSourceDescription" = "The Apple data source scrapes the Apple Developer website. It will always show the latest releases that are available, but is more fragile.\n\nXcode Releases is an unofficial list of Xcode releases. It's provided as well-formed data, contains extra information that is not readily available from Apple, and is less likely to break if Apple redesigns their developer website."; -"Downloader" = "Downloader"; -"DownloaderDescription" = "aria2 uses up to 16 connections to download Xcode 3-5x faster than URLSession. It's bundled as an executable along with its source code within Xcodes to comply with its GPLv2 license.\n\nURLSession is the default Apple API for making URL requests."; "PrivilegedHelper" = "Privileged Helper"; "PrivilegedHelperDescription" = "Xcodes uses a separate privileged helper to perform tasks as root. These are things that would require sudo on the command line, including post-install steps and switching Xcode versions with xcode-select.\n\nYou'll be prompted for your macOS account password to install it."; "HelperInstalled" = "Helper is installed"; "HelperNotInstalled" = "Helper is not installed"; "InstallHelper" = "Install helper"; +"ShowOpenInRosetta" = "Show Open In Rosetta option"; +"ShowOpenInRosettaDescription" = "Open in Rosetta option will show where other \"Open\" functions are available. Note: This will only show for Apple Silicon machines."; + // Experiment Preference Pane "Experiments" = "Experiments"; "FasterUnxip" = "Faster Unxip"; @@ -122,7 +129,7 @@ "SendSMS" = "Send SMS"; "EnterDigitCodeDescription" = "Enter the %d digit code sent to %@: "; "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/en-ca/HT204915."; +"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."; // MainWindow "UpdatedAt" = "Updated at"; @@ -156,6 +163,7 @@ "Alert.Uninstall.Title" = "Uninstall Xcode %@?"; "Alert.Uninstall.Message" = "It will be moved to the Trash, but won't be emptied."; "Alert.Uninstall.Error.Title" = "Unable to uninstall Xcode"; +"Alert.Uninstall.Error.Message.FileNotFound" = "Could not find file \"%@\"."; // Cancel Install "Alert.CancelInstall.Title" = "Are you sure you want to stop the installation of Xcode %@?"; diff --git a/Xcodes/Resources/es.lproj/Localizable.strings b/Xcodes/Resources/es.lproj/Localizable.strings index c287435..a910bc7 100644 --- a/Xcodes/Resources/es.lproj/Localizable.strings +++ b/Xcodes/Resources/es.lproj/Localizable.strings @@ -16,6 +16,7 @@ "OpenDescription" = "Abrir esta versión"; "CopyPath" = "Copiar Ruta"; "CreateSymLink" = "Crear Symlink como Xcode.app"; +"CreateSymLinkBeta" = "Crear Symlink como Xcode-Beta.app"; "Uninstall" = "Desinstalar"; "Selected" = "Seleccionado"; "Select" = "Seleccionar"; @@ -72,18 +73,25 @@ "LastChecked" = "Última comprobación: %@"; "Never" = "Nunca"; +// Download Preference Pane +"Downloads" = "Descargas"; +"DataSource" = "Fuente de datos"; +"DataSourceDescription" = "La fuente de datos de Apple la extrae de el sitio web de Apple Developer. Siempre mostrará los últimos lanzamientos disponibles, pero es más frágil.\n\nXcode Releases es una lista no oficial de lanzamientos de Xcode. Se proporciona como datos bien estructurados, contiene información adicional que no está disponible fácilmente en Apple y es menos probable que se rompa si Apple rediseña su sitio web para desarrolladores."; +"Downloader" = "Descargador"; +"DownloaderDescription" = "aria2 usa hasta 16 conexiones para descargar Xcode de 3 a 5 veces más rápido que URLSession. Se incluye como un ejecutable junto con su código fuente dentro de Xcodes para cumplir con su licencia GPLv2.\n\nURLSession es la API predeterminada de Apple para realizar solicitudes de URL."; + // Advanced Preference Pane "Advanced" = "Avanzado"; "LocalCachePath" = "Ruta de caché local"; "LocalCachePathDescription" = "Xcodes almacena en caché versiones de Xcode disponibles y descargas temporalmente las nuevas versiones en un directorio"; "Change" = "Cambiar"; "Active/Select" = "Activar/Seleccionar"; +"InstallDirectory" = "Directorio de instalación"; + +"OnSelectDoNothing" = "Mantener el nombre como Xcode-X.X.X.app"; +"OnSelectDoNothingDescription" = "Al seleccionar, mantener el nombre como la versión p.ej. Xcode-13.4.1.app"; "AutomaticallyCreateSymbolicLink" = "Crear automáticamente enlace simbólico a Xcode.app"; "AutomaticallyCreateSymbolicLinkDescription" = "Al activar/seleccionar una versión de Xcode, intentará crear un enlace simbólico llamado Xcode.app en el directorio de instalación."; -"DataSource" = "Fuente de datos"; -"DataSourceDescription" = "La fuente de datos de Apple la extrae de el sitio web de Apple Developer. Siempre mostrará los últimos lanzamientos disponibles, pero es más frágil.\n\nXcode Releases es una lista no oficial de lanzamientos de Xcode. Se proporciona como datos bien estructurados, contiene información adicional que no está disponible fácilmente en Apple y es menos probable que se rompa si Apple rediseña su sitio web para desarrolladores."; -"Downloader" = "Downloader"; -"DownloaderDescription" = "aria2 usa hasta 16 conexiones para descargar Xcode de 3 a 5 veces más rápido que URLSession. Se incluye como un ejecutable junto con su código fuente dentro de Xcodes para cumplir con su licencia GPLv2.\n\nURLSession es la API predeterminada de Apple para realizar solicitudes de URL."; "PrivilegedHelper" = "Asistente privilegiado"; "PrivilegedHelperDescription" = "Xcodes utiliza un asistente privilegiado independiente para realizar tareas como root. Estas son cosas que requerirían sudo en la línea de comandos, incluidos los pasos posteriores a la instalación y el cambio de versiones de Xcode con xcode-select.\n\nSe le pedirá la contraseña de su cuenta de macOS para instalarlo."; "HelperInstalled" = "El Asistente está instalado"; @@ -91,13 +99,13 @@ "InstallHelper" = "Instalar Asistente"; // Experiment Preference Pane -"Experiments" = "Experiments"; +"Experiments" = "Experimentos"; "FasterUnxip" = "Unxip más rápido"; -"UseUnxipExperiment" = "Al descomprimir, use experiment"; +"UseUnxipExperiment" = "Al descomprimir, usar experimento"; "FasterUnxipDescription" = "Gracias a @_saagarjha, este experimento puede aumentar la velocidad de liberación hasta en un 70 % para algunos sistemas.\n\nPuede ver más información sobre cómo se logra esto en el repositorio de unxip: https://github.com/saagarjha/unxip"; // Notifications -"AccessGranted" = "Access Permitido. Recibirás notificaciones de Xcodes."; +"AccessGranted" = "Acceso Permitido. Recibirás notificaciones de Xcodes."; "AccessDenied" = "⚠️ Acceso Denegado ⚠️\n\nPor favor abra su Configuración de notificaciones y seleccione Xcodes si desea permitir el acceso."; "NotificationSettings" = "Configuración de las notificaciones"; "EnableNotifications" = "Permitir notificaciones"; @@ -114,7 +122,7 @@ "SendSMS" = "Enviar SMS"; "EnterDigitCodeDescription" = "Ingrese el código de dígito %d enviado a %@: "; "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/en-ca/HT204915."; +"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."; // MainWindow "UpdatedAt" = "Actualizado en"; diff --git a/Xcodes/Resources/fi.lproj/Localizable.strings b/Xcodes/Resources/fi.lproj/Localizable.strings index f12d770..905a1e0 100644 --- a/Xcodes/Resources/fi.lproj/Localizable.strings +++ b/Xcodes/Resources/fi.lproj/Localizable.strings @@ -16,6 +16,7 @@ "OpenDescription" = "Avaa tämä versio"; "CopyPath" = "Kopioi polku"; "CreateSymLink" = "Luo Symlink nimellä Xcode.app"; +"CreateSymLinkBeta" = "Luo Symlink nimellä Xcode-Beta.app"; "Uninstall" = "Poista"; "Selected" = "Valittu"; "Select" = "Valitse"; @@ -71,6 +72,13 @@ "LastChecked" = "Viimeksi tarkistettu: %@"; "Never" = "Ei koskaan"; +// Download Preference Pane +"Downloads" = "Lataukset"; +"DataSource" = "Tietolähde"; +"DataSourceDescription" = "Applen tietolähde kaappaa Apple Developer -sivuston. Se näyttää aina uusimmat saatavilla olevat julkaisut, mutta se on herkempi hajoamiselle.\n\nXcode Releases on epävirallinen luettelo Xcode-julkaisuista. Se toimitetaan hyvin muotoiltuina tietoina, sisältää lisätietoa, jota ei ole helposti saatavilla Applelta, ja se ei todennäköisesti hajoa, jos Apple suunnittelee uudelleen kehittäjäsivustonsa."; +"Downloader" = "Downloader"; +"DownloaderDescription" = "aria2 käyttää jopa 16 yhteyttä ladatakseen Xcoden 3–5 kertaa nopeammin kuin URLSession. Se on niputettu suoritettavaksi tiedostoksi ja sen lähdekoodiin Xcodesissa GPLv2-lisenssin noudattamiseksi.\n\nURLSession on Applen oletussovellusliittymä URL-pyyntöjen tekemiseen.."; + // Advanced Preference Pane "Advanced" = "Lisäasetukset"; "LocalCachePath" = "Paikallisen välimuistin polku"; @@ -79,10 +87,6 @@ "Active/Select" = "Aktiivinen/Valitse"; "AutomaticallyCreateSymbolicLink" = "Luo automaattisesti symbolinen linkki Xcode.appiin"; "AutomaticallyCreateSymbolicLinkDescription" = "Kun teet Xcode-versiosta aktiivisen/valitun, yritä luoda symbolinen linkki nimeltä Xcode.app asennushakemistoon"; -"DataSource" = "Tietolähde"; -"DataSourceDescription" = "Applen tietolähde kaappaa Apple Developer -sivuston. Se näyttää aina uusimmat saatavilla olevat julkaisut, mutta se on herkempi hajoamiselle.\n\nXcode Releases on epävirallinen luettelo Xcode-julkaisuista. Se toimitetaan hyvin muotoiltuina tietoina, sisältää lisätietoa, jota ei ole helposti saatavilla Applelta, ja se ei todennäköisesti hajoa, jos Apple suunnittelee uudelleen kehittäjäsivustonsa."; -"Downloader" = "Downloader"; -"DownloaderDescription" = "aria2 käyttää jopa 16 yhteyttä ladatakseen Xcoden 3–5 kertaa nopeammin kuin URLSession. Se on niputettu suoritettavaksi tiedostoksi ja sen lähdekoodiin Xcodesissa GPLv2-lisenssin noudattamiseksi.\n\nURLSession on Applen oletussovellusliittymä URL-pyyntöjen tekemiseen.."; "PrivilegedHelper" = "Etuoikeutettu auttaja"; "PrivilegedHelperDescription" = "Xcodes käyttää erillistä etuoikeutettua avustajaa tehtävien suorittamiseen pääkäyttäjänä. Nämä ovat asioita, jotka edellyttävät sudo komentoa komentorivillä, mukaan lukien asennuksen jälkeiset vaiheet ja Xcode-versioiden vaihtaminen xcode-selectillä.\n\nSinua pyydetään antamaan macOS-tilisi salasana sen asentamiseksi."; "HelperInstalled" = "Apulainen on asennettu"; @@ -113,7 +117,7 @@ "SendSMS" = "Lähetä tekstiviesti"; "EnterDigitCodeDescription" = "Anna %d numeroinen koodi, joka lähetettiin osoitteeseen %@: "; "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/en-ca/HT204915."; +"NoTrustedPhones" = "Tililläsi ei ole luotettuja puhelinnumeroita, mutta ne vaaditaan kaksivaiheiseen todentamiseen.\n\nKatso https://support.apple.com/HT204915."; // MainWindow "UpdatedAt" = "Päivitetty ajankohtana"; diff --git a/Xcodes/Resources/fr.lproj/Localizable.strings b/Xcodes/Resources/fr.lproj/Localizable.strings index d9e5270..0e619ef 100644 --- a/Xcodes/Resources/fr.lproj/Localizable.strings +++ b/Xcodes/Resources/fr.lproj/Localizable.strings @@ -17,6 +17,7 @@ "OpenDescription" = "Ouvrir cette version"; "CopyPath" = "Copier le chemin d'accès"; "CreateSymLink" = "Créer un Symlink pour Xcode.app"; +"CreateSymLink" = "Créer un Symlink pour Xcode-Beta.app"; "Uninstall" = "Désinstaller"; "Selected" = "Sélectionné"; "Select" = "Sélectionner"; @@ -72,6 +73,13 @@ "LastChecked" = "Dernière vérification : %@"; "Never" = "Jamais"; +// Download Preference Pane +"Downloads" = "Téléchargements"; +"DataSource" = "Source de Données"; +"DataSourceDescription" = "La source de données Apple analyse le site Web de développeurs d'Apple. Elle contient les dernières versions disponibles, mais est plus fragile.\n\nXcode Releases est une liste non officielle des versions de Xcode. Elle contient des informations supplémentaires qui ne sont pas facilement disponibles auprès d'Apple et est moins susceptible de se briser si Apple refait son site Web de développeurs."; +"Downloader" = "Téléchargeur"; +"DownloaderDescription" = "aria2 utilise jusqu'à 16 connexions pour télécharger Xcode de 3 à 5 fois plus rapidement que URLSession. aria2 est fourni sous forme d'exécutable avec son code source dans Xcodes pour se conformer à sa licence GPLv2.\n\nURLSession est l'API d'Apple utilisée par défaut pour effectuer des requêtes d'URL."; + // Advanced Preference Pane "Advanced" = "Avancé"; "LocalCachePath" = "Cache Local"; @@ -84,10 +92,6 @@ "OnSelectRenameXcode" = "Toujours renommer en Xcode.app"; "OnSelectRenameXcodeDescription" = "À la sélection, toujours essayer de renommer la version active de Xcode en Xcode.app, en renommant l'ancienne Xcode.app avec le nom de version."; -"DataSource" = "Source de Données"; -"DataSourceDescription" = "La source de données Apple analyse le site Web de développeurs d'Apple. Elle contient les dernières versions disponibles, mais est plus fragile.\n\nXcode Releases est une liste non officielle des versions de Xcode. Elle contient des informations supplémentaires qui ne sont pas facilement disponibles auprès d'Apple et est moins susceptible de se briser si Apple refait son site Web de développeurs."; -"Downloader" = "Téléchargeur"; -"DownloaderDescription" = "aria2 utilise jusqu'à 16 connexions pour télécharger Xcode de 3 à 5 fois plus rapidement que URLSession. aria2 est fourni sous forme d'exécutable avec son code source dans Xcodes pour se conformer à sa licence GPLv2.\n\nURLSession est l'API d'Apple utilisée par défaut pour effectuer des requêtes d'URL."; "PrivilegedHelper" = "Assistant Privilégié"; "PrivilegedHelperDescription" = "Xcodes utilise un assistant privilégié distinct pour effectuer des tâches en tant que root. Ce sont des tâches qui nécessiteraient sudo sur la ligne de commande, y compris les étapes de post-installation et le changement de version de Xcode avec xcode-select.\n\nVous serez invité à saisir le mot de passe de votre compte macOS pour l'installer."; "HelperInstalled" = "L'assistant est installé"; @@ -118,7 +122,7 @@ "SendSMS" = "Envoyer un SMS"; "EnterDigitCodeDescription" = "Entrez le code à %d chiffres envoyé à %@ : "; "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/fr-fr/HT204915."; +"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."; // MainWindow "UpdatedAt" = "Mis à jour le "; diff --git a/Xcodes/Resources/hi.lproj/Localizable.strings b/Xcodes/Resources/hi.lproj/Localizable.strings index 28e13b4..22a672d 100644 --- a/Xcodes/Resources/hi.lproj/Localizable.strings +++ b/Xcodes/Resources/hi.lproj/Localizable.strings @@ -16,6 +16,7 @@ "OpenDescription" = "इस संस्करण को खोलें"; "CopyPath" = "पथ की कॉपी करे"; "CreateSymLink" = "Xcode.app के रूप में सिमलिंक बनाएं"; +"CreateSymLinkBeta" = "Xcode-Beta.app के रूप में सिमलिंक बनाएं"; "Uninstall" = "असंस्थापित करे"; "Selected" = "चयनित"; "Select" = "चयन करे"; @@ -71,6 +72,13 @@ "LastChecked" = "पिछली बार चेक किया गया: %@"; "Never" = "कभी नहीं"; +// Download Preference Pane +"Downloads" = "डाउनलोड"; +"DataSource" = "डेटा स्रोत"; +"DataSourceDescription" = "Apple डेटा स्रोत Apple डेवलपर वेबसाइट को स्क्रैप करता है। यह हमेशा नवीनतम रिलीज दिखाएगा जो उपलब्ध हैं, लेकिन अधिक नाजुक है।\n\nXcode Releases Xcode रिलीज़ की एक अनौपचारिक सूची है। यह सुव्यवस्थित डेटा के रूप में प्रदान किया जाता है, इसमें अतिरिक्त जानकारी होती है जो Apple से आसानी से उपलब्ध नहीं होती है, और यदि Apple अपनी डेवलपर वेबसाइट को फिर से डिज़ाइन करता है तो इसके टूटने की संभावना कम होती है।"; +"Downloader" = "डाउनलोडर"; +"DownloaderDescription" = "aria2 URLSession की तुलना में Xcode 3-5x तेजी से डाउनलोड करने के लिए 16 कनेक्शन तक का उपयोग करता है। इसे अपने GPLv2 लाइसेंस का अनुपालन करने के लिए Xcodes के भीतर अपने स्रोत कोड के साथ एक निष्पादन योग्य के रूप में बंडल किया गया है।\n\nURL अनुरोध करने के लिए URLSession डिफ़ॉल्ट Apple API है।"; + // Advanced Preference Pane "Advanced" = "उन्नत"; "LocalCachePath" = "स्थानीय कैश पथ"; @@ -79,10 +87,6 @@ "Active/Select" = "सक्रिय/चयन"; "AutomaticallyCreateSymbolicLink" = "Xcode.app के लिए स्वचालित रूप से प्रतीकात्मक लिंक बनाएं"; "AutomaticallyCreateSymbolicLinkDescription" = "Xcode संस्करण को सक्रिय/चयनित बनाते समय, स्थापना निर्देशिका में Xcode.app नामक एक प्रतीकात्मक लिंक बनाने का प्रयास करें"; -"DataSource" = "डेटा स्रोत"; -"DataSourceDescription" = "Apple डेटा स्रोत Apple डेवलपर वेबसाइट को स्क्रैप करता है। यह हमेशा नवीनतम रिलीज दिखाएगा जो उपलब्ध हैं, लेकिन अधिक नाजुक है।\n\nXcode Releases Xcode रिलीज़ की एक अनौपचारिक सूची है। यह सुव्यवस्थित डेटा के रूप में प्रदान किया जाता है, इसमें अतिरिक्त जानकारी होती है जो Apple से आसानी से उपलब्ध नहीं होती है, और यदि Apple अपनी डेवलपर वेबसाइट को फिर से डिज़ाइन करता है तो इसके टूटने की संभावना कम होती है।"; -"Downloader" = "डाउनलोडर"; -"DownloaderDescription" = "aria2 URLSession की तुलना में Xcode 3-5x तेजी से डाउनलोड करने के लिए 16 कनेक्शन तक का उपयोग करता है। इसे अपने GPLv2 लाइसेंस का अनुपालन करने के लिए Xcodes के भीतर अपने स्रोत कोड के साथ एक निष्पादन योग्य के रूप में बंडल किया गया है।\n\nURL अनुरोध करने के लिए URLSession डिफ़ॉल्ट Apple API है।"; "PrivilegedHelper" = "विशेषाधिकार प्राप्त सहायक"; "PrivilegedHelperDescription" = "Xcodes कार्यों को रूट के रूप में करने के लिए एक अलग विशेषाधिकार प्राप्त सहायक का उपयोग करता है। ये ऐसी चीजें हैं जिनके लिए कमांड लाइन पर sudo की आवश्यकता होगी, जिसमें पोस्ट-इंस्टॉल चरण और xcode-select के साथ Xcode संस्करण स्विच करना शामिल है।\n\nइसे इंस्टॉल करने के लिए आपको अपने macOS अकाउंट पासवर्ड के लिए कहा जाएगा।"; "HelperInstalled" = "सहायक स्थापित है"; @@ -113,7 +117,7 @@ "SendSMS" = "SMS भेजें"; "EnterDigitCodeDescription" = "%@ को भेजा गया %d अंक कोड दर्ज करें: "; "SelectTrustedPhone" = "SMS के द्वारा %d अंक कोड प्राप्त करने के लिए विश्वसनीय फ़ोन नंबर चुनें:"; -"NoTrustedPhones" = "आपके खाते में कोई विश्वसनीय फ़ोन नंबर नहीं है, लेकिन वे दो-कारक प्रमाणीकरण के लिए आवश्यक हैं।\n\nhttps://support.apple.com/en-ca/HT204915 देखें।"; +"NoTrustedPhones" = "आपके खाते में कोई विश्वसनीय फ़ोन नंबर नहीं है, लेकिन वे दो-कारक प्रमाणीकरण के लिए आवश्यक हैं।\n\nhttps://support.apple.com/HT204915 देखें।"; // MainWindow "UpdatedAt" = "पर अपडेट किया गया"; diff --git a/Xcodes/Resources/it.lproj/Localizable.strings b/Xcodes/Resources/it.lproj/Localizable.strings index 353b3d9..e8af7a2 100644 --- a/Xcodes/Resources/it.lproj/Localizable.strings +++ b/Xcodes/Resources/it.lproj/Localizable.strings @@ -16,6 +16,7 @@ "OpenDescription" = "Apri questa versione"; "CopyPath" = "Copia Percorso"; "CreateSymLink" = "Crea Symlink come Xcode.app"; +"CreateSymLinkBeta" = "Crea Symlink come Xcode-Beta.app"; "Uninstall" = "Disinstalla"; "Selected" = "Selezionato"; "Select" = "Seleziona"; @@ -72,6 +73,13 @@ "LastChecked" = "Ultimo controllo: %@"; "Never" = "Mai"; +// Download Preference Pane +"Downloads" = "Downloads"; +"DataSource" = "Sorgente Dati"; +"DataSourceDescription" = "La sorgente dati Apple controlla il sito sviluppatori Apple. Mostra sempre le ultime versioni disponibili, ma è più fragile. Xcode Releases è una lista non ufficiale di versioni di Xcode. E' disponibile con un formato ben strutturato, contiene più in formazioni che non vengono rilasciate da Apple ed è più difficile che smetta di funzionare se Apple ristruttura il suo sito sviluppatori."; +"Downloader" = "Scaricatore"; +"DownloaderDescription" = "aria2 usa fino a 16 connessioni per scaricar Xcode da 3 a 5 volte più veloce di URLSession. E' incluso come eseguibile assieme ai suoi sogenti dentro Xcodes per rispettare la sua licenza GPLv2. \n\nURLSession è l'API di default di Apple per fare richieste a URL remote."; + // Advanced Preference Pane "Advanced" = "Avanzate"; "LocalCachePath" = "Percorso Cache Locale"; @@ -80,10 +88,6 @@ "Active/Select" = "Attivo/Seleziona"; "AutomaticallyCreateSymbolicLink" = "Crea Automaticamente link simbolico a Xcodes.app"; "AutomaticallyCreateSymbolicLinkDescription" = "Quando rendi una versione di Xcode Attiva/Selezionata, prova a fare un link simbolico chiamato nella directory di installazione."; -"DataSource" = "Sorgente Dati"; -"DataSourceDescription" = "La sorgente dati Apple controlla il sito sviluppatori Apple. Mostra sempre le ultime versioni disponibili, ma è più fragile. Xcode Releases è una lista non ufficiale di versioni di Xcode. E' disponibile con un formato ben strutturato, contiene più in formazioni che non vengono rilasciate da Apple ed è più difficile che smetta di funzionare se Apple ristruttura il suo sito sviluppatori."; -"Downloader" = "Scaricatore"; -"DownloaderDescription" = "aria2 usa fino a 16 connessioni per scaricar Xcode da 3 a 5 volte più veloce di URLSession. E' incluso come eseguibile assieme ai suoi sogenti dentro Xcodes per rispettare la sua licenza GPLv2. \n\nURLSession è l'API di default di Apple per fare richieste a URL remote."; "PrivilegedHelper" = "Aiutante Privilegiato"; "PrivilegedHelperDescription" = "Xcodes usa un aiutante privilegiato per svolgere dei compiti come root. Si tratta di comandi che normalmente richiederebbero sudo da linea di comando, incluse fasi di post-install e modificare la versione di Xcode con xcode-select.\n\nTi verrà richiesta la password del tuo account di macOS per installarlo."; "HelperInstalled" = "Aiutante è installato"; @@ -114,7 +118,7 @@ "SendSMS" = "Manda SMS"; "EnterDigitCodeDescription" = "Inserisci il codice di %d cifre inviato a %@: "; "SelectTrustedPhone" = "Seleziona un numero di telefono registrato per ricevere il codice di %d cifre via SMS:"; -"NoTrustedPhones" = "Il tuo account non ha dispositivi registrati, ma è richiesto dall'autenticazione a due fattori.\n\Vedi https://support.apple.com/en-ca/HT204915."; +"NoTrustedPhones" = "Il tuo account non ha dispositivi registrati, ma è richiesto dall'autenticazione a due fattori.\n\Vedi https://support.apple.com/HT204915."; // MainWindow "UpdatedAt" = "Aggiorna a"; diff --git a/Xcodes/Resources/ja.lproj/Localizable.strings b/Xcodes/Resources/ja.lproj/Localizable.strings index abf1026..33cb1c9 100644 --- a/Xcodes/Resources/ja.lproj/Localizable.strings +++ b/Xcodes/Resources/ja.lproj/Localizable.strings @@ -16,6 +16,7 @@ "OpenDescription" = "このバージョンを開く"; "CopyPath" = "パスをコピー"; "CreateSymLink" = "Xcode.appとしてシンボリックリンクを作成"; +"CreateSymLinkBeta" = "Xcode-Beta.appとしてシンボリックリンクを作成"; "Uninstall" = "アンインストール"; "Selected" = "アクティブ"; "Select" = "アクティブにする"; @@ -72,6 +73,13 @@ "LastChecked" = "前回の確認: %@"; "Never" = "なし"; +// Download Preference Pane +"Downloads" = "ダウンロード"; +"DataSource" = "データソース"; +"DataSourceDescription" = "Appleのデータソースは、Apple Developerのウェブサイトをスクレイピングしています。常に最新のリリースが表示されますが、比較的壊れやすくなっています。\n\nXcode Releasesは、非公式なXcodeのリリース一覧です。この一覧は整形されたデータとして提供されます。Appleからは簡単に入手できない特別な情報を含んでおり、AppleがDeveloper ウェブサイトを再設計しても壊れにくくなっています。"; +"Downloader" = "ダウンローダ"; +"DownloaderDescription" = "aria2 は、最大16個の接続を使用して、Xcode を URLSession の3-5 倍のスピードでダウンロードします。GPLv2 ライセンスに準拠するため、Xcodes 内にソースコードと一緒に実行ファイルとしてバンドルされています。\n\nURLSession は、URLリクエストを行うための Apple のデフォルト API です。"; + // Advanced Preference Pane "Advanced" = "上級者向け"; "LocalCachePath" = "ローカルキャッシュパス"; @@ -80,10 +88,6 @@ "Active/Select" = "アクティブ"; "AutomaticallyCreateSymbolicLink" = "Xcode.appへのシンボリックリンクの自動生成"; "AutomaticallyCreateSymbolicLinkDescription" = "Xcodeのバージョンをアクティブにする時、インストール先でXcode.appのシンボリックリンクの作成を試みます。"; -"DataSource" = "データソース"; -"DataSourceDescription" = "Appleのデータソースは、Apple Developerのウェブサイトをスクレイピングしています。常に最新のリリースが表示されますが、比較的壊れやすくなっています。\n\nXcode Releasesは、非公式なXcodeのリリース一覧です。この一覧は整形されたデータとして提供されます。Appleからは簡単に入手できない特別な情報を含んでおり、AppleがDeveloper ウェブサイトを再設計しても壊れにくくなっています。"; -"Downloader" = "ダウンローダ"; -"DownloaderDescription" = "aria2 は、最大16個の接続を使用して、Xcode を URLSession の3-5 倍のスピードでダウンロードします。GPLv2 ライセンスに準拠するため、Xcodes 内にソースコードと一緒に実行ファイルとしてバンドルされています。\n\nURLSession は、URLリクエストを行うための Apple のデフォルト API です。"; "PrivilegedHelper" = "権限のあるヘルパー"; "PrivilegedHelperDescription" = "Xcodesは、rootとしてタスクを実行するために、別の権限のあるヘルパーを使用します。インストール後の手順や xcode-select による Xcode のバージョン切り替えなど、コマンドラインで sudo を必要とするものです。\n\nインストールには、macOS アカウントのパスワードの入力が必要です。"; "HelperInstalled" = "インストール済み"; @@ -114,7 +118,7 @@ "SendSMS" = "SMS を送信"; "EnterDigitCodeDescription" = "%d桁のコードを%@に送信したので入力してください。"; "SelectTrustedPhone" = "信頼できる電話番号を選択し、%d桁のコードをSMSで受信します。"; -"NoTrustedPhones" = "このアカウントに2要素認証に利用する、信頼できる電話番号がありません。\n\n詳しくはこちらをご確認ください。https://support.apple.com/ja-jp/HT204915"; +"NoTrustedPhones" = "このアカウントに2要素認証に利用する、信頼できる電話番号がありません。\n\n詳しくはこちらをご確認ください。https://support.apple.com/HT204915"; // MainWindow "UpdatedAt" = "前回の更新:"; diff --git a/Xcodes/Resources/ko.lproj/Localizable.strings b/Xcodes/Resources/ko.lproj/Localizable.strings index 752d24f..24e0b6d 100644 --- a/Xcodes/Resources/ko.lproj/Localizable.strings +++ b/Xcodes/Resources/ko.lproj/Localizable.strings @@ -16,6 +16,7 @@ "OpenDescription" = "이 버전 열기"; "CopyPath" = "경로 복사하기"; "CreateSymLink" = "Xcode.app과 같은 Symlink 만들기"; +"CreateSymLinkBeta" = "Xcode-Beta.app과 같은 Symlink 만들기"; "Uninstall" = "제거"; "Selected" = "선택됨"; "Select" = "선택"; @@ -72,6 +73,13 @@ "LastChecked" = "마지막 확인 시점: %@"; "Never" = "확인하지 않음"; +// Download Preference Pane +"Downloads" = "다운로드"; +"DataSource" = "데이터 소스"; +"DataSourceDescription" = "Apple 데이터 소스는 Apple Developer 웹사이트를 스크랩합니다. Apple Developer에는 항상 사용 가능한 최신 출시 버전이 표시되지만 취약한 면이 있습니다.\n\nXcode Releases는 비공식적인 Xcode 출시 버전 목록입니다. Xcode Releases에서는 정리된 데이터를 제공하며, Apple에서 쉽게 구할 수 없는 정보를 포함하며 Apple이 Apple Developer를 재설계할 경우에도 안전할 수 있습니다."; +"Downloader" = "다운로더"; +"DownloaderDescription" = "aria2는 최대 16 개의 연결을 사용하여 URLSession보다 3~5배 더 빠르게 Xcode를 다운로드합니다. GPLv2 라이센스를 준수하기 위해 Xcodes 내 소스 코드와 함께 실행 파일 번들로 제공됩니다.\n\nURLSession은 URL 요청을 만들기 위한 기본 Apple API입니다."; + // Advanced Preference Pane "Advanced" = "고급"; "LocalCachePath" = "로컬 캐시 경로"; @@ -80,10 +88,6 @@ "Active/Select" = "기본 버전/선택"; "AutomaticallyCreateSymbolicLink" = "Xcodes.app에 대한 심볼릭 링크 자동 생성"; "AutomaticallyCreateSymbolicLinkDescription" = "Xcode 버전을 기본 버전(활성)/선택됨 상태로 만들 때 설치 디렉토리에 Xcode.app이라는 심볼릭 링크를 만들어 보세요."; -"DataSource" = "데이터 소스"; -"DataSourceDescription" = "Apple 데이터 소스는 Apple Developer 웹사이트를 스크랩합니다. Apple Developer에는 항상 사용 가능한 최신 출시 버전이 표시되지만 취약한 면이 있습니다.\n\nXcode Releases는 비공식적인 Xcode 출시 버전 목록입니다. Xcode Releases에서는 정리된 데이터를 제공하며, Apple에서 쉽게 구할 수 없는 정보를 포함하며 Apple이 Apple Developer를 재설계할 경우에도 안전할 수 있습니다."; -"Downloader" = "다운로더"; -"DownloaderDescription" = "aria2는 최대 16 개의 연결을 사용하여 URLSession보다 3~5배 더 빠르게 Xcode를 다운로드합니다. GPLv2 라이센스를 준수하기 위해 Xcodes 내 소스 코드와 함께 실행 파일 번들로 제공됩니다.\n\nURLSession은 URL 요청을 만들기 위한 기본 Apple API입니다."; "PrivilegedHelper" = "권한을 가진 도우미 (Privileged Helper)"; "PrivilegedHelperDescription" = "Xcodes는 별도의 권한을 가진 도우미를 사용하여 작업을 루트로서 수행합니다. 설치 후 단계와 xcode-select로 Xcode 버전을 전환하는 것과 같이 커맨드 라인에서 sudo가 필요한 작업이 이에 해당합니다.\n\n설치하려면 macOS 계정 암호를 입력하라는 메시지가 표시됩니다."; "HelperInstalled" = "도우미 설치됨"; @@ -114,7 +118,7 @@ "SendSMS" = "SMS 보내기"; "EnterDigitCodeDescription" = "%@(으)로 전송된 %d 자리 코드를 입력하세요."; "SelectTrustedPhone" = "SMS를 통해 %d 자리 코드를 수신하려면 신뢰할 수 있는 전화번호를 선택하세요."; -"NoTrustedPhones" = "계정에 신뢰할 수 있는 전화번호가 없지만 이중 인증(2FA)에 필요합니다.\n\nhttps://support.apple.com/en-ca/HT204915를 참조하세요."; +"NoTrustedPhones" = "계정에 신뢰할 수 있는 전화번호가 없지만 이중 인증(2FA)에 필요합니다.\n\nhttps://support.apple.com/HT204915를 참조하세요."; // MainWindow "UpdatedAt" = "마지막 업데이트 시점"; diff --git a/Xcodes/Resources/nl.lproj/Localizable.strings b/Xcodes/Resources/nl.lproj/Localizable.strings new file mode 100644 index 0000000..2b52b12 --- /dev/null +++ b/Xcodes/Resources/nl.lproj/Localizable.strings @@ -0,0 +1,230 @@ +// Menu +"Menu.About" = "Over Xcodes"; +"Menu.CheckForUpdates" = "Controleren op Updates..."; +"Menu.Acknowledgements" = "Xcodes Dankbetuigingen"; +"Menu.GitHubRepo" = "Xcodes GitHub Repo"; +"Menu.ReportABug" = "Bug Rapporteren"; +"Menu.RequestNewFeature" = "Nieuwe Feature Aanvragen"; + +// Common +"Install" = "Installeren"; +"InstallDescription" = "Installeer deze versie"; +"RevealInFinder" = "Toon in Finder"; +"Active" = "Actief"; +"MakeActive" = "Maak actief"; +"Open" = "Open"; +"OpenDescription" = "Open deze versie"; +"CopyPath" = "Kopieer Pad"; +"CreateSymLink" = "Creëer Symlink als Xcode.app"; +"Uninstall" = "Deinstalleren"; +"Selected" = "Geselecteerd"; +"Select" = "Selecteer"; +"Cancel" = "Annuleren"; +"Next" = "Volgende"; +"Continue" = "Doorgaan"; +"Close" = "Sluiten"; +"OK" = "OK"; + +// Info Pane +"IdenticalBuilds" = "Identieke Builds"; +"IdenticalBuilds.help" = "Soms zijn een prerelease en release versie exact hetzelfde. Xcodes toont deze versies automatisch samen."; + +"ReleaseDate" = "Release Datum"; +"ReleaseNotes" = "Release Notes"; +"ReleaseNotes.help" = "Toon Release Notes"; +"CopyReleaseNoteURL" = "Kopieer URL"; +"Compatibility" = "Compatibiliteit"; +"MacOSRequirement" = "Vereist macOS %@ of hoger"; +"SDKs" = "SDKs"; +"Compilers" = "Compilers"; +"DownloadSize" = "Download Grootte"; +"NoXcodeSelected" = "Geen Xcode Geselecteerd"; + +// 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" = "Stap %1$d van %2$d: %3$@"; +"DownloadingPercentDescription" = "Downloaden: %d%% compleet"; +"StopInstallation" = "Stop installatie"; +"DownloadingError" = "Geen download informatie gevonden"; + +// About +"VersionWithBuild" = "Versie %@ (%@)"; +"GithubRepo" = "GitHub Repo"; +"Acknowledgements" = "Dankbetuigingen"; +"UnxipExperiment" = "Unxip Experiment"; +"License" = "Licentie"; + +// General Preference Pane +"General" = "Algemeen"; +"AppleID" = "Apple ID"; +"SignIn" = "Inloggen"; +"Notifications" = "Notificaties"; + +// Updates Preference Pane +"Updates" = "Updates"; +"Versions" = "Versies"; +"AutomaticInstallNewVersion" = "Installeer nieuwe versies van Xcode automatisch"; +"IncludePreRelease" = "Prerelease/beta versies toestaan"; +"AppUpdates" = "Xcodes.app Updates"; +"CheckForAppUpdates" = "Automatisch controleren op app updates"; +"CheckNow" = "Nu Controleren"; +"LastChecked" = "Laatste controle: %@"; +"Never" = "Nooit"; + +// Advanced Preference Pane +"Advanced" = "Geavanceerd"; +"LocalCachePath" = "Lokaal Cache Pad"; +"LocalCachePathDescription" = "Xcodes cached beschikbare Xcode versies en download tijdelijk nieuwe versies naar een map"; +"Change" = "Wijzig"; +"Active/Select" = "Active/Select"; +"InstallDirectory" = "Installatie Map"; +"InstallPathDescription" = "Xcodes zoekt en installeert naar een enkele map. Standaard (en aanbevolen) is om dit in te stellen op /Applications. Wijzigingen die gemaakt worden in waar Xcode is opgeslagen kan resulteren in niet werkende apps/services. "; + +"OnSelectDoNothing" = "Behoud naam als Xcode-X.X.X.app"; +"OnSelectDoNothingDescription" = "Wanneer ingeschakeld, zal de bestandsnaam altijd het versienummer bevatten. Bijvoorbeeld Xcode-13.4.1.app"; +"AutomaticallyCreateSymbolicLink" = "Creëer automatisch een symbolic link naar Xcode.app"; +"AutomaticallyCreateSymbolicLinkDescription" = "Bij het actief maken/selecteren van een Xcode versie, probeer een symbolic link genaamd Xcode.app te maken in de installatie map"; +"OnSelectRenameXcode" = "Altijd hernoemen naar Xcode.app"; +"OnSelectRenameXcodeDescription" = "Wanneer ingeschakeld, zal automatisch de actieve Xcode hernoemd worden naar Xcode.app, de vorige Xcode.app zal hernoemd worden naar de desbetreffende versie."; + +"DataSource" = "Databron"; +"DataSourceDescription" = "De Apple databron scraped de Apple Developer website. Dit zal altijd de laatste nieuwe versies tonen die beschikbaar zijn, maar is meer foutgevoelig.\n\nXcode Releases is een onofficiële lijst van Xcode releases. Deze lijst wordt gepresenteerd als gevalideerde data en bevat extra informatie die niet beschikbaar is vanuit Apple. Deze databron is minder foutgevoelig en niet afhankelijk van wanneer Apple de developer website aanpast."; +"Downloader" = "Downloader"; +"DownloaderDescription" = "aria2 gebruikt tot 16 verbindingen om Xcode 3-5x sneller te downloaden dan met URLSession. Het is gebundeld als een executable samen met de broncode binnen Xcodes om te voldoen aan de GPLv2 licentie.\n\nURLSession is de standaard Apple API voor het maken van URL verzoeken."; +"PrivilegedHelper" = "Privileged Helper"; +"PrivilegedHelperDescription" = "Xcodes gebruikt een separate privilged helper om taken uit te voeren als root. Dit zijn operaties die een sudo vereisen op de command line, inclusief post-installatie stappen en het wijzigen van Xcode versies met xcode-select.\n\nJe zult worden gevraagd om je macOS account wachtwoord om deze te installeren."; +"HelperInstalled" = "Helper is geïnstalleerd"; +"HelperNotInstalled" = "Helper is niet geïnstalleerd"; +"InstallHelper" = "Installeer helper"; + +// Experiment Preference Pane +"Experiments" = "Experimenten"; +"FasterUnxip" = "Snellere Unxip"; +"UseUnxipExperiment" = "Bij unxipping, gebruik expiriment"; +"FasterUnxipDescription" = "Dankzij @_saagarjha, kan met dit experiment het uitpakken van Xcode tot 70% sneller gaan op sommige systemen.\n\nMeer informatie over hoe dit mogelijk wordt gemaakt kan worden gevonden op de unxip repo - https://github.com/saagarjha/unxip"; + +// Notifications +"AccessGranted" = "Toegang Verleend. Je krijgt notificaties van Xcodes."; +"AccessDenied" = "⚠️ Toegang Geweigerd ⚠️\n\nOpen je Notificatie Instellingen en selecteer Xcodes om toegang te verlenen."; +"NotificationSettings" = "Notificatie Instellingen"; +"EnableNotifications" = "Notificaties Inschakelen"; + +// SignIn +"SignInWithApple" = "Log in met je Apple ID."; +"AppleID" = "AppleID:"; +"Password" = "Wachtwoord:"; +"Required" = "Vereist"; +"SignOut" = "Uitloggen"; + +// 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 %@: "; +"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."; + +// MainWindow +"UpdatedAt" = "Bijgewerkt op"; + +// ToolBar +"Login" = "Inloggen"; +"LoginDescription" = "Open Inloggen"; +"Refresh" = "Verversen"; +"RefreshDescription" = "Ververs Xcode Lijst"; +"All" = "Alles"; +"Release" = "Release"; +"ReleaseOnly" = "Alleen release"; +"Beta" = "Beta"; +"BetaOnly" = "Alleen beta"; +"Filter" = "Filter"; +"FilterAvailableDescription" = "Filter beschikbare versies"; +"FilterInstalledDescription" = "Filter geïnstalleerde versies"; +"Info" = "Info"; +"InfoDescription" = "Show or hide the info pane"; +"Preferences" = "Voorkeuren"; +"PreferencesDescription" = "Open Voorkeuren"; +"Search" = "Zoeken..."; +"SearchDescription" = "Zoek lijst"; + +// List +"ActiveVersionDescription" = "Dit is de actieve versie"; +"MakeActiveVersionDescription" = "Maak dit de actieve versie"; + +// Alerts +// Uninstall +"Alert.Uninstall.Title" = "Xcode %@ deinstalleren?"; +"Alert.Uninstall.Message" = "Het zal worden verplaatst naar de Prullenbak, maar deze zal niet geleegd worden."; +"Alert.Uninstall.Error.Title" = "Kan Xcode niet deinstalleren"; + +// Cancel Install +"Alert.CancelInstall.Title" = "Weet je zeker dat je de installatie van Xcode %@ wilt stoppen?"; +"Alert.CancelInstall.Message" = "Elke voortgang zal worden weggegooid."; +"Alert.CancelInstall.PrimaryButton" = "Stop Installatie"; + +// Privileged Helper +"Alert.PrivilegedHelper.Title" = "Privileged Helper"; +"Alert.PrivilegedHelper.Message" = "Xcodes gebruikt een separate privilged helper om taken uit te voeren als root. Dit zijn operaties die een sudo vereisen op de command line, inclusief post-installatie stappen en het wijzigen van Xcode versies met xcode-select.\n\nJe zult worden gevraagd om je macOS account wachtwoord om deze te installeren."; +"Alert.PrivilegedHelper.Error.Title" = "Kan helper niet installeren"; + +// Min MacOS Supported +"Alert.MinSupported.Title" = "Minimale vereisten niet voldaan"; +"Alert.MinSupported.Message" = "Xcode %@ vereist MacOS %@, maar jouw MacOS versie is %@, wil je doorgaan met installeren?"; + +// Install +"Alert.Install.Error.Title" = "Kan Xcode niet installeren"; +"Alert.InstallArchive.Error.Title" = "Kan gearchiveerde Xcode niet installeren"; + +// Update +"Alert.Update.Error.Title" = "Kan geselecteerde Xcode niet updaten"; + +// Active/Select +"Alert.Select.Error.Title" = "Kan Xcode niet selecteren"; + +// Symbolic Links +"Alert.SymLink.Title" = "Kan geen symbolic link maken"; +"Alert.SymLink.Message" = "Xcode.app bestaat en is geen symbolic link"; + +// Post install +"Alert.PostInstall.Title" = "Kan post-installatie stappen niet uitvoeren"; + +// InstallationErrors +"InstallationError.DamagedXIP" = "Het archief \"%@\" is beschadigd en kan niet worden uitgepakt."; +"InstallationError.NotEnoughFreeSpaceToExpandArchive" = "Het archief \"%@\" kan niet worden uitgepakt omdat het huidige volume niet voldoende vrije schijf ruimte heeft.\n\nMaak meer ruimte beschikbaar om het archief uit te pakken en installeer dan Xcode %@ opnieuw om de installatie voort te zetten."; +"InstallationError.FailedToMoveXcodeToApplications" = "Het is mislukt om Xcode te verplaatsen naar de %@ map."; +"InstallationError.FailedSecurityAssessment" = "De Xcode %@ veiligheidsbeoordeling was onsuccesvol en gaf de volgende melding:\n%@\nXcode blijft geïnstalleerd op %@ als je deze toch wilt gebruiken."; +"InstallationError.CodesignVerifyFailed" = "De gedownloade Xcode is mislukt voor verificatie van code-ondertekening met de volgende melding:\n%@"; +"InstallationError.UnexpectedCodeSigningIdentity" = "De gedownloade Xcode heeft niet de verwachte code-ondertekeningsidentiteit.\nVerkregen:\n%@\n%@\nVerwacht:\n%@\n%@"; +"InstallationError.UnsupportedFileFormat" = "Xcodes heeft (nog) geen ondersteuning om Xcode te installeren vanaf het %@ bestandsformaat."; +"InstallationError.MissingSudoerPassword" = "Wachtwoord ontbreekt. Probeer het opnieuw."; +"InstallationError.UnavailableVersion" = "Kan versie %@ niet vinden."; +"InstallationError.NoNonPrereleaseVersionAvailable" = "Geen niet-prerelease versies beschikbaar."; +"InstallationError.NoPrereleaseVersionAvailable" = "Geen prerelease versies beschikbaar."; +"InstallationError.MissingUsernameOrPassword" = "Ontbrekende gebruikersnaam of wachtwoord. Probeer het opnieuw."; +"InstallationError.VersionAlreadyInstalled" = "%@ is al geïnstalleerd op %@"; +"InstallationError.InvalidVersion" = "%@ is geen geldig versie nummer."; +"InstallationError.VersionNotInstalled" = "%@ is niet geïnstalleerd."; +"InstallationError.PostInstallStepsNotPerformed.Installed" = "De installatie is voltooid, maar sommige post-installatie taken zijn niet uitgevoerd. Deze taken zullen worden uitgevoerd wanneer je Xcode %@ voor het eerst start."; +"InstallationError.PostInstallStepsNotPerformed.NotInstalled" = "De installatie is voltooid, maar sommige post-installatie taken zijn niet uitgevoerd. Xcodes voert deze taken uit door middel van de privileged helper, maar deze lijkt niet te zijn geïnstalleerd. Je kunt deze installeren vanaf Voorkeuren > Geavanceerd.\n\nDeze taken zullen worden uitgevoerd wanneer je Xcode %@ voor het eerst start."; + +// Installation Steps +"Downloading" = "Downloaden"; +"Unarchiving" = "Dearchiveren (Dit kan even duren)"; +"Moving" = "Verplaatsen naar %@"; +"TrashingArchive" = "Bezig met archief naar Prullenbak verplaatsen"; +"CheckingSecurity" = "Beveiliging verificatie"; +"Finishing" = "Finishing"; + +// Notifications +"Notification.NewVersionAvailable" = "Nieuwe versie beschikbaar"; +"Notification.FinishedInstalling" = "Installatie voltooid"; + + +"HelperClient.error" = "Kan niet communiceren met de privileged helper."; +///++ +// Notifications +"Notification.NewXcodeVersion.Title" = "Nieuwe Xcode versies"; +"Notification.NewXcodeVersion.Body" = "Nieuwe Xcode versies zijn beschikbaar om te downloaden."; + +// WWDC +"WWDC.Message" = "👨🏻‍💻👩🏼‍💻 Happy WWDC %@! 👨🏽‍💻🧑🏻‍💻"; diff --git a/Xcodes/Resources/pt-BR.lproj/Localizable.strings b/Xcodes/Resources/pt-BR.lproj/Localizable.strings new file mode 100644 index 0000000..68e69cf --- /dev/null +++ b/Xcodes/Resources/pt-BR.lproj/Localizable.strings @@ -0,0 +1,222 @@ +// Menu +"Menu.About" = "Sobre Xcodes"; +"Menu.CheckForUpdates" = "Verificar atualizações..."; +"Menu.Acknowledgements" = "Menções de Xcodes"; +"Menu.GitHubRepo" = "Repositório Xcodes no GitHub"; +"Menu.ReportABug" = "Reportar um bug"; +"Menu.RequestNewFeature" = "Requerir uma nova funcionalidade"; + +// Common +"Install" = "Instalar"; +"InstallDescription" = "Instalar esta versão"; +"RevealInFinder" = "Abrir no Finder"; +"Active" = "Ativo"; +"MakeActive" = "Ativar"; +"Open" = "Abrir"; +"OpenDescription" = "Abrir essa versão"; +"CopyPath" = "Copiar caminho"; +"CreateSymLink" = "Criar Symlink como Xcode.app"; +"Uninstall" = "Desinstalar"; +"Selected" = "Selecionado(s)"; +"Select" = "Selecionar"; +"Cancel" = "Cancelar"; +"Next" = "Próximo"; +"Continue" = "Continuar"; +"Close" = "Fechar"; +"OK" = "OK"; + +// Info Pane +"IdenticalBuilds" = "Builds idênticos"; +"IdenticalBuilds.help" = "As vezes, uma versão pré-lançamento e uma versão de lançamento são exatemente o mesmo build. Xcodes mostrará essas versões juntas automaticamente."; + +"ReleaseDate" = "Data de lançamento"; +"ReleaseNotes" = "Notas de lançamento"; +"ReleaseNotes.help" = "Visualizar notas de lançamento"; +"Compatibility" = "Compatibilidade"; +"MacOSRequirement" = "Necessário macOS %@ ou mais recente"; +"SDKs" = "SDKs"; +"Compilers" = "Compiladores"; +"DownloadSize" = "Tamanho do download"; +"NoXcodeSelected" = "Nenhum Xcode selecionado"; + + +// 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" = "Passo %1$d de %2$d: %3$@"; +"DownloadingPercentDescription" = "Baixando: %d%% finalizado"; +"StopInstallation" = "Interromper instalação"; +"DownloadingError" = "Nenhuma informação de download encontrada"; + +// About +"VersionWithBuild" = "Versão %@ (%@)"; +"GithubRepo" = "Repositório GitHub"; +"Acknowledgements" = "Menções"; +"UnxipExperiment" = "Experimento Unxip"; +"License" = "Licensa"; + +// General Preference Pane +"General" = "Ajustes"; +"AppleID" = "Apple ID"; +"SignIn" = "Entrar"; +"Notifications" = "Notificações"; + +// Updates Preference Pane +"Updates" = "Atualizações"; +"Versions" = "Versões"; +"AutomaticInstallNewVersion" = "Instalar novas versões do Xcode automaticamente"; +"IncludePreRelease" = "Incluir versōes pré-lançamento/beta"; +"AppUpdates" = "Atualizações de Xcodes.app"; +"CheckForAppUpdates" = "Verificar atualizações do app automaticamente"; +"CheckNow" = "Verificar agora"; +"LastChecked" = "Ultima vez verificado: %@"; +"Never" = "Nunca"; + +// Advanced Preference Pane +"Advanced" = "Avançado"; +"LocalCachePath" = "Caminho de caches local"; +"LocalCachePathDescription" = "Xcodes faz caches de versões disponíveis do Xcode e baixa temporariamente estas novas versões para um diretório."; +"Change" = "Alterar"; +"Active/Select" = "Ativo/Selecionar"; +"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."; +"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"; +"PrivilegedHelperDescription" = "Xcodes usa um ajudante privilegiado separado para performar atividades como raiz. São atividades que iriam requerir sudo na linha de comando, incluindo passos pós-instalação e trocar versões do Xcode com xcode-select.\n\nVocê será pedido para instalá-lo na sua conta do macOS."; +"HelperInstalled" = "Ajudante está instalado"; +"HelperNotInstalled" = "Ajudante não está instalado"; +"InstallHelper" = "Instalar ajudante"; + +// Experiment Preference Pane +"Experiments" = "Experiments"; +"FasterUnxip" = "Unxip mais rápido"; +"UseUnxipExperiment" = "Quando performar unxipping, use experiment"; +"FasterUnxipDescription" = "Graças à @_saagarjha, esse experimento pode acelerar o unxip em até 70% para algum sistemas.\n\nMais informações sobre como isso ocorre pode ser encontrada no repositório do unxip - https://github.com/saagarjha/unxip"; + +// Notifications +"AccessGranted" = "Acesso autorizado. Você receberá notificações de Xcodes."; +"AccessDenied" = "⚠️ Acesso negado ⚠️\n\nPor favor, abra suas configurações de notificação e selecione Xcodes se você deseja autorizar o acesso."; +"NotificationSettings" = "Configurações de notificação"; +"EnableNotifications" = "Ativar notificações"; + +// SignIn +"SignInWithApple" = "Entrar com o seu Apple ID."; +"AppleID" = "AppleID:"; +"Password" = "Senha:"; +"Required" = "Obrigatório"; +"SignOut" = "Sair"; + +// 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 %@: "; +"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."; + +// MainWindow +"UpdatedAt" = "Atualizado em"; + +// ToolBar +"Login" = "Login"; +"LoginDescription" = "Abrir login"; +"Refresh" = "Atualizar"; +"RefreshDescription" = "Atualizar lista de Xcode"; +"All" = "Todos"; +"Release" = "Release"; +"ReleaseOnly" = "Somente release"; +"Beta" = "Beta"; +"BetaOnly" = "Somente beta"; +"Filter" = "Filtrar"; +"FilterAvailableDescription" = "Filtrar versões disponíveis"; +"FilterInstalledDescription" = "Filtrar versões instaladas"; +"Info" = "Informação"; +"InfoDescription" = "Mostrar ou esconder o painel de informações"; +"Preferences" = "Preferências"; +"PreferencesDescription" = "Abrir preferências"; +"Search" = "Procurar..."; +"SearchDescription" = "Lista de procura"; + +// List +"ActiveVersionDescription" = "Essa é a versão ativa"; +"MakeActiveVersionDescription" = "Ativar esta versão"; + +// Alerts +// Uninstall +"Alert.Uninstall.Title" = "Desinstalar Xcode %@?"; +"Alert.Uninstall.Message" = "Será movido para a lixeira, mas não será esvaziada."; +"Alert.Uninstall.Error.Title" = "Não foi possível desinstalar o Xcode"; + +// Cancel Install +"Alert.CancelInstall.Title" = "Tem certeza que deseja interromper a instalação do Xcode %@?"; +"Alert.CancelInstall.Message" = "Todo progresso será descartado."; +"Alert.CancelInstall.PrimaryButton" = "Interromper instalação"; + +// Privileged Helper +"Alert.PrivilegedHelper.Title" = "Ajudante privilegiado"; +"Alert.PrivilegedHelper.Message" = "Xcodes usa um ajudante privilegiado separado para realizar tarefas como root (raíz). São tarefas onde seria necessário permissão de super usuário (sudo) na linha de comando, incluindo comandos de pós-instalação e trocar versões de Xcode com xcode-select.\n\nVocê deverá inserir sua senha do macOS para instalá-lo."; +"Alert.PrivilegedHelper.Error.Title" = "Não foi possível instalar o ajudante"; + +// Min MacOS Supported +"Alert.MinSupported.Title" = "Requerimentos mínimos não satisfeitos."; +"Alert.MinSupported.Message" = "Xcode %@ requere MacOS %@, mas você está rodando MacOS %@, você ainda quer instalá-lo?"; + +// Install +"Alert.Install.Error.Title" = "Não foi possível instalar o Xcode"; +"Alert.InstallArchive.Error.Title" = "Não foi possível instalar o Xcode arquivado"; + +// Update +"Alert.Update.Error.Title" = "Não foi possível atualizar o Xcode selecionado"; + +// Active/Select +"Alert.Select.Error.Title" = "Não foi possível selecionar Xcode"; + +// Symbolic Links +"Alert.SymLink.Title" = "Não foi possível criar link simbólico"; +"Alert.SymLink.Message" = "Xcode.app existe e não é um link simbólico"; + +// Post install +"Alert.PostInstall.Title" = "Não foi possível realizar os comandos de pós-instalação"; + +// InstallationErrors +"InstallationError.DamagedXIP" = "O arquivamento \"%@\" está danificado e não pode ser expandido."; +"InstallationError.NotEnoughFreeSpaceToExpandArchive" = "O arquivamento \"%@\" não pode ser expandido porquê o volume atual não possui espaço disponível o suficiente.\n\nLibere espaço para expandir o arquivamento e então instale o Xcode %@ novamente para iniciar uma instalação de onde você parou."; +"InstallationError.FailedToMoveXcodeToApplications" = "Falha ao mover Xcode para o diretório: %@"; +"InstallationError.FailedSecurityAssessment" = "Xcode %@ falhou suas checagens de segurança com a seguinte saída:\n%@\nAinda está instalado em %@ se você deseja usar ainda assim."; +"InstallationError.CodesignVerifyFailed" = "O Xcode baixado falhou a verificação de assinatura de código (code signing) com a seguinte saída:\n%@"; +"InstallationError.UnexpectedCodeSigningIdentity" = "O Xcode baixado não possui a identidade de assinatura de código esperada.\nPossui:\n%@\n%@\nEsperada:\n%@\n%@"; +"InstallationError.UnsupportedFileFormat" = "Xcodes (ainda) não suporta instalação de Xcode no formato de arquivo %@."; +"InstallationError.MissingSudoerPassword" = "Faltando senha. Por favor, tente novamente."; +"InstallationError.UnavailableVersion" = "Não foi possível encontrar versão %@."; +"InstallationError.NoNonPrereleaseVersionAvailable" = "Nenhuma versão não-pré-lançamento disponível."; +"InstallationError.NoPrereleaseVersionAvailable" = "Nenhuma versão de pré-lançamento disponível."; +"InstallationError.MissingUsernameOrPassword" = "Faltando usuário ou senha. Por favor, tente novamente."; +"InstallationError.VersionAlreadyInstalled" = "%@ já está instalada em %@"; +"InstallationError.InvalidVersion" = "%@ não é uma versão válida."; +"InstallationError.VersionNotInstalled" = "%@ não está instalada."; +"InstallationError.PostInstallStepsNotPerformed.Installed" = "A instalação foi completada, mas alguns passos de pós-instalação não puderam ser performados automaticamente. Estes serão performados quando você rodar o Xcode %@ pela primeira vez."; +"InstallationError.PostInstallStepsNotPerformed.NotInstalled" = "A instalação foi completada, mas alguns passos de pós-instalação não puderam ser performados automaticamente. Xcodes performa estes passos com o ajudante privilegiado, que aparentemente não está instalado. Você pode instalá-lo em Preferências > Avançado.\n\nEstes passos serão performados quando você rodar o Xcode %@ pela primeira vez."; + +// Installation Steps +"Downloading" = "Baixando"; +"Unarchiving" = "Desarquivando (Pode demorar um pouco)"; +"Moving" = "Movendo para %@"; +"TrashingArchive" = "Movendo arquivo para a lixeira"; +"CheckingSecurity" = "Verificação de segurança"; +"Finishing" = "Finalizando"; + +// Notifications +"Notification.NewVersionAvailable" = "Nova versão disponível"; +"Notification.FinishedInstalling" = "Instalação finalizada"; + + +"HelperClient.error" = "Não foi possível se comunicar com o ajudante."; +///++ +// Notifications +"Notification.NewXcodeVersion.Title" = "Novas versões do Xcode"; +"Notification.NewXcodeVersion.Body" = "Novas versões do Xcode estão disponíveis para baixar"; + +// WWDC +"WWDC.Message" = "👨🏻‍💻👩🏼‍💻 Feliz WWDC %@! 👨🏽‍💻🧑🏻‍💻"; diff --git a/Xcodes/Resources/ru.lproj/Localizable.strings b/Xcodes/Resources/ru.lproj/Localizable.strings index e9ebb75..e785967 100644 --- a/Xcodes/Resources/ru.lproj/Localizable.strings +++ b/Xcodes/Resources/ru.lproj/Localizable.strings @@ -16,6 +16,7 @@ "OpenDescription" = "Открыть эту версию"; "CopyPath" = "Копировать путь"; "CreateSymLink" = "Создать символическую ссылку к Xcode.app"; +"CreateSymLinkBeta" = "Создать символическую ссылку к Xcode-Beta.app"; "Uninstall" = "Удалить"; "Selected" = "Выбрано"; "Select" = "Выбрать"; @@ -72,6 +73,13 @@ "LastChecked" = "Последняя проверка: %@"; "Never" = "Никогда"; +// Download Preference Pane +"Downloads" = "Загрузки"; +"DataSource" = "Источник данных"; +"DataSourceDescription" = "Источник данных Apple применяет технологию \"веб-скрейпинга\" к веб-сайту Apple для разработчиков. Он всегда показывает последние доступные выпуски, но является менее стабильным источником данных.\n\nXcode Releases — это неофициальный список выпусков Xcode. Он предоставляется в виде удобно структурированных данных, содержит дополнительную информацию, которую не всегда можно получить от Apple и который с меньшей вероятностью перестанет работать, если Apple изменит дизайн своего веб-сайта для разработчиков."; +"Downloader" = "Загрузчик"; +"DownloaderDescription" = "aria2 использует до 16 подключений для загрузки Xcode в 3-5 раз быстрее, чем URLSession. Он поставляется в виде исполняемого файла вместе с исходным кодом в Xcodes, чтобы соответствовать лицензии GPLv2.\n\nURLSession — это API Apple по умолчанию для выполнения запросов по сети."; + // Advanced Preference Pane "Advanced" = "Дополнительно"; "LocalCachePath" = "Путь к локальному кешу"; @@ -88,10 +96,6 @@ "OnSelectRenameXcode" = "Всегда переименовывать в Xcode.app"; "OnSelectRenameXcodeDescription" = "Если выбрано, будет выполнена попытка переименовать активный Xcode в Xcode.app, а предыдущий Xcode.app в формат имени с версией."; -"DataSource" = "Источник данных"; -"DataSourceDescription" = "Источник данных Apple применяет технологию \"веб-скрейпинга\" к веб-сайту Apple для разработчиков. Он всегда показывает последние доступные выпуски, но является менее стабильным источником данных.\n\nXcode Releases — это неофициальный список выпусков Xcode. Он предоставляется в виде удобно структурированных данных, содержит дополнительную информацию, которую не всегда можно получить от Apple и который с меньшей вероятностью перестанет работать, если Apple изменит дизайн своего веб-сайта для разработчиков."; -"Downloader" = "Загрузчик"; -"DownloaderDescription" = "aria2 использует до 16 подключений для загрузки Xcode в 3-5 раз быстрее, чем URLSession. Он поставляется в виде исполняемого файла вместе с исходным кодом в Xcodes, чтобы соответствовать лицензии GPLv2.\n\nURLSession — это API Apple по умолчанию для выполнения запросов по сети."; "PrivilegedHelper" = "Привилегированный помощник"; "PrivilegedHelperDescription" = "Xcodes использует отдельный привилегированный помощник для выполнения задач от имени root-пользователя. Это команды, которые потребуют sudo в командной строке, включая шаги после установки и переключение версий Xcode с помощью xcode-select.\n\nВам будет предложено указать пароль от вашей учетной записи macOS для его установки."; "HelperInstalled" = "Помощник установлен"; @@ -122,7 +126,7 @@ "SendSMS" = "Отправить SMS"; "EnterDigitCodeDescription" = "Введите %d цифровой код, отправленный на %@: "; "SelectTrustedPhone" = "Выберите доверенный номер телефона для получения %d цифрового кода по SMS:"; -"NoTrustedPhones" = "В вашем аккаунтe нет доверенных телефонных номеров, но они необходимы для двухфакторной аутентификации.\n\nСм. https://support.apple.com/en-ca/HT204915."; +"NoTrustedPhones" = "В вашем аккаунтe нет доверенных телефонных номеров, но они необходимы для двухфакторной аутентификации.\n\nСм. https://support.apple.com/HT204915."; // MainWindow "UpdatedAt" = "Обновлено в"; diff --git a/Xcodes/Resources/tr.lproj/Localizable.strings b/Xcodes/Resources/tr.lproj/Localizable.strings index cb901ac..fd192fd 100644 --- a/Xcodes/Resources/tr.lproj/Localizable.strings +++ b/Xcodes/Resources/tr.lproj/Localizable.strings @@ -16,6 +16,7 @@ "OpenDescription" = "Bu sürümü aç"; "CopyPath" = "Yolu Kopyala"; "CreateSymLink" = "Xcode.app olarak sembolik link yarat"; +"CreateSymLinkBeta" = "Xcode-Beta.app olarak sembolik link yarat"; "Uninstall" = "Kaldır"; "Selected" = "Seçili"; "Select" = "Seç"; @@ -72,6 +73,13 @@ "LastChecked" = "Son kontrol: %@"; "Never" = "Daha Yeni"; +// Download Preference Pane +"Downloads" = "İndirilenler"; +"DataSource" = "Veri Kaynağı"; +"DataSourceDescription" = "Apple veri kaynağı Apple'ın geliştirici sitesini inceliyor. Uygun olan en son sürümleri gösterir, ama biraz daha hassastır.\n\nXcode Releases, Xcode sürümlerinin bulunduğu resmi olmayan bir listedir. Data düzenli bir formata sahip bilgileri barındırır, Apple tarafında olmayan ek bilgileri içerir ve Apple'ın ileride sitesini değiştireceği için bozabileceği bir kaynak değildir."; +"Downloader" = "Yükleyici"; +"DownloaderDescription" = "aria2 16ya kadar bağlantı kullanarak Xcode'u URLSession'a göre 3-5 kat daha hızlı indirir. Çalıştırılabilir bir dosya olarak Bundle'a dahildir ve kaynak dosyaları GPLv2 lisansıyla uyumlu olması açısından Xcode içerisinde yer alır.\n\nURLSession Apple'ın URL istekleri oluşturmak için sunduğu varsayılan API'dır."; + // Advanced Preference Pane "Advanced" = "Gelişmiş"; "LocalCachePath" = "Lokal Önbellek Konumu"; @@ -87,11 +95,6 @@ "AutomaticallyCreateSymbolicLinkDescription" = "Bir Xcode sürümünü Aktif/Seç yaparken Xcode.app ismindeki uygulamanın sembolik linkini yükleme klasörüne otomatik oluşturmayı dene"; "OnSelectRenameXcode" = "Her zaman Xcode.app şeklinde ismi değiştir"; "OnSelectRenameXcodeDescription" = "Seçildiğinde, aktif olan Xcode'u Xcode.app olarak isimlendirmeye çalışır ve eski Xcode ismine sürüm ismi ekler."; - -"DataSource" = "Veri Kaynağı"; -"DataSourceDescription" = "Apple veri kaynağı Apple'ın geliştirici sitesini inceliyor. Uygun olan en son sürümleri gösterir, ama biraz daha hassastır.\n\nXcode Releases, Xcode sürümlerinin bulunduğu resmi olmayan bir listedir. Data düzenli bir formata sahip bilgileri barındırır, Apple tarafında olmayan ek bilgileri içerir ve Apple'ın ileride sitesini değiştireceği için bozabileceği bir kaynak değildir."; -"Downloader" = "Yükleyici"; -"DownloaderDescription" = "aria2 16ya kadar bağlantı kullanarak Xcode'u URLSession'a göre 3-5 kat daha hızlı indirir. Çalıştırılabilir bir dosya olarak Bundle'a dahildir ve kaynak dosyaları GPLv2 lisansıyla uyumlu olması açısından Xcode içerisinde yer alır.\n\nURLSession Apple'ın URL istekleri oluşturmak için sunduğu varsayılan API'dır."; "PrivilegedHelper" = "Ayrıcalıklı Yardımcı"; "PrivilegedHelperDescription" ="Xcodes, root görevlerini yerine getirmek için bir Ayrıcalıklı yardımcı aracı kullanır. Bunlar komut satırındaki sudo gerektiren, yükleme sonrası adımlarını sağlayan ve Xcode sürümü değiştiren xcode-select gibi komutlardan ibarettir.\n\nBunu yüklemek için macOS hesap şifrenizi girmeniz istenecektir."; "HelperInstalled" = "Yardımcı yüklendi"; @@ -122,7 +125,7 @@ "SendSMS" = "SMS Gönder"; "EnterDigitCodeDescription" = "%@ kaynağından gönderilen %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/tr-tr/HT204915 adresine bakın."; +"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."; // MainWindow "UpdatedAt" = "Güncellenme Zamanı:"; diff --git a/Xcodes/Resources/uk.lproj/Localizable.strings b/Xcodes/Resources/uk.lproj/Localizable.strings index 33bf2af..8dd8df7 100644 --- a/Xcodes/Resources/uk.lproj/Localizable.strings +++ b/Xcodes/Resources/uk.lproj/Localizable.strings @@ -16,6 +16,7 @@ "OpenDescription" = "Запустити цю версію"; "CopyPath" = "Скопіювати шлях"; "CreateSymLink" = "Створити символічну ссилку як Xcode.app"; +"CreateSymLinkBeta" = "Створити символічну ссилку як Xcode-Beta.app"; "Uninstall" = "Видалити"; "Selected" = "Обрано"; "Select" = "Обрати"; @@ -71,6 +72,13 @@ "LastChecked" = "Перевірено в останнє: %@"; "Never" = "Ніколи"; +// Download Preference Pane +"Downloads" = "Завантаження"; +"DataSource" = "Джерело інформації"; +"DataSourceDescription" = "Apple – cканування порталу Apple Developer у пошуку доступних версій Xcode. Створюючи список усих нових релізів, але це не завжи спрацьовує.\n\nXcode Releases – це не офіційний список релізів Xcode. Він являє собою відформатований список, що також має додаткову інформацію не завжди доступну напряму з сайту Apple, і менш ймовірно що він зламається якщо Apple випустить редизайн Developer Portal"; +"Downloader" = "Завантажувач"; +"DownloaderDescription" = "aria2 може використовувати до 16 з'єднань, завантажуючи Xcode у 3-5 разів швидше ніж URLSession. Вона поставляється у вигляді бінарника та коду, відповідно до вимог її GPLv2 ліцензії.\n\nURLSession – це завантажувач по замовчуванню від Apple"; + // Advanced Preference Pane "Advanced" = "Розширені"; "LocalCachePath" = "Локальний Кеш"; @@ -79,10 +87,6 @@ "Active/Select" = "Акивний/Обрати"; "AutomaticallyCreateSymbolicLink" = "Автоматично створювати символічну ссилку Xcode.app"; "AutomaticallyCreateSymbolicLinkDescription" = "Обираючи Акивний Xcode, спробувати створити символічну ссилку Xcode.app що вказує на обрану версію. Ссилка буде розміщена у папці інсталяції Xcode"; -"DataSource" = "Джерело інформації"; -"DataSourceDescription" = "Apple – cканування порталу Apple Developer у пошуку доступних версій Xcode. Створюючи список усих нових релізів, але це не завжи спрацьовує.\n\nXcode Releases – це не офіційний список релізів Xcode. Він являє собою відформатований список, що також має додаткову інформацію не завжди доступну напряму з сайту Apple, і менш ймовірно що він зламається якщо Apple випустить редизайн Developer Portal"; -"Downloader" = "Завантажувач"; -"DownloaderDescription" = "aria2 може використовувати до 16 з'єднань, завантажуючи Xcode у 3-5 разів швидше ніж URLSession. Вона поставляється у вигляді бінарника та коду, відповідно до вимог її GPLv2 ліцензії.\n\nURLSession – це завантажувач по замовчуванню від Apple"; "PrivilegedHelper" = "Privileged Helper"; "PrivilegedHelperDescription" = "Xcodes використовує спеціальний \"privilege helper\" щоб запускати задачі як суперюзер. Це включає наприклад sudo в терміналі, та кроки після інсталяції або перемикання версії Xcode за допомогою xcode-select.\n\nБуде запит на ваш пароль від Мак щоб встановити цей хелпер."; "HelperInstalled" = "Helper встановлено"; @@ -113,7 +117,7 @@ "SendSMS" = "Надіслати СМС"; "EnterDigitCodeDescription" = "Введіть %d-значний код відправлений на %@:"; "SelectTrustedPhone" = "Виберіть довірений номер телефону щоб отримати %d-значний код в СМС:"; -"NoTrustedPhones" = "Ваш аккаунт не має перевіреного телефонного номеру, що вимагається для двофакторної авторизації.\n\nДивіться https://support.apple.com/en-ca/HT204915."; +"NoTrustedPhones" = "Ваш аккаунт не має перевіреного телефонного номеру, що вимагається для двофакторної авторизації.\n\nДивіться https://support.apple.com/HT204915."; // MainWindow "UpdatedAt" = "Оновлено о"; diff --git a/Xcodes/Resources/zh-Hans.lproj/Localizable.strings b/Xcodes/Resources/zh-Hans.lproj/Localizable.strings index 7b991b7..c18bb9d 100644 --- a/Xcodes/Resources/zh-Hans.lproj/Localizable.strings +++ b/Xcodes/Resources/zh-Hans.lproj/Localizable.strings @@ -16,6 +16,7 @@ "OpenDescription" = "打开此版本"; "CopyPath" = "复制文件位置"; "CreateSymLink" = "以Xcode.app创建软链接"; +"CreateSymLinkBeta" = "以Xcode-Beta.app创建软链接"; "Uninstall" = "卸载"; "Selected" = "已选定"; "Select" = "选定"; @@ -72,6 +73,13 @@ "LastChecked" = "上次检查时间:%@"; "Never" = "从未检查"; +// Download Preference Pane +"Downloads" = "下载"; +"DataSource" = "数据源"; +"DataSourceDescription" = "Apple数据源是从Apple开发者网站爬取的。它会及时反应最新版本,但较为脆弱。\n\nXcode Releases是一个非官方的Xcode版本列表。它提供了良好格式化的数据,包含了不便从Apple直接获得的附加信息,且更不容易在Apple开发者网站无法访问时出现问题。"; +"Downloader" = "下载器"; +"DownloaderDescription" = "aria2使用最高16线程,能提供3至5倍的下载速度。它与它的源代码被一同打包在Xcodes中以符合GPLv2授权。\n\nURLSession是用于发起URL请求的默认Apple API。"; + // Advanced Preference Pane "Advanced" = "高级"; "LocalCachePath" = "本地缓存位置"; @@ -88,10 +96,6 @@ "OnSelectRenameXcode" = "总是重命名为Xcode.app"; "OnSelectRenameXcodeDescription" = "选中时,会自动尝试重命名活跃的Xcode为Xcode.app,将之前的Xcode.app重命名为包含版本的名称。"; -"DataSource" = "数据源"; -"DataSourceDescription" = "Apple数据源是从Apple开发者网站爬取的。它会及时反应最新版本,但较为脆弱。\n\nXcode Releases是一个非官方的Xcode版本列表。它提供了良好格式化的数据,包含了不便从Apple直接获得的附加信息,且更不容易在Apple开发者网站无法访问时出现问题。"; -"Downloader" = "下载器"; -"DownloaderDescription" = "aria2使用最高16线程,能提供3至5倍的下载速度。它与它的源代码被一同打包在Xcodes中以符合GPLv2授权。\n\nURLSession是用于发起URL请求的默认Apple API。"; "PrivilegedHelper" = "提权帮助程序"; "PrivilegedHelperDescription" = "Xcodes使用一个独立的提权帮助程序来以root身份执行任务。就是那些需要在命令行中用sudo执行的命令。包括一些安装前置步骤以及用xcode-select切换Xcode版本。\n\n您需要提供当前用户的密码来安装它。"; "HelperInstalled" = "帮助程序已安装"; @@ -122,7 +126,7 @@ "SendSMS" = "发送短信"; "EnterDigitCodeDescription" = "请输入%d位代码,已发送到%@:"; "SelectTrustedPhone" = "请选择一个信任的手机号来从短信接收%d位代码:"; -"NoTrustedPhones" = "您的账户没有任何信任的手机号,但这是两步验证所必须的。\n\n请参阅 https://support.apple.com/en-ca/HT204915。"; +"NoTrustedPhones" = "您的账户没有任何信任的手机号,但这是两步验证所必须的。\n\n请参阅 https://support.apple.com/HT204915。"; // MainWindow "UpdatedAt" = "更新于"; diff --git a/Xcodes/Resources/zh-Hant.lproj/Localizable.strings b/Xcodes/Resources/zh-Hant.lproj/Localizable.strings index 3b2c07c..3f16514 100644 --- a/Xcodes/Resources/zh-Hant.lproj/Localizable.strings +++ b/Xcodes/Resources/zh-Hant.lproj/Localizable.strings @@ -16,6 +16,7 @@ "OpenDescription" = "打開這個版本"; "CopyPath" = "拷貝路徑"; "CreateSymLink" = "製作 Xcode.app 的 Symlink"; +"CreateSymLink" = "製作 Xcode-Beta.app 的 Symlink"; "Uninstall" = "解除安裝"; "Selected" = "已選取"; "Select" = "選取"; @@ -72,6 +73,13 @@ "LastChecked" = "上一次檢查: %@"; "Never" = "從未使用"; +// Download Preference Pane +"Downloads" = "下載"; +"DataSource" = "資料來源"; +"DataSourceDescription" = "Apple 資料來源是擷取 Apple 開發者網站而來,永遠會顯示最新的可用版本,但比較容易出錯。\n\nXcode Releases 是一個非官方的 Xcodes 發行版本列表。這個來源提供格式良好的資料,包含了 Apple 開發者網站上未列出的額外資訊並且即使 Apple 決定重新設計他們的開發者網站也比較不容易出錯。"; +"Downloader" = "下載器"; +"DownloaderDescription" = "aria2 相較 URLSession 可以同時使用最多 16 條連線以 3 ~ 5 倍的速度下載 Xcode。Xcodes 包含了執行檔與其原始碼以遵循他的 GPLv2 授權合約。\n\nURLSession 是系統內建用來發送 URL 連線請求的 Apple API。"; + // Advanced Preference Pane "Advanced" = "進階"; "LocalCachePath" = "本機快取路徑"; @@ -80,10 +88,6 @@ "Active/Select" = "啟用/選取"; "AutomaticallyCreateSymbolicLink" = "自動建立 Symlink 至 Xcode.app"; "AutomaticallyCreateSymbolicLinkDescription" = "當你選擇/啟用一個 Xcode 版本,自動建立一個名為 Xcode.app 的 Symlink 到該版本的安裝目錄"; -"DataSource" = "資料來源"; -"DataSourceDescription" = "Apple 資料來源是擷取 Apple 開發者網站而來,永遠會顯示最新的可用版本,但比較容易出錯。\n\nXcode Releases 是一個非官方的 Xcodes 發行版本列表。這個來源提供格式良好的資料,包含了 Apple 開發者網站上未列出的額外資訊並且即使 Apple 決定重新設計他們的開發者網站也比較不容易出錯。"; -"Downloader" = "下載器"; -"DownloaderDescription" = "aria2 相較 URLSession 可以同時使用最多 16 條連線以 3 ~ 5 倍的速度下載 Xcode。Xcodes 包含了執行檔與其原始碼以遵循他的 GPLv2 授權合約。\n\nURLSession 是系統內建用來發送 URL 連線請求的 Apple API。"; "PrivilegedHelper" = "權限輔助程式"; "PrivilegedHelperDescription" = "Xcodes 使用一個分開的權限輔助程式以使用 root 身份執行特定工作。這些工作包含了通常需要在命令列使用 sudo 的指令,包含安裝後步驟以及使用 xcode-select 選擇 Xcode 版本。\n\n安裝時,你將會被詢問你的 macOS 帳號密碼。"; "HelperInstalled" = "輔助程式已安裝"; @@ -114,7 +118,7 @@ "SendSMS" = "傳送簡訊"; "EnterDigitCodeDescription" = "請輸入 %d 位數密碼,已傳送至 %@: "; "SelectTrustedPhone" = "請輸入一個你想用來接收 %d 位數密碼簡訊的電話號碼:"; -"NoTrustedPhones" = "你的帳號沒有任何已信任的手機號碼,但兩階段認證需要信任的手機號碼。\n\n請參閱 https://support.apple.com/zh-tw/HT204915."; +"NoTrustedPhones" = "你的帳號沒有任何已信任的手機號碼,但兩階段認證需要信任的手機號碼。\n\n請參閱 https://support.apple.com/HT204915."; // MainWindow "UpdatedAt" = "上一次檢查:";