diff --git a/Scripts/check_fork_identity.sh b/Scripts/check_fork_identity.sh index d3f631d0..aef6d40d 100755 --- a/Scripts/check_fork_identity.sh +++ b/Scripts/check_fork_identity.sh @@ -43,8 +43,8 @@ readonly app_id="dev.jacobcx.Xcodes" readonly tests_id="dev.jacobcx.Xcodes.Tests" readonly helper_id="dev.jacobcx.Xcodes.Helper" readonly team_id="K2648T24P4" -readonly marketing_version="4.1.2" -readonly build_number="50" +readonly marketing_version="4.1.3" +readonly build_number="51" readonly app_copyright="Fork contributions © 2026 JacobCXDev. Upstream contributors retain their copyrights." # shellcheck disable=SC2016 # Xcode expands this build-setting literal, not the shell. readonly app_requirement='identifier "dev.jacobcx.Xcodes" and info [CFBundleShortVersionString] >= "1.0.0" and anchor apple generic and certificate leaf[subject.OU] = "$(CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT)"' diff --git a/Scripts/check_localizations.rb b/Scripts/check_localizations.rb index 4220d820..4c213fc2 100755 --- a/Scripts/check_localizations.rb +++ b/Scripts/check_localizations.rb @@ -5,25 +5,6 @@ catalog_path = ARGV.fetch(0, File.expand_path("../Xcodes/Resources/Localizable.xcstrings", __dir__)) catalog = JSON.parse(File.read(catalog_path)) languages = %w[ar ca de el es fi fr hi it ja ko nl pl pt-BR ru th tr uk zh-Hans zh-Hant].freeze -established_languages = languages - %w[ar th] -baseline_keys = %w[AutomaticallyCreateBetaSymbolicLink AutomaticallyCreateBetaSymbolicLinkDescription].freeze -arabic_thai_baseline_keys = [ - "An error occurred", - "Architecture", - "AutomaticallyCreateBetaSymbolicLink", - "AutomaticallyCreateBetaSymbolicLinkDescription", - "Category", - "Dismiss", - "FilterArchitecturesDescription", - "Installed Only", - "Open Browser", - "Paste redirected URL", - "Signing out...", -].freeze -allowed_missing = ( - baseline_keys.product(established_languages) + - arabic_thai_baseline_keys.product(%w[ar th]) -).map { |key, language| "#{key}:#{language}" }.sort.freeze translated = lambda do |localization| if localization.key?("stringUnit") @@ -118,11 +99,9 @@ "GroupXcodeVersionsInList:#{language} expected #{expected_value.inspect}, got #{actual_value.inspect}" unless actual_value == expected_value end -unexpected = missing - allowed_missing -resolved = allowed_missing - missing errors = [] -errors << "New missing or unreviewed translations:\n #{unexpected.join("\n ")}" unless unexpected.empty? -errors << "Localization baseline is stale; remove resolved entries:\n #{resolved.join("\n ")}" unless resolved.empty? +errors << "Supported localization languages do not match the grouping contract" unless languages.sort == (required_grouping_values.keys - ["en"]).sort +errors << "Missing or unreviewed translations:\n #{missing.join("\n ")}" unless missing.empty? errors << "Legacy Apple ID terminology remains:\n #{legacy_terminology.join("\n ")}" unless legacy_terminology.empty? errors << "Legacy localization keys remain:\n #{forbidden_keys.join("\n ")}" unless forbidden_keys.empty? errors << "Required localization keys are missing:\n #{required_keys.join("\n ")}" unless required_keys.empty? @@ -133,4 +112,4 @@ exit 1 end -puts "Localization contract passed with #{allowed_missing.length} explicitly tracked gaps" +puts "Localization contract passed with no missing translations" diff --git a/Scripts/test_fork_identity_guard.sh b/Scripts/test_fork_identity_guard.sh index b583eebf..8862a4e5 100755 --- a/Scripts/test_fork_identity_guard.sh +++ b/Scripts/test_fork_identity_guard.sh @@ -108,11 +108,15 @@ if "$fixture_root/Scripts/check_fork_identity.sh" >/dev/null 2>&1; then exit 1 fi +cp "$repo_root/Xcodes/Resources/Info.plist" "$fixture_root/Xcodes/Resources/Info.plist" +cp "$repo_root/Xcodes/Frontend/Preferences/UpdatesPreferencePane.swift" "$fixture_root/Xcodes/Frontend/Preferences/" +"$fixture_root/Scripts/check_fork_identity.sh" >/dev/null + cp \ "$repo_root/Xcodes.xcodeproj/project.pbxproj" \ "$fixture_root/Xcodes.xcodeproj/project.pbxproj" perl -0pi -e \ - 's/MARKETING_VERSION = 4\.0\.5;/MARKETING_VERSION = 4.0.4;/g' \ + 's/MARKETING_VERSION = [^;]+;/MARKETING_VERSION = 0.0.0;/g or die "No marketing version found to mutate\n"' \ "$fixture_root/Xcodes.xcodeproj/project.pbxproj" if "$fixture_root/Scripts/check_fork_identity.sh" >/dev/null 2>&1; then diff --git a/Scripts/test_localization_contract.sh b/Scripts/test_localization_contract.sh index 69b66398..ee640277 100755 --- a/Scripts/test_localization_contract.sh +++ b/Scripts/test_localization_contract.sh @@ -41,8 +41,8 @@ expect_failure new_arabic_gap \ 'path = ARGV.fetch(0); data = JSON.parse(File.read(path)); data["strings"]["AutomaticallyCreateSymbolicLink"]["localizations"].delete("ar"); File.write(path, JSON.pretty_generate(data))' expect_failure new_thai_gap \ 'path = ARGV.fetch(0); data = JSON.parse(File.read(path)); data["strings"]["AutomaticallyCreateSymbolicLink"]["localizations"].delete("th"); File.write(path, JSON.pretty_generate(data))' -expect_failure stale_baseline \ - 'path = ARGV.fetch(0); data = JSON.parse(File.read(path)); data["strings"]["AutomaticallyCreateBetaSymbolicLink"]["localizations"]["de"] = { "stringUnit" => { "state" => "translated", "value" => "Beta-Link" } }; File.write(path, JSON.pretty_generate(data))' +expect_failure removed_beta_translation \ + 'path = ARGV.fetch(0); data = JSON.parse(File.read(path)); data["strings"]["AutomaticallyCreateBetaSymbolicLink"]["localizations"].delete("de"); File.write(path, JSON.pretty_generate(data))' expect_failure legacy_apple_id_copy \ 'path = ARGV.fetch(0); data = JSON.parse(File.read(path)); data["strings"]["AccessGranted"]["localizations"]["en"]["stringUnit"]["value"] = "Signed in with your Apple ID."; File.write(path, JSON.pretty_generate(data))' expect_failure shifted_grouping_translation \ diff --git a/Xcodes.xcodeproj/project.pbxproj b/Xcodes.xcodeproj/project.pbxproj index 3a41f83a..f95d8a16 100644 --- a/Xcodes.xcodeproj/project.pbxproj +++ b/Xcodes.xcodeproj/project.pbxproj @@ -1094,7 +1094,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 50; + CURRENT_PROJECT_VERSION = 51; DEVELOPMENT_ASSET_PATHS = "\"Xcodes/Preview Content\""; DEVELOPMENT_TEAM = K2648T24P4; ENABLE_HARDENED_RUNTIME = NO; @@ -1106,7 +1106,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 14.6; - MARKETING_VERSION = 4.1.2; + MARKETING_VERSION = 4.1.3; PRODUCT_BUNDLE_IDENTIFIER = dev.jacobcx.Xcodes; PRODUCT_NAME = Xcodes; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1347,7 +1347,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 50; + CURRENT_PROJECT_VERSION = 51; DEVELOPMENT_ASSET_PATHS = "\"Xcodes/Preview Content\""; DEVELOPMENT_TEAM = K2648T24P4; ENABLE_HARDENED_RUNTIME = YES; @@ -1359,7 +1359,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 14.6; - MARKETING_VERSION = 4.1.2; + MARKETING_VERSION = 4.1.3; PRODUCT_BUNDLE_IDENTIFIER = dev.jacobcx.Xcodes; PRODUCT_NAME = Xcodes; SWIFT_VERSION = 6.0; @@ -1376,7 +1376,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 50; + CURRENT_PROJECT_VERSION = 51; DEVELOPMENT_ASSET_PATHS = "\"Xcodes/Preview Content\""; DEVELOPMENT_TEAM = K2648T24P4; ENABLE_HARDENED_RUNTIME = YES; @@ -1388,7 +1388,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 14.6; - MARKETING_VERSION = 4.1.2; + MARKETING_VERSION = 4.1.3; PRODUCT_BUNDLE_IDENTIFIER = dev.jacobcx.Xcodes; PRODUCT_NAME = Xcodes; SWIFT_VERSION = 6.0; diff --git a/Xcodes/Backend/XcodeCommands.swift b/Xcodes/Backend/XcodeCommands.swift index 9198782c..3e7eec03 100644 --- a/Xcodes/Backend/XcodeCommands.swift +++ b/Xcodes/Backend/XcodeCommands.swift @@ -45,6 +45,7 @@ struct InstallButton: View { Text("Install") .help("InstallDescription") } + .accessibilityValue(xcode?.description ?? "") } private func install() { @@ -60,9 +61,12 @@ struct CancelInstallButton: View { var body: some View { Button(action: cancelInstall) { Label("Cancel", systemImage: "xmark") + .frame(minWidth: 20, minHeight: 20) + .contentShape(Rectangle()) } .help(localizeString("StopInstallation")) .buttonStyle(.plain) + .accessibilityValue(xcode?.description ?? "") } private func cancelInstall() { @@ -78,10 +82,13 @@ struct CancelRuntimeInstallButton: View { var body: some View { Button(action: cancelInstall) { Label("StopInstallation", systemImage: "xmark.circle.fill") + .frame(minWidth: 20, minHeight: 20) + .contentShape(Rectangle()) } .labelStyle(.iconOnly) .help(localizeString("StopInstallation")) .buttonStyle(.plain) + .accessibilityValue(runtime?.visibleIdentifier ?? "") } private func cancelInstall() { @@ -103,7 +110,8 @@ struct SelectButton: View { } } .disabled(xcode?.selected != false) - .help("Select") + .accessibilityValue(xcode?.description ?? "") + .help(xcode?.selected == true ? Text("ActiveVersionDescription") : Text("MakeActiveVersionDescription")) } private func select() { @@ -246,6 +254,7 @@ struct DownloadRuntimeButton: View { Text("Install") .help("Install") } + .accessibilityValue(runtime?.visibleIdentifier ?? "") } private func install() { diff --git a/Xcodes/Frontend/InfoPane/InstalledStateButtons.swift b/Xcodes/Frontend/InfoPane/InstalledStateButtons.swift index 541e2fcf..ce653966 100644 --- a/Xcodes/Frontend/InfoPane/InstalledStateButtons.swift +++ b/Xcodes/Frontend/InfoPane/InstalledStateButtons.swift @@ -22,6 +22,8 @@ struct InstalledStateButtons: View { Text(xcode.installedPath?.string ?? "") Button(action: { appState.reveal(xcode.installedPath) }) { Label("RevealInFinder", systemImage: "arrow.right.circle.fill") + .frame(minWidth: 20, minHeight: 20) + .contentShape(Rectangle()) } .labelStyle(.iconOnly) .buttonStyle(PlainButtonStyle()) @@ -31,7 +33,6 @@ struct InstalledStateButtons: View { HStack { SelectButton(xcode: xcode) .disabled(xcode.selected) - .help("Selected") OpenButton(xcode: xcode) .help("Open") diff --git a/Xcodes/Frontend/InfoPane/PlatformsView.swift b/Xcodes/Frontend/InfoPane/PlatformsView.swift index 40aa124b..a0fd1415 100644 --- a/Xcodes/Frontend/InfoPane/PlatformsView.swift +++ b/Xcodes/Frontend/InfoPane/PlatformsView.swift @@ -129,6 +129,8 @@ struct PlatformsView: View { if let path = appState.runtimeInstallPath(xcode: xcode, runtime: runtime) { Button(action: { appState.reveal(path: path.string) }) { Label("RevealInFinder", systemImage: "arrow.right.circle.fill") + .frame(minWidth: 20, minHeight: 20) + .contentShape(Rectangle()) } .labelStyle(.iconOnly) .buttonStyle(PlainButtonStyle()) diff --git a/Xcodes/Frontend/Preferences/AdvancedPreferencePane.swift b/Xcodes/Frontend/Preferences/AdvancedPreferencePane.swift index abbc91c9..75ed4b52 100644 --- a/Xcodes/Frontend/Preferences/AdvancedPreferencePane.swift +++ b/Xcodes/Frontend/Preferences/AdvancedPreferencePane.swift @@ -16,6 +16,8 @@ struct AdvancedPreferencePane: View { .lineLimit(2) Button(action: { appState.reveal(path: appState.installPath) }) { Label("RevealInFinder", systemImage: "arrow.right.circle.fill") + .frame(minWidth: 20, minHeight: 20) + .contentShape(Rectangle()) } .labelStyle(.iconOnly) .buttonStyle(PlainButtonStyle()) @@ -54,6 +56,8 @@ struct AdvancedPreferencePane: View { .lineLimit(2) Button(action: { appState.reveal(path: appState.localPath) }) { Label("RevealInFinder", systemImage: "arrow.right.circle.fill") + .frame(minWidth: 20, minHeight: 20) + .contentShape(Rectangle()) } .labelStyle(.iconOnly) .buttonStyle(PlainButtonStyle()) diff --git a/Xcodes/Frontend/Preferences/PlatformsListView.swift b/Xcodes/Frontend/Preferences/PlatformsListView.swift index 773ed20c..f91a7b48 100644 --- a/Xcodes/Frontend/Preferences/PlatformsListView.swift +++ b/Xcodes/Frontend/Preferences/PlatformsListView.swift @@ -56,6 +56,8 @@ struct PlatformsListView: View { deleteRuntime(runtime: installedRuntime) } label: { Label("Alert.DeletePlatform.PrimaryButton", systemImage: "trash") + .frame(minWidth: 20, minHeight: 20) + .contentShape(Rectangle()) } .labelStyle(.iconOnly) .accessibilityValue(runtime.name) diff --git a/Xcodes/Frontend/SignIn/PinCodeTextView.swift b/Xcodes/Frontend/SignIn/PinCodeTextView.swift index b3cc287b..37af3d86 100644 --- a/Xcodes/Frontend/SignIn/PinCodeTextView.swift +++ b/Xcodes/Frontend/SignIn/PinCodeTextView.swift @@ -132,6 +132,7 @@ final class PinCodeTextView: NSControl, NSTextFieldDelegate { inputField.delegate = self inputField.setAccessibilityLabel(accessibilityLabel) addSubview(inputField) + setAccessibilityChildren([inputField.cell].compactMap { $0 }) NSLayoutConstraint.activate([ stackView.topAnchor.constraint(equalTo: topAnchor), diff --git a/Xcodes/Frontend/XcodeList/InstallationStepRowView.swift b/Xcodes/Frontend/XcodeList/InstallationStepRowView.swift index 1d605fa0..d6558816 100644 --- a/Xcodes/Frontend/XcodeList/InstallationStepRowView.swift +++ b/Xcodes/Frontend/XcodeList/InstallationStepRowView.swift @@ -3,7 +3,6 @@ import XcodesKit struct InstallationStepRowView: View { let installationStep: XcodeInstallationStep - let highlighted: Bool let cancel: () -> Void var body: some View { @@ -29,9 +28,11 @@ struct InstallationStepRowView: View { Button(action: cancel) { Label("Cancel", systemImage: "xmark.circle.fill") .labelStyle(IconOnlyLabelStyle()) + .frame(minWidth: 20, minHeight: 20) + .contentShape(Rectangle()) } .buttonStyle(PlainButtonStyle()) - .foregroundColor(highlighted ? .white : .secondary) + .foregroundStyle(.primary) .help("StopInstallation") } .frame(minWidth: 80) @@ -47,37 +48,31 @@ struct InstallView_Previews: PreviewProvider { installationStep: .downloading( progress: configure(Progress(totalUnitCount: 100)) { $0.completedUnitCount = 40 } ), - highlighted: false, cancel: {} ) InstallationStepRowView( installationStep: .unarchiving, - highlighted: false, cancel: {} ) InstallationStepRowView( installationStep: .moving(destination: "/Applications"), - highlighted: false, cancel: {} ) InstallationStepRowView( installationStep: .trashingArchive, - highlighted: false, cancel: {} ) InstallationStepRowView( installationStep: .checkingSecurity, - highlighted: false, cancel: {} ) InstallationStepRowView( installationStep: .finishing, - highlighted: false, cancel: {} ) } @@ -92,7 +87,6 @@ struct InstallView_Previews: PreviewProvider { installationStep: .downloading( progress: configure(Progress(totalUnitCount: 100)) { $0.completedUnitCount = 40 } ), - highlighted: true, cancel: {} ) } diff --git a/Xcodes/Frontend/XcodeList/MainToolbar.swift b/Xcodes/Frontend/XcodeList/MainToolbar.swift index c04156b0..0662fffb 100644 --- a/Xcodes/Frontend/XcodeList/MainToolbar.swift +++ b/Xcodes/Frontend/XcodeList/MainToolbar.swift @@ -71,6 +71,7 @@ struct MainToolbarModifier: ViewModifier { } .pickerStyle(.inline) .symbolVariant(isFiltering ? .fill : .none) + .accessibilityLabel(Text("Filter")) } } diff --git a/Xcodes/Frontend/XcodeList/XcodeListView.swift b/Xcodes/Frontend/XcodeList/XcodeListView.swift index 0cebb150..c9ae7c30 100644 --- a/Xcodes/Frontend/XcodeList/XcodeListView.swift +++ b/Xcodes/Frontend/XcodeList/XcodeListView.swift @@ -53,7 +53,6 @@ struct XcodeListView: View { ForEach(visibleXcodes) { entry in XcodeListViewRow( xcode: entry.xcode, - selected: selectedXcodeID == entry.xcode.id, appState: appState, latestReleaseForSelectedPrerelease: latestReleaseForSelectedPrerelease(entry.xcode) ) @@ -212,7 +211,6 @@ private struct GroupedXcodeListContent: View { ForEach(minorVersionGroup.versions) { entry in XcodeListViewRow( xcode: entry.xcode, - selected: selectedXcodeID == entry.xcode.id, appState: appState, latestReleaseForSelectedPrerelease: latestReleaseForSelectedPrerelease(entry.xcode) ) @@ -269,6 +267,7 @@ private struct XcodeVersionGroupRow: View { .contentShape(Rectangle()) } .buttonStyle(.plain) + .accessibilityValue(isExpanded ? Text("Expanded") : Text("Collapsed")) selectControl .padding(.trailing, 4) @@ -302,8 +301,11 @@ private struct XcodeVersionGroupRow: View { Button(action: { appState.select(xcode: latestSelectionTarget) }) { Image(systemName: "arrow.up.circle.fill") .foregroundColor(.yellow) + .frame(minWidth: 20, minHeight: 20) + .contentShape(Rectangle()) } .accessibilityLabel(Text("MakeActiveVersionDescription")) + .accessibilityValue(latestSelectionTarget.description) .buttonStyle(PlainButtonStyle()) .help(staleSelectedHelpText(selectedVersion: selectedVersion, latestRelease: latestSelectableRelease, selectionTarget: latestSelectionTarget)) } else { @@ -329,29 +331,34 @@ private struct XcodeVersionGroupRow: View { Button(action: { appState.select(xcode: latestSelectionTarget) }) { Image(systemName: "checkmark.circle") .foregroundColor(.secondary) + .frame(minWidth: 20, minHeight: 20) + .contentShape(Rectangle()) } .accessibilityLabel(Text("MakeActiveVersionDescription")) + .accessibilityValue(latestSelectionTarget.description) .buttonStyle(PlainButtonStyle()) .help("MakeActiveVersionDescription") } } private func staleSelectedHelpText(selectedVersion: Xcode, latestRelease: Xcode, selectionTarget: Xcode?) -> Text { + let status = Text("Active") + Text(verbatim: ": \(selectedVersion.description)\n") + + Text(verbatim: String(format: localizeString("LatestReleaseDescription"), latestRelease.description)) switch selectionTarget?.installState { case .installed: if let selectionTarget, selectionTarget.id != selectedVersion.id { - return Text(verbatim: "\(selectedVersion.description) selected, \(latestRelease.description) available. Click to select \(selectionTarget.description).") + return status + Text(verbatim: "\n") + Text("MakeActive") + Text(verbatim: ": \(selectionTarget.description)") } else { - return Text(verbatim: "\(selectedVersion.description) selected, \(latestRelease.description) available.") + return status } case .notInstalled: if let selectionTarget { - return Text(verbatim: "\(selectedVersion.description) selected, \(latestRelease.description) available. Install \(selectionTarget.description) to select it.") + return status + Text(verbatim: "\n") + Text("Install") + Text(verbatim: ": \(selectionTarget.description)") } else { - return Text(verbatim: "\(selectedVersion.description) selected, \(latestRelease.description) available.") + return status } case .installing, .uninstalling, .none: - return Text(verbatim: "\(selectedVersion.description) selected, \(latestRelease.description) available.") + return status } } @@ -361,7 +368,6 @@ private struct XcodeVersionGroupRow: View { case let .installing(installationStep) = installingVersion.installState { InstallationStepRowView( installationStep: installationStep, - highlighted: false, cancel: { appState.presentedAlert = .cancelInstall(xcode: installingVersion) } ) } else if let latestRelease { @@ -419,7 +425,8 @@ struct PlatformsPocket: View { openWindow(id: "platforms") } label: { Label("PlatformsDescription", systemImage: "square.3.layers.3d") - .frame(maxWidth: .infinity, alignment: .leading) + .frame(maxWidth: .infinity, minHeight: 20, alignment: .leading) + .contentShape(Rectangle()) } .buttonStyle(.borderless) .controlSize(.regular) diff --git a/Xcodes/Frontend/XcodeList/XcodeListViewRow.swift b/Xcodes/Frontend/XcodeList/XcodeListViewRow.swift index 1798e0b8..0488f778 100644 --- a/Xcodes/Frontend/XcodeList/XcodeListViewRow.swift +++ b/Xcodes/Frontend/XcodeList/XcodeListViewRow.swift @@ -5,13 +5,11 @@ import XcodesKit struct XcodeListViewRow: View { let xcode: Xcode - let selected: Bool let appState: AppState let latestReleaseForSelectedPrerelease: Xcode? - init(xcode: Xcode, selected: Bool, appState: AppState, latestReleaseForSelectedPrerelease: Xcode? = nil) { + init(xcode: Xcode, appState: AppState, latestReleaseForSelectedPrerelease: Xcode? = nil) { self.xcode = xcode - self.selected = selected self.appState = appState self.latestReleaseForSelectedPrerelease = latestReleaseForSelectedPrerelease } @@ -121,8 +119,11 @@ struct XcodeListViewRow: View { Button(action: { appState.select(xcode: latestReleaseForSelectedPrerelease) }) { Label("MakeActive", systemImage: "arrow.up.circle.fill") .foregroundColor(.yellow) + .frame(minWidth: 20, minHeight: 20) + .contentShape(Rectangle()) } .labelStyle(.iconOnly) + .accessibilityValue(latestReleaseForSelectedPrerelease.description) .buttonStyle(PlainButtonStyle()) .help(staleSelectedHelpText) case .notInstalled: @@ -142,8 +143,11 @@ struct XcodeListViewRow: View { Button(action: { appState.select(xcode: xcode) }) { Label("MakeActive", systemImage: "checkmark.circle") .foregroundColor(.secondary) + .frame(minWidth: 20, minHeight: 20) + .contentShape(Rectangle()) } .labelStyle(.iconOnly) + .accessibilityValue(xcode.description) .buttonStyle(PlainButtonStyle()) .help("MakeActiveVersionDescription") } @@ -177,7 +181,6 @@ struct XcodeListViewRow: View { case let .installing(installationStep): InstallationStepRowView( installationStep: installationStep, - highlighted: selected, cancel: { appState.presentedAlert = .cancelInstall(xcode: xcode) } ) case .uninstalling: @@ -192,14 +195,15 @@ struct XcodeListViewRow: View { } private var staleSelectedHelpText: Text { - let selectedVersion = xcode.version.appleDescription - let latestVersion = latestReleaseForSelectedPrerelease?.version.appleDescription ?? "" + let latestVersion = latestReleaseForSelectedPrerelease?.description ?? "" + let status = Text("Active") + Text(verbatim: ": \(xcode.description)\n") + + Text(verbatim: String(format: localizeString("LatestReleaseDescription"), latestVersion)) switch latestReleaseForSelectedPrerelease?.installState { case .installed: - return Text(verbatim: "\(selectedVersion) selected, \(latestVersion) available. Click to select \(latestVersion).") + return status + Text(verbatim: "\n") + Text("MakeActive") + Text(verbatim: ": \(latestVersion)") case .notInstalled: - return Text(verbatim: "\(selectedVersion) selected, \(latestVersion) available. Install \(latestVersion) to select it.") + return status + Text(verbatim: "\n") + Text("Install") + Text(verbatim: ": \(latestVersion)") case .installing, .uninstalling, .none: return Text("ActiveVersionDescription") } @@ -211,37 +215,31 @@ struct XcodeListViewRow_Previews: PreviewProvider { Group { XcodeListViewRow( xcode: Xcode(version: Version("12.3.0")!, installState: .installed(Path("/Applications/Xcode-12.3.0.app")!), selected: true, icon: nil), - 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: [XcodeID(version: Version("12.0.0-RC+1234A")!)], installState: .installed(Path("/Applications/Xcode-12.3.0.app")!), selected: false, icon: nil), - selected: false, appState: AppState() ) } diff --git a/Xcodes/Resources/Localizable.xcstrings b/Xcodes/Resources/Localizable.xcstrings index 315286f5..41339d80 100644 --- a/Xcodes/Resources/Localizable.xcstrings +++ b/Xcodes/Resources/Localizable.xcstrings @@ -1,6 +1,266 @@ { "sourceLanguage" : "en", "strings" : { + "Expanded" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Expanded" + } + }, + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "موسّع" + } + }, + "ca" : { + "stringUnit" : { + "state" : "translated", + "value" : "Expandit" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ausgeklappt" + } + }, + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Αναπτυγμένο" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Expandido" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Laajennettu" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Développé" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "विस्तृत" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Espanso" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "展開" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "펼쳐짐" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uitgevouwen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rozwinięte" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Expandido" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Развёрнуто" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ขยายอยู่" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Genişletilmiş" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Розгорнуто" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已展开" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "已展開" + } + } + } + }, + "Collapsed" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Collapsed" + } + }, + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "مطوي" + } + }, + "ca" : { + "stringUnit" : { + "state" : "translated", + "value" : "Contret" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eingeklappt" + } + }, + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Συμπτυγμένο" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Contraído" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supistettu" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Réduit" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "संकुचित" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Compresso" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "折りたたみ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "접힘" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Samengevouwen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zwinięte" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Recolhido" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Свёрнуто" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ยุบอยู่" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Daraltılmış" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Згорнуто" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已折叠" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "已收合" + } + } + } + }, "SignInFailure" : { "localizations" : { "en" : { @@ -3753,186 +4013,317 @@ } } }, - "Alert.DeletePlatform.PrimaryButton" : { + "Alert.DeletePlatform.Message" : { "extractionState" : "manual", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "مسح" + "value" : "سيؤدي هذا إلى حذف بيئة تشغيل المحاكي نهائيًا. ستتوقف أي محاكيات قيد التشغيل تستخدمها. أعد تثبيت بيئة التشغيل لاستخدام تلك المحاكيات مجددًا." } }, "ca" : { "stringUnit" : { "state" : "translated", - "value" : "Delete" + "value" : "Això suprimeix permanentment l’entorn d’execució del simulador. Els simuladors en execució que l’utilitzin s’aturaran. Torna a instal·lar l’entorn d’execució per tornar a utilitzar aquests simuladors." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Löschen" + "value" : "Die Simulator-Laufzeitumgebung wird dauerhaft gelöscht. Alle laufenden Simulatoren, die sie verwenden, werden heruntergefahren. Installiere die Laufzeitumgebung erneut, um diese Simulatoren wieder zu verwenden." } }, "el" : { "stringUnit" : { "state" : "translated", - "value" : "Διαγραφή" + "value" : "Αυτό διαγράφει οριστικά το περιβάλλον εκτέλεσης του προσομοιωτή. Όλοι οι ενεργοί προσομοιωτές που το χρησιμοποιούν θα τερματιστούν. Εγκαταστήστε ξανά το περιβάλλον εκτέλεσης για να χρησιμοποιήσετε ξανά αυτούς τους προσομοιωτές." } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "Delete" + "value" : "This permanently deletes the simulator runtime. Any running simulators that use it will shut down. Reinstall the runtime to use those simulators again." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Delete" + "value" : "Esto elimina permanentemente el entorno de ejecución del simulador. Los simuladores en ejecución que lo utilicen se apagarán. Vuelve a instalar el entorno de ejecución para usar esos simuladores de nuevo." } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Delete" + "value" : "Tämä poistaa simulaattorin ajonaikaisen ympäristön pysyvästi. Kaikki sitä käyttävät käynnissä olevat simulaattorit sammutetaan. Asenna ajonaikainen ympäristö uudelleen, jotta voit käyttää näitä simulaattoreita uudelleen." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Supprimer" + "value" : "Cette action supprime définitivement l’environnement d’exécution du simulateur. Les simulateurs en cours d’exécution qui l’utilisent s’arrêteront. Réinstallez l’environnement d’exécution pour utiliser à nouveau ces simulateurs." } }, "hi" : { "stringUnit" : { "state" : "translated", - "value" : "Delete" + "value" : "इससे सिम्युलेटर का रनटाइम स्थायी रूप से मिट जाएगा। इसका उपयोग कर रहे सभी चालू सिम्युलेटर बंद हो जाएँगे। उन सिम्युलेटरों का दोबारा उपयोग करने के लिए रनटाइम फिर से इंस्टॉल करें।" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Delete" + "value" : "Questa operazione elimina definitivamente l’ambiente di esecuzione del simulatore. Tutti i simulatori in esecuzione che lo utilizzano verranno arrestati. Reinstalla l’ambiente di esecuzione per usare nuovamente quei simulatori." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Delete" + "value" : "シミュレータのランタイムが完全に削除されます。このランタイムを使用して実行中のシミュレータはすべてシャットダウンされます。これらのシミュレータを再び使用するには、ランタイムを再インストールしてください。" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "삭제" + "value" : "시뮬레이터 런타임이 영구적으로 삭제됩니다. 이 런타임을 사용하는 실행 중인 시뮬레이터가 모두 종료됩니다. 해당 시뮬레이터를 다시 사용하려면 런타임을 다시 설치하세요." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Delete" + "value" : "Hiermee wordt de simulatorruntime permanent verwijderd. Alle actieve simulators die deze gebruiken, worden afgesloten. Installeer de runtime opnieuw om die simulators weer te gebruiken." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Delete" + "value" : "Spowoduje to trwałe usunięcie środowiska uruchomieniowego symulatora. Wszystkie działające symulatory, które z niego korzystają, zostaną wyłączone. Zainstaluj ponownie środowisko uruchomieniowe, aby znów korzystać z tych symulatorów." } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Remover" + "value" : "Isso exclui permanentemente o ambiente de execução do simulador. Todos os simuladores em execução que o utilizam serão desligados. Reinstale o ambiente de execução para usar esses simuladores novamente." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Удалить" + "value" : "Среда выполнения симулятора будет удалена безвозвратно. Все запущенные симуляторы, которые её используют, будут выключены. Установите среду выполнения заново, чтобы снова использовать эти симуляторы." } }, "th" : { "stringUnit" : { "state" : "translated", - "value" : "ลบ" + "value" : "การดำเนินการนี้จะลบรันไทม์ของตัวจำลองอย่างถาวร ตัวจำลองที่กำลังทำงานและใช้รันไทม์นี้จะปิดลง ติดตั้งรันไทม์อีกครั้งเพื่อใช้ตัวจำลองเหล่านั้นอีกครั้ง" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Delete" + "value" : "Bu işlem simülatör çalışma zamanını kalıcı olarak siler. Bu çalışma zamanını kullanan tüm açık simülatörler kapatılır. Bu simülatörleri tekrar kullanmak için çalışma zamanını yeniden yükleyin." } }, "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Видалити" + "value" : "Середовище виконання симулятора буде видалено назавжди. Усі запущені симулятори, які його використовують, буде вимкнено. Установіть середовище виконання знову, щоб знову використовувати ці симулятори." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "删除" + "value" : "这将永久删除模拟器运行时。所有正在使用此运行时的模拟器都将关闭。请重新安装运行时,以便再次使用这些模拟器。" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "刪除" + "value" : "這會永久刪除模擬器執行階段。所有正在使用此執行階段的模擬器都會關閉。請重新安裝執行階段,以便再次使用這些模擬器。" } } } }, - "Alert.DeletePlatform.Title" : { + "Alert.DeletePlatform.PrimaryButton" : { "extractionState" : "manual", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "هل أنت متأكد أنك تريد حذف ٪@؟" + "value" : "مسح" } }, "ca" : { "stringUnit" : { "state" : "translated", - "value" : "Are you sure you want to delete %@?" + "value" : "Delete" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Bist du sicher, dass du %@ löschen möchtest?" + "value" : "Löschen" } }, "el" : { "stringUnit" : { "state" : "translated", - "value" : "Θέλετε σίγουρα να διαγράψετε το %@;" + "value" : "Διαγραφή" } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "Are you sure you want to delete %@?" + "value" : "Delete" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Are you sure you want to delete %@?" + "value" : "Delete" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Are you sure you want to delete %@?" + "value" : "Delete" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Êtes-vous sûr de vouloir supprimer %@ ?" + "value" : "Supprimer" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Delete" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Delete" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Delete" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "삭제" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Delete" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Delete" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Remover" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Удалить" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ลบ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Delete" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Видалити" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "刪除" + } + } + } + }, + "Alert.DeletePlatform.Title" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "هل أنت متأكد أنك تريد حذف ٪@؟" + } + }, + "ca" : { + "stringUnit" : { + "state" : "translated", + "value" : "Are you sure you want to delete %@?" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bist du sicher, dass du %@ löschen möchtest?" + } + }, + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Θέλετε σίγουρα να διαγράψετε το %@;" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Are you sure you want to delete %@?" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Are you sure you want to delete %@?" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Are you sure you want to delete %@?" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Êtes-vous sûr de vouloir supprimer %@ ?" } }, "hi" : { @@ -6763,6 +7154,18 @@ }, "An error occurred" : { "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "حدث خطأ" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "เกิดข้อผิดพลาด" + } + }, "ca" : { "stringUnit" : { "state" : "translated", @@ -7252,526 +7655,778 @@ "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "Xcodes.app 更新" + "value" : "Xcodes.app 更新" + } + } + } + }, + "Architecture" : { + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "البنية" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "สถาปัตยกรรม" + } + }, + "ca" : { + "stringUnit" : { + "state" : "translated", + "value" : "Arquitectura" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Architektur" + } + }, + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Αρχιτεκτονική" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Arquitectura" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Arkkitehtuuri" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Architecture" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "आर्किटेक्चर" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Architettura" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アーキテクチャ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "아키텍처" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Architectuur" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Architektura" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Arquitetura" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Архитектура" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mimari" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Архітектура" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "架构" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "架構" + } + } + } + }, + "Authenticating" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "ca" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "認証中" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autenticando" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "กำลังตรวจสอบความถูกต้อง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticating" } } } }, - "Architecture" : { + "AutomaticallyCreateSymbolicLink" : { "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إنشاء رابط رمزي إلى Xcode.app تلقائيًا" + } + }, "ca" : { "stringUnit" : { "state" : "translated", - "value" : "Arquitectura" + "value" : "Crea automàticament un link simbòlic a Xcode.app" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Architektur" + "value" : "Symbolischen Link zur Xcode.app automatisch erstellen" } }, "el" : { "stringUnit" : { "state" : "translated", - "value" : "Αρχιτεκτονική" + "value" : "Αυτόματη δημιουργία συμβολικού συνδέσμου προς το Xcode.app" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatically create symbolic link to Xcode.app" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Arquitectura" + "value" : "Crear automáticamente enlace simbólico a Xcode.app" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Arkkitehtuuri" + "value" : "Luo automaattisesti symbolinen linkki Xcode.appiin" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Architecture" + "value" : "Créer automatiquement un lien symbolique vers Xcode.app" } }, "hi" : { "stringUnit" : { "state" : "translated", - "value" : "आर्किटेक्चर" + "value" : "Xcode.app के लिए स्वचालित रूप से प्रतीकात्मक लिंक बनाएं" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Architettura" + "value" : "Crea Automaticamente link simbolico a Xcodes.app" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "アーキテクチャ" + "value" : "Xcode.appへのシンボリックリンクの自動生成" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "아키텍처" + "value" : "Xcodes.app에 대한 심볼릭 링크 자동 생성" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Architectuur" + "value" : "Creëer automatisch een symbolic link naar Xcode.app" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Architektura" + "value" : "Automatycznie twórz symboliczne połączenie do Xcode.app" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Arquitetura" + "value" : "Criar link simbólico para o Xcode.app automaticamente" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Архитектура" + "value" : "Автоматически создавать символическую ссылку к Xcode.app" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "สร้าง Symbolic Link ไปยัง Xcode.app โดยอัตโนมัติ" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Mimari" + "value" : "Xcodes.app'in sembolik linkini otomatik oluştur." } }, "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Архітектура" + "value" : "Автоматично створювати символічне посилання Xcode.app" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "架构" + "value" : "自动创建名为Xcode.app的软连接" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "架構" + "value" : "自動建立連結至 Xcode.app 的符號連結" } } } }, - "Authenticating" : { - "extractionState" : "manual", + "AutomaticallyCreateSymbolicLinkDescription" : { "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "عند جعل إصدار Xcode نشطًا/محددًا، حاول إنشاء رابط رمزي باسم Xcode.app في دليل التثبيت" } }, "ca" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "Quan s'activa/selecciona una versió d'Xcode, prova de crear un enllaç simbòlic dins el directori d'instal·lació" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "Beim Umstellen einer Xcode-Version auf Aktiv/Ausgewählt versuchen einen symbolischen Link namens Xcode.app im Installationsverzeichnis zu erstellen." } }, "el" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "Όταν ορίζετε μια έκδοση του Xcode ως Ενεργή/Επιλεγμένη, θα γίνεται προσπάθεια δημιουργίας ενός συμβολικού συνδέσμου με το όνομα Xcode.app στον φάκελο της εγκατάστασης" } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "When you make an Xcode version active, create or update Xcode.app in the installation directory to link to that version." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "Al activar/seleccionar una versión de Xcode, intentará crear un enlace simbólico llamado Xcode.app en el directorio de instalación." } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "Kun teet Xcode-versiosta aktiivisen/valitun, yritä luoda symbolinen linkki nimeltä Xcode.app asennushakemistoon" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "Lorsque vous activez/sélectionnez une version de Xcode, essayez de créer un lien symbolique nommé Xcode.app dans le répertoire d'installation" } }, "hi" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "Xcode संस्करण को सक्रिय/चयनित बनाते समय, स्थापना निर्देशिका में Xcode.app नामक एक प्रतीकात्मक लिंक बनाने का प्रयास करें" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "Quando rendi una versione di Xcode Attiva/Selezionata, prova a fare un link simbolico chiamato nella directory di installazione." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "認証中" + "value" : "Xcodeのバージョンをアクティブにする時、インストール先でXcode.appのシンボリックリンクの作成を試みます。" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "Xcode 버전을 기본 버전(활성)/선택됨 상태로 만들 때 설치 디렉토리에 Xcode.app이라는 심볼릭 링크를 만들어 보세요." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "Bij het actief maken/selecteren van een Xcode versie, probeer een symbolic link genaamd Xcode.app te maken in de installatie map" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "Przy ustawianiu Xcode jako aktywny/wybrany, próbuj automatycznie stworzyć symboliczne połączenie o nazwie Xcode.app w katalogu instalacji." } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Autenticando" + "value" : "Quando ativar/selecionar uma versão do Xcode, tentar criar um link simbólico chamado Xcode.app no diretório de instalação" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "Когда вы делаете версию Xcode активной/выбранной, будет выполнена попытка создать символическую ссылку с именем Xcode.app в директории установки" } }, "th" : { "stringUnit" : { "state" : "translated", - "value" : "กำลังตรวจสอบความถูกต้อง" + "value" : "เมื่อทำให้เวอร์ชัน Xcode เป็น ใช้งาน/ถูกเลือก ให้ลองสร้าง Symbolic link ชื่อ Xcode.app ในไดเร็กทอรีของการติดตั้ง" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "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" } }, "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "Створювати символічне посилання Xcode.app що вказує на обрану версію при зміні активного Xcode. \nСимволічне посилання буде розміщено у папці інсталяції Xcode" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "当激活/选定某个Xcode版本时,尝试在安装目录创建一个名为Xcode.app的软链接。" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "選擇或啟用一個 Xcode 版本時,會自動建立一個名為 Xcode.app 的符號連結,並指向該版本的安裝目錄" } } } }, - "AutomaticallyCreateSymbolicLink" : { + "AutomaticallyCreateBetaSymbolicLink" : { "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "إنشاء رابط رمزي إلى Xcode.app تلقائيًا" + "value" : "إنشاء رابط رمزي إلى Xcode-Beta.app تلقائيًا" } }, "ca" : { "stringUnit" : { "state" : "translated", - "value" : "Crea automàticament un link simbòlic a Xcode.app" + "value" : "Crea automàticament un enllaç simbòlic a Xcode-Beta.app" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Symbolischen Link zur Xcode.app automatisch erstellen" + "value" : "Symbolischen Link zu Xcode-Beta.app automatisch erstellen" } }, "el" : { "stringUnit" : { "state" : "translated", - "value" : "Αυτόματη δημιουργία συμβολικού συνδέσμου προς το Xcode.app" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Automatically create symbolic link to Xcode.app" + "value" : "Αυτόματη δημιουργία συμβολικού συνδέσμου προς το Xcode-Beta.app" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Crear automáticamente enlace simbólico a Xcode.app" + "value" : "Crear automáticamente un enlace simbólico a Xcode-Beta.app" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Luo automaattisesti symbolinen linkki Xcode.appiin" + "value" : "Luo symbolinen linkki Xcode-Beta.appiin automaattisesti" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Créer automatiquement un lien symbolique vers Xcode.app" + "value" : "Créer automatiquement un lien symbolique vers Xcode-Beta.app" } }, "hi" : { "stringUnit" : { "state" : "translated", - "value" : "Xcode.app के लिए स्वचालित रूप से प्रतीकात्मक लिंक बनाएं" + "value" : "Xcode-Beta.app के लिए सिम्बॉलिक लिंक अपने आप बनाएँ" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Crea Automaticamente link simbolico a Xcodes.app" + "value" : "Crea automaticamente un link simbolico a Xcode-Beta.app" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Xcode.appへのシンボリックリンクの自動生成" + "value" : "Xcode-Beta.appへのシンボリックリンクを自動作成" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Xcodes.app에 대한 심볼릭 링크 자동 생성" + "value" : "Xcode-Beta.app 심볼릭 링크 자동 생성" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Creëer automatisch een symbolic link naar Xcode.app" + "value" : "Automatisch een symbolische koppeling naar Xcode-Beta.app maken" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Automatycznie twórz symboliczne połączenie do Xcode.app" + "value" : "Automatycznie twórz dowiązanie symboliczne do Xcode-Beta.app" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Criar link simbólico para o Xcode.app automaticamente" + "value" : "Criar automaticamente um link simbólico para Xcode-Beta.app" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Автоматически создавать символическую ссылку к Xcode.app" + "value" : "Автоматически создавать символическую ссылку Xcode-Beta.app" } }, "th" : { "stringUnit" : { "state" : "translated", - "value" : "สร้าง Symbolic Link ไปยัง Xcode.app โดยอัตโนมัติ" + "value" : "สร้างลิงก์สัญลักษณ์ไปยัง Xcode-Beta.app โดยอัตโนมัติ" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Xcodes.app'in sembolik linkini otomatik oluştur." + "value" : "Xcode-Beta.app için otomatik sembolik bağlantı oluştur" } }, "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Автоматично створювати символічне посилання Xcode.app" + "value" : "Автоматично створювати символічне посилання Xcode-Beta.app" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "自动创建名为Xcode.app的软连接" + "value" : "自动创建指向 Xcode-Beta.app 的符号链接" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "自動建立連結至 Xcode.app 的符號連結" + "value" : "自動建立指向 Xcode-Beta.app 的符號連結" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatically create symbolic link to Xcode-Beta.app" } } } }, - "AutomaticallyCreateSymbolicLinkDescription" : { + "AutomaticallyCreateBetaSymbolicLinkDescription" : { "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "عند جعل إصدار Xcode نشطًا/محددًا، حاول إنشاء رابط رمزي باسم Xcode.app في دليل التثبيت" + "value" : "عند تعيين إصدار تجريبي من Xcode كإصدار نشط، يتم إنشاء Xcode-Beta.app أو تحديثه في دليل التثبيت ليرتبط بذلك الإصدار." } }, "ca" : { "stringUnit" : { "state" : "translated", - "value" : "Quan s'activa/selecciona una versió d'Xcode, prova de crear un enllaç simbòlic dins el directori d'instal·lació" + "value" : "Quan activis una versió preliminar d’Xcode, crea o actualitza Xcode-Beta.app al directori d’instal·lació perquè enllaci amb aquesta versió." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Beim Umstellen einer Xcode-Version auf Aktiv/Ausgewählt versuchen einen symbolischen Link namens Xcode.app im Installationsverzeichnis zu erstellen." + "value" : "Wenn du eine Vorabversion von Xcode aktivierst, wird Xcode-Beta.app im Installationsverzeichnis erstellt oder aktualisiert und mit dieser Version verknüpft." } }, "el" : { "stringUnit" : { "state" : "translated", - "value" : "Όταν ορίζετε μια έκδοση του Xcode ως Ενεργή/Επιλεγμένη, θα γίνεται προσπάθεια δημιουργίας ενός συμβολικού συνδέσμου με το όνομα Xcode.app στον φάκελο της εγκατάστασης" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "When you make an Xcode version active, create or update Xcode.app in the installation directory to link to that version." + "value" : "Όταν ενεργοποιείτε μια προέκδοση του Xcode, δημιουργείται ή ενημερώνεται το Xcode-Beta.app στον φάκελο εγκατάστασης ώστε να παραπέμπει σε αυτήν την έκδοση." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Al activar/seleccionar una versión de Xcode, intentará crear un enlace simbólico llamado Xcode.app en el directorio de instalación." + "value" : "Al activar una versión preliminar de Xcode, se crea o actualiza Xcode-Beta.app en el directorio de instalación para enlazar con esa versión." } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Kun teet Xcode-versiosta aktiivisen/valitun, yritä luoda symbolinen linkki nimeltä Xcode.app asennushakemistoon" + "value" : "Kun aktivoit Xcoden ennakkoversion, asennushakemistoon luodaan tai päivitetään Xcode-Beta.app-linkki, joka osoittaa kyseiseen versioon." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Lorsque vous activez/sélectionnez une version de Xcode, essayez de créer un lien symbolique nommé Xcode.app dans le répertoire d'installation" + "value" : "Lorsque vous activez une préversion de Xcode, Xcode-Beta.app est créé ou mis à jour dans le répertoire d’installation pour pointer vers cette version." } }, "hi" : { "stringUnit" : { "state" : "translated", - "value" : "Xcode संस्करण को सक्रिय/चयनित बनाते समय, स्थापना निर्देशिका में Xcode.app नामक एक प्रतीकात्मक लिंक बनाने का प्रयास करें" + "value" : "Xcode के किसी पूर्व-रिलीज़ संस्करण को सक्रिय करने पर, इंस्टॉलेशन फ़ोल्डर में Xcode-Beta.app बनाएँ या अपडेट करें ताकि वह उस संस्करण से जुड़ सके।" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Quando rendi una versione di Xcode Attiva/Selezionata, prova a fare un link simbolico chiamato nella directory di installazione." + "value" : "Quando attivi una versione preliminare di Xcode, crea o aggiorna Xcode-Beta.app nella cartella di installazione per collegarlo a quella versione." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Xcodeのバージョンをアクティブにする時、インストール先でXcode.appのシンボリックリンクの作成を試みます。" + "value" : "Xcodeのプレリリース版をアクティブにすると、インストール先にXcode-Beta.appを作成または更新して、そのバージョンへのリンクにします。" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Xcode 버전을 기본 버전(활성)/선택됨 상태로 만들 때 설치 디렉토리에 Xcode.app이라는 심볼릭 링크를 만들어 보세요." + "value" : "Xcode 사전 출시 버전을 활성화하면 설치 디렉터리에 해당 버전을 가리키는 Xcode-Beta.app 링크를 생성하거나 업데이트합니다." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Bij het actief maken/selecteren van een Xcode versie, probeer een symbolic link genaamd Xcode.app te maken in de installatie map" + "value" : "Als je een voorlopige Xcode-versie actief maakt, wordt Xcode-Beta.app in de installatiemap aangemaakt of bijgewerkt om naar die versie te verwijzen." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Przy ustawianiu Xcode jako aktywny/wybrany, próbuj automatycznie stworzyć symboliczne połączenie o nazwie Xcode.app w katalogu instalacji." + "value" : "Po aktywowaniu przedpremierowej wersji Xcode w katalogu instalacyjnym zostanie utworzone lub zaktualizowane dowiązanie Xcode-Beta.app wskazujące tę wersję." } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Quando ativar/selecionar uma versão do Xcode, tentar criar um link simbólico chamado Xcode.app no diretório de instalação" + "value" : "Ao ativar uma versão de pré-lançamento do Xcode, crie ou atualize Xcode-Beta.app no diretório de instalação para apontar para essa versão." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Когда вы делаете версию Xcode активной/выбранной, будет выполнена попытка создать символическую ссылку с именем Xcode.app в директории установки" + "value" : "При активации предварительной версии Xcode в каталоге установки создаётся или обновляется ссылка Xcode-Beta.app на эту версию." } }, "th" : { "stringUnit" : { "state" : "translated", - "value" : "เมื่อทำให้เวอร์ชัน Xcode เป็น ใช้งาน/ถูกเลือก ให้ลองสร้าง Symbolic link ชื่อ Xcode.app ในไดเร็กทอรีของการติดตั้ง" + "value" : "เมื่อกำหนดให้ Xcode รุ่นก่อนเผยแพร่เป็นรุ่นที่ใช้งานอยู่ ให้สร้างหรืออัปเดต Xcode-Beta.app ในไดเรกทอรีติดตั้งเพื่อเชื่อมโยงไปยังรุ่นนั้น" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "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" + "value" : "Bir Xcode ön sürümünü etkinleştirdiğinizde, o sürüme bağlantı vermek için yükleme klasöründe Xcode-Beta.app oluşturulur veya güncellenir." } }, "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Створювати символічне посилання Xcode.app що вказує на обрану версію при зміні активного Xcode. \nСимволічне посилання буде розміщено у папці інсталяції Xcode" + "value" : "Коли ви активуєте попередню версію Xcode, у каталозі встановлення створюється або оновлюється посилання Xcode-Beta.app на цю версію." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "当激活/选定某个Xcode版本时,尝试在安装目录创建一个名为Xcode.app的软链接。" + "value" : "将 Xcode 预发布版本设为活跃版本时,在安装目录中创建或更新 Xcode-Beta.app,使其链接到该版本。" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "選擇或啟用一個 Xcode 版本時,會自動建立一個名為 Xcode.app 的符號連結,並指向該版本的安裝目錄" - } - } - } - }, - "AutomaticallyCreateBetaSymbolicLink" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Automatically create symbolic link to Xcode-Beta.app" + "value" : "將 Xcode 預先發行版本設為使用中版本時,在安裝目錄中建立或更新 Xcode-Beta.app,使其連結至該版本。" } - } - } - }, - "AutomaticallyCreateBetaSymbolicLinkDescription" : { - "localizations" : { + }, "en" : { "stringUnit" : { "state" : "translated", @@ -8297,6 +8952,18 @@ }, "Category" : { "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الفئة" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "หมวดหมู่" + } + }, "ca" : { "stringUnit" : { "state" : "translated", @@ -10333,6 +11000,18 @@ }, "Dismiss" : { "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إغلاق" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ปิด" + } + }, "ca" : { "stringUnit" : { "state" : "translated", @@ -12251,6 +12930,18 @@ }, "FilterArchitecturesDescription" : { "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تصفية إصدارات Xcode حسب البنية" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "กรองเวอร์ชัน Xcode ตามสถาปัตยกรรม" + } + }, "ca" : { "stringUnit" : { "state" : "translated", @@ -16926,6 +17617,18 @@ }, "Installed Only" : { "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "المثبتة فقط" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ที่ติดตั้งแล้วเท่านั้น" + } + }, "ca" : { "stringUnit" : { "state" : "translated", @@ -17171,7 +17874,7 @@ "ar" : { "stringUnit" : { "state" : "translated", - "value" : "يقوم Xcodes بالبحث والتثبيت في دليل واحد. بشكل افتراضي (والموصى به) هو الاحتفاظ بهذا /Applications.online. قد تؤدي أي تغييرات في مكان تخزين Xcode إلى توقف التطبيقات/الخدمات الأخرى عن العمل." + "value" : "الدليل الافتراضي والموصى به هو \u2066/Applications\u2069. يبحث Xcodes عن التطبيقات ويثبّتها في دليل واحد. قد يؤدي تغيير مكان تخزين Xcode إلى توقف التطبيقات والخدمات الأخرى عن العمل." } }, "ca" : { @@ -17183,13 +17886,13 @@ "de" : { "stringUnit" : { "state" : "translated", - "value" : "Xcodes sucht and installiert in ein einzelnes Verzeichnis. Standard (und empfohlen beizubehalten) ist /Programme. Änderungen am Speicherort von Xcode können dazu führen, dass andere Apps/Dienste aufhören zu funktionieren. " + "value" : "Xcodes sucht und installiert in einem einzelnen Verzeichnis. Standard (und empfohlen beizubehalten) ist /Applications. Änderungen am Speicherort von Xcode können dazu führen, dass andere Apps/Dienste aufhören zu funktionieren." } }, "el" : { "stringUnit" : { "state" : "translated", - "value" : "Το Xcodes αναζητά και εγκαθιστά σε ένα και μόνο φάκελο. Κατά προεπιλογή (όπως και συνίσταται) αυτός είναι ο «Εφαρμογές». Όποιες αλλαγές στην τοποθεσία του Xcode μπορεί να έχει ως αποτέλεσμα την προβληματική λειτουργία άλλων εφαρμογών/υπηρεσιών." + "value" : "Το Xcodes αναζητά και εγκαθιστά σε έναν φάκελο. Ο προεπιλεγμένος και συνιστώμενος φάκελος είναι ο /Applications. Οι αλλαγές στην τοποθεσία του Xcode μπορεί να προκαλέσουν προβλήματα στη λειτουργία άλλων εφαρμογών ή υπηρεσιών." } }, "en" : { @@ -17273,7 +17976,7 @@ "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Xcodes bir klasörü arayıp oraya yükler. Varsayılan(ve önerilen) yöntem /Uygulamalar klasöründe tutmaktır. Xcode'un bulunduğu ortamdaki herhangi bir değişiklik başka bir uygulamanın/servisin çalışmasını durdurabilir." + "value" : "Xcodes bir klasörü arayıp oraya yükler. Varsayılan (ve önerilen) yöntem /Applications klasöründe tutmaktır. Xcode'un bulunduğu ortamdaki herhangi bir değişiklik başka bir uygulamanın/servisin çalışmasını durdurabilir." } }, "uk" : { @@ -18208,7 +18911,7 @@ "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Make active" + "value" : "تعيين كإصدار نشط" } }, "ca" : { @@ -21063,7 +21766,7 @@ "ar" : { "stringUnit" : { "state" : "translated", - "value" : "On select, will keep the name as the version eg. Xcode-13.4.1.app" + "value" : "الاحتفاظ باسم التطبيق الحالي عند تعيينه كإصدار نشط، مثل \u2066Xcode-27.0.app\u2069." } }, "ca" : { @@ -21576,6 +22279,18 @@ }, "Open Browser" : { "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "فتح المتصفح" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "เปิดเบราว์เซอร์" + } + }, "ca" : { "stringUnit" : { "state" : "translated", @@ -22072,6 +22787,18 @@ }, "Paste redirected URL" : { "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لصق عنوان URL بعد إعادة التوجيه" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "วาง URL หลังเปลี่ยนเส้นทาง" + } + }, "ca" : { "stringUnit" : { "state" : "translated", @@ -25425,7 +26152,7 @@ "de" : { "stringUnit" : { "state" : "translated", - "value" : "Show Open In Rosetta option" + "value" : "„Mit Rosetta öffnen“ anzeigen" } }, "el" : { @@ -25555,7 +26282,7 @@ "de" : { "stringUnit" : { "state" : "translated", - "value" : "Open in Rosetta option will show where other \"Open\" functions are available. Note : This will only show for Apple Silicon machines." + "value" : "Zeigt auf Macs mit Apple-Chip eine Option an, um Xcode mit Rosetta zu öffnen." } }, "el" : { @@ -25800,6 +26527,18 @@ }, "Signing out..." : { "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "جارٍ تسجيل الخروج…" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "กำลังออกจากระบบ…" + } + }, "ca" : { "stringUnit" : { "state" : "translated", @@ -26983,7 +27722,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Unarchiving (This can take a while)" + "value" : "Extracting archive (this may take a while)" } }, "es" : { diff --git a/Xcodes/XcodesApp.swift b/Xcodes/XcodesApp.swift index b19534e6..f6318563 100644 --- a/Xcodes/XcodesApp.swift +++ b/Xcodes/XcodesApp.swift @@ -91,6 +91,7 @@ struct XcodesApp: App { case let .deletePlatform(runtime): return Alert( title: Text(String(format: localizeString("Alert.DeletePlatform.Title"), runtime.runtime.name)), + message: Text("Alert.DeletePlatform.Message"), primaryButton: .destructive( Text("Alert.DeletePlatform.PrimaryButton"), action: { diff --git a/XcodesTests/PinCodeInputTests.swift b/XcodesTests/PinCodeInputTests.swift index 7acbd0ff..e9e6d567 100644 --- a/XcodesTests/PinCodeInputTests.swift +++ b/XcodesTests/PinCodeInputTests.swift @@ -73,6 +73,9 @@ struct PinCodeInputTests { #expect(textFields.filter { !$0.isEditable }.count == 6) #expect(inputField.contentType == .oneTimeCode) #expect(inputField.accessibilityLabel() == "Verification code") + let accessibleChildren = try #require(view.accessibilityChildren()) + #expect(accessibleChildren.count == 1) + #expect(accessibleChildren.first as? NSTextFieldCell === inputField.cell) #expect(textFields.filter { !$0.isEditable }.allSatisfy { !$0.isAccessibilityElement() }) }