From 1243a1f93237164e7bb546ea5cab93883b0f5c25 Mon Sep 17 00:00:00 2001 From: Dario Lencina Date: Fri, 20 Mar 2026 23:47:43 -0700 Subject: [PATCH 1/8] move scanner up --- RemoteCam/DeviceScannerView.swift | 4 +- RemoteCam/DeviceScannerViewController.swift | 31 ++++++++++-- RemoteCam/DeviceScannerViewModel.swift | 8 ++- RemoteCam/MultipeerMessages.swift | 5 ++ RemoteCam/MultipeerService.swift | 17 +++++++ RemoteCam/RemoteCamScanning.swift | 2 +- RemoteCam/RemoteCamSession.swift | 8 ++- RemoteCam/RolePickerController.swift | 54 +++------------------ RemoteCam/RolePickerView.swift | 27 +---------- RemoteCam/WelcomeViewController.swift | 4 +- 10 files changed, 77 insertions(+), 83 deletions(-) diff --git a/RemoteCam/DeviceScannerView.swift b/RemoteCam/DeviceScannerView.swift index 0a4cf28..215a002 100644 --- a/RemoteCam/DeviceScannerView.swift +++ b/RemoteCam/DeviceScannerView.swift @@ -110,7 +110,9 @@ struct DeviceScannerView: View { .shadow(color: .black.opacity(0.1), radius: 8, y: 4) } - Text(NSLocalizedString("You need at least 2 devices running Remote Shutter", comment: "")) + Text(viewModel.role == .camera + ? NSLocalizedString("Start scanning and wait for a Remote device to connect", comment: "") + : NSLocalizedString("You need at least 2 devices running Remote Shutter", comment: "")) .font(.subheadline) .foregroundColor(.secondary) .multilineTextAlignment(.center) diff --git a/RemoteCam/DeviceScannerViewController.swift b/RemoteCam/DeviceScannerViewController.swift index 078bad0..cdd1b30 100644 --- a/RemoteCam/DeviceScannerViewController.swift +++ b/RemoteCam/DeviceScannerViewController.swift @@ -36,6 +36,19 @@ func generateQRCode(_ string: String) -> UIImage? { public class DeviceScannerViewController: UIViewController { + // MARK: - Role + + let role: DeviceRole + + init(role: DeviceRole) { + self.role = role + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) not supported") + } + // MARK: - SwiftUI ViewModel let scannerViewModel = DeviceScannerViewModel() @@ -102,6 +115,7 @@ public class DeviceScannerViewController: UIViewController { remoteCamSession = rcs.ref remoteCamSessionInstanceId = rcs.instanceId self.remoteCamSession ! SetViewCtrl(ctrl: self) + scannerViewModel.role = role setupSwiftUIView() } @@ -109,7 +123,9 @@ public class DeviceScannerViewController: UIViewController { super.viewWillAppear(animated) navigationController?.isNavigationBarHidden = false navigationController?.navigationBar.prefersLargeTitles = true - navigationItem.title = NSLocalizedString("Scan for devices", comment: "") + navigationItem.title = role == .camera + ? NSLocalizedString("Waiting for remote", comment: "") + : NSLocalizedString("Scan for cameras", comment: "") navigationItem.rightBarButtonItem = UIBarButtonItem( image: UIImage(systemName: "questionmark.circle"), @@ -290,13 +306,20 @@ public class DeviceScannerViewController: UIViewController { // MARK: - Navigation - func goToRolePicker() { + func goToRole() { scannerViewModel.connectedToPeer() let backItem = UIBarButtonItem() backItem.title = NSLocalizedString("Disconnect", comment: "") navigationItem.backBarButtonItem = backItem - let rolePicker = RolePickerController() - navigationController?.pushViewController(rolePicker, animated: true) + + switch role { + case .camera: + let camera = CameraViewController() + navigationController?.pushViewController(camera, animated: true) + case .monitor: + let monitor = MonitorViewController() + navigationController?.pushViewController(monitor, animated: true) + } } func goToAppSettings() { diff --git a/RemoteCam/DeviceScannerViewModel.swift b/RemoteCam/DeviceScannerViewModel.swift index 460bd66..b0ec870 100644 --- a/RemoteCam/DeviceScannerViewModel.swift +++ b/RemoteCam/DeviceScannerViewModel.swift @@ -11,6 +11,10 @@ final class DeviceScannerViewModel: ObservableObject { @Published var hasScanningError: Bool = false @Published var isConnecting: Bool = false + // MARK: - Role + + var role: DeviceRole = .monitor + // MARK: - UserDefaults private let speedRunScanningKey = userDefaultsSpeedRunScanning @@ -26,7 +30,9 @@ final class DeviceScannerViewModel: ObservableObject { if hasScanningError { return NSLocalizedString("SCANNING ERROR - CHECK NETWORK SETTINGS", comment: "") } else if isScanning { - return NSLocalizedString("SEARCHING FOR NEARBY DEVICES...", comment: "") + return role == .camera + ? NSLocalizedString("WAITING FOR A REMOTE TO CONNECT...", comment: "") + : NSLocalizedString("SEARCHING FOR NEARBY CAMERAS...", comment: "") } else { return NSLocalizedString("TAP THE BUTTON TO GET STARTED", comment: "") } diff --git a/RemoteCam/MultipeerMessages.swift b/RemoteCam/MultipeerMessages.swift index b674bda..141282a 100644 --- a/RemoteCam/MultipeerMessages.swift +++ b/RemoteCam/MultipeerMessages.swift @@ -10,6 +10,11 @@ import Foundation import MultipeerConnectivity import AVFoundation +enum DeviceRole { + case camera + case monitor +} + public class Disconnect: Actor.Message { } diff --git a/RemoteCam/MultipeerService.swift b/RemoteCam/MultipeerService.swift index cb3ea99..5a724cd 100644 --- a/RemoteCam/MultipeerService.swift +++ b/RemoteCam/MultipeerService.swift @@ -30,6 +30,8 @@ protocol MultipeerServiceProtocol: AnyObject { var progressCancellables: Set { get set } func startAdvertisingAndBrowsing() + func startAdvertisingOnly(discoveryInfo: [String: String]?) + func startBrowsingOnly() func stopAdvertisingAndBrowsing() func disconnect() func stopSession() @@ -70,6 +72,21 @@ class MultipeerService: NSObject, MCSessionDelegate, browser.startBrowsingForPeers() } + func startAdvertisingOnly(discoveryInfo: [String: String]? = nil) { + if let info = discoveryInfo { + advertiser.stopAdvertisingPeer() + advertiser = MCNearbyServiceAdvertiser( + peer: session.myPeerID, discoveryInfo: info, serviceType: service) + advertiser.delegate = self + } + advertiser.startAdvertisingPeer() + } + + func startBrowsingOnly() { + browser.stopBrowsingForPeers() + browser.startBrowsingForPeers() + } + func stopAdvertisingAndBrowsing() { advertiser.stopAdvertisingPeer() browser.stopBrowsingForPeers() diff --git a/RemoteCam/RemoteCamScanning.swift b/RemoteCam/RemoteCamScanning.swift index fed17df..fdbaca2 100644 --- a/RemoteCam/RemoteCamScanning.swift +++ b/RemoteCam/RemoteCamScanning.swift @@ -44,7 +44,7 @@ extension RemoteCamSession { state: self.connected(lobbyWrapper: lobbyWrapper, peer: w.peer) ) ^{ - lobby.goToRolePicker() + lobby.goToRole() } case let m as UICmd.BrowserFoundPeer: diff --git a/RemoteCam/RemoteCamSession.swift b/RemoteCam/RemoteCamSession.swift index a78bef7..a9b248e 100644 --- a/RemoteCam/RemoteCamSession.swift +++ b/RemoteCam/RemoteCamSession.swift @@ -108,7 +108,13 @@ public class RemoteCamSession: ViewCtrlActor { } else { multipeerService.disconnect() } - multipeerService.startAdvertisingAndBrowsing() + + switch lobby.role { + case .camera: + multipeerService.startAdvertisingOnly(discoveryInfo: ["role": "camera"]) + case .monitor: + multipeerService.startBrowsingOnly() + } ^{ lobby.navigationController?.popToViewController(lobby, animated: true) diff --git a/RemoteCam/RolePickerController.swift b/RemoteCam/RolePickerController.swift index f646ae5..c1479ac 100644 --- a/RemoteCam/RolePickerController.swift +++ b/RemoteCam/RolePickerController.swift @@ -24,50 +24,13 @@ public class RemoteCamSystem: ActorSystem { let connectedPrompt = NSLocalizedString("Pick a role: Camera or Remote", comment: "") -public class RolePickerActor: ViewCtrlActor { - - override public func receiveWithCtrl(ctrl: Weak) -> Receive { - return {[unowned self] (msg: Message) in - switch msg { - - case is RemoteCmd.PeerBecameMonitor: - ^{ - ctrl.value?.becomeCamera() - } - case is RemoteCmd.PeerBecameCamera: - ^{ - ctrl.value?.becomeMonitor() - } - default: - self.receive(msg: msg) - } - } - } -} - public class RolePickerController: UIViewController { - public struct States { - let connect = "Connect" - let disconnect = "Disconnect" - } - - public let states = States() private var swiftUIHostingController: UIHostingController? - private(set) var rolePicker: ActorRef! - private var rolePickerInstanceId: ObjectIdentifier? - override public func viewDidLoad() { super.viewDidLoad() - let rp = createOrReplaceActor( - clz: RolePickerActor.self, - name: "RolePickerActor" - ) - rolePicker = rp.ref - rolePickerInstanceId = rp.instanceId setupSwiftUIView() - rolePicker ! SetViewCtrl(ctrl: self) } override public func viewWillAppear(_ animated: Bool) { @@ -124,8 +87,8 @@ public class RolePickerController: UIViewController { } func becomeMonitor() { - let monitor = MonitorViewController() - navigationController?.pushViewController(monitor, animated: true) + let scanner = DeviceScannerViewController(role: .monitor) + navigationController?.pushViewController(scanner, animated: true) } func becomeCamera() { @@ -137,8 +100,8 @@ public class RolePickerController: UIViewController { permissionManager.updatePermissionStatuses() if permissionManager.areCameraAndPhotosGranted { - let camera = CameraViewController() - navigationController?.pushViewController(camera, animated: true) + let scanner = DeviceScannerViewController(role: .camera) + navigationController?.pushViewController(scanner, animated: true) } else if permissionManager.areCameraAndPhotosDenied { showCameraPermissionsModal(permissionType: .denied) } else { @@ -173,8 +136,8 @@ public class RolePickerController: UIViewController { PermissionManager.shared.requestCameraAndPhotosPermissions { [weak self] granted in DispatchQueue.main.async { if granted { - let camera = CameraViewController() - self?.navigationController?.pushViewController(camera, animated: true) + let scanner = DeviceScannerViewController(role: .camera) + self?.navigationController?.pushViewController(scanner, animated: true) } else { self?.showCameraPermissionsModal(permissionType: .denied) } @@ -182,9 +145,4 @@ public class RolePickerController: UIViewController { } } - deinit { - print("killing RolePickerController") - stopActorIfCurrent(ref: rolePicker, instanceId: rolePickerInstanceId) - } - } diff --git a/RemoteCam/RolePickerView.swift b/RemoteCam/RolePickerView.swift index dc30bf5..65183e8 100644 --- a/RemoteCam/RolePickerView.swift +++ b/RemoteCam/RolePickerView.swift @@ -12,31 +12,8 @@ struct RolePickerView: View { AppTheme.backgroundGradient VStack(spacing: 0) { - // Connected pill - HStack(spacing: 6) { - Circle() - .fill(AppTheme.success) - .frame(width: 8, height: 8) - .overlay( - Circle() - .fill(AppTheme.success.opacity(0.4)) - .frame(width: 16, height: 16) - ) - Text(NSLocalizedString("Connected", comment: "")) - .font(.caption) - .fontWeight(.medium) - .foregroundColor(.primary) - } - .padding(.vertical, 6) - .padding(.horizontal, 14) - .background(.ultraThinMaterial) - .clipShape(Capsule()) - .overlay( - Capsule() - .strokeBorder(AppTheme.glassBorder, lineWidth: 0.5) - ) - .padding(.top, 4) - .padding(.bottom, 16) + Spacer() + .frame(height: 20) // Two glass panels VStack(spacing: 12) { diff --git a/RemoteCam/WelcomeViewController.swift b/RemoteCam/WelcomeViewController.swift index 07af3aa..f0e98bb 100644 --- a/RemoteCam/WelcomeViewController.swift +++ b/RemoteCam/WelcomeViewController.swift @@ -72,8 +72,8 @@ class WelcomeViewController: UIViewController { // MARK: - Navigation func goToConnectViewController() { - let scanner = DeviceScannerViewController() - navigationController?.pushViewController(scanner, animated: true) + let rolePicker = RolePickerController() + navigationController?.pushViewController(rolePicker, animated: true) } func showHelp() { From 5d8877ac0cdea8128e23bcb85d7c66d335a66a69 Mon Sep 17 00:00:00 2001 From: Dario Lencina Date: Fri, 20 Mar 2026 23:47:55 -0700 Subject: [PATCH 2/8] fix tests --- RemoteCamTests/DeviceScannerViewModelTests.swift | 16 ++++++++++++++-- RemoteCamTests/RemoteCamSessionTests.swift | 6 ++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/RemoteCamTests/DeviceScannerViewModelTests.swift b/RemoteCamTests/DeviceScannerViewModelTests.swift index 5f971b4..ab9e547 100644 --- a/RemoteCamTests/DeviceScannerViewModelTests.swift +++ b/RemoteCamTests/DeviceScannerViewModelTests.swift @@ -179,13 +179,25 @@ final class DeviceScannerViewModelTests: XCTestCase { ) } - func testStatusMessageScanning() { + func testStatusMessageScanningMonitorRole() { let vm = DeviceScannerViewModel() + vm.role = .monitor vm.startedScanning() XCTAssertEqual( vm.statusMessage, - NSLocalizedString("SEARCHING FOR NEARBY DEVICES...", comment: "") + NSLocalizedString("SEARCHING FOR NEARBY CAMERAS...", comment: "") + ) + } + + func testStatusMessageScanningCameraRole() { + let vm = DeviceScannerViewModel() + vm.role = .camera + vm.startedScanning() + + XCTAssertEqual( + vm.statusMessage, + NSLocalizedString("WAITING FOR A REMOTE TO CONNECT...", comment: "") ) } diff --git a/RemoteCamTests/RemoteCamSessionTests.swift b/RemoteCamTests/RemoteCamSessionTests.swift index 5280244..24d90af 100644 --- a/RemoteCamTests/RemoteCamSessionTests.swift +++ b/RemoteCamTests/RemoteCamSessionTests.swift @@ -29,6 +29,8 @@ class FakeMultipeerService: MultipeerServiceProtocol { var sendResult: Try = Failure(error: NSError(domain: "test", code: 0)) func startAdvertisingAndBrowsing() { startAdvertisingAndBrowsingCalled = true } + func startAdvertisingOnly(discoveryInfo: [String: String]?) { startAdvertisingAndBrowsingCalled = true } + func startBrowsingOnly() { startAdvertisingAndBrowsingCalled = true } func stopAdvertisingAndBrowsing() { stopAdvertisingAndBrowsingCalled = true } func disconnect() { disconnectCalled = true } func stopSession() { stopSessionCalled = true } @@ -86,6 +88,10 @@ class TestableRemoteCamSession: RemoteCamSession { /// Subclass that prevents actor system registration in tests. class TestDeviceScannerViewController: DeviceScannerViewController { + convenience init() { + self.init(role: .monitor) + } + override public func viewDidLoad() { // Skip super — avoids actor system registration } From f33804d4524f7c24c0cafaa4f635588a7195af80 Mon Sep 17 00:00:00 2001 From: Dario Lencina Date: Sat, 21 Mar 2026 00:03:43 -0700 Subject: [PATCH 3/8] changed up tutorial to follow new flow --- RemoteCam/DeviceScannerView.swift | 119 +++++++++++++++++++++- RemoteCam/RemoteShutterHelpView.swift | 4 +- RemoteCam/da.lproj/Localizable.strings | 23 ++++- RemoteCam/en.lproj/Localizable.strings | 21 +++- RemoteCam/es-MX.lproj/Localizable.strings | 23 ++++- RemoteCam/fr-FR.lproj/Localizable.strings | 23 ++++- RemoteCam/it.lproj/Localizable.strings | 23 ++++- 7 files changed, 208 insertions(+), 28 deletions(-) diff --git a/RemoteCam/DeviceScannerView.swift b/RemoteCam/DeviceScannerView.swift index 215a002..a68c434 100644 --- a/RemoteCam/DeviceScannerView.swift +++ b/RemoteCam/DeviceScannerView.swift @@ -17,7 +17,9 @@ struct DeviceScannerView: View { ZStack { AppTheme.backgroundGradient - if viewModel.hasPeers { + if viewModel.role == .camera { + cameraWaitingState + } else if viewModel.hasPeers { peerList } else { emptyState @@ -80,6 +82,62 @@ struct DeviceScannerView: View { } } + // MARK: - Camera Waiting State + + private var cameraWaitingState: some View { + VStack(spacing: 24) { + Spacer() + + // Camera icon + ZStack { + Circle() + .fill(AppTheme.accent.opacity(0.12)) + .frame(width: 120, height: 120) + + Circle() + .strokeBorder(AppTheme.accent.opacity(0.25), lineWidth: 1.5) + .frame(width: 120, height: 120) + + Image(systemName: "camera.fill") + .font(.system(size: 48, weight: .medium)) + .foregroundColor(AppTheme.accent) + } + + VStack(spacing: 8) { + Text(NSLocalizedString("Camera Mode", comment: "")) + .font(.title2) + .fontWeight(.bold) + .foregroundColor(.primary) + + Text(NSLocalizedString("On another device, open Remote Shutter and select Remote. This camera will appear in their device list.", comment: "")) + .font(.subheadline) + .foregroundColor(.secondary) + .multilineTextAlignment(.center) + .padding(.horizontal, 40) + } + + // Status + statusBadge + + // Actions + VStack(spacing: 12) { + if !viewModel.hasLocalNetworkAccess { + settingsButton + } else if viewModel.isScanning { + cameraAdvertisingIndicator + goOfflineButton + } else { + goOnlineButton + } + + shareButton + } + .padding(.horizontal, 20) + + Spacer() + } + } + // MARK: - Empty State private var emptyState: some View { @@ -227,7 +285,24 @@ struct DeviceScannerView: View { private var scanningIndicator: some View { HStack(spacing: 12) { ProgressView() - Text(NSLocalizedString("Scanning for nearby devices...", comment: "")) + Text(NSLocalizedString("Scanning for nearby cameras...", comment: "")) + .font(.subheadline) + .foregroundColor(.secondary) + } + .frame(maxWidth: .infinity) + .frame(height: 54) + .background(.ultraThinMaterial) + .clipShape(RoundedRectangle(cornerRadius: 14)) + .overlay( + RoundedRectangle(cornerRadius: 14) + .strokeBorder(AppTheme.glassBorder, lineWidth: 0.5) + ) + } + + private var cameraAdvertisingIndicator: some View { + HStack(spacing: 12) { + ProgressView() + Text(NSLocalizedString("Waiting for a remote to connect...", comment: "")) .font(.subheadline) .foregroundColor(.secondary) } @@ -241,6 +316,46 @@ struct DeviceScannerView: View { ) } + private var goOnlineButton: some View { + Button(action: onStartScanning) { + HStack { + Image(systemName: "antenna.radiowaves.left.and.right") + .font(.headline) + Text(NSLocalizedString("Go Online", comment: "")) + .font(.headline) + } + .foregroundColor(.black) + .frame(maxWidth: .infinity) + .frame(height: 54) + .background( + LinearGradient( + colors: [AppTheme.accent, AppTheme.accentLight], + startPoint: .leading, + endPoint: .trailing + ) + ) + .clipShape(RoundedRectangle(cornerRadius: 14)) + .shadow(color: AppTheme.accent.opacity(0.3), radius: 8, y: 4) + } + } + + private var goOfflineButton: some View { + Button(action: onStopScanning) { + HStack { + Image(systemName: "stop.fill") + .font(.subheadline) + Text(NSLocalizedString("Go Offline", comment: "")) + .font(.subheadline) + .fontWeight(.medium) + } + .foregroundColor(.secondary) + .frame(maxWidth: .infinity) + .frame(height: 44) + .background(Color(.secondarySystemGroupedBackground)) + .clipShape(RoundedRectangle(cornerRadius: 12)) + } + } + private var settingsButton: some View { Button(action: onOpenSettings) { HStack { diff --git a/RemoteCam/RemoteShutterHelpView.swift b/RemoteCam/RemoteShutterHelpView.swift index 063eba1..079912f 100644 --- a/RemoteCam/RemoteShutterHelpView.swift +++ b/RemoteCam/RemoteShutterHelpView.swift @@ -33,10 +33,10 @@ struct RemoteShutterHelpView: View { // Content Pages TabView(selection: $selectedPage) { - ConnectDevicesPage() + ChooseRolePage() .tag(0) - ChooseRolePage() + ConnectDevicesPage() .tag(1) CaptureMediaPage() diff --git a/RemoteCam/da.lproj/Localizable.strings b/RemoteCam/da.lproj/Localizable.strings index 6d55cef..3d0a5b5 100644 --- a/RemoteCam/da.lproj/Localizable.strings +++ b/RemoteCam/da.lproj/Localizable.strings @@ -76,16 +76,16 @@ "help_done" = "Færdig"; /* Help Page 1 - Connect Devices */ -"help_connect_title" = "1. Forbind Enheder"; -"help_connect_description" = "Sørg for at begge enheder har Wi-Fi og Bluetooth aktiveret, tryk derefter på 'Start Scanning af Enheder' for at finde enheder i nærheden som kører Remote Shutter."; +"help_connect_title" = "2. Forbind Enheder"; +"help_connect_description" = "Kameraenheden går online og venter. På Fjernbetjeningsenheden, scan efter kameraer og tryk på kameraets navn for at forbinde."; "help_quick_setup_title" = "Hurtig Opsætning"; "help_quick_setup_description" = "Brug QR-koden til at downloade Remote Shutter på din anden enhed fra App Store"; "help_same_network_title" = "Direkte Forbindelse"; "help_same_network_description" = "Enheder forbinder direkte til hinanden ved hjælp af Wi-Fi og Bluetooth, ligesom AirDrop - ingen internet påkrævet"; /* Help Page 2 - Choose Roles */ -"help_roles_title" = "2. Vælg Enhedsroller"; -"help_roles_description" = "Når de er forbundet, vælger hver enhed sin rolle. Den ene bliver kameraet, den anden bliver fjernbetjeningen."; +"help_roles_title" = "1. Vælg Din Rolle"; +"help_roles_description" = "Vælg først om denne enhed skal være Kameraet eller Fjernbetjeningen. Kameraenheden tager fotos og videoer, mens fjernbetjeningen styrer det."; "help_camera_device_title" = "Kamera Enhed"; "help_camera_device_description" = "Tager fotos og videoer, viser kamera forhåndsvisning"; "help_remote_device_title" = "Fjernbetjenings Enhed"; @@ -114,4 +114,17 @@ "help_switch_cameras_title" = "Skift Kameraer"; "help_switch_cameras_description" = "Skift mellem front- og bagkameraer direkte fra fjernbetjeningsenheden"; "help_auto_save_title" = "Automatisk Gem"; -"help_auto_save_description" = "Fotos og videoer gemmes automatisk i begge enheders fotobiblioteker"; \ No newline at end of file +"help_auto_save_description" = "Fotos og videoer gemmes automatisk i begge enheders fotobiblioteker"; + +/* Scanner - Role-aware UI */ +"Waiting for remote" = "Venter på fjernbetjening"; +"Scan for cameras" = "Scan efter kameraer"; +"Camera Mode" = "Kameratilstand"; +"On another device, open Remote Shutter and select Remote. This camera will appear in their device list." = "Åbn Remote Shutter på en anden enhed og vælg Fjernbetjening. Dette kamera vil vises i deres enhedsliste."; +"Go Online" = "Gå Online"; +"Go Offline" = "Gå Offline"; +"Waiting for a remote to connect..." = "Venter på en fjernbetjening..."; +"WAITING FOR A REMOTE TO CONNECT..." = "VENTER PÅ EN FJERNBETJENING..."; +"SEARCHING FOR NEARBY CAMERAS..." = "SØGER EFTER KAMERAER I NÆRHEDEN..."; +"Scanning for nearby cameras..." = "Scanner efter kameraer i nærheden..."; +"Start scanning and wait for a Remote device to connect" = "Start scanning og vent på at en Fjernbetjeningsenhed forbinder"; \ No newline at end of file diff --git a/RemoteCam/en.lproj/Localizable.strings b/RemoteCam/en.lproj/Localizable.strings index db78450..acf7c1d 100644 --- a/RemoteCam/en.lproj/Localizable.strings +++ b/RemoteCam/en.lproj/Localizable.strings @@ -200,16 +200,16 @@ "help_done" = "Done"; /* Help Page 1 - Connect Devices */ -"help_connect_title" = "1. Connect Devices"; -"help_connect_description" = "Make sure both devices have Wi-Fi and Bluetooth enabled, then tap 'Start Scanning Devices' to find nearby devices running Remote Shutter."; +"help_connect_title" = "2. Connect Devices"; +"help_connect_description" = "The Camera device goes online and waits. On the Remote device, scan for cameras and tap the camera's name to connect."; "help_quick_setup_title" = "Quick Setup"; "help_quick_setup_description" = "Use the QR code to download Remote Shutter on your second device from the App Store"; "help_same_network_title" = "Peer-to-Peer Connection"; "help_same_network_description" = "Devices connect directly to each other using Wi-Fi and Bluetooth, just like AirDrop - no internet required"; /* Help Page 2 - Choose Roles */ -"help_roles_title" = "2. Choose Device Roles"; -"help_roles_description" = "Once connected, each device chooses its role. One becomes the camera, the other becomes the remote control."; +"help_roles_title" = "1. Choose Your Role"; +"help_roles_description" = "First, choose whether this device will be the Camera or the Remote. The camera device captures photos and videos, while the remote controls it."; "help_camera_device_title" = "Camera Device"; "help_camera_device_description" = "Takes photos and videos, shows camera preview"; "help_remote_device_title" = "Remote Device"; @@ -236,3 +236,16 @@ "help_switch_cameras_description" = "Toggle between front and back cameras directly from the remote device"; "help_auto_save_title" = "Auto Save"; "help_auto_save_description" = "Photos and videos are automatically saved to both devices' photo libraries"; + +/* Scanner - Role-aware UI */ +"Waiting for remote" = "Waiting for remote"; +"Scan for cameras" = "Scan for cameras"; +"Camera Mode" = "Camera Mode"; +"On another device, open Remote Shutter and select Remote. This camera will appear in their device list." = "On another device, open Remote Shutter and select Remote. This camera will appear in their device list."; +"Go Online" = "Go Online"; +"Go Offline" = "Go Offline"; +"Waiting for a remote to connect..." = "Waiting for a remote to connect..."; +"WAITING FOR A REMOTE TO CONNECT..." = "WAITING FOR A REMOTE TO CONNECT..."; +"SEARCHING FOR NEARBY CAMERAS..." = "SEARCHING FOR NEARBY CAMERAS..."; +"Scanning for nearby cameras..." = "Scanning for nearby cameras..."; +"Start scanning and wait for a Remote device to connect" = "Start scanning and wait for a Remote device to connect"; diff --git a/RemoteCam/es-MX.lproj/Localizable.strings b/RemoteCam/es-MX.lproj/Localizable.strings index 1f0441a..219edc8 100644 --- a/RemoteCam/es-MX.lproj/Localizable.strings +++ b/RemoteCam/es-MX.lproj/Localizable.strings @@ -96,16 +96,16 @@ "help_done" = "Listo"; /* Help Page 1 - Connect Devices */ -"help_connect_title" = "1. Conectar Dispositivos"; -"help_connect_description" = "Asegúrate de que ambos dispositivos tengan Wi-Fi y Bluetooth habilitados, luego toca 'Empezar a Escanear Dispositivos' para encontrar dispositivos cercanos que usen Remote Shutter."; +"help_connect_title" = "2. Conectar Dispositivos"; +"help_connect_description" = "El dispositivo Cámara se conecta y espera. En el dispositivo Remoto, escanea buscando cámaras y toca el nombre de la cámara para conectar."; "help_quick_setup_title" = "Configuración Rápida"; "help_quick_setup_description" = "Usa el código QR para descargar Remote Shutter en tu segundo dispositivo desde la App Store"; "help_same_network_title" = "Conexión Directa"; "help_same_network_description" = "Los dispositivos se conectan directamente entre sí usando Wi-Fi y Bluetooth, como AirDrop - no requiere internet"; /* Help Page 2 - Choose Roles */ -"help_roles_title" = "2. Elegir Roles de Dispositivos"; -"help_roles_description" = "Una vez conectados, cada dispositivo elige su rol. Uno se convierte en la cámara, el otro en el control remoto."; +"help_roles_title" = "1. Elige Tu Rol"; +"help_roles_description" = "Primero, elige si este dispositivo será la Cámara o el Remoto. El dispositivo cámara captura fotos y videos, mientras el remoto lo controla."; "help_camera_device_title" = "Dispositivo Cámara"; "help_camera_device_description" = "Toma fotos y videos, muestra vista previa de la cámara"; "help_remote_device_title" = "Dispositivo Remoto"; @@ -131,4 +131,17 @@ "help_switch_cameras_title" = "Cambiar Cámaras"; "help_switch_cameras_description" = "Alterna entre cámaras frontal y trasera directamente desde el dispositivo remoto"; "help_auto_save_title" = "Guardado Automático"; -"help_auto_save_description" = "Las fotos y videos se guardan automáticamente en las bibliotecas de fotos de ambos dispositivos"; \ No newline at end of file +"help_auto_save_description" = "Las fotos y videos se guardan automáticamente en las bibliotecas de fotos de ambos dispositivos"; + +/* Scanner - Role-aware UI */ +"Waiting for remote" = "Esperando remoto"; +"Scan for cameras" = "Buscar cámaras"; +"Camera Mode" = "Modo Cámara"; +"On another device, open Remote Shutter and select Remote. This camera will appear in their device list." = "En otro dispositivo, abre Remote Shutter y selecciona Remoto. Esta cámara aparecerá en su lista de dispositivos."; +"Go Online" = "Conectar"; +"Go Offline" = "Desconectar"; +"Waiting for a remote to connect..." = "Esperando un remoto para conectar..."; +"WAITING FOR A REMOTE TO CONNECT..." = "ESPERANDO UN REMOTO PARA CONECTAR..."; +"SEARCHING FOR NEARBY CAMERAS..." = "BUSCANDO CÁMARAS CERCANAS..."; +"Scanning for nearby cameras..." = "Buscando cámaras cercanas..."; +"Start scanning and wait for a Remote device to connect" = "Empieza a escanear y espera que un dispositivo Remoto se conecte"; \ No newline at end of file diff --git a/RemoteCam/fr-FR.lproj/Localizable.strings b/RemoteCam/fr-FR.lproj/Localizable.strings index 729b216..e3d1ca0 100644 --- a/RemoteCam/fr-FR.lproj/Localizable.strings +++ b/RemoteCam/fr-FR.lproj/Localizable.strings @@ -96,16 +96,16 @@ "help_done" = "Terminé"; /* Help Page 1 - Connect Devices */ -"help_connect_title" = "1. Connecter les Appareils"; -"help_connect_description" = "Assurez-vous que les deux appareils ont le Wi-Fi et le Bluetooth activés, puis appuyez sur 'Commencer la Recherche d'Appareils' pour trouver les appareils proches qui utilisent Remote Shutter."; +"help_connect_title" = "2. Connecter les Appareils"; +"help_connect_description" = "L'appareil Photo se met en ligne et attend. Sur l'appareil Télécommande, recherchez les appareils photos et appuyez sur le nom de l'appareil pour connecter."; "help_quick_setup_title" = "Configuration Rapide"; "help_quick_setup_description" = "Utilisez le QR code pour télécharger Remote Shutter sur votre deuxième appareil depuis l'App Store"; "help_same_network_title" = "Connexion Directe"; "help_same_network_description" = "Les appareils se connectent directement entre eux via Wi-Fi et Bluetooth, comme AirDrop - aucune connexion internet requise"; /* Help Page 2 - Choose Roles */ -"help_roles_title" = "2. Choisir les Rôles des Appareils"; -"help_roles_description" = "Une fois connectés, chaque appareil choisit son rôle. L'un devient la caméra, l'autre devient la télécommande."; +"help_roles_title" = "1. Choisissez Votre Rôle"; +"help_roles_description" = "D'abord, choisissez si cet appareil sera l'Appareil Photo ou la Télécommande. L'appareil photo capture photos et vidéos, tandis que la télécommande le contrôle."; "help_camera_device_title" = "Appareil Caméra"; "help_camera_device_description" = "Prend des photos et vidéos, affiche l'aperçu de la caméra"; "help_remote_device_title" = "Appareil Télécommande"; @@ -131,4 +131,17 @@ "help_switch_cameras_title" = "Changer de Caméra"; "help_switch_cameras_description" = "Basculez entre les caméras avant et arrière directement depuis l'appareil télécommande"; "help_auto_save_title" = "Sauvegarde Automatique"; -"help_auto_save_description" = "Les photos et vidéos sont automatiquement sauvegardées dans les photothèques des deux appareils"; \ No newline at end of file +"help_auto_save_description" = "Les photos et vidéos sont automatiquement sauvegardées dans les photothèques des deux appareils"; + +/* Scanner - Role-aware UI */ +"Waiting for remote" = "En attente de télécommande"; +"Scan for cameras" = "Rechercher des appareils photos"; +"Camera Mode" = "Mode Appareil Photo"; +"On another device, open Remote Shutter and select Remote. This camera will appear in their device list." = "Sur un autre appareil, ouvrez Remote Shutter et sélectionnez Télécommande. Cet appareil photo apparaîtra dans leur liste d'appareils."; +"Go Online" = "Se Connecter"; +"Go Offline" = "Se Déconnecter"; +"Waiting for a remote to connect..." = "En attente d'une télécommande..."; +"WAITING FOR A REMOTE TO CONNECT..." = "EN ATTENTE D'UNE TÉLÉCOMMANDE..."; +"SEARCHING FOR NEARBY CAMERAS..." = "RECHERCHE D'APPAREILS PHOTOS..."; +"Scanning for nearby cameras..." = "Recherche d'appareils photos..."; +"Start scanning and wait for a Remote device to connect" = "Lancez la recherche et attendez qu'un appareil Télécommande se connecte"; \ No newline at end of file diff --git a/RemoteCam/it.lproj/Localizable.strings b/RemoteCam/it.lproj/Localizable.strings index 634038b..5b94126 100644 --- a/RemoteCam/it.lproj/Localizable.strings +++ b/RemoteCam/it.lproj/Localizable.strings @@ -76,16 +76,16 @@ "help_done" = "Fatto"; /* Help Page 1 - Connect Devices */ -"help_connect_title" = "1. Connetti i Dispositivi"; -"help_connect_description" = "Assicurati che entrambi i dispositivi abbiano Wi-Fi e Bluetooth abilitati, poi tocca 'Inizia Scansione Dispositivi' per trovare dispositivi vicini che usano Remote Shutter."; +"help_connect_title" = "2. Connetti i Dispositivi"; +"help_connect_description" = "Il dispositivo Fotocamera va online e aspetta. Sul dispositivo Telecomando, cerca le fotocamere e tocca il nome della fotocamera per connetterti."; "help_quick_setup_title" = "Configurazione Rapida"; "help_quick_setup_description" = "Usa il codice QR per scaricare Remote Shutter sul tuo secondo dispositivo dall'App Store"; "help_same_network_title" = "Connessione Diretta"; "help_same_network_description" = "I dispositivi si connettono direttamente tra loro usando Wi-Fi e Bluetooth, come AirDrop - nessuna connessione internet richiesta"; /* Help Page 2 - Choose Roles */ -"help_roles_title" = "2. Scegli i Ruoli dei Dispositivi"; -"help_roles_description" = "Una volta connessi, ogni dispositivo sceglie il suo ruolo. Uno diventa la fotocamera, l'altro diventa il telecomando."; +"help_roles_title" = "1. Scegli il Tuo Ruolo"; +"help_roles_description" = "Prima, scegli se questo dispositivo sarà la Fotocamera o il Telecomando. Il dispositivo fotocamera cattura foto e video, mentre il telecomando lo controlla."; "help_camera_device_title" = "Dispositivo Fotocamera"; "help_camera_device_description" = "Scatta foto e video, mostra anteprima fotocamera"; "help_remote_device_title" = "Dispositivo Telecomando"; @@ -114,4 +114,17 @@ "help_switch_cameras_title" = "Cambia Fotocamere"; "help_switch_cameras_description" = "Alterna tra fotocamere frontale e posteriore direttamente dal dispositivo telecomando"; "help_auto_save_title" = "Salvataggio Automatico"; -"help_auto_save_description" = "Foto e video vengono salvati automaticamente nelle librerie foto di entrambi i dispositivi"; \ No newline at end of file +"help_auto_save_description" = "Foto e video vengono salvati automaticamente nelle librerie foto di entrambi i dispositivi"; + +/* Scanner - Role-aware UI */ +"Waiting for remote" = "In attesa del telecomando"; +"Scan for cameras" = "Cerca fotocamere"; +"Camera Mode" = "Modalità Fotocamera"; +"On another device, open Remote Shutter and select Remote. This camera will appear in their device list." = "Su un altro dispositivo, apri Remote Shutter e seleziona Telecomando. Questa fotocamera apparirà nella loro lista dispositivi."; +"Go Online" = "Vai Online"; +"Go Offline" = "Vai Offline"; +"Waiting for a remote to connect..." = "In attesa di un telecomando..."; +"WAITING FOR A REMOTE TO CONNECT..." = "IN ATTESA DI UN TELECOMANDO..."; +"SEARCHING FOR NEARBY CAMERAS..." = "RICERCA FOTOCAMERE NELLE VICINANZE..."; +"Scanning for nearby cameras..." = "Ricerca fotocamere nelle vicinanze..."; +"Start scanning and wait for a Remote device to connect" = "Avvia la scansione e attendi che un dispositivo Telecomando si connetta"; \ No newline at end of file From 81abb2502993300ba1c9f60c96110fac3ed0db66 Mon Sep 17 00:00:00 2001 From: Dario Lencina Date: Sat, 21 Mar 2026 00:33:07 -0700 Subject: [PATCH 4/8] save --- RemoteCam/CameraViewController.swift | 21 ++ RemoteCam/DeviceScannerView.swift | 77 ++++-- RemoteCam/MonitorViewController.swift | 21 ++ RemoteCam/RolePickerController.swift | 24 +- RemoteCam/RolePickerView.swift | 4 +- RemoteCam/da.lproj/Localizable.strings | 24 +- RemoteCam/de-DE.lproj/Localizable.strings | 273 ++++++++++++++++++++ RemoteCam/en.lproj/Localizable.strings | 22 ++ RemoteCam/es-MX.lproj/Localizable.strings | 24 +- RemoteCam/fr-FR.lproj/Localizable.strings | 24 +- RemoteCam/it.lproj/Localizable.strings | 24 +- RemoteCam/ja.lproj/Localizable.strings | 273 ++++++++++++++++++++ RemoteCam/ko.lproj/Localizable.strings | 273 ++++++++++++++++++++ RemoteCam/pt-BR.lproj/Localizable.strings | 273 ++++++++++++++++++++ RemoteCam/zh-Hans.lproj/Localizable.strings | 273 ++++++++++++++++++++ 15 files changed, 1586 insertions(+), 44 deletions(-) create mode 100644 RemoteCam/de-DE.lproj/Localizable.strings create mode 100644 RemoteCam/ja.lproj/Localizable.strings create mode 100644 RemoteCam/ko.lproj/Localizable.strings create mode 100644 RemoteCam/pt-BR.lproj/Localizable.strings create mode 100644 RemoteCam/zh-Hans.lproj/Localizable.strings diff --git a/RemoteCam/CameraViewController.swift b/RemoteCam/CameraViewController.swift index bc5da34..238febb 100644 --- a/RemoteCam/CameraViewController.swift +++ b/RemoteCam/CameraViewController.swift @@ -148,9 +148,30 @@ public class CameraViewController: UIViewController, navigationController?.navigationBar.scrollEdgeAppearance = appearance navigationController?.navigationBar.tintColor = .white + navigationItem.rightBarButtonItem = UIBarButtonItem( + image: UIImage(systemName: "questionmark.circle"), + style: .plain, + target: self, + action: #selector(showHelpModal) + ) + orientation = getOrientation() } + @objc private func showHelpModal() { + let helpView = RemoteShutterHelpView(onDismiss: { [weak self] in + self?.dismiss(animated: true) + }) + let hostingController = UIHostingController(rootView: helpView) + hostingController.modalPresentationStyle = .pageSheet + if let sheet = hostingController.sheetPresentationController { + sheet.detents = [.large()] + sheet.prefersGrabberVisible = true + sheet.preferredCornerRadius = 20 + } + present(hostingController, animated: true) + } + override public func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) checkPermissionsAndSetupCamera() diff --git a/RemoteCam/DeviceScannerView.swift b/RemoteCam/DeviceScannerView.swift index a68c434..478ff54 100644 --- a/RemoteCam/DeviceScannerView.swift +++ b/RemoteCam/DeviceScannerView.swift @@ -135,6 +135,9 @@ struct DeviceScannerView: View { .padding(.horizontal, 20) Spacer() + + // QR code + tip + qrCodeSection } } @@ -144,33 +147,28 @@ struct DeviceScannerView: View { VStack(spacing: 24) { Spacer() - // QR code - VStack(spacing: 16) { - if let qrImage = qrCodeImage { - Image(uiImage: qrImage) - .interpolation(.none) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 160, height: 160) - .padding(12) - .background(.ultraThinMaterial) - .clipShape(RoundedRectangle(cornerRadius: 18)) - .overlay( - RoundedRectangle(cornerRadius: 18) - .strokeBorder(AppTheme.glassBorder, lineWidth: 0.5) - ) - } else { - Image("AppLogo") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 80, height: 80) - .clipShape(RoundedRectangle(cornerRadius: 18)) - .shadow(color: .black.opacity(0.1), radius: 8, y: 4) - } + // Remote icon + ZStack { + Circle() + .fill(AppTheme.secondary.opacity(0.12)) + .frame(width: 120, height: 120) + + Circle() + .strokeBorder(AppTheme.secondary.opacity(0.25), lineWidth: 1.5) + .frame(width: 120, height: 120) + + Image(systemName: "antenna.radiowaves.left.and.right") + .font(.system(size: 48, weight: .medium)) + .foregroundColor(AppTheme.secondary) + } + + VStack(spacing: 8) { + Text(NSLocalizedString("Remote Mode", comment: "")) + .font(.title2) + .fontWeight(.bold) + .foregroundColor(.primary) - Text(viewModel.role == .camera - ? NSLocalizedString("Start scanning and wait for a Remote device to connect", comment: "") - : NSLocalizedString("You need at least 2 devices running Remote Shutter", comment: "")) + Text(NSLocalizedString("You need at least 2 devices running Remote Shutter", comment: "")) .font(.subheadline) .foregroundColor(.secondary) .multilineTextAlignment(.center) @@ -197,7 +195,30 @@ struct DeviceScannerView: View { Spacer() - // Tip + // QR code + tip + qrCodeSection + } + } + + // MARK: - QR Code Section + + private var qrCodeSection: some View { + VStack(spacing: 12) { + if let qrImage = qrCodeImage { + Image(uiImage: qrImage) + .interpolation(.none) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 120, height: 120) + .padding(8) + .background(.ultraThinMaterial) + .clipShape(RoundedRectangle(cornerRadius: 14)) + .overlay( + RoundedRectangle(cornerRadius: 14) + .strokeBorder(AppTheme.glassBorder, lineWidth: 0.5) + ) + } + HStack(spacing: 8) { Image(systemName: "qrcode") .font(.caption) @@ -207,8 +228,8 @@ struct DeviceScannerView: View { .foregroundColor(.secondary) } .padding(.horizontal, 20) - .padding(.bottom, 20) } + .padding(.bottom, 20) } // MARK: - Components diff --git a/RemoteCam/MonitorViewController.swift b/RemoteCam/MonitorViewController.swift index 3926e07..89bc832 100644 --- a/RemoteCam/MonitorViewController.swift +++ b/RemoteCam/MonitorViewController.swift @@ -314,6 +314,27 @@ public class MonitorViewController: iAdViewController, UIImagePickerControllerDe navigationController?.navigationBar.standardAppearance = appearance navigationController?.navigationBar.scrollEdgeAppearance = appearance navigationController?.navigationBar.tintColor = .white + + navigationItem.rightBarButtonItem = UIBarButtonItem( + image: UIImage(systemName: "questionmark.circle"), + style: .plain, + target: self, + action: #selector(showHelpModal) + ) + } + + @objc private func showHelpModal() { + let helpView = RemoteShutterHelpView(onDismiss: { [weak self] in + self?.dismiss(animated: true) + }) + let hostingController = UIHostingController(rootView: helpView) + hostingController.modalPresentationStyle = .pageSheet + if let sheet = hostingController.sheetPresentationController { + sheet.detents = [.large()] + sheet.prefersGrabberVisible = true + sheet.preferredCornerRadius = 20 + } + present(hostingController, animated: true) } override public func viewDidLoad() { diff --git a/RemoteCam/RolePickerController.swift b/RemoteCam/RolePickerController.swift index c1479ac..be6e2d6 100644 --- a/RemoteCam/RolePickerController.swift +++ b/RemoteCam/RolePickerController.swift @@ -40,11 +40,12 @@ public class RolePickerController: UIViewController { navigationItem.title = NSLocalizedString("Pick a role", comment: "") navigationItem.rightBarButtonItem = UIBarButtonItem( - title: NSLocalizedString("Info", comment: ""), + image: UIImage(systemName: "questionmark.circle"), style: .plain, target: self, - action: #selector(showSettingsAction) + action: #selector(showHelpModal) ) + navigationItem.rightBarButtonItem?.tintColor = UIColor(AppTheme.accent) } // MARK: - SwiftUI Setup @@ -56,9 +57,6 @@ public class RolePickerController: UIViewController { }, onRemote: { [weak self] in self?.becomeMonitor() - }, - onSettings: { [weak self] in - self?.showSettingsAction() } ) @@ -80,10 +78,18 @@ public class RolePickerController: UIViewController { // MARK: - Navigation - @objc private func showSettingsAction() { - let ctrl = UIHostingController(rootView: SettingsView()) - ctrl.modalPresentationStyle = .pageSheet - self.present(ctrl, animated: true) + @objc private func showHelpModal() { + let helpView = RemoteShutterHelpView(onDismiss: { [weak self] in + self?.dismiss(animated: true) + }) + let hostingController = UIHostingController(rootView: helpView) + hostingController.modalPresentationStyle = .pageSheet + if let sheet = hostingController.sheetPresentationController { + sheet.detents = [.large()] + sheet.prefersGrabberVisible = true + sheet.preferredCornerRadius = 20 + } + present(hostingController, animated: true) } func becomeMonitor() { diff --git a/RemoteCam/RolePickerView.swift b/RemoteCam/RolePickerView.swift index 65183e8..b140807 100644 --- a/RemoteCam/RolePickerView.swift +++ b/RemoteCam/RolePickerView.swift @@ -3,7 +3,6 @@ import SwiftUI struct RolePickerView: View { let onCamera: () -> Void let onRemote: () -> Void - let onSettings: () -> Void @State private var appeared = false @@ -145,8 +144,7 @@ struct RolePickerView_Previews: PreviewProvider { NavigationView { RolePickerView( onCamera: {}, - onRemote: {}, - onSettings: {} + onRemote: {} ) .navigationTitle(NSLocalizedString("Pick a role", comment: "")) .navigationBarTitleDisplayMode(.large) diff --git a/RemoteCam/da.lproj/Localizable.strings b/RemoteCam/da.lproj/Localizable.strings index 3d0a5b5..fb2c887 100644 --- a/RemoteCam/da.lproj/Localizable.strings +++ b/RemoteCam/da.lproj/Localizable.strings @@ -127,4 +127,26 @@ "WAITING FOR A REMOTE TO CONNECT..." = "VENTER PÅ EN FJERNBETJENING..."; "SEARCHING FOR NEARBY CAMERAS..." = "SØGER EFTER KAMERAER I NÆRHEDEN..."; "Scanning for nearby cameras..." = "Scanner efter kameraer i nærheden..."; -"Start scanning and wait for a Remote device to connect" = "Start scanning og vent på at en Fjernbetjeningsenhed forbinder"; \ No newline at end of file +"Start scanning and wait for a Remote device to connect" = "Start scanning og vent på at en Fjernbetjeningsenhed forbinder"; + +/* Welcome Screen */ +"Turn two devices into a professional remote camera system" = "Gør to enheder til et professionelt fjernkamerasystem"; +"Restore Purchases" = "Gendan Køb"; +"Unlock all features: video recording, torch control, and ad-free experience." = "Lås alle funktioner op: videooptagelse, lommelygtekontrola og reklamefri oplevelse."; +"Get Started" = "Kom i Gang"; +"Thank you for your support!" = "Tak for din støtte!"; +"Rate on App Store" = "Bedøm i App Store"; +"Welcome" = "Velkommen"; +"Purchase" = "Køb"; +"Restored" = "Gendannet"; +"Your purchases have been restored. If you don't see them, check that you're signed in with the correct Apple ID." = "Dine køb er blevet gendannet. Hvis du ikke kan se dem, skal du kontrollere, at du er logget ind med det korrekte Apple ID."; + +/* Role Picker Screen */ +"Pick a role" = "Vælg en rolle"; +"Camera" = "Kamera"; +"Capture photos & video" = "Tag fotos og video"; +"Use the device with the best lens" = "Brug enheden med det bedste objektiv"; +"Remote" = "Fjernbetjening"; +"Control the shutter" = "Styr udløseren"; +"Works up to 50 feet away" = "Fungerer op til 15 meter væk"; +"Remote Mode" = "Fjernbetjeningstilstand"; \ No newline at end of file diff --git a/RemoteCam/de-DE.lproj/Localizable.strings b/RemoteCam/de-DE.lproj/Localizable.strings new file mode 100644 index 0000000..9e23b5e --- /dev/null +++ b/RemoteCam/de-DE.lproj/Localizable.strings @@ -0,0 +1,273 @@ +/* No comment provided by engineer. */ +"%@, ¿Desea intentar nuevamente?" = "%@, Möchten Sie es erneut versuchen?"; + +/* No comment provided by engineer. */ +"AppName" = "Remote Shutter"; + +/* No comment provided by engineer. */ +"Camera or remote shutter?" = "Kamera oder Fernauslöser?"; + +/* No comment provided by engineer. */ +"Cellular" = "Mobilfunk"; + +/* No comment provided by engineer. */ +"CHOOSE A DEVICE" = "GERÄT WÄHLEN"; + +/* No comment provided by engineer. */ +"Connecting" = "Verbinde"; + +/* No comment provided by engineer. */ +"Disconnect" = "Trennen"; + +/* No comment provided by engineer. */ +"Espere..." = "Bitte warten..."; + +/* No comment provided by engineer. */ +"flash_mode_auto" = "Automatisch"; + +/* No comment provided by engineer. */ +"flash_mode_off" = "Aus"; + +/* No comment provided by engineer. */ +"flash_mode_on" = "An"; + +/* No comment provided by engineer. */ +"Loading Image" = "Bild laden"; + +/* Default DejalActivtyView label text */ +"Loading..." = "Laden..."; + +/* No comment provided by engineer. */ +"Looking for devices over Wifi and Bluetooth." = "Suche nach Geräten über WLAN und Bluetooth."; + +/* No comment provided by engineer. */ +"No Connection" = "Keine Verbindung"; + +/* No comment provided by engineer. */ +"Reestableciendo compras" = "Käufe wiederherstellen"; + +/* No comment provided by engineer. */ +"Requesting capture" = "Aufnahme anfordern"; + +/* No comment provided by engineer. */ +"ROLE PICKER" = "ROLLE WÄHLEN"; + +/* No comment provided by engineer. */ +"Sending Photo to Remote" = "Foto an Fernbedienung senden"; + +/* No comment provided by engineer. */ +"Si" = "Ja"; + +"Yes"= "Ja"; + +/* No comment provided by engineer. */ +"WiFi" = "WLAN"; + +/* No comment provided by engineer. */ +"¿Desea sincronizar su %@ con los productos previamente comprados en la AppStore (gratuitamente)?" = "Möchten Sie Ihr %@ mit Ihren zuvor gekauften Funktionen synchronisieren (kostenlos)?"; + +"Acknowledgments"= "Danksagungen"; + +"timeunit"= "Sek"; + +"Settings"="Einstellungen"; + +"Upgrades"="Upgrades"; + +"Timer to take photos"="Timer für Fotos"; + +"Incoming Invite from %@"="Eingehende Einladung von %@"; + +"Do you wish to accept?,"="Möchten Sie annehmen?"; + +"¡Gracias por usar nuestra App!"="Vielen Dank für die Nutzung dieser App!"; + +"En otro momento"="Vielleicht später"; + +"Calificar en la AppStore"="Bewerten"; + +"Mandar Feedback"="Feedback senden"; + +"No Gracias"="Nein Danke"; + +"iAds Removed"="Werbung entfernt"; + +"call_to_download" = "Laden Sie Remote Shutter noch heute herunter %@"; + +/* Local Network Permission Modal */ +"local_network_title" = "Zugriff auf lokales Netzwerk anfordern"; +"local_network_subtitle" = "Remote Shutter benötigt Zugriff auf das lokale Netzwerk, um Ihre Geräte über Apples Peer-to-Peer-Framework zu erkennen und zu verbinden."; + +"local_network_access_required_title" = "Zugriff auf lokales Netzwerk erforderlich"; +"local_network_required_subtitle" = "Remote Shutter benötigt Zugriff auf das lokale Netzwerk, um zu funktionieren. Bitte aktivieren Sie es in den Einstellungen, um fortzufahren."; + +"local_network_feature_title" = "Peer-to-Peer-Verbindung"; +"local_network_feature_description" = "Verwendet Apples MultipeerConnectivity-Framework, um Geräte in Ihrem lokalen Netzwerk für nahtlose Fernsteuerung zu erkennen und zu verbinden."; + +"local_network_privacy_title" = "Datenschutz geschützt"; +"local_network_privacy_description" = "Ihre Verbindung bleibt vollständig privat innerhalb Ihres lokalen Netzwerks. Es werden keine Daten an externe Server oder Dritte gesendet."; + +"local_network_benefits_title" = "Sofort und zuverlässig"; +"local_network_benefits_description" = "Direkte Gerät-zu-Gerät-Kommunikation gewährleistet schnelle Reaktionszeiten und funktioniert ohne Internetverbindung."; + +"local_network_allow" = "Zugriff erlauben"; +"local_network_not_now" = "Nicht jetzt"; +"local_network_cancel" = "Abbrechen"; +"local_network_open_settings" = "Einstellungen öffnen"; + +/* Camera Permissions Modal */ +"camera_permissions_title" = "Kamera- und Fotozugriff erlauben"; +"camera_permissions_subtitle" = "Remote Shutter benötigt Zugriff auf Ihre Kamera und Fotos, um Bilder aufzunehmen und zu speichern, wenn eine Verbindung mit anderen Geräten besteht."; + +"camera_permissions_required_title" = "Kamera- und Fotozugriff erforderlich"; +"camera_permissions_required_subtitle" = "Remote Shutter benötigt Kamera- und Fotozugriff, um zu funktionieren. Bitte aktivieren Sie diese in den Einstellungen, um fortzufahren."; + +"camera_permission_feature_title" = "Kamerazugriff"; +"camera_permission_feature_description" = "Machen Sie Fotos aus der Ferne, indem Sie ein Gerät als Kamera und ein anderes als Fernbedienung für perfekte Aufnahmen verwenden."; + +"photos_permission_feature_title" = "Fotos speichern"; +"photos_permission_feature_description" = "Speichern Sie aufgenommene Fotos automatisch in Ihrer Fotobibliothek für einfachen Zugriff und Teilen."; + +"remote_control_feature_title" = "Fernsteuerung"; +"remote_control_feature_description" = "Verwenden Sie ein Gerät, um die Kamera auf einem anderen Gerät für Gruppenfotos, Selfies und kreative Aufnahmen zu steuern."; + +"camera_permissions_allow" = "Zugriff erlauben"; +"camera_permissions_not_now" = "Nicht jetzt"; +"camera_permissions_cancel" = "Abbrechen"; +"camera_permissions_open_settings" = "Einstellungen öffnen"; + +/* Permission Status Descriptions */ +"camera_permission_not_determined" = "Kameraberechtigung noch nicht angefordert"; +"camera_permission_denied" = "Kamerazugriff verweigert"; +"camera_permission_restricted" = "Kamerazugriff eingeschränkt"; +"camera_permission_authorized" = "Kamerazugriff gewährt"; +"camera_permission_unknown" = "Unbekannter Kameraberechtigungsstatus"; + +"photos_permission_not_determined" = "Fotoberechtigung noch nicht angefordert"; +"photos_permission_denied" = "Fotozugriff verweigert"; +"photos_permission_restricted" = "Fotozugriff eingeschränkt"; +"photos_permission_authorized" = "Voller Fotozugriff gewährt"; +"photos_permission_limited" = "Eingeschränkter Fotozugriff gewährt"; +"photos_permission_unknown" = "Unbekannter Fotoberechtigungsstatus"; + +/* Camera Error View */ +"camera_error_title" = "Kamerazugriff erforderlich"; +"camera_error_subtitle" = "Remote Shutter benötigt Zugriff auf Ihre Kamera und Fotos, um zu funktionieren. Bitte aktivieren Sie die Berechtigungen in den Einstellungen."; +"camera_error_open_settings" = "Einstellungen öffnen"; +"camera_error_go_back" = "Zurück"; +"camera_access_required" = "Kamerazugriff"; +"photos_access_required" = "Fotozugriff"; + +/* Microphone Permission */ +"microphone_denied_video_without_audio" = "Mikrofonzugriff verweigert. Video wird ohne Audio aufgenommen."; + +/* Microphone Permission Prompt */ +"mic_required_title" = "Mikrofonzugriff erforderlich"; +"mic_required_subtitle" = "Um Video mit Audio aufzunehmen, benötigt Remote Shutter Zugriff auf Ihr Mikrofon. Bitte aktivieren Sie es in den Einstellungen."; +"video_recording_feature_title" = "Videoaufnahme"; +"video_recording_feature_description" = "Nehmen Sie hochwertige Videos mit Audio über das Mikrofon Ihres Geräts für ein komplettes Aufnahmeerlebnis auf."; +"mic_open_settings" = "Einstellungen öffnen"; +"mic_cancel_recording" = "Aufnahme abbrechen"; + +/* Microphone Error Messages */ +"microphone_access_denied_error" = "Video kann nicht aufgenommen werden: Mikrofonzugriff wurde verweigert. Bitte aktivieren Sie den Mikrofonzugriff in den Einstellungen, um Videos mit Audio aufzunehmen."; + +/* QR Code Instructions */ +"qr_code_download_instruction" = "Scannen Sie diesen QR-Code mit Ihrer Kamera-App auf einem anderen Gerät, um Remote Shutter aus dem App Store herunterzuladen"; + +/* Photos Access Denied Modal */ +"photos_access_denied_photo_title" = "Foto kann nicht gespeichert werden"; +"photos_access_denied_photo_subtitle" = "Remote Shutter benötigt Zugriff auf Ihre Fotobibliothek, um das aufgenommene Bild zu speichern. Bitte aktivieren Sie den Fotozugriff in den Einstellungen."; +"photos_access_denied_video_title" = "Video kann nicht gespeichert werden"; +"photos_access_denied_video_subtitle" = "Remote Shutter benötigt Zugriff auf Ihre Fotobibliothek, um das aufgenommene Video zu speichern. Bitte aktivieren Sie den Fotozugriff in den Einstellungen."; + +"photos_privacy_feature_title" = "Ihre Privatsphäre ist wichtig"; +"photos_privacy_feature_description" = "Fotos werden direkt in der Bibliothek Ihres Geräts gespeichert. Es werden keine Daten auf externe Server hochgeladen oder ohne Ihre Erlaubnis geteilt."; + +"photos_sharing_feature_title" = "Einfaches Teilen"; +"photos_sharing_feature_description" = "Greifen Sie auf Ihre aufgenommenen Fotos und Videos über die Fotos-App zu, um sie einfach mit Freunden und Familie zu teilen oder in anderen Apps zu verwenden."; + +"photos_open_settings" = "Einstellungen öffnen"; +"photos_dismiss" = "Schließen"; + +/* Video Transfer Progress */ +"video_transfer_progress_title" = "Video wird übertragen"; + +/* Help Modal */ +"help_title" = "So funktioniert Remote Shutter"; +"help_subtitle" = "Perfekte Fotos und Videos mit zwei Geräten aufnehmen"; +"help_got_it" = "Verstanden!"; +"help_done" = "Fertig"; + +/* Help Page 1 - Connect Devices */ +"help_connect_title" = "2. Geräte verbinden"; +"help_connect_description" = "Das Kameragerät geht online und wartet. Suchen Sie auf dem Fernbedienungsgerät nach Kameras und tippen Sie auf den Kameranamen, um eine Verbindung herzustellen."; +"help_quick_setup_title" = "Schnelle Einrichtung"; +"help_quick_setup_description" = "Verwenden Sie den QR-Code, um Remote Shutter auf Ihrem zweiten Gerät aus dem App Store herunterzuladen"; +"help_same_network_title" = "Peer-to-Peer-Verbindung"; +"help_same_network_description" = "Geräte verbinden sich direkt miteinander über WLAN und Bluetooth, genau wie AirDrop - kein Internet erforderlich"; + +/* Help Page 2 - Choose Roles */ +"help_roles_title" = "1. Wählen Sie Ihre Rolle"; +"help_roles_description" = "Wählen Sie zunächst, ob dieses Gerät die Kamera oder die Fernbedienung sein soll. Das Kameragerät nimmt Fotos und Videos auf, während die Fernbedienung es steuert."; +"help_camera_device_title" = "Kameragerät"; +"help_camera_device_description" = "Nimmt Fotos und Videos auf, zeigt Kameravorschau"; +"help_remote_device_title" = "Fernbedienungsgerät"; +"help_remote_device_description" = "Steuert die Kamera, zeigt Live-Vorschau, passt Einstellungen an"; + +/* Help Page 3 - Capture Media */ +"help_capture_title" = "3. Perfekte Momente einfangen"; +"help_capture_description" = "Verwenden Sie das Fernbedienungsgerät, um die Kamera zu steuern, Einstellungen anzupassen und Fotos oder Videos aus der Ferne aufzunehmen."; +"help_remote_shutter_title" = "Fernauslöser"; +"help_remote_shutter_description" = "Machen Sie Fotos, ohne das Kameragerät zu berühren"; +"help_video_recording_title" = "Videoaufnahme"; +"help_video_recording_description" = "Starten und stoppen Sie die Videoaufnahme aus der Ferne"; +"help_camera_controls_title" = "Kamerasteuerung"; +"help_camera_controls_description" = "Passen Sie Blitz, Taschenlampe, Timer und Kameraeinstellungen an"; + +/* Help Page 4 - Tips & Tricks */ +"help_tips_title" = "Tipps und Tricks"; +"help_tips_description" = "Holen Sie das Beste aus Remote Shutter mit diesen hilfreichen Tipps heraus"; +"help_group_photos_title" = "Gruppenfotos"; +"help_group_photos_description" = "Perfekt für Gruppen-Selfies - stellen Sie die Kamera auf und verwenden Sie die Fernbedienung, um alle im Bild festzuhalten"; +"help_timer_feature_title" = "Timer-Funktion"; +"help_timer_feature_description" = "Verwenden Sie den Timer auf dem Fernbedienungsgerät, um sich vor der Aufnahme vorzubereiten"; +"help_switch_cameras_title" = "Kameras wechseln"; +"help_switch_cameras_description" = "Wechseln Sie direkt vom Fernbedienungsgerät aus zwischen Front- und Rückkamera"; +"help_auto_save_title" = "Automatisches Speichern"; +"help_auto_save_description" = "Fotos und Videos werden automatisch in den Fotobibliotheken beider Geräte gespeichert"; + +/* Scanner - Role-aware UI */ +"Waiting for remote" = "Warte auf Fernbedienung"; +"Scan for cameras" = "Nach Kameras suchen"; +"Camera Mode" = "Kameramodus"; +"On another device, open Remote Shutter and select Remote. This camera will appear in their device list." = "Öffnen Sie auf einem anderen Gerät Remote Shutter und wählen Sie Fernbedienung. Diese Kamera wird in der Geräteliste angezeigt."; +"Go Online" = "Online gehen"; +"Go Offline" = "Offline gehen"; +"Waiting for a remote to connect..." = "Warte auf eine Fernbedienung..."; +"WAITING FOR A REMOTE TO CONNECT..." = "WARTE AUF EINE FERNBEDIENUNG..."; +"SEARCHING FOR NEARBY CAMERAS..." = "SUCHE NACH KAMERAS IN DER NÄHE..."; +"Scanning for nearby cameras..." = "Suche nach Kameras in der Nähe..."; +"Start scanning and wait for a Remote device to connect" = "Scannen starten und auf ein Fernbedienungsgerät warten"; + +/* Welcome Screen */ +"Turn two devices into a professional remote camera system" = "Verwandeln Sie zwei Geräte in ein professionelles Fernkamerasystem"; +"Restore Purchases" = "Käufe wiederherstellen"; +"Unlock all features: video recording, torch control, and ad-free experience." = "Alle Funktionen freischalten: Videoaufnahme, Taschenlampenkontrolle und werbefreies Erlebnis."; +"Get Started" = "Loslegen"; +"Thank you for your support!" = "Vielen Dank für Ihre Unterstützung!"; +"Rate on App Store" = "Im App Store bewerten"; +"Welcome" = "Willkommen"; +"Purchase" = "Kaufen"; +"Restored" = "Wiederhergestellt"; +"Your purchases have been restored. If you don't see them, check that you're signed in with the correct Apple ID." = "Ihre Käufe wurden wiederhergestellt. Wenn Sie sie nicht sehen, überprüfen Sie, ob Sie mit der richtigen Apple-ID angemeldet sind."; + +/* Role Picker Screen */ +"Pick a role" = "Rolle wählen"; +"Camera" = "Kamera"; +"Capture photos & video" = "Fotos und Videos aufnehmen"; +"Use the device with the best lens" = "Verwenden Sie das Gerät mit dem besten Objektiv"; +"Remote" = "Fernbedienung"; +"Control the shutter" = "Auslöser steuern"; +"Works up to 50 feet away" = "Funktioniert bis zu 15 Meter entfernt"; +"Remote Mode" = "Fernbedienungsmodus"; diff --git a/RemoteCam/en.lproj/Localizable.strings b/RemoteCam/en.lproj/Localizable.strings index acf7c1d..d9dea3b 100644 --- a/RemoteCam/en.lproj/Localizable.strings +++ b/RemoteCam/en.lproj/Localizable.strings @@ -249,3 +249,25 @@ "SEARCHING FOR NEARBY CAMERAS..." = "SEARCHING FOR NEARBY CAMERAS..."; "Scanning for nearby cameras..." = "Scanning for nearby cameras..."; "Start scanning and wait for a Remote device to connect" = "Start scanning and wait for a Remote device to connect"; + +/* Welcome Screen */ +"Turn two devices into a professional remote camera system" = "Turn two devices into a professional remote camera system"; +"Restore Purchases" = "Restore Purchases"; +"Unlock all features: video recording, torch control, and ad-free experience." = "Unlock all features: video recording, torch control, and ad-free experience."; +"Get Started" = "Get Started"; +"Thank you for your support!" = "Thank you for your support!"; +"Rate on App Store" = "Rate on App Store"; +"Welcome" = "Welcome"; +"Purchase" = "Purchase"; +"Restored" = "Restored"; +"Your purchases have been restored. If you don't see them, check that you're signed in with the correct Apple ID." = "Your purchases have been restored. If you don't see them, check that you're signed in with the correct Apple ID."; + +/* Role Picker Screen */ +"Pick a role" = "Pick a role"; +"Camera" = "Camera"; +"Capture photos & video" = "Capture photos & video"; +"Use the device with the best lens" = "Use the device with the best lens"; +"Remote" = "Remote"; +"Control the shutter" = "Control the shutter"; +"Works up to 50 feet away" = "Works up to 50 feet away"; +"Remote Mode" = "Remote Mode"; diff --git a/RemoteCam/es-MX.lproj/Localizable.strings b/RemoteCam/es-MX.lproj/Localizable.strings index 219edc8..c5f8f4a 100644 --- a/RemoteCam/es-MX.lproj/Localizable.strings +++ b/RemoteCam/es-MX.lproj/Localizable.strings @@ -144,4 +144,26 @@ "WAITING FOR A REMOTE TO CONNECT..." = "ESPERANDO UN REMOTO PARA CONECTAR..."; "SEARCHING FOR NEARBY CAMERAS..." = "BUSCANDO CÁMARAS CERCANAS..."; "Scanning for nearby cameras..." = "Buscando cámaras cercanas..."; -"Start scanning and wait for a Remote device to connect" = "Empieza a escanear y espera que un dispositivo Remoto se conecte"; \ No newline at end of file +"Start scanning and wait for a Remote device to connect" = "Empieza a escanear y espera que un dispositivo Remoto se conecte"; + +/* Welcome Screen */ +"Turn two devices into a professional remote camera system" = "Convierte dos dispositivos en un sistema profesional de cámara remota"; +"Restore Purchases" = "Restaurar Compras"; +"Unlock all features: video recording, torch control, and ad-free experience." = "Desbloquea todas las funciones: grabación de video, control de linterna y experiencia sin anuncios."; +"Get Started" = "Comenzar"; +"Thank you for your support!" = "¡Gracias por tu apoyo!"; +"Rate on App Store" = "Calificar en App Store"; +"Welcome" = "Bienvenido"; +"Purchase" = "Comprar"; +"Restored" = "Restaurado"; +"Your purchases have been restored. If you don't see them, check that you're signed in with the correct Apple ID." = "Tus compras han sido restauradas. Si no las ves, verifica que hayas iniciado sesión con el Apple ID correcto."; + +/* Role Picker Screen */ +"Pick a role" = "Elige un rol"; +"Camera" = "Cámara"; +"Capture photos & video" = "Captura fotos y video"; +"Use the device with the best lens" = "Usa el dispositivo con el mejor lente"; +"Remote" = "Remoto"; +"Control the shutter" = "Controla el obturador"; +"Works up to 50 feet away" = "Funciona hasta a 15 metros de distancia"; +"Remote Mode" = "Modo Remoto"; \ No newline at end of file diff --git a/RemoteCam/fr-FR.lproj/Localizable.strings b/RemoteCam/fr-FR.lproj/Localizable.strings index e3d1ca0..2edacfb 100644 --- a/RemoteCam/fr-FR.lproj/Localizable.strings +++ b/RemoteCam/fr-FR.lproj/Localizable.strings @@ -144,4 +144,26 @@ "WAITING FOR A REMOTE TO CONNECT..." = "EN ATTENTE D'UNE TÉLÉCOMMANDE..."; "SEARCHING FOR NEARBY CAMERAS..." = "RECHERCHE D'APPAREILS PHOTOS..."; "Scanning for nearby cameras..." = "Recherche d'appareils photos..."; -"Start scanning and wait for a Remote device to connect" = "Lancez la recherche et attendez qu'un appareil Télécommande se connecte"; \ No newline at end of file +"Start scanning and wait for a Remote device to connect" = "Lancez la recherche et attendez qu'un appareil Télécommande se connecte"; + +/* Welcome Screen */ +"Turn two devices into a professional remote camera system" = "Transformez deux appareils en un système professionnel de caméra à distance"; +"Restore Purchases" = "Restaurer les Achats"; +"Unlock all features: video recording, torch control, and ad-free experience." = "Débloquez toutes les fonctionnalités : enregistrement vidéo, contrôle de la torche et expérience sans publicité."; +"Get Started" = "Commencer"; +"Thank you for your support!" = "Merci pour votre soutien !"; +"Rate on App Store" = "Noter sur l'App Store"; +"Welcome" = "Bienvenue"; +"Purchase" = "Acheter"; +"Restored" = "Restauré"; +"Your purchases have been restored. If you don't see them, check that you're signed in with the correct Apple ID." = "Vos achats ont été restaurés. Si vous ne les voyez pas, vérifiez que vous êtes connecté avec le bon identifiant Apple."; + +/* Role Picker Screen */ +"Pick a role" = "Choisissez un rôle"; +"Camera" = "Appareil Photo"; +"Capture photos & video" = "Capturez photos et vidéos"; +"Use the device with the best lens" = "Utilisez l'appareil avec le meilleur objectif"; +"Remote" = "Télécommande"; +"Control the shutter" = "Contrôlez le déclencheur"; +"Works up to 50 feet away" = "Fonctionne jusqu'à 15 mètres de distance"; +"Remote Mode" = "Mode Télécommande"; \ No newline at end of file diff --git a/RemoteCam/it.lproj/Localizable.strings b/RemoteCam/it.lproj/Localizable.strings index 5b94126..c9ff977 100644 --- a/RemoteCam/it.lproj/Localizable.strings +++ b/RemoteCam/it.lproj/Localizable.strings @@ -127,4 +127,26 @@ "WAITING FOR A REMOTE TO CONNECT..." = "IN ATTESA DI UN TELECOMANDO..."; "SEARCHING FOR NEARBY CAMERAS..." = "RICERCA FOTOCAMERE NELLE VICINANZE..."; "Scanning for nearby cameras..." = "Ricerca fotocamere nelle vicinanze..."; -"Start scanning and wait for a Remote device to connect" = "Avvia la scansione e attendi che un dispositivo Telecomando si connetta"; \ No newline at end of file +"Start scanning and wait for a Remote device to connect" = "Avvia la scansione e attendi che un dispositivo Telecomando si connetta"; + +/* Welcome Screen */ +"Turn two devices into a professional remote camera system" = "Trasforma due dispositivi in un sistema professionale di fotocamera remota"; +"Restore Purchases" = "Ripristina Acquisti"; +"Unlock all features: video recording, torch control, and ad-free experience." = "Sblocca tutte le funzionalità: registrazione video, controllo torcia ed esperienza senza pubblicità."; +"Get Started" = "Inizia"; +"Thank you for your support!" = "Grazie per il tuo supporto!"; +"Rate on App Store" = "Valuta su App Store"; +"Welcome" = "Benvenuto"; +"Purchase" = "Acquista"; +"Restored" = "Ripristinato"; +"Your purchases have been restored. If you don't see them, check that you're signed in with the correct Apple ID." = "I tuoi acquisti sono stati ripristinati. Se non li vedi, verifica di aver effettuato l'accesso con l'Apple ID corretto."; + +/* Role Picker Screen */ +"Pick a role" = "Scegli un ruolo"; +"Camera" = "Fotocamera"; +"Capture photos & video" = "Cattura foto e video"; +"Use the device with the best lens" = "Usa il dispositivo con il miglior obiettivo"; +"Remote" = "Telecomando"; +"Control the shutter" = "Controlla l'otturatore"; +"Works up to 50 feet away" = "Funziona fino a 15 metri di distanza"; +"Remote Mode" = "Modalità Telecomando"; \ No newline at end of file diff --git a/RemoteCam/ja.lproj/Localizable.strings b/RemoteCam/ja.lproj/Localizable.strings new file mode 100644 index 0000000..ded4118 --- /dev/null +++ b/RemoteCam/ja.lproj/Localizable.strings @@ -0,0 +1,273 @@ +/* No comment provided by engineer. */ +"%@, ¿Desea intentar nuevamente?" = "%@、もう一度お試しになりますか?"; + +/* No comment provided by engineer. */ +"AppName" = "Remote Shutter"; + +/* No comment provided by engineer. */ +"Camera or remote shutter?" = "カメラまたはリモートシャッター?"; + +/* No comment provided by engineer. */ +"Cellular" = "モバイル通信"; + +/* No comment provided by engineer. */ +"CHOOSE A DEVICE" = "デバイスを選択"; + +/* No comment provided by engineer. */ +"Connecting" = "接続中"; + +/* No comment provided by engineer. */ +"Disconnect" = "切断"; + +/* No comment provided by engineer. */ +"Espere..." = "お待ちください..."; + +/* No comment provided by engineer. */ +"flash_mode_auto" = "自動"; + +/* No comment provided by engineer. */ +"flash_mode_off" = "オフ"; + +/* No comment provided by engineer. */ +"flash_mode_on" = "オン"; + +/* No comment provided by engineer. */ +"Loading Image" = "画像を読み込み中"; + +/* Default DejalActivtyView label text */ +"Loading..." = "読み込み中..."; + +/* No comment provided by engineer. */ +"Looking for devices over Wifi and Bluetooth." = "Wi-FiとBluetoothでデバイスを検索中。"; + +/* No comment provided by engineer. */ +"No Connection" = "接続なし"; + +/* No comment provided by engineer. */ +"Reestableciendo compras" = "購入を復元中"; + +/* No comment provided by engineer. */ +"Requesting capture" = "撮影をリクエスト中"; + +/* No comment provided by engineer. */ +"ROLE PICKER" = "役割選択"; + +/* No comment provided by engineer. */ +"Sending Photo to Remote" = "リモートに写真を送信中"; + +/* No comment provided by engineer. */ +"Si" = "はい"; + +"Yes"= "はい"; + +/* No comment provided by engineer. */ +"WiFi" = "Wi-Fi"; + +/* No comment provided by engineer. */ +"¿Desea sincronizar su %@ con los productos previamente comprados en la AppStore (gratuitamente)?" = "%@を以前購入した機能と同期しますか(無料)?"; + +"Acknowledgments"= "謝辞"; + +"timeunit"= "秒"; + +"Settings"="設定"; + +"Upgrades"="アップグレード"; + +"Timer to take photos"="写真撮影タイマー"; + +"Incoming Invite from %@"="%@からの招待"; + +"Do you wish to accept?,"="承認しますか?"; + +"¡Gracias por usar nuestra App!"="このアプリをご利用いただきありがとうございます!"; + +"En otro momento"="また後で"; + +"Calificar en la AppStore"="評価する"; + +"Mandar Feedback"="フィードバックを送信"; + +"No Gracias"="いいえ、結構です"; + +"iAds Removed"="広告を削除しました"; + +"call_to_download" = "今すぐRemote Shutterをダウンロード %@"; + +/* Local Network Permission Modal */ +"local_network_title" = "ローカルネットワークへのアクセスを要求"; +"local_network_subtitle" = "Remote Shutterは、Appleのピアツーピアフレームワークを使用してデバイスを検出し接続するために、ローカルネットワークへのアクセスが必要です。"; + +"local_network_access_required_title" = "ローカルネットワークアクセスが必要です"; +"local_network_required_subtitle" = "Remote Shutterが機能するにはローカルネットワークアクセスが必要です。続行するには設定で有効にしてください。"; + +"local_network_feature_title" = "ピアツーピア接続"; +"local_network_feature_description" = "AppleのMultipeerConnectivityフレームワークを使用して、ローカルネットワーク上のデバイスをシームレスなリモートコントロールのために検出し接続します。"; + +"local_network_privacy_title" = "プライバシー保護"; +"local_network_privacy_description" = "接続はローカルネットワーク内で完全にプライベートに保たれます。外部サーバーや第三者にデータが送信されることはありません。"; + +"local_network_benefits_title" = "即時で信頼性が高い"; +"local_network_benefits_description" = "デバイス間の直接通信により、高速な応答時間を確保し、インターネット接続なしでも動作します。"; + +"local_network_allow" = "アクセスを許可"; +"local_network_not_now" = "今はしない"; +"local_network_cancel" = "キャンセル"; +"local_network_open_settings" = "設定を開く"; + +/* Camera Permissions Modal */ +"camera_permissions_title" = "カメラと写真へのアクセスを許可"; +"camera_permissions_subtitle" = "Remote Shutterは、他のデバイスと接続した際に画像を撮影・保存するために、カメラと写真へのアクセスが必要です。"; + +"camera_permissions_required_title" = "カメラと写真へのアクセスが必要です"; +"camera_permissions_required_subtitle" = "Remote Shutterが機能するにはカメラと写真へのアクセスが必要です。続行するには設定で有効にしてください。"; + +"camera_permission_feature_title" = "カメラアクセス"; +"camera_permission_feature_description" = "一つのデバイスをカメラとして、もう一つをリモコンとして使用して、完璧な写真をリモートで撮影します。"; + +"photos_permission_feature_title" = "写真を保存"; +"photos_permission_feature_description" = "撮影した写真を自動的にフォトライブラリに保存し、簡単にアクセス・共有できます。"; + +"remote_control_feature_title" = "リモートコントロール"; +"remote_control_feature_description" = "グループ写真、セルフィー、クリエイティブな撮影のために、一つのデバイスで別のデバイスのカメラを操作します。"; + +"camera_permissions_allow" = "アクセスを許可"; +"camera_permissions_not_now" = "今はしない"; +"camera_permissions_cancel" = "キャンセル"; +"camera_permissions_open_settings" = "設定を開く"; + +/* Permission Status Descriptions */ +"camera_permission_not_determined" = "カメラの許可がまだリクエストされていません"; +"camera_permission_denied" = "カメラアクセスが拒否されました"; +"camera_permission_restricted" = "カメラアクセスが制限されています"; +"camera_permission_authorized" = "カメラアクセスが許可されました"; +"camera_permission_unknown" = "不明なカメラ許可状態"; + +"photos_permission_not_determined" = "写真の許可がまだリクエストされていません"; +"photos_permission_denied" = "写真アクセスが拒否されました"; +"photos_permission_restricted" = "写真アクセスが制限されています"; +"photos_permission_authorized" = "写真への完全アクセスが許可されました"; +"photos_permission_limited" = "写真への限定アクセスが許可されました"; +"photos_permission_unknown" = "不明な写真許可状態"; + +/* Camera Error View */ +"camera_error_title" = "カメラアクセスが必要です"; +"camera_error_subtitle" = "Remote Shutterが機能するにはカメラと写真へのアクセスが必要です。設定で権限を有効にしてください。"; +"camera_error_open_settings" = "設定を開く"; +"camera_error_go_back" = "戻る"; +"camera_access_required" = "カメラアクセス"; +"photos_access_required" = "写真アクセス"; + +/* Microphone Permission */ +"microphone_denied_video_without_audio" = "マイクアクセスが拒否されました。音声なしでビデオが録画されます。"; + +/* Microphone Permission Prompt */ +"mic_required_title" = "マイクアクセスが必要です"; +"mic_required_subtitle" = "音声付きビデオを録画するには、Remote Shutterがマイクへのアクセスを必要とします。設定で有効にしてください。"; +"video_recording_feature_title" = "ビデオ録画"; +"video_recording_feature_description" = "デバイスのマイクを使用して高品質の音声付きビデオを録画し、完全な録画体験をお楽しみください。"; +"mic_open_settings" = "設定を開く"; +"mic_cancel_recording" = "録画をキャンセル"; + +/* Microphone Error Messages */ +"microphone_access_denied_error" = "ビデオを録画できません:マイクアクセスが拒否されました。音声付きビデオを録画するには、設定でマイクアクセスを有効にしてください。"; + +/* QR Code Instructions */ +"qr_code_download_instruction" = "別のデバイスのカメラアプリでこのQRコードをスキャンして、App StoreからRemote Shutterをダウンロードしてください"; + +/* Photos Access Denied Modal */ +"photos_access_denied_photo_title" = "写真を保存できません"; +"photos_access_denied_photo_subtitle" = "Remote Shutterは撮影した画像を保存するために、写真ライブラリへのアクセスが必要です。設定で写真アクセスを有効にしてください。"; +"photos_access_denied_video_title" = "ビデオを保存できません"; +"photos_access_denied_video_subtitle" = "Remote Shutterは録画したビデオを保存するために、写真ライブラリへのアクセスが必要です。設定で写真アクセスを有効にしてください。"; + +"photos_privacy_feature_title" = "あなたのプライバシーは大切です"; +"photos_privacy_feature_description" = "写真はデバイスのライブラリに直接保存されます。外部サーバーにアップロードされたり、許可なく共有されることはありません。"; + +"photos_sharing_feature_title" = "簡単な共有"; +"photos_sharing_feature_description" = "写真アプリから撮影した写真やビデオにアクセスして、友人や家族と簡単に共有したり、他のアプリで使用できます。"; + +"photos_open_settings" = "設定を開く"; +"photos_dismiss" = "閉じる"; + +/* Video Transfer Progress */ +"video_transfer_progress_title" = "ビデオを転送中"; + +/* Help Modal */ +"help_title" = "Remote Shutterの使い方"; +"help_subtitle" = "2台のデバイスで完璧な写真やビデオを撮影"; +"help_got_it" = "了解!"; +"help_done" = "完了"; + +/* Help Page 1 - Connect Devices */ +"help_connect_title" = "2. デバイスを接続"; +"help_connect_description" = "カメラデバイスがオンラインになり待機します。リモートデバイスでカメラをスキャンし、カメラの名前をタップして接続します。"; +"help_quick_setup_title" = "クイックセットアップ"; +"help_quick_setup_description" = "QRコードを使用して、App Storeから2台目のデバイスにRemote Shutterをダウンロード"; +"help_same_network_title" = "ピアツーピア接続"; +"help_same_network_description" = "デバイスはAirDropのようにWi-FiとBluetoothを使用して直接接続します - インターネット不要"; + +/* Help Page 2 - Choose Roles */ +"help_roles_title" = "1. 役割を選択"; +"help_roles_description" = "まず、このデバイスをカメラにするかリモートにするかを選択します。カメラデバイスが写真やビデオを撮影し、リモートがそれを操作します。"; +"help_camera_device_title" = "カメラデバイス"; +"help_camera_device_description" = "写真やビデオを撮影し、カメラプレビューを表示"; +"help_remote_device_title" = "リモートデバイス"; +"help_remote_device_description" = "カメラを操作、ライブプレビューを表示、設定を調整"; + +/* Help Page 3 - Capture Media */ +"help_capture_title" = "3. 完璧な瞬間を撮影"; +"help_capture_description" = "リモートデバイスを使用して、カメラを操作し、設定を調整し、離れた場所から写真やビデオを撮影します。"; +"help_remote_shutter_title" = "リモートシャッター"; +"help_remote_shutter_description" = "カメラデバイスに触れずに写真を撮影"; +"help_video_recording_title" = "ビデオ録画"; +"help_video_recording_description" = "リモートでビデオ録画の開始と停止"; +"help_camera_controls_title" = "カメラコントロール"; +"help_camera_controls_description" = "フラッシュ、懐中電灯、タイマー、カメラ設定を調整"; + +/* Help Page 4 - Tips & Tricks */ +"help_tips_title" = "ヒントとコツ"; +"help_tips_description" = "これらの便利なヒントでRemote Shutterを最大限に活用"; +"help_group_photos_title" = "グループ写真"; +"help_group_photos_description" = "グループセルフィーに最適 - カメラをセットアップし、リモートで全員を撮影"; +"help_timer_feature_title" = "タイマー機能"; +"help_timer_feature_description" = "リモートデバイスのタイマーを使用して、写真撮影前に準備"; +"help_switch_cameras_title" = "カメラ切替"; +"help_switch_cameras_description" = "リモートデバイスから直接フロントカメラとバックカメラを切り替え"; +"help_auto_save_title" = "自動保存"; +"help_auto_save_description" = "写真とビデオは両方のデバイスのフォトライブラリに自動保存"; + +/* Scanner - Role-aware UI */ +"Waiting for remote" = "リモートを待機中"; +"Scan for cameras" = "カメラをスキャン"; +"Camera Mode" = "カメラモード"; +"On another device, open Remote Shutter and select Remote. This camera will appear in their device list." = "別のデバイスでRemote Shutterを開き、リモートを選択してください。このカメラがデバイスリストに表示されます。"; +"Go Online" = "オンラインにする"; +"Go Offline" = "オフラインにする"; +"Waiting for a remote to connect..." = "リモートの接続を待機中..."; +"WAITING FOR A REMOTE TO CONNECT..." = "リモートの接続を待機中..."; +"SEARCHING FOR NEARBY CAMERAS..." = "近くのカメラを検索中..."; +"Scanning for nearby cameras..." = "近くのカメラをスキャン中..."; +"Start scanning and wait for a Remote device to connect" = "スキャンを開始してリモートデバイスの接続を待つ"; + +/* Welcome Screen */ +"Turn two devices into a professional remote camera system" = "2台のデバイスをプロのリモートカメラシステムに"; +"Restore Purchases" = "購入を復元"; +"Unlock all features: video recording, torch control, and ad-free experience." = "すべての機能をアンロック:ビデオ録画、ライトコントロール、広告なし体験。"; +"Get Started" = "始める"; +"Thank you for your support!" = "ご支援ありがとうございます!"; +"Rate on App Store" = "App Storeで評価"; +"Welcome" = "ようこそ"; +"Purchase" = "購入"; +"Restored" = "復元済み"; +"Your purchases have been restored. If you don't see them, check that you're signed in with the correct Apple ID." = "購入が復元されました。表示されない場合は、正しいApple IDでサインインしているか確認してください。"; + +/* Role Picker Screen */ +"Pick a role" = "役割を選択"; +"Camera" = "カメラ"; +"Capture photos & video" = "写真とビデオを撮影"; +"Use the device with the best lens" = "最高のレンズを持つデバイスを使用"; +"Remote" = "リモート"; +"Control the shutter" = "シャッターを操作"; +"Works up to 50 feet away" = "最大15メートル離れても動作"; +"Remote Mode" = "リモートモード"; diff --git a/RemoteCam/ko.lproj/Localizable.strings b/RemoteCam/ko.lproj/Localizable.strings new file mode 100644 index 0000000..c2172c4 --- /dev/null +++ b/RemoteCam/ko.lproj/Localizable.strings @@ -0,0 +1,273 @@ +/* No comment provided by engineer. */ +"%@, ¿Desea intentar nuevamente?" = "%@, 다시 시도하시겠습니까?"; + +/* No comment provided by engineer. */ +"AppName" = "Remote Shutter"; + +/* No comment provided by engineer. */ +"Camera or remote shutter?" = "카메라 또는 리모트 셔터?"; + +/* No comment provided by engineer. */ +"Cellular" = "셀룰러"; + +/* No comment provided by engineer. */ +"CHOOSE A DEVICE" = "기기 선택"; + +/* No comment provided by engineer. */ +"Connecting" = "연결 중"; + +/* No comment provided by engineer. */ +"Disconnect" = "연결 해제"; + +/* No comment provided by engineer. */ +"Espere..." = "잠시만 기다려주세요..."; + +/* No comment provided by engineer. */ +"flash_mode_auto" = "자동"; + +/* No comment provided by engineer. */ +"flash_mode_off" = "끄기"; + +/* No comment provided by engineer. */ +"flash_mode_on" = "켜기"; + +/* No comment provided by engineer. */ +"Loading Image" = "이미지 로딩 중"; + +/* Default DejalActivtyView label text */ +"Loading..." = "로딩 중..."; + +/* No comment provided by engineer. */ +"Looking for devices over Wifi and Bluetooth." = "Wi-Fi 및 Bluetooth로 기기를 검색 중입니다."; + +/* No comment provided by engineer. */ +"No Connection" = "연결 없음"; + +/* No comment provided by engineer. */ +"Reestableciendo compras" = "구매 복원 중"; + +/* No comment provided by engineer. */ +"Requesting capture" = "촬영 요청 중"; + +/* No comment provided by engineer. */ +"ROLE PICKER" = "역할 선택"; + +/* No comment provided by engineer. */ +"Sending Photo to Remote" = "리모트로 사진 전송 중"; + +/* No comment provided by engineer. */ +"Si" = "예"; + +"Yes"= "예"; + +/* No comment provided by engineer. */ +"WiFi" = "Wi-Fi"; + +/* No comment provided by engineer. */ +"¿Desea sincronizar su %@ con los productos previamente comprados en la AppStore (gratuitamente)?" = "이전에 구매한 기능과 %@을(를) 동기화하시겠습니까 (무료)?"; + +"Acknowledgments"= "감사의 말"; + +"timeunit"= "초"; + +"Settings"="설정"; + +"Upgrades"="업그레이드"; + +"Timer to take photos"="사진 촬영 타이머"; + +"Incoming Invite from %@"="%@로부터 초대가 왔습니다"; + +"Do you wish to accept?,"="수락하시겠습니까?"; + +"¡Gracias por usar nuestra App!"="이 앱을 사용해 주셔서 감사합니다!"; + +"En otro momento"="나중에"; + +"Calificar en la AppStore"="평가하기"; + +"Mandar Feedback"="피드백 보내기"; + +"No Gracias"="아니요, 괜찮습니다"; + +"iAds Removed"="광고 제거됨"; + +"call_to_download" = "지금 Remote Shutter를 다운로드하세요 %@"; + +/* Local Network Permission Modal */ +"local_network_title" = "로컬 네트워크 접근 요청"; +"local_network_subtitle" = "Remote Shutter는 Apple의 피어 투 피어 프레임워크를 사용하여 기기를 검색하고 연결하기 위해 로컬 네트워크 접근이 필요합니다."; + +"local_network_access_required_title" = "로컬 네트워크 접근 필요"; +"local_network_required_subtitle" = "Remote Shutter가 작동하려면 로컬 네트워크 접근이 필요합니다. 계속하려면 설정에서 활성화해 주세요."; + +"local_network_feature_title" = "피어 투 피어 연결"; +"local_network_feature_description" = "Apple의 MultipeerConnectivity 프레임워크를 사용하여 로컬 네트워크에서 원활한 원격 제어를 위해 기기를 검색하고 연결합니다."; + +"local_network_privacy_title" = "개인정보 보호"; +"local_network_privacy_description" = "연결은 로컬 네트워크 내에서 완전히 비공개로 유지됩니다. 외부 서버나 제3자에게 데이터가 전송되지 않습니다."; + +"local_network_benefits_title" = "즉각적이고 안정적"; +"local_network_benefits_description" = "기기 간 직접 통신으로 빠른 응답 시간을 보장하며 인터넷 연결 없이도 작동합니다."; + +"local_network_allow" = "접근 허용"; +"local_network_not_now" = "나중에"; +"local_network_cancel" = "취소"; +"local_network_open_settings" = "설정 열기"; + +/* Camera Permissions Modal */ +"camera_permissions_title" = "카메라 및 사진 접근 허용"; +"camera_permissions_subtitle" = "Remote Shutter는 다른 기기와 연결할 때 이미지를 촬영하고 저장하기 위해 카메라와 사진에 대한 접근이 필요합니다."; + +"camera_permissions_required_title" = "카메라 및 사진 접근 필요"; +"camera_permissions_required_subtitle" = "Remote Shutter가 작동하려면 카메라와 사진 접근이 필요합니다. 계속하려면 설정에서 활성화해 주세요."; + +"camera_permission_feature_title" = "카메라 접근"; +"camera_permission_feature_description" = "하나의 기기를 카메라로, 다른 하나를 리모컨으로 사용하여 완벽한 사진을 원격으로 촬영합니다."; + +"photos_permission_feature_title" = "사진 저장"; +"photos_permission_feature_description" = "촬영한 사진을 자동으로 사진 라이브러리에 저장하여 쉽게 접근하고 공유할 수 있습니다."; + +"remote_control_feature_title" = "원격 제어"; +"remote_control_feature_description" = "단체 사진, 셀피, 창의적인 촬영을 위해 하나의 기기로 다른 기기의 카메라를 제어합니다."; + +"camera_permissions_allow" = "접근 허용"; +"camera_permissions_not_now" = "나중에"; +"camera_permissions_cancel" = "취소"; +"camera_permissions_open_settings" = "설정 열기"; + +/* Permission Status Descriptions */ +"camera_permission_not_determined" = "카메라 권한이 아직 요청되지 않았습니다"; +"camera_permission_denied" = "카메라 접근이 거부되었습니다"; +"camera_permission_restricted" = "카메라 접근이 제한되었습니다"; +"camera_permission_authorized" = "카메라 접근이 허용되었습니다"; +"camera_permission_unknown" = "알 수 없는 카메라 권한 상태"; + +"photos_permission_not_determined" = "사진 권한이 아직 요청되지 않았습니다"; +"photos_permission_denied" = "사진 접근이 거부되었습니다"; +"photos_permission_restricted" = "사진 접근이 제한되었습니다"; +"photos_permission_authorized" = "사진 전체 접근이 허용되었습니다"; +"photos_permission_limited" = "사진 제한 접근이 허용되었습니다"; +"photos_permission_unknown" = "알 수 없는 사진 권한 상태"; + +/* Camera Error View */ +"camera_error_title" = "카메라 접근 필요"; +"camera_error_subtitle" = "Remote Shutter가 작동하려면 카메라와 사진에 대한 접근이 필요합니다. 설정에서 권한을 활성화해 주세요."; +"camera_error_open_settings" = "설정 열기"; +"camera_error_go_back" = "뒤로가기"; +"camera_access_required" = "카메라 접근"; +"photos_access_required" = "사진 접근"; + +/* Microphone Permission */ +"microphone_denied_video_without_audio" = "마이크 접근이 거부되었습니다. 오디오 없이 비디오가 녹화됩니다."; + +/* Microphone Permission Prompt */ +"mic_required_title" = "마이크 접근 필요"; +"mic_required_subtitle" = "오디오가 포함된 비디오를 녹화하려면 Remote Shutter에 마이크 접근이 필요합니다. 설정에서 활성화해 주세요."; +"video_recording_feature_title" = "비디오 녹화"; +"video_recording_feature_description" = "기기의 마이크를 사용하여 고품질 오디오 포함 비디오를 녹화하여 완벽한 녹화 경험을 즐기세요."; +"mic_open_settings" = "설정 열기"; +"mic_cancel_recording" = "녹화 취소"; + +/* Microphone Error Messages */ +"microphone_access_denied_error" = "비디오를 녹화할 수 없습니다: 마이크 접근이 거부되었습니다. 오디오 포함 비디오를 녹화하려면 설정에서 마이크 접근을 활성화해 주세요."; + +/* QR Code Instructions */ +"qr_code_download_instruction" = "다른 기기의 카메라 앱으로 이 QR 코드를 스캔하여 App Store에서 Remote Shutter를 다운로드하세요"; + +/* Photos Access Denied Modal */ +"photos_access_denied_photo_title" = "사진을 저장할 수 없음"; +"photos_access_denied_photo_subtitle" = "Remote Shutter는 촬영한 이미지를 저장하기 위해 사진 라이브러리에 대한 접근이 필요합니다. 설정에서 사진 접근을 활성화해 주세요."; +"photos_access_denied_video_title" = "비디오를 저장할 수 없음"; +"photos_access_denied_video_subtitle" = "Remote Shutter는 녹화한 비디오를 저장하기 위해 사진 라이브러리에 대한 접근이 필요합니다. 설정에서 사진 접근을 활성화해 주세요."; + +"photos_privacy_feature_title" = "개인정보 보호가 중요합니다"; +"photos_privacy_feature_description" = "사진은 기기의 라이브러리에 직접 저장됩니다. 외부 서버에 업로드되거나 허가 없이 공유되지 않습니다."; + +"photos_sharing_feature_title" = "쉬운 공유"; +"photos_sharing_feature_description" = "사진 앱에서 촬영한 사진과 비디오에 접근하여 친구나 가족과 쉽게 공유하거나 다른 앱에서 사용할 수 있습니다."; + +"photos_open_settings" = "설정 열기"; +"photos_dismiss" = "닫기"; + +/* Video Transfer Progress */ +"video_transfer_progress_title" = "비디오 전송 중"; + +/* Help Modal */ +"help_title" = "Remote Shutter 사용 방법"; +"help_subtitle" = "두 대의 기기로 완벽한 사진과 비디오 촬영"; +"help_got_it" = "알겠습니다!"; +"help_done" = "완료"; + +/* Help Page 1 - Connect Devices */ +"help_connect_title" = "2. 기기 연결"; +"help_connect_description" = "카메라 기기가 온라인으로 전환되고 대기합니다. 리모트 기기에서 카메라를 검색하고 카메라 이름을 탭하여 연결합니다."; +"help_quick_setup_title" = "빠른 설정"; +"help_quick_setup_description" = "QR 코드를 사용하여 App Store에서 두 번째 기기에 Remote Shutter를 다운로드"; +"help_same_network_title" = "피어 투 피어 연결"; +"help_same_network_description" = "AirDrop처럼 Wi-Fi와 Bluetooth를 사용하여 기기가 직접 연결됩니다 - 인터넷 불필요"; + +/* Help Page 2 - Choose Roles */ +"help_roles_title" = "1. 역할 선택"; +"help_roles_description" = "먼저 이 기기가 카메라가 될지 리모트가 될지 선택합니다. 카메라 기기가 사진과 비디오를 촬영하고, 리모트가 이를 제어합니다."; +"help_camera_device_title" = "카메라 기기"; +"help_camera_device_description" = "사진과 비디오를 촬영하고 카메라 미리보기 표시"; +"help_remote_device_title" = "리모트 기기"; +"help_remote_device_description" = "카메라를 제어하고, 실시간 미리보기 표시, 설정 조정"; + +/* Help Page 3 - Capture Media */ +"help_capture_title" = "3. 완벽한 순간 포착"; +"help_capture_description" = "리모트 기기를 사용하여 카메라를 제어하고, 설정을 조정하고, 멀리서 사진이나 비디오를 촬영합니다."; +"help_remote_shutter_title" = "리모트 셔터"; +"help_remote_shutter_description" = "카메라 기기를 만지지 않고 사진 촬영"; +"help_video_recording_title" = "비디오 녹화"; +"help_video_recording_description" = "원격으로 비디오 녹화 시작 및 중지"; +"help_camera_controls_title" = "카메라 컨트롤"; +"help_camera_controls_description" = "플래시, 손전등, 타이머 및 카메라 설정 조정"; + +/* Help Page 4 - Tips & Tricks */ +"help_tips_title" = "팁과 요령"; +"help_tips_description" = "유용한 팁으로 Remote Shutter를 최대한 활용하세요"; +"help_group_photos_title" = "단체 사진"; +"help_group_photos_description" = "단체 셀피에 최적 - 카메라를 설치하고 리모트로 모든 사람을 한 장에 담으세요"; +"help_timer_feature_title" = "타이머 기능"; +"help_timer_feature_description" = "리모트 기기의 타이머를 사용하여 사진 촬영 전에 준비하세요"; +"help_switch_cameras_title" = "카메라 전환"; +"help_switch_cameras_description" = "리모트 기기에서 직접 전면 카메라와 후면 카메라를 전환"; +"help_auto_save_title" = "자동 저장"; +"help_auto_save_description" = "사진과 비디오가 양쪽 기기의 사진 라이브러리에 자동 저장"; + +/* Scanner - Role-aware UI */ +"Waiting for remote" = "리모트 대기 중"; +"Scan for cameras" = "카메라 검색"; +"Camera Mode" = "카메라 모드"; +"On another device, open Remote Shutter and select Remote. This camera will appear in their device list." = "다른 기기에서 Remote Shutter를 열고 리모트를 선택하세요. 이 카메라가 기기 목록에 표시됩니다."; +"Go Online" = "온라인 전환"; +"Go Offline" = "오프라인 전환"; +"Waiting for a remote to connect..." = "리모트 연결 대기 중..."; +"WAITING FOR A REMOTE TO CONNECT..." = "리모트 연결 대기 중..."; +"SEARCHING FOR NEARBY CAMERAS..." = "근처 카메라 검색 중..."; +"Scanning for nearby cameras..." = "근처 카메라 스캔 중..."; +"Start scanning and wait for a Remote device to connect" = "스캔을 시작하고 리모트 기기의 연결을 기다리세요"; + +/* Welcome Screen */ +"Turn two devices into a professional remote camera system" = "두 대의 기기를 전문 원격 카메라 시스템으로 변환"; +"Restore Purchases" = "구매 복원"; +"Unlock all features: video recording, torch control, and ad-free experience." = "모든 기능 잠금 해제: 비디오 녹화, 라이트 제어, 광고 없는 경험."; +"Get Started" = "시작하기"; +"Thank you for your support!" = "응원해 주셔서 감사합니다!"; +"Rate on App Store" = "App Store에서 평가"; +"Welcome" = "환영합니다"; +"Purchase" = "구매"; +"Restored" = "복원됨"; +"Your purchases have been restored. If you don't see them, check that you're signed in with the correct Apple ID." = "구매가 복원되었습니다. 보이지 않으면 올바른 Apple ID로 로그인했는지 확인하세요."; + +/* Role Picker Screen */ +"Pick a role" = "역할 선택"; +"Camera" = "카메라"; +"Capture photos & video" = "사진 및 비디오 촬영"; +"Use the device with the best lens" = "최고의 렌즈가 있는 기기 사용"; +"Remote" = "리모트"; +"Control the shutter" = "셔터 제어"; +"Works up to 50 feet away" = "최대 15미터 거리에서 작동"; +"Remote Mode" = "리모트 모드"; diff --git a/RemoteCam/pt-BR.lproj/Localizable.strings b/RemoteCam/pt-BR.lproj/Localizable.strings new file mode 100644 index 0000000..9b348f3 --- /dev/null +++ b/RemoteCam/pt-BR.lproj/Localizable.strings @@ -0,0 +1,273 @@ +/* No comment provided by engineer. */ +"%@, ¿Desea intentar nuevamente?" = "%@, Gostaria de tentar novamente?"; + +/* No comment provided by engineer. */ +"AppName" = "Remote Shutter"; + +/* No comment provided by engineer. */ +"Camera or remote shutter?" = "Câmera ou controle remoto?"; + +/* No comment provided by engineer. */ +"Cellular" = "Celular"; + +/* No comment provided by engineer. */ +"CHOOSE A DEVICE" = "ESCOLHA UM DISPOSITIVO"; + +/* No comment provided by engineer. */ +"Connecting" = "Conectando"; + +/* No comment provided by engineer. */ +"Disconnect" = "Desconectar"; + +/* No comment provided by engineer. */ +"Espere..." = "Aguarde..."; + +/* No comment provided by engineer. */ +"flash_mode_auto" = "Automático"; + +/* No comment provided by engineer. */ +"flash_mode_off" = "Desligado"; + +/* No comment provided by engineer. */ +"flash_mode_on" = "Ligado"; + +/* No comment provided by engineer. */ +"Loading Image" = "Carregando Imagem"; + +/* Default DejalActivtyView label text */ +"Loading..." = "Carregando..."; + +/* No comment provided by engineer. */ +"Looking for devices over Wifi and Bluetooth." = "Procurando dispositivos via Wi-Fi e Bluetooth."; + +/* No comment provided by engineer. */ +"No Connection" = "Sem Conexão"; + +/* No comment provided by engineer. */ +"Reestableciendo compras" = "Restaurando Compras"; + +/* No comment provided by engineer. */ +"Requesting capture" = "Solicitando captura"; + +/* No comment provided by engineer. */ +"ROLE PICKER" = "ESCOLHA DE PAPEL"; + +/* No comment provided by engineer. */ +"Sending Photo to Remote" = "Enviando Foto para o Remoto"; + +/* No comment provided by engineer. */ +"Si" = "Sim"; + +"Yes"= "Sim"; + +/* No comment provided by engineer. */ +"WiFi" = "Wi-Fi"; + +/* No comment provided by engineer. */ +"¿Desea sincronizar su %@ con los productos previamente comprados en la AppStore (gratuitamente)?" = "Gostaria de sincronizar seu %@ com as funcionalidades compradas anteriormente (grátis)?"; + +"Acknowledgments"= "Agradecimentos"; + +"timeunit"= "seg"; + +"Settings"="Configurações"; + +"Upgrades"="Melhorias"; + +"Timer to take photos"="Temporizador para fotos"; + +"Incoming Invite from %@"="Convite recebido de %@"; + +"Do you wish to accept?,"="Deseja aceitar?"; + +"¡Gracias por usar nuestra App!"="Obrigado por usar este app!"; + +"En otro momento"="Talvez depois"; + +"Calificar en la AppStore"="Avaliar"; + +"Mandar Feedback"="Enviar feedback"; + +"No Gracias"="Não, Obrigado"; + +"iAds Removed"="Anúncios Removidos"; + +"call_to_download" = "Baixe o Remote Shutter hoje %@"; + +/* Local Network Permission Modal */ +"local_network_title" = "Solicitar Acesso à Rede Local"; +"local_network_subtitle" = "O Remote Shutter precisa de acesso à rede local para descobrir e conectar seus dispositivos usando o framework peer-to-peer da Apple."; + +"local_network_access_required_title" = "Acesso à Rede Local Necessário"; +"local_network_required_subtitle" = "O Remote Shutter precisa de acesso à rede local para funcionar. Por favor, ative nas Configurações para continuar."; + +"local_network_feature_title" = "Conexão Peer-to-Peer"; +"local_network_feature_description" = "Utiliza o framework MultipeerConnectivity da Apple para descobrir e conectar dispositivos na sua rede local para controle remoto sem interrupções."; + +"local_network_privacy_title" = "Privacidade Protegida"; +"local_network_privacy_description" = "Sua conexão permanece completamente privada dentro da sua rede local. Nenhum dado é enviado para servidores externos ou terceiros."; + +"local_network_benefits_title" = "Instantâneo e Confiável"; +"local_network_benefits_description" = "A comunicação direta entre dispositivos garante tempos de resposta rápidos e funciona sem conexão com a internet."; + +"local_network_allow" = "Permitir Acesso"; +"local_network_not_now" = "Agora Não"; +"local_network_cancel" = "Cancelar"; +"local_network_open_settings" = "Abrir Configurações"; + +/* Camera Permissions Modal */ +"camera_permissions_title" = "Permitir Acesso à Câmera e Fotos"; +"camera_permissions_subtitle" = "O Remote Shutter precisa de acesso à sua câmera e fotos para capturar e salvar imagens quando conectado com outros dispositivos."; + +"camera_permissions_required_title" = "Acesso à Câmera e Fotos Necessário"; +"camera_permissions_required_subtitle" = "O Remote Shutter requer acesso à câmera e fotos para funcionar. Por favor, ative nas Configurações para continuar."; + +"camera_permission_feature_title" = "Acesso à Câmera"; +"camera_permission_feature_description" = "Tire fotos remotamente usando um dispositivo como câmera e outro como controle remoto para fotos perfeitas."; + +"photos_permission_feature_title" = "Salvar Fotos"; +"photos_permission_feature_description" = "Salve automaticamente as fotos capturadas na sua biblioteca de fotos para fácil acesso e compartilhamento."; + +"remote_control_feature_title" = "Controle Remoto"; +"remote_control_feature_description" = "Use um dispositivo para controlar a câmera em outro dispositivo para fotos em grupo, selfies e fotos criativas."; + +"camera_permissions_allow" = "Permitir Acesso"; +"camera_permissions_not_now" = "Agora Não"; +"camera_permissions_cancel" = "Cancelar"; +"camera_permissions_open_settings" = "Abrir Configurações"; + +/* Permission Status Descriptions */ +"camera_permission_not_determined" = "Permissão da câmera ainda não solicitada"; +"camera_permission_denied" = "Acesso à câmera negado"; +"camera_permission_restricted" = "Acesso à câmera restrito"; +"camera_permission_authorized" = "Acesso à câmera concedido"; +"camera_permission_unknown" = "Status de permissão da câmera desconhecido"; + +"photos_permission_not_determined" = "Permissão de fotos ainda não solicitada"; +"photos_permission_denied" = "Acesso às fotos negado"; +"photos_permission_restricted" = "Acesso às fotos restrito"; +"photos_permission_authorized" = "Acesso total às fotos concedido"; +"photos_permission_limited" = "Acesso limitado às fotos concedido"; +"photos_permission_unknown" = "Status de permissão de fotos desconhecido"; + +/* Camera Error View */ +"camera_error_title" = "Acesso à Câmera Necessário"; +"camera_error_subtitle" = "O Remote Shutter precisa de acesso à sua câmera e fotos para funcionar. Por favor, ative as permissões nas Configurações."; +"camera_error_open_settings" = "Abrir Configurações"; +"camera_error_go_back" = "Voltar"; +"camera_access_required" = "Acesso à Câmera"; +"photos_access_required" = "Acesso às Fotos"; + +/* Microphone Permission */ +"microphone_denied_video_without_audio" = "Acesso ao microfone negado. O vídeo será gravado sem áudio."; + +/* Microphone Permission Prompt */ +"mic_required_title" = "Acesso ao Microfone Necessário"; +"mic_required_subtitle" = "Para gravar vídeo com áudio, o Remote Shutter precisa de acesso ao seu microfone. Por favor, ative nas Configurações."; +"video_recording_feature_title" = "Gravação de Vídeo"; +"video_recording_feature_description" = "Grave vídeos de alta qualidade com áudio usando o microfone do seu dispositivo para uma experiência de gravação completa."; +"mic_open_settings" = "Abrir Configurações"; +"mic_cancel_recording" = "Cancelar Gravação"; + +/* Microphone Error Messages */ +"microphone_access_denied_error" = "Não é possível gravar vídeo: O acesso ao microfone foi negado. Por favor, ative o acesso ao microfone nas Configurações para gravar vídeos com áudio."; + +/* QR Code Instructions */ +"qr_code_download_instruction" = "Escaneie este código QR com o app Câmera em outro dispositivo para baixar o Remote Shutter da App Store"; + +/* Photos Access Denied Modal */ +"photos_access_denied_photo_title" = "Não é Possível Salvar a Foto"; +"photos_access_denied_photo_subtitle" = "O Remote Shutter precisa de acesso à sua biblioteca de Fotos para salvar a imagem capturada. Por favor, ative o acesso às Fotos nas Configurações."; +"photos_access_denied_video_title" = "Não é Possível Salvar o Vídeo"; +"photos_access_denied_video_subtitle" = "O Remote Shutter precisa de acesso à sua biblioteca de Fotos para salvar o vídeo gravado. Por favor, ative o acesso às Fotos nas Configurações."; + +"photos_privacy_feature_title" = "Sua Privacidade Importa"; +"photos_privacy_feature_description" = "As fotos são salvas diretamente na biblioteca do seu dispositivo. Nenhum dado é enviado para servidores externos ou compartilhado sem sua permissão."; + +"photos_sharing_feature_title" = "Compartilhamento Fácil"; +"photos_sharing_feature_description" = "Acesse suas fotos e vídeos capturados pelo app Fotos para compartilhar facilmente com amigos e família ou usar em outros apps."; + +"photos_open_settings" = "Abrir Configurações"; +"photos_dismiss" = "Dispensar"; + +/* Video Transfer Progress */ +"video_transfer_progress_title" = "Transferindo Vídeo"; + +/* Help Modal */ +"help_title" = "Como Funciona o Remote Shutter"; +"help_subtitle" = "Tire fotos e vídeos perfeitos usando dois dispositivos"; +"help_got_it" = "Entendi!"; +"help_done" = "Pronto"; + +/* Help Page 1 - Connect Devices */ +"help_connect_title" = "2. Conectar Dispositivos"; +"help_connect_description" = "O dispositivo Câmera fica online e aguarda. No dispositivo Remoto, procure câmeras e toque no nome da câmera para conectar."; +"help_quick_setup_title" = "Configuração Rápida"; +"help_quick_setup_description" = "Use o código QR para baixar o Remote Shutter no seu segundo dispositivo da App Store"; +"help_same_network_title" = "Conexão Peer-to-Peer"; +"help_same_network_description" = "Os dispositivos se conectam diretamente entre si usando Wi-Fi e Bluetooth, assim como o AirDrop - sem necessidade de internet"; + +/* Help Page 2 - Choose Roles */ +"help_roles_title" = "1. Escolha Seu Papel"; +"help_roles_description" = "Primeiro, escolha se este dispositivo será a Câmera ou o Remoto. O dispositivo câmera captura fotos e vídeos, enquanto o remoto o controla."; +"help_camera_device_title" = "Dispositivo Câmera"; +"help_camera_device_description" = "Tira fotos e vídeos, mostra pré-visualização da câmera"; +"help_remote_device_title" = "Dispositivo Remoto"; +"help_remote_device_description" = "Controla a câmera, mostra pré-visualização ao vivo, ajusta configurações"; + +/* Help Page 3 - Capture Media */ +"help_capture_title" = "3. Capture Momentos Perfeitos"; +"help_capture_description" = "Use o dispositivo remoto para controlar a câmera, ajustar configurações e capturar fotos ou vídeos à distância."; +"help_remote_shutter_title" = "Obturador Remoto"; +"help_remote_shutter_description" = "Tire fotos sem tocar no dispositivo câmera"; +"help_video_recording_title" = "Gravação de Vídeo"; +"help_video_recording_description" = "Inicie e pare a gravação de vídeo remotamente"; +"help_camera_controls_title" = "Controles da Câmera"; +"help_camera_controls_description" = "Ajuste flash, lanterna, temporizador e configurações da câmera"; + +/* Help Page 4 - Tips & Tricks */ +"help_tips_title" = "Dicas e Truques"; +"help_tips_description" = "Aproveite ao máximo o Remote Shutter com estas dicas úteis"; +"help_group_photos_title" = "Fotos em Grupo"; +"help_group_photos_description" = "Perfeito para selfies em grupo - posicione a câmera e use o remoto para capturar todos na foto"; +"help_timer_feature_title" = "Função Temporizador"; +"help_timer_feature_description" = "Use o temporizador no dispositivo remoto para se preparar antes da foto ser tirada"; +"help_switch_cameras_title" = "Trocar Câmeras"; +"help_switch_cameras_description" = "Alterne entre câmeras frontal e traseira diretamente do dispositivo remoto"; +"help_auto_save_title" = "Salvamento Automático"; +"help_auto_save_description" = "Fotos e vídeos são salvos automaticamente nas bibliotecas de fotos de ambos os dispositivos"; + +/* Scanner - Role-aware UI */ +"Waiting for remote" = "Aguardando remoto"; +"Scan for cameras" = "Buscar câmeras"; +"Camera Mode" = "Modo Câmera"; +"On another device, open Remote Shutter and select Remote. This camera will appear in their device list." = "Em outro dispositivo, abra o Remote Shutter e selecione Remoto. Esta câmera aparecerá na lista de dispositivos."; +"Go Online" = "Ficar Online"; +"Go Offline" = "Ficar Offline"; +"Waiting for a remote to connect..." = "Aguardando um remoto para conectar..."; +"WAITING FOR A REMOTE TO CONNECT..." = "AGUARDANDO UM REMOTO PARA CONECTAR..."; +"SEARCHING FOR NEARBY CAMERAS..." = "PROCURANDO CÂMERAS PRÓXIMAS..."; +"Scanning for nearby cameras..." = "Procurando câmeras próximas..."; +"Start scanning and wait for a Remote device to connect" = "Inicie a busca e aguarde um dispositivo Remoto conectar"; + +/* Welcome Screen */ +"Turn two devices into a professional remote camera system" = "Transforme dois dispositivos em um sistema profissional de câmera remota"; +"Restore Purchases" = "Restaurar Compras"; +"Unlock all features: video recording, torch control, and ad-free experience." = "Desbloqueie todos os recursos: gravação de vídeo, controle de lanterna e experiência sem anúncios."; +"Get Started" = "Começar"; +"Thank you for your support!" = "Obrigado pelo seu apoio!"; +"Rate on App Store" = "Avaliar na App Store"; +"Welcome" = "Bem-vindo"; +"Purchase" = "Comprar"; +"Restored" = "Restaurado"; +"Your purchases have been restored. If you don't see them, check that you're signed in with the correct Apple ID." = "Suas compras foram restauradas. Se não as vir, verifique se está conectado com o Apple ID correto."; + +/* Role Picker Screen */ +"Pick a role" = "Escolha um papel"; +"Camera" = "Câmera"; +"Capture photos & video" = "Capture fotos e vídeos"; +"Use the device with the best lens" = "Use o dispositivo com a melhor lente"; +"Remote" = "Remoto"; +"Control the shutter" = "Controle o obturador"; +"Works up to 50 feet away" = "Funciona até 15 metros de distância"; +"Remote Mode" = "Modo Remoto"; diff --git a/RemoteCam/zh-Hans.lproj/Localizable.strings b/RemoteCam/zh-Hans.lproj/Localizable.strings new file mode 100644 index 0000000..ab7a603 --- /dev/null +++ b/RemoteCam/zh-Hans.lproj/Localizable.strings @@ -0,0 +1,273 @@ +/* No comment provided by engineer. */ +"%@, ¿Desea intentar nuevamente?" = "%@,您想再试一次吗?"; + +/* No comment provided by engineer. */ +"AppName" = "Remote Shutter"; + +/* No comment provided by engineer. */ +"Camera or remote shutter?" = "相机还是遥控快门?"; + +/* No comment provided by engineer. */ +"Cellular" = "蜂窝网络"; + +/* No comment provided by engineer. */ +"CHOOSE A DEVICE" = "选择设备"; + +/* No comment provided by engineer. */ +"Connecting" = "连接中"; + +/* No comment provided by engineer. */ +"Disconnect" = "断开连接"; + +/* No comment provided by engineer. */ +"Espere..." = "请稍候..."; + +/* No comment provided by engineer. */ +"flash_mode_auto" = "自动"; + +/* No comment provided by engineer. */ +"flash_mode_off" = "关闭"; + +/* No comment provided by engineer. */ +"flash_mode_on" = "开启"; + +/* No comment provided by engineer. */ +"Loading Image" = "加载图片中"; + +/* Default DejalActivtyView label text */ +"Loading..." = "加载中..."; + +/* No comment provided by engineer. */ +"Looking for devices over Wifi and Bluetooth." = "正在通过Wi-Fi和蓝牙搜索设备。"; + +/* No comment provided by engineer. */ +"No Connection" = "无连接"; + +/* No comment provided by engineer. */ +"Reestableciendo compras" = "正在恢复购买"; + +/* No comment provided by engineer. */ +"Requesting capture" = "正在请求拍摄"; + +/* No comment provided by engineer. */ +"ROLE PICKER" = "角色选择"; + +/* No comment provided by engineer. */ +"Sending Photo to Remote" = "正在发送照片到遥控器"; + +/* No comment provided by engineer. */ +"Si" = "是"; + +"Yes"= "是"; + +/* No comment provided by engineer. */ +"WiFi" = "Wi-Fi"; + +/* No comment provided by engineer. */ +"¿Desea sincronizar su %@ con los productos previamente comprados en la AppStore (gratuitamente)?" = "您想将%@与之前购买的功能同步吗(免费)?"; + +"Acknowledgments"= "致谢"; + +"timeunit"= "秒"; + +"Settings"="设置"; + +"Upgrades"="升级"; + +"Timer to take photos"="拍照定时器"; + +"Incoming Invite from %@"="来自%@的邀请"; + +"Do you wish to accept?,"="您想接受吗?"; + +"¡Gracias por usar nuestra App!"="感谢使用此应用!"; + +"En otro momento"="以后再说"; + +"Calificar en la AppStore"="评分"; + +"Mandar Feedback"="发送反馈"; + +"No Gracias"="不,谢谢"; + +"iAds Removed"="广告已移除"; + +"call_to_download" = "立即下载 Remote Shutter %@"; + +/* Local Network Permission Modal */ +"local_network_title" = "请求访问本地网络"; +"local_network_subtitle" = "Remote Shutter 需要访问本地网络,以使用 Apple 的点对点框架来发现和连接您的设备。"; + +"local_network_access_required_title" = "需要本地网络访问权限"; +"local_network_required_subtitle" = "Remote Shutter 需要本地网络访问才能正常工作。请在设置中启用以继续。"; + +"local_network_feature_title" = "点对点连接"; +"local_network_feature_description" = "使用 Apple 的 MultipeerConnectivity 框架在本地网络上发现和连接设备,实现无缝远程控制。"; + +"local_network_privacy_title" = "隐私受保护"; +"local_network_privacy_description" = "您的连接在本地网络中保持完全私密。不会向外部服务器或第三方发送任何数据。"; + +"local_network_benefits_title" = "即时且可靠"; +"local_network_benefits_description" = "设备间直接通信确保快速响应,无需互联网连接即可工作。"; + +"local_network_allow" = "允许访问"; +"local_network_not_now" = "暂时不要"; +"local_network_cancel" = "取消"; +"local_network_open_settings" = "打开设置"; + +/* Camera Permissions Modal */ +"camera_permissions_title" = "允许访问相机和照片"; +"camera_permissions_subtitle" = "Remote Shutter 需要访问您的相机和照片,以便在与其他设备连接时拍摄和保存图片。"; + +"camera_permissions_required_title" = "需要相机和照片访问权限"; +"camera_permissions_required_subtitle" = "Remote Shutter 需要相机和照片访问才能正常工作。请在设置中启用以继续。"; + +"camera_permission_feature_title" = "相机访问"; +"camera_permission_feature_description" = "将一台设备用作相机,另一台用作遥控器,远程拍摄完美照片。"; + +"photos_permission_feature_title" = "保存照片"; +"photos_permission_feature_description" = "自动将拍摄的照片保存到您的照片库,方便访问和分享。"; + +"remote_control_feature_title" = "远程控制"; +"remote_control_feature_description" = "使用一台设备控制另一台设备的相机,用于合影、自拍和创意拍摄。"; + +"camera_permissions_allow" = "允许访问"; +"camera_permissions_not_now" = "暂时不要"; +"camera_permissions_cancel" = "取消"; +"camera_permissions_open_settings" = "打开设置"; + +/* Permission Status Descriptions */ +"camera_permission_not_determined" = "相机权限尚未请求"; +"camera_permission_denied" = "相机访问被拒绝"; +"camera_permission_restricted" = "相机访问受限"; +"camera_permission_authorized" = "相机访问已授权"; +"camera_permission_unknown" = "未知的相机权限状态"; + +"photos_permission_not_determined" = "照片权限尚未请求"; +"photos_permission_denied" = "照片访问被拒绝"; +"photos_permission_restricted" = "照片访问受限"; +"photos_permission_authorized" = "照片完全访问已授权"; +"photos_permission_limited" = "照片有限访问已授权"; +"photos_permission_unknown" = "未知的照片权限状态"; + +/* Camera Error View */ +"camera_error_title" = "需要相机访问权限"; +"camera_error_subtitle" = "Remote Shutter 需要访问您的相机和照片才能正常工作。请在设置中启用权限。"; +"camera_error_open_settings" = "打开设置"; +"camera_error_go_back" = "返回"; +"camera_access_required" = "相机访问"; +"photos_access_required" = "照片访问"; + +/* Microphone Permission */ +"microphone_denied_video_without_audio" = "麦克风访问被拒绝。视频将在无音频的情况下录制。"; + +/* Microphone Permission Prompt */ +"mic_required_title" = "需要麦克风访问权限"; +"mic_required_subtitle" = "要录制带音频的视频,Remote Shutter 需要访问您的麦克风。请在设置中启用。"; +"video_recording_feature_title" = "视频录制"; +"video_recording_feature_description" = "使用设备麦克风录制带音频的高质量视频,享受完整的录制体验。"; +"mic_open_settings" = "打开设置"; +"mic_cancel_recording" = "取消录制"; + +/* Microphone Error Messages */ +"microphone_access_denied_error" = "无法录制视频:麦克风访问被拒绝。请在设置中启用麦克风访问以录制带音频的视频。"; + +/* QR Code Instructions */ +"qr_code_download_instruction" = "在另一台设备上使用相机应用扫描此二维码,从 App Store 下载 Remote Shutter"; + +/* Photos Access Denied Modal */ +"photos_access_denied_photo_title" = "无法保存照片"; +"photos_access_denied_photo_subtitle" = "Remote Shutter 需要访问您的照片库来保存拍摄的图片。请在设置中启用照片访问。"; +"photos_access_denied_video_title" = "无法保存视频"; +"photos_access_denied_video_subtitle" = "Remote Shutter 需要访问您的照片库来保存录制的视频。请在设置中启用照片访问。"; + +"photos_privacy_feature_title" = "您的隐私很重要"; +"photos_privacy_feature_description" = "照片直接保存到您设备的照片库。不会将数据上传到外部服务器或在未经许可的情况下分享。"; + +"photos_sharing_feature_title" = "轻松分享"; +"photos_sharing_feature_description" = "从照片应用访问拍摄的照片和视频,轻松与朋友和家人分享或在其他应用中使用。"; + +"photos_open_settings" = "打开设置"; +"photos_dismiss" = "关闭"; + +/* Video Transfer Progress */ +"video_transfer_progress_title" = "正在传输视频"; + +/* Help Modal */ +"help_title" = "Remote Shutter 使用方法"; +"help_subtitle" = "使用两台设备拍摄完美的照片和视频"; +"help_got_it" = "知道了!"; +"help_done" = "完成"; + +/* Help Page 1 - Connect Devices */ +"help_connect_title" = "2. 连接设备"; +"help_connect_description" = "相机设备上线并等待。在遥控设备上,搜索相机并点击相机名称进行连接。"; +"help_quick_setup_title" = "快速设置"; +"help_quick_setup_description" = "使用二维码从 App Store 在第二台设备上下载 Remote Shutter"; +"help_same_network_title" = "点对点连接"; +"help_same_network_description" = "设备通过 Wi-Fi 和蓝牙直接相互连接,就像 AirDrop 一样 - 无需互联网"; + +/* Help Page 2 - Choose Roles */ +"help_roles_title" = "1. 选择角色"; +"help_roles_description" = "首先,选择此设备是作为相机还是遥控器。相机设备拍摄照片和视频,而遥控器控制它。"; +"help_camera_device_title" = "相机设备"; +"help_camera_device_description" = "拍摄照片和视频,显示相机预览"; +"help_remote_device_title" = "遥控设备"; +"help_remote_device_description" = "控制相机,显示实时预览,调整设置"; + +/* Help Page 3 - Capture Media */ +"help_capture_title" = "3. 捕捉完美瞬间"; +"help_capture_description" = "使用遥控设备控制相机、调整设置,远程拍摄照片或视频。"; +"help_remote_shutter_title" = "远程快门"; +"help_remote_shutter_description" = "无需触碰相机设备即可拍照"; +"help_video_recording_title" = "视频录制"; +"help_video_recording_description" = "远程开始和停止视频录制"; +"help_camera_controls_title" = "相机控制"; +"help_camera_controls_description" = "调整闪光灯、手电筒、定时器和相机设置"; + +/* Help Page 4 - Tips & Tricks */ +"help_tips_title" = "提示与技巧"; +"help_tips_description" = "通过这些实用提示充分利用 Remote Shutter"; +"help_group_photos_title" = "合影"; +"help_group_photos_description" = "非常适合团体自拍 - 设置好相机,用遥控器捕捉所有人"; +"help_timer_feature_title" = "定时器功能"; +"help_timer_feature_description" = "使用遥控设备上的定时器,在拍照前做好准备"; +"help_switch_cameras_title" = "切换相机"; +"help_switch_cameras_description" = "直接从遥控设备切换前置和后置相机"; +"help_auto_save_title" = "自动保存"; +"help_auto_save_description" = "照片和视频自动保存到两台设备的照片库"; + +/* Scanner - Role-aware UI */ +"Waiting for remote" = "等待遥控器"; +"Scan for cameras" = "搜索相机"; +"Camera Mode" = "相机模式"; +"On another device, open Remote Shutter and select Remote. This camera will appear in their device list." = "在另一台设备上,打开 Remote Shutter 并选择遥控。此相机将显示在其设备列表中。"; +"Go Online" = "上线"; +"Go Offline" = "下线"; +"Waiting for a remote to connect..." = "等待遥控器连接..."; +"WAITING FOR A REMOTE TO CONNECT..." = "等待遥控器连接..."; +"SEARCHING FOR NEARBY CAMERAS..." = "搜索附近的相机..."; +"Scanning for nearby cameras..." = "正在搜索附近的相机..."; +"Start scanning and wait for a Remote device to connect" = "开始扫描并等待遥控设备连接"; + +/* Welcome Screen */ +"Turn two devices into a professional remote camera system" = "将两台设备变成专业的远程相机系统"; +"Restore Purchases" = "恢复购买"; +"Unlock all features: video recording, torch control, and ad-free experience." = "解锁所有功能:视频录制、手电筒控制和无广告体验。"; +"Get Started" = "开始"; +"Thank you for your support!" = "感谢您的支持!"; +"Rate on App Store" = "在 App Store 评分"; +"Welcome" = "欢迎"; +"Purchase" = "购买"; +"Restored" = "已恢复"; +"Your purchases have been restored. If you don't see them, check that you're signed in with the correct Apple ID." = "您的购买已恢复。如果看不到,请检查是否使用了正确的 Apple ID 登录。"; + +/* Role Picker Screen */ +"Pick a role" = "选择角色"; +"Camera" = "相机"; +"Capture photos & video" = "拍摄照片和视频"; +"Use the device with the best lens" = "使用镜头最好的设备"; +"Remote" = "遥控"; +"Control the shutter" = "控制快门"; +"Works up to 50 feet away" = "最远可在15米内使用"; +"Remote Mode" = "遥控模式"; From 738082734972de9eec9f1721a6dcd7834aa3e6e6 Mon Sep 17 00:00:00 2001 From: Dario Lencina Date: Sat, 21 Mar 2026 00:37:08 -0700 Subject: [PATCH 5/8] save --- RemoteCam/da.lproj/Localizable.strings | 11 ++++++++++- RemoteCam/de-DE.lproj/Localizable.strings | 9 +++++++++ RemoteCam/en.lproj/Localizable.strings | 9 +++++++++ RemoteCam/es-MX.lproj/Localizable.strings | 13 +++++++++++-- RemoteCam/fr-FR.lproj/Localizable.strings | 11 ++++++++++- RemoteCam/it.lproj/Localizable.strings | 13 +++++++++++-- RemoteCam/ja.lproj/Localizable.strings | 9 +++++++++ RemoteCam/ko.lproj/Localizable.strings | 9 +++++++++ RemoteCam/pt-BR.lproj/Localizable.strings | 11 ++++++++++- RemoteCam/zh-Hans.lproj/Localizable.strings | 9 +++++++++ 10 files changed, 97 insertions(+), 7 deletions(-) diff --git a/RemoteCam/da.lproj/Localizable.strings b/RemoteCam/da.lproj/Localizable.strings index fb2c887..b28c480 100644 --- a/RemoteCam/da.lproj/Localizable.strings +++ b/RemoteCam/da.lproj/Localizable.strings @@ -149,4 +149,13 @@ "Remote" = "Fjernbetjening"; "Control the shutter" = "Styr udløseren"; "Works up to 50 feet away" = "Fungerer op til 15 meter væk"; -"Remote Mode" = "Fjernbetjeningstilstand"; \ No newline at end of file +"Remote Mode" = "Fjernbetjeningstilstand"; + +/* Alert Messages */ +"Scanning Error" = "Scanningsfejl"; +"Unable to scan for nearby devices. Please check your network settings and try again." = "Kan ikke scanne efter enheder i nærheden. Kontroller dine netværksindstillinger og prøv igen."; +"OK" = "OK"; +"Ok" = "OK"; +"Error" = "Fejl"; +"Connection error" = "Forbindelsesfejl"; +"Unable to start recording" = "Kan ikke starte optagelse"; \ No newline at end of file diff --git a/RemoteCam/de-DE.lproj/Localizable.strings b/RemoteCam/de-DE.lproj/Localizable.strings index 9e23b5e..a771d3e 100644 --- a/RemoteCam/de-DE.lproj/Localizable.strings +++ b/RemoteCam/de-DE.lproj/Localizable.strings @@ -271,3 +271,12 @@ "Control the shutter" = "Auslöser steuern"; "Works up to 50 feet away" = "Funktioniert bis zu 15 Meter entfernt"; "Remote Mode" = "Fernbedienungsmodus"; + +/* Alert Messages */ +"Scanning Error" = "Scanfehler"; +"Unable to scan for nearby devices. Please check your network settings and try again." = "Geräte in der Nähe können nicht gefunden werden. Überprüfen Sie Ihre Netzwerkeinstellungen und versuchen Sie es erneut."; +"OK" = "OK"; +"Ok" = "OK"; +"Error" = "Fehler"; +"Connection error" = "Verbindungsfehler"; +"Unable to start recording" = "Aufnahme kann nicht gestartet werden"; diff --git a/RemoteCam/en.lproj/Localizable.strings b/RemoteCam/en.lproj/Localizable.strings index d9dea3b..1466b5f 100644 --- a/RemoteCam/en.lproj/Localizable.strings +++ b/RemoteCam/en.lproj/Localizable.strings @@ -271,3 +271,12 @@ "Control the shutter" = "Control the shutter"; "Works up to 50 feet away" = "Works up to 50 feet away"; "Remote Mode" = "Remote Mode"; + +/* Alert Messages */ +"Scanning Error" = "Scanning Error"; +"Unable to scan for nearby devices. Please check your network settings and try again." = "Unable to scan for nearby devices. Please check your network settings and try again."; +"OK" = "OK"; +"Ok" = "OK"; +"Error" = "Error"; +"Connection error" = "Connection error"; +"Unable to start recording" = "Unable to start recording"; diff --git a/RemoteCam/es-MX.lproj/Localizable.strings b/RemoteCam/es-MX.lproj/Localizable.strings index c5f8f4a..440b746 100644 --- a/RemoteCam/es-MX.lproj/Localizable.strings +++ b/RemoteCam/es-MX.lproj/Localizable.strings @@ -153,7 +153,7 @@ "Get Started" = "Comenzar"; "Thank you for your support!" = "¡Gracias por tu apoyo!"; "Rate on App Store" = "Calificar en App Store"; -"Welcome" = "Bienvenido"; +"Welcome" = "Te damos la bienvenida"; "Purchase" = "Comprar"; "Restored" = "Restaurado"; "Your purchases have been restored. If you don't see them, check that you're signed in with the correct Apple ID." = "Tus compras han sido restauradas. Si no las ves, verifica que hayas iniciado sesión con el Apple ID correcto."; @@ -166,4 +166,13 @@ "Remote" = "Remoto"; "Control the shutter" = "Controla el obturador"; "Works up to 50 feet away" = "Funciona hasta a 15 metros de distancia"; -"Remote Mode" = "Modo Remoto"; \ No newline at end of file +"Remote Mode" = "Modo Remoto"; + +/* Alert Messages */ +"Scanning Error" = "Error de Escaneo"; +"Unable to scan for nearby devices. Please check your network settings and try again." = "No se pueden buscar dispositivos cercanos. Verifica tu configuración de red e inténtalo de nuevo."; +"OK" = "OK"; +"Ok" = "OK"; +"Error" = "Error"; +"Connection error" = "Error de conexión"; +"Unable to start recording" = "No se puede iniciar la grabación"; \ No newline at end of file diff --git a/RemoteCam/fr-FR.lproj/Localizable.strings b/RemoteCam/fr-FR.lproj/Localizable.strings index 2edacfb..fdbf417 100644 --- a/RemoteCam/fr-FR.lproj/Localizable.strings +++ b/RemoteCam/fr-FR.lproj/Localizable.strings @@ -166,4 +166,13 @@ "Remote" = "Télécommande"; "Control the shutter" = "Contrôlez le déclencheur"; "Works up to 50 feet away" = "Fonctionne jusqu'à 15 mètres de distance"; -"Remote Mode" = "Mode Télécommande"; \ No newline at end of file +"Remote Mode" = "Mode Télécommande"; + +/* Alert Messages */ +"Scanning Error" = "Erreur de Recherche"; +"Unable to scan for nearby devices. Please check your network settings and try again." = "Impossible de rechercher les appareils à proximité. Vérifiez vos paramètres réseau et réessayez."; +"OK" = "OK"; +"Ok" = "OK"; +"Error" = "Erreur"; +"Connection error" = "Erreur de connexion"; +"Unable to start recording" = "Impossible de démarrer l'enregistrement"; \ No newline at end of file diff --git a/RemoteCam/it.lproj/Localizable.strings b/RemoteCam/it.lproj/Localizable.strings index c9ff977..3c8755d 100644 --- a/RemoteCam/it.lproj/Localizable.strings +++ b/RemoteCam/it.lproj/Localizable.strings @@ -136,7 +136,7 @@ "Get Started" = "Inizia"; "Thank you for your support!" = "Grazie per il tuo supporto!"; "Rate on App Store" = "Valuta su App Store"; -"Welcome" = "Benvenuto"; +"Welcome" = "Benvenuti"; "Purchase" = "Acquista"; "Restored" = "Ripristinato"; "Your purchases have been restored. If you don't see them, check that you're signed in with the correct Apple ID." = "I tuoi acquisti sono stati ripristinati. Se non li vedi, verifica di aver effettuato l'accesso con l'Apple ID corretto."; @@ -149,4 +149,13 @@ "Remote" = "Telecomando"; "Control the shutter" = "Controlla l'otturatore"; "Works up to 50 feet away" = "Funziona fino a 15 metri di distanza"; -"Remote Mode" = "Modalità Telecomando"; \ No newline at end of file +"Remote Mode" = "Modalità Telecomando"; + +/* Alert Messages */ +"Scanning Error" = "Errore di Scansione"; +"Unable to scan for nearby devices. Please check your network settings and try again." = "Impossibile cercare dispositivi nelle vicinanze. Controlla le impostazioni di rete e riprova."; +"OK" = "OK"; +"Ok" = "OK"; +"Error" = "Errore"; +"Connection error" = "Errore di connessione"; +"Unable to start recording" = "Impossibile avviare la registrazione"; \ No newline at end of file diff --git a/RemoteCam/ja.lproj/Localizable.strings b/RemoteCam/ja.lproj/Localizable.strings index ded4118..3e99d87 100644 --- a/RemoteCam/ja.lproj/Localizable.strings +++ b/RemoteCam/ja.lproj/Localizable.strings @@ -271,3 +271,12 @@ "Control the shutter" = "シャッターを操作"; "Works up to 50 feet away" = "最大15メートル離れても動作"; "Remote Mode" = "リモートモード"; + +/* Alert Messages */ +"Scanning Error" = "スキャンエラー"; +"Unable to scan for nearby devices. Please check your network settings and try again." = "近くのデバイスをスキャンできません。ネットワーク設定を確認して、もう一度お試しください。"; +"OK" = "OK"; +"Ok" = "OK"; +"Error" = "エラー"; +"Connection error" = "接続エラー"; +"Unable to start recording" = "録画を開始できません"; diff --git a/RemoteCam/ko.lproj/Localizable.strings b/RemoteCam/ko.lproj/Localizable.strings index c2172c4..fd3febd 100644 --- a/RemoteCam/ko.lproj/Localizable.strings +++ b/RemoteCam/ko.lproj/Localizable.strings @@ -271,3 +271,12 @@ "Control the shutter" = "셔터 제어"; "Works up to 50 feet away" = "최대 15미터 거리에서 작동"; "Remote Mode" = "리모트 모드"; + +/* Alert Messages */ +"Scanning Error" = "스캔 오류"; +"Unable to scan for nearby devices. Please check your network settings and try again." = "주변 기기를 검색할 수 없습니다. 네트워크 설정을 확인하고 다시 시도해 주세요."; +"OK" = "OK"; +"Ok" = "OK"; +"Error" = "오류"; +"Connection error" = "연결 오류"; +"Unable to start recording" = "녹화를 시작할 수 없습니다"; diff --git a/RemoteCam/pt-BR.lproj/Localizable.strings b/RemoteCam/pt-BR.lproj/Localizable.strings index 9b348f3..bebd232 100644 --- a/RemoteCam/pt-BR.lproj/Localizable.strings +++ b/RemoteCam/pt-BR.lproj/Localizable.strings @@ -257,7 +257,7 @@ "Get Started" = "Começar"; "Thank you for your support!" = "Obrigado pelo seu apoio!"; "Rate on App Store" = "Avaliar na App Store"; -"Welcome" = "Bem-vindo"; +"Welcome" = "Boas-vindas"; "Purchase" = "Comprar"; "Restored" = "Restaurado"; "Your purchases have been restored. If you don't see them, check that you're signed in with the correct Apple ID." = "Suas compras foram restauradas. Se não as vir, verifique se está conectado com o Apple ID correto."; @@ -271,3 +271,12 @@ "Control the shutter" = "Controle o obturador"; "Works up to 50 feet away" = "Funciona até 15 metros de distância"; "Remote Mode" = "Modo Remoto"; + +/* Alert Messages */ +"Scanning Error" = "Erro de Busca"; +"Unable to scan for nearby devices. Please check your network settings and try again." = "Não é possível buscar dispositivos próximos. Verifique suas configurações de rede e tente novamente."; +"OK" = "OK"; +"Ok" = "OK"; +"Error" = "Erro"; +"Connection error" = "Erro de conexão"; +"Unable to start recording" = "Não é possível iniciar a gravação"; diff --git a/RemoteCam/zh-Hans.lproj/Localizable.strings b/RemoteCam/zh-Hans.lproj/Localizable.strings index ab7a603..c873660 100644 --- a/RemoteCam/zh-Hans.lproj/Localizable.strings +++ b/RemoteCam/zh-Hans.lproj/Localizable.strings @@ -271,3 +271,12 @@ "Control the shutter" = "控制快门"; "Works up to 50 feet away" = "最远可在15米内使用"; "Remote Mode" = "遥控模式"; + +/* Alert Messages */ +"Scanning Error" = "扫描错误"; +"Unable to scan for nearby devices. Please check your network settings and try again." = "无法扫描附近的设备。请检查网络设置后重试。"; +"OK" = "好"; +"Ok" = "好"; +"Error" = "错误"; +"Connection error" = "连接错误"; +"Unable to start recording" = "无法开始录制"; From 9705c53c42cbbdccd639db5fbc2006814b82cc0f Mon Sep 17 00:00:00 2001 From: Dario Lencina Date: Sat, 21 Mar 2026 01:03:03 -0700 Subject: [PATCH 6/8] adding a ton of strings --- RemoteCam/AppDelegate.swift | 1 - RemoteCam/DeviceScannerView.swift | 207 +++++++++++--------- RemoteCam/da.lproj/Localizable.strings | 38 +++- RemoteCam/de-DE.lproj/Localizable.strings | 35 ++++ RemoteCam/en.lproj/Localizable.strings | 35 ++++ RemoteCam/es-MX.lproj/Localizable.strings | 37 +++- RemoteCam/fr-FR.lproj/Localizable.strings | 37 +++- RemoteCam/it.lproj/Localizable.strings | 38 +++- RemoteCam/ja.lproj/Localizable.strings | 35 ++++ RemoteCam/ko.lproj/Localizable.strings | 35 ++++ RemoteCam/pt-BR.lproj/Localizable.strings | 35 ++++ RemoteCam/zh-Hans.lproj/Localizable.strings | 35 ++++ 12 files changed, 466 insertions(+), 102 deletions(-) diff --git a/RemoteCam/AppDelegate.swift b/RemoteCam/AppDelegate.swift index 7183ac5..7f80337 100644 --- a/RemoteCam/AppDelegate.swift +++ b/RemoteCam/AppDelegate.swift @@ -12,7 +12,6 @@ import Photos @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { - var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { diff --git a/RemoteCam/DeviceScannerView.swift b/RemoteCam/DeviceScannerView.swift index 478ff54..b7c250d 100644 --- a/RemoteCam/DeviceScannerView.swift +++ b/RemoteCam/DeviceScannerView.swift @@ -85,118 +85,120 @@ struct DeviceScannerView: View { // MARK: - Camera Waiting State private var cameraWaitingState: some View { - VStack(spacing: 24) { - Spacer() - - // Camera icon - ZStack { - Circle() - .fill(AppTheme.accent.opacity(0.12)) - .frame(width: 120, height: 120) - - Circle() - .strokeBorder(AppTheme.accent.opacity(0.25), lineWidth: 1.5) - .frame(width: 120, height: 120) - - Image(systemName: "camera.fill") - .font(.system(size: 48, weight: .medium)) - .foregroundColor(AppTheme.accent) - } - - VStack(spacing: 8) { - Text(NSLocalizedString("Camera Mode", comment: "")) - .font(.title2) - .fontWeight(.bold) - .foregroundColor(.primary) + ScrollView { + VStack(spacing: 20) { + // Camera icon + ZStack { + Circle() + .fill(AppTheme.accent.opacity(0.12)) + .frame(width: 100, height: 100) + + Circle() + .strokeBorder(AppTheme.accent.opacity(0.25), lineWidth: 1.5) + .frame(width: 100, height: 100) + + Image(systemName: "camera.fill") + .font(.system(size: 40, weight: .medium)) + .foregroundColor(AppTheme.accent) + } + .padding(.top, 24) + + VStack(spacing: 8) { + Text(NSLocalizedString("Camera Mode", comment: "")) + .font(.title2) + .fontWeight(.bold) + .foregroundColor(.primary) + + Text(NSLocalizedString("On another device, open Remote Shutter and select Remote. This camera will appear in their device list.", comment: "")) + .font(.subheadline) + .foregroundColor(.secondary) + .multilineTextAlignment(.center) + .lineLimit(nil) + .fixedSize(horizontal: false, vertical: true) + } + .padding(.horizontal, 20) - Text(NSLocalizedString("On another device, open Remote Shutter and select Remote. This camera will appear in their device list.", comment: "")) - .font(.subheadline) - .foregroundColor(.secondary) - .multilineTextAlignment(.center) - .padding(.horizontal, 40) - } + // Status + statusBadge - // Status - statusBadge + // Actions + VStack(spacing: 12) { + if !viewModel.hasLocalNetworkAccess { + settingsButton + } else if viewModel.isScanning { + cameraAdvertisingIndicator + goOfflineButton + } else { + goOnlineButton + } - // Actions - VStack(spacing: 12) { - if !viewModel.hasLocalNetworkAccess { - settingsButton - } else if viewModel.isScanning { - cameraAdvertisingIndicator - goOfflineButton - } else { - goOnlineButton + shareButton } + .padding(.horizontal, 20) - shareButton + // QR code + tip + qrCodeSection } - .padding(.horizontal, 20) - - Spacer() - - // QR code + tip - qrCodeSection } } // MARK: - Empty State private var emptyState: some View { - VStack(spacing: 24) { - Spacer() - - // Remote icon - ZStack { - Circle() - .fill(AppTheme.secondary.opacity(0.12)) - .frame(width: 120, height: 120) - - Circle() - .strokeBorder(AppTheme.secondary.opacity(0.25), lineWidth: 1.5) - .frame(width: 120, height: 120) - - Image(systemName: "antenna.radiowaves.left.and.right") - .font(.system(size: 48, weight: .medium)) - .foregroundColor(AppTheme.secondary) - } - - VStack(spacing: 8) { - Text(NSLocalizedString("Remote Mode", comment: "")) - .font(.title2) - .fontWeight(.bold) - .foregroundColor(.primary) + ScrollView { + VStack(spacing: 20) { + // Remote icon + ZStack { + Circle() + .fill(AppTheme.secondary.opacity(0.12)) + .frame(width: 100, height: 100) + + Circle() + .strokeBorder(AppTheme.secondary.opacity(0.25), lineWidth: 1.5) + .frame(width: 100, height: 100) + + Image(systemName: "antenna.radiowaves.left.and.right") + .font(.system(size: 40, weight: .medium)) + .foregroundColor(AppTheme.secondary) + } + .padding(.top, 24) + + VStack(spacing: 8) { + Text(NSLocalizedString("Remote Mode", comment: "")) + .font(.title2) + .fontWeight(.bold) + .foregroundColor(.primary) + + Text(NSLocalizedString("You need at least 2 devices running Remote Shutter", comment: "")) + .font(.subheadline) + .foregroundColor(.secondary) + .multilineTextAlignment(.center) + .lineLimit(nil) + .fixedSize(horizontal: false, vertical: true) + } + .padding(.horizontal, 20) - Text(NSLocalizedString("You need at least 2 devices running Remote Shutter", comment: "")) - .font(.subheadline) - .foregroundColor(.secondary) - .multilineTextAlignment(.center) - .padding(.horizontal, 40) - } + // Status + statusBadge - // Status - statusBadge + // Actions + VStack(spacing: 12) { + if !viewModel.hasLocalNetworkAccess { + settingsButton + } else if viewModel.isScanning { + scanningIndicator + stopScanButton + } else { + startScanButton + } - // Actions - VStack(spacing: 12) { - if !viewModel.hasLocalNetworkAccess { - settingsButton - } else if viewModel.isScanning { - scanningIndicator - stopScanButton - } else { - startScanButton + shareButton } + .padding(.horizontal, 20) - shareButton + // QR code + tip + qrCodeSection } - .padding(.horizontal, 20) - - Spacer() - - // QR code + tip - qrCodeSection } } @@ -219,13 +221,16 @@ struct DeviceScannerView: View { ) } - HStack(spacing: 8) { + HStack(alignment: .top, spacing: 8) { Image(systemName: "qrcode") .font(.caption) .foregroundColor(AppTheme.accent) + .padding(.top, 2) Text(NSLocalizedString("Scan the QR code on another device to download Remote Shutter", comment: "")) .font(.caption) .foregroundColor(.secondary) + .lineLimit(nil) + .fixedSize(horizontal: false, vertical: true) } .padding(.horizontal, 20) } @@ -309,9 +314,13 @@ struct DeviceScannerView: View { Text(NSLocalizedString("Scanning for nearby cameras...", comment: "")) .font(.subheadline) .foregroundColor(.secondary) + .lineLimit(nil) + .fixedSize(horizontal: false, vertical: true) } .frame(maxWidth: .infinity) - .frame(height: 54) + .frame(minHeight: 54) + .padding(.vertical, 8) + .padding(.horizontal, 16) .background(.ultraThinMaterial) .clipShape(RoundedRectangle(cornerRadius: 14)) .overlay( @@ -326,9 +335,13 @@ struct DeviceScannerView: View { Text(NSLocalizedString("Waiting for a remote to connect...", comment: "")) .font(.subheadline) .foregroundColor(.secondary) + .lineLimit(nil) + .fixedSize(horizontal: false, vertical: true) } .frame(maxWidth: .infinity) - .frame(height: 54) + .frame(minHeight: 54) + .padding(.vertical, 8) + .padding(.horizontal, 16) .background(.ultraThinMaterial) .clipShape(RoundedRectangle(cornerRadius: 14)) .overlay( diff --git a/RemoteCam/da.lproj/Localizable.strings b/RemoteCam/da.lproj/Localizable.strings index b28c480..9617492 100644 --- a/RemoteCam/da.lproj/Localizable.strings +++ b/RemoteCam/da.lproj/Localizable.strings @@ -158,4 +158,40 @@ "Ok" = "OK"; "Error" = "Fejl"; "Connection error" = "Forbindelsesfejl"; -"Unable to start recording" = "Kan ikke starte optagelse"; \ No newline at end of file +"Unable to start recording" = "Kan ikke starte optagelse"; + +/* Scanner UI */ +"Connect" = "Forbind"; +"Connecting..." = "Forbinder..."; +"Start Scanning" = "Start Scanning"; +"Stop Scanning" = "Stop Scanning"; +"Share App Link" = "Del App Link"; +"Scan for devices" = "Scan efter enheder"; +"Open Settings" = "Åbn Indstillinger"; +"Disconnect" = "Afbryd"; +"You need at least 2 devices running Remote Shutter" = "Du skal bruge mindst 2 enheder med Remote Shutter"; +"Scan the QR code on another device to download Remote Shutter" = "Scan QR-koden på en anden enhed for at downloade Remote Shutter"; +"SCANNING ERROR - CHECK NETWORK SETTINGS" = "SCANNINGSFEJL - TJEK NETVÆRKSINDSTILLINGER"; +"TAP THE BUTTON TO GET STARTED" = "TRYK PÅ KNAPPEN FOR AT KOMME I GANG"; + +/* Settings */ +"About" = "Om"; +"Back" = "Tilbage"; +"Contact Support" = "Kontakt Support"; +"Discord Community" = "Discord Fællesskab"; +"In-App Purchases" = "Køb i Appen"; +"Purchased" = "Købt"; +"Send Media to Remote" = "Send Medie til Fjernbetjening"; +"Source Code" = "Kildekode"; +"Version" = "Version"; + +/* Camera/Monitor Status */ +"Taking photo" = "Tager foto"; +"Taking picture" = "Tager billede"; +"Starting video" = "Starter video"; +"Stopping video" = "Stopper video"; +"Recording shorts" = "Optager shorts"; +"Unable to save video" = "Kan ikke gemme video"; +"Unable to save video to Photos app" = "Kan ikke gemme video i Fotos-appen"; +"Purchases restored successfully." = "Køb gendannet med succes."; +"Pick a role: Camera or Remote" = "Vælg en rolle: Kamera eller Fjernbetjening"; \ No newline at end of file diff --git a/RemoteCam/de-DE.lproj/Localizable.strings b/RemoteCam/de-DE.lproj/Localizable.strings index a771d3e..7c99370 100644 --- a/RemoteCam/de-DE.lproj/Localizable.strings +++ b/RemoteCam/de-DE.lproj/Localizable.strings @@ -280,3 +280,38 @@ "Error" = "Fehler"; "Connection error" = "Verbindungsfehler"; "Unable to start recording" = "Aufnahme kann nicht gestartet werden"; + +/* Scanner UI */ +"Connect" = "Verbinden"; +"Connecting..." = "Verbindung wird hergestellt..."; +"Start Scanning" = "Suche starten"; +"Stop Scanning" = "Suche beenden"; +"Share App Link" = "App-Link teilen"; +"Scan for devices" = "Nach Geräten suchen"; +"Open Settings" = "Einstellungen öffnen"; +"You need at least 2 devices running Remote Shutter" = "Sie benötigen mindestens 2 Geräte mit Remote Shutter"; +"Scan the QR code on another device to download Remote Shutter" = "Scannen Sie den QR-Code auf einem anderen Gerät, um Remote Shutter herunterzuladen"; +"SCANNING ERROR - CHECK NETWORK SETTINGS" = "SUCHFEHLER - NETZWERKEINSTELLUNGEN PRÜFEN"; +"TAP THE BUTTON TO GET STARTED" = "TIPPEN SIE AUF DEN BUTTON, UM ZU STARTEN"; + +/* Settings */ +"About" = "Über"; +"Back" = "Zurück"; +"Contact Support" = "Support kontaktieren"; +"Discord Community" = "Discord-Community"; +"In-App Purchases" = "In-App-Käufe"; +"Purchased" = "Gekauft"; +"Send Media to Remote" = "Medien an Fernbedienung senden"; +"Source Code" = "Quellcode"; +"Version" = "Version"; + +/* Camera/Monitor Status */ +"Taking photo" = "Foto wird aufgenommen"; +"Taking picture" = "Bild wird aufgenommen"; +"Starting video" = "Video wird gestartet"; +"Stopping video" = "Video wird gestoppt"; +"Recording shorts" = "Shorts werden aufgenommen"; +"Unable to save video" = "Video kann nicht gespeichert werden"; +"Unable to save video to Photos app" = "Video kann nicht in der Fotos-App gespeichert werden"; +"Purchases restored successfully." = "Käufe erfolgreich wiederhergestellt."; +"Pick a role: Camera or Remote" = "Rolle wählen: Kamera oder Fernbedienung"; diff --git a/RemoteCam/en.lproj/Localizable.strings b/RemoteCam/en.lproj/Localizable.strings index 1466b5f..7bf880c 100644 --- a/RemoteCam/en.lproj/Localizable.strings +++ b/RemoteCam/en.lproj/Localizable.strings @@ -280,3 +280,38 @@ "Error" = "Error"; "Connection error" = "Connection error"; "Unable to start recording" = "Unable to start recording"; + +/* Scanner UI */ +"Connect" = "Connect"; +"Connecting..." = "Connecting..."; +"Start Scanning" = "Start Scanning"; +"Stop Scanning" = "Stop Scanning"; +"Share App Link" = "Share App Link"; +"Scan for devices" = "Scan for devices"; +"Open Settings" = "Open Settings"; +"You need at least 2 devices running Remote Shutter" = "You need at least 2 devices running Remote Shutter"; +"Scan the QR code on another device to download Remote Shutter" = "Scan the QR code on another device to download Remote Shutter"; +"SCANNING ERROR - CHECK NETWORK SETTINGS" = "SCANNING ERROR - CHECK NETWORK SETTINGS"; +"TAP THE BUTTON TO GET STARTED" = "TAP THE BUTTON TO GET STARTED"; + +/* Settings */ +"About" = "About"; +"Back" = "Back"; +"Contact Support" = "Contact Support"; +"Discord Community" = "Discord Community"; +"In-App Purchases" = "In-App Purchases"; +"Purchased" = "Purchased"; +"Send Media to Remote" = "Send Media to Remote"; +"Source Code" = "Source Code"; +"Version" = "Version"; + +/* Camera/Monitor Status */ +"Taking photo" = "Taking photo"; +"Taking picture" = "Taking picture"; +"Starting video" = "Starting video"; +"Stopping video" = "Stopping video"; +"Recording shorts" = "Recording shorts"; +"Unable to save video" = "Unable to save video"; +"Unable to save video to Photos app" = "Unable to save video to Photos app"; +"Purchases restored successfully." = "Purchases restored successfully."; +"Pick a role: Camera or Remote" = "Pick a role: Camera or Remote"; diff --git a/RemoteCam/es-MX.lproj/Localizable.strings b/RemoteCam/es-MX.lproj/Localizable.strings index 440b746..86c16de 100644 --- a/RemoteCam/es-MX.lproj/Localizable.strings +++ b/RemoteCam/es-MX.lproj/Localizable.strings @@ -175,4 +175,39 @@ "Ok" = "OK"; "Error" = "Error"; "Connection error" = "Error de conexión"; -"Unable to start recording" = "No se puede iniciar la grabación"; \ No newline at end of file +"Unable to start recording" = "No se puede iniciar la grabación"; + +/* Scanner UI */ +"Connect" = "Conectar"; +"Connecting..." = "Conectando..."; +"Start Scanning" = "Iniciar Búsqueda"; +"Stop Scanning" = "Detener Búsqueda"; +"Share App Link" = "Compartir Enlace"; +"Scan for devices" = "Buscar dispositivos"; +"Disconnect" = "Desconectar"; +"You need at least 2 devices running Remote Shutter" = "Necesitas al menos 2 dispositivos con Remote Shutter"; +"Scan the QR code on another device to download Remote Shutter" = "Escanea el código QR en otro dispositivo para descargar Remote Shutter"; +"SCANNING ERROR - CHECK NETWORK SETTINGS" = "ERROR DE ESCANEO - VERIFICA CONFIGURACIÓN DE RED"; +"TAP THE BUTTON TO GET STARTED" = "TOCA EL BOTÓN PARA COMENZAR"; + +/* Settings */ +"About" = "Acerca de"; +"Back" = "Atrás"; +"Contact Support" = "Contactar Soporte"; +"Discord Community" = "Comunidad en Discord"; +"In-App Purchases" = "Compras Dentro de la App"; +"Purchased" = "Comprado"; +"Send Media to Remote" = "Enviar Multimedia al Remoto"; +"Source Code" = "Código Fuente"; +"Version" = "Versión"; + +/* Camera/Monitor Status */ +"Taking photo" = "Tomando foto"; +"Taking picture" = "Tomando foto"; +"Starting video" = "Iniciando video"; +"Stopping video" = "Deteniendo video"; +"Recording shorts" = "Grabando shorts"; +"Unable to save video" = "No se puede guardar el video"; +"Unable to save video to Photos app" = "No se puede guardar el video en la app Fotos"; +"Purchases restored successfully." = "Compras restauradas con éxito."; +"Pick a role: Camera or Remote" = "Elige un rol: Cámara o Remoto"; \ No newline at end of file diff --git a/RemoteCam/fr-FR.lproj/Localizable.strings b/RemoteCam/fr-FR.lproj/Localizable.strings index fdbf417..c46b09c 100644 --- a/RemoteCam/fr-FR.lproj/Localizable.strings +++ b/RemoteCam/fr-FR.lproj/Localizable.strings @@ -175,4 +175,39 @@ "Ok" = "OK"; "Error" = "Erreur"; "Connection error" = "Erreur de connexion"; -"Unable to start recording" = "Impossible de démarrer l'enregistrement"; \ No newline at end of file +"Unable to start recording" = "Impossible de démarrer l'enregistrement"; + +/* Scanner UI */ +"Connect" = "Connecter"; +"Connecting..." = "Connexion..."; +"Start Scanning" = "Lancer la Recherche"; +"Stop Scanning" = "Arrêter la Recherche"; +"Share App Link" = "Partager le Lien"; +"Scan for devices" = "Rechercher des appareils"; +"Disconnect" = "Déconnecter"; +"You need at least 2 devices running Remote Shutter" = "Vous avez besoin d'au moins 2 appareils avec Remote Shutter"; +"Scan the QR code on another device to download Remote Shutter" = "Scannez le QR code sur un autre appareil pour télécharger Remote Shutter"; +"SCANNING ERROR - CHECK NETWORK SETTINGS" = "ERREUR DE RECHERCHE - VÉRIFIEZ LES PARAMÈTRES RÉSEAU"; +"TAP THE BUTTON TO GET STARTED" = "APPUYEZ SUR LE BOUTON POUR COMMENCER"; + +/* Settings */ +"About" = "À propos"; +"Back" = "Retour"; +"Contact Support" = "Contacter le Support"; +"Discord Community" = "Communauté Discord"; +"In-App Purchases" = "Achats Intégrés"; +"Purchased" = "Acheté"; +"Send Media to Remote" = "Envoyer les Médias à la Télécommande"; +"Source Code" = "Code Source"; +"Version" = "Version"; + +/* Camera/Monitor Status */ +"Taking photo" = "Prise de photo"; +"Taking picture" = "Prise de photo"; +"Starting video" = "Démarrage de la vidéo"; +"Stopping video" = "Arrêt de la vidéo"; +"Recording shorts" = "Enregistrement de shorts"; +"Unable to save video" = "Impossible de sauvegarder la vidéo"; +"Unable to save video to Photos app" = "Impossible de sauvegarder la vidéo dans Photos"; +"Purchases restored successfully." = "Achats restaurés avec succès."; +"Pick a role: Camera or Remote" = "Choisissez un rôle : Appareil Photo ou Télécommande"; \ No newline at end of file diff --git a/RemoteCam/it.lproj/Localizable.strings b/RemoteCam/it.lproj/Localizable.strings index 3c8755d..21b8f52 100644 --- a/RemoteCam/it.lproj/Localizable.strings +++ b/RemoteCam/it.lproj/Localizable.strings @@ -158,4 +158,40 @@ "Ok" = "OK"; "Error" = "Errore"; "Connection error" = "Errore di connessione"; -"Unable to start recording" = "Impossibile avviare la registrazione"; \ No newline at end of file +"Unable to start recording" = "Impossibile avviare la registrazione"; + +/* Scanner UI */ +"Connect" = "Connetti"; +"Connecting..." = "Connessione..."; +"Start Scanning" = "Avvia Ricerca"; +"Stop Scanning" = "Ferma Ricerca"; +"Share App Link" = "Condividi Link App"; +"Scan for devices" = "Cerca dispositivi"; +"Open Settings" = "Apri Impostazioni"; +"Disconnect" = "Disconnetti"; +"You need at least 2 devices running Remote Shutter" = "Servono almeno 2 dispositivi con Remote Shutter"; +"Scan the QR code on another device to download Remote Shutter" = "Scansiona il codice QR su un altro dispositivo per scaricare Remote Shutter"; +"SCANNING ERROR - CHECK NETWORK SETTINGS" = "ERRORE DI SCANSIONE - CONTROLLA IMPOSTAZIONI DI RETE"; +"TAP THE BUTTON TO GET STARTED" = "TOCCA IL PULSANTE PER INIZIARE"; + +/* Settings */ +"About" = "Informazioni"; +"Back" = "Indietro"; +"Contact Support" = "Contatta Supporto"; +"Discord Community" = "Comunità Discord"; +"In-App Purchases" = "Acquisti In-App"; +"Purchased" = "Acquistato"; +"Send Media to Remote" = "Invia Media al Telecomando"; +"Source Code" = "Codice Sorgente"; +"Version" = "Versione"; + +/* Camera/Monitor Status */ +"Taking photo" = "Scatto in corso"; +"Taking picture" = "Scatto in corso"; +"Starting video" = "Avvio video"; +"Stopping video" = "Arresto video"; +"Recording shorts" = "Registrazione shorts"; +"Unable to save video" = "Impossibile salvare il video"; +"Unable to save video to Photos app" = "Impossibile salvare il video nell'app Foto"; +"Purchases restored successfully." = "Acquisti ripristinati con successo."; +"Pick a role: Camera or Remote" = "Scegli un ruolo: Fotocamera o Telecomando"; \ No newline at end of file diff --git a/RemoteCam/ja.lproj/Localizable.strings b/RemoteCam/ja.lproj/Localizable.strings index 3e99d87..914c204 100644 --- a/RemoteCam/ja.lproj/Localizable.strings +++ b/RemoteCam/ja.lproj/Localizable.strings @@ -280,3 +280,38 @@ "Error" = "エラー"; "Connection error" = "接続エラー"; "Unable to start recording" = "録画を開始できません"; + +/* Scanner UI */ +"Connect" = "接続"; +"Connecting..." = "接続中..."; +"Start Scanning" = "スキャン開始"; +"Stop Scanning" = "スキャン停止"; +"Share App Link" = "アプリリンクを共有"; +"Scan for devices" = "デバイスを検索"; +"Open Settings" = "設定を開く"; +"You need at least 2 devices running Remote Shutter" = "Remote Shutterがインストールされたデバイスが2台以上必要です"; +"Scan the QR code on another device to download Remote Shutter" = "別のデバイスでQRコードをスキャンしてRemote Shutterをダウンロード"; +"SCANNING ERROR - CHECK NETWORK SETTINGS" = "スキャンエラー - ネットワーク設定を確認"; +"TAP THE BUTTON TO GET STARTED" = "ボタンをタップして開始"; + +/* Settings */ +"About" = "情報"; +"Back" = "戻る"; +"Contact Support" = "サポートに連絡"; +"Discord Community" = "Discordコミュニティ"; +"In-App Purchases" = "アプリ内課金"; +"Purchased" = "購入済み"; +"Send Media to Remote" = "メディアをリモートに送信"; +"Source Code" = "ソースコード"; +"Version" = "バージョン"; + +/* Camera/Monitor Status */ +"Taking photo" = "撮影中"; +"Taking picture" = "撮影中"; +"Starting video" = "ビデオ開始"; +"Stopping video" = "ビデオ停止"; +"Recording shorts" = "ショート録画中"; +"Unable to save video" = "ビデオを保存できません"; +"Unable to save video to Photos app" = "写真アプリにビデオを保存できません"; +"Purchases restored successfully." = "購入が正常に復元されました。"; +"Pick a role: Camera or Remote" = "役割を選択:カメラまたはリモート"; diff --git a/RemoteCam/ko.lproj/Localizable.strings b/RemoteCam/ko.lproj/Localizable.strings index fd3febd..7727762 100644 --- a/RemoteCam/ko.lproj/Localizable.strings +++ b/RemoteCam/ko.lproj/Localizable.strings @@ -280,3 +280,38 @@ "Error" = "오류"; "Connection error" = "연결 오류"; "Unable to start recording" = "녹화를 시작할 수 없습니다"; + +/* Scanner UI */ +"Connect" = "연결"; +"Connecting..." = "연결 중..."; +"Start Scanning" = "검색 시작"; +"Stop Scanning" = "검색 중지"; +"Share App Link" = "앱 링크 공유"; +"Scan for devices" = "기기 검색"; +"Open Settings" = "설정 열기"; +"You need at least 2 devices running Remote Shutter" = "Remote Shutter가 설치된 기기가 2대 이상 필요합니다"; +"Scan the QR code on another device to download Remote Shutter" = "다른 기기에서 QR 코드를 스캔하여 Remote Shutter를 다운로드하세요"; +"SCANNING ERROR - CHECK NETWORK SETTINGS" = "검색 오류 - 네트워크 설정 확인"; +"TAP THE BUTTON TO GET STARTED" = "버튼을 눌러 시작하세요"; + +/* Settings */ +"About" = "정보"; +"Back" = "뒤로"; +"Contact Support" = "지원 문의"; +"Discord Community" = "Discord 커뮤니티"; +"In-App Purchases" = "인앱 구매"; +"Purchased" = "구매 완료"; +"Send Media to Remote" = "리모트로 미디어 전송"; +"Source Code" = "소스 코드"; +"Version" = "버전"; + +/* Camera/Monitor Status */ +"Taking photo" = "사진 촬영 중"; +"Taking picture" = "사진 촬영 중"; +"Starting video" = "동영상 시작"; +"Stopping video" = "동영상 중지"; +"Recording shorts" = "쇼츠 녹화 중"; +"Unable to save video" = "동영상을 저장할 수 없습니다"; +"Unable to save video to Photos app" = "사진 앱에 동영상을 저장할 수 없습니다"; +"Purchases restored successfully." = "구매가 성공적으로 복원되었습니다."; +"Pick a role: Camera or Remote" = "역할 선택: 카메라 또는 리모트"; diff --git a/RemoteCam/pt-BR.lproj/Localizable.strings b/RemoteCam/pt-BR.lproj/Localizable.strings index bebd232..e0f7436 100644 --- a/RemoteCam/pt-BR.lproj/Localizable.strings +++ b/RemoteCam/pt-BR.lproj/Localizable.strings @@ -280,3 +280,38 @@ "Error" = "Erro"; "Connection error" = "Erro de conexão"; "Unable to start recording" = "Não é possível iniciar a gravação"; + +/* Scanner UI */ +"Connect" = "Conectar"; +"Connecting..." = "Conectando..."; +"Start Scanning" = "Iniciar Busca"; +"Stop Scanning" = "Parar Busca"; +"Share App Link" = "Compartilhar Link"; +"Scan for devices" = "Buscar dispositivos"; +"Open Settings" = "Abrir Ajustes"; +"You need at least 2 devices running Remote Shutter" = "Você precisa de pelo menos 2 dispositivos com Remote Shutter"; +"Scan the QR code on another device to download Remote Shutter" = "Escaneie o código QR em outro dispositivo para baixar o Remote Shutter"; +"SCANNING ERROR - CHECK NETWORK SETTINGS" = "ERRO DE BUSCA - VERIFIQUE AS CONFIGURAÇÕES DE REDE"; +"TAP THE BUTTON TO GET STARTED" = "TOQUE NO BOTÃO PARA COMEÇAR"; + +/* Settings */ +"About" = "Sobre"; +"Back" = "Voltar"; +"Contact Support" = "Contatar Suporte"; +"Discord Community" = "Comunidade Discord"; +"In-App Purchases" = "Compras no App"; +"Purchased" = "Comprado"; +"Send Media to Remote" = "Enviar Mídia ao Remoto"; +"Source Code" = "Código Fonte"; +"Version" = "Versão"; + +/* Camera/Monitor Status */ +"Taking photo" = "Tirando foto"; +"Taking picture" = "Tirando foto"; +"Starting video" = "Iniciando vídeo"; +"Stopping video" = "Parando vídeo"; +"Recording shorts" = "Gravando shorts"; +"Unable to save video" = "Não é possível salvar o vídeo"; +"Unable to save video to Photos app" = "Não é possível salvar o vídeo no app Fotos"; +"Purchases restored successfully." = "Compras restauradas com sucesso."; +"Pick a role: Camera or Remote" = "Escolha um papel: Câmera ou Remoto"; diff --git a/RemoteCam/zh-Hans.lproj/Localizable.strings b/RemoteCam/zh-Hans.lproj/Localizable.strings index c873660..309952b 100644 --- a/RemoteCam/zh-Hans.lproj/Localizable.strings +++ b/RemoteCam/zh-Hans.lproj/Localizable.strings @@ -280,3 +280,38 @@ "Error" = "错误"; "Connection error" = "连接错误"; "Unable to start recording" = "无法开始录制"; + +/* Scanner UI */ +"Connect" = "连接"; +"Connecting..." = "连接中..."; +"Start Scanning" = "开始搜索"; +"Stop Scanning" = "停止搜索"; +"Share App Link" = "分享应用链接"; +"Scan for devices" = "搜索设备"; +"Open Settings" = "打开设置"; +"You need at least 2 devices running Remote Shutter" = "需要至少2台安装了Remote Shutter的设备"; +"Scan the QR code on another device to download Remote Shutter" = "在另一台设备上扫描二维码以下载Remote Shutter"; +"SCANNING ERROR - CHECK NETWORK SETTINGS" = "搜索错误 - 请检查网络设置"; +"TAP THE BUTTON TO GET STARTED" = "点击按钮开始"; + +/* Settings */ +"About" = "关于"; +"Back" = "返回"; +"Contact Support" = "联系支持"; +"Discord Community" = "Discord 社区"; +"In-App Purchases" = "应用内购买"; +"Purchased" = "已购买"; +"Send Media to Remote" = "发送媒体到遥控器"; +"Source Code" = "源代码"; +"Version" = "版本"; + +/* Camera/Monitor Status */ +"Taking photo" = "正在拍照"; +"Taking picture" = "正在拍照"; +"Starting video" = "开始录像"; +"Stopping video" = "停止录像"; +"Recording shorts" = "录制短视频"; +"Unable to save video" = "无法保存视频"; +"Unable to save video to Photos app" = "无法将视频保存到照片应用"; +"Purchases restored successfully." = "购买已成功恢复。"; +"Pick a role: Camera or Remote" = "选择角色:相机或遥控"; From cc5bd5b6f9830aed534c319a2917b0f6d7ed08d9 Mon Sep 17 00:00:00 2001 From: Dario Lencina Date: Sat, 21 Mar 2026 01:10:21 -0700 Subject: [PATCH 7/8] add translations --- RemoteShutter.xcodeproj/project.pbxproj | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/RemoteShutter.xcodeproj/project.pbxproj b/RemoteShutter.xcodeproj/project.pbxproj index 971b9d5..771548c 100644 --- a/RemoteShutter.xcodeproj/project.pbxproj +++ b/RemoteShutter.xcodeproj/project.pbxproj @@ -201,6 +201,11 @@ 06503C572E2CDBA7003DEAFA /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/Localizable.strings"; sourceTree = ""; }; 06503C582E2CDBAE003DEAFA /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; }; 06503C592E2CDBB9003DEAFA /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; + 06503C5A2E2CDBC0003DEAFA /* de-DE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "de-DE"; path = "de-DE.lproj/Localizable.strings"; sourceTree = ""; }; + 06503C5B2E2CDBC1003DEAFA /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; + 06503C5C2E2CDBC2003DEAFA /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; }; + 06503C5D2E2CDBC3003DEAFA /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; }; + 06503C5E2E2CDBC4003DEAFA /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; 065DE66B253A43BA0022193C /* AppTrackingTransparency.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppTrackingTransparency.framework; path = System/Library/Frameworks/AppTrackingTransparency.framework; sourceTree = SDKROOT; }; 066427741BE924DD003EDD41 /* EnumExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnumExtensions.swift; sourceTree = ""; }; 066959602575F00200E8B579 /* WelcomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeViewController.swift; sourceTree = ""; }; @@ -716,6 +721,11 @@ "es-MX", da, it, + "de-DE", + ja, + ko, + "pt-BR", + "zh-Hans", ); mainGroup = 06E1D4E91BB7699700E07321; productRefGroup = 06E1D4E91BB7699700E07321; @@ -1017,6 +1027,11 @@ 06503C572E2CDBA7003DEAFA /* es-MX */, 06503C582E2CDBAE003DEAFA /* da */, 06503C592E2CDBB9003DEAFA /* it */, + 06503C5A2E2CDBC0003DEAFA /* de-DE */, + 06503C5B2E2CDBC1003DEAFA /* ja */, + 06503C5C2E2CDBC2003DEAFA /* ko */, + 06503C5D2E2CDBC3003DEAFA /* pt-BR */, + 06503C5E2E2CDBC4003DEAFA /* zh-Hans */, ); name = Localizable.strings; sourceTree = ""; From 5c2ebe086acd057fdf80d1bf7337a04ff4d0b48d Mon Sep 17 00:00:00 2001 From: Dario Lencina Date: Sat, 21 Mar 2026 01:14:57 -0700 Subject: [PATCH 8/8] save --- RemoteCam/SettingsViewModel.swift | 8 ++++---- RemoteCam/WelcomeViewModel.swift | 8 ++++---- RemoteCam/da.lproj/Localizable.strings | 8 +++++++- RemoteCam/de-DE.lproj/Localizable.strings | 6 ++++++ RemoteCam/en.lproj/Localizable.strings | 6 ++++++ RemoteCam/es-MX.lproj/Localizable.strings | 8 +++++++- RemoteCam/fr-FR.lproj/Localizable.strings | 8 +++++++- RemoteCam/it.lproj/Localizable.strings | 8 +++++++- RemoteCam/ja.lproj/Localizable.strings | 6 ++++++ RemoteCam/ko.lproj/Localizable.strings | 6 ++++++ RemoteCam/pt-BR.lproj/Localizable.strings | 6 ++++++ RemoteCam/zh-Hans.lproj/Localizable.strings | 6 ++++++ 12 files changed, 72 insertions(+), 12 deletions(-) diff --git a/RemoteCam/SettingsViewModel.swift b/RemoteCam/SettingsViewModel.swift index e443558..9a9eb56 100644 --- a/RemoteCam/SettingsViewModel.swift +++ b/RemoteCam/SettingsViewModel.swift @@ -15,10 +15,10 @@ final class SettingsViewModel: ObservableObject, PurchaseManaging { var isPurchased: Bool } - @Published var proMode = PurchaseItem(id: enableVideoPID, title: "Pro: All Features", price: "", isPurchased: false) - @Published var removeAds = PurchaseItem(id: disableAdsPID, title: "Remove Ads", price: "", isPurchased: false) - @Published var enableTorch = PurchaseItem(id: enableTorchPID, title: "Enable Torch", price: "", isPurchased: false) - @Published var enableVideo = PurchaseItem(id: enableVideoOnlyPID, title: "Enable Video", price: "", isPurchased: false) + @Published var proMode = PurchaseItem(id: enableVideoPID, title: NSLocalizedString("Pro: All Features", comment: ""), price: "", isPurchased: false) + @Published var removeAds = PurchaseItem(id: disableAdsPID, title: NSLocalizedString("Remove Ads", comment: ""), price: "", isPurchased: false) + @Published var enableTorch = PurchaseItem(id: enableTorchPID, title: NSLocalizedString("Enable Torch", comment: ""), price: "", isPurchased: false) + @Published var enableVideo = PurchaseItem(id: enableVideoOnlyPID, title: NSLocalizedString("Enable Video", comment: ""), price: "", isPurchased: false) @Published var isRestoringPurchases = false @Published var isPurchasing = false diff --git a/RemoteCam/WelcomeViewModel.swift b/RemoteCam/WelcomeViewModel.swift index a36c865..dbeff78 100644 --- a/RemoteCam/WelcomeViewModel.swift +++ b/RemoteCam/WelcomeViewModel.swift @@ -94,13 +94,13 @@ final class WelcomeViewModel: ObservableObject, PurchaseManaging { private func buildUpgradeItems() { let store = StoreManager.shared upgrades = [ - UpgradeItem(id: enableVideoPID, title: "Pro: All Features", price: "", + UpgradeItem(id: enableVideoPID, title: NSLocalizedString("Pro: All Features", comment: ""), price: "", isPurchased: store.hasProMode(), icon: "star.fill", tint: "purple"), - UpgradeItem(id: disableAdsPID, title: "Remove Ads", price: "", + UpgradeItem(id: disableAdsPID, title: NSLocalizedString("Remove Ads", comment: ""), price: "", isPurchased: store.hasAdRemovalFeature(), icon: "eye.slash.fill", tint: "blue"), - UpgradeItem(id: enableTorchPID, title: "Enable Torch", price: "", + UpgradeItem(id: enableTorchPID, title: NSLocalizedString("Enable Torch", comment: ""), price: "", isPurchased: store.hasTorchFeature(), icon: "flashlight.on.fill", tint: "orange"), - UpgradeItem(id: enableVideoOnlyPID, title: "Enable Video", price: "", + UpgradeItem(id: enableVideoOnlyPID, title: NSLocalizedString("Enable Video", comment: ""), price: "", isPurchased: store.hasVideoRecordingFeature(), icon: "video.fill", tint: "red"), ] updateFeatureFlags() diff --git a/RemoteCam/da.lproj/Localizable.strings b/RemoteCam/da.lproj/Localizable.strings index 9617492..0ade20d 100644 --- a/RemoteCam/da.lproj/Localizable.strings +++ b/RemoteCam/da.lproj/Localizable.strings @@ -194,4 +194,10 @@ "Unable to save video" = "Kan ikke gemme video"; "Unable to save video to Photos app" = "Kan ikke gemme video i Fotos-appen"; "Purchases restored successfully." = "Køb gendannet med succes."; -"Pick a role: Camera or Remote" = "Vælg en rolle: Kamera eller Fjernbetjening"; \ No newline at end of file +"Pick a role: Camera or Remote" = "Vælg en rolle: Kamera eller Fjernbetjening"; + +/* Purchase Fallback Titles */ +"Pro: All Features" = "Pro: Alle Funktioner"; +"Remove Ads" = "Fjern Reklamer"; +"Enable Torch" = "Aktiver Lommelygte"; +"Enable Video" = "Aktiver Video"; \ No newline at end of file diff --git a/RemoteCam/de-DE.lproj/Localizable.strings b/RemoteCam/de-DE.lproj/Localizable.strings index 7c99370..3908689 100644 --- a/RemoteCam/de-DE.lproj/Localizable.strings +++ b/RemoteCam/de-DE.lproj/Localizable.strings @@ -315,3 +315,9 @@ "Unable to save video to Photos app" = "Video kann nicht in der Fotos-App gespeichert werden"; "Purchases restored successfully." = "Käufe erfolgreich wiederhergestellt."; "Pick a role: Camera or Remote" = "Rolle wählen: Kamera oder Fernbedienung"; + +/* Purchase Fallback Titles */ +"Pro: All Features" = "Pro: Alle Funktionen"; +"Remove Ads" = "Werbung entfernen"; +"Enable Torch" = "Taschenlampe aktivieren"; +"Enable Video" = "Video aktivieren"; diff --git a/RemoteCam/en.lproj/Localizable.strings b/RemoteCam/en.lproj/Localizable.strings index 7bf880c..5d6eefa 100644 --- a/RemoteCam/en.lproj/Localizable.strings +++ b/RemoteCam/en.lproj/Localizable.strings @@ -315,3 +315,9 @@ "Unable to save video to Photos app" = "Unable to save video to Photos app"; "Purchases restored successfully." = "Purchases restored successfully."; "Pick a role: Camera or Remote" = "Pick a role: Camera or Remote"; + +/* Purchase Fallback Titles */ +"Pro: All Features" = "Pro: All Features"; +"Remove Ads" = "Remove Ads"; +"Enable Torch" = "Enable Torch"; +"Enable Video" = "Enable Video"; diff --git a/RemoteCam/es-MX.lproj/Localizable.strings b/RemoteCam/es-MX.lproj/Localizable.strings index 86c16de..86879f9 100644 --- a/RemoteCam/es-MX.lproj/Localizable.strings +++ b/RemoteCam/es-MX.lproj/Localizable.strings @@ -210,4 +210,10 @@ "Unable to save video" = "No se puede guardar el video"; "Unable to save video to Photos app" = "No se puede guardar el video en la app Fotos"; "Purchases restored successfully." = "Compras restauradas con éxito."; -"Pick a role: Camera or Remote" = "Elige un rol: Cámara o Remoto"; \ No newline at end of file +"Pick a role: Camera or Remote" = "Elige un rol: Cámara o Remoto"; + +/* Purchase Fallback Titles */ +"Pro: All Features" = "Pro: Todas las Funciones"; +"Remove Ads" = "Eliminar Anuncios"; +"Enable Torch" = "Activar Linterna"; +"Enable Video" = "Activar Video"; \ No newline at end of file diff --git a/RemoteCam/fr-FR.lproj/Localizable.strings b/RemoteCam/fr-FR.lproj/Localizable.strings index c46b09c..6d339e4 100644 --- a/RemoteCam/fr-FR.lproj/Localizable.strings +++ b/RemoteCam/fr-FR.lproj/Localizable.strings @@ -210,4 +210,10 @@ "Unable to save video" = "Impossible de sauvegarder la vidéo"; "Unable to save video to Photos app" = "Impossible de sauvegarder la vidéo dans Photos"; "Purchases restored successfully." = "Achats restaurés avec succès."; -"Pick a role: Camera or Remote" = "Choisissez un rôle : Appareil Photo ou Télécommande"; \ No newline at end of file +"Pick a role: Camera or Remote" = "Choisissez un rôle : Appareil Photo ou Télécommande"; + +/* Purchase Fallback Titles */ +"Pro: All Features" = "Pro : Toutes les Fonctionnalités"; +"Remove Ads" = "Supprimer les Publicités"; +"Enable Torch" = "Activer la Torche"; +"Enable Video" = "Activer la Vidéo"; \ No newline at end of file diff --git a/RemoteCam/it.lproj/Localizable.strings b/RemoteCam/it.lproj/Localizable.strings index 21b8f52..c3adeb5 100644 --- a/RemoteCam/it.lproj/Localizable.strings +++ b/RemoteCam/it.lproj/Localizable.strings @@ -194,4 +194,10 @@ "Unable to save video" = "Impossibile salvare il video"; "Unable to save video to Photos app" = "Impossibile salvare il video nell'app Foto"; "Purchases restored successfully." = "Acquisti ripristinati con successo."; -"Pick a role: Camera or Remote" = "Scegli un ruolo: Fotocamera o Telecomando"; \ No newline at end of file +"Pick a role: Camera or Remote" = "Scegli un ruolo: Fotocamera o Telecomando"; + +/* Purchase Fallback Titles */ +"Pro: All Features" = "Pro: Tutte le Funzionalità"; +"Remove Ads" = "Rimuovi Pubblicità"; +"Enable Torch" = "Attiva Torcia"; +"Enable Video" = "Attiva Video"; \ No newline at end of file diff --git a/RemoteCam/ja.lproj/Localizable.strings b/RemoteCam/ja.lproj/Localizable.strings index 914c204..de3c179 100644 --- a/RemoteCam/ja.lproj/Localizable.strings +++ b/RemoteCam/ja.lproj/Localizable.strings @@ -315,3 +315,9 @@ "Unable to save video to Photos app" = "写真アプリにビデオを保存できません"; "Purchases restored successfully." = "購入が正常に復元されました。"; "Pick a role: Camera or Remote" = "役割を選択:カメラまたはリモート"; + +/* Purchase Fallback Titles */ +"Pro: All Features" = "Pro:全機能"; +"Remove Ads" = "広告を削除"; +"Enable Torch" = "ライトを有効化"; +"Enable Video" = "ビデオを有効化"; diff --git a/RemoteCam/ko.lproj/Localizable.strings b/RemoteCam/ko.lproj/Localizable.strings index 7727762..9111bd3 100644 --- a/RemoteCam/ko.lproj/Localizable.strings +++ b/RemoteCam/ko.lproj/Localizable.strings @@ -315,3 +315,9 @@ "Unable to save video to Photos app" = "사진 앱에 동영상을 저장할 수 없습니다"; "Purchases restored successfully." = "구매가 성공적으로 복원되었습니다."; "Pick a role: Camera or Remote" = "역할 선택: 카메라 또는 리모트"; + +/* Purchase Fallback Titles */ +"Pro: All Features" = "Pro: 모든 기능"; +"Remove Ads" = "광고 제거"; +"Enable Torch" = "손전등 활성화"; +"Enable Video" = "동영상 활성화"; diff --git a/RemoteCam/pt-BR.lproj/Localizable.strings b/RemoteCam/pt-BR.lproj/Localizable.strings index e0f7436..e8983a4 100644 --- a/RemoteCam/pt-BR.lproj/Localizable.strings +++ b/RemoteCam/pt-BR.lproj/Localizable.strings @@ -315,3 +315,9 @@ "Unable to save video to Photos app" = "Não é possível salvar o vídeo no app Fotos"; "Purchases restored successfully." = "Compras restauradas com sucesso."; "Pick a role: Camera or Remote" = "Escolha um papel: Câmera ou Remoto"; + +/* Purchase Fallback Titles */ +"Pro: All Features" = "Pro: Todos os Recursos"; +"Remove Ads" = "Remover Anúncios"; +"Enable Torch" = "Ativar Lanterna"; +"Enable Video" = "Ativar Vídeo"; diff --git a/RemoteCam/zh-Hans.lproj/Localizable.strings b/RemoteCam/zh-Hans.lproj/Localizable.strings index 309952b..b6fc034 100644 --- a/RemoteCam/zh-Hans.lproj/Localizable.strings +++ b/RemoteCam/zh-Hans.lproj/Localizable.strings @@ -315,3 +315,9 @@ "Unable to save video to Photos app" = "无法将视频保存到照片应用"; "Purchases restored successfully." = "购买已成功恢复。"; "Pick a role: Camera or Remote" = "选择角色:相机或遥控"; + +/* Purchase Fallback Titles */ +"Pro: All Features" = "Pro:全部功能"; +"Remove Ads" = "移除广告"; +"Enable Torch" = "启用手电筒"; +"Enable Video" = "启用视频";