diff --git a/.github/workflows/build-for-testflight.yml b/.github/workflows/build-for-testflight.yml index e7930320c..b6783e360 100644 --- a/.github/workflows/build-for-testflight.yml +++ b/.github/workflows/build-for-testflight.yml @@ -1,26 +1,61 @@ name: "build and submit to testflight" on: - push: - branches: [ "main" ] - paths: - - 'apps/ios/**' - - '.github/workflows/build-for-testflight.yml' + workflow_run: + workflows: + - "ios-tests" + types: + - completed + branches: + - main workflow_dispatch: +permissions: + contents: write jobs: - build: - runs-on: macos-13 + build-and-upload: + if: ${{ github.event_name != 'workflow_run' || github.event.workflow_run.conclusion == 'success' }} + runs-on: macos-14 + environment: Production + steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Setup ssh agent and deploy key(s) - uses: webfactory/ssh-agent@v0.8.0 - with: - ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} - - name: Install gems - working-directory: apps/ios - run: bundle install - - name: setup and build with fastlane - working-directory: apps/ios - env: - MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} - run: bundle exec fastlane beta + # Check out code with push permissions (needed for commit) + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + persist-credentials: true + + - name: Bump build number + run: | + cd apps/ios + agvtool bump + + # Commit and push the version change (avoid loop with [skip ci]) + - name: Commit bump + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add -A + git commit -m "chore(ci): bump build number [skip ci]" || echo "Nothing to commit" + git push + + # 4 Select the latest stable Xcode version + - uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: "latest-stable" + + # install the developer certificate in the signing_temp keychain + - name: install certificate + id: install-certificates + uses: apple-actions/import-codesign-certs@v3 + with: + p12-file-base64: ${{ secrets.APPSTORE_CERTIFICATES_FILE_BASE64 }} + p12-password: ${{ secrets.APPSTORE_CERTIFICATES_PASSWORD }} + + - name: build and upload to testflight + env: + APPSTORE_CONNECT_API_KEY: ${{ secrets.APP_STORE_P8_BASE64 }} + APPSTORE_CONNECT_ISSUER_ID: ${{ secrets.APP_STORE_ISSUER_ID }} + APPSTORE_CONNECT_KEY_ID: ${{ secrets.APP_STORE_KEY_ID }} + KEYCHAIN_PASSWORD: ${{ steps.install-certificates.outputs.keychain-password }} + run: "apps/ios/Scripts/ci/archive-upload.sh | xcpretty && exit ${PIPESTATUS[0]}" diff --git a/.github/workflows/ios-tests.yml b/.github/workflows/ios-tests.yml index 224e5f51c..b4c9c55f6 100644 --- a/.github/workflows/ios-tests.yml +++ b/.github/workflows/ios-tests.yml @@ -12,6 +12,9 @@ on: paths: - 'apps/ios/**' workflow_dispatch: +concurrency: + group: ${{ github.ref }} + cancel-in-progress: true jobs: unit-tests: runs-on: macos-14 @@ -24,6 +27,10 @@ jobs: sudo xcode-select -s "${xcode_path}/Contents/Developer" xcodebuild -version gem install xcpretty + - name: Run LocalizationLinter + working-directory: apps/ios + run: | + swift Scripts/LocalizationLinter/main.swift - name: Build run: > xcodebuild build-for-testing -workspace apps/ios/GuideDogs.xcworkspace diff --git a/apps/ios/GuideDogs.xcodeproj/project.pbxproj b/apps/ios/GuideDogs.xcodeproj/project.pbxproj index 227531481..d58972411 100644 --- a/apps/ios/GuideDogs.xcodeproj/project.pbxproj +++ b/apps/ios/GuideDogs.xcodeproj/project.pbxproj @@ -103,8 +103,6 @@ 285C8B83230496D900E466DF /* GlyphCallout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285C8B82230496D900E466DF /* GlyphCallout.swift */; }; 286145EB2625099F000E5525 /* SDWebImage in Frameworks */ = {isa = PBXBuildFile; productRef = 286145EA2625099F000E5525 /* SDWebImage */; }; 2866A7C12625013400EBA2D8 /* DZNEmptyDataSet in Frameworks */ = {isa = PBXBuildFile; productRef = 2866A7C02625013400EBA2D8 /* DZNEmptyDataSet */; }; - 2866A7C72625020600EBA2D8 /* AppCenterAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = 2866A7C62625020600EBA2D8 /* AppCenterAnalytics */; }; - 2866A7C92625020600EBA2D8 /* AppCenterCrashes in Frameworks */ = {isa = PBXBuildFile; productRef = 2866A7C82625020600EBA2D8 /* AppCenterCrashes */; }; 2866A7CF2625028600EBA2D8 /* Reachability in Frameworks */ = {isa = PBXBuildFile; productRef = 2866A7CE2625028600EBA2D8 /* Reachability */; }; 2866A7D5262502D500EBA2D8 /* CocoaLumberjackSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 2866A7D4262502D500EBA2D8 /* CocoaLumberjackSwift */; }; 286708D125005912002F962B /* street_non_1c.wav in Resources */ = {isa = PBXBuildFile; fileRef = 286708D025005912002F962B /* street_non_1c.wav */; }; @@ -291,7 +289,6 @@ 28E60D461FE490D900EAB5C0 /* POICallout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28E60D451FE490D900EAB5C0 /* POICallout.swift */; }; 28E60D551FE9816500EAB5C0 /* POI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28E60D541FE9816500EAB5C0 /* POI.swift */; }; 28E60D5A1FE99BBE00EAB5C0 /* RealmMigrationTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28E60D591FE99BBE00EAB5C0 /* RealmMigrationTools.swift */; }; - 28EB441426B4A16700D5BBE4 /* DeleteModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EB441326B4A16700D5BBE4 /* DeleteModifier.swift */; }; 28EB9C75237CBA3A0064E7EF /* ExperimentConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EB9C74237CBA3A0064E7EF /* ExperimentConfiguration.swift */; }; 28EB9C79237CC7D90064E7EF /* ExperimentServiceModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EB9C78237CC7D90064E7EF /* ExperimentServiceModel.swift */; }; 28F0F9251F85A39D00B6A64F /* DestinationTutorialIntroViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28F0F9241F85A39C00B6A64F /* DestinationTutorialIntroViewController.swift */; }; @@ -570,7 +567,6 @@ B9533FF924B4DB2400605B07 /* IntersectionFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9533FF824B4DB2400605B07 /* IntersectionFinder.swift */; }; B9533FFB24B4DCC100605B07 /* IntersectionSearchResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9533FFA24B4DCC100605B07 /* IntersectionSearchResult.swift */; }; B954678A24EB2B02006866EF /* SecondaryRoadsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = B954678924EB2B02006866EF /* SecondaryRoadsContext.swift */; }; - B962DD792914E39A00CED854 /* GDAStateMachine.m in Sources */ = {isa = PBXBuildFile; fileRef = B962DD772914E39900CED854 /* GDAStateMachine.m */; }; B96755A3251D21AF00B366F6 /* TintedImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B96755A2251D21AF00B366F6 /* TintedImageView.swift */; }; B97140DA204835BC00B15BD0 /* Roundabout.swift in Sources */ = {isa = PBXBuildFile; fileRef = B97140D9204835BB00B15BD0 /* Roundabout.swift */; }; B97140DE2048896800B15BD0 /* RoadDirection.swift in Sources */ = {isa = PBXBuildFile; fileRef = B97140DD2048896800B15BD0 /* RoadDirection.swift */; }; @@ -1063,7 +1059,6 @@ 28E60D451FE490D900EAB5C0 /* POICallout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = POICallout.swift; sourceTree = ""; }; 28E60D541FE9816500EAB5C0 /* POI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = POI.swift; path = Code/Data/Models/Protocols/POI.swift; sourceTree = ""; }; 28E60D591FE99BBE00EAB5C0 /* RealmMigrationTools.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = RealmMigrationTools.swift; path = Code/Data/Models/Helpers/RealmMigrationTools.swift; sourceTree = ""; }; - 28EB441326B4A16700D5BBE4 /* DeleteModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteModifier.swift; sourceTree = ""; }; 28EB9C74237CBA3A0064E7EF /* ExperimentConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ExperimentConfiguration.swift; path = "Code/App/Feature Flags/Experiment Flighting/ExperimentConfiguration.swift"; sourceTree = ""; }; 28EB9C78237CC7D90064E7EF /* ExperimentServiceModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ExperimentServiceModel.swift; path = "Code/App/Feature Flags/Experiment Flighting/ExperimentServiceModel.swift"; sourceTree = ""; }; 28F0F9241F85A39C00B6A64F /* DestinationTutorialIntroViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DestinationTutorialIntroViewController.swift; path = "Code/Visual UI/View Controllers/Tutorials/Destination/DestinationTutorialIntroViewController.swift"; sourceTree = ""; }; @@ -1136,6 +1131,8 @@ 31F12C4122569E9100BDA072 /* StreetSuffixAbbreviations_fr.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = StreetSuffixAbbreviations_fr.plist; path = Assets/PropertyLists/StreetSuffixAbbreviations_fr.plist; sourceTree = ""; }; 31F1370322B867B800FC1860 /* GeolocationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = GeolocationManager.swift; path = "Code/Sensors/Geolocation/Geolocation Manager/GeolocationManager.swift"; sourceTree = ""; }; 31FE6C77233A7B760098D8C5 /* TelemetryHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = TelemetryHelper.swift; path = Code/App/Logging/TelemetryHelper.swift; sourceTree = ""; }; + 3247AF49E74F47A3BC0C066E /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; + 4BB00625C9264FD5ACF0ED5F /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; 5684808F1CBC975E004B4227 /* Soundscape-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = "Soundscape-Bridging-Header.h"; path = "Code/App/Soundscape-Bridging-Header.h"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 568480901CBC9C94004B4227 /* HomeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = HomeViewController.swift; path = "Code/Visual UI/View Controllers/Home/HomeViewController.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 568480921CBC9CEE004B4227 /* SettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = SettingsViewController.swift; path = "Code/Visual UI/View Controllers/Settings/SettingsViewController.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; @@ -1367,9 +1364,6 @@ B954678924EB2B02006866EF /* SecondaryRoadsContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SecondaryRoadsContext.swift; path = "Code/Data/Spatial Data/SecondaryRoadsContext.swift"; sourceTree = ""; }; B9546B211E54AB36002776D4 /* Soundscape.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = Soundscape.entitlements; path = Assets/PropertyLists/Soundscape.entitlements; sourceTree = ""; }; B958961125536F01005B1AE8 /* MixAudioSettingCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MixAudioSettingCell.swift; path = "Code/Visual UI/Controls/Settings/MixAudioSettingCell.swift"; sourceTree = ""; }; - B962DD732914E39900CED854 /* GDAStateMachine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GDAStateMachine.h; sourceTree = ""; }; - B962DD762914E39900CED854 /* GDAStateMachineDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GDAStateMachineDelegate.h; sourceTree = ""; }; - B962DD772914E39900CED854 /* GDAStateMachine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GDAStateMachine.m; sourceTree = ""; }; B96755A2251D21AF00B366F6 /* TintedImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = TintedImageView.swift; path = "Code/Visual UI/Controls/TintedImageView.swift"; sourceTree = ""; }; B97140D9204835BB00B15BD0 /* Roundabout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Roundabout.swift; path = Code/Data/Models/Helpers/Roundabout.swift; sourceTree = ""; }; B97140DD2048896800B15BD0 /* RoadDirection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = RoadDirection.swift; path = Code/Data/Models/Helpers/RoadDirection.swift; sourceTree = ""; }; @@ -1576,6 +1570,8 @@ D3D7CFC81B3D96470020B5E9 /* Soundscape.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Soundscape.app; sourceTree = BUILT_PRODUCTS_DIR; }; D3E2A6361CAD5CA100A5192A /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; DCAAD87E2BC1E95F0018D135 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = Assets/PropertyLists/PrivacyInfo.xcprivacy; sourceTree = ""; }; + DCE09DD62E54AC9500B66BDF /* fa-IR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "fa-IR"; path = "fa-IR.lproj/Localizable.strings"; sourceTree = ""; }; + DCE09DD72E54AE7400B66BDF /* fa-IR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "fa-IR"; path = "fa-IR.lproj/InfoPlist.strings"; sourceTree = ""; }; DCE4D2AC2D7CE40F00B5DA4B /* NewFeatures.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = NewFeatures.json; path = Assets/NewFeatures.json; sourceTree = ""; }; /* End PBXFileReference section */ @@ -1596,9 +1592,7 @@ buildActionMask = 2147483647; files = ( 283B0307264B03920092F74F /* SDWebImageSwiftUI in Frameworks */, - 2866A7C72625020600EBA2D8 /* AppCenterAnalytics in Frameworks */, 2866A7CF2625028600EBA2D8 /* Reachability in Frameworks */, - 2866A7C92625020600EBA2D8 /* AppCenterCrashes in Frameworks */, 286F409D2624FF6000C3F80B /* NVActivityIndicatorView in Frameworks */, 2866A7D5262502D500EBA2D8 /* CocoaLumberjackSwift in Frameworks */, 91172A732AD8D56D00E6E8E9 /* CoreGPX in Frameworks */, @@ -2030,7 +2024,6 @@ 286DC6AC21E6B5F9001CD88A /* Helpers */ = { isa = PBXGroup; children = ( - B962DD722914E39900CED854 /* GDAStateMachine */, 28F94F5D2485AE0A0010D2B3 /* BehaviorBase.swift */, 286DC6AA21E6857D001CD88A /* Events.swift */, 286DC6AD21E6B61B001CD88A /* Verbosity.swift */, @@ -3215,7 +3208,6 @@ 629F53E326CB28F400796B23 /* List */, 629F53BE26BDEDA200796B23 /* Text */, 624C96B62852983C001F84F8 /* Navigation */, - 28EB441326B4A16700D5BBE4 /* DeleteModifier.swift */, 288E5FE1269FA78400F7D4CD /* GeometryPreferenceReader.swift */, 288E5FDF269504D500F7D4CD /* ConditionalAccessibilityAction.swift */, ); @@ -3631,16 +3623,6 @@ path = "Code/Sensors/Geolocation/GPX Simulator"; sourceTree = ""; }; - B962DD722914E39900CED854 /* GDAStateMachine */ = { - isa = PBXGroup; - children = ( - B962DD732914E39900CED854 /* GDAStateMachine.h */, - B962DD772914E39900CED854 /* GDAStateMachine.m */, - B962DD762914E39900CED854 /* GDAStateMachineDelegate.h */, - ); - path = GDAStateMachine; - sourceTree = ""; - }; B998914920305A34000E2220 /* Motion */ = { isa = PBXGroup; children = ( @@ -4505,8 +4487,6 @@ packageProductDependencies = ( 286F409C2624FF6000C3F80B /* NVActivityIndicatorView */, 2866A7C02625013400EBA2D8 /* DZNEmptyDataSet */, - 2866A7C62625020600EBA2D8 /* AppCenterAnalytics */, - 2866A7C82625020600EBA2D8 /* AppCenterCrashes */, 2866A7CE2625028600EBA2D8 /* Reachability */, 2866A7D4262502D500EBA2D8 /* CocoaLumberjackSwift */, 28F1ECE1262505DC00E964C0 /* Realm */, @@ -4580,12 +4560,13 @@ "nb-NO", "nl-NL", "pt-PT", + "fa-IR", + ru, ); mainGroup = D3D7CFBF1B3D96460020B5E9; packageReferences = ( 286F409B2624FF6000C3F80B /* XCRemoteSwiftPackageReference "NVActivityIndicatorView" */, 2866A7BF2625013400EBA2D8 /* XCRemoteSwiftPackageReference "DZNEmptyDataSet" */, - 2866A7C52625020600EBA2D8 /* XCRemoteSwiftPackageReference "AppCenter-SDK-Apple" */, 2866A7CD2625028600EBA2D8 /* XCRemoteSwiftPackageReference "Reachability" */, 2866A7D3262502D500EBA2D8 /* XCRemoteSwiftPackageReference "CocoaLumberjack" */, 28F1ECE0262505DC00E964C0 /* XCRemoteSwiftPackageReference "realm-cocoa" */, @@ -5135,7 +5116,6 @@ C34333B0221E2C1800D9CECD /* TableViewHeaderFooterViewConfigurator.swift in Sources */, C30EF62320894AD400BEA785 /* VoiceTableViewCell.swift in Sources */, 626789B026F540CF0007E566 /* RouteDetailLocalizedLabel.swift in Sources */, - 28EB441426B4A16700D5BBE4 /* DeleteModifier.swift in Sources */, 622CAFA226AB815300F804D6 /* BeaconTitleContentView.swift in Sources */, B97791511E8ED1B100498320 /* UINavigationBar+Extentions.swift in Sources */, 623E0103244767BB0081CA5B /* MarkerParameters.swift in Sources */, @@ -5285,7 +5265,6 @@ 6A4891BB2A5E66DE0002D146 /* ExternalNavigationApps.swift in Sources */, 623E0104244767BB0081CA5B /* LocationParameters.swift in Sources */, 622AB2F6263767A8006BB729 /* MKMapViewDelegate+Extensions.swift in Sources */, - B962DD792914E39A00CED854 /* GDAStateMachine.m in Sources */, 6258B38A2469DB220051F60B /* UniversalLinkVersion.swift in Sources */, 628855462656F98B00EFFB91 /* Route+Realm.swift in Sources */, 62B3FE3225A8D5D300FCCA4B /* FeatureFlag.swift in Sources */, @@ -5427,6 +5406,8 @@ 62CFAC6528E3A7AA00BE504D /* nb-NO */, 62CFAC6628E3A7B300BE504D /* nl-NL */, 62CFAC6728E3A7BE00BE504D /* pt-PT */, + DCE09DD72E54AE7400B66BDF /* fa-IR */, + 3247AF49E74F47A3BC0C066E /* ru */, ); name = InfoPlist.strings; sourceTree = ""; @@ -5450,6 +5431,8 @@ 62CFAC6028E3A74500BE504D /* nb-NO */, 62CFAC6128E3A75200BE504D /* nl-NL */, 62CFAC6228E3A76D00BE504D /* pt-PT */, + DCE09DD62E54AC9500B66BDF /* fa-IR */, + 4BB00625C9264FD5ACF0ED5F /* ru */, ); name = Localizable.strings; sourceTree = ""; @@ -5553,7 +5536,7 @@ INFOPLIST_FILE = GuideDogs/Assets/PropertyLists/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Soundscape; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.navigation"; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -5562,7 +5545,7 @@ "$(inherited)", "$(PROJECT_DIR)/GuideDogs", ); - MARKETING_VERSION = 1.3.0; + MARKETING_VERSION = 1.8.1; OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "$(inherited) -DADHOC"; PRODUCT_BUNDLE_IDENTIFIER = "services.soundscape-adhoc"; @@ -5570,6 +5553,9 @@ PROVISIONING_PROFILE_SPECIFIER = ""; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OBJC_BRIDGING_HEADER = "GuideDogs/Code/App/Soundscape-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; @@ -5590,7 +5576,7 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 6; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = X4H33NKGKY; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -5626,7 +5612,7 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 6; DEVELOPMENT_TEAM = X4H33NKGKY; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -5658,7 +5644,7 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 6; DEVELOPMENT_TEAM = X4H33NKGKY; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -5843,7 +5829,7 @@ INFOPLIST_FILE = GuideDogs/Assets/PropertyLists/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Soundscape; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.navigation"; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -5852,7 +5838,7 @@ "$(inherited)", "$(PROJECT_DIR)/GuideDogs", ); - MARKETING_VERSION = 1.3.0; + MARKETING_VERSION = 1.8.1; OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "$(inherited) -DDEBUG"; PRODUCT_BUNDLE_IDENTIFIER = "services.soundscape-debug"; @@ -5860,6 +5846,9 @@ PROVISIONING_PROFILE_SPECIFIER = ""; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OBJC_BRIDGING_HEADER = "GuideDogs/Code/App/Soundscape-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -5901,7 +5890,7 @@ INFOPLIST_FILE = GuideDogs/Assets/PropertyLists/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Soundscape; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.navigation"; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -5910,7 +5899,7 @@ "$(inherited)", "$(PROJECT_DIR)/GuideDogs", ); - MARKETING_VERSION = 1.3.0; + MARKETING_VERSION = 1.8.1; OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "$(inherited) -DRELEASE"; PRODUCT_BUNDLE_IDENTIFIER = services.soundscape; @@ -5918,6 +5907,9 @@ PROVISIONING_PROFILE_SPECIFIER = ""; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OBJC_BRIDGING_HEADER = "GuideDogs/Code/App/Soundscape-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; @@ -5987,14 +5979,6 @@ revision = 9bffa69a83a9fa58a14b3cf43cb6dd8a63774179; }; }; - 2866A7C52625020600EBA2D8 /* XCRemoteSwiftPackageReference "AppCenter-SDK-Apple" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/Microsoft/AppCenter-SDK-Apple"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 4.4.3; - }; - }; 2866A7CD2625028600EBA2D8 /* XCRemoteSwiftPackageReference "Reachability" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/ashleymills/Reachability.swift"; @@ -6058,16 +6042,6 @@ package = 2866A7BF2625013400EBA2D8 /* XCRemoteSwiftPackageReference "DZNEmptyDataSet" */; productName = DZNEmptyDataSet; }; - 2866A7C62625020600EBA2D8 /* AppCenterAnalytics */ = { - isa = XCSwiftPackageProductDependency; - package = 2866A7C52625020600EBA2D8 /* XCRemoteSwiftPackageReference "AppCenter-SDK-Apple" */; - productName = AppCenterAnalytics; - }; - 2866A7C82625020600EBA2D8 /* AppCenterCrashes */ = { - isa = XCSwiftPackageProductDependency; - package = 2866A7C52625020600EBA2D8 /* XCRemoteSwiftPackageReference "AppCenter-SDK-Apple" */; - productName = AppCenterCrashes; - }; 2866A7CE2625028600EBA2D8 /* Reachability */ = { isa = XCSwiftPackageProductDependency; package = 2866A7CD2625028600EBA2D8 /* XCRemoteSwiftPackageReference "Reachability" */; diff --git a/apps/ios/GuideDogs.xcodeproj/xcshareddata/xcschemes/Soundscape.xcscheme b/apps/ios/GuideDogs.xcodeproj/xcshareddata/xcschemes/Soundscape.xcscheme index fa407322a..de0120c14 100644 --- a/apps/ios/GuideDogs.xcodeproj/xcshareddata/xcschemes/Soundscape.xcscheme +++ b/apps/ios/GuideDogs.xcodeproj/xcshareddata/xcschemes/Soundscape.xcscheme @@ -79,6 +79,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + enableThreadSanitizer = "YES" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" @@ -102,6 +103,13 @@ isEnabled = "YES"> + + + + diff --git a/apps/ios/GuideDogs/Assets/Licenses/licenses.html b/apps/ios/GuideDogs/Assets/Licenses/licenses.html index 56b97d7d9..84a726205 100644 --- a/apps/ios/GuideDogs/Assets/Licenses/licenses.html +++ b/apps/ios/GuideDogs/Assets/Licenses/licenses.html @@ -21,7 +21,7 @@

MIT License

- Copyright © 2024 Soundscape Community Contributors + Copyright © 2026 Soundscape Community Contributors
Copyright © Microsoft Corporation.

diff --git a/apps/ios/GuideDogs/Assets/Localization/en-GB.lproj/Localizable.strings b/apps/ios/GuideDogs/Assets/Localization/en-GB.lproj/Localizable.strings index 0351dd45c..16e202fbc 100644 --- a/apps/ios/GuideDogs/Assets/Localization/en-GB.lproj/Localizable.strings +++ b/apps/ios/GuideDogs/Assets/Localization/en-GB.lproj/Localizable.strings @@ -247,11 +247,11 @@ /* */ -"general.error.location_services.authorize.instructions" = "1. Open the Settings app below\n2. Select \"Location\"\n3. Select \"Always\" or \"While Using the App\""; +"general.error.location_services.authorize.instructions" = "1. Open the Settings app below\n2. Select Location\n3. Select Always or While Using the App"; /* */ -"general.error.location_services.precise_location.instructions" = "1. Open the Settings app below\n2. Select \"Location\"\n3. Turn on \"Precise Location\""; +"general.error.location_services.precise_location.instructions" = "1. Open the Settings app below\n2. Select Location\n3. Turn on Precise Location"; /* */ @@ -267,11 +267,11 @@ /* */ -"general.error.location_services_enable_instructions.2" = "Turn Location Services On in the Settings app to continue.\n\n1. Press the back button (titled Settings)\n2. Select Privacy & Security\n3. Select Location Services\n4. Turn On Location Services"; +"general.error.location_services_enable_instructions.2" = "Turn Location Services On in the Settings app to continue.\n\n1. Press the back button until you get to the main settings\n2. Select Privacy & Security\n3. Select Location Services\n4. Turn On Location Services"; /* */ -"general.error.location_services_enable_instructions.3" = "Turn Location Services On in the Settings app to continue.\n\n1. Press Open Settings\n2. Press the back button (titled Settings)\n3. Select Privacy & Security\n4. Select Location Services\n5. Turn On Location Services"; +"general.error.location_services_enable_instructions.3" = "Turn Location Services On in the Settings app to continue.\n\n1. Press Open Settings\n2. Press the back button until you get to the main settings\n3. Select Privacy & Security\n4. Select Location Services\n5. Turn On Location Services"; /* */ @@ -279,7 +279,7 @@ /* */ -"general.error.heading" = "Soundscape is not sure which direction you are facing. Please hold your phone flat or begin walking and try again."; +"general.error.heading" = "Soundscape is not sure which direction you are facing. Please hold your phone flat or begin walking and try again"; /* */ @@ -299,7 +299,7 @@ /* */ -"general.error.network_connection_required.deleting_data" = "A network connection is required when deleting and reloading Soundscape's map data. Check that your phone is not in airplane mode."; +"general.error.network_connection_required.deleting_data" = "A network connection is required when deleting and reloading Soundscape's map data. Check that your phone is not in Airplane Mode."; /* */ @@ -335,7 +335,7 @@ /* */ -"device_motion.enable.instructions" = "Turn On Fitness Tracking in the Settings app to continue.\n\n1. Press Open Settings\n2. Press the Back button (titled Settings)\n3. Select Privacy & Security\n4. Select Motion & Fitness\n5. Turn on Fitness Tracking\n6. Restart Soundscape"; +"device_motion.enable.instructions" = "Turn On Fitness Tracking in the Settings app to continue.\n\n1. Press Open Settings\n2. Press the back button until you get to the main settings\n3. Select Privacy & Security\n4. Select Motion & Fitness\n5. Turn on Fitness Tracking\n6. Restart Soundscape"; /* */ @@ -359,23 +359,21 @@ /* */ -"settings.clear_cache.alert_message" = "Soundscape stores map data to reduce data and battery consumption. Deleting stored data will require Soundscape to reload the data."; +"settings.clear_cache.alert_message" = "Soundscape stores map data to reduce mobile data and battery consumption. Deleting stored data will require Soundscape to reload the data."; /* */ -"settings.clear_cache.markers.alert_title" = "Keep Markers and Routes?"; - +"settings.clear_cache.markers.alert_title" = "Delete Markers and Routes?"; /* */ -"settings.clear_cache.markers.alert_message" = "Choose \"Delete\" to remove markers, beacons and routes, or \"Keep\" to only remove map data. \"Delete\" will reset the app back to a freshly installed state and cannot be undone!"; - +"settings.clear_cache.markers.alert_message" = "Are you sure you want to delete all markers and routes? Choosing \"Delete\" will reset the app back to a freshly installed state and cannot be undone!"; /* */ "settings.clear_cache.no_service.title" = "Unable to Clear Stored Map Data"; /* */ -"settings.clear_cache.no_service.message" = "Soundscape is currently unable to connect to the internet. An internet connection is required when clearing the stored map data so that the map data can be refreshed."; +"settings.clear_cache.no_service.message" = "Soundscape is currently unable to connect to the internet. An internet connection is required when clearing the stored map data so that the data can be refreshed."; /* */ @@ -555,7 +553,7 @@ /* */ -"voice.apple.preview_hint" = "Double tap to select and play a preview."; +"voice.apple.preview_hint" = "Double tap to select and play a preview"; /* */ @@ -563,7 +561,7 @@ /* */ -"voice.settings.enhanced_available" = "A higher quality version of this voice may be available. To download it and other voices, go to the Spoken Content section of the iOS accessibility settings."; +"voice.settings.enhanced_available" = "A higher quality version of this voice may be available. To download it and other voices, go to the Read & Speak section of the iOS accessibility settings."; /* */ @@ -633,7 +631,7 @@ /* */ -"troubleshooting.check_audio.hint" = "Double tap to check the status of the headphones you are using with Soundscape."; +"troubleshooting.check_audio.hint" = "Double tap to check the status of your headphones"; /* */ @@ -645,7 +643,7 @@ /* */ -"troubleshooting.cache.hint" = "Double tap to delete and reload stored map data."; +"troubleshooting.cache.hint" = "Double tap to delete and reload stored map data"; /* */ @@ -673,11 +671,11 @@ /* */ -"settings.new_feature.accept_button.acc_label" = "Double tap to close announcements."; +"settings.new_feature.accept_button.acc_label" = "Double tap to close announcements"; /* */ -"settings.new_feature.accept_button.acc_hint" = "Double tap to view next update announcement."; +"settings.new_feature.accept_button.acc_hint" = "Double tap to view next update announcement"; /* */ @@ -765,7 +763,7 @@ /* */ -"beacon.action.remove_beacon.double_tap.acc_hint" = "Double tap to remove the current audio beacon."; +"beacon.action.remove_beacon.double_tap.acc_hint" = "Double tap to remove the current audio beacon"; /* */ @@ -773,7 +771,7 @@ /* */ -"beacon.action.mute_beacon.acc_hint" = "Double tap to mute the audio beacon."; +"beacon.action.mute_beacon.acc_hint" = "Double tap to mute the audio beacon"; /* */ @@ -781,7 +779,7 @@ /* */ -"beacon.action.unmute_beacon.acc_hint" = "Double tap to unmute the audio beacon."; +"beacon.action.unmute_beacon.acc_hint" = "Double tap to unmute the audio beacon"; /* */ @@ -793,7 +791,7 @@ /* */ -"beacon.action.mute_unmute_beacon.acc_hint" = "Double tap to mute or unmute the audio beacon."; +"beacon.action.mute_unmute_beacon.acc_hint" = "Double tap to mute or unmute the audio beacon"; /* */ @@ -801,7 +799,7 @@ /* */ -"beacon.action.view_details.acc_hint.details" = "Double tap to view additional details."; +"beacon.action.view_details.acc_hint.details" = "Double tap to view additional details"; /* */ @@ -816,6 +814,10 @@ "beacon.beacon_location_within_audio_beacon_muted" = "Beacon within %@. Audio beacon has been muted."; +/* */ +"beacon.suggest_navilens" = "Use the NaviLens button to take you to your destination."; + + /* */ "preview.title" = "Soundscape Street Preview"; @@ -845,7 +847,7 @@ /* */ -"preview.content.edge.text.accessibility_hint" = "Double tap to move to the next intersection."; +"preview.content.edge.text.accessibility_hint" = "Double tap to move to the next intersection"; /* */ @@ -857,7 +859,7 @@ /* */ -"preview.go_back.accessibility_text" = "Double tap to go back to your previous intersection."; +"preview.go_back.accessibility_text" = "Double tap to go back to your previous intersection"; /* */ @@ -865,7 +867,7 @@ /* */ -"preview.search.accessibility_hint" = "Double tap to search or browse nearby places."; +"preview.search.accessibility_hint" = "Double tap to search or browse nearby places"; /* */ @@ -969,15 +971,15 @@ /* */ -"preview.include_unnamed_roads.hint.off" = "Double tap to include unnamed roads during Soundscape Street Preview."; +"preview.include_unnamed_roads.hint.off" = "Double tap to include unnamed roads during Soundscape Street Preview"; /* */ -"preview.include_unnamed_roads.hint.on" = "Double tap to exclude unnamed roads during Soundscape Street Preview."; +"preview.include_unnamed_roads.hint.on" = "Double tap to exclude unnamed roads during Soundscape Street Preview"; /* */ -"preview.tutorial.done.hint" = "Double tap to exit the tutorial."; +"preview.tutorial.done.hint" = "Double tap to exit the tutorial"; /* */ @@ -1023,37 +1025,39 @@ /* */ "location_detail.action.beacon" = "Start Audio Beacon"; +/* */ +"location_detail.action.beacon_or_navilens" = "Start NaviLens or Audio Beacon"; /* */ -"location_detail.action.beacon.hint" = "Double tap to set an audio beacon at this location."; +"location_detail.action.beacon.hint" = "Double tap to set an audio beacon at this location"; /* */ -"location_detail.action.beacon.hint.disabled" = "Setting a new audio beacon is disabled while route guidance is active."; +"location_detail.action.beacon.hint.disabled" = "Setting a new audio beacon is disabled while route guidance is active"; /* */ -"location_detail.action.save.hint" = "Double tap to save this location as a marker."; +"location_detail.action.save.hint" = "Double tap to save this location as a marker"; /* */ -"location_detail.action.edit.hint" = "Double tap to edit marker."; +"location_detail.action.edit.hint" = "Double tap to edit marker"; /* */ -"location_detail.action.share.hint" = "Double tap to share this location."; +"location_detail.action.share.hint" = "Double tap to share this location"; /* */ -"location_detail.action.preview.hint" = "Double tap to start previewing at this location."; +"location_detail.action.preview.hint" = "Double tap to start previewing at this location"; /* */ -"location_detail.action.preview.hint.disabled" = "Street Preview is disabled while route guidance is active."; +"location_detail.action.preview.hint.disabled" = "Street Preview is disabled while route guidance is active"; /* */ -"location_detail.action.directions.hint" = "Double tap to open this location in an external maps app."; +"location_detail.action.directions.hint" = "Double tap to open this location in an external maps app"; /* */ @@ -1065,7 +1069,7 @@ /* */ -"location.select.hint" = "Double tap to select this location."; +"location.select.hint" = "Double tap to select this location"; /* */ @@ -1085,7 +1089,7 @@ /* */ -"location_detail.map.view.hint" = "Edit to select a new location."; +"location_detail.map.view.hint" = "Edit to select a new location"; /* */ @@ -1093,7 +1097,7 @@ /* */ -"location_detail.map.edit.hint" = "Move the map to the correct location."; +"location_detail.map.edit.hint" = "Move the map to the correct location"; /* */ @@ -1157,15 +1161,15 @@ /* */ -"location_detail.add_waypoint.existing.hint" = "Double tap to remove this marker from your route."; +"location_detail.add_waypoint.existing.hint" = "Double tap to remove this marker from your route"; /* */ -"location_detail.add_waypoint.new.hint" = "Double tap to add this marker to your route."; +"location_detail.add_waypoint.new.hint" = "Double tap to add this marker to your route"; /* */ -"location_detail.add_waypoint.marker.hint" = "Double tap to create a marker and add it as a waypoint."; +"location_detail.add_waypoint.marker.hint" = "Double tap to create a marker and add it as a waypoint"; /* */ @@ -1190,41 +1194,41 @@ "route_detail.action.edit" = "Edit Route"; /* */ -"route_detail.action.start_reversed_route.hint" = "Double tap to start this route in reverse."; +"route_detail.action.start_reversed_route.hint" = "Double tap to start this route in reverse"; /* */ -"route_detail.action.start_reversed_route.disabled.hint" = "Add waypoints before starting the route in reverse."; +"route_detail.action.start_reversed_route.disabled.hint" = "Add waypoints before starting the route in reverse"; /* */ -"route_detail.action.start_route.hint" = "Double tap to start this route."; +"route_detail.action.start_route.hint" = "Double tap to start this route"; /* */ -"route_detail.action.start_route.disabled.hint" = "Add waypoints before starting the route."; +"route_detail.action.start_route.disabled.hint" = "Add waypoints before starting the route"; /* */ -"route_detail.action.stop_route.hint" = "Double tap to stop this route."; +"route_detail.action.stop_route.hint" = "Double tap to stop this route"; /* */ -"route_detail.action.start_event.hint" = "Double tap to start this activity."; +"route_detail.action.start_event.hint" = "Double tap to start this activity"; /* */ -"route_detail.action.stop_event.hint" = "Double tap to stop this activity and save your progress."; +"route_detail.action.stop_event.hint" = "Double tap to stop this activity and save your progress"; /* */ -"route_detail.action.reset.hint" = "Double tap to reset this activity and download any available updates."; +"route_detail.action.reset.hint" = "Double tap to reset this activity and download any available updates"; /* */ -"route_detail.action.share.hint" = "Double tap to share this route."; +"route_detail.action.share.hint" = "Double tap to share this route"; /* */ -"route_detail.action.edit.hint" = "Double tap to edit this route."; +"route_detail.action.edit.hint" = "Double tap to edit this route"; /* */ @@ -1232,7 +1236,7 @@ /* */ -"route_detail.action.create.hint" = "Double tap to create a new route."; +"route_detail.action.create.hint" = "Double tap to create a new route"; /* */ @@ -1304,7 +1308,7 @@ /* */ -"route_detail.action.previous.hint" = "Double tap to set the beacon on the previous waypoint."; +"route_detail.action.previous.hint" = "Double tap to set the beacon on the previous waypoint"; /* */ @@ -1312,7 +1316,7 @@ /* */ -"route_detail.action.next.hint" = "Double tap to set the beacon on the next waypoint."; +"route_detail.action.next.hint" = "Double tap to set the beacon on the next waypoint"; /* */ @@ -1420,7 +1424,7 @@ /* */ -"tour.progress.distance.accessibility" = "Beacon set on %1$@, %2$@, %3$@ waypoints remaining"; +"tour.progress.distance.accessibility" = "Beacon set on %1$@. %2$@. %3$@ waypoints remaining"; /* */ @@ -1436,7 +1440,7 @@ /* */ -"tour.progress.distance.accessibility.singular" = "Beacon set on %1$@, %2$@, 1 waypoint remaining"; +"tour.progress.distance.accessibility.singular" = "Beacon set on %1$@. %2$@. 1 waypoint remaining"; /* */ @@ -1464,7 +1468,7 @@ /* */ -"waypoint.callout.button.hint" = "Double tap to hear additional details."; +"waypoint.callout.button.hint" = "Double tap to hear additional details"; /* */ @@ -1604,11 +1608,11 @@ /* */ -"routes.no_routes.hint.1" = "Create a route for yourself or for someone else by organising a set of markers as waypoints on a route."; +"routes.no_routes.hint.1" = "You can create a route for yourself or for someone else by organising a set of markers as waypoints on a route."; /* */ -"routes.no_routes.hint.2" = "While out on your route with Soundscape, you will be informed on arrival to each waypoint, and the Audio Beacon will automatically advance to the next waypoint."; +"routes.no_routes.hint.2" = "While out on your route with Soundscape, you will be informed on arrival to each waypoint, and the audio beacon will automatically advance to the next waypoint."; /* */ @@ -1624,7 +1628,7 @@ /* */ -"routes.tutorial.details" = "You will now return to the Soundscape home page and an Audio Beacon will be placed on your first waypoint. When you arrive at the waypoint, the beacon will advance to the next waypoint on your route."; +"routes.tutorial.details" = "You will now return to the Soundscape home screen and an audio beacon will be placed on your first waypoint. When you arrive at the waypoint, the beacon will advance to the next waypoint on your route."; /* */ @@ -1636,7 +1640,7 @@ /* */ -"routes.sort.by_name.hint" = "Double tap to sort by name."; +"routes.sort.by_name.hint" = "Double tap to sort by name"; /* */ @@ -1644,7 +1648,7 @@ /* */ -"routes.sort.by_distance.hint" = "Double tap to sort by distance."; +"routes.sort.by_distance.hint" = "Double tap to sort by distance"; /* */ @@ -1720,7 +1724,7 @@ /* */ -"markers.edit_screen.done_button.acc_hint" = "Double tap to save this marker."; +"markers.edit_screen.done_button.acc_hint" = "Double tap to save this marker"; /* */ @@ -1780,7 +1784,7 @@ /* */ -"searching.no_results_found_title" = "Oops! No results found"; +"searching.no_results_found_title" = "Oops! No results found."; /* */ @@ -1828,15 +1832,15 @@ /* */ -"search.button.markers.accessibility_hint" = "Double tap to select or edit your saved markers and routes."; +"search.button.markers.accessibility_hint" = "Double tap to select or edit your saved markers and routes"; /* */ -"search.button.nearby.accessibility_hint" = "Double tap to explore nearby restaurants, public transport and more."; +"search.button.nearby.accessibility_hint" = "Double tap to explore nearby restaurants, public transport and more"; /* */ -"search.button.current_location.accessibility_hint" = "Double tap to preview, mark, or share your current location with a friend."; +"search.button.current_location.accessibility_hint" = "Double tap to preview, mark, or share your current location with a friend"; /* */ @@ -1852,11 +1856,11 @@ /* */ -"filter.clear.hint" = "Double tap to clear selected filter."; +"filter.clear.hint" = "Double tap to clear selected filter"; /* */ -"filter.double_tap_places_category" = "Double tap to filter places by category."; +"filter.double_tap_places_category" = "Double tap to filter places by category"; /* */ @@ -1870,11 +1874,14 @@ /* */ "filter.food_drink" = "Food & Drink"; +/* */ +"filter.navilens" = "NaviLens Codes"; + /* Filter, Parks */ "filter.parks" = "Parks"; /* */ -"filter.things_to_do" = "Things to do"; +"filter.things_to_do" = "Things to Do"; /* */ @@ -1890,7 +1897,7 @@ /* */ -"filter.not_available" = "Some category filters are not available. You can still browse nearby places by selecting \"%@\"."; +"filter.not_available" = "Some category filters are not available. You can still browse nearby places by selecting \"%@\""; /* */ @@ -1964,7 +1971,7 @@ /* */ -"callouts.nothing_to_call_out_now" = "There is nothing to call out right now."; +"callouts.nothing_to_call_out_now" = "There is nothing to call out right now"; /* */ @@ -2016,7 +2023,7 @@ /* */ -"sleep.sleep.acc_hint" = "Double tap to put Soundscape to sleep."; +"sleep.sleep.acc_hint" = "Double tap to put Soundscape to sleep"; /* */ @@ -2583,7 +2590,7 @@ /* */ -"ui.action_button.my_location.acc_hint" = "Double tap to hear about your current location."; +"ui.action_button.my_location.acc_hint" = "Double tap to hear about your current location"; /* */ @@ -2591,7 +2598,7 @@ /* */ -"ui.action_button.nearby_markers.acc_hint" = "Double tap to hear about nearby places that you have marked."; +"ui.action_button.nearby_markers.acc_hint" = "Double tap to hear about nearby places that you have marked"; /* */ @@ -2599,7 +2606,7 @@ /* */ -"ui.action_button.around_me.acc_hint" = "Double tap to hear about places in the four quadrants around you."; +"ui.action_button.around_me.acc_hint" = "Double tap to hear about places in the four quadrants around you"; /* */ @@ -2607,7 +2614,7 @@ /* */ -"ui.action_button.ahead_of_me.acc_hint" = "Double tap to hear about places in front of you."; +"ui.action_button.ahead_of_me.acc_hint" = "Double tap to hear about places in front of you"; /* */ @@ -2615,7 +2622,7 @@ /* */ -"ui.menu.hint" = "Double tap to open the menu."; +"ui.menu.hint" = "Double tap to open the menu"; /* */ @@ -2695,7 +2702,7 @@ /* */ -"poi_cell.accessibility_hint.suggested_search" = "Double tap to search for: %@."; +"poi_cell.accessibility_hint.suggested_search" = "Double tap to search for: %@"; /* */ @@ -2743,8 +2750,8 @@ /* */ -"devices.explain_ar.connected.airpods" = "Your AirPods are ready for use, so you can put your phone in your pocket and go! Soundscape is tracking the direction of your head so you do not need to hold the phone in your hand."; -"devices.explain_ar.connected.boseframes" = "Your Bose Frames are ready for use, so you can put your phone in your pocket and go! Soundscape is tracking the direction of your head so you do not need to hold the phone in your hand."; +"devices.explain_ar.connected.airpods" = "Your AirPods are ready for use, so you can put your phone in your pocket and go! Soundscape is tracking the direction of your head so you don't need to hold the phone in your hand."; +"devices.explain_ar.connected.boseframes" = "Your Bose Frames are ready for use, so you can put your phone in your pocket and go! Soundscape is tracking the direction of your head so you don't need to hold the phone in your hand."; /* */ "devices.explain_ar.paired" = "Soundscape is not currently connected to your %@. Please ensure your headphones are turned on and near your phone."; @@ -2783,7 +2790,7 @@ /* */ -"devices.connect_headset.explanation" = "Select the type of your headphones from the list of supported headphones below."; +"devices.connect_headset.explanation" = "Select the type of headphones from the list of supported headphones below."; /* */ @@ -2799,14 +2806,14 @@ /* */ -"devices.connect_headset.completed.airpods" = "Congratulations! Your AirPods are ready for use, so you can put your phone in your pocket and go! Soundscape will now track the direction of your head so you do not need to hold the phone in your hand. A single click on the headphones button will mute or unmute the beacon, double click will call out your location, and a triple click will repeat the last callout."; -"devices.connect_headset.completed.boseframes" = "Congratulations! Your Bose Frames are ready for use, so you can put your phone in your pocket and go! Soundscape will now track the direction of your head so you do not need to hold the phone in your hand."; +"devices.connect_headset.completed.airpods" = "Congratulations! Your AirPods are ready for use, so you can put your phone in your pocket and go! Soundscape will now track the direction of your head so you don't need to hold the phone in your hand. A single click on the headphones button will mute or unmute the beacon, a double click will call out your location, and a triple click will repeat the last callout."; +"devices.connect_headset.completed.boseframes" = "Congratulations! Your Bose Frames are ready for use, so you can put your phone in your pocket and go! Soundscape will now track the direction of your head so you don't need to hold the phone in your hand."; /* */ "devices.connect_headset.completed.test" = "Check Your Headphones"; /* */ -"devices.connect_headset.completed.test.hint" = "Double tap to check your %@."; +"devices.connect_headset.completed.test.hint" = "Double tap to check your %@"; /* */ @@ -2822,7 +2829,7 @@ /* */ -"devices.test_headset.callout" = "We've placed an audio beacon to your right. Listen where it is, and turn your head towards it… Notice how you can do this even when your phone is in your pocket."; +"devices.test_headset.callout" = "We've placed an audio beacon to your right. Listen where it is, and turn your head towards it. Notice how you can do this even when your phone is in your pocket."; /* */ @@ -2926,7 +2933,7 @@ /* */ -"behavior.experiences.reset.prompt" = "Resetting this activity will remove your current progress and allow you to start this activity over again. In addition to resetting this activity, you may also choose to check for updates. This will download updated information for this activity if any updates are available."; +"behavior.experiences.reset.prompt" = "Resetting this activity will remove your current progress and allow you to start this activity over again. You may also check for updates. This will download updated information for this activity if any updates are available."; /* */ @@ -3098,7 +3105,7 @@ /* */ -"action.double_tap_to_repeat" = "Double tap to repeat."; +"action.double_tap_to_repeat" = "Double tap to repeat"; /* */ @@ -3146,7 +3153,7 @@ /* */ -"tutorial.markers.mark_location.acc_hint" = "Double tap to mark this location."; +"tutorial.markers.mark_location.acc_hint" = "Double tap to mark this location"; /* */ @@ -3186,7 +3193,7 @@ /* */ -"tutorial.beacon.mark_location.acc_hint" = "Double tap to use this location for the beacon tutorial."; +"tutorial.beacon.mark_location.acc_hint" = "Double tap to use this location for the beacon tutorial"; /* */ @@ -3294,15 +3301,15 @@ /* */ -"tutorial.beacons.text.Mute" = "If you need the app to be quiet for any reason, you can either use the mute beacon button or the sleep button on the home screen, or you can double tap with two fingers anywhere on the screen. A double tap with two fingers will stop any current callouts and will mute the audio beacon. Give it a try now."; +"tutorial.beacons.text.Mute" = "If you need the app to be quiet for any reason, you can either use the Mute Beacon button or the Sleep button on the home screen, or you can double tap with two fingers anywhere on the screen. A double tap with two fingers will stop any current callouts and will mute the audio beacon. Give it a try now."; /* */ -"tutorial.beacons.text.MuteRepeat" = "Double tap with two fingers anywhere on the screen."; +"tutorial.beacons.text.MuteRepeat" = "Double tap with two fingers anywhere on the screen"; /* */ -"tutorial.beacons.text.WrapUp" = "It looks like you've got it! If you want to repeat this tutorial, you can access it at any time on the Help and Tutorials screen. The beacon you've set for this tutorial will now be cleared and you will be returned to the previous screen."; +"tutorial.beacons.text.WrapUp" = "It looks like you've got it! If you want to repeat this tutorial, you can access it at any time on the Help & Tutorials screen. The beacon you've set for this tutorial will now be cleared and you will be returned to the previous screen."; /* */ @@ -3330,7 +3337,7 @@ /* */ -"help.config.voices.content" = "Soundscape can use any of the voices you have downloaded in the iOS Settings app except for the Siri voices which are not available to Soundscape. We recommend choosing one of the higher quality \"Enhanced\" voices, but you will need to download it first. You can download voices in the iOS Settings app by going to Accessibility > Spoken Content > Voices and tapping on a voice. Within the Soundscape App, you can select the voice you want to use by tapping \"Settings\" on the main menu and then from \"General Settings\" selecting \"Voice\"."; +"help.config.voices.content" = "Soundscape can use any of the voices you have downloaded in the iOS Settings app except for the Siri voices which are not available to Soundscape. We recommend choosing one of the higher quality \"Enhanced\" voices, but you will need to download it first. You can download voices in the iOS Settings app by going to Accessibility > Read & Speak > Voices and tapping on a voice. (In iOS Versions before 26, \"Read & Speak\" is called \"Spoken Content\".) Within the Soundscape App, you can select the voice you want to use by going to \"Settings\" from the menu and then from \"General Settings\" selecting \"Voice\"."; /* */ @@ -3422,11 +3429,11 @@ /* */ -"terms_of_use.accept_checkbox.on.acc_hint" = "Double tap to tick the \"accept the terms of use\" checkbox."; +"terms_of_use.accept_checkbox.on.acc_hint" = "Double tap to tick the \"Accept Terms of Use\" checkbox"; /* */ -"terms_of_use.accept_checkbox.off.acc_hint" = "Double tap to untick the \"accept the terms of use\" checkbox."; +"terms_of_use.accept_checkbox.off.acc_hint" = "Double tap to untick the \"Accept Terms of Use\" checkbox"; /* */ @@ -3446,11 +3453,11 @@ /* */ -"terms_of_use.accept.new_features.accessibility_hint" = "Double tap to accept and close announcements."; +"terms_of_use.accept.new_features.accessibility_hint" = "Double tap to accept and close announcements"; /* */ -"first_launch.get_started_button.off.acc_hint" = "You must tick the \"accept the terms of use\" checkbox before you can press this button."; +"first_launch.get_started_button.off.acc_hint" = "You must tick the \"Accept Terms of Use\" checkbox before you can press this button"; /* */ @@ -3462,7 +3469,7 @@ /* */ -"first_launch.permission_required" = "This permission is required."; +"first_launch.permission_required" = "This permission is required"; /* */ @@ -3566,7 +3573,7 @@ /* */ -"first_launch.callouts.listen.accessibility_hint" = "Double tap to listen to an example of what Soundscape might call out on your next walk."; +"first_launch.callouts.listen.accessibility_hint" = "Double tap to listen to an example of Soundscape's automatic callouts"; /* */ @@ -3594,7 +3601,7 @@ /* */ -"first_launch.permissions.required" = "This permission is required."; +"first_launch.permissions.required" = "This permission is required"; /* */ @@ -3674,7 +3681,7 @@ /* */ -"help.text.destination_beacons.how.1" = "To set a beacon:
First, view the details for a location by either using the search bar to search for a place, or tapping one of the \"Places Nearby\", \"Markers & Routes\", or \"Current Location\" buttons and selecting a location. From the location details screen you can select the \"Start Audio Beacon\" button. Tapping this will return you to the home screen and turn on an audible beacon coming from the direction of the place you've selected. The name of the place along with its distance and physical address, if available, will now be displayed on the main screen."; +"help.text.destination_beacons.how.1" = "To set a beacon:
First, view the details for a location by either using the search bar to search for a place, or tapping one of the \"Places Nearby\", \"Markers & Routes\", or \"Current Location\" buttons and selecting a location. Then from the location details screen, select the \"Start Audio Beacon\" button. Tapping this will return you to the home screen and turn on an audible beacon coming from the direction of the place you've selected. The name of the place along with its distance and physical address, if available, will now be displayed on the main screen."; /* */ @@ -3702,11 +3709,11 @@ /* */ -"help.text.automatic_callouts.how.1" = "Turning callouts on or off:
Turning callouts off will silence the app. Callouts can be turned on or off in the \"Manage Callouts\" section of the \"Settings\" screen where you can tap the \"Allow Callouts\" toggle to turn them on or off. You can also turn callouts on or off by using the \"skip forward\" command (double tap and hold) if your headphones have media control buttons. Alternatively, you can use the \"Sleep\" button in the upper right-hand corner of the home screen to stop Soundscape from making callouts until you wake it up."; +"help.text.automatic_callouts.how.1" = "Turning callouts on or off:
Turning callouts off will silence the app. Callouts can be turned on or off by going to the \"Manage Callouts\" section of the \"Settings\" screen and then toggling the \"Allow Callouts\" button. You can also turn callouts on or off by using the \"skip forward\" command (double tap and hold) if your headphones have media control buttons. Alternatively, you can use the \"Sleep\" button in the upper right-hand corner of the home screen to stop Soundscape from making callouts until you wake it up."; /* */ -"help.text.automatic_callouts.how.2" = "Managing which callouts you hear:
To choose the types of things Soundscape will automatically call out, go to the \"Settings\" screen within the main menu. The \"Manage Callouts\" section of the \"Settings Screen\" contains a list of types of things the app can call out. Each item has a toggle button that you can turn on or off. If you wish to turn off all callouts, tap the \"Allow Callouts\" toggle at the top of the list."; +"help.text.automatic_callouts.how.2" = "Managing which callouts you hear:
To choose the types of things Soundscape will automatically call out, go to the \"Settings\" screen from the menu on the home screen. The \"Manage Callouts\" section of the \"Settings\" screen contains a list of types of things the app can call out. Each item has a toggle button that you can turn on or off. If you wish to turn off all callouts, tap the \"Allow Callouts\" toggle at the top of the list."; /* */ @@ -3746,7 +3753,7 @@ /* */ -"help.text.ahead_of_me.what" = "The \"Ahead of Me\" button tells you about four things ahead of you. \"Ahead of Me\" is intended to help you explore the way ahead of yourself when you are learning about a new area."; +"help.text.ahead_of_me.what" = "The \"Ahead of Me\" button tells you about up to five things ahead of you. \"Ahead of Me\" is intended to help you explore the way ahead of yourself when you are learning about a new area."; /* */ @@ -3758,15 +3765,15 @@ /* */ -"help.text.remote_control.what" = "You can access certain features in Soundscape with the help of the media control buttons on your headphones. This functionality works with any wired or Bluetooth headphones that have media control buttons like Play, Pause, Next, Previous and others. Different headphones may include different buttons so please refer to the list of actions below to determine which ones are available to you.
Also note that this feature only works with headphones that support Apple's media controls (such as play and pause)."; +"help.text.remote_control.what" = "You can access certain features in Soundscape with the media control buttons on your headphones. This functionality works with any wired or Bluetooth headphones that have media control buttons like Play, Pause, Next, Previous and others. Different headphones may include different buttons, so please refer to the list of actions below to determine which ones are available to you.
Note that this feature only works with headphones that support Apple's media controls (such as play and pause)."; /* */ -"help.text.remote_control.when" = "Headphone media controls can be used while Soundscape is running. This is true whether you are currently in Soundscape or while Soundscape is in the background and even while your device is locked. Note however that headphone media control buttons will not work with Soundscape if you are playing audio like music, podcasts or videos with another app."; +"help.text.remote_control.when" = "Headphone media controls can be used while Soundscape is running. This is true whether you are currently in Soundscape or while the app runs in the background and even while your device is locked. Note however that headphone media control buttons will not work with Soundscape if you are playing audio like music, podcasts or videos with another app."; /* */ -"help.text.remote_control.how" = "

You can access the following features in Soundscape using the media control buttons on your headphones:


⏯ Play/Pause: Mute any current callouts and if the audio beacon is set, toggle the beacon audio.

⏭ Next: Callout \"My Location\".

⏮ Previous: Repeat last callout.

⏩ Skip Forward: Toggle callouts On and Off.

⏪ Skip Backward: Callout \"Around Me\".

"; +"help.text.remote_control.how" = "

You can access the following features in Soundscape using the media control buttons on your headphones:


⏯ Play/Pause: Mute any current callouts and if the audio beacon is set, toggle the beacon audio.

⏭ Next: Callout \"My Location\".

⏮ Previous: Repeat last callout.

⏩ Skip Forward: Toggle callouts On and Off.

⏪ Skip Backward: Callout \"Around Me\".

"; /* */ @@ -3774,11 +3781,11 @@ /* */ -"help.text.markers.content.2" = "You can mark things that are personal and relevant to you like your home, your office and your preferred grocery store. You can mark any place or address, but you can also mark things that might traditionally not be available in maps, for example, entrances to buildings or parks, push-to-walk buttons, pedestrian crossings or bridges, bus stops or even your dog’s favourite tree and use these as references along your walk."; +"help.text.markers.content.2" = "You can mark things that are personal and relevant to you like your home, your office and your preferred grocery store. You can mark any place or address, but you can also mark things that aren't usually on maps, for example, entrances to buildings or parks, push-to-walk buttons, pedestrian crossings or bridges, bus stops or even your dog’s favourite tree and use these as references along your walk."; /* */ -"help.text.markers.content.3" = "To experience marked places, Soundscape will automatically call out marked places as you walk by or approach them, or you can use the Nearby markers button at the bottom of the home screen to hear a spatial callout of marked places around you. You can even set an audio beacon on any marked place. When you do this, the Soundscape audio beacon you are familiar with, will be heard and you can operate it as usual."; +"help.text.markers.content.3" = "To experience marked places, Soundscape will automatically call out marked places as you walk by or approach them, or you can use the \"Nearby Markers\" button at the bottom of the home screen to hear a spatial callout of marked places around you. You can even set an audio beacon on any marked place. When you do this, the Soundscape audio beacon you are familiar with, will be heard and you can operate it as usual."; /* */ @@ -3786,11 +3793,11 @@ /* */ -"help.text.creating_markers.content.2" = "You will now have the option to customise this marker. This step is optional. If you want to, you can change the name of the marker and also add an annotation that will be called out along with the marker to provide some extra information. Once you are done, select the \"Done\" button to save your Marker."; +"help.text.creating_markers.content.2" = "You will now have the option to customise this marker. You can change its name and also add an annotation that will be called out along with the marker to provide extra information. Then select the \"Done\" button to save your marker."; /* */ -"help.text.customizing_markers.content.1" = "If you want to rename a marker you previously created, or add an annotation to it, then you can do so by selecting the marker from the \"Markers\" tab of the \"Markers & Routes\" page, then selecting the \"Edit Marker\" button. You can use this to give markers descriptive or useful nicknames, as well as give them a longer description using the annotation field."; +"help.text.customizing_markers.content.1" = "If you want to rename a marker you previously created, or add an annotation to it, select the marker from the \"Markers\" tab of the \"Markers & Routes\" page, and then select the \"Edit Marker\" button. You can use this to give markers descriptive or useful nicknames, as well as give them a longer description using the annotation field."; /* */ @@ -3798,7 +3805,7 @@ /* */ -"help.text.routes.content.what" = "Routes are a series of waypoints. You will be informed on arrival to each waypoint, and the Audio Beacon will automatically advance to the next waypoint."; +"help.text.routes.content.what" = "Routes are a series of waypoints. You will be informed on arrival to each waypoint, and the audio beacon will automatically advance to the next waypoint."; /* */ @@ -3806,11 +3813,11 @@ /* */ -"help.text.routes.content.how.1" = "Creating a route:
First, go to \"Markers & Routes\", select the \"Routes\" tab, and then select the \"New Route\" button. Give the route a name and an optional description, then add waypoints as you go or pick them from your list of Markers. You can rearrange the order of the waypoints along a route at any time by editing the route."; +"help.text.routes.content.how.1" = "Creating a route:
First, go to \"Markers & Routes\", select the \"Routes\" tab, and then select the \"New Route\" button. Give the route a name and an optional description, then add waypoints as you go or pick them from your list of markers. You can rearrange the order of the waypoints along a route at any time by editing the route."; /* */ -"help.text.routes.content.how.1a" = "Following a route:
Select your route from the \"Markers & Routes\" page and then select Start Route. You will return to the home screen and Soundscape will set a beacon on the first waypoint. As you make your way through the route, the beacon advances to the next waypoint until the route is completed. If at any time you want to skip ahead or back a waypoint, press \"Next Waypoint\" or \"Previous Waypoint\"."; +"help.text.routes.content.how.1a" = "Following a route:
Select your route from the \"Markers & Routes\" page and then select \"Start Route\". You will return to the home screen and Soundscape will set a beacon on the first waypoint. As you make your way through the route, the beacon advances to the next waypoint until the route is completed. If at any time you want to skip ahead or back a waypoint, press \"Next Waypoint\" or \"Previous Waypoint\"."; /* */ @@ -3818,11 +3825,11 @@ /* */ -"help.text.routes.content.how.3" = "Sharing a route:
Select your route on the \"Markers & Routes\" page and then select the option to \"Share\" using all of the usual share options available to you."; +"help.text.routes.content.how.3" = "Sharing a route:
Select your route on the \"Markers & Routes\" page and then select \"Share\". You can now use any of the usual share options available to you."; /* */ -"help.using_headsets.airpods.what" = "Soundscape supports spatial audio with dynamic head tracking when using compatible AirPods. Once they're connected, sensors in the AirPods tell Soundscape the direction your head is facing. This helps Soundscape to improve your audio experience, making it more natural as you move around in the world. When you use Soundscape with AirPods connected, you do not need to hold your phone for Soundscape to work correctly."; +"help.using_headsets.airpods.what" = "Soundscape supports spatial audio with dynamic head tracking when using compatible AirPods. Once they're connected, sensors in the AirPods tell Soundscape the direction your head is facing. This helps Soundscape to improve your audio experience, making it more natural as you move around in the world. When you use Soundscape with AirPods connected, you do not need to hold your phone for the app to work correctly."; /* */ @@ -3850,7 +3857,7 @@ /* */ -"osm.tag.townhall" = "Townhall"; +"osm.tag.townhall" = "Town Hall"; /* */ @@ -4094,7 +4101,7 @@ /* */ -"banner.custom_behavior.scavenger_hunt.hint" = "Double tap to read about or pause the scavenger hunt."; +"banner.custom_behavior.scavenger_hunt.hint" = "Double tap to read about or pause the scavenger hunt"; /* */ @@ -4146,7 +4153,7 @@ /* */ -"voice.apple.additional" = "Additional voices, including enhanced quality voices, can be downloaded in the Spoken Content section of the iOS accessibility settings."; +"voice.apple.additional" = "Additional voices, including enhanced quality voices, can be downloaded in the Read & Speak section of the iOS accessibility settings."; /* */ @@ -4170,7 +4177,7 @@ /* */ -"faq.when_to_use_soundscape.answer" = "Soundscape has features and benefits that span a variety of scenarios and time scales. Furthermore, Soundscape’s value to you may evolve over time so how you use it today may differ from how you will use it in three months. People often think about apps in terms of \"what problem is this app good at solving?\" Soundscape certainly can be used on a case by case basis when you have a specific information need – such as keeping track of a destination as you make your way there, helping to orient yourself when you emerge from a metro station, getting your bearings when exiting a car, or finding the street names for, or distance to, the next intersection. However, the philosophy behind Soundscape is one of \"lighting up your world with sound\", designed to be used anytime you are out and about to provide ambient awareness of your surroundings, such as keeping you aware of the names of the streets you are on, the direction you are heading, and the names of businesses you are passing. In this use mode, our users have referred to Soundscape as a \"nice companion app\", which supports \"serendipity\", to \"fill in the gaps in your mental map\" and provide more \"confidence when walking\". Here are some other examples of how our users are incorporating Soundscape into their life:\n\n\"Soundscape helped me get back on track after I got off the bus and headed off in the wrong direction.\"\n\n\"Even in the town where I have lived for 3 years, I have built an improved picture of what is around me [with Soundscape].\"\n\n\"The 3D sound enhances my experience of a walk, as I feel more connected to my environment…I am more likely to try a new route now that I have the app to use.\"\n\n\"I miss the serendipity of walking around and noticing things. Having Soundscape is nice – it requires no effort to hear about things around me. The relational information is useful and is a great app for situational awareness and exploring commercial corridors.\"\n\n\"[I used Soundscape] to locate a pub in the middle of York. [I] used a range of its options to first locate and then actually find it. It took me to within 3 metres of the door – brilliant!\""; +"faq.when_to_use_soundscape.answer" = "Soundscape has features and benefits that span a variety of scenarios and time scales. Furthermore, Soundscape’s value to you may evolve over time, so how you use it today may differ from how you will use it in three months. People often think about apps in terms of \"what problem is this app good at solving?\" Soundscape certainly can be used on a case by case basis when you have a specific information need – such as keeping track of a destination as you make your way there, helping to orient yourself when you emerge from a metro station, getting your bearings when exiting a car, or finding the street names for, or distance to, the next intersection. However, the philosophy behind Soundscape is one of \"lighting up your world with sound\", designed to be used anytime you are out and about to provide ambient awareness of your surroundings, such as keeping you aware of the names of the streets you are on, the direction you are heading, and the names of businesses you are passing. In this use mode, our users have referred to Soundscape as a \"nice companion app\", which supports \"serendipity\", to \"fill in the gaps in your mental map\" and provide more \"confidence when walking\". Here are some other examples of how our users are incorporating Soundscape into their life:\n\n\"Soundscape helped me get back on track after I got off the bus and headed off in the wrong direction.\"\n\n\"Even in the town where I have lived for 3 years, I have built an improved picture of what is around me [with Soundscape].\"\n\n\"The 3D sound enhances my experience of a walk, as I feel more connected to my environment…I am more likely to try a new route now that I have the app to use.\"\n\n\"I miss the serendipity of walking around and noticing things. Having Soundscape is nice – it requires no effort to hear about things around me. The relational information is useful and is a great app for situational awareness and exploring commercial corridors.\"\n\n\"[I used Soundscape] to locate a pub in the middle of York. [I] used a range of its options to first locate and then actually find it. It took me to within 3 metres of the door – brilliant!\""; /* */ @@ -4190,7 +4197,7 @@ /* */ -"faq.what_can_I_set.answer" = "You can set an audio beacon on any business, place, point of interest, address, or intersection. There are a few ways to set a location as a beacon. First, view the details for a location by either using the search bar to search for a place, or tapping one of the \"Places Nearby\", \"Markers & Routes\", or \"Current Location\" buttons and selecting a location. From the location details screen you can select the \"Start Audio Beacon\" button. Tapping this will return you to the home screen and turn on an audible beacon coming from the direction of the place you've selected. The name of the place along with its distance and physical address, if available, will now be displayed on the main screen."; +"faq.what_can_I_set.answer" = "You can set an audio beacon on any business, place, point of interest, address, or intersection. There are a few ways to set a location as a beacon. First, view the details for a location by either using the search bar to search for a place, or tapping one of the \"Places Nearby\", \"Markers & Routes\", or \"Current Location\" buttons and selecting a location. Then from the location details screen, select the \"Start Audio Beacon\" button. Tapping this will return you to the home screen and turn on an audible beacon coming from the direction of the place you've selected. The name of the place along with its distance and physical address, if available, will now be displayed on the main screen."; /* */ @@ -4198,7 +4205,7 @@ /* */ -"faq.how_to_use_beacon.answer" = "You can think of the audible beacon as a \"lighthouse for the ears\", notifying you of where your destination is relative to your location, as the crow flies. Like a lighthouse, it does not tell you how to get there – you may need to make many navigation choices along the way, just as a sailboat will have to make many strategic \"tacks\" to get closer to the lighthouse. The continuous rhythmic sound of the beacon is spatialised from the direction of the destination, and helps you stay aware of its location relative to you as you walk. When you are walking directly toward the destination, or you point the phone in that direction, a higher pitched \"ring\" sound will be heard. This feature allows you to pinpoint the direction of the destination since the direction of the rhythmic sound can sometimes be difficult to perceive in loud environments. When searching for the higher pitched \"ring\", hold the phone flat and sweep the phone slowly; turning your head to point in the same direction as the phone will ensure that you have the best spatial audio experience.\n\nThe lighthouse metaphor for the beacon’s design has several natural implications:\n\n1. There is no \"correct\" direction to travel when using the beacon, instead, with Soundscape you choose how to get there;\n2. The higher pitched \"ring\" helps you pinpoint the direction of the destination only – it is not an indication of how you should get there;\n3. If you generally know how to get to your destination, you may wish to mute the beacon for the majority of your trip and turn it on only as you get closer."; +"faq.how_to_use_beacon.answer" = "You can think of the audible beacon as a \"lighthouse for the ears\", notifying you of where your destination is relative to your location, as the crow flies. Like a lighthouse, it does not tell you how to get there – you may need to make many navigation choices along the way, just as a sailboat will have to make many strategic \"tacks\" to get closer to the lighthouse. The continuous rhythmic sound of the beacon is spatialised from the direction of the destination, and helps you stay aware of its location relative to you as you walk. When you are walking directly towards the destination, or you point the phone in that direction, a higher pitched \"ring\" sound will be heard. This feature allows you to pinpoint the direction of the destination since the direction of the rhythmic sound can sometimes be difficult to perceive in loud environments. When searching for the higher pitched \"ring\", hold the phone flat and sweep the phone slowly; turning your head to point in the same direction as the phone will ensure that you have the best spatial audio experience.\n\nThe lighthouse metaphor for the beacon’s design has several natural implications:\n\n1. There is no \"correct\" direction to travel when using the beacon, instead, with Soundscape you choose how to get there;\n2. The higher pitched \"ring\" helps you pinpoint the direction of the destination only – it is not an indication of how you should get there;\n3. If you generally know how to get to your destination, you may wish to mute the beacon for the majority of your trip and turn it on only as you get closer."; /* */ @@ -4206,7 +4213,7 @@ /* */ -"faq.why_does_beacon_disappear.answer" = "Soundscape’s audible beacon is fundamentally a directional cue, telling you where your destination is relative to the direction you are facing. When Soundscape is uncertain about what direction you are facing, it lowers the volume of the beacon. Most often this occurs if you have been walking with the phone stored in a pocket or bag, and you stop moving, such as to cross a street. The beacon will get louder once you start moving again, or if you hold the phone flat and point it in the direction you are facing."; +"faq.why_does_beacon_disappear.answer" = "Soundscape’s audible beacon is fundamentally a directional cue, telling you where your destination is relative to the direction you are facing. When Soundscape is uncertain about which way you are facing, it lowers the volume of the beacon. Most often this occurs if you have been walking with the phone stored in a pocket or bag, and you stop moving, such as to cross a street. The beacon will get louder once you start moving again, or if you hold the phone flat and point it away from you."; /* */ @@ -4214,7 +4221,7 @@ /* */ -"faq.beacon_on_address.answer" = "Yes you can. Addresses are not listed by default but can be found using the search field. To save this address so you don’t need to search for it again, you can add it as a marker from the home screen by selecting the \"add to markers\" button, or using VoiceOver actions on the beacon on the home screen."; +"faq.beacon_on_address.answer" = "Yes you can. Addresses are not listed by default but can be found using the search field. To save this address so you don’t need to search for it again, you can add it as a marker from the home screen by selecting the \"Add to Markers\" button, or using VoiceOver actions on the beacon on the home screen."; /* */ @@ -4230,7 +4237,7 @@ /* */ -"faq.how_close_to_destination.answer" = "Soundscape can determine the location of your destination to within several metres, but not less. When Soundscape determines that you are close to your destination, you will hear a final callout that your destination is nearby, and the beacon will turn off. You can adjust when the beacon goes silent by going to \"Audio Beacon\" from the \"Settings\" screen and then moving the \"Audio Mute Distance\" slider up or down."; +"faq.how_close_to_destination.answer" = "Soundscape can determine the location of your destination to within several metres, but not less. When Soundscape determines that you are close to your destination, you will hear a final callout that your destination is nearby, and the beacon will turn off. You can adjust the distance at which the beacon goes silent by going to \"Audio Beacon\" from the \"Settings\" screen and then moving the \"Audio Mute Distance\" slider up or down."; /* */ @@ -4238,7 +4245,7 @@ /* */ -"faq.turn_beacon_back_on.answer" = "Yes, you can turn the beacon back on once Soundscape turns it off by selecting the \"unmute beacon button\"; however, since Location Services is only accurate to about 10 metres, we cannot guarantee the behaviour of the beacon when you are within a few metres of your destination."; +"faq.turn_beacon_back_on.answer" = "Yes, you can turn the beacon back on once Soundscape turns it off by selecting the \"Unmute Beacon\" button; however, since Location Services is only accurate to about 10 metres, we cannot guarantee the behaviour of the beacon when you are within a few metres of your destination."; /* */ @@ -4246,7 +4253,7 @@ /* */ -"faq.road_names.answer" = "To accommodate a variety of intersection layouts, Soundscape describes intersections as segments of roadways that depart from a common point. Soundscape uses spatial audio to indicate the name of the road that goes to the left, the name of the road that continues straight ahead, and the name of the road that goes to the right, in that order. If the description of the intersection begins with the road you are on rather than one to the left, then the intersection is a T with the road you are on continuing ahead and a road intersecting from the right. Similarly, if the description only includes a road to the left and to the right, you will know that the road you are on ends at a T ahead of you. This method of describing intersections also supports the case when a road changes name at an intersection."; +"faq.road_names.answer" = "To accommodate a variety of intersection layouts, Soundscape describes intersections as segments of roadways that depart from a common point. Soundscape uses spatial audio to indicate the names of the roads that go to the left, straight ahead, and to the right, in that order. If the description of the intersection begins with the road you are on rather than one to the left, then the intersection forms a sideways T with the road you are on continuing ahead and a road intersecting from the right. Similarly, if the description only includes a road to the left and to the right, you will know that the road you are on ends at a T ahead of you. This method of describing intersections also supports the case when a road changes name at an intersection."; /* */ @@ -4254,7 +4261,7 @@ /* */ -"faq.why_not_every_business.answer" = "Soundscape is designed not to be too chatty. In addition, it uses Open Street Map as its back-end data source. Open Street Map (OSM, https://www.openstreetmap.org/) is a community-developed and edited map of the world, relying on individuals, to enter and curate the data. If a business or point of interest is not announced by Soundscape, the most probable reason is that the business has not been added, or in some cases updated, by a member of the OSM community yet."; +"faq.why_not_every_business.answer" = "Soundscape is designed not to be too chatty. In addition, it uses Open Street Map as its back-end data source. Open Street Map (OSM, https://www.openstreetmap.org/) is a community-developed and edited map of the world, relying on individuals, to enter and curate the data. If Soundscape doesn't announce a business or point of interest, the most probable reason is that the business has not been added, or in some cases updated, by an OSM community member yet."; /* */ @@ -4270,7 +4277,7 @@ /* */ -"faq.miss_a_callout.answer" = "Soundscape has a list of your recent callouts so that you can revisit callouts that you might have missed. To find this, tap on the search bar on the Soundscape home screen. At the bottom of this page, there is a section for \"Recent Callouts\" where the callout you missed will be listed. Alternatively, you can shake your phone to repeat the last callout. From the \"Manage Callouts\" section of the \"Settings\" screen, turn on \"Repeat Callouts\"."; +"faq.miss_a_callout.answer" = "Soundscape has a list of your recent callouts so that you can revisit callouts you might have missed. To find this, tap the search bar on the home screen. At the bottom of this page, there is a section for \"Recent Callouts\" where the callout you missed will be listed. Alternatively, you can shake your phone to repeat the last callout. To enable this, go to the \"Manage Callouts\" section of the \"Settings\" screen and then turn on \"Repeat Callouts\"."; /* */ @@ -4290,7 +4297,7 @@ /* */ -"faq.supported_headsets.answer" = "Which headphones you use with Soundscape is a matter of personal preference, and each option comes with benefits and trade-offs. The only specific requirement is to use a pair of stereo headphones so that you can take advantage of Soundscape’s 3D spatial audio callouts."; +"faq.supported_headsets.answer" = "Which headphones you use with Soundscape is a matter of personal preference, and each option comes with benefits and trade-offs. The only requirement is to use a pair of stereo headphones so that you can take advantage of Soundscape’s 3D spatial audio callouts."; /* */ @@ -4298,15 +4305,15 @@ /* */ -"faq.battery_impact.answer" = "Battery life varies significantly depending on which iPhone you own and how old it is. The biggest drain on your battery is having the screen on, so to maximise your phone's battery life you should keep the screen locked whenever possible. To help minimise the impact on your iPhone battery Soundscape now has a Sleep Mode and a Snooze Mode. To further reduce the amount of battery you use, when you aren’t using Soundscape, you should force close it via your iPhone’s App Switcher."; +"faq.battery_impact.answer" = "Battery life varies significantly depending on the model and age of your iPhone. The biggest drain on your battery is having the screen on, so to maximise your phone's battery life you should keep the screen locked whenever possible. To help minimise the impact on your iPhone battery, Soundscape has a Sleep mode and a Snooze mode. To further reduce battery usage, when you aren’t using Soundscape, you should force close it via your iPhone’s App Switcher."; /* */ -"faq.sleep_mode_battery.question" = "How do I use Sleep Mode to minimise Soundscape’s impact on my phone battery?"; +"faq.sleep_mode_battery.question" = "How do I use Sleep mode to minimise Soundscape’s impact on my phone battery?"; /* */ -"faq.sleep_mode_battery.answer" = "To put Soundscape in Sleep Mode, select the \"Sleep\" button in the top right-hand corner of the home screen. When you select this, Soundscape will stop using Location Services and mobile data until you wake it up."; +"faq.sleep_mode_battery.answer" = "To put Soundscape in Sleep mode, select the \"Sleep\" button in the top right-hand corner of the home screen. When you select this, Soundscape will stop using Location Services and mobile data until you wake it up."; /* */ @@ -4314,7 +4321,7 @@ /* */ -"faq.snooze_mode_battery.answer" = "To put Soundscape in Snooze Mode, select the \"Sleep\" button in the top right-hand corner of the home screen. Once Soundscape’s in Sleep mode, select the \"Wake up when I leave\" button and Soundscape will go in to a low power state until you leave your current location."; +"faq.snooze_mode_battery.answer" = "To put Soundscape in Snooze mode, select the \"Sleep\" button in the top right-hand corner of the home screen. Once Soundscape’s in Sleep mode, select the \"Wake Up When I Leave\" button and Soundscape will go into a low power state until you leave your current location."; /* */ @@ -4330,7 +4337,7 @@ /* */ -"faq.background_battery_impact.answer" = "Soundscape uses Location Services to determine your location. In our tests, Soundscape does not consume any more battery than the average map application; but if you are concerned about your phone's battery consumption, the following are a few tips which will help lower usage:\n\n1. Turn the screen display off as much as possible when you are not interacting with the app.\n2. When not using the app, close it down. Soundscape uses location services continually when it is running so that it always knows your location, even when you are not moving. Don’t forget to restart the app when you resume your journey.\n3. In cold weather, keep your phone warm as batteries perform more poorly in colder temperatures."; +"faq.background_battery_impact.answer" = "Soundscape uses Location Services to determine where you are. In our tests, Soundscape does not consume any more battery than the average map application; but if you are concerned about your phone's battery consumption, the following are a few tips which will help lower usage:\n\n1. Turn the screen display off as much as possible when you are not interacting with the app.\n2. When not using the app, close it down. Soundscape uses location services continually when it is running so that it always knows your location, even when you are not moving. Don’t forget to restart the app when you resume your journey.\n3. In cold weather, keep your phone warm as batteries perform more poorly in colder temperatures."; /* */ @@ -4338,7 +4345,7 @@ /* */ -"faq.mobile_data_use.answer" = "The amount of mobile data used depends on how you use Soundscape. We have designed Soundscape to use only a small amount of data when you’re out and about by doing things like saving points as you walk around so you don’t need to download them again every time you go back to somewhere you’ve already been. To reduce the amount of mobile data you use, make sure you are connected to Wi-Fi whenever possible, particularly to download the app. When you are not using Soundscape, you should use the \"Sleep\" button to put Soundscape to sleep or force close the app."; +"faq.mobile_data_use.answer" = "The amount of mobile data used depends on how you use Soundscape. We have designed the app to use only a small amount of data when you’re out and about by doing things like saving points as you walk around so you don’t need to redownload them every time you go back to somewhere you’ve been before. To reduce the amount of mobile data you use, make sure you are connected to Wi-Fi whenever possible, particularly to download the app. When you are not using Soundscape, you should use the \"Sleep\" button to put Soundscape to sleep or force close the app."; /* */ @@ -4346,7 +4353,7 @@ /* */ -"faq.difference_from_map_apps.answer" = "Soundscape provides an ambient description of your surroundings in aid of exploration and way-finding. Using spatial audio, Soundscape will call out points of interest, parks, roads, and intersections from the direction they physically are in your immediate environment as you walk. For example, if you pass a shop on your right, you will hear the name of the shop sounding from your right. As you approach an intersection, you will hear each road name sounding from the direction it goes in, beginning to your left, ahead and to the right.\n\nInstead of turn by turn directions as often provided by other map applications, Soundscape will play an audible beacon in the direction of your destination, empowering you to make your way there on your terms using your increased awareness of your surroundings and the location of your destination. Soundscape is designed to run in the background, enabling you to use a turn by turn directions app, all the while continuing to provide environmental awareness as you make your way to your destination."; +"faq.difference_from_map_apps.answer" = "Soundscape provides an ambient description of your surroundings in aid of exploration and wayfinding. Using spatial audio, Soundscape will call out points of interest, parks, roads, and intersections from the direction they physically are in your immediate environment as you walk. For example, if you pass a shop on your right, you will hear the name of the shop sounding from your right. As you approach an intersection, you will hear each road name sounding from the direction it goes in, beginning to your left, ahead and to the right.\n\nInstead of turn-by-turn directions as often provided by other map applications, Soundscape will play an audible beacon in the direction of your destination, empowering you to make your way there on your terms using your increased awareness of your surroundings and the location of your destination. Soundscape is designed to run in the background, enabling you to use a turn-by-turn directions app, all the while continuing to provide environmental awareness as you make your way to your destination."; /* */ @@ -4362,7 +4369,7 @@ /* */ -"faq.controlling_what_you_hear.answer" = "Soundscape provides several ways to control what you hear and when:\n\n1. Immediately stop all audio: Double tap the screen with two fingers to immediately turn off all audio, including any callout that is currently playing and the beacon if it is on. Callouts will resume automatically when you approach the next intersection or point of interest, but the audible beacon will not. Select the \"unmute beacon button\" on the home screen to resume hearing the beacon.\n2. Stop automatic callouts: When you are not traveling or have reached a destination, you probably will not need Soundscape to continue to notify you of things around you. Instead of exiting the app, you can put Soundscape in Snooze mode and it will wake up again when you leave, or you can put Soundscape in Sleep mode and it will stay off until you wake it up. Alternatively, you can select \"Settings\" from the menu and choose to turn all callouts off in the \"Manage Callouts\" section.\n3. Stop the beacon: There are several scenarios for which you might set a destination, but not need the audible beacon on. For example, you may know exactly how to get to your destination, but you just want to get automatic updates about how far away you are. Or, you may know roughly how to get to your destination, and you only need the audio beacon when you're almost there. Whatever the case, you can choose when to hear the beacon by toggling the \"mute beacon\"/\"unmute beacon\" button on the home screen."; +"faq.controlling_what_you_hear.answer" = "Soundscape provides several ways to control what you hear and when:\n\n1. Immediately stop all audio: Double tap the screen with two fingers to immediately turn off all audio, including any callout that is currently playing and the beacon if it is on. Callouts will resume automatically when you approach the next intersection or point of interest, but the audible beacon will not. Select the \"Unmute Beacon\" button on the home screen to resume hearing the beacon.\n2. Stop automatic callouts: When you are not travelling or have reached a destination, you probably will not need Soundscape to continue to notify you of things around you. Instead of exiting the app, you can put Soundscape in Snooze mode and it will wake up when you leave, or you can put Soundscape in Sleep mode and it will stay off until you wake it up. Alternatively, you can select \"Settings\" from the menu and turn all callouts off in the \"Manage Callouts\" section.\n3. Stop the beacon: There are several scenarios for which you might set a destination, but not need the audible beacon on. For example, you may know exactly how to get to your destination, but you just want to get automatic updates about how far away you are. Or, you may know roughly how to get to your destination, and you only need the audio beacon when you're almost there. Whatever the case, you can choose when to hear the beacon by toggling the \"Mute Beacon\"/\"Unmute Beacon\" button on the home screen."; /* */ @@ -4370,7 +4377,7 @@ /* */ -"faq.holding_phone_flat.answer" = "No! While walking you can put the phone away in a bag or pocket or wherever is convenient. Soundscape will use the direction you are walking to figure out which callouts to announce to your left and to your right. When you stop moving, Soundscape does not know which direction you are facing. If the audible beacon is on, you will notice it get quiet until you start moving again. You can pull the phone out to tap the \"Hear My Surroundings\" buttons at the bottom of the home screen at any time, but make sure to hold the phone with the top of the phone pointing in the direction you are facing and with the screen to the sky. In this \"flat\" position, Soundscape will use the phone’s compass to determine which way you are facing and provide accurate spatial callouts. If the beacon is on, you will also notice that it returns to full volume."; +"faq.holding_phone_flat.answer" = "No! While walking you can put the phone away in a bag or pocket or wherever is convenient. Soundscape will use the direction you are walking to figure out which callouts to announce to your left and to your right. When you stop moving, Soundscape does not know which way you are facing. If the audible beacon is on, you will notice it get quiet until you start moving again. You can pull the phone out to tap the \"Hear My Surroundings\" buttons at the bottom of the home screen at any time, but make sure to hold the phone with the top of the phone pointing in the direction you are facing and with the screen to the sky. In this \"flat\" position, Soundscape will use the phone’s compass to determine which way you are facing and provide accurate spatial callouts. If the beacon is on, you will also notice that it returns to full volume."; /* */ @@ -4378,7 +4385,7 @@ /* */ -"faq.personalize_experience.answer" = "Soundscape allows you to customise three key aspects of the callouts you hear as you are walking:\n\n1. Voice: You can choose which of the available voices on iOS you would like Soundscape to use, as well as the speed at which callouts are spoken. From the Menu, select \"Settings\" and then from \"General Settings\" select Voice to adjust the Speaking Rate and Voice settings. Additional voices, including enhanced quality voices, can be downloaded in the iOS Settings app at Settings > Accessibility > Spoken Content > Voices.\n2. Distance Metric: Soundscape allows you to hear all distances in either feet or metres. From the Menu, select \"Settings\" and then from \"General Settings\" select \"Language & Region\". The Units of Measure section allows you to toggle between two options: Imperial (feet) and Metric (metres).\n3. Markers: You can mark your world with anything you care about. You can mark things that are personal and relevant to you like your home, your office and your preferred grocery store. Then Soundscape will automatically call out marked places as you walk by or approach them, or you can also use the Nearby Markers button at the bottom of the home screen to hear a spatial callout of marked places around you. These markers will remain personal to you and will not be available to anyone else.\n\nIn addition to the above, the following VoiceOver settings can influence how Soundscape behaves:\n\n1. VoiceOver Tips: When VoiceOver tips are turned ON, you will hear more information about all the buttons on the primary Soundscape screen. You can turn on VoiceOver tips by navigating to the iOS Settings app and going to Accessibility > VoiceOver > Verbosity, and turning the Speak Hints setting on.\n2. Audio Ducking: Soundscape is designed to work with Audio Ducking turned OFF. When Audio Ducking is on, automatic callouts can be difficult to hear if VoiceOver is used simultaneously. We recommend turning Audio Ducking off to make it easier to hear all automatic callouts that occur as you are interacting with the phone. Audio ducking can be turned off in VoiceOver settings or via the VoiceOver rotor.\n3. Touch ID or Face ID to Unlock: Setting your phone to unlock using Touch ID or Face ID will make unlocking the phone fast and easy, and in turn, allow you to access the My Location, Around Me, and Ahead of Me buttons as quickly as possible when you are on the go. Set up Touch ID or Face ID unlocking in the iOS Settings app."; +"faq.personalize_experience.answer" = "Soundscape allows you to customise three key aspects of the callouts you hear as you are walking:\n\n1. Voice: You can choose which of the available voices on iOS you would like Soundscape to use, as well as the speed at which callouts are spoken. From the Menu, select \"Settings\" and then from \"General Settings\" select \"Voice\" to adjust the Speaking Rate and Voice settings. Additional voices, including enhanced quality voices, can be downloaded in the iOS Settings app at Settings > Accessibility > Read & Speak (Spoken Content) > Voices.\n2. Measuring Distance: Soundscape allows you to hear all distances in either feet or metres. From the Menu, select \"Settings\" and then from \"General Settings\" select \"Language & Region\". The Units of Measure section allows you to toggle between two options: Imperial (feet) and Metric (metres).\n3. Markers: You can mark your world with anything you care about. You can mark things that are personal and relevant to you like your home, your office and your preferred grocery store. Then Soundscape will automatically call out marked places as you walk by or approach them, or you can also use the \"Nearby Markers\" button at the bottom of the home screen to hear a spatial callout of marked places around you. These markers will remain personal to you and will not be available to anyone else.\n\nIn addition to the above, the following settings can influence Soundscape's behaviour:\n\n1. VoiceOver Tips: When VoiceOver tips are turned ON, you will hear more information about all the buttons on the main screen. You can turn on VoiceOver tips by navigating to the iOS Settings app and going to Accessibility > VoiceOver > Verbosity, and turning the Speak Hints setting on.\n2. Audio Ducking: Soundscape is designed to work with Audio Ducking turned OFF. When Audio Ducking is on, automatic callouts can be difficult to hear if VoiceOver is used simultaneously. We recommend turning Audio Ducking off to make it easier to hear all automatic callouts. Audio ducking can be turned off in VoiceOver settings or via the VoiceOver rotor.\n3. Touch ID or Face ID to Unlock: Setting your phone to unlock using Touch ID or Face ID will make unlocking the phone fast and easy, and in turn, allow you to access the \"My Location\", \"Around Me\", and \"Ahead of Me\" buttons as quickly as possible when you are on the go. Set up Touch ID or Face ID unlocking in the iOS Settings app."; /* */ @@ -4394,11 +4401,11 @@ /* */ -"faq.tip.setting_beacon_on_address" = "You can set a beacon on any address. From the home screen, tap on the search bar and then type the address. After selecting the address in the search results, a \"Location Details\" screen will be shown and it has an option to \"Start Audio Beacon\" on the address. In this way, you can set a beacon on businesses, places, points of interest, and residences that are not in Open Street Map."; +"faq.tip.setting_beacon_on_address" = "You can set a beacon on any address. From the home screen, tap on the search bar and then type the address. After selecting the address in the search results, a \"Location Details\" screen will be shown containing the option to \"Start Audio Beacon\" on the address. In this way, you can set a beacon on businesses, places, points of interest, and residences that are not in Open Street Map."; /* */ -"faq.tip.finding_bus_stops" = "You can find nearby bus stops by selecting the \"Public Transport\" filter in the Nearby Places list."; +"faq.tip.finding_bus_stops" = "You can find nearby bus stops by selecting the \"Public Transport\" filter in the Places Nearby list."; /* */ @@ -4406,7 +4413,7 @@ /* */ -"faq.tip.turning_off_auto_callouts" = "If you still want to interact with Soundscape but don’t want to hear automatic callouts, you can turn them off by going to the \"Manage Callouts\" section of the \"Settings\" screen from the menu and then turn off \"Allow Callouts\". Or, if you aren’t going to be using Soundscape, you can put it in either Sleep or Snooze mode using the \"Sleep\" button on the home screen."; +"faq.tip.turning_off_auto_callouts" = "If you still want to interact with Soundscape but don’t want to hear automatic callouts, you can turn callouts off by going to the \"Manage Callouts\" section of the \"Settings\" screen from the menu. Or, if you aren’t going to be using Soundscape, you can put it in either Sleep or Snooze mode using the \"Sleep\" button on the home screen."; /* */ @@ -4414,7 +4421,7 @@ /* */ -"faq.tip.create_marker_at_bus_stop" = "If there is a bus route you take regularly, set your pickup and exit stops as Markers. This way they will be saved so you can find them again easily, just go to \" Markers & Routes\" from the home screen and find them on the \"Markers\" page. You can set a beacon on them and you will get periodic updates on how close you are to your exit stop. Note: you can turn off the rhythmic sound and you will still get distance updates along the way."; +"faq.tip.create_marker_at_bus_stop" = "If there is a bus route you take regularly, set your pickup and exit stops as markers. This way they will be saved so you can find them again easily, just go to \"Markers & Routes\" from the home screen and find them on the \"Markers\" page. You can set a beacon on them and you will get periodic updates on how close you are to your exit stop. Note: you can turn off the rhythmic sound and you will still get distance updates along the way."; /* */ @@ -4445,15 +4452,15 @@ "osm.tag.fast_food" = "Fast Food"; "osm.tag.coffee_shop" = "Coffee Shop"; "whats_new.1_2_0.0.title" = "Shake to Repeat the Last Callout"; -"whats_new.1_2_0.0.description" = "You can now shake your device to repeat the last callout. To enable this feature, switch on the 'Repeat Callouts' toggle in settings."; +"whats_new.1_2_0.0.description" = "You can now shake your device to repeat the last callout. To enable this feature, switch on the \"Repeat Callouts\" toggle in settings."; "whats_new.1_2_0.1.title" = "Beacon Mute Distance Setting"; "whats_new.1_2_0.2.title" = "Categories in Places Nearby"; -"whats_new.1_2_0.2.description" = "You can now filter the places nearby list by categories such as public transport, Food & Drink, etc."; +"whats_new.1_2_0.2.description" = "You can now filter the Places Nearby list by categories such as Public Transport, Food & Drink, etc."; "settings.about.title.copyright" = "Copyright Notices"; "first_launch.permissions.motion" = "Motion & Fitness"; "osm.tag.bar" = "Bar"; "osm.tag.ice_cream" = "Ice Cream"; -"whats_new.1_2_0.1.description" = "You can now adjust the distance at which the beacon is automatically muted when you approach. You can adjust this setting in Audio Beacon settings.\n\nWe would particularly welcome feedback on your experience with setting different distances (0, 5, and 10 metres), for the Audio Beacon to switch off. In our internal testing we are seeing some inconsistencies in behaviour and are keen to get feedback from a wider base of users."; +"whats_new.1_2_0.1.description" = "You can now adjust the distance at which the beacon is automatically muted when you approach. Just go to the Audio Beacon settings and move the \"Audio Mute Distance\" slider."; "osm.tag.pub" = "Pub"; "mail.default" = "Default"; "mail.msoutlook" = "Microsoft Outlook"; @@ -4461,22 +4468,25 @@ "mail.gmail" = "Gmail"; "mail.spark" = "Spark"; "mail.airmail" = "Airmail"; -"donation.body" = "Please support the ongoing development of the Soundscape Community app by donating on our fundraising page. Every donation brings us a step closer to our vision of helping bring about a world where EVERYONE has equal access to information on their surroundings through our life-enhancing technology."; +"donation.body" = "Please support the ongoing development of the Soundscape Community app by donating on our fundraising page. Every donation brings us a step closer to our vision of helping bring about a world where EVERYONE has equal access to information on their surroundings through our life-enhancing technology."; "menu.donate" = "Donate"; "donation.title" = "Donate to Soundscape Community"; "donation.link" = "Go to Fundraising Page"; "help.using_headsets.bose_frames.how.1" = "Connecting a Device:
Go to the \"Head Tracking Headphones\" item in the Soundscape menu to connect your Bose Frames and follow the instructions on screen. Note that you will need to pair your Bose Frames to your phone in the Bluetooth settings before connecting them in Soundscape."; "help.using_headsets.bose_frames.when" = "You can use Bose Frames with Soundscape anytime you would normally use Soundscape. Using Bose Frames provides you with high quality audio that does not occlude environmental audio and allows you to have a more hands-free experience."; "help.using_headsets.bose_frames.title" = "Using Bose Frames"; -"help.using_headsets.bose_frames.how.2" = "Calibrating your Headphones:
Your Bose Frames will need to be calibrated to accurately know which way you are facing. Each time you connect them to Soundscape, you will be informed that calibration is needed by an audio chime. To calibrate your Bose Frames, follow the instructions provided on the screen. When the chime stops playing, Your Bose Frames are calibrated, and Soundscape will now track the direction of your head so you do not need to hold the phone in your hand. You can also repeat this calibration at any time, even if the chime isn't playing, if you think the accuracy of your spatial audio is poor."; +"help.using_headsets.bose_frames.how.2" = "Calibrating your Headphones:
Your Bose Frames will need to be calibrated to accurately know which way you are facing. Each time you connect them to Soundscape, you will be informed that calibration is needed by an audio chime. To calibrate your Bose Frames, follow the instructions provided on the screen. When the chime stops playing, Your Bose Frames are calibrated, and Soundscape will now track the direction of your head so you do not need to hold the phone in your hand. You can repeat this calibration at any time, even if the chime isn't playing, if you think the accuracy of your spatial audio is poor."; "help.using_headsets.bose_frames.how.3" = "Using the Media Controls on your Headphones:
When media controls are enabled in the Soundscape settings, you can use the media controls on your Bose Frames to mute or unmute the beacon, to call out your location or to repeat the last callout. For more information, see the \"Using Media Controls\" help section."; -"help.using_headsets.bose_frames.how.4" = "Troubleshooting your headphones:
If you are having trouble connecting your Bose Frames to Soundscape, ensure they are one of the supported models - the Altos or Rondos. If they are one of these models, then ensure that the Frames are appearing in the Bose Connect app. If they are showing and you are still having trouble with the connection, try unpairing and re-pairing the headphones via your phone's Bluetooth menu.
Support for the Bose Frames is new and we would love to hear your feedback. You can contact us by choosing the \"Send Feedback\" Option in the menu."; -"help.using_headsets.bose_frames.what" = "Soundscape supports spatial audio with dynamic head tracking when using the Alto or Rondo versions of the Bose Frames. Once they're connected, sensors in the Bose Frames tell Soundscape the direction your head is facing. This helps Soundscape to improve your audio experience, making it more natural as you move around in the world. When you use Soundscape with Bose Frames connected, you do not need to hold your phone for Soundscape to work correctly."; +"help.using_headsets.bose_frames.how.4" = "Troubleshooting your headphones:
If you are having trouble connecting your Bose Frames to Soundscape, ensure they are one of the supported models - the Altos or Rondos. If they are one of these models, then ensure that the Frames are appearing in the Bose Connect app. If they are showing and you are still having trouble with the connection, try unpairing and re-pairing the headphones via your phone's Bluetooth menu.
We would love to hear your feedback about the Bose Frames support. You can contact us by choosing the \"Send Feedback\" option in the menu."; +"help.using_headsets.bose_frames.what" = "Soundscape supports spatial audio with head tracking when using the Alto or Rondo versions of the Bose Frames. Once they're connected, sensors in the Bose Frames tell Soundscape the direction your head is facing. This helps Soundscape to improve your audio experience, making it more natural as you move around in the world. When you use Soundscape with Bose Frames connected, you do not need to hold your phone for the app to work correctly."; "whats_new.1_3_0.0.title" = "Bose Frames Support"; -"whats_new.1_3_0.0.description" = "Soundscape now supports spatial audio with dynamic head tracking when using the Alto or Rondo versions of the Bose Frames. Once they're connected, sensors in the Bose Frames tell Soundscape the direction your head is facing. This helps Soundscape to improve your audio experience, making it more natural as you move around in the world. When you use Soundscape with Bose Frames connected, you do not need to hold your phone for Soundscape to work correctly. To get started, go to the \"Head Tracking Headphones\" item in the Soundscape menu to connect your Bose Frames and follow the instructions on screen. Note that you will need to pair your Bose Frames to your phone in the Bluetooth settings before connecting them in Soundscape."; +"whats_new.1_3_0.0.description" = "Soundscape now supports head tracking with the Alto or Rondo versions of the Bose Frames. Once they're connected, your Bose Frames will tell Soundscape where you are facing, helping Soundscape to improve your audio experience. To connect your Bose Frames to Soundscape, go to the \"Head Tracking Headphones\" item in the Soundscape menu."; "whats_new.1_3_0.1.title" = "Testing in Texas"; -"whats_new.1_3_0.1.description" = "If you live in the Austin or San Antonio areas in Texas and would like to help us test a feature we are working on with NaviLens, please get in touch via the Send Feedback button from the main menu."; -"location_detail.action.navilens.hint" = "Double tap to launch NaviLens."; -"navilens.title" = "Launch NaviLens"; +"whats_new.1_3_0.1.description" = "If you live in the Austin or San Antonio areas in Texas and would like to help us test a feature we are working on with NaviLens, please get in touch via the \"Send Feedback\" button from the menu."; +"beacon.action.navilens" = "Launch NaviLens"; +"location_detail.action.beacon_or_navilens.hint" = "Double tap to launch NaviLens or set an audio beacon, based on how close this location is"; "troubleshooting.tile_server_url.explanation" = "This is the server from which Soundscape retrieves map data. You normally should not need to change this unless you are developing or testing Soundscape."; "troubleshooting.tile_server_url" = "Tile Server URL"; +"troubleshooting.user_data" = "User Data"; +"troubleshooting.user_data.button" = "Delete All Markers and Routes"; +"troubleshooting.user_data.explanation" = "Delete all map data, including saved markers and routes. This action cannot be undone."; diff --git a/apps/ios/GuideDogs/Assets/Localization/en-US.lproj/Localizable.strings b/apps/ios/GuideDogs/Assets/Localization/en-US.lproj/Localizable.strings index 2048080e0..b247ba6ee 100644 --- a/apps/ios/GuideDogs/Assets/Localization/en-US.lproj/Localizable.strings +++ b/apps/ios/GuideDogs/Assets/Localization/en-US.lproj/Localizable.strings @@ -197,10 +197,10 @@ "general.error.location_services.authorize.description" = "Soundscape uses your location to find and tell you about the places and things around you. The app needs your permission to use Location Services."; /* Error message to authorize location services. Quotes written as \" Keep newlines (\n) between sentences.. {NumberedPlaceholder="\n"} */ -"general.error.location_services.authorize.instructions" = "1. Open the Settings app below\n2. Select \"Location\"\n3. Select \"Always\" or \"While Using the App\""; +"general.error.location_services.authorize.instructions" = "1. Open the Settings app below\n2. Select Location\n3. Select Always or While Using the App"; /* Error message to turn on precise location. Ensure "Precise Location" is translated the same as in the iOS Settings app under Maps > Location > Precise Location (this refers to an Apple feature called "Precise Location" in US English). Quotes written as \". Keep newlines (\n) between sentences. {NumberedPlaceholder="\n"} */ -"general.error.location_services.precise_location.instructions" = "1. Open the Settings app below\n2. Select \"Location\"\n3. Turn on \"Precise Location\""; +"general.error.location_services.precise_location.instructions" = "1. Open the Settings app below\n2. Select Location\n3. Turn on Precise Location"; /* Error message to open Soundscape to resume setting location services. "Location Services" is an iOS term that can be found in the Privacy section in the iPhone Settings app. {NumberedPlaceholder="Soundscape"} */ "general.error.location_services_resume" = "Open Soundscape to resume Location Services"; @@ -212,16 +212,16 @@ "general.error.location_services_enable_description" = "Location Services are currently disabled. Soundscape cannot work when Location Services are turned off."; /* Error message to turn on location services in Soundscape to continue with instructions on how to do so on device. Keep newlines (\n) between sentences. "Location Services" is an iOS term that can be found in the Privacy section in the iPhone Settings app. {NumberedPlaceholder="\n"} */ -"general.error.location_services_enable_instructions.2" = "Turn Location Services On in the Settings app to continue.\n\n1. Press the back button (titled Settings)\n2. Select Privacy & Security\n3. Select Location Services\n4. Turn On Location Services"; +"general.error.location_services_enable_instructions.2" = "Turn Location Services On in the Settings app to continue.\n\n1. Press the back button until you get to the main settings\n2. Select Privacy & Security\n3. Select Location Services\n4. Turn On Location Services"; /* Error message to turn on location services in Soundscape to continue with instructions on how to do so on device. Keep newlines (\n) between sentences. "Location Services" is an iOS term that can be found in the Privacy section in the iPhone Settings app. {NumberedPlaceholder="\n"} */ -"general.error.location_services_enable_instructions.3" = "Turn Location Services On in the Settings app to continue.\n\n1. Press Open Settings\n2. Press the back button (titled Settings)\n3. Select Privacy & Security\n4. Select Location Services\n5. Turn On Location Services"; +"general.error.location_services_enable_instructions.3" = "Turn Location Services On in the Settings app to continue.\n\n1. Press Open Settings\n2. Press the back button until you get to the main settings\n3. Select Privacy & Security\n4. Select Location Services\n5. Turn On Location Services"; /* Error message Sounscape is haveing trouble determining current location */ "general.error.location_services_find_location_error" = "We are having trouble finding your current location."; /* Error message when Soundscape does not know the user's heading */ -"general.error.heading" = "Soundscape is not sure which direction you are facing. Please hold your phone flat or begin walking and try again."; +"general.error.heading" = "Soundscape is not sure which direction you are facing. Please hold your phone flat or begin walking and try again"; /* Error message Soundscape is having trouble determining current location. Try again later */ "general.error.location_services_find_location_error.try_again" = "We are having trouble finding your current location. Try again later."; @@ -240,7 +240,7 @@ "general.error.network_connection_required" = "Network Connection Required"; /* Error message that the internet is not connected. {NumberedPlaceholder="Soundscape"} */ -"general.error.network_connection_required.deleting_data" = "A network connection is required when deleting and reloading Soundscape's map data. Check that your phone is not in airplane mode."; +"general.error.network_connection_required.deleting_data" = "A network connection is required when deleting and reloading Soundscape's map data. Check that your phone is not in Airplane Mode."; //------------------------------------------------------------------------------ // MARK: Errors (BLE) @@ -279,7 +279,7 @@ "device_motion.enable.description" = "Motion & Fitness tracking is currently disabled. Soundscape cannot work when Motion & Fitness tracking is turned off."; /* Notification to enable motion and fitness activity on the device. Keep newlines (\n) between sentences. Ensure that "Motion & Fitness" is translated the same as `device_motion.title`. {NumberedPlaceholder="Soundscape"} */ -"device_motion.enable.instructions" = "Turn On Fitness Tracking in the Settings app to continue.\n\n1. Press Open Settings\n2. Press the Back button (titled Settings)\n3. Select Privacy & Security\n4. Select Motion & Fitness\n5. Turn on Fitness Tracking\n6. Restart Soundscape"; +"device_motion.enable.instructions" = "Turn On Fitness Tracking in the Settings app to continue.\n\n1. Press Open Settings\n2. Press the back button until you get to the main settings\n3. Select Privacy & Security\n4. Select Motion & Fitness\n5. Turn on Fitness Tracking\n6. Restart Soundscape"; //------------------------------------------------------------------------------ // MARK: Motion & Fitness (Authorize) @@ -327,19 +327,19 @@ "settings.clear_cache.alert_title" = "Delete Stored Data?"; /* Message, Soundscape stores map data to reduce device data and battery consumption {NumberedPlaceholder="Soundscape"} */ -"settings.clear_cache.alert_message" = "Soundscape stores map data to reduce data and battery consumption. Deleting stored data will require Soundscape to reload the data."; +"settings.clear_cache.alert_message" = "Soundscape stores map data to reduce cellular data and battery consumption. Deleting stored data will require Soundscape to reload the data."; /* Alert, would you like to keep saved markers */ -"settings.clear_cache.markers.alert_title" = "Keep Markers and Routes?"; +"settings.clear_cache.markers.alert_title" = "Delete Markers and Routes?"; -/* Message, chose delete or keep. Quotes written as \" Delete removes markers and beacons resetting the app to a new installation build and cannot be undone. Keep only removes map data. */ -"settings.clear_cache.markers.alert_message" = "Choose \"Delete\" to remove markers, beacons and routes, or \"Keep\" to only remove map data. \"Delete\" will reset the app back to a freshly installed state and cannot be undone!"; +/* Quotes written as \" Delete removes markers and beacons resetting the app to a new installation build and cannot be undone. */ +"settings.clear_cache.markers.alert_message" = "Are you sure you want to delete all markers and routes? Choosing \"Delete\" will reset the app back to a freshly installed state and cannot be undone!"; /* Alert title, the stored data wasn't deleted */ "settings.clear_cache.no_service.title" = "Unable to Clear Stored Map Data"; /* Message, the cached data cannot be deleted when there is no internet connection */ -"settings.clear_cache.no_service.message" = "Soundscape is currently unable to connect to the internet. An internet connection is required when clearing the stored map data so that the map data can be refreshed."; +"settings.clear_cache.no_service.message" = "Soundscape is currently unable to connect to the internet. An internet connection is required when clearing the stored map data so that the data can be refreshed."; /* Alert, opt-out of app telemetry */ "settings.telemetry.optout.alert_title" = "Telemetry Opt-Out"; @@ -490,13 +490,13 @@ "voice.apple.preview" = "This is %@. How does this sound?"; /* Hint explaining that if the user double taps a voice in the list of voices, it will be selected and a preview will be played. */ -"voice.apple.preview_hint" = "Double tap to select and play a preview."; +"voice.apple.preview_hint" = "Double tap to select and play a preview"; /* This is the title of an alert presented to the user when they selecte a default version of a voice which has an enhanced version to inform them that they can download an enhanced version from the iOS Settings app */ "voice.settings.enhanced_available.title" = "Enhanced Voice Available!"; /* This is an alert presented to the user when they select a default version of a voice which has an enhanced version to inform them that they can download an enhanced version from the iOS Settings app, "Spoken Content" should be translated the same way it is in the iOS Settings app under Accessibility > Spoken Content, {NumberedPlaceholder="iOS"} */ -"voice.settings.enhanced_available" = "A higher quality version of this voice may be available. To download it and other voices, go to the Spoken Content section of the iOS accessibility settings."; +"voice.settings.enhanced_available" = "A higher quality version of this voice may be available. To download it and other voices, go to the Read & Speak section of the iOS accessibility settings."; /* This is one of the options available to the user when they are presented with the alert described by the key ""voice.settings.enhanced_available" */ "voice.settings.enhanced_available.button" = "Use Current Version"; @@ -569,7 +569,7 @@ "troubleshooting.check_audio" = "Check Audio"; /* Voiceover hint that explains the action of the "Check Audio" button. */ -"troubleshooting.check_audio.hint" = "Double tap to check the status of the headphones you are using with Soundscape."; +"troubleshooting.check_audio.hint" = "Double tap to check the status of your headphones"; /* Explanation of what the "Check Audio" button does, displayed below the button */ "troubleshooting.check_audio.explanation" = "Tap this button to hear about the status of the headphones you are using with Soundscape."; @@ -578,11 +578,20 @@ "troubleshooting.cache" = "Map Data"; /* VoiceOver hint that explains the action of the "Delete Stored Map Data" button */ -"troubleshooting.cache.hint" = "Double tap to delete and reload stored map data."; +"troubleshooting.cache.hint" = "Double tap to delete and reload stored map data"; /* Explanation of what the "Delete Stored Map Data" button does, displayed below the button */ "troubleshooting.cache.explanation" = "Soundscape downloads map data as you walk around so that it can tell you about the things and places around you. If you are having issues with Soundscape or it is using too much memory, you can clear the stored map data and Soundscape will only redownload the map data near your current location."; +/* Title for the user data section in troubleshooting */ +"troubleshooting.user_data" = "User Data"; + +/* Label for the button that allows user to delete all map data, including saved markers and routes */ +"troubleshooting.user_data.button" = "Delete All Markers and Routes"; + +/* Explanation for the user data section in troubleshooting */ +"troubleshooting.user_data.explanation" = "Delete all map data, including saved markers and routes. This action cannot be undone."; + //------------------------------------------------------------------------------ // MARK: Settings (About) //------------------------------------------------------------------------------ @@ -610,10 +619,10 @@ "settings.new_feature.num_of_num" = "%1$@ of %2$@"; /* Settings new feature, instruction to double tap to close announcements */ -"settings.new_feature.accept_button.acc_label" = "Double tap to close announcements."; +"settings.new_feature.accept_button.acc_label" = "Double tap to close announcements"; /* Settings new feature, instruction to double tap to view next update announcement */ -"settings.new_feature.accept_button.acc_hint" = "Double tap to view next update announcement."; +"settings.new_feature.accept_button.acc_hint" = "Double tap to view next update announcement"; /* Settings New Feature, title Recent Updates */ "settings.new_feature.recent_updates" = "Recent Updates"; @@ -683,19 +692,19 @@ "beacon.action.remove_beacon" = "Remove Beacon"; /* Notification, Double tap this button to remove current audio beacon */ -"beacon.action.remove_beacon.double_tap.acc_hint" = "Double tap to remove the current audio beacon."; +"beacon.action.remove_beacon.double_tap.acc_hint" = "Double tap to remove the current audio beacon"; /* Button, Mute Beacon */ "beacon.action.mute_beacon" = "Mute Beacon"; /* Notification, Double tap to mute the audio beacon */ -"beacon.action.mute_beacon.acc_hint" = "Double tap to mute the audio beacon."; +"beacon.action.mute_beacon.acc_hint" = "Double tap to mute the audio beacon"; /* Button, Unmute Beacon */ "beacon.action.unmute_beacon" = "Unmute Beacon"; /* Notification, Double tap to unmute the audio beacon */ -"beacon.action.unmute_beacon.acc_hint" = "Double tap to unmute the audio beacon."; +"beacon.action.unmute_beacon.acc_hint" = "Double tap to unmute the audio beacon"; /* Button, Mute or Unmute Beacon */ "beacon.action.mute_unmute_beacon" = "Mute or Unmute Beacon"; @@ -703,14 +712,17 @@ /* Button, Call out Beacon */ "beacon.action.callout_beacon" = "Call out Beacon"; +/* Button, Launch NaviLens */ +"beacon.action.navilens" = "Launch NaviLens"; + /* Notification, Double tap to unmute or mute the audio beacon */ -"beacon.action.mute_unmute_beacon.acc_hint" = "Double tap to mute or unmute the audio beacon."; +"beacon.action.mute_unmute_beacon.acc_hint" = "Double tap to mute or unmute the audio beacon"; /* Title text of the button used to view the detail view */ "beacon.action.view_details" = "View Details"; /* Hint text of the button used to view the detail view */ -"beacon.action.view_details.acc_hint.details" = "Double tap to view additional details."; +"beacon.action.view_details.acc_hint.details" = "Double tap to view additional details"; /* Button, Beacon Distance Update */ "beacon.distance_update" = "Beacon Distance Update"; @@ -721,6 +733,9 @@ /* Notification, Beacon location nearby. Audio beacon has been muted. */ "beacon.beacon_location_within_audio_beacon_muted" = "Beacon within %@. Audio beacon has been muted."; +/* Suggest the user launch NaviLens for the remaining distance. Appended to beacon.beacon_location_within_audio_beacon_muted. */ +"beacon.suggest_navilens" = "Use the NaviLens button to take you to your destination."; + //------------------------------------------------------------------------------ // MARK: - Preview //------------------------------------------------------------------------------ @@ -747,7 +762,7 @@ "preview.content.edge.text" = "%1$@ on %2$@"; /* Accessibility hint for the button to select a direction of travel */ -"preview.content.edge.text.accessibility_hint" = "Double tap to move to the next intersection."; +"preview.content.edge.text.accessibility_hint" = "Double tap to move to the next intersection"; /* Title for button to go to the next intersection */ "preview.go.title" = "Go"; @@ -756,13 +771,13 @@ "preview.go_back.title" = "Previous"; /* Accessibility hint for button to go back */ -"preview.go_back.accessibility_text" = "Double tap to go back to your previous intersection."; +"preview.go_back.accessibility_text" = "Double tap to go back to your previous intersection"; /* Text for the "Search" button */ "preview.search.label" = "Explore Nearby"; /* Accessibility hint for the "Explore" button */ -"preview.search.accessibility_hint" = "Double tap to search or browse nearby places."; +"preview.search.accessibility_hint" = "Double tap to search or browse nearby places"; /* Title for the alert displayed when ther user tries to restart the preview experience at a new location */ "preview.alert.restart.title" = "Preview Already in Progress"; @@ -840,13 +855,13 @@ "preview.include_unnamed_roads.label.on" = "Disable Unnamed Roads"; /* Voiceover hint for a button to turn on a setting to include unnamed roads. {NumberedPlaceholder="Soundscape Street Preview"} */ -"preview.include_unnamed_roads.hint.off" = "Double tap to include unnamed roads during Soundscape Street Preview."; +"preview.include_unnamed_roads.hint.off" = "Double tap to include unnamed roads during Soundscape Street Preview"; /* Voiceover hint for a button to turn off a setting to include unnamed roads. {NumberedPlaceholder="Soundscape Street Preview"} */ -"preview.include_unnamed_roads.hint.on" = "Double tap to exclude unnamed roads during Soundscape Street Preview."; +"preview.include_unnamed_roads.hint.on" = "Double tap to exclude unnamed roads during Soundscape Street Preview"; /* Accessibility hint for the button to end the preview tutorial */ -"preview.tutorial.done.hint" = "Double tap to exit the tutorial."; +"preview.tutorial.done.hint" = "Double tap to exit the tutorial"; /* Title for the first set of tutorial content. {NumberedPlaceholder="Soundscape Street Preview"} */ "preview.tutorial.title.1" = "Welcome to Soundscape Street Preview!"; @@ -885,35 +900,35 @@ /* Title for the action to set a beacon */ "location_detail.action.beacon" = "Start Audio Beacon"; +/* Text label for the action to start audio beacon at a NaviLens-enabled location */ +"location_detail.action.beacon_or_navilens" = "Start NaviLens or Audio Beacon"; + /* Voiceover hint for the action to set a beacon */ -"location_detail.action.beacon.hint" = "Double tap to set an audio beacon at this location."; +"location_detail.action.beacon.hint" = "Double tap to set an audio beacon at this location"; + +/* Voiceover hint for the action to set a beacon or launch NaviLens */ +"location_detail.action.beacon_or_navilens.hint" = "Double tap to launch NaviLens or set an audio beacon, based on how close this location is"; /* Text displayed when audio beacon action is disabled */ -"location_detail.action.beacon.hint.disabled" = "Setting a new audio beacon is disabled while route guidance is active."; +"location_detail.action.beacon.hint.disabled" = "Setting a new audio beacon is disabled while route guidance is active"; /* Voiceover hint for the action to save marker */ -"location_detail.action.save.hint" = "Double tap to save this location as a marker."; +"location_detail.action.save.hint" = "Double tap to save this location as a marker"; /* Voiceover hint for the action to edit marker */ -"location_detail.action.edit.hint" = "Double tap to edit marker."; +"location_detail.action.edit.hint" = "Double tap to edit marker"; /* Voiceover hint for the action to share */ -"location_detail.action.share.hint" = "Double tap to share this location."; +"location_detail.action.share.hint" = "Double tap to share this location"; /* Voiceover hint for the action to preview */ -"location_detail.action.preview.hint" = "Double tap to start previewing at this location."; +"location_detail.action.preview.hint" = "Double tap to start previewing at this location"; /* Text displayed when street preview is disabled */ -"location_detail.action.preview.hint.disabled" = "Street Preview is disabled while route guidance is active."; - -/* Text label for the action to launch NaviLens */ -"navilens.title" = "Launch NaviLens"; - -/* Voiceover hint for the action to launch NaviLens */ -"location_detail.action.navilens.hint" = "Double tap to launch NaviLens."; +"location_detail.action.preview.hint.disabled" = "Street Preview is disabled while route guidance is active"; /* Voiceover hint for the action to get directions */ -"location_detail.action.directions.hint" = "Double tap to open this location in an external maps app."; +"location_detail.action.directions.hint" = "Double tap to open this location in an external maps app"; /* Default address for a location */ "location_detail.default.address" = "Address unknown"; @@ -922,7 +937,7 @@ "location_detail.default.annotation" = "No marker annotation"; /* Accessibility hint to select a location */ -"location.select.hint" = "Double tap to select this location."; +"location.select.hint" = "Double tap to select this location"; /* Text displayed when the location cannot be saved as a marker */ "location_detail.disabled.save" = "Saving a marker at this location is currently unavailable"; @@ -937,13 +952,13 @@ "location_detail.map.view.title" = "Selected Location"; /* Hint text displayed when the user is viewing the expanded map view */ -"location_detail.map.view.hint" = "Edit to select a new location."; +"location_detail.map.view.hint" = "Edit to select a new location"; /* Title text displayed when the user is selecting a location via the expanded map view */ "location_detail.map.edit.title" = "Edit Location"; /* Hint text displayed when the user is selecting a location via the expanded map view */ -"location_detail.map.edit.hint" = "Move the map to the correct location."; +"location_detail.map.edit.hint" = "Move the map to the correct location"; /* Accessibility label used when the user is moving the marker location via custom Voiceover experience, Here, "nudge" means moving a small distance. */ "location_detail.map.edit.accessibility_label" = "Nudge Marker"; @@ -991,13 +1006,13 @@ "location_detail.waypoint" = "Waypoint %@"; /* Accessibility hint for markers in a list which has already been added to a route */ -"location_detail.add_waypoint.existing.hint" = "Double tap to remove this marker from your route."; +"location_detail.add_waypoint.existing.hint" = "Double tap to remove this marker from your route"; /* Accessibility hint for markers in a list that can be added to a list */ -"location_detail.add_waypoint.new.hint" = "Double tap to add this marker to your route."; +"location_detail.add_waypoint.new.hint" = "Double tap to add this marker to your route"; /* Accessibility hint for markers in a list that can be created abd added to a list */ -"location_detail.add_waypoint.marker.hint" = "Double tap to create a marker and add it as a waypoint."; +"location_detail.add_waypoint.marker.hint" = "Double tap to create a marker and add it as a waypoint"; //------------------------------------------------------------------------------ // MARK: - Route Detail @@ -1022,40 +1037,40 @@ "route_detail.action.edit" = "Edit Route"; /* Accessibility hint for the reversed route button on the Route Detail screen */ -"route_detail.action.start_reversed_route.hint" = "Double tap to start this route in reverse."; +"route_detail.action.start_reversed_route.hint" = "Double tap to start this route in reverse"; /* Voiceover hint for the action to start the route in reverse when the action is disabled. This action is only disabled when no waypoints have been added to a route yet. */ -"route_detail.action.start_reversed_route.disabled.hint" = "Add waypoints before starting the route in reverse."; +"route_detail.action.start_reversed_route.disabled.hint" = "Add waypoints before starting the route in reverse"; /* Voiceover hint for the action to start the route */ -"route_detail.action.start_route.hint" = "Double tap to start this route."; +"route_detail.action.start_route.hint" = "Double tap to start this route"; /* Voiceover hint for the action to start the route when the action is disabled. This action is only disabled when no waypoints have been added to a route yet. */ -"route_detail.action.start_route.disabled.hint" = "Add waypoints before starting the route."; +"route_detail.action.start_route.disabled.hint" = "Add waypoints before starting the route"; /* Voiceover hint for the action to stop the route */ -"route_detail.action.stop_route.hint" = "Double tap to stop this route."; +"route_detail.action.stop_route.hint" = "Double tap to stop this route"; /* Voiceover hint for the action to start the recreational activity. In this context, "activity" is referring to outdoor recreational activities like hiking, kayaking, snoeshoeing, etc. */ -"route_detail.action.start_event.hint" = "Double tap to start this activity."; +"route_detail.action.start_event.hint" = "Double tap to start this activity"; /* Voiceover hint for the action to pause the recreational activity. In this context, "activity" is referring to outdoor recreational activities like hiking, kayaking, snoeshoeing, etc. */ -"route_detail.action.stop_event.hint" = "Double tap to stop this activity and save your progress."; +"route_detail.action.stop_event.hint" = "Double tap to stop this activity and save your progress"; /* Voiceover hint for the action to reset the recreational activity so that the user can try it again. In this context, "activity" is referring to outdoor recreational activities like hiking, kayaking, snoeshoeing, etc. */ -"route_detail.action.reset.hint" = "Double tap to reset this activity and download any available updates."; +"route_detail.action.reset.hint" = "Double tap to reset this activity and download any available updates"; /* Voiceover hint for the action to share */ -"route_detail.action.share.hint" = "Double tap to share this route."; +"route_detail.action.share.hint" = "Double tap to share this route"; /* Accessibility hint for the edit button on the Route Detail screen */ -"route_detail.action.edit.hint" = "Double tap to edit this route."; +"route_detail.action.edit.hint" = "Double tap to edit this route"; /* Add button on the Route list screen */ "route_detail.action.create" = "New Route"; /* VoiceOver hint for the add button on the Route list screen */ -"route_detail.action.create.hint" = "Double tap to create a new route."; +"route_detail.action.create.hint" = "Double tap to create a new route"; /* Accessbility label for the index of a waypoint in a route and an indication that the audio beacon is currently playing on this waypoint's location, %@ is the index, "Waypoint 2. Current beacon." {NumberedPlaceholder="%@"} */ "route_detail.waypoint.current_beacon" = "Waypoint %@. Current beacon."; @@ -1109,13 +1124,13 @@ "route_detail.action.previous" = "Previous Waypoint"; /* Hint text of the button used to move to the previous waypoint */ -"route_detail.action.previous.hint" = "Double tap to set the beacon on the previous waypoint."; +"route_detail.action.previous.hint" = "Double tap to set the beacon on the previous waypoint"; /* Title text of the button used to move to the next waypoint */ "route_detail.action.next" = "Next Waypoint"; /* Hint text of the button used to move to the next waypoint */ -"route_detail.action.next.hint" = "Double tap to set the beacon on the next waypoint."; +"route_detail.action.next.hint" = "Double tap to set the beacon on the next waypoint"; /* Text displayed in cluster annotations on the map. %@ is the index of the first clustered annotation and the +... indicates that there are additional annotations in that cluster {NumberedPlaceholder="%@"} */ "waypoint_detail.annotation.cluster.title" = "%@,..."; @@ -1200,7 +1215,7 @@ "tour.progress.elapsed_distance.accessibility" = "Beacon set on %1$@. %2$@. %3$@ elapsed. %4$@ waypoints remaining"; /* Accessibility label for the progress view, %1$@ is the waypoint name, %2$@ is the distance, %3$@ is the number of remaining waypoints, "Beacon set on home. 450 feet NW. 2 waypoints remaining." {NumberedPlaceholder="%1$@","%2$@","%3$@"} */ -"tour.progress.distance.accessibility" = "Beacon set on %1$@, %2$@, %3$@ waypoints remaining"; +"tour.progress.distance.accessibility" = "Beacon set on %1$@. %2$@. %3$@ waypoints remaining"; /* Accessibility label for the progress view, %1$@ is the waypoint name, %2$@ is the time elapsed, %3$@ is the number of remaining waypoints, "Beacon set on home. 02:31 elapsed. 2 waypionts remaining." {NumberedPlaceholder="%1$@","%2$@","%3$@"} */ "tour.progress.elapsed.accessibility" = "Beacon set on %1$@. %2$@ elapsed. %3$@ waypoints remaining"; @@ -1212,7 +1227,7 @@ "tour.progress.elapsed_distance.accessibility.singular" = "Beacon set on %1$@. %2$@. %3$@ elapsed. 1 waypoint remaining"; /* Accessibility label for the progress view, %1$@ is the waypoint name, %2$@ is the distance, "Beacon set on home. 450 feet NW. 1 waypoint remaining." {NumberedPlaceholder="%1$@","%2$@"} */ -"tour.progress.distance.accessibility.singular" = "Beacon set on %1$@, %2$@, 1 waypoint remaining"; +"tour.progress.distance.accessibility.singular" = "Beacon set on %1$@. %2$@. 1 waypoint remaining"; /* Accessibility label for the progress view, %1$@ is the waypoint name, %2$@ is the time elapsed, "Beacon set on home. 02:31 elapsed. 1 waypoint remaining." {NumberedPlaceholder="%1$@","%2$@"} */ "tour.progress.elapsed.accessibility.singular" = "Beacon set on %1$@. %2$@ elapsed. 1 waypoint remaining"; @@ -1233,7 +1248,7 @@ "waypoint.callout.button.title" = "Call out waypoint"; /* Voiceover hint to callout the current waypoint */ -"waypoint.callout.button.hint" = "Double tap to hear additional details."; +"waypoint.callout.button.hint" = "Double tap to hear additional details"; //------------------------------------------------------------------------------ // MARK: - Recommender @@ -1362,10 +1377,10 @@ "routes.no_routes.title" = "Getting Started with Route Waypoints"; /* This text is displayed to the user when they navigate to the routes list but have not yet created any routes. It explains how a route is a set of ordered markers. */ -"routes.no_routes.hint.1" = "Create a route for yourself or for someone else by organizing a set of markers as waypoints on a route."; +"routes.no_routes.hint.1" = "You can create a route for yourself or for someone else by organizing a set of markers as waypoints on a route."; /* This text is displayed to the user when they navigate to the routes list but have not yet created any routes. It explains that the beacon will automatically shift between the route waypoints as they walk the route. */ -"routes.no_routes.hint.2" = "While out on your route with Soundscape, you will be informed on arrival to each waypoint, and the Audio Beacon will automatically advance to the next waypoint."; +"routes.no_routes.hint.2" = "While out on your route with Soundscape, you will be informed on arrival to each waypoint, and the audio beacon will automatically advance to the next waypoint."; /* Text for the first paragraph displayed when the waypoints list is empty for a route */ "route.no_waypoints.hint.1" = "Name your route and add an optional description. You can then add waypoints as you go or pick them from your list of markers."; @@ -1377,7 +1392,7 @@ "routes.tutorial.title" = "Hear Your Waypoints on Your Journey"; /* Explanation of the route guidance feature that is presented to the user the first time that they try to start route guidance {NumberedPlaceholder="Soundscape"} */ -"routes.tutorial.details" = "You will now return to the Soundscape home page and an Audio Beacon will be placed on your first waypoint. When you arrive at the waypoint, the beacon will advance to the next waypoint on your route."; +"routes.tutorial.details" = "You will now return to the Soundscape home screen and an audio beacon will be placed on your first waypoint. When you arrive at the waypoint, the beacon will advance to the next waypoint on your route."; /* Callout indicating a the user has arrived at the final waypoint in their route and the route experience is now complete. */ "routes.callout.complete" = "Route complete!"; @@ -1386,13 +1401,13 @@ "routes.sort.by_name" = "Sort by Name"; /* VoiceOver hint for a button that will cause the list of routes to be sorted by their names */ -"routes.sort.by_name.hint" = "Double tap to sort by name."; +"routes.sort.by_name.hint" = "Double tap to sort by name"; /* Text for a button that will cause the list of routes to be sorted by their distance from the user */ "routes.sort.by_distance" = "Sort by Distance"; /* VoiceOver hint for a button that will cause the list of routes to be sorted by their distance from the user */ -"routes.sort.by_distance.hint" = "Double tap to sort by distance."; +"routes.sort.by_distance.hint" = "Double tap to sort by distance"; /* Title of an alert for imporing routes */ "routes.import.alert.title" = "Route Error"; @@ -1453,7 +1468,7 @@ "markers.edit_screen.title.edit" = "Edit Marker"; /* Notification, Double tap to save this marker */ -"markers.edit_screen.done_button.acc_hint" = "Double tap to save this marker."; +"markers.edit_screen.done_button.acc_hint" = "Double tap to save this marker"; /* This is a label that is displayed on the Save Marker screen when the user is saving a new marker and adding it to a route. %@ is the name of the route. Example: "Saving to Route: Home to Grocery Store" (where "Home to Grocery Store" is the name of a route the user created {NumberedPlaceholder="%@"} */ "markers.edit_screen.route" = "Saving to Route: %@"; @@ -1502,7 +1517,7 @@ "search.no_results_found_with_hint" = "No results found. Try editing your search term."; /* Search results, No results found. */ -"searching.no_results_found_title" = "Oops! No results found"; +"searching.no_results_found_title" = "Oops! No results found."; /* Search results, No results found. */ "searching.no_results_found_message" = "If you're looking for a specific place, you can try searching by name or address."; @@ -1538,13 +1553,13 @@ "search.view_markers" = "Markers & Routes"; /* Accessibility hint when the user selects the markers button on the home screen */ -"search.button.markers.accessibility_hint" = "Double tap to select or edit your saved markers and routes."; +"search.button.markers.accessibility_hint" = "Double tap to select or edit your saved markers and routes"; /* Accessibility hint when the user selects the nearby places button on the home screen */ -"search.button.nearby.accessibility_hint" = "Double tap to explore nearby restaurants, transit stops and more."; +"search.button.nearby.accessibility_hint" = "Double tap to explore nearby restaurants, transit stops and more"; /* Accessibility hint when the user selects the current location button on the home screen */ -"search.button.current_location.accessibility_hint" = "Double tap to preview, mark, or share your current location with a friend."; +"search.button.current_location.accessibility_hint" = "Double tap to preview, mark, or share your current location with a friend"; /* Search filter alert title */ "filter.alert_title" = "Filter places by category"; @@ -1556,10 +1571,10 @@ "filter.clear.capital" = "Clear Filter"; /* Accessibility hint for the "Clear Filter" button */ -"filter.clear.hint" = "Double tap to clear selected filter."; +"filter.clear.hint" = "Double tap to clear selected filter"; /* Search filter button description */ -"filter.double_tap_places_category" = "Double tap to filter places by category."; +"filter.double_tap_places_category" = "Double tap to filter places by category"; /* Filters, All Places */ "filter.all" = "All Places"; @@ -1574,7 +1589,7 @@ "filter.parks" = "Parks"; /* Filter, Things To Do */ -"filter.things_to_do" = "Things to do"; +"filter.things_to_do" = "Things to Do"; /* Filters, Groceries & Convenience Stores */ "filter.groceries" = "Groceries & Convenience Stores"; @@ -1582,12 +1597,15 @@ /* Filters, Banks & ATMs */ "filter.banks" = "Banks & ATMs"; +/* Filters, NaviLens Codes */ +"filter.navilens" = "NaviLens Codes"; + /* Displayed next to the name of the filter to indicate that the filter is currently selected. %@ is the name of a filter */ "filter.selected" = "%@ (selected)"; /* Message displayed when category filters are not available, %@ is a placeholder for the value of the `filter.all` translated string, Quotes written as \" {NumberedPlaceholder="%@"} */ -"filter.not_available" = "Some category filters are not available. You can still browse nearby places by selecting \"%@\"."; +"filter.not_available" = "Some category filters are not available. You can still browse nearby places by selecting \"%@\""; //------------------------------------------------------------------------------ // MARK: - Callouts @@ -1614,11 +1632,18 @@ /* Callouts Information, Nearby places like shops and restaurants */ "callouts.places_and_landmarks.info" = "Nearby places like shops and restaurants"; -/* Callouts Title, Mobility. Mobility: "The ability to move or be moved freely." */ +/* Mobility callout */ "callouts.mobility" = "Mobility"; +"callouts.mobility.info" = "Practical features like crosswalks and bus stops."; + +/* Safety callout */ +"callouts.safety" = "Safety"; +"callouts.safety.info" = "Potential hazards like steps and construction areas."; + +/* Intersections callout */ +"callouts.intersection" = "Intersections"; +"callouts.intersection.info" = "Announce street names and their directions."; -/* Callouts Information, Intersection and transportation information */ -"callouts.mobility.info" = "Intersection and transportation info"; /* Title for a toggle under the Manage Callouts settings section. This toggle enables or disables periodic callouts that inform the user about their distance from the location of the audio beacon. */ "callouts.audio_beacon" = "Distance to the Audio Beacon"; @@ -1648,7 +1673,7 @@ "callouts.marked_points" = "Marked Points"; /* Callouts notification, There is nothing to call out right now */ -"callouts.nothing_to_call_out_now" = "There is nothing to call out right now."; +"callouts.nothing_to_call_out_now" = "There is nothing to call out right now"; /* Callouts Title, Nearby Markers */ "callouts.nearby_markers" = "Nearby Markers"; @@ -1691,7 +1716,7 @@ "sleep.sleeping.message" = "Soundscape is currently sleeping. This prevents Soundscape from using Location Services or downloading data. This conserves battery when you are not using Soundscape. Tap the button below to wake up Soundscape."; /* Sleep Notification, Double tap to put Soundscape to sleep. Putting the app in an idle state for a period of time. {NumberedPlaceholder="Soundscape"} */ -"sleep.sleep.acc_hint" = "Double tap to put Soundscape to sleep."; +"sleep.sleep.acc_hint" = "Double tap to put Soundscape to sleep"; /* Sleep Button, restore the app from a sleep (idle) state when a user leaves his location. */ "sleep.wake_up_when_i_leave" = "Wake Up When I Leave"; @@ -2145,31 +2170,31 @@ "ui.action_button.my_location" = "My\nLocation"; /* Accessibility Notification, Double tap to hear about your current location. */ -"ui.action_button.my_location.acc_hint" = "Double tap to hear about your current location."; +"ui.action_button.my_location.acc_hint" = "Double tap to hear about your current location"; /* Similar to `callouts.nearby_markers`. Text that is shown in a small square button. It should be constrained to two lines with up to 8 characters each. Use "\n" to represent a new line character. {NumberedPlaceholder="\n"} */ "ui.action_button.nearby_markers" = "Nearby\nMarkers"; /* Accessibility Notification, Double tap to hear about nearby places that you have marked */ -"ui.action_button.nearby_markers.acc_hint" = "Double tap to hear about nearby places that you have marked."; +"ui.action_button.nearby_markers.acc_hint" = "Double tap to hear about nearby places that you have marked"; /* Similar to `help.orient.page_title`. Text that is shown in a small square button. It should be constrained to two lines with up to 8 characters each. Use "\n" to represent a new line character. {NumberedPlaceholder="\n"} */ "ui.action_button.around_me" = "Around\nMe"; /* Accessibility Notification, Double tap to hear about places in the four quadrants around you */ -"ui.action_button.around_me.acc_hint" = "Double tap to hear about places in the four quadrants around you."; +"ui.action_button.around_me.acc_hint" = "Double tap to hear about places in the four quadrants around you"; /* Similar to `help.explore.page_title`. Text that is shown in a small square button. It should be constrained to two lines with up to 8 characters each. Use "\n" to represent a new line character. {NumberedPlaceholder="\n"} */ "ui.action_button.ahead_of_me" = "Ahead\nof Me"; /* Accessibility Notification, Double tap to hear about places in front of you */ -"ui.action_button.ahead_of_me.acc_hint" = "Double tap to hear about places in front of you."; +"ui.action_button.ahead_of_me.acc_hint" = "Double tap to hear about places in front of you"; /* Title, Menu */ "ui.menu" = "Menu"; /* VoiceOver hint for the menu button */ -"ui.menu.hint" = "Double tap to open the menu."; +"ui.menu.hint" = "Double tap to open the menu"; /* Button title, Close Menu */ "ui.menu.close" = "Close Menu"; @@ -2240,7 +2265,7 @@ "poi_cell.accessibility_label.suggested_search" = "Suggested search: %@"; /* Accessibility hint for a search result that is a suggested search query, %@ suggested search query, "Double tap to search for: " {NumberedPlaceholder="%@"} */ -"poi_cell.accessibility_hint.suggested_search" = "Double tap to search for: %@."; +"poi_cell.accessibility_hint.suggested_search" = "Double tap to search for: %@"; /* Header for recent callouts section */ "poi_screen.header.recent.callouts" = "Recent Callouts"; @@ -2284,10 +2309,10 @@ "devices.explain_ar.disconnected" = "Head tracking headphones are Bluetooth headphones with sensors that tell Soundscape where you are facing. This helps Soundscape to improve your audio experience, making it more natural as you move around in the world.\n\nTap the button below to connect a device."; /* Message indicating that the app has successfully been connected to a head tracking headset, {NumberedPlaceholder="AirPods","Soundscape"} */ -"devices.explain_ar.connected.airpods" = "Your AirPods are ready for use, so you can put your phone in your pocket and go! Soundscape is tracking the direction of your head so you do not need to hold the phone in your hand."; +"devices.explain_ar.connected.airpods" = "Your AirPods are ready for use, so you can put your phone in your pocket and go! Soundscape is tracking the direction of your head so you don't need to hold the phone in your hand."; /* Message indicating that the app has successfully been connected to Bose Frames */ -"devices.explain_ar.connected.boseframes" = "Your Bose Frames are ready for use, so you can put your phone in your pocket and go! Soundscape is tracking the direction of your head so you do not need to hold the phone in your hand."; +"devices.explain_ar.connected.boseframes" = "Your Bose Frames are ready for use, so you can put your phone in your pocket and go! Soundscape is tracking the direction of your head so you don't need to hold the phone in your hand."; /* Message indicating that the app has successfully been paired to head tracking headphones but is not connected, %@ headset name, "Soundscape is not currently connected to your AirPods Pro. Please ensure your headset is turned on and near your phone." {NumberedPlaceholder="%@"} */ "devices.explain_ar.paired" = "Soundscape is not currently connected to your %@. Please ensure your headphones are turned on and near your phone."; @@ -2317,7 +2342,7 @@ "devices.connect_headset.unavailable" = "The device you've selected is currently unavailable for connection. Please try again later."; /* Prompt presented to the user when they try to connect to an head tracking headset */ -"devices.connect_headset.explanation" = "Select the type of your headphones from the list of supported headphones below."; +"devices.connect_headset.explanation" = "Select the type of headphones from the list of supported headphones below."; /* Prompt presented to the user before they connect to their headset which indicates that they need to pair to the device through iOS Settings > Bluetooth */ "devices.connect_headset.audio" = "Before connecting your headphones to Soundscape, be sure it is paired to your phone. If it is not yet paired, go to the Bluetooth section in the iOS Settings app to pair your device and then return to Soundscape."; @@ -2329,28 +2354,28 @@ "devices.connect_headset.calibrate.in_ear" = "Your headphones need to be calibrated. Gently shake your head in all directions for about 10 seconds. This must be repeated if the calibration chime continues to play."; /* Message displayed to the user after they successfully connect Soundscape to their AR headset. {NumberedPlaceholder="AirPods", "Soundscape"} */ -"devices.connect_headset.completed.airpods" = "Congratulations! Your AirPods are ready for use, so you can put your phone in your pocket and go! Soundscape will now track the direction of your head so you do not need to hold the phone in your hand. A single click on the headphones button will mute or unmute the beacon, double click will call out your location, and a triple click will repeat the last callout."; +"devices.connect_headset.completed.airpods" = "Congratulations! Your AirPods are ready for use, so you can put your phone in your pocket and go! Soundscape will now track the direction of your head so you don't need to hold the phone in your hand. A single click on the headphones button will mute or unmute the beacon, a double click will call out your location, and a triple click will repeat the last callout."; /* D.o for Bose Frame (Rondo) */ -"devices.connect_headset.completed.boseframes" = "Congratulations! Your Bose Frames are ready for use, so you can put your phone in your pocket and go! Soundscape will now track the direction of your head so you do not need to hold the phone in your hand."; +"devices.connect_headset.completed.boseframes" = "Congratulations! Your Bose Frames are ready for use, so you can put your phone in your pocket and go! Soundscape will now track the direction of your head so you don't need to hold the phone in your hand."; /* Button label for a button that allows users to test their newly connected headset */ "devices.connect_headset.completed.test" = "Check Your Headphones"; /* VoiceOver hint for the button that allows users to test their newly connected headset, %@ is the type of headset, "Double tap to check your AirPods Pro". {NumberedPlaceholder="%@"} */ -"devices.connect_headset.completed.test.hint" = "Double tap to check your %@."; +"devices.connect_headset.completed.test.hint" = "Double tap to check your %@"; /* Title of the Check Headset screen */ "devices.test_headset.title" = "Headphones Check"; /* Label explaining to the user that how the headset test works and what they should do */ -"devices.test_headset.explanation" = "We've placed an audio beacon to your right. Listen where it is, and turn your head towards it. Notice how you can do this even when your phone is in your pocket. When you are done, Tap the button below to return to Soundscape, and enjoy your next walk with your new head tracking headphones."; +"devices.test_headset.explanation" = "We've placed an audio beacon to your right. Listen where it is, and turn your head toward it. Notice how you can do this even when your phone is in your pocket. When you are done, Tap the button below to return to Soundscape, and enjoy your next walk with your new head tracking headphones."; /* Button title for a button that ends the headset testing process and returns the user to Soundscape */ "devices.test_headset.continue" = "Return to Soundscape"; /* Announcement that occurs when the user presses the "Check Your Headphones" button */ -"devices.test_headset.callout" = "We've placed an audio beacon to your right. Listen where it is, and turn your head towards it… Notice how you can do this even when your phone is in your pocket."; +"devices.test_headset.callout" = "We've placed an audio beacon to your right. Listen where it is, and turn your head toward it. Notice how you can do this even when your phone is in your pocket."; /* Title of a prompt that is presented to users when they tap the "Forget This Device" button to disconnect and forget a head tracking headset */ "devices.forget_headset.prompt.forget" = "Are you sure you wish to forget these headphones?"; @@ -2434,7 +2459,7 @@ "behavior.experiences.reset_and_update_action" = "Check for Updates"; /* Prompt presented to users when they tap the "Reset" action for an activity. This prompt informs the user what happens when they reset an activity and confirms whether or not they want to proceed. */ -"behavior.experiences.reset.prompt" = "Resetting this activity will remove your current progress and allow you to start this activity over again. In addition to resetting this activity, you may also choose to check for updates. This will download updated information for this activity if any updates are available."; +"behavior.experiences.reset.prompt" = "Resetting this activity will remove your current progress and allow you to start this activity over again. You may also check for updates. This will download updated information for this activity if any updates are available."; /* Explanation prompt that tells the users that if they choose to check for updates to the event, the event will be reset and any available updates will be downloaded. */ "behavior.experiences.updates.prompt" = "If any updates are available, this will reset this activity and download the updates."; @@ -2579,7 +2604,7 @@ "text.cleaning_things" = "Cleaning things up…"; /* Notification, Double tap to repeat */ -"action.double_tap_to_repeat" = "Double tap to repeat."; +"action.double_tap_to_repeat" = "Double tap to repeat"; /* Title, Location. Used as screen title for a location detail page. Also used as the default name for markers when a more specific default cannot be generated. */ "location" = "Location"; @@ -2623,7 +2648,7 @@ "tutorial.markers.your_marker" = "your marker"; /* Tutorial notification, Double tap to mark this location */ -"tutorial.markers.mark_location.acc_hint" = "Double tap to mark this location."; +"tutorial.markers.mark_location.acc_hint" = "Double tap to mark this location"; //------------------------------------------------------------------------------ // MARK: Tutorials (Markers Texts) @@ -2639,7 +2664,7 @@ "tutorial.markers.text.NearbyMarkers" = "Excellent! You have a new marker named @!marker_name!!.\nNow, to hear where your marker is, press the Nearby Markers button. This button can be found at the bottom of the main screen.\nTry it out now."; /* Tutorial, set Audio Beacon from Marker. {NumberedPlaceholder="@!marker_name!!", "\n"} */ -"tutorial.markers.text.AudioBeacon" = "You can also set an audio beacon on your marker.\nLet's try it out. Here is the beacon on @!marker_name!!.\nListen carefully where it is, and holding your phone flat, turn towards it."; +"tutorial.markers.text.AudioBeacon" = "You can also set an audio beacon on your marker.\nLet's try it out. Here is the beacon on @!marker_name!!.\nListen carefully where it is, and holding your phone flat, turn toward it."; /* Tutorial, Marker Wrap Up. {NumberedPlaceholder="@!marker_name!!", "\n"} */ "tutorial.markers.text.WrapUp" = "Perfect, you are now facing your marker, @!marker_name!!.\nIt looks like you've got it!\nYou can manage your list of markers by selecting Markers & Routes from the home screen.\nAnd you can always visit the Help & Tutorials pages to go through this tutorial again or to read a comprehensive guide on everything you can do with markers. The beacon you've set for this tutorial will now be cleared and you will be returned to the previous screen."; @@ -2661,7 +2686,7 @@ "tutorial.beacon.your_destination" = "your destination"; /* Tutorial notification, Double tap to use location selected for the beacon tutorial */ -"tutorial.beacon.mark_location.acc_hint" = "Double tap to use this location for the beacon tutorial."; +"tutorial.beacon.mark_location.acc_hint" = "Double tap to use this location for the beacon tutorial"; /* Tutorial notification, %@ is a location, "You selected as the location for the beacon." {NumberedPlaceholder="%@"} */ "tutorial.beacon.poi_selected" = "You have selected %@ as the location for the beacon."; @@ -2689,16 +2714,16 @@ "tutorial.beacons.text.IntroPart2" = "Press the \"Start Audio Beacon\" button below to open a list of nearby places. Choose a location from the list and the tutorial will begin."; /* Tutorial, Beacon phone orientation is flat */ -"tutorial.beacons.text.OrientationIsFlat" = "You are currently holding your phone flat with the screen facing up towards the sky. Make sure the top of the phone is pointing straight ahead of you."; +"tutorial.beacons.text.OrientationIsFlat" = "You are currently holding your phone flat with the screen facing up toward the sky. Make sure the top of the phone is pointing straight ahead of you."; /* Tutorial, Beacon phone orientation is not flat */ -"tutorial.beacons.text.OrientationIsNotFlat" = "To get started, hold your phone flat in your hand with the screen facing up towards the sky and with the top of the phone pointing straight ahead of you."; +"tutorial.beacons.text.OrientationIsNotFlat" = "To get started, hold your phone flat in your hand with the screen facing up toward the sky and with the top of the phone pointing straight ahead of you."; /* Tutorial, Phone orientation doesn't matter because the user is wearing AirPods Pro {NumberedPlaceholder="Soundscape","AirPods"} */ "tutorial.beacons.text.OrientationAirPods" = "Your AirPods are connected to Soundscape. Once they're connected, it doesn't matter how you hold your phone. It can even go in your pocket or bag."; /* Tutorial, Beacon phone orientation repeat */ -"tutorial.beacons.text.OrientationRepeat" = "To continue, hold your phone flat in your hand so that the screen is facing up towards the sky"; +"tutorial.beacons.text.OrientationRepeat" = "To continue, hold your phone flat in your hand so that the screen is facing up toward the sky"; /* Tutorial, phone must be held flat when you are standing still */ "tutorial.beacons.text.HoldingPhone" = "Holding your phone flat in this way is only required when you are standing still. When walking feel free to place the phone in an easily accessible pocket or bag."; @@ -2713,10 +2738,10 @@ "tutorial.beacons.text.BeaconOutOfBounds" = "If you listen carefully you will hear that it is playing from a certain direction around you."; /* Tutorial, Beacon out of Bounds sound change when phone is rotated */ -"tutorial.beacons.text.BeaconOutOfBoundsRotate" = "Now, still holding your phone flat, slowly turn towards the direction of the beacon. You will hear a bell sound when you are facing directly towards it."; +"tutorial.beacons.text.BeaconOutOfBoundsRotate" = "Now, still holding your phone flat, slowly turn toward the direction of the beacon. You will hear a bell sound when you are facing directly toward it."; /* Tutorial, Beacon out of bounds sound change when head tracking headphones is rotated */ -"tutorial.beacons.text.BeaconOutOfBoundsRotate.ar_headset" = "Now, slowly turn towards the direction of the beacon. You will hear a bell sound when you are facing directly towards it."; +"tutorial.beacons.text.BeaconOutOfBoundsRotate.ar_headset" = "Now, slowly turn toward the direction of the beacon. You will hear a bell sound when you are facing directly toward it."; /* Tutorial, Beacon out of Bounds repeat */ "tutorial.beacons.text.BeaconOutOfBoundsRepeat" = "Slowly turn until you hear the bell indicating you are facing in the direction of the beacon."; @@ -2725,7 +2750,7 @@ "tutorial.beacons.text.BeaconOutOfBoundsConfirmation" = "Perfect, you are now facing in the direction of @!destination!!."; /* Tutorial, Beacon in bounds sound. {NumberedPlaceholder="@!destination!!"} */ -"tutorial.beacons.text.BeaconInBounds" = "If you listen carefully you will hear that it is playing from right in front of you and that there is a bell sound in addition to the normal beacon sound. That is because you are facing directly towards @!destination!!."; +"tutorial.beacons.text.BeaconInBounds" = "If you listen carefully you will hear that it is playing from right in front of you and that there is a bell sound in addition to the normal beacon sound. That is because you are facing directly toward @!destination!!."; /* Tutorial, Beacon in of Bounds sound change when phone is rotated. {NumberedPlaceholder="@!destination!!"} */ "tutorial.beacons.text.BeaconInBoundsRotate" = "Now try to slowly turn away from the direction of the beacon, while still holding your phone flat. The bell sound will stop and the beacon continues to show you where @!destination!! is. Give it a try now."; @@ -2737,7 +2762,7 @@ "tutorial.beacons.text.BeaconInBoundsRepeat" = "Slowly turn away from the direction of the beacon."; /* Tutorial, Beacon explanation */ -"tutorial.beacons.text.MobilitySkills" = "The beacon always points directly towards the location you've selected. It does not tell you the paths to follow or give you directions to get to that location. Use this beacon as a tool to decide how you want to get there."; +"tutorial.beacons.text.MobilitySkills" = "The beacon always points directly toward the location you've selected. It does not tell you the paths to follow or give you directions to get to that location. Use this beacon as a tool to decide how you want to get there."; /* Tutorial, Automatic Callouts {NumberedPlaceholder="Soundscape"} */ "tutorial.beacons.text.AutomaticCallout" = "As you progress on your journey, Soundscape will occasionally update you about the distance to the location marked by the beacon with a callout like this."; @@ -2746,13 +2771,13 @@ "tutorial.beacons.text.HomeScreen" = "Distance information is also displayed on the home screen along with the street address of the beacon's location if we have it. Soundscape will notify you when you get close to the beacon's location, at which point the audio beacon will silence."; /* Tutorial, Mute Beacon */ -"tutorial.beacons.text.Mute" = "If you need the app to be quiet for any reason, you can either use the mute beacon button or the sleep button on the home screen, or you can double tap with two fingers anywhere on the screen. A double tap with two fingers will stop any current callouts and will mute the audio beacon. Give it a try now."; +"tutorial.beacons.text.Mute" = "If you need the app to be quiet for any reason, you can either use the Mute Beacon button or the Sleep button on the home screen, or you can double tap with two fingers anywhere on the screen. A double tap with two fingers will stop any current callouts and will mute the audio beacon. Give it a try now."; /* Tutorial, Mute Beacon Repeat */ -"tutorial.beacons.text.MuteRepeat" = "Double tap with two fingers anywhere on the screen."; +"tutorial.beacons.text.MuteRepeat" = "Double tap with two fingers anywhere on the screen"; /* Tutorial, Beacon Wrap Up */ -"tutorial.beacons.text.WrapUp" = "It looks like you've got it! If you want to repeat this tutorial, you can access it at any time on the Help and Tutorials screen. The beacon you've set for this tutorial will now be cleared and you will be returned to the previous screen."; +"tutorial.beacons.text.WrapUp" = "It looks like you've got it! If you want to repeat this tutorial, you can access it at any time on the Help & Tutorials screen. The beacon you've set for this tutorial will now be cleared and you will be returned to the previous screen."; //------------------------------------------------------------------------------ // MARK: - Help @@ -2780,7 +2805,7 @@ "settings.help.section.home_screen_buttons" = "\"Hear My Surroundings\" Buttons"; /* Help content describing how user can choose a voice and download additional voices */ -"help.config.voices.content" = "Soundscape can use any of the voices you have downloaded in the iOS Settings app except for the Siri voices which are not available to Soundscape. We recommend choosing one of the higher quality \"Enhanced\" voices, but you will need to download it first. You can download voices in the iOS Settings app by going to Accessibility > Spoken Content > Voices and tapping on a voice. Within the Soundscape App, you can select the voice you want to use by tapping \"Settings\" on the main menu and then from \"General Settings\" selecting \"Voice\"."; +"help.config.voices.content" = "Soundscape can use any of the voices you have downloaded in the iOS Settings app except for the Siri voices which are not available to Soundscape. We recommend choosing one of the higher quality \"Enhanced\" voices, but you will need to download it first. You can download voices in the iOS Settings app by going to Accessibility > Read & Speak > Voices and tapping on a voice. (In iOS Versions before 26, \"Read & Speak\" is called \"Spoken Content\".) Within the Soundscape App, you can select the voice you want to use by going to \"Settings\" from the menu and then from \"General Settings\" selecting \"Voice\"."; /* Help Page Title, Offline */ "help.offline.page_title" = "Why is Soundscape working offline?"; @@ -2853,10 +2878,10 @@ "terms_of_use.accept_checkbox.acc_label" = "Accept Terms of Use"; /* Double tap to check the accept terms of use checkbox. Quotes written as \" */ -"terms_of_use.accept_checkbox.on.acc_hint" = "Double tap to check the \"accept the terms of use\" checkbox."; +"terms_of_use.accept_checkbox.on.acc_hint" = "Double tap to check the \"Accept Terms of Use\" checkbox"; /* Double tap to uncheck the accept terms of use checkbox. Quotes written as \" */ -"terms_of_use.accept_checkbox.off.acc_hint" = "Double tap to uncheck the \"accept the terms of use\" checkbox."; +"terms_of_use.accept_checkbox.off.acc_hint" = "Double tap to uncheck the \"Accept Terms of Use\" checkbox"; /* Terms of use accept checkbox has been checked */ "terms_of_use.accept_checkbox.on.acc_value" = "Checked"; @@ -2871,14 +2896,14 @@ "terms_of_use.accept.new_features" = "Accept"; /* Accessibility hint for the accept button that will be displayed as a new feature annoucement to existing users */ -"terms_of_use.accept.new_features.accessibility_hint" = "Double tap to accept and close announcements."; +"terms_of_use.accept.new_features.accessibility_hint" = "Double tap to accept and close announcements"; //------------------------------------------------------------------------------ // MARK: - First Launch //------------------------------------------------------------------------------ /* Button title accessibility hint. Quotes written as \" */ -"first_launch.get_started_button.off.acc_hint" = "You must check the \"accept the terms of use\" checkbox before you can press this button."; +"first_launch.get_started_button.off.acc_hint" = "You must check the \"Accept Terms of Use\" checkbox before you can press this button"; /* Notification, Welcome message */ "first_launch.welcome_text" = "Welcome! Before we get started, we need to go through some setup and ask for several permissions. Press the Next button to start."; @@ -2887,7 +2912,7 @@ "first_launch.welcome_audio_text" = "Welcome! Soundscape helps you stay aware of where you are and where you're going by using unique audio guidance and by calling out roads, intersections, and places as you approach them. Press the Next button to begin."; /* Notification, Permission is required */ -"first_launch.permission_required" = "This permission is required."; +"first_launch.permission_required" = "This permission is required"; /* Notification, Soundscap Language {NumberedPlaceholder="Soundscape"} */ "first_launch.soundscape_language" = "Soundscape Language"; @@ -2965,7 +2990,7 @@ "first_launch.callouts.listen.accessibility_label" = "Listen"; /* Accessibility hint for button that plays example callouts {NumberedPlaceholder="Soundscape"} */ -"first_launch.callouts.listen.accessibility_hint" = "Double tap to listen to an example of what Soundscape might call out on your next walk."; +"first_launch.callouts.listen.accessibility_hint" = "Double tap to listen to an example of Soundscape's automatic callouts"; /* Example callout for a coffee shop / cafe */ "first_launch.callouts.example.1" = "Cafe"; @@ -2989,7 +3014,7 @@ "first_launch.permissions.motion" = "Motion & Fitness"; /* Text to indicate that a permission is required */ -"first_launch.permissions.required" = "This permission is required."; +"first_launch.permissions.required" = "This permission is required"; /* Title text for screen to choose an audio beacon */ "first_launch.beacon.title" = "Choose an Audio Beacon"; @@ -3053,7 +3078,7 @@ "help.text.destination_beacons.when" = "Setting a beacon is useful when you want to keep track of a familiar landmark as you explore a new area or when you are going somewhere and want to be informed about your surroundings along the way. The beacon feature does not give you turn-by-turn directions, but it does give you a continuous audible sound that tells you the direction to the beacon, relative to where you are currently located. Using the audio beacon, your existing wayfinding skills, and even your favorite navigation app, you can choose how you want to get to nearby locations yourself."; /* Notification, Information how to set a beacon. Ensure that "Set a Beacon" is translated the same as `universal_links.alert.action.beacon`. Quotes written as \" {NumberedPlaceholder="","","
"} */ -"help.text.destination_beacons.how.1" = "To set a beacon:
First, view the details for a location by either using the search bar to search for a place, or tapping one of the \"Places Nearby\", \"Markers & Routes\", or \"Current Location\" buttons and selecting a location. From the location details screen you can select the \"Start Audio Beacon\" button. Tapping this will return you to the home screen and turn on an audible beacon coming from the direction of the place you've selected. The name of the place along with its distance and physical address, if available, will now be displayed on the main screen."; +"help.text.destination_beacons.how.1" = "To set a beacon:
First, view the details for a location by either using the search bar to search for a place, or tapping one of the \"Places Nearby\", \"Markers & Routes\", or \"Current Location\" buttons and selecting a location. Then from the \"Location Details\" screen, select the \"Start Audio Beacon\" button. Tapping this will return you to the home screen and turn on an audible beacon coming from the direction of the place you've selected. The name of the place along with its distance and physical address, if available, will now be displayed on the main screen."; /* Notification, Information how to set a beacon continued. Ensure that "Remove Beacon" is translated the same as `beacon.action.remove_beacon`. Quotes written as \" {NumberedPlaceholder="","","
"} */ "help.text.destination_beacons.how.2" = "To remove the current beacon:
Simply press the \"Remove Beacon\" button on the home screen."; @@ -3074,10 +3099,10 @@ "help.text.automatic_callouts.when.3" = "When you need silence:
When you are about to cross a road or just need the app to be quiet, you can turn callouts off. When callouts are off, the app will only tell you information if you manually tap one of the \"My Location\", \"Nearby Markers\", \"Around Me\", or \"Ahead of Me\" buttons."; /* Notification, Information how to turn on callouts. Ensure that "Manage Callouts" is translated the same as `menu.manage_callouts` and "Callouts Off" is translated the same as `callouts.callouts_off` and "Allow callouts" is translated the same as `callouts.allow_callouts`. Quotes written as \" {NumberedPlaceholder="","","
"} */ -"help.text.automatic_callouts.how.1" = "Turning callouts on or off:
Turning callouts off will silence the app. Callouts can be turned on or off in the \"Manage Callouts\" section of the \"Settings\" screen where you can tap the \"Allow Callouts\" toggle to turn them on or off. You can also turn callouts on or off by using the \"skip forward\" command (double tap and hold) if your headphones have media control buttons. Alternatively, you can use the \"Sleep\" button in the upper right-hand corner of the home screen to stop Soundscape from making callouts until you wake it up."; +"help.text.automatic_callouts.how.1" = "Turning callouts on or off:
Turning callouts off will silence the app. Callouts can be turned on or off by going to the \"Manage Callouts\" section of the \"Settings\" screen and then toggling the \"Allow Callouts\" button. You can also turn callouts on or off by using the \"skip forward\" command (double tap and hold) if your headphones have media control buttons. Alternatively, you can use the \"Sleep\" button in the upper right-hand corner of the home screen to stop Soundscape from making callouts until you wake it up."; /* Notification, Information how to turn on callouts continued. Ensure that "Manage Callouts" is translated the same as `menu.manage_callouts` and "Allow callouts" is translated the same as `callouts.allow_callouts`. Quotes written as \" {NumberedPlaceholder="","","
"} */ -"help.text.automatic_callouts.how.2" = "Managing which callouts you hear:
To choose the types of things Soundscape will automatically call out, go to the \"Settings\" screen within the main menu. The \"Manage Callouts\" section of the \"Settings Screen\" contains a list of types of things the app can call out. Each item has a toggle button that you can turn on or off. If you wish to turn off all callouts, tap the \"Allow Callouts\" toggle at the top of the list."; +"help.text.automatic_callouts.how.2" = "Managing which callouts you hear:
To choose the types of things Soundscape will automatically call out, go to the \"Settings\" screen from the menu on the home screen. The \"Manage Callouts\" section of the \"Settings\" screen contains a list of types of things the app can call out. Each item has a toggle button that you can turn on or off. If you wish to turn off all callouts, tap the \"Allow Callouts\" toggle at the top of the list."; /* Notification, Information about what My Location does. Ensure that "My Location" is translated the same as `directions.my_location`. Quotes written as \" {NumberedPlaceholder="",""} */ "help.text.my_location.what" = "The \"My Location\" button quickly gives you information that helps you figure out where you currently are. \"My Location\" tells you about your current location including things like the direction you are facing, where nearby roads or intersections are, and where nearby points of interest are."; @@ -3086,7 +3111,7 @@ "help.text.my_location.when" = "\"My Location\" is useful when you need to figure out where you are or what cardinal direction you are facing."; /* Notification, Information how to use My Location. Ensure that "My Location" is translated the same as `directions.my_location`. Quotes written as \" {NumberedPlaceholder="",""} */ -"help.text.my_location.how" = "As with all four of the buttons at the bottom of the home screen, hold your phone with the screen flat (facing towards the sky) and the top of the phone pointing in the direction you are facing before you press the \"My Location\" button. This acts like a compass telling the app which direction you are facing. Simply, tap the \"My Location\" button and listen."; +"help.text.my_location.how" = "As with all four of the buttons at the bottom of the home screen, hold your phone with the screen flat (facing toward the sky) and the top of the phone pointing in the direction you are facing before you press the \"My Location\" button. This acts like a compass telling the app which direction you are facing. Simply, tap the \"My Location\" button and listen."; /* Notification, Information about what Nearby Markers does. Ensure that "Nearby Markers" is translated the same as `callouts.nearby_markers`. Quotes written as \" {NumberedPlaceholder="",""} */ "help.text.nearby_markers.what" = "The \"Nearby Markers\" button tells you about up to four markers that are closest to you. \"Nearby Markers\" is intended to help you orient yourself using places you already know about."; @@ -3095,7 +3120,7 @@ "help.text.nearby_markers.when" = "When you are trying to get your bearings and orient yourself to your surroundings, use \"Nearby Markers\" to hear about the locations of places you know of."; /* Notification, Information about how to use Nearby Markers. Ensure that "Nearby Markers" is translated the same as `callouts.nearby_markers`. Quotes written as \" {NumberedPlaceholder="",""} */ -"help.text.nearby_markers.how" = "As with all four of the buttons at the bottom of the home screen, hold your phone with the screen flat (facing towards the sky) and the top of the phone pointing in the direction you are facing before you press the \"Nearby Markers\" button. This acts like a compass telling the app which direction you are facing. Simply, tap the \"Nearby Markers\" button and you will hear up to four markers near you."; +"help.text.nearby_markers.how" = "As with all four of the buttons at the bottom of the home screen, hold your phone with the screen flat (facing toward the sky) and the top of the phone pointing in the direction you are facing before you press the \"Nearby Markers\" button. This acts like a compass telling the app which direction you are facing. Simply, tap the \"Nearby Markers\" button and you will hear up to four markers near you."; /* Notification, Information about what Around Me does. Ensure that "Around Me" is translated the same as `help.orient.page_title`. Quotes written as \" {NumberedPlaceholder="",""} */ "help.text.around_me.what" = "The \"Around Me\" button tells you about one thing in each of the four quadrants around you (ahead, to the right, behind, and to the left). \"Around Me\" is intended to help you orient yourself to your surroundings."; @@ -3104,67 +3129,67 @@ "help.text.around_me.when" = "When you are trying to get your bearings and orient yourself to your surroundings, use \"Around Me\" to hear about the things around you."; /* Notification, Information about how to use Around Me. Ensure that "Around Me" is translated the same as `help.orient.page_title`. Quotes written as \" {NumberedPlaceholder="",""} */ -"help.text.around_me.how" = "As with all four of the buttons at the bottom of the home screen, hold your phone with the screen flat (facing towards the sky) and the top of the phone pointing in the direction you are facing before you press the \"Around Me\" button. This acts like a compass telling the app which direction you are facing. Simply, tap the \"Around Me\" button and you will hear four points of interest arranged around you."; +"help.text.around_me.how" = "As with all four of the buttons at the bottom of the home screen, hold your phone with the screen flat (facing toward the sky) and the top of the phone pointing in the direction you are facing before you press the \"Around Me\" button. This acts like a compass telling the app which direction you are facing. Simply, tap the \"Around Me\" button and you will hear four points of interest arranged around you."; /* Notification, Information about what Ahead of Me does. Ensure that "Ahead of Me" is translated the same as `help.explore.page_title`. Quotes written as \" {NumberedPlaceholder="",""} */ -"help.text.ahead_of_me.what" = "The \"Ahead of Me\" button tells you about four things ahead of you. \"Ahead of Me\" is intended to help you explore the way ahead of yourself when you are learning about a new area."; +"help.text.ahead_of_me.what" = "The \"Ahead of Me\" button tells you about up to five things ahead of you. \"Ahead of Me\" is intended to help you explore the way ahead of yourself when you are learning about a new area."; /* Notification, Information about when to use Ahead of Me. Ensure that "Ahead of Me" is translated the same as `help.explore.page_title`. Quotes written as \" {NumberedPlaceholder="",""} */ "help.text.ahead_of_me.when" = "When you are walking down the street, try using \"Ahead of Me\" to discover the places and things coming up on either side of the street ahead."; /* Notification, Information about how to use Ahead of Me. Ensure that "Ahead of Me" is translated the same as `help.explore.page_title`. Quotes written as \" {NumberedPlaceholder="",""} */ -"help.text.ahead_of_me.how" = "As with all four of the buttons at the bottom of the home screen, hold your phone with the screen flat (facing towards the sky) and the top of the phone pointing in the direction you are facing before you press the \"Ahead of Me\" button. This acts like a compass telling the app which direction you are facing. Simply, tap the \"Ahead of Me\" button and you will hear several points of interest all roughly ahead of you."; +"help.text.ahead_of_me.how" = "As with all four of the buttons at the bottom of the home screen, hold your phone with the screen flat (facing toward the sky) and the top of the phone pointing in the direction you are facing before you press the \"Ahead of Me\" button. This acts like a compass telling the app which direction you are facing. Simply, tap the \"Ahead of Me\" button and you will hear several points of interest all roughly ahead of you."; /* Notification, Information about what headphone media controls do in Soundscape. Keep HTML tags. {NumberedPlaceholder="Soundscape", "
"} */ -"help.text.remote_control.what" = "You can access certain features in Soundscape with the help of the media control buttons on your headphones. This functionality works with any wired or Bluetooth headphones that have media control buttons like Play, Pause, Next, Previous and others. Different headphones may include different buttons so please refer to the list of actions below to determine which ones are available to you.
Also note that this feature only works with headphones that support Apple's media controls (such as play and pause)."; +"help.text.remote_control.what" = "You can access certain features in Soundscape with the media control buttons on your headphones. This functionality works with any wired or Bluetooth headphones that have media control buttons like Play, Pause, Next, Previous and others. Different headphones may include different buttons, so please refer to the list of actions below to determine which ones are available to you.
Note that this feature only works with headphones that support Apple's media controls (such as play and pause)."; /* Notification, Information about when to use media controls on headphones. {NumberedPlaceholder="Soundscape"} */ -"help.text.remote_control.when" = "Headphone media controls can be used while Soundscape is running. This is true whether you are currently in Soundscape or while Soundscape is in the background and even while your device is locked. Note however that headphone media control buttons will not work with Soundscape if you are playing audio like music, podcasts or videos with another app."; +"help.text.remote_control.when" = "Headphone media controls can be used while Soundscape is running. This is true whether you are currently in Soundscape or while the app runs in the background and even while your device is locked. Note however that headphone media control buttons will not work with Soundscape if you are playing audio like music, podcasts or videos with another app."; /* Notification, Information about how to use media controls on headphones. Ensure that "My Location" is translated the same as `directions.my_location` and "Around Me" is translated the same as `help.orient.page_title`. Quotes written as \" {NumberedPlaceholder="

","
","⏯","

","⏭","","","⏮","⏩","⏪"} */ -"help.text.remote_control.how" = "

You can access the following features in Soundscape using the media control buttons on your headphones:


⏯ Play/Pause: Mute any current callouts and if the audio beacon is set, toggle the beacon audio.

⏭ Next: Callout \"My Location\".

⏮ Previous: Repeat last callout.

⏩ Skip Forward: Toggle callouts On and Off.

⏪ Skip Backward: Callout \"Around Me\".

"; +"help.text.remote_control.how" = "

You can access the following features in Soundscape using the media control buttons on your headphones:


⏯ Play/Pause: Mute any current callouts and if the audio beacon is set, toggle the beacon audio.

⏭ Next: Callout \"My Location\".

⏮ Previous: Repeat last callout.

⏩ Skip Forward: Toggle callouts On and Off.

⏪ Skip Backward: Callout \"Around Me\".

"; /* Notification, Markers content {NumberedPlaceholder="Soundscape"} */ "help.text.markers.content.1" = "With Soundscape, you can mark your world and anything you care about."; /* Notification, Markers content continued */ -"help.text.markers.content.2" = "You can mark things that are personal and relevant to you like your home, your office and your preferred grocery store. You can mark any place or address, but you can also mark things that might traditionally not be available in maps, for example, entrances to buildings or parks, push-to-walk buttons, pedestrian crossings or bridges, bus stops or even your dog’s favorite tree and use these as references along your walk."; +"help.text.markers.content.2" = "You can mark things that are personal and relevant to you like your home, your office and your preferred grocery store. You can mark any place or address, but you can also mark things that aren't usually on maps, for example, entrances to buildings or parks, push-to-walk buttons, pedestrian crossings or bridges, bus stops or even your dog’s favorite tree and use these as references along your walk."; /* Notification, Markers content continued {NumberedPlaceholder="Soundscape"} */ -"help.text.markers.content.3" = "To experience marked places, Soundscape will automatically call out marked places as you walk by or approach them, or you can use the Nearby markers button at the bottom of the home screen to hear a spatial callout of marked places around you. You can even set an audio beacon on any marked place. When you do this, the Soundscape audio beacon you are familiar with, will be heard and you can operate it as usual."; +"help.text.markers.content.3" = "To experience marked places, Soundscape will automatically call out marked places as you walk by or approach them, or you can use the \"Nearby Markers\" button at the bottom of the home screen to hear a spatial callout of marked places around you. You can even set an audio beacon on any marked place. When you do this, the Soundscape audio beacon you are familiar with, will be heard and you can operate it as usual."; /* Notification, Creating Markers help content, Quotation marks are written as \" */ "help.text.creating_markers.content.1" = "You can create markers in three ways: searching for the place you would like to save using the search bar, finding somewhere using the \"Places Nearby\" button, or using the \"Current Location\" button, all of which can be found on the Soundscape home screen. Once you have found the place you would like, selecting it will take you to the \"Location Details\" page. On this page, select the button called \"Save as Marker\"."; /* Notification, Creating Markers help content continued, Quotation marks are written as \" */ -"help.text.creating_markers.content.2" = "You will now have the option to customize this marker. This step is optional. If you want to, you can change the name of the marker and also add an annotation that will be called out along with the marker to provide some extra information. Once you are done, select the \"Done\" button to save your Marker."; +"help.text.creating_markers.content.2" = "You will now have the option to customize this marker. You can change its name and also add an annotation that will be called out along with the marker to provide extra information. Then select the \"Done\" button to save your marker."; /* Notification, Customizing Markers help content. "Markers & Routes" should be translated the same as the string with key 'search.view_markers'. Quotes written as \" */ -"help.text.customizing_markers.content.1" = "If you want to rename a marker you previously created, or add an annotation to it, then you can do so by selecting the marker from the \"Markers\" tab of the \"Markers & Routes\" page, then selecting the \"Edit Marker\" button. You can use this to give markers descriptive or useful nicknames, as well as give them a longer description using the annotation field."; +"help.text.customizing_markers.content.1" = "If you want to rename a marker you previously created, or add an annotation to it, select the marker from the \"Markers\" tab of the \"Markers & Routes\" page, and then select the \"Edit Marker\" button. You can use this to give markers descriptive or useful nicknames, as well as give them a longer description using the annotation field."; /* Notification, Customizing Markers help content continued */ "help.text.customizing_markers.content.2" = "From this Edit screen, you can also delete a marker if you no longer need it."; /* Help content explaining what the "routes" feature is */ -"help.text.routes.content.what" = "Routes are a series of waypoints. You will be informed on arrival to each waypoint, and the Audio Beacon will automatically advance to the next waypoint."; +"help.text.routes.content.what" = "Routes are a series of waypoints. You will be informed on arrival to each waypoint, and the audio beacon will automatically advance to the next waypoint."; /* Help content explaining when a user might choose to use the routes feature */ -"help.text.routes.content.when" = "You may want to create and use a route somewhere you know to make sure you keep on track, or you may want to use it as a tool to help familiarise yourself along a new journey."; +"help.text.routes.content.when" = "You may want to create and use a route somewhere you know to make sure you keep on track, or you may want to use it as a tool to help familiarize yourself along a new journey."; /* Help content explaining how a user can create a route. Quotes written as \" */ -"help.text.routes.content.how.1" = "Creating a route:
First, go to \"Markers & Routes\", select the \"Routes\" tab, and then select the \"New Route\" button. Give the route a name and an optional description, then add waypoints as you go or pick them from your list of Markers. You can rearrange the order of the waypoints along a route at any time by editing the route."; +"help.text.routes.content.how.1" = "Creating a route:
First, go to \"Markers & Routes\", select the \"Routes\" tab, and then select the \"New Route\" button. Give the route a name and an optional description, then add waypoints as you go or pick them from your list of markers. You can rearrange the order of the waypoints along a route at any time by editing the route."; /* Help content explaining how a user can follow a route. Quotes written as \" */ -"help.text.routes.content.how.1a" = "Following a route:
Select your route from the \"Markers & Routes\" page and then select Start Route. You will return to the home screen and Soundscape will set a beacon on the first waypoint. As you make your way through the route, the beacon advances to the next waypoint until the route is completed. If at any time you want to skip ahead or back a waypoint, press \"Next Waypoint\" or \"Previous Waypoint\"."; +"help.text.routes.content.how.1a" = "Following a route:
Select your route from the \"Markers & Routes\" page and then select \"Start Route\". You will return to the home screen and Soundscape will set a beacon on the first waypoint. As you make your way through the route, the beacon advances to the next waypoint until the route is completed. If at any time you want to skip ahead or back a waypoint, press \"Next Waypoint\" or \"Previous Waypoint\"."; /* Help content explaining how a user can edit a route. Quotes written as \" */ "help.text.routes.content.how.2" = "Editing a route:
Select your route on the \"Markers & Routes\" page and then select \"Edit Route\". From here you can add and remove waypoints, as well as edit the name and description of the route."; /* Help content explaining how a user can share a route. "Share" should be translated in the same way as it is for the key `share.title`. Quotes written as \" */ -"help.text.routes.content.how.3" = "Sharing a route:
Select your route on the \"Markers & Routes\" page and then select the option to \"Share\" using all of the usual share options available to you."; +"help.text.routes.content.how.3" = "Sharing a route:
Select your route on the \"Markers & Routes\" page and then select \"Share\". You can now use any of the usual share options available to you."; /* Help content describing how Apple AirPods work with Soundscape and which versions are supported {NumberedPlaceholder="Soundscape","AirPods"} */ -"help.using_headsets.airpods.what" = "Soundscape supports spatial audio with dynamic head tracking when using compatible AirPods. Once they're connected, sensors in the AirPods tell Soundscape the direction your head is facing. This helps Soundscape to improve your audio experience, making it more natural as you move around in the world. When you use Soundscape with AirPods connected, you do not need to hold your phone for Soundscape to work correctly."; +"help.using_headsets.airpods.what" = "Soundscape supports spatial audio with dynamic head tracking when using compatible AirPods. Once they're connected, sensors in the AirPods tell Soundscape the direction your head is facing. This helps Soundscape to improve your audio experience, making it more natural as you move around in the world. When you use Soundscape with AirPods connected, you do not need to hold your phone for the app to work correctly."; /* Information on when users can use Apple AirPods headphones with Soundscape, {NumberedPlaceholder="Soundscape","AirPods"} */ "help.using_headsets.airpods.when" = "You can use AirPods with Soundscape anytime you would normally use Soundscape. Using AirPods provides you with high quality audio and allows you to have a more hands-free experience."; @@ -3176,7 +3201,7 @@ "help.using_headsets.airpods.how.2" = "Using the Media Controls on your Headphones:
When media controls are enabled in the Soundscape settings, you can use the media controls on your AirPods to mute or unmute the beacon, to call out your location or to repeat the last callout. For more information, see the \"Using Media Controls\" help section."; /* Help content describing how Bose Frames work with Soundscape and which versions are supported {NumberedPlaceholder="Soundscape","Bose Frames"} */ -"help.using_headsets.bose_frames.what" = "Soundscape supports spatial audio with dynamic head tracking when using the Alto or Rondo versions of the Bose Frames. Once they're connected, sensors in the Bose Frames tell Soundscape the direction your head is facing. This helps Soundscape to improve your audio experience, making it more natural as you move around in the world. When you use Soundscape with Bose Frames connected, you do not need to hold your phone for Soundscape to work correctly."; +"help.using_headsets.bose_frames.what" = "Soundscape supports spatial audio with head tracking when using the Alto or Rondo versions of the Bose Frames. Once they're connected, sensors in the Bose Frames tell Soundscape the direction your head is facing. This helps Soundscape to improve your audio experience, making it more natural as you move around in the world. When you use Soundscape with Bose Frames connected, you do not need to hold your phone for the app to work correctly."; /* Information on when users can use Bose Frames headphones with Soundscape, {NumberedPlaceholder="Soundscape","Bose Frames"} */ "help.using_headsets.bose_frames.when" = "You can use Bose Frames with Soundscape anytime you would normally use Soundscape. Using Bose Frames provides you with high quality audio that does not occlude environmental audio and allows you to have a more hands-free experience."; @@ -3185,13 +3210,13 @@ "help.using_headsets.bose_frames.how.1" = "Connecting a Device:
Go to the \"Head Tracking Headphones\" item in the Soundscape menu to connect your Bose Frames and follow the instructions on screen. Note that you will need to pair your Bose Frames to your phone in the Bluetooth settings before connecting them in Soundscape."; /* information on how to calibrate Bose Frames with Soundscape, Quotes written as \", {NumberedPlaceholder="Soundscape","Bose Frames"} */ -"help.using_headsets.bose_frames.how.2" = "Calibrating your Headphones:
Your Bose Frames will need to be calibrated to accurately know which way you are facing. Each time you connect them to Soundscape, you will be informed that calibration is needed by an audio chime. To calibrate your Bose Frames, follow the instructions provided on the screen. When the chime stops playing, Your Bose Frames are calibrated, and Soundscape will now track the direction of your head so you do not need to hold the phone in your hand. You can also repeat this calibration at any time, even if the chime isn't playing, if you think the accuracy of your spatial audio is poor."; +"help.using_headsets.bose_frames.how.2" = "Calibrating your Headphones:
Your Bose Frames will need to be calibrated to accurately know which way you are facing. Each time you connect them to Soundscape, you will be informed that calibration is needed by an audio chime. To calibrate your Bose Frames, follow the instructions provided on the screen. When the chime stops playing, Your Bose Frames are calibrated, and Soundscape will now track the direction of your head so you do not need to hold the phone in your hand. You can repeat this calibration at any time, even if the chime isn't playing, if you think the accuracy of your spatial audio is poor."; /* Information on how to use the media buttons on Bose Frames */ "help.using_headsets.bose_frames.how.3" = "Using the Media Controls on your Headphones:
When media controls are enabled in the Soundscape settings, you can use the media controls on your Bose Frames to mute or unmute the beacon, to call out your location or to repeat the last callout. For more information, see the \"Using Media Controls\" help section."; /* Trouble shooting information for Bose Frames */ -"help.using_headsets.bose_frames.how.4" = "Troubleshooting your headphones:
If you are having trouble connecting your Bose Frames to Soundscape, ensure they are one of the supported models - the Altos or Rondos. If they are one of these models, then ensure that the Frames are appearing in the Bose Connect app. If they are showing and you are still having trouble with the connection, try unpairing and re-pairing the headphones via your phone's Bluetooth menu.
Support for the Bose Frames is new and we would love to hear your feedback. You can contact us by choosing the \"Send Feedback\" Option in the menu."; +"help.using_headsets.bose_frames.how.4" = "Troubleshooting your headphones:
If you are having trouble connecting your Bose Frames to Soundscape, ensure they are one of the supported models - the Altos or Rondos. If they are one of these models, then ensure that the Frames are appearing in the Bose Connect app. If they are showing and you are still having trouble with the connection, try unpairing and re-pairing the headphones via your phone's Bluetooth menu.
We would love to hear your feedback about the Bose Frames support. You can contact us by choosing the \"Send Feedback\" option in the menu."; //------------------------------------------------------------------------------ // MARK: - OSM Tags @@ -3207,7 +3232,7 @@ "osm.tag.dangerous_area" = "Dangerous Area"; /* Open Street Map term. This refers to a village, town or city townhall, which is often the seat of the mayor, or may be merely a community meeting place. */ -"osm.tag.townhall" = "Townhall"; +"osm.tag.townhall" = "Town Hall"; /* Open Street Map term. For flights of steps on footways and paths.. */ "osm.tag.steps" = "Steps"; @@ -3426,7 +3451,7 @@ "banner.custom_behavior.scavenger_hunt" = "Scavenger hunt is active."; /* Scavenger Hunt Banner, Hint */ -"banner.custom_behavior.scavenger_hunt.hint" = "Double tap to read about or pause the scavenger hunt."; +"banner.custom_behavior.scavenger_hunt.hint" = "Double tap to read about or pause the scavenger hunt"; /* Default banner when offline */ "banner.offline_default.message" = "Soundscape is working offline. Learn more"; @@ -3479,34 +3504,34 @@ "whats_new.1_2_0.0.title" = "Shake to Repeat the Last Callout"; /* Description of shake to repeat feature */ -"whats_new.1_2_0.0.description" = "You can now shake your device to repeat the last callout. To enable this feature, switch on the 'Repeat Callouts' toggle in settings."; +"whats_new.1_2_0.0.description" = "You can now shake your device to repeat the last callout. To enable this feature, switch on the \"Repeat Callouts\" toggle in settings."; /* Title of the beacon vicinity distance feature */ "whats_new.1_2_0.1.title" = "Beacon Mute Distance Setting"; /* Description of the beacon vicinity distance feature */ -"whats_new.1_2_0.1.description" = "You can now adjust the distance at which the beacon is automatically muted when you approach. You can adjust this setting in Audio Beacon settings.\n\nWe would particularly welcome feedback on your experience with setting different distances (0, 5, and 10 metres), for the Audio Beacon to switch off. In our internal testing we are seeing some inconsistencies in behaviour and are keen to get feedback from a wider base of users."; +"whats_new.1_2_0.1.description" = "You can now adjust the distance at which the beacon is automatically muted when you approach. Just go to the Audio Beacon settings and move the \"Audio Mute Distance\" slider."; /* Title of the categories in places nearby feature */ "whats_new.1_2_0.2.title" = "Categories in Places Nearby"; /* Description of the categories in places nearby feature */ -"whats_new.1_2_0.2.description" = "You can now filter the places nearby list by categories such as public transport, Food & Drink, etc."; +"whats_new.1_2_0.2.description" = "You can now filter the Places Nearby list by categories such as Public Transit, Food & Drink, etc."; /* Title of the Bose Frames support feature */ "whats_new.1_3_0.0.title" = "Bose Frames Support"; /* Description of the Bose Frames support feature */ -"whats_new.1_3_0.0.description" = "Soundscape now supports spatial audio with dynamic head tracking when using the Alto or Rondo versions of the Bose Frames. Once they're connected, sensors in the Bose Frames tell Soundscape the direction your head is facing. This helps Soundscape to improve your audio experience, making it more natural as you move around in the world. When you use Soundscape with Bose Frames connected, you do not need to hold your phone for Soundscape to work correctly. To get started, go to the \"Head Tracking Headphones\" item in the Soundscape menu to connect your Bose Frames and follow the instructions on screen. Note that you will need to pair your Bose Frames to your phone in the Bluetooth settings before connecting them in Soundscape."; +"whats_new.1_3_0.0.description" = "Soundscape now supports head tracking with the Alto or Rondo versions of the Bose Frames. Once they're connected, your Bose Frames will tell Soundscape where you are facing, helping Soundscape to improve your audio experience. To connect your Bose Frames to Soundscape, go to the \"Head Tracking Headphones\" item in the Soundscape menu."; /* Title of the request for testing in Texas */ "whats_new.1_3_0.1.title" = "Testing in Texas"; /* Description of the request for testing in Texas */ -"whats_new.1_3_0.1.description" = "If you live in the Austin or San Antonio areas in Texas and would like to help us test a feature we are working on with NaviLens, please get in touch via the Send Feedback button from the main menu."; +"whats_new.1_3_0.1.description" = "If you live in the Austin or San Antonio areas in Texas and would like to help us test a feature we are working on with NaviLens, please get in touch via the \"Send Feedback\" button from the menu."; /* Description of how users can download new voices. "Settings" and "Spoken Content" should be translated in the same way they are translated in the iOS Settin gs app. {NumberedPlaceholder="iOS"} */ -"voice.apple.additional" = "Additional voices, including enhanced quality voices, can be downloaded in the Spoken Content section of the iOS accessibility settings."; +"voice.apple.additional" = "Additional voices, including enhanced quality voices, can be downloaded in the Read & Speak section of the iOS accessibility settings."; // MARK: - FAQs @@ -3528,7 +3553,7 @@ "faq.when_to_use_soundscape.question" = "When should I use Soundscape?"; /* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. ’Lighting up your way with sound’ is a marketing tagline for the app. Intersection - A junction where two or more roads meet or cross. 3D sound is where the audio through your headphones sounds as though it is coming from a given direction, as if it was actually coming from a speaker. Quotes written as \" {NumberedPlaceholder="Soundscape"} */ -"faq.when_to_use_soundscape.answer" = "Soundscape has features and benefits that span a variety of scenarios and time scales. Furthermore, Soundscape’s value to you may evolve over time so how you use it today may differ from how you will use it in three months. People often think about apps in terms of \"what problem is this app good at solving?\" Soundscape certainly can be used on a case by case basis when you have a specific information need – such as keeping track of a destination as you make your way there, helping to orient yourself when you emerge from a metro station, getting your bearings when exiting a car, or finding the street names for, or distance to, the next intersection. However, the philosophy behind Soundscape is one of \"lighting up your world with sound\", designed to be used anytime you are out and about to provide ambient awareness of your surroundings, such as keeping you aware of the names of the streets you are on, the direction you are heading, and the names of businesses you are passing. In this use mode, our users have referred to Soundscape as a \"nice companion app\", which supports \"serendipity\", to \"fill in the gaps in your mental map\" and provide more \"confidence when walking\". Here are some other examples of how our users are incorporating Soundscape into their life:\n\n\"Soundscape helped me get back on track after I got off the bus and headed off in the wrong direction.\"\n\n\"Even in the town where I have lived for 3 years, I have built an improved picture of what is around me [with Soundscape].\"\n\n\"The 3D sound enhances my experience of a walk, as I feel more connected to my environment…I am more likely to try a new route now that I have the app to use.\"\n\n\"I miss the serendipity of walking around and noticing things. Having Soundscape is nice – it requires no effort to hear about things around me. The relational information is useful and is a great app for situational awareness and exploring commercial corridors.\"\n\n\"[I used Soundscape] to locate a pub in the middle of York. [I] used a range of its options to first locate and then actually find it. It took me to within 3 meters of the door – brilliant!\""; +"faq.when_to_use_soundscape.answer" = "Soundscape has features and benefits that span a variety of scenarios and time scales. Furthermore, Soundscape’s value to you may evolve over time, so how you use it today may differ from how you will use it in three months. People often think about apps in terms of \"what problem is this app good at solving?\" Soundscape certainly can be used on a case by case basis when you have a specific information need – such as keeping track of a destination as you make your way there, helping to orient yourself when you emerge from a metro station, getting your bearings when exiting a car, or finding the street names for, or distance to, the next intersection. However, the philosophy behind Soundscape is one of \"lighting up your world with sound\", designed to be used anytime you are out and about to provide ambient awareness of your surroundings, such as keeping you aware of the names of the streets you are on, the direction you are heading, and the names of businesses you are passing. In this use mode, our users have referred to Soundscape as a \"nice companion app\", which supports \"serendipity\", to \"fill in the gaps in your mental map\" and provide more \"confidence when walking\". Here are some other examples of how our users are incorporating Soundscape into their life:\n\n\"Soundscape helped me get back on track after I got off the bus and headed off in the wrong direction.\"\n\n\"Even in the town where I have lived for 3 years, I have built an improved picture of what is around me [with Soundscape].\"\n\n\"The 3D sound enhances my experience of a walk, as I feel more connected to my environment…I am more likely to try a new route now that I have the app to use.\"\n\n\"I miss the serendipity of walking around and noticing things. Having Soundscape is nice – it requires no effort to hear about things around me. The relational information is useful and is a great app for situational awareness and exploring commercial corridors.\"\n\n\"[I used Soundscape] to locate a pub in the middle of York. [I] used a range of its options to first locate and then actually find it. It took me to within 3 meters of the door – brilliant!\""; /* Marker - A location that has been marked as important by the user or application. This can be an address, a business or a custom place such as an entrance, a bus stop or a bench. */ "faq.markers_function.question" = "What are Markers and how do I get the most out of them?"; @@ -3545,7 +3570,7 @@ "faq.what_can_I_set.question" = "What can I set as a beacon?"; /* An 'audio beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. Intersection - A junction where two or more roads meet or cross., Marker - A location that has been marked as important by the user or application. This can be an address, a business or a custom place such as an entrance, a bus stop or a bench. Point of interest - A specific location that someone may find useful or interesting. Quotation marks are written as \" */ -"faq.what_can_I_set.answer" = "You can set an audio beacon on any business, place, point of interest, address, or intersection. There are a few ways to set a location as a beacon. First, view the details for a location by either using the search bar to search for a place, or tapping one of the \"Places Nearby\", \"Markers & Routes\", or \"Current Location\" buttons and selecting a location. From the location details screen you can select the \"Start Audio Beacon\" button. Tapping this will return you to the home screen and turn on an audible beacon coming from the direction of the place you've selected. The name of the place along with its distance and physical address, if available, will now be displayed on the main screen."; +"faq.what_can_I_set.answer" = "You can set an audio beacon on any business, place, point of interest, address, or intersection. There are a few ways to set a location as a beacon. First, view the details for a location by either using the search bar to search for a place, or tapping one of the \"Places Nearby\", \"Markers & Routes\", or \"Current Location\" buttons and selecting a location. Then from the \"Location Details\" screen, select the \"Start Audio Beacon\" button. Tapping this will return you to the home screen and turn on an audible beacon coming from the direction of the place you've selected. The name of the place along with its distance and physical address, if available, will now be displayed on the main screen."; /* A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. */ "faq.how_to_use_beacon.question" = "How do I use a beacon like a pro?"; @@ -3557,13 +3582,13 @@ "faq.why_does_beacon_disappear.question" = "Why does the audible beacon disappear sometimes?"; /* A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ -"faq.why_does_beacon_disappear.answer" = "Soundscape’s audible beacon is fundamentally a directional cue, telling you where your destination is relative to the direction you are facing. When Soundscape is uncertain about what direction you are facing, it lowers the volume of the beacon. Most often this occurs if you have been walking with the phone stored in a pocket or bag, and you stop moving, such as to cross a street. The beacon will get louder once you start moving again, or if you hold the phone flat and point it in the direction you are facing."; +"faq.why_does_beacon_disappear.answer" = "Soundscape’s audible beacon is fundamentally a directional cue, telling you where your destination is relative to the direction you are facing. When Soundscape is uncertain about which way you are facing, it lowers the volume of the beacon. Most often this occurs if you have been walking with the phone stored in a pocket or bag, and you stop moving, such as to cross a street. The beacon will get louder once you start moving again, or if you hold the phone flat and point it away from you."; /* A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. */ "faq.beacon_on_address.question" = "Can I set a beacon on an address?"; /* Marker - A location that has been marked as important by the user or application. This can be an address, a business or a custom place such as an entrance, a bus stop or a bench., A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. 'Voiceover' is an iPhone feature to help people who are visually impaired use the iPhone. Quotes written as \" {NumberedPlaceholder="VoiceOver"} */ -"faq.beacon_on_address.answer" = "Yes you can. Addresses are not listed by default but can be found using the search field. To save this address so you don’t need to search for it again, you can add it as a marker from the home screen by selecting the \"add to markers\" button, or using VoiceOver actions on the beacon on the home screen."; +"faq.beacon_on_address.answer" = "Yes you can. Addresses are not listed by default but can be found using the search field. To save this address so you don’t need to search for it again, you can add it as a marker from the home screen by selecting the \"Add to Markers\" button, or using VoiceOver actions on the beacon on the home screen."; /* A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. */ "faq.beacon_on_home.question" = "How do I set a beacon on my home?"; @@ -3575,25 +3600,25 @@ "faq.how_close_to_destination.question" = "When I set a beacon on a destination, how close will Soundscape get me there?"; /* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. {NumberedPlaceholder="Soundscape"} */ -"faq.how_close_to_destination.answer" = "Soundscape can determine the location of your destination to within several meters, but not less. When Soundscape determines that you are close to your destination, you will hear a final callout that your destination is nearby, and the beacon will turn off. You can adjust when the beacon goes silent by going to \"Audio Beacon\" from the \"Settings\" screen and then moving the \"Audio Mute Distance\" slider up or down."; +"faq.how_close_to_destination.answer" = "Soundscape can determine the location of your destination to within several meters, but not less. When Soundscape determines that you are close to your destination, you will hear a final callout that your destination is nearby, and the beacon will turn off. You can adjust the distance at which the beacon goes silent by going to \"Audio Beacon\" from the \"Settings\" screen and then moving the \"Audio Mute Distance\" slider up or down."; /* A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. */ "faq.turn_beacon_back_on.question" = "Can I turn the beacon back on when I am close to my destination?"; /* Preserve meter unit - Do not convert. A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. "Location Services" refers to the feature of the same name in iOS. It should be translated in the same manner that it is in the Settings app under Settings > Privacy > Location Services. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. Quotes written as \" {NumberedPlaceholder="Soundscape","10"} */ -"faq.turn_beacon_back_on.answer" = "Yes, you can turn the beacon back on once Soundscape turns it off by selecting the \"unmute beacon button\"; however, since Location Services is only accurate to about 10 meters, we cannot guarantee the behavior of the beacon when you are within a few meters of your destination."; +"faq.turn_beacon_back_on.answer" = "Yes, you can turn the beacon back on once Soundscape turns it off by selecting the \"Unmute Beacon\" button; however, since Location Services is only accurate to about 10 meters, we cannot guarantee the behavior of the beacon when you are within a few meters of your destination."; /* Intersection - A junction where two or more roads meet or cross. Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ "faq.road_names.question" = "Why does Soundscape call out road names twice when I approach an intersection?"; /* Intersection - A junction where two or more roads meet or cross. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. 'Spatial audio' is where the audio through your headphones sounds as though it is coming from a given direction, as if it was actually coming from a speaker. 'T' here refers to the shape of the intersection, it's a three way intersection that resembles the shape of the letter 'T'. {NumberedPlaceholder="Soundscape"} */ -"faq.road_names.answer" = "To accommodate a variety of intersection layouts, Soundscape describes intersections as segments of roadways that depart from a common point. Soundscape uses spatial audio to indicate the name of the road that goes to the left, the name of the road that continues straight ahead, and the name of the road that goes to the right, in that order. If the description of the intersection begins with the road you are on rather than one to the left, then the intersection is a T with the road you are on continuing ahead and a road intersecting from the right. Similarly, if the description only includes a road to the left and to the right, you will know that the road you are on ends at a T ahead of you. This method of describing intersections also supports the case when a road changes name at an intersection."; +"faq.road_names.answer" = "To accommodate a variety of intersection layouts, Soundscape describes intersections as segments of roadways that depart from a common point. Soundscape uses spatial audio to indicate the names of the roads that go to the left, straight ahead, and to the right, in that order. If the description of the intersection begins with the road you are on rather than one to the left, then the intersection forms a sideways T with the road you are on continuing ahead and a road intersecting from the right. Similarly, if the description only includes a road to the left and to the right, you will know that the road you are on ends at a T ahead of you. This method of describing intersections also supports the case when a road changes name at an intersection."; /* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ "faq.why_not_every_business.question" = "Why doesn’t Soundscape announce every business that I pass?"; /* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape","Open Street Map","OSM"} */ -"faq.why_not_every_business.answer" = "Soundscape is designed not to be too chatty. In addition, it uses Open Street Map as its back-end data source. Open Street Map (OSM, https://www.openstreetmap.org/) is a community-developed and edited map of the world, relying on individuals, to enter and curate the data. If a business or point of interest is not announced by Soundscape, the most probable reason is that the business has not been added, or in some cases updated, by a member of the OSM community yet."; +"faq.why_not_every_business.answer" = "Soundscape is designed not to be too chatty. In addition, it uses Open Street Map as its back-end data source. Open Street Map (OSM, https://www.openstreetmap.org/) is a community-developed and edited map of the world, relying on individuals, to enter and curate the data. If Soundscape doesn't announce a business or point of interest, the most probable reason is that the business has not been added, or in some cases updated, by an OSM community member yet."; /* Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. */ "faq.callouts_stopping_in_vehicle.question" = "Why do some callouts stop when I'm in a vehicle?"; @@ -3605,7 +3630,7 @@ "faq.miss_a_callout.question" = "What if I don't understand a callout or miss it because of ambient noise?"; /* Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. Quotes written as \". {NumberedPlaceholder="Soundscape"} */ -"faq.miss_a_callout.answer" = "Soundscape has a list of your recent callouts so that you can revisit callouts that you might have missed. To find this, tap on the search bar on the Soundscape home screen. At the bottom of this page, there is a section for \"Recent Callouts\" where the callout you missed will be listed. Alternatively, you can shake your phone to repeat the last callout. From the \"Manage Callouts\" section of the \"Settings\" screen, turn on \"Repeat Callouts\"."; +"faq.miss_a_callout.answer" = "Soundscape has a list of your recent callouts so that you can revisit callouts you might have missed. To find this, tap the search bar on the home screen. At the bottom of this page, there is a section for \"Recent Callouts\" where the callout you missed will be listed. Alternatively, you can shake your phone to repeat the last callout. To enable this, go to the \"Manage Callouts\" section of the \"Settings\" screen and then turn on \"Repeat Callouts\"."; // MARK: How Soundscape Works @@ -3622,25 +3647,25 @@ "faq.supported_headsets.question" = "What headphones should I use with Soundscape?"; /* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. 3D spatial audio is where the audio through your headphones sounds as though it is coming from a given direction, as if it was actually coming from a speaker. Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. {NumberedPlaceholder="Soundscape"} */ -"faq.supported_headsets.answer" = "Which headphones you use with Soundscape is a matter of personal preference, and each option comes with benefits and trade-offs. The only specific requirement is to use a pair of stereo headphones so that you can take advantage of Soundscape’s 3D spatial audio callouts."; +"faq.supported_headsets.answer" = "Which headphones you use with Soundscape is a matter of personal preference, and each option comes with benefits and trade-offs. The only requirement is to use a pair of stereo headphones so that you can take advantage of Soundscape’s 3D spatial audio callouts."; /* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ "faq.battery_impact.question" = "How does Soundscape impact my iPhone’s battery?"; /* Sleep - To put the app in an idle state for a period of time. Snooze - To put the app in an idle state that is interrupted by user movement. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape","iPhone"} */ -"faq.battery_impact.answer" = "Battery life varies significantly depending on which iPhone you own and how old it is. The biggest drain on your battery is having the screen on, so to maximize your phone's battery life you should keep the screen locked whenever possible. To help minimize the impact on your iPhone battery Soundscape now has a Sleep Mode and a Snooze Mode. To further reduce the amount of battery you use, when you aren’t using Soundscape, you should force close it via your iPhone’s App Switcher."; +"faq.battery_impact.answer" = "Battery life varies significantly depending on the model and age of your iPhone. The biggest drain on your battery is having the screen on, so to maximize your phone's battery life you should keep the screen locked whenever possible. To help minimize the impact on your iPhone battery, Soundscape has a Sleep mode and a Snooze mode. To further reduce battery usage, when you aren’t using Soundscape, you should force close it via your iPhone’s App Switcher."; /* Sleep - To put the app in an idle state for a period of time. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ -"faq.sleep_mode_battery.question" = "How do I use Sleep Mode to minimize Soundscape’s impact on my phone battery?"; +"faq.sleep_mode_battery.question" = "How do I use Sleep mode to minimize Soundscape’s impact on my phone battery?"; /* Sleep - To put the app in an idle state for a period of time. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. "Location Services" refers to the feature of the same name in iOS. It should be translated in the same manner that it is in the Settings app under Settings > Privacy > Location Services. Quotes written as \" {NumberedPlaceholder="Soundscape"} */ -"faq.sleep_mode_battery.answer" = "To put Soundscape in Sleep Mode, select the \"Sleep\" button in the top right-hand corner of the home screen. When you select this, Soundscape will stop using Location Services and mobile data until you wake it up."; +"faq.sleep_mode_battery.answer" = "To put Soundscape in Sleep mode, select the \"Sleep\" button in the top right-hand corner of the home screen. When you select this, Soundscape will stop using Location Services and cellular data until you wake it up."; /* Snooze - To put the app in an idle state that is interrupted by user movement. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ "faq.snooze_mode_battery.question" = "How do I use Snooze mode to minimize Soundscape’s impact on my phone battery?"; /* Snooze - To put the app in an idle state that is interrupted by user movement. Sleep - To put the app in an idle state for a period of time. Wake Up - To restore the app from a sleep (idle) state. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. Quotes written as \" {NumberedPlaceholder="Soundscape"} */ -"faq.snooze_mode_battery.answer" = "To put Soundscape in Snooze Mode, select the \"Sleep\" button in the top right-hand corner of the home screen. Once Soundscape’s in Sleep mode, select the \"Wake up when I leave\" button and Soundscape will go in to a low power state until you leave your current location."; +"faq.snooze_mode_battery.answer" = "To put Soundscape in Snooze mode, select the \"Sleep\" button in the top right-hand corner of the home screen. Once Soundscape’s in Sleep mode, select the \"Wake Up When I Leave\" button and Soundscape will go into a low power state until you leave your current location."; /* A question about how different headsets affect the phone's battery consumption */ "faq.headset_battery_impact.question" = "How does my choice of headphones affect my phone's battery life?"; @@ -3652,19 +3677,19 @@ "faq.background_battery_impact.question" = "How does running Soundscape in the background impact my phone's battery life?"; /* 'Location Services' in the name of the iPhone feature that gives an app the iPhones location. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ -"faq.background_battery_impact.answer" = "Soundscape uses Location Services to determine your location. In our tests, Soundscape does not consume any more battery than the average map application; but if you are concerned about your phone's battery consumption, the following are a few tips which will help lower usage:\n\n1. Turn the screen display off as much as possible when you are not interacting with the app.\n2. When not using the app, close it down. Soundscape uses location services continually when it is running so that it always knows your location, even when you are not moving. Don’t forget to restart the app when you resume your journey.\n3. In cold weather, keep your phone warm as batteries perform more poorly in colder temperatures."; +"faq.background_battery_impact.answer" = "Soundscape uses Location Services to determine where you are. In our tests, Soundscape does not consume any more battery than the average map application; but if you are concerned about your phone's battery consumption, the following are a few tips which will help lower usage:\n\n1. Turn the screen display off as much as possible when you are not interacting with the app.\n2. When not using the app, close it down. Soundscape uses location services continually when it is running so that it always knows your location, even when you are not moving. Don’t forget to restart the app when you resume your journey.\n3. In cold weather, keep your phone warm as batteries perform more poorly in colder temperatures."; /* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ -"faq.mobile_data_use.question" = "How much mobile data does Soundscape use?"; +"faq.mobile_data_use.question" = "How much cellular data does Soundscape use?"; /* Wi-Fi - The set of standards for delivering digital information over high-frequency, wireless local area networks, defined by IEEE 802.11. 'Force close' is referring to the way to completely close an iPhone app rather than just putting it in to the background. "Sleep" should be translated the in the same way as the string for key "sleep.sleep". Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ -"faq.mobile_data_use.answer" = "The amount of mobile data used depends on how you use Soundscape. We have designed Soundscape to use only a small amount of data when you’re out and about by doing things like saving points as you walk around so you don’t need to download them again every time you go back to somewhere you’ve already been. To reduce the amount of mobile data you use, make sure you are connected to Wi-Fi whenever possible, particularly to download the app. When you are not using Soundscape, you should use the \"Sleep\" button to put Soundscape to sleep or force close the app."; +"faq.mobile_data_use.answer" = "The amount of cellular data used depends on how you use Soundscape. We have designed the app to use only a small amount of data when you’re out and about by doing things like saving points as you walk around so you don’t need to redownload them every time you go back to somewhere you’ve been before. To reduce the amount of cellular data you use, make sure you are connected to Wi-Fi whenever possible, particularly to download the app. When you are not using Soundscape, you should use the \"Sleep\" button to put Soundscape to sleep or force close the app."; /* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ "faq.difference_from_map_apps.question" = "How is Soundscape different from other map apps?"; /* Wayfinding - The process or activity of ascertaining one’s position and planning and following a route. 3D sound is where the audio through your headphones sounds as though it is coming from a given direction, as if it was actually coming from a speaker. Intersection - A junction where two or more roads meet or cross. Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using spatial audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ -"faq.difference_from_map_apps.answer" = "Soundscape provides an ambient description of your surroundings in aid of exploration and way-finding. Using spatial audio, Soundscape will call out points of interest, parks, roads, and intersections from the direction they physically are in your immediate environment as you walk. For example, if you pass a shop on your right, you will hear the name of the shop sounding from your right. As you approach an intersection, you will hear each road name sounding from the direction it goes in, beginning to your left, ahead and to the right.\n\nInstead of turn by turn directions as often provided by other map applications, Soundscape will play an audible beacon in the direction of your destination, empowering you to make your way there on your terms using your increased awareness of your surroundings and the location of your destination. Soundscape is designed to run in the background, enabling you to use a turn by turn directions app, all the while continuing to provide environmental awareness as you make your way to your destination."; +"faq.difference_from_map_apps.answer" = "Soundscape provides an ambient description of your surroundings in aid of exploration and wayfinding. Using spatial audio, Soundscape will call out points of interest, parks, roads, and intersections from the direction they physically are in your immediate environment as you walk. For example, if you pass a shop on your right, you will hear the name of the shop sounding from your right. As you approach an intersection, you will hear each road name sounding from the direction it goes in, beginning to your left, ahead and to the right.\n\nInstead of turn-by-turn directions as often provided by other map applications, Soundscape will play an audible beacon in the direction of your destination, empowering you to make your way there on your terms using your increased awareness of your surroundings and the location of your destination. Soundscape is designed to run in the background, enabling you to use a turn-by-turn directions app, all the while continuing to provide environmental awareness as you make your way to your destination."; /* Wayfinding - The process or activity of ascertaining one’s position and planning and following a route. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ "faq.use_with_wayfinding_apps.question" = "How do I use Soundscape with a wayfinding app?"; @@ -3676,19 +3701,19 @@ "faq.controlling_what_you_hear.question" = "How do I control what I hear and when I hear it in Soundscape?"; /* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. A 'beacon' or 'audio beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. Intersection - A junction where two or more roads meet or cross. Point of interest - A specific location that someone may find useful or interesting. Snooze - To put the app in an idle state that is interrupted by user movement. Sleep - To put the app in an idle state for a period of time. Quotes written as \" {NumberedPlaceholder="Soundscape"} */ -"faq.controlling_what_you_hear.answer" = "Soundscape provides several ways to control what you hear and when:\n\n1. Immediately stop all audio: Double tap the screen with two fingers to immediately turn off all audio, including any callout that is currently playing and the beacon if it is on. Callouts will resume automatically when you approach the next intersection or point of interest, but the audible beacon will not. Select the \"unmute beacon button\" on the home screen to resume hearing the beacon.\n2. Stop automatic callouts: When you are not traveling or have reached a destination, you probably will not need Soundscape to continue to notify you of things around you. Instead of exiting the app, you can put Soundscape in Snooze mode and it will wake up again when you leave, or you can put Soundscape in Sleep mode and it will stay off until you wake it up. Alternatively, you can select \"Settings\" from the menu and choose to turn all callouts off in the \"Manage Callouts\" section.\n3. Stop the beacon: There are several scenarios for which you might set a destination, but not need the audible beacon on. For example, you may know exactly how to get to your destination, but you just want to get automatic updates about how far away you are. Or, you may know roughly how to get to your destination, and you only need the audio beacon when you're almost there. Whatever the case, you can choose when to hear the beacon by toggling the \"mute beacon\"/\"unmute beacon\" button on the home screen."; +"faq.controlling_what_you_hear.answer" = "Soundscape provides several ways to control what you hear and when:\n\n1. Immediately stop all audio: Double tap the screen with two fingers to immediately turn off all audio, including any callout that is currently playing and the beacon if it is on. Callouts will resume automatically when you approach the next intersection or point of interest, but the audible beacon will not. Select the \"Unmute Beacon\" button on the home screen to resume hearing the beacon.\n2. Stop automatic callouts: When you are not traveling or have reached a destination, you probably will not need Soundscape to continue to notify you of things around you. Instead of exiting the app, you can put Soundscape in Snooze mode and it will wake up when you leave, or you can put Soundscape in Sleep mode and it will stay off until you wake it up. Alternatively, you can select \"Settings\" from the menu and turn all callouts off in the \"Manage Callouts\" section.\n3. Stop the beacon: There are several scenarios for which you might set a destination, but not need the audible beacon on. For example, you may know exactly how to get to your destination, but you just want to get automatic updates about how far away you are. Or, you may know roughly how to get to your destination, and you only need the audio beacon when you're almost there. Whatever the case, you can choose when to hear the beacon by toggling the \"Mute Beacon\"/\"Unmute Beacon\" button on the home screen."; /* A frequently asked question about how the user should hold their phone */ "faq.holding_phone_flat.question" = "Do I need to hold the phone in my hand all the time?"; /* Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. Quotes written as \" {NumberedPlaceholder="Soundscape"} */ -"faq.holding_phone_flat.answer" = "No! While walking you can put the phone away in a bag or pocket or wherever is convenient. Soundscape will use the direction you are walking to figure out which callouts to announce to your left and to your right. When you stop moving, Soundscape does not know which direction you are facing. If the audible beacon is on, you will notice it get quiet until you start moving again. You can pull the phone out to tap the \"Hear My Surroundings\" buttons at the bottom of the home screen at any time, but make sure to hold the phone with the top of the phone pointing in the direction you are facing and with the screen to the sky. In this \"flat\" position, Soundscape will use the phone’s compass to determine which way you are facing and provide accurate spatial callouts. If the beacon is on, you will also notice that it returns to full volume."; +"faq.holding_phone_flat.answer" = "No! While walking you can put the phone away in a bag or pocket or wherever is convenient. Soundscape will use the direction you are walking to figure out which callouts to announce to your left and to your right. When you stop moving, Soundscape does not know which way you are facing. If the audible beacon is on, you will notice it get quiet until you start moving again. You can pull the phone out to tap the \"Hear My Surroundings\" buttons at the bottom of the home screen at any time, but make sure to hold the phone with the top of the phone pointing in the direction you are facing and with the screen to the sky. In this \"flat\" position, Soundscape will use the phone’s compass to determine which way you are facing and provide accurate spatial callouts. If the beacon is on, you will also notice that it returns to full volume."; /* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ "faq.personalize_experience.question" = "In what ways can I personalize my Soundscape experience?"; /* All of the terms in the string "Settings > Accessibility > Spoken Content > Voices" should be translated such that they are consistant with those in the iOS Settings app. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. 'Nearby Markers' is the name of one of the buttons in the app. 'Voiceover' is an iPhone feature to help people who are visually impaired use the iPhone. 'Audio Ducking' is the name of an accessibility feature on the iPhone which reduces the volume of an app while 'Voiceover' is speaking. 'Touch ID' is the name of the iPhone feature for unlocking your phone using your finger print. 'Face ID' is the name of the iPhone feature for unlocking your phone using your face. 'Passcode' and 'iPhone Unlock' are all names of sections in the iPhone 'Settings' app. 'My Location', 'Around Me' and 'Ahead of Me' are buttons in the Soundscape app. {NumberedPlaceholder="Soundscape", "VoiceOver","Touch ID", "Face ID","iOS"} */ -"faq.personalize_experience.answer" = "Soundscape allows you to customize three key aspects of the callouts you hear as you are walking:\n\n1. Voice: You can choose which of the available voices on iOS you would like Soundscape to use, as well as the speed at which callouts are spoken. From the Menu, select \"Settings\" and then from \"General Settings\" select Voice to adjust the Speaking Rate and Voice settings. Additional voices, including enhanced quality voices, can be downloaded in the iOS Settings app at Settings > Accessibility > Spoken Content > Voices.\n2. Distance Metric: Soundscape allows you to hear all distances in either feet or meters. From the Menu, select \"Settings\" and then from \"General Settings\" select \"Language & Region\". The Units of Measure section allows you to toggle between two options: Imperial (feet) and Metric (meters).\n3. Markers: You can mark your world with anything you care about. You can mark things that are personal and relevant to you like your home, your office and your preferred grocery store. Then Soundscape will automatically call out marked places as you walk by or approach them, or you can also use the Nearby Markers button at the bottom of the home screen to hear a spatial callout of marked places around you. These markers will remain personal to you and will not be available to anyone else.\n\nIn addition to the above, the following VoiceOver settings can influence how Soundscape behaves:\n\n1. VoiceOver Tips: When VoiceOver tips are turned ON, you will hear more information about all the buttons on the primary Soundscape screen. You can turn on VoiceOver tips by navigating to the iOS Settings app and going to Accessibility > VoiceOver > Verbosity, and turning the Speak Hints setting on.\n2. Audio Ducking: Soundscape is designed to work with Audio Ducking turned OFF. When Audio Ducking is on, automatic callouts can be difficult to hear if VoiceOver is used simultaneously. We recommend turning Audio Ducking off to make it easier to hear all automatic callouts that occur as you are interacting with the phone. Audio ducking can be turned off in VoiceOver settings or via the VoiceOver rotor.\n3. Touch ID or Face ID to Unlock: Setting your phone to unlock using Touch ID or Face ID will make unlocking the phone fast and easy, and in turn, allow you to access the My Location, Around Me, and Ahead of Me buttons as quickly as possible when you are on the go. Set up Touch ID or Face ID unlocking in the iOS Settings app."; +"faq.personalize_experience.answer" = "Soundscape allows you to customize three key aspects of the callouts you hear as you are walking:\n\n1. Voice: You can choose which of the available voices on iOS you would like Soundscape to use, as well as the speed at which callouts are spoken. From the Menu, select \"Settings\" and then from \"General Settings\" select \"Voice\" to adjust the Speaking Rate and Voice settings. Additional voices, including enhanced quality voices, can be downloaded in the iOS Settings app at Settings > Accessibility > Read & Speak (Spoken Content) > Voices.\n2. Measuring Distance: Soundscape allows you to hear all distances in either feet or meters. From the Menu, select \"Settings\" and then from \"General Settings\" select \"Language & Region\". The Units of Measure section allows you to toggle between two options: Imperial (feet) and Metric (meters).\n3. Markers: You can mark your world with anything you care about. You can mark things that are personal and relevant to you like your home, your office and your preferred grocery store. Then Soundscape will automatically call out marked places as you walk by or approach them, or you can also use the \"Nearby Markers\" button at the bottom of the home screen to hear a spatial callout of marked places around you. These markers will remain personal to you and will not be available to anyone else.\n\nIn addition to the above, the following settings can influence Soundscape's behavior:\n\n1. VoiceOver Tips: When VoiceOver tips are turned ON, you will hear more information about all the buttons on the main screen. You can turn on VoiceOver tips by navigating to the iOS Settings app and going to Accessibility > VoiceOver > Verbosity, and turning the Speak Hints setting on.\n2. Audio Ducking: Soundscape is designed to work with Audio Ducking turned OFF. When Audio Ducking is on, automatic callouts can be difficult to hear if VoiceOver is used simultaneously. We recommend turning Audio Ducking off to make it easier to hear all automatic callouts. Audio ducking can be turned off in VoiceOver settings or via the VoiceOver rotor.\n3. Touch ID or Face ID to Unlock: Setting your phone to unlock using Touch ID or Face ID will make unlocking the phone fast and easy, and in turn, allow you to access the \"My Location\", \"Around Me\", and \"Ahead of Me\" buttons as quickly as possible when you are on the go. Set up Touch ID or Face ID unlocking in the iOS Settings app."; /* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape","Open Street Map"} */ "faq.what_is_osm.question" = "What is Open Street Map and why do we use it for Soundscape?"; @@ -3702,22 +3727,22 @@ "faq.tip.beacon_quiet" = "If you put your phone in your pocket and stop moving, the beacon sound will get quieter because Soundscape can’t tell which way you are facing. Solve this by starting to walk again, or pulling your phone out and holding it flat."; /* The 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. "Start Audio Beacon" should be translated the same as "location_detail.action.beacon" Quotes written as \" */ -"faq.tip.setting_beacon_on_address" = "You can set a beacon on any address. From the home screen, tap on the search bar and then type the address. After selecting the address in the search results, a \"Location Details\" screen will be shown and it has an option to \"Start Audio Beacon\" on the address. In this way, you can set a beacon on businesses, places, points of interest, and residences that are not in Open Street Map."; +"faq.tip.setting_beacon_on_address" = "You can set a beacon on any address. From the home screen, tap on the search bar and then type the address. After selecting the address in the search results, a \"Location Details\" screen will be shown containing the option to \"Start Audio Beacon\" on the address. In this way, you can set a beacon on businesses, places, points of interest, and residences that are not in Open Street Map."; /* 'Nearby Places' is a screen in the app that shows a list of places that are close to the user. Quotes written as \" */ -"faq.tip.finding_bus_stops" = "You can find nearby bus stops by selecting the \"Public Transit\" filter in the Nearby Places list."; +"faq.tip.finding_bus_stops" = "You can find nearby bus stops by selecting the \"Public Transit\" filter in the Places Nearby list."; /* Preserve meters unit - Do not convert. The 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. {NumberedPlaceholder="50"} */ "faq.tip.turning_beacon_off" = "You can turn on and off the rhythmic sound of the beacon using the mute button on the home screen. If the beacon is muted, you will still get updates about the distance to your destination every 50 meters or so."; /* 'Manage Callouts' is the name of one of the sections on the Soundscape Settings screen. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. Snooze - To put the app in an idle state that is interrupted by user movement. Sleep - To put the app in an idle state for a period of time. Quotes written as \" {NumberedPlaceholder="Soundscape"} */ -"faq.tip.turning_off_auto_callouts" = "If you still want to interact with Soundscape but don’t want to hear automatic callouts, you can turn them off by going to the \"Manage Callouts\" section of the \"Settings\" screen from the menu and then turn off \"Allow Callouts\". Or, if you aren’t going to be using Soundscape, you can put it in either Sleep or Snooze mode using the \"Sleep\" button on the home screen."; +"faq.tip.turning_off_auto_callouts" = "If you still want to interact with Soundscape but don’t want to hear automatic callouts, you can turn callouts off by going to the \"Manage Callouts\" section of the \"Settings\" screen from the menu. Or, if you aren’t going to be using Soundscape, you can put it in either Sleep or Snooze mode using the \"Sleep\" button on the home screen."; /* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ "faq.tip.hold_phone_flat" = "Soundscape works best when you hold the phone flat with the screen facing the sky and the top of the phone pointing away from you."; /* Marker - A location that has been marked as important by the user or application. This can be an address, a business or a custom place such as an entrance, a bus stop or a bench. The 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. 'Manage Markers' is the name of one of the options in the Soundscape menu. Quotes written as \" */ -"faq.tip.create_marker_at_bus_stop" = "If there is a bus route you take regularly, set your pickup and exit stops as Markers. This way they will be saved so you can find them again easily, just go to \" Markers & Routes\" from the home screen and find them on the \"Markers\" page. You can set a beacon on them and you will get periodic updates on how close you are to your exit stop. Note: you can turn off the rhythmic sound and you will still get distance updates along the way."; +"faq.tip.create_marker_at_bus_stop" = "If there is a bus route you take regularly, set your pickup and exit stops as markers. This way they will be saved so you can find them again easily, just go to \"Markers & Routes\" from the home screen and find them on the \"Markers\" page. You can set a beacon on them and you will get periodic updates on how close you are to your exit stop. Note: you can turn off the rhythmic sound and you will still get distance updates along the way."; /* Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. */ "faq.tip.two_finger_double_tap" = "Tapping the screen twice with two fingers will silence any active callouts."; @@ -3729,7 +3754,7 @@ "donation.title" = "Donate to Soundscape Community"; /* text for donation screen */ -"donation.body" = "Please support the ongoing development of the Soundscape Community app by donating on our fundraising page. Every donation brings us a step closer to our vision of helping bring about a world where EVERYONE has equal access to information on their surroundings through our life-enhancing technology."; +"donation.body" = "Please support the ongoing development of the Soundscape Community app by donating on our fundraising page. Every donation brings us a step closer to our vision of helping bring about a world where EVERYONE has equal access to information on their surroundings through our life-enhancing technology."; /* Donation link title */ "donation.link" = "Go to Fundraising Page"; diff --git a/apps/ios/GuideDogs/Assets/Localization/es-ES.lproj/Localizable.strings b/apps/ios/GuideDogs/Assets/Localization/es-ES.lproj/Localizable.strings index a9d50cb9f..1e2e6f756 100644 --- a/apps/ios/GuideDogs/Assets/Localization/es-ES.lproj/Localizable.strings +++ b/apps/ios/GuideDogs/Assets/Localization/es-ES.lproj/Localizable.strings @@ -19,7 +19,7 @@ /* */ -"general.alert.not_now" = "Ahora no"; +"general.alert.not_now" = "No ahora"; /* */ @@ -103,7 +103,7 @@ /* */ -"general.alert.open_settings" = "Abrir Ajustes"; +"general.alert.open_settings" = "Abrir ajustes"; /* */ @@ -115,7 +115,7 @@ /* */ -"general.alert.confirmation_title" = "¿Estás seguro?"; +"general.alert.confirmation_title" = "¿Seguro que quieres hacerlo?"; /* */ @@ -131,7 +131,7 @@ /* */ -"general.loading.almost_ready" = "Ya casi está…"; +"general.loading.almost_ready" = "Casi está listo…"; /* */ @@ -159,11 +159,11 @@ /* */ -"general.alert.offline_search.title" = "Búsqueda no disponible"; +"general.alert.offline_search.title" = "La búsqueda no está disponible"; /* */ -"general.alert.offline_search.message" = "Cuando Soundscape funciona sin conexión, la búsqueda está desactivada. Descartar para volver a la pantalla anterior"; +"general.alert.offline_search.message" = "Cuando Soundscape está funcionando sin conexión, la búsqueda está deshabilitada. Descarta para regresar a la pantalla anterior"; /* */ @@ -179,7 +179,7 @@ /* */ -"general.loading.end" = "Limpiando…"; +"general.loading.end" = "Poniendo todo en orden…"; /* */ @@ -231,47 +231,47 @@ /* */ -"general.error.location_services" = "Activar los servicios de localización para utilizar Soundscape"; +"general.error.location_services" = "Activa Localización para usar Soundscape"; /* */ -"general.error.precise_location" = "Activar la ubicación precisa para utilizar Soundscape"; +"general.error.precise_location" = "Activa Ubicación exacta para usar Soundscape"; /* */ -"general.error.location_services.authorize.title" = "Permitir servicios de localización"; +"general.error.location_services.authorize.title" = "Autorizar Localización"; /* */ -"general.error.location_services.authorize.description" = "Soundscape usa tu ubicación para encontrar e informarte sobre los lugares y cosas que te rodean. La aplicación debe tener tu permiso para utilizar los servicios de localización."; +"general.error.location_services.authorize.description" = "Soundscape usa tu ubicación para encontrar los lugares y elementos de tu entorno e informarte de ellos. La aplicación necesita tu permiso para usar los servicios de localización."; /* */ -"general.error.location_services.authorize.instructions" = "1. Abre la aplicación Ajustes a continuación\n2. Selecciona \"Ubicación\"\n3. Selecciona \"Siempre\" o \"Cuando se use la app\""; +"general.error.location_services.authorize.instructions" = "1. Abre la aplicación de ajustes a continuación\n2. Selecciona Ubicación\n3. Selecciona Siempre o Cuando se use la app"; /* */ -"general.error.location_services.precise_location.instructions" = "1. Abre la aplicación Ajustes a continuación\n2. Selecciona \"Ubicación\"\n3. Activa \"Ubicación exacta\""; +"general.error.location_services.precise_location.instructions" = "1. Abre la aplicación de ajustes a continuación\n2. Selecciona Ubicación\n3. Activa Ubicación exacta"; /* */ -"general.error.location_services_resume" = "Abre Soundscape para reanudar servicios de localización"; +"general.error.location_services_resume" = "Abre Soundscape para reanudar los servicios de localización"; /* */ -"general.error.location_services_enable" = "Activar servicios de localización"; +"general.error.location_services_enable" = "Habilitar Localización"; /* */ -"general.error.location_services_enable_description" = "Los servicios de localización están desactivados actualmente. Soundscape no puede funcionar cuando Localización está desactivada."; +"general.error.location_services_enable_description" = "Los servicios de localización están deshabilitados actualmente. Soundscape no puede funcionar cuando los servicios de localización están desactivados."; /* */ -"general.error.location_services_enable_instructions.2" = "Activa los servicios de localización en la aplicación Ajustes para continuar.\n\n1. Presiona el botón Atrás (en Ajustes)\n2. Selecciona Privacidad y seguridad\n3. Selecciona Localización \n4. Activa Localización"; +"general.error.location_services_enable_instructions.2" = "Activa Localización en la aplicación de ajustes para continuar.\n\n1. Presiona el botón atrás hasta llegar a los ajustes principales\n2. Selecciona Privacidad y seguridad\n3. Selecciona Localización\n4. Activa Localización"; /* */ -"general.error.location_services_enable_instructions.3" = "Activa los servicios de localización en la aplicación Ajustes para continuar.\n\n1. Presiona Abrir Ajustes\n2. Presiona el botón atrás (con el título Ajustes)\n3. Selecciona Privacidad y seguridad\n4. Selecciona Localización\n5. Activa Localización"; +"general.error.location_services_enable_instructions.3" = "Activa Localización en la aplicación de ajustes para continuar.\n\n1. Presiona Abrir ajustes\n2. Presiona el botón atrás hasta llegar a los ajustes principales\n3. Selecciona Privacidad y seguridad\n4. Selecciona Localización\n5. Activa Localización"; /* */ @@ -279,15 +279,15 @@ /* */ -"general.error.heading" = "Soundscape no está seguro de qué dirección estás mirando. Por favor, mantén tu teléfono plano o empieza a caminar e inténtalo de nuevo."; +"general.error.heading" = "Soundscape no está seguro de hacia qué dirección estás orientado. Mantén el teléfono plano o comienza a caminar e inténtalo de nuevo"; /* */ -"general.error.location_services_find_location_error.try_again" = "Estamos teniendo problemas para encontrar tu ubicación actual. Vuelve a intentarlo más tarde."; +"general.error.location_services_find_location_error.try_again" = "Tenemos problemas para encontrar tu ubicación actual. Vuelve a intentarlo más tarde."; /* */ -"general.error.wifi" = "¡Ay! Parece que no estás conectado a ninguna Wi-Fi."; +"general.error.wifi" = "¡Ay! No parece que estés conectado a Wi-Fi."; /* */ @@ -299,7 +299,7 @@ /* */ -"general.error.network_connection_required.deleting_data" = "Se requiere una conexión de red para eliminar y volver a cargar datos de mapas de Soundscape. Comprueba que el teléfono no se encuentra en el modo avión."; +"general.error.network_connection_required.deleting_data" = "Se requiere una conexión de red para eliminar y volver a cargar datos de mapas de Soundscape. Comprueba que el teléfono no se encuentra en el Modo Avión."; /* */ @@ -307,7 +307,7 @@ /* */ -"general.error.ble.unauthorized.message" = "Se requiere permiso Bluetooth para conectar tus dispositivos. Abre la aplicación Ajustes para habilitar el Bluetooth. Ten en cuenta que esto puede hacer que se reinicie la aplicación."; +"general.error.ble.unauthorized.message" = "Se requiere permiso Bluetooth para conectar tus dispositivos. Abre la aplicación de ajustes para habilitar el Bluetooth. Ten en cuenta que esto puede hacer que se reinicie la aplicación."; /* */ @@ -327,15 +327,15 @@ /* */ -"device_motion.enable.title" = "Activar el seguimiento de Actividad física"; +"device_motion.enable.title" = "Habilitar el seguimiento de Actividad física"; /* */ -"device_motion.enable.description" = "El seguimiento de Actividad física está desactivado actualmente. Soundscape no puede funcionar cuando el seguimiento de Actividad física está desactivado."; +"device_motion.enable.description" = "El seguimiento de Actividad física está deshabilitado actualmente. Soundscape no puede funcionar cuando el seguimiento de Actividad física está desactivado."; /* */ -"device_motion.enable.instructions" = "Activa Seguimiento deportivo en la aplicación Ajustes para continuar.\n\n1. Presiona Abrir Ajustes\n2. Presiona el botón Atrás (con el título Ajustes)\n3. Selecciona Privacidad y seguridad\n4. Selecciona Actividad física\n5. Activa Seguimiento deportivo\n6. Reinicia Soundscape"; +"device_motion.enable.instructions" = "Activa Seguimiento deportivo en la aplicación de ajustes para continuar.\n\n1. Presiona Abrir ajustes\n2. Presiona el botón atrás hasta llegar a los ajustes principales\n3. Selecciona Privacidad y seguridad\n4. Selecciona Actividad física\n5. Activa Seguimiento deportivo\n6. Reinicia Soundscape"; /* */ @@ -347,7 +347,7 @@ /* */ -"device_motion.authorize.instructions" = "1. Abre la aplicación Ajustes a continuación\n2. Activa el seguimiento de Actividad física"; +"device_motion.authorize.instructions" = "1. Abre la aplicación de ajustes a continuación\n2. Activa el seguimiento de Actividad física"; /* */ @@ -359,27 +359,27 @@ /* */ -"settings.clear_cache.alert_message" = "Soundscape almacena datos de mapas para reducir los datos y el consumo de la batería. La eliminación de los datos almacenados requerirá que Soundscape vuelva a cargar los datos."; +"settings.clear_cache.alert_message" = "Soundscape almacena datos de mapas para reducir el uso de datos móviles y el consumo de la batería. Eliminar los datos almacenados requerirá que Soundscape vuelva a cargar los datos."; /* */ -"settings.clear_cache.markers.alert_title" = "¿Deseas mantener marcadores y rutas?"; +"settings.clear_cache.markers.alert_title" = "¿Deseas eliminar marcadores y rutas?"; /* */ -"settings.clear_cache.markers.alert_message" = "Selecciona \"Eliminar\" para eliminar los marcadores, señales y rutas, o \"Mantener\" para eliminar únicamente los datos del mapa.¡ \"Eliminar\" restablecerá la aplicación a su estado original y no se puede deshacer!"; +"settings.clear_cache.markers.alert_message" = "¿Seguro que deseas eliminar todos los marcadores y rutas? ¡Elegir \"Eliminar\" restablecerá la aplicación a un estado de recién instalada y no se podrá deshacer!"; /* */ -"settings.clear_cache.no_service.title" = "No se pueden borrar los datos de los mapas almacenados"; +"settings.clear_cache.no_service.title" = "No se pueden borrar los datos de mapas almacenados"; /* */ -"settings.clear_cache.no_service.message" = "Soundscape no puede conectarse a internet. Se requiere una conexión a Internet para borrar los datos del mapa almacenados, para que los datos del mapa puedan actualizarse."; +"settings.clear_cache.no_service.message" = "Soundscape no puede conectarse ahora a Internet. Se requiere una conexión a Internet al borrar los datos de mapas almacenados para que se puedan actualizar los datos."; /* */ -"settings.telemetry.optout.alert_title" = "Desactivar telemetría"; +"settings.telemetry.optout.alert_title" = "Rechazo de telemetría"; /* */ @@ -483,11 +483,11 @@ /* */ -"settings.audio.mix_with_others.title" = "Activar controles multimedia"; +"settings.audio.mix_with_others.title" = "Habilitar controles multimedia"; /* */ -"settings.audio.mix_with_others.description" = "Usa esta opción para activar el control de Soundscape con los botones de los auriculares y los botones de reproducción multimedia de la pantalla de bloqueo. Ten en cuenta que cuando está activada, no se puede usar Soundscape mientras se reproducen otros medios como podcasts o música."; +"settings.audio.mix_with_others.description" = "Usa esta opción para habilitar el control de Soundscape con los botones de los auriculares y los botones de reproducción multimedia de la pantalla de bloqueo. Ten en cuenta que cuando está activada, no se puede usar Soundscape mientras se reproducen otros medios como podcasts o música."; /* */ @@ -555,7 +555,7 @@ /* */ -"voice.apple.preview_hint" = "Pulsa dos veces la voz para seleccionarla y reproducir una muestra."; +"voice.apple.preview_hint" = "Pulsa dos veces la voz para seleccionarla y reproducir una muestra"; /* */ @@ -563,7 +563,7 @@ /* */ -"voice.settings.enhanced_available" = "Es posible que exista una versión de mayor calidad para esta voz. Para descargarla y descargar otras voces, ve a la sección Contenido leído de los ajustes de accesibilidad de iOS."; +"voice.settings.enhanced_available" = "Es posible que exista una versión de mayor calidad de esta voz. Para descargarla, así como para descargar otras voces, ve a la sección Lectura y voz de los ajustes de accesibilidad de iOS."; /* */ @@ -595,11 +595,11 @@ /* */ -"beacon.settings.melodies" = "Activar indicaciones de salida y llegada"; +"beacon.settings.melodies" = "Habilitar indicaciones de salida y llegada"; /* */ -"beacon.settings.explanation" = "Selecciona un estilo de señal que resulte cómodo en los oídos y que se escuche fácilmente al aire libre y en entornos ruidosos. Asegúrate de que puedes determinar con facilidad tu dirección a través de tu dispositivo de escucha preferido (auriculares o altavoz del teléfono)."; +"beacon.settings.explanation" = "Selecciona un estilo de señal que resulte cómodo en los oídos y que se escuche fácilmente al aire libre y en entornos ruidosos. Asegúrate de que puedes determinar con facilidad su dirección a través de tu dispositivo de escucha preferido (auriculares o altavoz del teléfono)."; /* */ @@ -611,11 +611,11 @@ /* */ -"troubleshooting.gps_status.explanation.meters" = "Este valor es una estimación de la precisión con la que Soundscape sabe dónde te encuentras. Menos de ±10 metros es una buena distancia. Menos de ±20 metros es una distancia satisfactoria. Todas las distancias que sean superiores serán insuficientes. Los datos de ubicación tienen la máxima precisión cuando el usuario se encuentra en el exterior y no debajo de estructuras."; +"troubleshooting.gps_status.explanation.meters" = "Este valor es una estimación de la precisión con la que Soundscape sabe dónde te encuentras. Menos de ±10 metros es una buena distancia. Menos de ±20 metros es una distancia aceptable. Más de ±20 metros necesita ser recalculado. Los datos de ubicación son más precisos cuando estás afuera y no debajo de ninguna estructura."; /* */ -"troubleshooting.gps_status.explanation.feet" = "Este valor es una estimación de la precisión con la que Soundscape sabe dónde te encuentras. Menos de ±30 pies es una buena distancia. Menos de ±60 pies es una distancia satisfactoria. Todas las distancias que sean superiores serán insuficientes. Los datos de ubicación tienen la máxima precisión cuando el usuario se encuentra en el exterior y no debajo de estructuras."; +"troubleshooting.gps_status.explanation.feet" = "Este valor es una estimación de la precisión con la que Soundscape sabe dónde te encuentras. Menos de ±30 pies es una buena distancia. Menos de ±60 pies es una distancia aceptable. Más de ±60 pies necesita ser recalculado. Los datos de ubicación son más precisos cuando estás afuera y no debajo de ninguna estructura."; /* */ @@ -631,11 +631,11 @@ /* */ -"troubleshooting.check_audio.hint" = "Pulsa dos veces para comprobar el estado de los auriculares que usas con Soundscape."; +"troubleshooting.check_audio.hint" = "Pulsa dos veces para comprobar el estado de los auriculares"; /* */ -"troubleshooting.check_audio.explanation" = "Pulsa en este botón para conocer el estado de los auriculares que usas con Soundscape."; +"troubleshooting.check_audio.explanation" = "Pulsa este botón para oír sobre el estado de los auriculares que usas con Soundscape."; /* */ @@ -643,11 +643,11 @@ /* */ -"troubleshooting.cache.hint" = "Pulsa dos veces para eliminar y volver a cargar datos de mapas almacenados."; +"troubleshooting.cache.hint" = "Pulsa dos veces para eliminar y volver a cargar datos de mapas almacenados"; /* */ -"troubleshooting.cache.explanation" = "Soundscape descarga datos de mapas conforme camina para poder indicarte los elementos y lugares que tienes a tu alrededor. Si tienes problemas con Soundscape o consume demasiada memoria, puedes borrar los datos de mapas almacenados y Soundscape solo volverá a descargar los datos de mapas que se encuentran cerca de tu ubicación actual."; +"troubleshooting.cache.explanation" = "Soundscape descarga datos de mapas conforme caminas para poder indicarte los elementos y lugares a tu alrededor. Si tienes problemas con Soundscape o consume demasiada memoria, puedes borrar los datos de mapas almacenados y Soundscape solo volverá a descargar los datos de mapas que se encuentran cerca de tu ubicación actual."; /* */ @@ -671,11 +671,11 @@ /* */ -"settings.new_feature.accept_button.acc_label" = "Pulsa dos veces para cerrar anuncios."; +"settings.new_feature.accept_button.acc_label" = "Pulsa dos veces para cerrar anuncios"; /* */ -"settings.new_feature.accept_button.acc_hint" = "Pulsa dos veces para ver el anuncio de la siguiente actualización."; +"settings.new_feature.accept_button.acc_hint" = "Pulsa dos veces para ver el anuncio de la siguiente actualización"; /* */ @@ -763,7 +763,7 @@ /* */ -"beacon.action.remove_beacon.double_tap.acc_hint" = "Pulsa dos veces para quitar la señal de audio actual."; +"beacon.action.remove_beacon.double_tap.acc_hint" = "Pulsa dos veces para quitar la señal de audio actual"; /* */ @@ -771,7 +771,7 @@ /* */ -"beacon.action.mute_beacon.acc_hint" = "Pulsa dos veces para silenciar la señal de audio."; +"beacon.action.mute_beacon.acc_hint" = "Pulsa dos veces para silenciar la señal de audio"; /* */ @@ -779,7 +779,7 @@ /* */ -"beacon.action.unmute_beacon.acc_hint" = "Pulsa dos veces para reactivar la señal de audio."; +"beacon.action.unmute_beacon.acc_hint" = "Pulsa dos veces para reactivar la señal de audio"; /* */ @@ -791,7 +791,7 @@ /* */ -"beacon.action.mute_unmute_beacon.acc_hint" = "Pulsa dos veces para silenciar o reactivar la señal de audio."; +"beacon.action.mute_unmute_beacon.acc_hint" = "Pulsa dos veces para silenciar o reactivar la señal de audio"; /* */ @@ -799,7 +799,7 @@ /* */ -"beacon.action.view_details.acc_hint.details" = "Pulsa dos veces para ver detalles adicionales."; +"beacon.action.view_details.acc_hint.details" = "Pulsa dos veces para ver detalles adicionales"; /* */ @@ -815,7 +815,7 @@ /* */ -"preview.title" = "vista previa de calle de Soundscape"; +"preview.title" = "Soundscape Street Preview"; /* */ @@ -843,7 +843,7 @@ /* */ -"preview.content.edge.text.accessibility_hint" = "Pulsa dos veces para pasar al siguiente cruce."; +"preview.content.edge.text.accessibility_hint" = "Pulsa dos veces para pasar al siguiente cruce"; /* */ @@ -855,7 +855,7 @@ /* */ -"preview.go_back.accessibility_text" = "Pulsa dos veces para volver a tu cruce anterior."; +"preview.go_back.accessibility_text" = "Pulsa dos veces para volver a tu cruce anterior"; /* */ @@ -863,7 +863,7 @@ /* */ -"preview.search.accessibility_hint" = "Pulsa dos veces para buscar o examinar lugares cercanos."; +"preview.search.accessibility_hint" = "Pulsa dos veces para buscar o examinar lugares cercanos"; /* */ @@ -871,7 +871,7 @@ /* */ -"preview.alert.restart.message" = "¿Deseas reiniciar la vista previa de calle de Soundscape en esta ubicación?"; +"preview.alert.restart.message" = "¿Deseas reiniciar Soundscape Street Preview en esta ubicación?"; /* */ @@ -879,11 +879,11 @@ /* */ -"preview.callout.paused" = "vista previa de calle en pausa"; +"preview.callout.paused" = "Street Preview en pausa"; /* */ -"preview.callout.end" = "Finalizando la vista previa de calle de Soundscape"; +"preview.callout.end" = "Finalizando Soundscape Street Preview"; /* */ @@ -891,19 +891,19 @@ /* */ -"preview.callout.start.at" = "Iniciando la vista previa de calle en %@"; +"preview.callout.start.at" = "Iniciando Street Preview en %@"; /* */ -"preview.callout.start.along" = "Iniciando la vista previa de calle por %@"; +"preview.callout.start.along" = "Iniciando Street Preview por %@"; /* */ -"preview.callout.continue.at" = "Continuando la vista previa de calle en %@"; +"preview.callout.continue.at" = "Continuando Street Preview en %@"; /* */ -"preview.callout.continue.along" = "Continuando la vista previa de calle por %@"; +"preview.callout.continue.along" = "Continuando Street Preview por %@"; /* */ @@ -955,7 +955,7 @@ /* */ -"preview.include_unnamed_roads.subtitle" = "Incluir carreteras sin nombre durante la vista previa de calle de Soundscape"; +"preview.include_unnamed_roads.subtitle" = "Incluir carreteras sin nombre durante Soundscape Street Preview"; /* */ @@ -967,19 +967,19 @@ /* */ -"preview.include_unnamed_roads.hint.off" = "Pulsa dos veces para incluir carreteras sin nombre durante la vista previa de calle de Soundscape."; +"preview.include_unnamed_roads.hint.off" = "Pulsa dos veces para incluir carreteras sin nombre durante Soundscape Street Preview"; /* */ -"preview.include_unnamed_roads.hint.on" = "Pulsa dos veces para excluir carreteras sin nombre durante la vista previa de calle de Soundscape."; +"preview.include_unnamed_roads.hint.on" = "Pulsa dos veces para excluir carreteras sin nombre durante Soundscape Street Preview"; /* */ -"preview.tutorial.done.hint" = "Pulsa dos veces para salir del tutorial."; +"preview.tutorial.done.hint" = "Pulsa dos veces para salir del tutorial"; /* */ -"preview.tutorial.title.1" = "¡Bienvenido a la vista previa de calle de Soundscape!"; +"preview.tutorial.title.1" = "¡Bienvenido a Soundscape Street Preview!"; /* */ @@ -999,7 +999,7 @@ /* */ -"preview.tutorial.content.3" = "En cada cruce, puedes usar el teléfono de nuevo para elegir qué carretera recorrer o puedes explorar tu entorno inmediato con los botones habituales de Soundscape de la parte inferior de la pantalla. Puedes pulsar en \"Explorar cerca\" para iniciar la señal de audio en cualquier punto de interés, cambiar tu ubicación o simplemente explorar el área con mayor detalle."; +"preview.tutorial.content.3" = "En cada cruce, puedes usar el teléfono de nuevo para elegir qué carretera recorrer, o puedes explorar tu entorno inmediato con los botones habituales de Soundscape de la parte inferior de la pantalla. Puedes pulsar en \"Explorar cerca\" para iniciar la señal de audio en cualquier punto de interés, cambiar tu ubicación o simplemente explorar el área con mayor detalle."; /* */ @@ -1015,7 +1015,7 @@ /* */ -"location_detail.title.waypoint" = "Detalles de punto de ruta"; +"location_detail.title.waypoint" = "Detalles del punto de ruta"; /* */ @@ -1023,35 +1023,35 @@ /* */ -"location_detail.action.beacon.hint" = "Pulsa dos veces para establecer una señal de audio en esta ubicación."; +"location_detail.action.beacon.hint" = "Pulsa dos veces para establecer una señal de audio en esta ubicación"; /* */ -"location_detail.action.beacon.hint.disabled" = "El ajuste de una nueva señal de audio está desactivado mientras la guía de ruta está activa."; +"location_detail.action.beacon.hint.disabled" = "Establecer una nueva señal de audio está deshabilitado mientras la guía de ruta está activa"; /* */ -"location_detail.action.save.hint" = "Pulsa dos veces para guardar esta ubicación como marcador."; +"location_detail.action.save.hint" = "Pulsa dos veces para guardar esta ubicación como marcador"; /* */ -"location_detail.action.edit.hint" = "Pulsa dos veces para editar el marcador."; +"location_detail.action.edit.hint" = "Pulsa dos veces para editar el marcador"; /* */ -"location_detail.action.share.hint" = "Pulsa dos veces para compartir esta ubicación."; +"location_detail.action.share.hint" = "Pulsa dos veces para compartir esta ubicación"; /* */ -"location_detail.action.preview.hint" = "Pulsa dos veces para iniciar la vista previa en esta ubicación."; +"location_detail.action.preview.hint" = "Pulsa dos veces para iniciar la vista previa en esta ubicación"; /* */ -"location_detail.action.preview.hint.disabled" = "La vista previa de calle está deshabilitada mientras la guía de la ruta está activa."; +"location_detail.action.preview.hint.disabled" = "Street Preview está deshabilitada mientras la guía de la ruta está activa"; /* */ -"location_detail.action.directions.hint" = "Pulsa dos veces para abrir esta ubicación en una aplicación de mapas externa."; +"location_detail.action.directions.hint" = "Pulsa dos veces para abrir esta ubicación en una aplicación de mapas externa"; /* */ @@ -1063,15 +1063,15 @@ /* */ -"location.select.hint" = "Pulsa dos veces para seleccionar esta ubicación."; +"location.select.hint" = "Pulsa dos veces para seleccionar esta ubicación"; /* */ -"location_detail.disabled.save" = "La operación de guardar un marcador en esta ubicación no está actualmente disponible"; +"location_detail.disabled.save" = "Guardar un marcador en esta ubicación no está actualmente disponible"; /* */ -"location_detail.disabled.share" = "La operación de compartir esta ubicación no está actualmente disponible"; +"location_detail.disabled.share" = "Compartir esta ubicación no está actualmente disponible"; /* */ @@ -1083,7 +1083,7 @@ /* */ -"location_detail.map.view.hint" = "Edita para seleccionar una nueva ubicación."; +"location_detail.map.view.hint" = "Editar para seleccionar una nueva ubicación"; /* */ @@ -1091,7 +1091,7 @@ /* */ -"location_detail.map.edit.hint" = "Mueve el mapa a la ubicación correcta."; +"location_detail.map.edit.hint" = "Mueve el mapa a la ubicación correcta"; /* */ @@ -1099,7 +1099,7 @@ /* */ -"location_detail.map.edit.compass.accessibility_hint" = "Pulsa dos veces para posicionar el marcador en la dirección en que apunta el teléfono. Usa acciones para posicionar en una dirección diferente."; +"location_detail.map.edit.compass.accessibility_hint" = "Pulsa dos veces para posicionar el marcador en la dirección en la que apunta el teléfono. Usa acciones para posicionar en una dirección diferente."; /* */ @@ -1155,15 +1155,15 @@ /* */ -"location_detail.add_waypoint.existing.hint" = "Pulsa dos veces para eliminar este marcador de tu ruta."; +"location_detail.add_waypoint.existing.hint" = "Pulsa dos veces para eliminar este marcador de la ruta"; /* */ -"location_detail.add_waypoint.new.hint" = "Pulsa dos veces para agregar este marcador a tu ruta."; +"location_detail.add_waypoint.new.hint" = "Pulsa dos veces para agregar este marcador a la ruta"; /* */ -"location_detail.add_waypoint.marker.hint" = "Pulsa dos veces para crear un marcador y agregarlo como punto de referencia."; +"location_detail.add_waypoint.marker.hint" = "Pulsa dos veces para crear un marcador y agregarlo como punto de referencia"; /* */ @@ -1187,35 +1187,35 @@ /* */ -"route_detail.action.start_route.hint" = "Pulsa dos veces para iniciar esta ruta."; +"route_detail.action.start_route.hint" = "Pulsa dos veces para iniciar esta ruta"; /* */ -"route_detail.action.start_route.disabled.hint" = "Añade puntos a la ruta antes de iniciarla."; +"route_detail.action.start_route.disabled.hint" = "Agregar puntos a la ruta antes de iniciarla"; /* */ -"route_detail.action.stop_route.hint" = "Pulsa dos veces para detener esta ruta."; +"route_detail.action.stop_route.hint" = "Pulsa dos veces para detener esta ruta"; /* */ -"route_detail.action.start_event.hint" = "Pulsa dos veces para iniciar esta actividad."; +"route_detail.action.start_event.hint" = "Pulsa dos veces para iniciar esta actividad"; /* */ -"route_detail.action.stop_event.hint" = "Pulsa dos veces para detener esta actividad y guardar el progreso."; +"route_detail.action.stop_event.hint" = "Pulsa dos veces para detener esta actividad y guardar el progreso"; /* */ -"route_detail.action.reset.hint" = "Pulsa dos veces para restablecer esta actividad y descargar las actualizaciones disponibles."; +"route_detail.action.reset.hint" = "Pulsa dos veces para restablecer esta actividad y descargar las actualizaciones disponibles"; /* */ -"route_detail.action.share.hint" = "Pulsa dos veces para compartir esta ruta."; +"route_detail.action.share.hint" = "Pulsa dos veces para compartir esta ruta"; /* */ -"route_detail.action.edit.hint" = "Pulsa dos veces para editar esta ruta."; +"route_detail.action.edit.hint" = "Pulsa dos veces para editar esta ruta"; /* */ @@ -1223,7 +1223,7 @@ /* */ -"route_detail.action.create.hint" = "Pulsa dos veces para crear una nueva ruta."; +"route_detail.action.create.hint" = "Pulsa dos veces para crear una nueva ruta"; /* */ @@ -1255,11 +1255,11 @@ /* */ -"route.end.completed" = "Ruta completada.・%@"; +"route.end.completed" = "¡Ruta completada!・%@"; /* */ -"route.end.completed.accessibility" = "Ruta completada. %@"; +"route.end.completed.accessibility" = "¡Ruta completada! %@"; /* */ @@ -1271,11 +1271,11 @@ /* */ -"route.end.completed.summary" = "Puntos de ruta alcanzados de %@・Último punto de ruta cerca"; +"route.end.completed.summary" = "%@ puntos de ruta alcanzados・Último punto de ruta cerca"; /* */ -"route.end.completed.summary.accessibility" = "Puntos de ruta alcanzados de %@, último punto de ruta cerca"; +"route.end.completed.summary.accessibility" = "%@ puntos de ruta alcanzados, último punto de ruta cerca"; /* */ @@ -1295,7 +1295,7 @@ /* */ -"route_detail.action.previous.hint" = "Pulsa dos veces para establecer la señal en el punto de ruta anterior."; +"route_detail.action.previous.hint" = "Pulsa dos veces para establecer la señal en el punto de ruta anterior"; /* */ @@ -1303,7 +1303,7 @@ /* */ -"route_detail.action.next.hint" = "Pulsa dos veces para establecer la señal en el siguiente punto de ruta."; +"route_detail.action.next.hint" = "Pulsa dos veces para establecer la señal en el siguiente punto de ruta"; /* */ @@ -1403,7 +1403,7 @@ /* */ -"tour.progress.distance.accessibility" = "Señal establecida en %1$@, %2$@, %3$@ puntos de ruta restantes"; +"tour.progress.distance.accessibility" = "Señal establecida en %1$@. %2$@. %3$@ puntos de ruta restantes"; /* */ @@ -1419,7 +1419,7 @@ /* */ -"tour.progress.distance.accessibility.singular" = "Señal establecida en %1$@, %2$@, 1 punto restante"; +"tour.progress.distance.accessibility.singular" = "Señal establecida en %1$@. %2$@. 1 punto de ruta restante"; /* */ @@ -1447,7 +1447,7 @@ /* */ -"waypoint.callout.button.hint" = "Pulsa dos veces para escuchar información adicional."; +"waypoint.callout.button.hint" = "Pulsa dos veces para oír detalles adicionales"; /* */ @@ -1499,7 +1499,7 @@ /* */ -"universal_links.marker.share.message" = "He compartido un marcador de Soundscape contigo. \"%@\""; +"universal_links.marker.share.message" = "¡He compartido un marcador de Soundscape contigo! \"%@\""; /* */ @@ -1539,11 +1539,11 @@ /* */ -"user_activity.street_preview.title" = "Iniciar la vista previa de calle"; +"user_activity.street_preview.title" = "Iniciar Street Preview"; /* */ -"url_resource.alert.route.share.message" = "He compartido una ruta de Soundscape contigo. \"%@\""; +"url_resource.alert.route.share.message" = "¡He compartido una ruta de Soundscape contigo! \"%@\""; /* */ @@ -1559,7 +1559,7 @@ /* */ -"url_resource.alert.route.import_existing.message" = "¿Deseas reemplazarla? Al sustituir esta ruta también se reemplazarán los marcadores usados en esta ruta."; +"url_resource.alert.route.import_existing.message" = "¿Deseas reemplazarla? Al sustituir esta ruta, también se reemplazarán los marcadores usados en esta ruta."; /* */ @@ -1587,11 +1587,11 @@ /* */ -"routes.no_routes.hint.1" = "Crea una ruta para ti o para otra persona organizando un conjunto de marcadores como puntos de referencia en una ruta."; +"routes.no_routes.hint.1" = "Puedes crear una ruta para ti o para otra persona organizando un conjunto de marcadores como puntos de referencia en una ruta."; /* */ -"routes.no_routes.hint.2" = "Mientras te encuentres en una ruta con Soundscape, se te informará a la llegada a cada uno de los puntos de ruta y la señal de audio avanzará automáticamente hasta el siguiente punto de ruta."; +"routes.no_routes.hint.2" = "Mientras te encuentres en una ruta con Soundscape, se te informará a la llegada a cada uno de los puntos de ruta, y la señal de audio avanzará automáticamente al siguiente."; /* */ @@ -1603,11 +1603,11 @@ /* */ -"routes.tutorial.title" = "Escucha los puntos de ruta de tu recorrido"; +"routes.tutorial.title" = "Oye los puntos de ruta de tu recorrido"; /* */ -"routes.tutorial.details" = "Ahora volverás a la página de inicio de Soundscape y se colocará una señal de audio en tu primer punto de ruta. Cuando llegues al primer punto de ruta, la señal avanzará al siguiente punto de ruta."; +"routes.tutorial.details" = "Ahora volverás a la pantalla de inicio de Soundscape y se colocará una señal de audio en tu primer punto de ruta. Cuando llegues al primer punto de ruta, la señal avanzará al siguiente punto de ruta."; /* */ @@ -1619,7 +1619,7 @@ /* */ -"routes.sort.by_name.hint" = "Pulsa dos veces para ordenar por nombre."; +"routes.sort.by_name.hint" = "Pulsa dos veces para ordenar por nombre"; /* */ @@ -1627,7 +1627,7 @@ /* */ -"routes.sort.by_distance.hint" = "Pulsa dos veces para ordenar por distancia."; +"routes.sort.by_distance.hint" = "Pulsa dos veces para ordenar por distancia"; /* */ @@ -1699,7 +1699,7 @@ /* */ -"markers.edit_screen.done_button.acc_hint" = "Pulsa dos veces para guardar este marcador."; +"markers.edit_screen.done_button.acc_hint" = "Pulsa dos veces para guardar este marcador"; /* */ @@ -1759,7 +1759,7 @@ /* */ -"searching.no_results_found_title" = "¡Ay! No se han encontrado resultados"; +"searching.no_results_found_title" = "¡Ay! No se han encontrado resultados."; /* */ @@ -1791,7 +1791,7 @@ /* */ -"search.no_results_found_error" = "No parece que haya lugares cerca. Si buscas un lugar específico, puedes intentar buscar por nombre o dirección."; +"search.no_results_found_error" = "No parece que haya lugares cerca. Si estás buscando un lugar específico, puedes intentar buscar por nombre o dirección."; /* */ @@ -1807,15 +1807,15 @@ /* */ -"search.button.markers.accessibility_hint" = "Pulsa dos veces para seleccionar o editar tus marcadores y rutas guardados."; +"search.button.markers.accessibility_hint" = "Pulsa dos veces para seleccionar o editar tus marcadores y rutas guardados"; /* */ -"search.button.nearby.accessibility_hint" = "Pulsa Dos Veces para explorar restaurantes cercanos, paradas y más."; +"search.button.nearby.accessibility_hint" = "Pulsa Dos Veces para explorar restaurantes cercanos, paradas y más"; /* */ -"search.button.current_location.accessibility_hint" = "Pulsa dos veces para previsualizar, marcar o compartir tu ubicación actual con un amigo."; +"search.button.current_location.accessibility_hint" = "Pulsa dos veces para obtener una vista previa, marcar o compartir tu ubicación actual con un amigo"; /* */ @@ -1831,11 +1831,11 @@ /* */ -"filter.clear.hint" = "Pulsa dos veces para borrar el filtro seleccionado."; +"filter.clear.hint" = "Pulsa dos veces para borrar el filtro seleccionado"; /* */ -"filter.double_tap_places_category" = "Pulsa dos veces para filtrar lugares por categoría."; +"filter.double_tap_places_category" = "Pulsa dos veces para filtrar lugares por categoría"; /* */ @@ -1867,7 +1867,7 @@ /* */ -"filter.not_available" = "Algunos filtros de categoría no están disponibles. Todavía puedes buscar lugares cercanos seleccionando \"%@\"."; +"filter.not_available" = "Algunos filtros de categoría no están disponibles. Aún así, para examinar lugares cercanos, selecciona \"%@\""; /* */ @@ -1903,7 +1903,7 @@ /* */ -"callouts.mobility.info" = "Información de transporte e intersecciones"; +"callouts.mobility.info" = "Información de transporte y cruces"; /* */ @@ -1935,7 +1935,7 @@ /* */ -"callouts.nothing_to_call_out_now" = "No hay nada de lo que avisar ahora mismo."; +"callouts.nothing_to_call_out_now" = "No hay nada de lo que avisar ahora mismo"; /* */ @@ -1979,15 +1979,15 @@ /* */ -"sleep.snoozing.message" = "Soundscape se encuentra actualmente pospuesto. Cuando salgas de tu ubicación actual, Soundscape se volverá a reactivar automáticamente. Usa Servicios de localización, pero en un modo de bajo consumo para conservar la batería del teléfono. Pulsa en el botón siguiente para reactivar ahora."; +"sleep.snoozing.message" = "Soundscape se encuentra actualmente pospuesto. Cuando salgas de tu ubicación actual, Soundscape se volverá a reactivar automáticamente. Usa los servicios de localización pero en un modo de bajo consumo para conservar la batería del teléfono. Pulsa el botón siguiente para reactivar ahora."; /* */ -"sleep.sleeping.message" = "Soundscape se encuentra actualmente en el modo de suspensión. Evita que Soundscape use Servicios de localización o descargue datos y ahorra energía de la batería cuando no se usa Soundscape. Pulsa en el botón siguiente para reactivar Soundscape."; +"sleep.sleeping.message" = "Soundscape se encuentra actualmente en el modo de suspensión. Evita que Soundscape use los servicios de localización o descargue datos y ahorra batería cuando no se usa Soundscape. Pulsa el botón siguiente para reactivar Soundscape."; /* */ -"sleep.sleep.acc_hint" = "Pulsa dos veces para poner en suspensión a Soundscape."; +"sleep.sleep.acc_hint" = "Pulsa dos veces para poner Soundscape en suspensión"; /* */ @@ -2051,7 +2051,7 @@ /* */ -"directions.intersects_with_in" = "Se cruza con %1$@ en %2$@"; +"directions.intersects_with_in" = "Cruces con %1$@ en %2$@"; /* */ @@ -2059,7 +2059,7 @@ /* */ -"directions.unknown_address" = "Dirección desconocida"; +"directions.unknown_address" = "La dirección es desconocida"; /* */ @@ -2079,7 +2079,7 @@ /* */ -"directions.nearest_road_name_is_distance_direction" = "Carretera más cercana, %1$@, está a %2$@ %3$@"; +"directions.nearest_road_name_is_distance_direction" = "La carretera más cercana, %1$@, está a %2$@ %3$@"; /* */ @@ -2087,7 +2087,7 @@ /* */ -"directions.nearest_road_name_was_distance_direction" = "Carretera más cercana, %1$@, estaba a %2$@ %3$@"; +"directions.nearest_road_name_was_distance_direction" = "La carretera más cercana, %1$@, estaba a %2$@ %3$@"; /* */ @@ -2107,7 +2107,7 @@ /* */ -"directions.roundabout_with_exits_distance" = "Rotonda con %1$@ salidas, a %2$@ de distancia"; +"directions.roundabout_with_exits_distance" = "Rotonda con %1$@ salidas a %2$@ de distancia"; /* */ @@ -2243,7 +2243,7 @@ /* */ -"directions.traveling.ne" = "Viajando al noreste"; +"directions.traveling.ne" = "Viajando al nordeste"; /* */ @@ -2251,7 +2251,7 @@ /* */ -"directions.traveling.se" = "Viajando al sureste"; +"directions.traveling.se" = "Viajando al sudeste"; /* */ @@ -2275,7 +2275,7 @@ /* */ -"directions.facing.ne" = "Mirando al noreste"; +"directions.facing.ne" = "Mirando al nordeste"; /* */ @@ -2283,7 +2283,7 @@ /* */ -"directions.facing.se" = "Mirando al sureste"; +"directions.facing.se" = "Mirando al sudeste"; /* */ @@ -2307,7 +2307,7 @@ /* */ -"directions.heading.ne" = "Caminando hacia el noreste"; +"directions.heading.ne" = "Caminando hacia el nordeste"; /* */ @@ -2315,7 +2315,7 @@ /* */ -"directions.heading.se" = "Caminando hacia el sureste"; +"directions.heading.se" = "Caminando hacia el sudeste"; /* */ @@ -2339,7 +2339,7 @@ /* */ -"directions.along.traveling.ne" = "Viajando al noreste por %@"; +"directions.along.traveling.ne" = "Viajando al nordeste por %@"; /* */ @@ -2347,7 +2347,7 @@ /* */ -"directions.along.traveling.se" = "Viajando al sureste por %@"; +"directions.along.traveling.se" = "Viajando al sudeste por %@"; /* */ @@ -2371,7 +2371,7 @@ /* */ -"directions.along.facing.ne" = "Mirando al noreste por %@"; +"directions.along.facing.ne" = "Mirando al nordeste por %@"; /* */ @@ -2379,7 +2379,7 @@ /* */ -"directions.along.facing.se" = "Mirando al sureste por %@"; +"directions.along.facing.se" = "Mirando al sudeste por %@"; /* */ @@ -2403,7 +2403,7 @@ /* */ -"directions.along.heading.ne" = "Caminando hacia el noreste por %@"; +"directions.along.heading.ne" = "Caminando hacia el nordeste por %@"; /* */ @@ -2411,7 +2411,7 @@ /* */ -"directions.along.heading.se" = "Caminando hacia el sureste por %@"; +"directions.along.heading.se" = "Caminando hacia el sudeste por %@"; /* */ @@ -2435,7 +2435,7 @@ /* */ -"directions.cardinal.north_east" = "Noreste"; +"directions.cardinal.north_east" = "Nordeste"; /* */ @@ -2443,7 +2443,7 @@ /* */ -"directions.cardinal.south_east" = "Sureste"; +"directions.cardinal.south_east" = "Sudeste"; /* */ @@ -2554,7 +2554,7 @@ /* */ -"ui.action_button.my_location.acc_hint" = "Pulsa dos veces para conocer tu ubicación actual."; +"ui.action_button.my_location.acc_hint" = "Pulsa dos veces para escuchar sobre tu ubicación actual"; /* */ @@ -2562,7 +2562,7 @@ /* */ -"ui.action_button.nearby_markers.acc_hint" = "Pulsa dos veces para oír hablar de los lugares cercanos que has marcado."; +"ui.action_button.nearby_markers.acc_hint" = "Pulsa dos veces para escuchar sobre los lugares cercanos que has marcado"; /* */ @@ -2570,7 +2570,7 @@ /* */ -"ui.action_button.around_me.acc_hint" = "Pulsa dos veces para oír hablar de los lugares de los cuatro cuadrantes que te rodean."; +"ui.action_button.around_me.acc_hint" = "Pulsa dos veces para escuchar sobre los lugares en los cuatro cuadrantes a tu alrededor"; /* */ @@ -2578,7 +2578,7 @@ /* */ -"ui.action_button.ahead_of_me.acc_hint" = "Pulsa dos veces para oír hablar de los lugares delante de ti."; +"ui.action_button.ahead_of_me.acc_hint" = "Pulsa dos veces para escuchar sobre los lugares que se encuentran delante"; /* */ @@ -2586,11 +2586,11 @@ /* */ -"ui.menu.hint" = "Pulsa dos veces para abrir el menú."; +"ui.menu.hint" = "Pulsa dos veces para abrir el menú"; /* */ -"ui.menu.close" = "Cerrar Menú"; +"ui.menu.close" = "Cerrar menú"; /* */ @@ -2650,7 +2650,7 @@ /* */ -"poi_screen.loading_title.finding_error" = "Tenemos problemas para encontrar los lugares cercanos. Vuelve a intentarlo más tarde."; +"poi_screen.loading_title.finding_error" = "¡Ay! Tenemos problemas para encontrar los lugares cercanos. Vuelve a intentarlo más tarde."; /* */ @@ -2666,7 +2666,7 @@ /* */ -"poi_cell.accessibility_hint.suggested_search" = "Pulsa dos veces para buscar: %@."; +"poi_cell.accessibility_hint.suggested_search" = "Pulsa dos veces para buscar: %@"; /* */ @@ -2710,15 +2710,15 @@ /* */ -"devices.explain_ar.disconnected" = "Los auriculares con seguimiento de cabeza son auriculares Bluetooth con sensores que indican a Soundscape el lugar frente al cual te encuentras. Esto ayuda a Soundscape a mejorar tu experiencia de audio, lo que hace que tu desplazamiento por el mundo sea más natural.\n\nPulsa en el botón siguiente para conectar un dispositivo."; +"devices.explain_ar.disconnected" = "Los auriculares con seguimiento de cabeza son auriculares Bluetooth con sensores que indican a Soundscape hacia dónde estás mirando. Esto le ayuda a Soundscape a mejorar tu experiencia de audio, al hacerla más natural mientras te desplazas por el mundo.\n\nPulsa el botón siguiente para conectar un dispositivo."; /* */ -"devices.explain_ar.connected.airpods" = "Tus AirPods están listos para usar, ¡así que puedes guardar tu teléfono en el bolsillo y ponerte en marcha! Soundscape está siguiendo la orientación de tu cabeza para que no tengas que sostener el teléfono en la mano."; +"devices.explain_ar.connected.airpods" = "Tus AirPods están listos para usar. ¡Guarda el teléfono en el bolsillo y empieza a moverte! Soundscape está siguiendo la orientación de tu cabeza para que no tengas que llevar el teléfono en la mano."; /* */ -"devices.explain_ar.paired" = "Soundscape no está conectado actualmente a %@. Por favor asegúrate de que tus auriculares están encendidos y cerca de tu teléfono."; +"devices.explain_ar.paired" = "Soundscape no está conectado actualmente a %@. Comprueba que los auriculares están activados y que se encuentran cerca del teléfono."; /* */ @@ -2742,7 +2742,7 @@ /* */ -"devices.connect_headset.unsupported_firmware" = "Los cascos de realidad aumentada deben actualizarse antes de que puedan conectarse a Soundscape. Ve a la aplicación Cortana para actualizar los auriculares."; +"devices.connect_headset.unsupported_firmware" = "Tus AR Headphones deben actualizarse antes de que puedan conectarse a Soundscape. Ve a la aplicación Cortana para actualizar los auriculares."; /* */ @@ -2754,23 +2754,23 @@ /* */ -"devices.connect_headset.explanation" = "Selecciona el tipo de auriculares de la lista de auriculares compatibles que se muestra a continuación."; +"devices.connect_headset.explanation" = "Selecciona el tipo de auriculares en la lista siguiente de auriculares compatibles."; /* */ -"devices.connect_headset.audio" = "Antes de conectar los auriculares a Soundscape, asegúrate de que está emparejado con tu teléfono. Si aún no están emparejados, ve a la sección de Bluetooth en la aplicación Ajustes de iOS para emparejar tu dispositivo y luego regresa a Soundscape."; +"devices.connect_headset.audio" = "Antes de conectar los auriculares a Soundscape, asegúrate de que están emparejados con el teléfono. Si aún no lo están, ve a la sección Bluetooth en la aplicación de ajustes de iOS para emparejar el dispositivo y después vuelve a Soundscape."; /* */ -"devices.connect_headset.calibrate" = "Los auriculares deben estar calibrados. Quítate los de la cabeza, agítalos suavemente en todas direcciones durante unos 10 segundos y colócalos de nuevo sobre tu cabeza. Se debe repetir si el timbre de calibración sigue sonando."; +"devices.connect_headset.calibrate" = "Los auriculares tienen que calibrarse. Quítatelos y sacúdelos con suavidad en todas las direcciones durante unos 10 segundos, y vuelve a colocártelos. Se debe repetir si el timbre de calibración sigue sonando."; /* */ -"devices.connect_headset.calibrate.in_ear" = "Los auriculares deben estar calibrados. Agita suavemente la cabeza en todas las direcciones durante unos 10 segundos. Se debe repetir si el timbre de calibración sigue sonando."; +"devices.connect_headset.calibrate.in_ear" = "Los auriculares tienen que calibrarse. Sacude la cabeza con suavidad en todas las direcciones durante unos 10 segundos. Se debe repetir si el timbre de calibración sigue sonando."; /* */ -"devices.connect_headset.completed.airpods" = "¡Enhorabuena! Tus AirPods están listos para usar, ¡así que puedes guardar tu teléfono en el bolsillo y ponerte en marcha! Soundscape seguirá ahora la orientación de tu cabeza para que no tengas que sostener el teléfono en la mano. Un solo clic en el botón de los auriculares silenciará o desactivará la señal, un doble clic indicará tu ubicación y un triple clic repetirá la última indicación."; +"devices.connect_headset.completed.airpods" = "¡Enhorabuena! Tus AirPods están listos para usar. ¡Guarda el teléfono en el bolsillo y empieza a moverte! Soundscape seguirá ahora la orientación de tu cabeza para que no tengas que llevar el teléfono en la mano. Un solo clic en el botón de los auriculares silenciará o reactivará la señal, un doble clic avisará de tu ubicación y un triple clic repetirá el último aviso."; /* */ @@ -2778,7 +2778,7 @@ /* */ -"devices.connect_headset.completed.test.hint" = "Pulsa dos veces para comprobar los %@."; +"devices.connect_headset.completed.test.hint" = "Pulsa dos veces para comprobar los %@"; /* */ @@ -2786,7 +2786,7 @@ /* */ -"devices.test_headset.explanation" = "Hemos colocado una señal de audio a tu derecha. Escucha dónde se encuentra y gira la cabeza hacia ella. Observa cómo puedes hacer esto incluso con el teléfono en el bolsillo. Cuando hayas terminado, pulsa en el botón siguiente para volver a Soundscape y disfruta de tu próximo paseo con tus nuevos auriculares con seguimiento de cabeza."; +"devices.test_headset.explanation" = "Hemos colocado una señal de audio a tu derecha. Escucha dónde se encuentra y gira la cabeza hacia ella. Observa cómo puedes hacer esto incluso con el teléfono en el bolsillo. Cuando hayas terminado, pulsa el botón siguiente para volver a Soundscape y disfruta de tu próximo paseo con tus nuevos auriculares con seguimiento de cabeza."; /* */ @@ -2794,7 +2794,7 @@ /* */ -"devices.test_headset.callout" = "Hemos colocado una señal de audio a tu derecha. Escucha dónde se encuentra y gira la cabeza hacia ella… Observa cómo puedes hacer esto incluso con el teléfono en el bolsillo."; +"devices.test_headset.callout" = "Hemos colocado una señal de audio a tu derecha. Escucha dónde se encuentra y gira la cabeza hacia ella. Observa cómo puedes hacer esto incluso con el teléfono en el bolsillo."; /* */ @@ -2814,7 +2814,7 @@ /* */ -"devices.callouts.needs_calibration.in_ear" = "Los auriculares tienen que calibrarse. Sacúdelos con suavidad en todas las direcciones."; +"devices.callouts.needs_calibration.in_ear" = "Los auriculares tienen que calibrarse. Sacude la cabeza con suavidad en todas las direcciones."; /* */ @@ -2850,7 +2850,7 @@ /* */ -"devices.reachability.alert.description" = "Tu %@ puede indicarte a Soundscape frente a qué dirección te encuentras actualmente, y esto ayudará a Soundscape a mejorar tu experiencia de audio. Puedes habilitar el seguimiento de cabezas en los ajustes de Auriculares con seguimiento de cabeza."; +"devices.reachability.alert.description" = "Tu %@ puede indicarle a Soundscape en qué dirección estás mirando, y esto ayudará a Soundscape a mejorar tu experiencia de audio. Puedes activar el seguimiento de cabeza en los ajustes de Auriculares con seguimiento de cabeza."; /* */ @@ -2890,7 +2890,7 @@ /* */ -"behavior.experiences.reset.prompt" = "Al restablecer esta actividad se eliminará tu progreso actual y te permitirá iniciarla de nuevo. Además de restablecerla, también puedes elegir buscar actualizaciones. De esta manera, se descargará información actualizada para esta actividad si hay actualizaciones disponibles."; +"behavior.experiences.reset.prompt" = "Restablecer esta actividad eliminará tu progreso actual y te permitirá iniciar la actividad de nuevo. También puedes buscar actualizaciones. De esta manera, se descargará información actualizada para esta actividad si hay actualizaciones disponibles."; /* */ @@ -2910,7 +2910,7 @@ /* */ -"behavior.experience.delete.explanation" = "Si eliminas esta actividad, se eliminará de tu teléfono."; +"behavior.experience.delete.explanation" = "Si eliminas esta experiencia, se quitará del teléfono."; /* */ @@ -2998,11 +2998,11 @@ /* */ -"announced_name.named" = "Anuncio de %1$@, %2$@."; +"announced_name.named" = "%1$@, anuncio de %2$@."; /* */ -"announced_name_distance_away.named" = "Anuncio de %1$@, %2$@, %3$@ de distancia."; +"announced_name_distance_away.named" = "%1$@, anuncio de %2$@, %3$@ de distancia."; /* */ @@ -3038,7 +3038,7 @@ /* */ -"icloud.kv_store.quota_violation_alert.message" = "El almacenamiento de iCloud para esta aplicación está completo. Para crear un nuevo marcador, necesitarás liberar espacio quitando algunos de tus marcadores existentes."; +"icloud.kv_store.quota_violation_alert.message" = "El almacenamiento de iCloud para esta aplicación está lleno. Para crear un nuevo marcador, necesitarás liberar espacio quitando algunos de tus marcadores existentes."; /* */ @@ -3062,7 +3062,7 @@ /* */ -"action.double_tap_to_repeat" = "Pulsa dos veces para repetir."; +"action.double_tap_to_repeat" = "Pulsa dos veces para repetir"; /* */ @@ -3110,7 +3110,7 @@ /* */ -"tutorial.markers.mark_location.acc_hint" = "Pulsa dos veces para marcar esta ubicación."; +"tutorial.markers.mark_location.acc_hint" = "Pulsa dos veces para marcar esta ubicación"; /* */ @@ -3118,11 +3118,11 @@ /* */ -"tutorial.markers.text.EditMarker" = "Excelente. Has seleccionado @!marker_name!! como marcador. Oirás como lo avisa Soundscape cuando pases cerca.\nEn la siguiente pantalla, puedes cambiar su nombre si lo deseas."; +"tutorial.markers.text.EditMarker" = "¡Excelente! Has seleccionado @!marker_name!! como marcador. Oirás como lo avisa Soundscape cuando pases cerca.\nEn la siguiente pantalla, puedes cambiar su nombre si lo deseas."; /* */ -"tutorial.markers.text.NearbyMarkers" = "Excelente. Tienes un nuevo marcador llamado @!marker_name!!.\nAhora, para oír dónde está tu marcador, presiona el botón Marcadores cercanos. Este botón se encuentra en la parte inferior de la pantalla principal.\nPruébalo ahora."; +"tutorial.markers.text.NearbyMarkers" = "¡Excelente! Tienes un nuevo marcador llamado @!marker_name!!.\nAhora, para oír dónde está tu marcador, presiona el botón Marcadores cercanos. Este botón se encuentra en la parte inferior de la pantalla principal.\nPruébalo ahora."; /* */ @@ -3130,7 +3130,7 @@ /* */ -"tutorial.markers.text.WrapUp" = "Perfecto, ahora estás frente a tu marcador, @!marker_name!!.\n¡Parece que ya lo entiendes!\nPuedes gestionar tu lista de marcadores seleccionando Marcadores y Rutas en la pantalla de inicio.\nY siempre puedes visitar las páginas de Ayuda y Tutoriales para repasar este tutorial o para leer una guía completa sobre todo lo que puedes hacer con los marcadores. La señal que has establecido para este tutorial se borrará y volverás a la pantalla anterior."; +"tutorial.markers.text.WrapUp" = "Perfecto, ahora estás orientado hacia tu marcador, @!marker_name!!.\n¡Parece que lo has entendido!\nPara administrar tu lista de marcadores, selecciona Marcadores y rutas en la pantalla de inicio.\nTambién puedes visitar las páginas de Ayuda y tutoriales para repasar este tutorial o para leer una guía completa sobre todo lo que puedes hacer con los marcadores. La señal que has establecido para este tutorial se borrará ahora y regresarás a la pantalla anterior."; /* */ @@ -3142,7 +3142,7 @@ /* */ -"tutorial.beacon.getting_started.text" = "Cuando estableces una señal en una ubicación, Soundscape reproducirá un sonido procedente de la dirección de esa ubicación. Este tutorial te guiará por el proceso de establecimiento de una señal y cómo usarla.\n\nPresiona el botón \"Iniciar señal de audio\" a continuación para abrir una lista de lugares cercanos. Elije una ubicación en la lista y el tutorial Comenzará."; +"tutorial.beacon.getting_started.text" = "Cuando estableces una señal en una ubicación, Soundscape reproducirá un sonido procedente de la dirección de esa ubicación. Este tutorial te guiará por el proceso de establecimiento de una señal y cómo usarla.\n\nPresiona el botón \"Iniciar señal de audio\" a continuación para abrir una lista de lugares cercanos. Elige una ubicación en la lista y el tutorial Comenzará."; /* */ @@ -3150,7 +3150,7 @@ /* */ -"tutorial.beacon.mark_location.acc_hint" = "Pulsa dos veces para usar esta ubicación para el tutorial de señales."; +"tutorial.beacon.mark_location.acc_hint" = "Pulsa dos veces para usar esta ubicación para el tutorial de señales"; /* */ @@ -3166,7 +3166,7 @@ /* */ -"tutorial.beacon.found_the_beacon" = "¡Genial! ¡Has encontrado tu señal!"; +"tutorial.beacon.found_the_beacon" = "¡Fantástico! ¡Has encontrado la señal!"; /* */ @@ -3174,11 +3174,11 @@ /* */ -"tutorial.beacons.text.IntroPart1" = "Al establecer una señal en una ubicación, Soundscape reproducirá un sonido proveniente de la dirección de esta ubicación. Este tutorial te guiará por el establecimiento de una señal y cómo usarla."; +"tutorial.beacons.text.IntroPart1" = "Cuando estableces una señal en una ubicación, Soundscape reproducirá un sonido procedente de la dirección de esa ubicación. Este tutorial te guiará por el proceso de establecimiento de una señal y cómo usarla."; /* */ -"tutorial.beacons.text.IntroPart2" = "Presiona el botón \"Iniciar señal de audio\" a continuación para abrir una lista de lugares cercanos. Elije una ubicación en la lista y el tutorial comenzará."; +"tutorial.beacons.text.IntroPart2" = "Presiona el botón \"Iniciar señal de audio\" a continuación para abrir una lista de lugares cercanos. Elige una ubicación en la lista y el tutorial comenzará."; /* */ @@ -3186,7 +3186,7 @@ /* */ -"tutorial.beacons.text.OrientationIsNotFlat" = "Para empezar, mantén el teléfono en posición horizontal con la pantalla mirando hacia arriba y con la parte superior del teléfono señalando justo delante de ti."; +"tutorial.beacons.text.OrientationIsNotFlat" = "Para empezar, mantén el teléfono en posición horizontal con la pantalla mirando hacia arriba y con la parte superior del teléfono apuntando justo delante de ti."; /* */ @@ -3202,7 +3202,7 @@ /* */ -"tutorial.beacons.text.HoldingPhone.great" = "Mantener el teléfono en posición horizontal de esta manera solo es necesario cuando no te mueves. Mientras camines, puedes colocar el teléfono en un bolso o un bolsillo al que puedas tener fácil acceso."; +"tutorial.beacons.text.HoldingPhone.great" = "¡Excelente! Mantener el teléfono en posición horizontal de esta manera solo es necesario cuando no te mueves. Mientras caminas, puedes colocar el teléfono en un bolso o un bolsillo al que puedas tener fácil acceso."; /* */ @@ -3218,27 +3218,27 @@ /* */ -"tutorial.beacons.text.BeaconOutOfBoundsRotate.ar_headset" = "Ahora, gira lentamente hacia la dirección de la señal. Oirás el sonido de un timbre cuando te encuentres directamente frente a ella."; +"tutorial.beacons.text.BeaconOutOfBoundsRotate.ar_headset" = "Ahora, gira lentamente hacia la dirección de la señal. Oirás el sonido de un timbre cuando estés mirando directamente en su dirección."; /* */ -"tutorial.beacons.text.BeaconOutOfBoundsRepeat" = "Gira lentamente hasta que oigas el timbre que indica que está orientado en la dirección de la señal."; +"tutorial.beacons.text.BeaconOutOfBoundsRepeat" = "Gira lentamente hasta que oigas el timbre que indica que estás orientado en la dirección de la señal."; /* */ -"tutorial.beacons.text.BeaconOutOfBoundsConfirmation" = "¡Perfecto, ahora estás orientado en la dirección de @!destination!!."; +"tutorial.beacons.text.BeaconOutOfBoundsConfirmation" = "Perfecto, ahora estás orientado en la dirección de @!destination!!."; /* */ -"tutorial.beacons.text.BeaconInBounds" = "Si escuchas atentamente oirás que se está reproduciendo desde justo delante de ti y que hay un sonido de timbre además del sonido de señal normal. Eso significa que te encuentras orientado directamente hacia @!destination!!."; +"tutorial.beacons.text.BeaconInBounds" = "Si escuchas atentamente, oirás que se está reproduciendo desde justo delante de ti y que hay un sonido de timbre además del sonido de señal normal. Eso significa que te encuentras orientado directamente hacia @!destination!!."; /* */ -"tutorial.beacons.text.BeaconInBoundsRotate" = "Ahora intenta alejarte lentamente de la dirección de la señal, mientras sigues manteniendo el teléfono en posición horizontal. El sonido del timbre se detendrá y la señal te mostrará dónde se encuentra @!destination!!. Pruébalo ahora."; +"tutorial.beacons.text.BeaconInBoundsRotate" = "Ahora intenta alejarte lentamente de la dirección de la señal, mientras sigues manteniendo el teléfono en posición horizontal. El sonido del timbre se detendrá y la señal continuará mostrándote dónde se encuentra @!destination!!. Pruébalo ahora."; /* */ -"tutorial.beacons.text.BeaconInBoundsRotate.ar_headset" = "Ahora intenta alejarte lentamente de la dirección de la señal. El sonido de la campana se detendrá y la señal continuará mostrándote dónde se encuentra @!destination!!. Inténtalo ahora."; +"tutorial.beacons.text.BeaconInBoundsRotate.ar_headset" = "Ahora intenta alejarte lentamente de la dirección de la señal. El sonido del timbre se detendrá y la señal continuará mostrándote dónde se encuentra @!destination!!. Inténtalo ahora."; /* */ @@ -3246,27 +3246,27 @@ /* */ -"tutorial.beacons.text.MobilitySkills" = "La señal siempre señala directamente hacia la ubicación que has seleccionado. No te indica las rutas que debes seguir ni le proporciona indicaciones para llegar a esa ubicación. Usa esta señal como herramienta para decidir cómo deseas llegar allí."; +"tutorial.beacons.text.MobilitySkills" = "La señal siempre señala directamente hacia la ubicación que has seleccionado. No te indica las rutas que debes seguir ni te proporciona indicaciones para llegar a esa ubicación. Usa esta señal como herramienta para decidir cómo deseas llegar allí."; /* */ -"tutorial.beacons.text.AutomaticCallout" = "A medida que avances en su viaje, Soundscape te informará ocasionalmente de la distancia hasta el lugar marcado por la señal con un aviso como éste."; +"tutorial.beacons.text.AutomaticCallout" = "Conforme avances en tu recorrido, Soundscape irá actualizando ocasionalmente la distancia hasta el lugar marcado por la señal con un aviso como éste."; /* */ -"tutorial.beacons.text.HomeScreen" = "La información de la distancia también aparece en la pantalla principal junto con la dirección de la ubicación de la señal si la tenemos. Soundscape te notificará cuando te acerques a la ubicación de la señal y cuando te encuentres en ella la señal de audio se silenciará."; +"tutorial.beacons.text.HomeScreen" = "La información de la distancia también aparece en la pantalla principal junto con la dirección de la ubicación de la señal si la tenemos. Soundscape te notificará cuando te acerques a la ubicación de la señal, y cuando te encuentres en ella, la señal de audio se silenciará."; /* */ -"tutorial.beacons.text.Mute" = "Si necesitas que la aplicación esté en silencio por cualquier motivo, puedes usar el botón \"Silenciar señal\" o el botón \"Suspender\" de la pantalla principal o bien, pulsar dos veces con dos dedos en cualquier lugar de la pantalla. Para detener los avisos actuales y silenciar la señal de audio, pulsa dos veces con dos dedos. Pruébalo ahora."; +"tutorial.beacons.text.Mute" = "Si necesitas que la aplicación esté en silencio por cualquier motivo, puedes usar el botón Silenciar señal o el botón Suspender de la pantalla principal o bien, pulsar dos veces con dos dedos en cualquier lugar de la pantalla. Para detener los avisos actuales y silenciar la señal de audio, pulsa dos veces con dos dedos. Pruébalo ahora."; /* */ -"tutorial.beacons.text.MuteRepeat" = "Pulsa dos veces con dos dedos en cualquier lugar de la pantalla."; +"tutorial.beacons.text.MuteRepeat" = "Pulsa dos veces con dos dedos en cualquier lugar de la pantalla"; /* */ -"tutorial.beacons.text.WrapUp" = "Parece que lo entiendes. Si deseas repetir este tutorial, puedes obtener acceso a él en cualquier momento en la pantalla Ayuda y tutoriales. La señal que ha establecido para este tutorial se borrará ahora y regresarás a la pantalla anterior."; +"tutorial.beacons.text.WrapUp" = "¡Parece que lo has entendido! Si deseas repetir este tutorial, puedes obtener acceso a él en cualquier momento en la pantalla Ayuda y tutoriales. La señal que has establecido para este tutorial se borrará ahora y regresarás a la pantalla anterior."; /* */ @@ -3294,11 +3294,11 @@ /* */ -"help.config.voices.content" = "Soundscape puede usar cualquiera de las voces que has descargado en la aplicación Ajustes de iOS, salvo las voces de Siri, que no están disponibles en Soundscape. Te recomendamos que elijas una de las voces de calidad \"Mejorada\", pero tendrás que descargarla primero. Para descargar voces en la aplicación Ajustes de iOS tienes que ir a Accesibilidad > Contenido leído > Voces y pulsar en una voz. En la aplicación Soundscape, puedes seleccionar la voz que desees de la forma siguiente: pulsa en \"Ajustes\" desde el menú principal y, a continuación, en \"Ajustes Generales\", selecciona \"Voz\"."; +"help.config.voices.content" = "Soundscape puede usar cualquiera de las voces que has descargado en la aplicación de ajustes de iOS, salvo las voces de Siri, que no están disponibles en Soundscape. Te recomendamos que elijas una de las voces de calidad \"Mejorada\", pero tendrás que descargarla primero. Para descargar voces en la aplicación de ajustes de iOS, tienes que ir a Accesibilidad > Lectura y voz > Voces y pulsar en una voz. (En las versiones de iOS anteriores a la 26, \"Lectura y voz\" se llama \"Contenido leído\".) En la aplicación Soundscape, puedes seleccionar la voz que desees de la forma siguiente: ve a \"Ajustes\" desde el menú y, a continuación, en \"Ajustes generales\", selecciona \"Voz\"."; /* */ -"help.offline.page_title" = "¿Por qué está Soundscape funcionando sin conexión?"; +"help.offline.page_title" = "¿Por qué Soundscape está funcionando sin conexión?"; /* */ @@ -3310,7 +3310,7 @@ /* */ -"help.offline.limitations_description" = "Los avisos siguen funcionando si te encuentras en un área por la que has pasado antes y que has sido almacenada en tu historial de mensajes de texto. De forma similar, puedes colocar una señal de audio o crear un marcador en lugares que han sido almacenados en tu historial."; +"help.offline.limitations_description" = "Los avisos continuarán funcionando si te encuentras en una zona por la que has pasado antes y que se ha guardado en tu historial de avisos. De manera similar, puedes colocar una señal de audio o crear un marcador en lugares que se han almacenado en tu historial de avisos."; /* */ @@ -3342,7 +3342,7 @@ /* */ -"help.tutorial.footer.disabled" = "Los tutoriales están deshabilitados mientras la guía de la ruta esté activa"; +"help.tutorial.footer.disabled" = "Los tutoriales están deshabilitados mientras la guía de la ruta está activa"; /* */ @@ -3382,15 +3382,15 @@ /* */ -"terms_of_use.accept_checkbox.acc_label" = "Aceptar las condiciones de uso"; +"terms_of_use.accept_checkbox.acc_label" = "Aceptar los términos de uso"; /* */ -"terms_of_use.accept_checkbox.on.acc_hint" = "Pulsa dos veces para activar la casilla \"aceptar las condiciones de uso\"."; +"terms_of_use.accept_checkbox.on.acc_hint" = "Pulsa dos veces para activar la casilla \"Aceptar los términos de uso\""; /* */ -"terms_of_use.accept_checkbox.off.acc_hint" = "Pulsa dos veces para desactivar la casilla \"aceptar las condiciones de uso\"."; +"terms_of_use.accept_checkbox.off.acc_hint" = "Pulsa dos veces para desactivar la casilla \"Aceptar los términos de uso\""; /* */ @@ -3410,15 +3410,15 @@ /* */ -"terms_of_use.accept.new_features.accessibility_hint" = "Pulsa dos veces para aceptar y cerrar los anuncios."; +"terms_of_use.accept.new_features.accessibility_hint" = "Pulsa dos veces para aceptar y cerrar anuncios"; /* */ -"first_launch.get_started_button.off.acc_hint" = "Debes marcar la casilla \"aceptar los términos de uso\" antes de poder pulsar este botón."; +"first_launch.get_started_button.off.acc_hint" = "Para poder presionar este botón, activa la casilla \"Aceptar los términos de uso\""; /* */ -"first_launch.welcome_text" = "¡Bienvenido! Antes de comenzar, tenemos que pasar por algunos ajustes y aceptar varios permisos. Presiona el botón Siguiente para iniciar."; +"first_launch.welcome_text" = "¡Bienvenido! Antes de comenzar, tenemos que configurar algunos valores y pedir varios permisos. Presiona el botón Siguiente para iniciar."; /* */ @@ -3426,7 +3426,7 @@ /* */ -"first_launch.permission_required" = "Este permiso es obligatorio."; +"first_launch.permission_required" = "Este permiso es obligatorio"; /* */ @@ -3434,15 +3434,15 @@ /* */ -"first_launch.soundscape_language.text" = "Selecciona el idioma que deseas usar en Soundscape. Siempre podrás cambiar tu elección en los ajustes de la aplicación."; +"first_launch.soundscape_language.text" = "Selecciona el idioma que deseas que use Soundscape. Siempre podrás cambiar tu selección en los ajustes de la aplicación."; /* */ -"first_launch.location.text" = "Soundscape es una aplicación basada en la ubicación. Utilizamos tu ubicación para encontrar y avisar de las cosas que te rodean."; +"first_launch.location.text" = "Soundscape es una aplicación basada en ubicación. Usamos tu ubicación para encontrar cosas a tu alrededor y avisarte de ellas."; /* */ -"first_launch.location.enable_location" = "Habilitar ubicación"; +"first_launch.location.enable_location" = "Habilitar localización"; /* */ @@ -3450,7 +3450,7 @@ /* */ -"first_launch.device_motion.text" = "Esto le permite a Soundscape mejorar tu experiencia en función de si va a pie, se desplaza en un vehículo o no se mueve."; +"first_launch.device_motion.text" = "Esto le permite a Soundscape mejorar tu experiencia en función de si vas a pie, te desplazas en un vehículo o no te mueves."; /* */ @@ -3458,7 +3458,7 @@ /* */ -"first_launch.lighting_way_with_sound.text_alt" = "Soundscape usa sonido 3D para indicarte qué hay a tu alrededor. Por ejemplo, si tu destino está a tu derecha, oirás un sonido procedente de esa dirección, o si hay una cafetería a tu izquierda, oirás un aviso procedente de esa dirección."; +"first_launch.lighting_way_with_sound.text_alt" = "Soundscape usa sonido 3D para informarte de lo que hay a tu alrededor. Por ejemplo, si tu destino está a tu derecha, oirás un sonido procedente de esa dirección, o si hay una cafetería a tu izquierda, oirás un aviso procedente de esa dirección."; /* */ @@ -3466,15 +3466,15 @@ /* */ -"first_launch.heading_somewhere.text" = "Coloca una señal de audio en el destino y Soundscape te mantendrá informado de tu ubicación y tu entorno en el trayecto. Usa Soundscape junto con tus habilidades de orientación e incluso tu aplicación de navegación favorita para encontrar el camino a tu destino."; +"first_launch.heading_somewhere.text" = "Coloca una señal de audio en el destino y Soundscape te mantendrá informado de su ubicación y tu entorno en el trayecto. Usa Soundscape junto con tus habilidades de orientación e incluso tu aplicación de navegación favorita para encontrar el camino a tu destino."; /* */ -"first_launch.setting_off_way" = "¿Te pones en camino?"; +"first_launch.setting_off_way" = "¿Vas a empezar el trayecto?"; /* */ -"first_launch.setting_off_way.text" = "Guarda el teléfono y camina. Soundscape te ayudará a estar informado de tu ubicación y te avisará de carreteras, cruces y puntos de referencia conforme te acerques a ellos. Los avisos se pueden configurar en los ajustes."; +"first_launch.setting_off_way.text" = "Guarda el teléfono y camina. Soundscape te ayudará a estar informado de dónde te encuentras avisando de carreteras, cruces y puntos de referencia conforme te acerques a ellos. Los avisos se pueden configurar en los ajustes."; /* */ @@ -3510,7 +3510,7 @@ /* */ -"first_launch.headphones.message.2" = "Si no tienes auriculares o prefieres no usarlos, Soundscape seguirá funcionando con los altavoces del teléfono."; +"first_launch.headphones.message.2" = "Si no tienes auriculares o prefieres no usarlos, no te preocupes. Soundscape seguirá funcionando con los altavoces del teléfono."; /* */ @@ -3530,7 +3530,7 @@ /* */ -"first_launch.callouts.listen.accessibility_hint" = "Pulsa dos veces para escuchar un ejemplo de lo que Soundscape podría decir en tu próximo paseo."; +"first_launch.callouts.listen.accessibility_hint" = "Pulsa dos veces para escuchar un ejemplo de los avisos automáticos de Soundscape"; /* */ @@ -3550,11 +3550,11 @@ /* */ -"first_launch.permissions.message" = "Al navegar con Soundscape, te guiará por una señal de audio. Para ello, Soundscape necesita que habilites los siguientes permisos:"; +"first_launch.permissions.message" = "Al navegar con Soundscape, te guiarás por una señal de audio. Para ello, Soundscape necesita que habilites los siguientes permisos:"; /* */ -"first_launch.permissions.location" = "Servicios de localización con Ubicación exacta"; +"first_launch.permissions.location" = "Localización con Ubicación exacta"; /* */ @@ -3562,7 +3562,7 @@ /* */ -"first_launch.permissions.required" = "Este permiso es obligatorio."; +"first_launch.permissions.required" = "Este permiso es obligatorio"; /* */ @@ -3594,7 +3594,7 @@ /* */ -"first_launch.beacon.callout.standard" = "Colocando la señal a tu derecha. Gira el teléfono para seguir su sonido y experimentar el audio espacial de la señal."; +"first_launch.beacon.callout.standard" = "Colocando la señal a tu derecha. Gira el teléfono para seguir su sonido y probar el audio espacial de la señal."; /* */ @@ -3622,7 +3622,7 @@ /* */ -"first_launch.prompt.message" = "Estás listo para tu primer paseo con Soundscape. Para probarlo ahora, simplemente elige un destino cercano, inicia la señal de audio y lo escucharás en la dirección de tu destino."; +"first_launch.prompt.message" = "Estás listo para tu primer paseo con Soundscape. Para probarlo ahora, simplemente elige un destino cercano, inicia la señal de audio y la escucharás en la dirección de tu destino."; /* */ @@ -3634,27 +3634,27 @@ /* */ -"help.text.destination_beacons.what" = "Establecer una señal en una ubicación cercana permite a Soundscape mantenerte informado reproduciendo un sonido procedente de la dirección de esa ubicación. Esta señal se puede silenciar o reactivar en la pantalla principal. Además, Soundscape muestra información sobre la ubicación de la pantalla principal incluyendo la distancia hasta ella y la dirección si se conoce."; +"help.text.destination_beacons.what" = "Establecer una señal en una ubicación cercana permite a Soundscape mantenerte informado reproduciendo un sonido procedente de la dirección de esa ubicación. Esta señal se puede silenciar o reactivar en la pantalla principal. Además, Soundscape muestra información sobre la ubicación en la pantalla principal incluyendo la distancia hasta ella y la dirección si se conoce."; /* */ -"help.text.destination_beacons.when" = "Establecer una señal es útil cuando deseas realizar un seguimiento de un punto de referencia familiar cuando exploras una zona nueva o cuando vas a algún lugar y deseas estar informado de tu entorno por el camino. La característica de señal no te ofrece indicaciones paso a paso, sino que te proporciona un sonido audible continuo que te indica la dirección hasta la señal, en relación con el lugar en que te encuentras actualmente. Con la señal de audio, tus capacidades de orientación existentes, e incluso tu aplicación de navegación favorita, puedes elegir cómo deseas llegar a las ubicaciones cercanas a ti."; +"help.text.destination_beacons.when" = "Establecer una señal es útil cuando deseas realizar un seguimiento de un punto de referencia conocido mientras exploras una zona nueva o cuando vas a algún lugar y deseas estar informado sobre tu entorno por el camino. La característica de señal no te ofrece indicaciones paso a paso, sino que te proporciona un sonido audible continuo que te indica la dirección hasta la señal, en relación con el lugar donde te encuentras actualmente. Con la señal de audio, tus capacidades de orientación existentes e incluso tu aplicación de navegación favorita, puedes elegir cómo deseas llegar a las ubicaciones cercanas."; /* */ -"help.text.destination_beacons.how.1" = "Para establecer una señal:
Primero, ve los detalles de una ubicación usando la barra de búsqueda para buscar un lugar, o tocando uno de los botones \"Lugares cercanos\", \"Marcadores y rutas\" o \"Ubicación actual\" y seleccionando una ubicación. En la pantalla \"Detalles de la Ubicación\" puedes seleccionar el botón \"Iniciar Señal de Audio\". Al pulsarlo, volverás a la pantalla de inicio y se encenderá una señal audible proveniente de la dirección del lugar que has seleccionado. El nombre del lugar junto con su distancia y dirección física, si está disponible, ahora se mostrará en la pantalla principal."; +"help.text.destination_beacons.how.1" = "Para establecer una señal:
primero, ve los detalles de una ubicación usando la barra de búsqueda para buscar un lugar, o pulsando uno de los botones \"Lugares cercanos\", \"Marcadores y rutas\" o \"Ubicación actual\" y seleccionando una ubicación. Luego, en la pantalla \"Detalles de la ubicación\", selecciona el botón \"Iniciar señal de audio\". Al pulsarlo, volverás a la pantalla de inicio y se activará una señal audible proveniente de la dirección del lugar que has seleccionado. El nombre del lugar junto con su distancia y dirección física, si están disponibles, aparecerán ahora en la pantalla principal."; /* */ -"help.text.destination_beacons.how.2" = "Para quitar la señal actual:
solo tienes que presionar el botón \"Quitar señal\" de la pantalla principal."; +"help.text.destination_beacons.how.2" = "Para quitar la señal actual:
solo tienes que presionar el botón \"Quitar señal\" en la pantalla principal."; /* */ -"help.text.destination_beacons.how.3" = "Para silenciar la señal de audio:
pulsa el botón \"Silenciar señal\" que se encuentra debajo del botón \"Quitar señal\" de la pantalla principal."; +"help.text.destination_beacons.how.3" = "Para silenciar la señal de audio:
pulsa el botón \"Silenciar señal\" debajo del botón \"Quitar señal\" en la pantalla principal."; /* */ -"help.text.automatic_callouts.what" = "Soundscape puede indicarte los elementos que tienes a tu alrededor conforme te acercas ellos llamándolos por su nombre desde la dirección en la que se encuentran. La aplicación hará esto automáticamente para todo tipo de elementos, como negocios, paradas de autobuses e incluso cruces. Puedes configurar de qué avisa la aplicación automáticamente en la sección \"Administrar avisos\" de la pantalla \"Ajustes\" y podrás desactivar todos los avisos cuando desees que la aplicación esté en silencio."; +"help.text.automatic_callouts.what" = "Soundscape puede indicarte los elementos a tu alrededor conforme te acercas a ellos llamándolos por su nombre desde la dirección en la que se encuentran. La aplicación hará esto automáticamente para todo tipo de elementos, como negocios, paradas de autobús e incluso cruces. Puedes configurar de qué avisa la aplicación automáticamente en la sección \"Administrar avisos\" de la pantalla \"Ajustes\", y podrás desactivar todos los avisos cuando desees que la aplicación esté en silencio."; /* */ @@ -3662,23 +3662,23 @@ /* */ -"help.text.automatic_callouts.when.2" = "Caminar hasta una ubicación específica:
cuando te dirijas a una ubicación concreta, los avisos automáticos para cruces pueden ser especialmente útiles. Los avisos de cruces te informan de la disposición de los cruces cuando te aproximas a ellos y confirman la carretera en la que te encuentras al salir de ellos."; +"help.text.automatic_callouts.when.2" = "Caminar hasta una ubicación específica:
cuando te dirijas a una ubicación concreta, los avisos automáticos para cruces pueden ser especialmente útiles. Los avisos de cruces te informan de la disposición de los cruces cuando te aproximas a ellos, y confirman la carretera en la que te encuentras al salir de ellos."; /* */ -"help.text.automatic_callouts.when.3" = "Cuando necesites silencio:
cuando estés a punto de cruzar una carretera o simplemente necesites que la aplicación esté en silencio, puedes desactivar los avisos. Cuando los avisos estén desactivados, la aplicación solo te dará información si pulsas manualmente en uno de los botones \"Mi ubicación\", \"Marcadores cercanos\", \"Alrededor de mí\" o \"Delante de mí\"."; +"help.text.automatic_callouts.when.3" = "Cuando necesites silencio:
cuando estés a punto de cruzar una carretera o simplemente necesites que la aplicación esté en silencio, puedes desactivar los avisos. Cuando los avisos estén desactivados, la aplicación solo te dará información si pulsas manualmente uno de los botones \"Mi ubicación\", \"Marcadores cercanos\", \"Alrededor de mí\" o \"Delante de mí\"."; /* */ -"help.text.automatic_callouts.how.1" = "Activar o desactivar los avisos:
Al desactivar los avisos, se silenciará la aplicación. Los avisos se pueden activar o desactivar en la sección \"Administrar Avisos\" de la pantalla \"Ajustes\", donde puedes tocar el botón \"Permitir Avisos\" para activarlos o desactivarlos. También puedes activar o desactivar los avisos mediante el comando \"saltar hacia adelante\" (toca dos veces y mantén presionado) si tus auriculares tienen botones de control de medios. Alternativamente, puedes usar el botón \"Suspender\" en la esquina superior derecha de la pantalla de inicio para evitar que Soundscape haga avisos hasta que lo reactives."; +"help.text.automatic_callouts.how.1" = "Activación o desactivación de avisos:
desactivar los avisos silenciará la aplicación. Para activarlos o desactivarlos, en la sección \"Administrar avisos\" de la pantalla \"Ajustes\", pulsa el botón \"Permitir avisos\". También puedes activar o desactivar avisos con el comando \"saltar adelante\" (pulsa dos veces y mantén pulsado) si los auriculares tienen botones de control multimedia. Alternativamente, puedes usar el botón \"Suspender\" en la esquina superior derecha de la pantalla principal para que Soundscape deje de realizar avisos hasta que lo reactives."; /* */ -"help.text.automatic_callouts.how.2" = "Administrar los avisos que oyes:
Para elegir los tipos de cosas que Soundscape llamará automáticamente, ve a la pantalla \"Ajustes\" desde el menú principal. La sección \"Administrar Avisos\" de la pantalla \"Ajustes\" contiene una lista de tipos de cosas que la app puede llamar. Cada elemento tiene un botón de alternancia que se puede activar o desactivar. Si deseas desactivar todos los avisos, toca el botón \"Permitir Avisos\" en la parte superior de la lista."; +"help.text.automatic_callouts.how.2" = "Administración de los avisos que oyes:
para elegir los tipos de elementos de los que avisará Soundscape automáticamente, ve a la pantalla \"Ajustes\" desde el menú de la pantalla principal. La sección \"Administrar avisos\" de la pantalla \"Ajustes\" incluye una lista de tipos de elementos de los que puede avisar la aplicación. Cada elemento tiene un botón de alternancia que se puede activar o desactivar. Si deseas desactivar todos los avisos, pulsa el botón \"Permitir avisos\" en la parte superior de la lista."; /* */ -"help.text.my_location.what" = "El botón \"Mi ubicación\" te ofrece información rápidamente que te ayuda a averiguar dónde te encuentras actualmente. \"Mi ubicación\" te informa sobre tu ubicación actual, incluidas cosas como la dirección hacia la que estás orientado, dónde se encuentran cruces o carreteras cercanas, y dónde hay puntos de interés cercanos."; +"help.text.my_location.what" = "El botón \"Mi ubicación\" te ofrece información rápidamente que te ayuda a averiguar dónde te encuentras actualmente. \"Mi ubicación\" te informa sobre tu ubicación actual, incluidas cosas como la dirección hacia la que estás orientado, dónde se encuentran cruces o carreteras cercanas y dónde hay puntos de interés cercanos."; /* */ @@ -3686,7 +3686,7 @@ /* */ -"help.text.my_location.how" = "Como con los cuatro botones de la parte inferior de la pantalla principal, mantén el teléfono con la pantalla en posición horizontal (hacia arriba) y la parte superior del teléfono apuntando en la dirección hacia la que estás orientado antes de presionar el botón \"Mi ubicación\". Esto actúa como una brújula que le indica a la aplicación hacia qué dirección estás orientado. Solo tienes que pulsar el botón \"Mi ubicación\" y escuchar."; +"help.text.my_location.how" = "Como con los cuatro botones de la parte inferior de la pantalla principal, mantén el teléfono con la pantalla en posición horizontal (hacia arriba) y la parte superior del teléfono apuntando en la dirección en la que estás mirando antes de presionar el botón \"Mi ubicación\". Esto actúa como una brújula que le indica a la aplicación hacia qué dirección estás orientado. Solo tienes que pulsar el botón \"Mi ubicación\" y escuchar."; /* */ @@ -3698,23 +3698,23 @@ /* */ -"help.text.nearby_markers.how" = "Como con los cuatro botones de la parte inferior de la pantalla principal, mantén el teléfono con la pantalla en posición horizontal (hacia arriba) y la parte superior del teléfono apuntando en la dirección hacia la que estás orientado antes de presionar el botón \"Marcadores cercanos\". Esto actúa como una brújula que le indica a la aplicación hacia qué dirección estás orientado. Solo tienes que pulsar el botón \"Marcadores cercanos\" y escuchar hasta cuatro marcadores cerca de ti."; +"help.text.nearby_markers.how" = "Como con los cuatro botones de la parte inferior de la pantalla principal, mantén el teléfono con la pantalla en posición horizontal (hacia arriba) y la parte superior del teléfono apuntando en la dirección en la que estás mirando antes de presionar el botón \"Marcadores cercanos\". Esto actúa como una brújula que le indica a la aplicación hacia qué dirección estás orientado. Solo tienes que pulsar el botón \"Marcadores cercanos\" y escuchar hasta cuatro marcadores cerca de ti."; /* */ -"help.text.around_me.what" = "El botón \"Alrededor de mí\" te informa sobre una cosa en cada uno de los cuatro cuadrantes que te rodean (adelante, a la derecha, detrás y a la izquierda). \"Alrededor de mí\" tiene la intención de ayudarte a orientarte en tu entorno."; +"help.text.around_me.what" = "El botón \"Alrededor de mí\" te informa sobre una cosa en cada uno de los cuatro cuadrantes que se encuentran a tu alrededor (delante, a la derecha, detrás y a la izquierda). \"Alrededor de mí\" está pensado para ayudarte a orientarte en tu entorno."; /* */ -"help.text.around_me.when" = "Cuando intentes orientarte en tu entorno, usa \"Alrededor de mí\" para escuchar sobre las cosas que te rodean."; +"help.text.around_me.when" = "Cuando intentes orientarte en tu entorno, usa \"Alrededor de mí\" para escuchar sobre las cosas que hay a tu alrededor."; /* */ -"help.text.around_me.how" = "Como con los cuatro botones de la parte inferior de la pantalla principal, mantén el teléfono con la pantalla en posición horizontal (hacia arriba) y la parte superior del teléfono apuntando en la dirección hacia la que estás orientado antes de presionar el botón \"Alrededor de mí\". Esto actúa como una brújula que le indica a la aplicación hacia qué dirección estás orientado. Solo tienes que pulsar el botón \"Alrededor de mí\" y oirás los cuatro puntos de interés situados a tu alrededor."; +"help.text.around_me.how" = "Como con los cuatro botones de la parte inferior de la pantalla principal, mantén el teléfono con la pantalla en posición horizontal (hacia arriba) y la parte superior del teléfono apuntando en la dirección en la que estás mirando antes de presionar el botón \"Alrededor de mí\". Esto actúa como una brújula que le indica a la aplicación hacia qué dirección estás orientado. Solo tienes que pulsar el botón \"Alrededor de mí\" y oirás cuatro puntos de interés situados a tu alrededor."; /* */ -"help.text.ahead_of_me.what" = "El botón \"Delante de mí\" te indica qué se encuentra delante de ti. \"Delante de mí\" está pensado para explorar lo que se encuentra delante de ti cuando estás conociendo una zona nueva."; +"help.text.ahead_of_me.what" = "El botón \"Delante de mí\" te informa de hasta cinco elementos que se encuentran delante de ti. \"Delante de mí\" está pensado para explorar el camino por delante de ti cuando estás conociendo una zona nueva."; /* */ @@ -3722,19 +3722,19 @@ /* */ -"help.text.ahead_of_me.how" = "Como con los cuatro botones de la parte inferior de la pantalla principal, mantén el teléfono con la pantalla en posición horizontal (hacia arriba) y la parte superior del teléfono apuntando en la dirección hacia la que estás orientado antes de presionar el botón \"Delante de mí\". Esto actúa como brújula que le indica a la aplicación hacia qué dirección estás orientado. Solo tienes que pulsar el botón \"Delante de mí\" y oirás varios puntos de interés que estén más o menos delante de ti."; +"help.text.ahead_of_me.how" = "Como con los cuatro botones de la parte inferior de la pantalla principal, mantén el teléfono con la pantalla en posición horizontal (hacia arriba) y la parte superior del teléfono apuntando en la dirección en la que estás mirando antes de presionar el botón \"Delante de mí\". Esto actúa como una brújula que le indica a la aplicación hacia qué dirección estás orientado. Solo tienes que pulsar el botón \"Delante de mí\" y oirás varios puntos de interés que estén más o menos delante de ti."; /* */ -"help.text.remote_control.what" = "Puedes obtener acceso a determinadas características de Soundscape con la ayuda de los botones de control multimedia de sus auriculares. Esta funcionalidad funciona con auriculares Bluetooth o por cable que tenga botones de control multimedia, como Reproducir, Pausa, Siguiente, Anterior y otros. Distintos modelos de auriculares con micrófono pueden incluir diferentes botones; consulta la lista de acciones a continuación para determinar cuáles están disponibles para ti.
Ten en cuenta que esta característica solo funciona con auriculares con micrófono que admitan controles multimedia de Apple (como reproducir y pausa)."; +"help.text.remote_control.what" = "Puedes obtener acceso a determinadas características de Soundscape con los botones de control multimedia de tus auriculares. Esta funcionalidad funciona con auriculares Bluetooth o por cable que tengan botones de control multimedia, como Reproducir, Pausa, Siguiente, Anterior y otros. Distintos modelos de auriculares con micrófono pueden incluir diferentes botones; consulta la lista de acciones a continuación para determinar cuáles están disponibles para ti.
Ten en cuenta que esta característica solo funciona con auriculares con micrófono que admitan controles multimedia de Apple (como reproducir y pausa)."; /* */ -"help.text.remote_control.when" = "Los controles multimedia de auriculares se pueden usar mientras Soundscape se está ejecutando. Esto es así si te encuentras actualmente en Soundscape o mientras Soundscape se encuentra en segundo plano e incluso cuando el dispositivo está bloqueado. Sin embargo, ten en cuenta que los botones de control multimedia no funcionarán con Soundscape si está reproduciendo audio como música, podcasts o vídeos con otra aplicación."; +"help.text.remote_control.when" = "Los controles multimedia de auriculares se pueden usar mientras Soundscape se está ejecutando. Esto es así si te encuentras actualmente en Soundscape o mientras la aplicación se ejecuta en segundo plano e incluso cuando el dispositivo está bloqueado. Sin embargo, ten en cuenta que los botones de control multimedia no funcionarán con Soundscape si estás reproduciendo audio como música, podcasts o vídeos con otra aplicación."; /* */ -"help.text.remote_control.how" = "

Puedes acceder a las siguientes funciones de Soundscape utilizando los botones de control multimedia de los auriculares:


⏯ Reproducir/Pausar: Silencie los avisos actuales y, si la señal de audio está establecida, active o desactive el audio.

⏭ siguiente: Llame \"Mi ubicación\".

⏮ Anterior: Repita el último aviso.

⏩ Saltar hacia adelante: Activa y desactiva los avisos.

⏪ Saltar hacia atrás: Gritar \"Alrededor de mí\".

"; +"help.text.remote_control.how" = "

Puedes obtener acceso a las siguientes funciones de Soundscape con los botones de control multimedia de tus auriculares:


⏯ Reproducir/Pausa: silenciar los avisos actuales y, si la señal de audio está establecida, alternar el audio de la señal.

⏭ Siguiente: aviso \"Mi ubicación\".

⏮ Anterior: repetir último aviso.

⏩ Saltar adelante: activar y desactivar avisos.

⏪ Saltar atrás: aviso \"Alrededor de mí\".

"; /* */ @@ -3742,23 +3742,23 @@ /* */ -"help.text.markers.content.2" = "Puedes marcar las cosas que son personales y relevantes para ti, como tu casa, tu oficina y tu tienda de comestibles preferida. Puedes marcar cualquier lugar o dirección, pero también cosas que podrían no estar disponible tradicionalmente en mapas, por ejemplos, entradas a edificios o parques, lugares con pulsador para cruzar la calle, pasos de peatones o puentes, paradas de autobús o incluso el árbol favorito de tu perro y usarlos como referencia durante tu paseo."; +"help.text.markers.content.2" = "Puedes marcar las cosas que son personales y relevantes para ti, como tu casa, tu oficina y tu tienda de comestibles preferida. Puedes marcar cualquier lugar o dirección, pero también cosas que normalmente no aparecen en los mapas, por ejemplo, entradas a edificios o parques, lugares con pulsador para cruzar la calle, pasos de peatones o puentes, paradas de autobús o incluso el árbol favorito de tu perro y usarlos como referencia durante tu paseo."; /* */ -"help.text.markers.content.3" = "Para que conozcas los lugares marcados, Soundscape avisará automáticamente de ellos mientras pasas a pie o te aproximas a ellos o bien, puedes usar el botón Marcadores cercanos de la parte inferior de la pantalla principal para oír un aviso espacial de los lugares marcados a tu alrededor. Además, puedes establecer una señal de audio en cualquier lugar marcado. Cuando hagas esto, se oirá la señal de audio de Soundscape que conoces y puedes actuar de la manera habitual."; +"help.text.markers.content.3" = "Para que conozcas los lugares marcados, Soundscape avisará automáticamente de ellos mientras pasas a pie o te aproximas a ellos o bien, puedes usar el botón \"Marcadores cercanos\" de la parte inferior de la pantalla principal para oír un aviso espacial de los lugares marcados a tu alrededor. Además, puedes establecer una señal de audio en cualquier lugar marcado. Cuando hagas esto, se oirá la señal de audio de Soundscape que conoces y podrá actuar de la manera habitual."; /* */ -"help.text.creating_markers.content.1" = "Puedes crear marcadores de tres formas: buscando el lugar que te gustaría guardar mediante la barra de búsqueda, encontrando algún lugar mediante el botón \"Lugares cercanos\" o utilizando el botón \"Ubicación actual\", todos ellos en la pantalla de inicio de Soundscape. Una vez que hayas encontrado el lugar que deseas, al seleccionarlo accederás a la página \"Detalles de la ubicación\". En esta página, selecciona el botón \"Guardar como marcador\"."; +"help.text.creating_markers.content.1" = "Puedes crear marcadores de tres maneras: buscando el lugar que deseas guardar con la barra de búsqueda, encontrando algún lugar con el botón \"Lugares cercanos\" o usando el botón \"Ubicación actual\", todos ellos en la pantalla principal de Soundscape. Una vez que hayas encontrado el lugar que deseas, al seleccionarlo, irás a la página \"Detalles de la ubicación\". En esta página, selecciona el botón \"Guardar como marcador\"."; /* */ -"help.text.creating_markers.content.2" = "Tendrás la opción de personalizar este marcador. Este paso es opcional. Si lo deseas, puedes cambiar el nombre del marcador y también agregar una anotación que se oirá con el marcador para proporcionar información adicional. Una vez que hayas acabado, selecciona el botón \"Listo\" para guardar el marcador."; +"help.text.creating_markers.content.2" = "Tendrás la opción de personalizar este marcador. Puedes cambiar su nombre y también agregar una anotación que se oirá con el marcador para proporcionar información adicional. A continuación, selecciona el botón \"Listo\" para guardar el marcador."; /* */ -"help.text.customizing_markers.content.1" = "Si deseas cambiar el nombre de un marcador que has creado anteriormente, o agregarle una anotación, puedes hacerlo seleccionando el marcador en la pestaña \"Marcadores\" de la página \"Marcadores y rutas\" y, a continuación, \"Editar marcador\" . Puedes usarlo para asignar a los marcadores sobrenombres útiles o descriptivos, así como para proporcionarles una descripción más larga con el campo de anotación."; +"help.text.customizing_markers.content.1" = "Si deseas cambiar el nombre de un marcador que has creado anteriormente, o agregarle una anotación, selecciona el marcador en la pestaña \"Marcadores\" de la página \"Marcadores y rutas\" y, a continuación, \"Editar marcador\". Puedes usarlo para asignar a los marcadores sobrenombres útiles o descriptivos, así como para proporcionarles una descripción más larga con el campo de anotación."; /* */ @@ -3766,7 +3766,7 @@ /* */ -"help.text.routes.content.what" = "Las rutas son una serie de puntos de ruta. Se te informará a la llegada a cada uno de ellos y la señal de audio avanzará automáticamente hasta el siguiente."; +"help.text.routes.content.what" = "Las rutas son una serie de puntos de referencia. Se te informará a la llegada a cada uno de ellos, y la señal de audio avanzará automáticamente al siguiente."; /* */ @@ -3774,7 +3774,7 @@ /* */ -"help.text.routes.content.how.1" = "Creación de una ruta:
en primer lugar, ve a \"Marcadores y rutas\", y selecciona la pestaña \"Rutas\" y el botón \"Nueva ruta\". Asigna un nombre y una descripción opcional a la ruta, luego agrega puntos de ruta a medida que avanza o elígelos en tu lista de marcadores. Puedes reorganizar el orden de los puntos de ruta a lo largo de una ruta en cualquier momento editando la ruta."; +"help.text.routes.content.how.1" = "Creación de una ruta:
en primer lugar, ve a \"Marcadores y rutas\", y selecciona la pestaña \"Rutas\" y el botón \"Nueva ruta\". Asigna un nombre y una descripción opcional a la ruta, luego agrega puntos de ruta a medida que avances o elígelos en tu lista de marcadores. Puedes reorganizar el orden de los puntos de ruta a lo largo de una ruta en cualquier momento editando la ruta."; /* */ @@ -3782,11 +3782,11 @@ /* */ -"help.text.routes.content.how.3" = "Uso compartido de una ruta:
selecciona tu ruta en la página \"Marcadores y rutas\" y, a continuación, la opción \"Compartir ruta\" utilizando todas las opciones de uso compartido habituales disponibles para ti."; +"help.text.routes.content.how.3" = "Uso compartido de una ruta:
selecciona tu ruta en la página \"Marcadores y rutas\" y, a continuación, \"Compartir\". Ahora puedes utilizar cualquiera de las opciones de uso compartido habituales disponibles para ti."; /* */ -"help.using_headsets.airpods.what" = "Soundscape admite audio espacial con seguimiento dinámico de la cabeza cuando se utilizan AirPods compatibles. Cuando se conecten, los sensores de los AirPods indican a Soundscape la dirección frente a la cual te encuentras. Esto ayuda a Soundscape a mejorar tu experiencia de audio haciendo que sea más natural a medida que te mueves por el mundo. Cuando uses Soundscape con los AirPods conectados, no es necesario sostener el teléfono para que Soundscape funcione bien."; +"help.using_headsets.airpods.what" = "Soundscape admite audio espacial con seguimiento dinámico de la cabeza al usar AirPods compatibles. Cuando se conecten, los sensores de los AirPods le indicarán a Soundscape la dirección en la que está orientada tu cabeza. Esto le ayuda a Soundscape a mejorar tu experiencia de audio, haciéndola más natural a medida que te mueves por el mundo. Cuando usas Soundscape con los AirPods conectados, no es necesario sostener el teléfono para que la aplicación funcione bien."; /* */ @@ -3798,7 +3798,7 @@ /* */ -"help.using_headsets.airpods.how.2" = "Uso de los controles multimedia en los auriculares:
cuando los controles multimedia estén activados en la configuración de Soundscape, podrás usarlos en los AirPods para silenciar o reactivar la señal, avisar de tu ubicación o repetir el último aviso de llamada. Para obtener más información, ve la sección de ayuda \"Uso de controles multimedia\"."; +"help.using_headsets.airpods.how.2" = "Uso de los controles multimedia en los auriculares:
cuando los controles multimedia estén habilitados en la configuración de Soundscape, podrás usarlos en los AirPods para silenciar o reactivar la señal, avisar de tu ubicación o repetir el último aviso de llamada. Para obtener más información, ve la sección de ayuda \"Uso de controles multimedia\"."; /* */ @@ -3942,7 +3942,7 @@ /* */ -"osm.tag.post_box" = "Casilla de correos"; +"osm.tag.post_box" = "Buzón de correo"; /* */ @@ -4058,7 +4058,7 @@ /* */ -"banner.custom_behavior.scavenger_hunt.hint" = "Pulsa dos veces para leer sobre la búsqueda del tesoro o para pausarla."; +"banner.custom_behavior.scavenger_hunt.hint" = "Pulsa dos veces para leer sobre la búsqueda del tesoro o para pausarla"; /* */ @@ -4102,7 +4102,7 @@ /* */ -"push.local.walk.title" = "Probar Soundscape en tu propio paseo"; +"push.local.walk.title" = "Probar Soundscape en tu próximo paseo"; /* */ @@ -4110,7 +4110,7 @@ /* */ -"voice.apple.additional" = "Se pueden descargar voces adicionales, incluidas las de calidad mejorada, en la sección Contenido leído de la configuración de accesibilidad de iOS."; +"voice.apple.additional" = "Se pueden descargar más voces, incluidas las de calidad mejorada, en la sección Lectura y voz de los ajustes de accesibilidad de iOS."; /* */ @@ -4134,7 +4134,7 @@ /* */ -"faq.when_to_use_soundscape.answer" = "Soundscape tiene características y ventajas que abarcan varios escenarios y escalas de tiempo. Además, el valor de que te aporta Soundscape puede evolucionar con el tiempo; cómo lo uses hoy puede ser diferente a la manera en que lo usarás dentro de tres meses. Los usuarios piensan en las aplicaciones en cuanto a qué problema les resuelven. Sin duda, Soundscape se puede usar caso por caso cuando se tiene una necesidad informativa específica, por ejemplo, realizar el seguimiento de un destino mientras se llega allí, como ayuda para orientarse al salir de una estación de metro o de un coche, o para encontrar los nombres de las calles para el siguiente cruce o la distancia hasta llegar a él. Sin embargo, la filosofía tras Soundscape es la de \"iluminar tu mundo con sonido\" y se ha diseñado para usarlo en cualquier momento en que te encuentres fuera para un reconocimiento del entorno, por ejemplo, para saber los nombres de las calles en las que te encuentras, la dirección a la que te diriges y los nombres de los negocios que pasas. En este modo de uso, nuestros usuarios se han referido a Soundscape como una \"buena aplicación complementaria\", con la que se pueden encontrar lugares fantásticos por casualidad, para \"llenar lagunas en su mapa mental\" y que proporciona más \"confianza al caminar\". Estos son algunos otros ejemplos de cómo nuestros usuarios están incorporando Soundscape a su vida:\n\n\"Soundscape me ha ayudado a volver a mi ruta después de haberme bajado del autobús y haber caminado en la dirección equivocada.\"\n\n\"Incluso ahora en la ciudad en la que llevo viviendo 3 años conozco mejor lo que me rodea [con Soundscape].\"\n\n\"El sonido 3D mejora mi experiencia al caminar, ya que me siento más conectado con mi entorno… Es más probable que pruebe una ruta nueva ahora que tengo la aplicación.\"\n\n\"Echo de menos caminar y encontrar cosas por casualidad. Tener Soundscape está bien; no resulta un esfuerzo oír las cosas que me rodean. La información relacional es útil y resulta una aplicación excelente para reconocer las situaciones y explorar los pasillos comerciales.\"\n\n\"[Usé Soundscape] para encontrar un pub en medio de York. [I] Usé varias de sus opciones para localizarlo primero y después encontrarlo. Me llevó a 3 metros de la puerta, lo cual es fantástico.\""; +"faq.when_to_use_soundscape.answer" = "Soundscape tiene características y ventajas que abarcan varios escenarios y escalas de tiempo. Además, el valor de que te aporta Soundscape puede evolucionar con el tiempo; cómo lo uses hoy puede ser diferente a la manera en que lo usarás dentro de tres meses. Los usuarios piensan en las aplicaciones en cuanto a qué problema les resuelven. Sin duda, Soundscape se puede usar caso por caso cuando se tiene una necesidad informativa específica, por ejemplo, realizar el seguimiento de un destino mientras se llega allí, como ayuda para orientarse al salir de una estación de metro o de un coche, o para encontrar los nombres de las calles para el siguiente cruce o la distancia hasta llegar a él. Sin embargo, la filosofía tras Soundscape es la de \"iluminar tu mundo con sonido\", y se ha diseñado para usarlo en cualquier momento en que te encuentres fuera para un reconocimiento del entorno, por ejemplo, para saber los nombres de las calles en las que te encuentras, la dirección a la que te diriges y los nombres de los negocios que pasas. En este modo de uso, nuestros usuarios se han referido a Soundscape como una \"buena aplicación complementaria\", con la que se pueden encontrar lugares fantásticos por casualidad, para \"llenar lagunas en su mapa mental\" y que proporciona más \"confianza al caminar\". Estos son algunos otros ejemplos de cómo nuestros usuarios están incorporando Soundscape a su vida:\n\n\"Soundscape me ha ayudado a volver a mi ruta después de haberme bajado del autobús y haber caminado en la dirección equivocada.\"\n\n\"Incluso ahora en la ciudad en la que llevo viviendo 3 años, conozco mejor lo que me rodea [con Soundscape].\"\n\n\"El sonido 3D mejora mi experiencia al caminar, ya que me siento más conectado con mi entorno… Es más probable que pruebe una ruta nueva ahora que tengo la aplicación.\"\n\n\"Echo de menos caminar y encontrar cosas por casualidad. Tener Soundscape está bien; no resulta un esfuerzo oír las cosas que me rodean. La información relacional es útil y resulta una aplicación excelente para reconocer las situaciones y explorar los pasillos comerciales.\"\n\n\"[Usé Soundscape] para encontrar un pub en medio de York. [I] Usé varias de sus opciones para localizarlo primero y después encontrarlo. Me llevó a 3 metros de la puerta, lo cual es fantástico.\""; /* */ @@ -4142,7 +4142,7 @@ /* */ -"faq.markers_function.answer" = "Los marcadores son lugares que has guardado. Pueden ser lugares descubiertos por la aplicación o lugares totalmente nuevos que hayas añadido tú mismo. Puedes guardar tu ubicación actual como marcador seleccionando el botón \"Ubicación actual\" en la pantalla de inicio y, a continuación, \"Guardar como marcador\". Puedes guardar otras ubicaciones como marcador buscando el lugar que te gustaría guardar utilizando la barra de búsqueda, o encontrando algún lugar utilizando el botón \"Lugares cercanos\", ambos en la pantalla de inicio de Soundscape. Una vez que hayas encontrado el lugar que deseas, al seleccionarlo accederás a la página \"Detalles de la ubicación\". En esta página, selecciona el botón \"Guardar como marcador\"."; +"faq.markers_function.answer" = "Los marcadores son lugares que has guardado. Pueden ser lugares que se pueden encontrar con la aplicación u otros totalmente nuevos que has agregado tú mismo. Para guardar tu ubicación actual como marcador, selecciona el botón \"Ubicación actual\" en la pantalla principal y, a continuación, \"Guardar como marcador\". Puedes guardar otras ubicaciones como marcador buscando el lugar que deseas guardar con la barra de búsqueda, o encontrando algún lugar mediante el botón \"Lugares cercanos\"; ambos se encuentran en la pantalla principal de Soundscape. Una vez que has encontrado el lugar que deseas, al seleccionarlo, irás a la página \"Detalles de la ubicación\". En esta página, selecciona el botón \"Guardar como marcador\"."; /* */ @@ -4154,7 +4154,7 @@ /* */ -"faq.what_can_I_set.answer" = "Puedes establecer una señal de audio en cualquier negocio, lugar, punto de interés, dirección o cruce. Hay varias formas de establecer una ubicación como baliza. Primero, ve los detalles de una ubicación usando la barra de búsqueda para buscar un lugar, o tocando uno de los botones \"Lugares cercanos\", \"Marcadores y rutas\" o \"Ubicación actual\" y seleccionando una ubicación. En la pantalla ddetalles de la ubicación puedes seleccionar el botón \"Iniciar señal de audio\". Al pulsarlo, volverás a la pantalla de inicio y se encenderá una señal audible proveniente de la dirección del lugar que has seleccionado. El nombre del lugar junto con su distancia y dirección física, si está disponible, ahora se mostrará en la pantalla principal."; +"faq.what_can_I_set.answer" = "Puedes establecer una señal de audio en cualquier negocio, lugar, punto de interés, dirección o cruce. Hay varias formas de establecer una ubicación como señal. Primero, ve los detalles de una ubicación mediante la barra de búsqueda para buscar un lugar, o pulsando uno de los botones \"Lugares cercanos\", \"Marcadores y rutas\" o \"Ubicación actual\" y seleccionando una ubicación. Luego, en la pantalla \"Detalles de la ubicación\", selecciona el botón \"Iniciar señal de audio\". Al pulsarlo, volverás a la pantalla de inicio y se activará una señal audible proveniente de la dirección del lugar que has seleccionado. El nombre del lugar junto con su distancia y dirección física, si están disponibles, aparecerán ahora en la pantalla principal."; /* */ @@ -4162,7 +4162,7 @@ /* */ -"faq.how_to_use_beacon.answer" = "Piensa en la señal de audio como un \"faro para los oídos\", que te notifica la distancia de tu destino en relación con tu ubicación, a vuelo de pájaro. Como haría un faro, no indica cómo llegar; es posible que necesites muchas opciones de navegación en el trayecto, de la misma manera que un barco tendrá muchas \"indicaciones\" estratégicas para acercarse al faro. El sonido rítmico continuo de la señal proviene de la dirección del destino y te ayuda a estar al tanto de su ubicación en relación contigo mientras caminas. Cuando vayas caminando directamente hacia el destino, o apuntes el teléfono hacia él, oirás un \"tono\" más agudo. Esta característica te permitirá identificar la dirección del destino, puesto que la dirección del sonido rítmico a veces puede ser difícil de percibir en entornos ruidosos. Al buscar el \"tono\" más alto, mantén el teléfono en posición horizontal y realiza un movimiento de barrido con el teléfono lentamente. Gira la cabeza hacia la misma dirección que el teléfono para asegurarte de que disfruta de la mejor experiencia de audio espacial.\n\nLa metáfora del faro para el diseño de la señal tiene varias implicaciones naturales:\n\n1. No hay ninguna dirección \"correcta\" en la que viajar al usar la señal, en tu lugar, con Soundscape eliges cómo llegar allí.\n2. El \"tono\" más agudo solo te ayuda a identificar la dirección del destino, pero no es una indicación de cómo llegar allí.\n3. Si normalmente sabes cómo llegar a tu destino, puede que desees silenciar la señal para la mayor parte del trayecto y activarla solo cuando te acerques."; +"faq.how_to_use_beacon.answer" = "Piensa en la señal de audio como un \"faro para los oídos\", que te notifica la distancia de tu destino en relación con tu ubicación, a vuelo de pájaro. Como haría un faro, no indica cómo llegar; es posible que necesites muchas opciones de navegación en el trayecto, de la misma manera que un barco tendrá muchas \"indicaciones\" estratégicas para acercarse al faro. El sonido rítmico continuo de la señal proviene de la dirección del destino, y te ayuda a estar al tanto de su ubicación en relación contigo mientras caminas. Cuando vayas caminando directamente hacia el destino, o apuntes el teléfono hacia él, oirás un \"tono\" más agudo. Esta característica te permitirá identificar la dirección del destino, puesto que la dirección del sonido rítmico a veces puede ser difícil de percibir en entornos ruidosos. Al buscar el \"tono\" más agudo, mantén el teléfono en posición horizontal y realiza un movimiento de barrido con el teléfono lentamente. Gira la cabeza hacia la misma dirección que el teléfono para asegurarte de que disfrutas de la mejor experiencia de audio espacial.\n\nLa metáfora del faro para el diseño de la señal tiene varias implicaciones naturales:\n\n1. No hay ninguna dirección \"correcta\" en la que se deba viajar al usar la señal, en su lugar, con Soundscape eliges cómo llegar allí.\n2. El \"tono\" más agudo solo te ayuda a identificar la dirección del destino, pero no es una indicación de cómo llegar allí.\n3. Si normalmente sabes cómo llegar a tu destino, puede que desees silenciar la señal para la mayor parte del trayecto y activarla solo cuando te acerques."; /* */ @@ -4170,7 +4170,7 @@ /* */ -"faq.why_does_beacon_disappear.answer" = "La señal de audio de Soundscape es básicamente una indicación de dirección, que te informa de dónde se encuentra tu destino en relación con la dirección hacia la que estás orientado. Cuando Soundscape no está seguro de hacia qué dirección estás orientado, baja el volumen de la señal. Muy a menudo esto sucede si has estado caminando con el teléfono guardado en el bolsillo o en el bolso y dejas de moverte, como para cruzar la calle. El sonido de la señal será más alto una vez que empieces a moverte de nuevo o si mantienes el teléfono en posición horizontal y lo apunta en la dirección hacia la que estás orientado."; +"faq.why_does_beacon_disappear.answer" = "La señal de audio de Soundscape es básicamente una indicación de dirección, que te informa de dónde se encuentra tu destino en relación con la dirección hacia la que estás orientado. Cuando Soundscape no está seguro de hacia donde estás orientado, baja el volumen de la señal. Muy a menudo esto sucede si has estado caminando con el teléfono guardado en el bolsillo o en el bolso y dejas de moverte, como para cruzar la calle. El sonido de la señal será más alto una vez que empieces a moverte de nuevo o si mantienes el teléfono en posición horizontal y lo apuntas en dirección contraria a ti."; /* */ @@ -4178,7 +4178,7 @@ /* */ -"faq.beacon_on_address.answer" = "Sí. Las direcciones no se muestran de manera predeterminada pero se pueden encontrar en el campo de búsqueda. Para guardar esta dirección y no tener que buscarla de nuevo, puedes agregarla como marcador desde la pantalla principal seleccionando el botón \"agregar a marcadores\" o mediante acciones de VoiceOver en la señal de la pantalla principal."; +"faq.beacon_on_address.answer" = "Sí. Las direcciones no se muestran de manera predeterminada pero se pueden encontrar en el campo de búsqueda. Para guardar esta dirección y no tener que buscarla de nuevo, puedes agregarla como marcador desde la pantalla principal seleccionando el botón \"Agregar a marcadores\" o mediante acciones de VoiceOver en la señal de la pantalla principal."; /* */ @@ -4186,7 +4186,7 @@ /* */ -"faq.beacon_on_home.answer" = "Soundscape permite establecer señales en direcciones. Para establecer una señal en tu casa, o en cualquier otra dirección, desde la pantalla principal, pulsa en la barra de búsqueda y escribe la dirección. En la pantalla \"Detalles de la ubicación\", pulsa el botón \"Iniciar señal de audio\"."; +"faq.beacon_on_home.answer" = "Soundscape admite el establecimiento de señales en direcciones. Para establecer una señal en tu casa, o en otra dirección, en la pantalla principal, pulsa en la barra de búsqueda y escribe la dirección. En la pantalla \"Detalles de la ubicación\", pulsa el botón \"Iniciar señal de audio\"."; /* */ @@ -4194,7 +4194,7 @@ /* */ -"faq.how_close_to_destination.answer" = "Soundscape puede determinar la ubicación de tu destino con una precisión de varios metros, pero no menos. Cuando Soundscape determine que estás cerca de tu destino, oirás un último aviso de que tu destino está cerca y la señal se apagará. Puedes ajustar cuándo se apaga la señal yendo a \"Señal de audio\" en la pantalla \"Ajustes\" y moviendo el control deslizante \"Distancia de Silenciar el audio\" hacia arriba o hacia abajo."; +"faq.how_close_to_destination.answer" = "Soundscape puede determinar la ubicación de tu destino con una precisión de varios metros, pero no menos. Cuando Soundscape determine que estás cerca de tu destino, escucharás un último aviso de que tu destino está cerca y la señal se apagará. Puedes ajustar la distancia a la que la señal se silencia de la forma siguiente: ve a \"Señal de audio\" en la pantalla \"Ajustes\" y mueve el control deslizante \"Distancia de silenciar el audio\" hacia arriba o hacia abajo."; /* */ @@ -4202,7 +4202,7 @@ /* */ -"faq.turn_beacon_back_on.answer" = "Sí, puedes volver a activar la señal cuando Soundscape la haya desactivado. Para ello, selecciona el botón \"reactivar señal\". Sin embargo, dada la baja precisión de Localización a unos 10 metros, no podemos garantizar el comportamiento de la señal cuando te encuentres a pocos metros de tu destino."; +"faq.turn_beacon_back_on.answer" = "Sí, puedes volver a activar la señal cuando Soundscape la haya desactivado. Para ello, selecciona el botón \"Reactivar señal\". Sin embargo, dada la baja precisión de Localización a unos 10 metros, no podemos garantizar el comportamiento de la señal cuando te encuentres a pocos metros de tu destino."; /* */ @@ -4210,7 +4210,7 @@ /* */ -"faq.road_names.answer" = "Para adaptarse a una variedad de formas de intersecciones, Soundscape describe los cruces como segmentos de carreteras que parten de un punto común. Soundscape usa audio espacial para indicar el nombre de la carretera que va a la izquierda, el nombre de la carretera que continúa de frente y el nombre de la carretera que va a la derecha, en ese orden. Si la descripción del cruce comienza con la carretera en la que te encuentras en lugar de una a la derecha, la intersección es una T con la carretera en la que te encuentras continuando adelante y una carretera que cruza desde la derecha. De manera similar, si la descripción solo incluye una carretera a la izquierda y a la derecha, sabrás que la carretera en la que te encuentras termina en una T delante de ti. Este método de describir cruces también admite la situación de una carretera que cambia de nombre en un cruce."; +"faq.road_names.answer" = "Para adaptarse a una variedad de formas de intersecciones, Soundscape describe los cruces como segmentos de carreteras que parten de un punto común. Soundscape usa audio espacial para indicar los nombres de las carreteras que van hacia la izquierda, hacia adelante y hacia la derecha, en ese orden. Si la descripción del cruce comienza con la carretera en la que te encuentras en lugar de una a la izquierda, la intersección forma una T lateral con la carretera en la que te encuentras continuando adelante y una carretera que cruza desde la derecha. De manera similar, si la descripción solo incluye una carretera a la izquierda y a la derecha, sabrás que la carretera en la que te encuentras termina en una T delante de ti. Este método de describir cruces también admite la situación de una carretera que cambia de nombre en un cruce."; /* */ @@ -4230,11 +4230,11 @@ /* */ -"faq.miss_a_callout.question" = "¿Qué ocurre si no comprendo un aviso o si no lo oigo por el ruido?"; +"faq.miss_a_callout.question" = "¿Qué ocurre si no entiendo un aviso o si no lo oigo por el ruido?"; /* */ -"faq.miss_a_callout.answer" = "Soundscape tiene una lista de tus avisoss recientes para que puedas volver a visitar los avisos que te hayas perdido. Para ello, pulsa en la barra de búsqueda de la pantalla de inicio de Soundscape. En la parte inferior de esta página, hay una sección de \"Avisos recientes\" donde aparecerá el aviso que te perdiste. También puedes agitar el teléfono para repetir el último aviso. En la sección \"Administrar Avisos\" de la pantalla \"Ajustes\", activa la opción \"Repetir Avisos\"."; +"faq.miss_a_callout.answer" = "Soundscape tiene una lista de avisoss recientes para que puedas volver a visitar avisos que te hayas perdido. Para encontrarla, pulsa en la barra de búsqueda en la pantalla principal. En la parte inferior de esta página, hay una sección \"Avisos recientes\" donde aparecerá el aviso que te perdiste. También puedes agitar tu teléfono para repetir el último aviso. Para habilitar esta función, ve a la sección \"Administrar avisos\" en la pantalla \"Ajustes\" y activa \"Repetir avisos\"."; /* */ @@ -4254,7 +4254,7 @@ /* */ -"faq.supported_headsets.answer" = "Los auriculares que uses con Soundscape es una cuestión de preferencia personal y cada opción tiene sus ventajas e inconvenientes. El requisito específico es usar auriculares estéreos para beneficiarte de los avisos acústicos espaciales 3D de Soundscape."; +"faq.supported_headsets.answer" = "Los auriculares que uses con Soundscape es una cuestión de preferencia personal, y cada opción tiene sus ventajas y desventajas. El único requisito es usar auriculares estéreos para beneficiarte de los avisos de audio espacial 3D de Soundscape."; /* */ @@ -4262,15 +4262,15 @@ /* */ -"faq.battery_impact.answer" = "La duración de la batería varía en gran medida en función del iPhone que tengas y de su antigüedad. El mayor consumo de la batería se produce al tener la pantalla encendida, por lo que para maximizar su duración, debes mantener la pantalla bloqueada siempre que sea posible. Para ayudar a minimizar el impacto en la batería de iPhone, Soundscape ahora tiene un modo de reposo y un modo de aplazamiento. Para reducir aún más el uso de la batería, cuando no uses Soundscape, debes forzar cerrar la aplicación con el Selector de aplicación de iPhone."; +"faq.battery_impact.answer" = "La duración de la batería varía en gran medida en función del modelo y la antigüedad de tu iPhone. El mayor consumo de la batería se produce al tener la pantalla encendida, por lo que para maximizar su duración, debes mantener la pantalla bloqueada siempre que sea posible. Para ayudar a minimizar el impacto en la batería de iPhone, Soundscape tiene un modo de suspensión y un modo de aplazamiento. Para reducir aún más el uso de la batería, cuando no uses Soundscape, debes forzar cerrar la aplicación con el Selector de aplicación de iPhone."; /* */ -"faq.sleep_mode_battery.question" = "¿Cómo uso el modo de reposo para minimizar el impacto de Soundscape en la batería del teléfono?"; +"faq.sleep_mode_battery.question" = "¿Cómo uso el modo de suspensión para minimizar el impacto de Soundscape en la batería del teléfono?"; /* */ -"faq.sleep_mode_battery.answer" = "Para poner Soundscape en el modo de reposo, selecciona el botón \"Suspender\" en la esquina superior derecha de la pantalla de inicio. Cuando lo selecciones, Soundscape dejará de utilizar los servicios de localización y los datos móviles hasta que lo reactives."; +"faq.sleep_mode_battery.answer" = "Para poner Soundscape en el modo de suspensión, selecciona el botón \"Suspender\" en la esquina superior derecha de la pantalla de inicio. Al seleccionarlo, Soundscape dejará de usar Localización y los datos móviles hasta que lo reactives."; /* */ @@ -4278,15 +4278,15 @@ /* */ -"faq.snooze_mode_battery.answer" = "Para poner Soundscape en el modo de aplazamiento, selecciona el botón \"Suspender\" en la esquina superior derecha de la pantalla de inicio. Cuando Soundscape esté en el modo de reposo, selecciona el botón \"Reactivar cuando Salga\" y Soundscape pasará a un estado de bajo consumo hasta que te vayas de la ubicación actual."; +"faq.snooze_mode_battery.answer" = "Para poner Soundscape en el modo de aplazamiento, selecciona el botón \"Suspender\" en la esquina superior derecha de la pantalla de inicio. Cuando Soundscape se encuentre en el modo de suspensión, selecciona el botón \"Reactivar cuando salga\" y Soundscape entrará en un estado de bajo consumo de la batería hasta que te vayas de la ubicación actual."; /* */ -"faq.headset_battery_impact.question" = "¿En qué afecta los auriculares que elija a la duración de la batería del teléfono?"; +"faq.headset_battery_impact.question" = "¿Cómo afectan los auriculares que elijo a la duración de la batería del teléfono?"; /* */ -"faq.headset_battery_impact.answer" = "En nuestras pruebas, el consumo de la batería de auriculares Bluetooth es comparable a auriculares con cable y no debería ser un factor importante que se debe tener en cuenta a la hora de seleccionar estos auriculares, es decir, tanto los auriculares intrauditivos como los de conducción ósea tienen opciones de modelos por cable e inalámbricos."; +"faq.headset_battery_impact.answer" = "En nuestras pruebas, el consumo de la batería de los auriculares Bluetooth es comparable al de los auriculares con cable, y no debería ser un factor importante que se debe tener en cuenta al seleccionar unos auriculares. Dicho Esto, tanto los auriculares intrauditivos como los de conducción ósea tienen opciones de modelos por cable e inalámbricos."; /* */ @@ -4294,7 +4294,7 @@ /* */ -"faq.background_battery_impact.answer" = "Soundscape usa Localización para determinar tu ubicación. En nuestras pruebas, Soundscape no consume más batería que la aplicación media de mapas, pero si te preocupas el consumo de la batería del teléfono, las siguientes son algunas sugerencias que ayudarán a reducir el uso:\n\n1. Desactiva la pantalla lo máximo posible cuando no interactúes con la aplicación.\n2. Cuando no uses la aplicación, ciérrala. Soundscape usa servicios de localización continuamente mientras se ejecuta por lo que siempre conoce tu ubicación, incluso cuando no estás en movimiento. No te olvides de reiniciar la aplicación al reanudar el trayecto.\n3. Con tiempo frío, mantén el teléfono en una temperatura cálida ya que el rendimiento de las baterías empeora con temperaturas bajas."; +"faq.background_battery_impact.answer" = "Soundscape usa Localización para determinar dónde te encuentras. En nuestras pruebas, Soundscape no consume más batería que la aplicación media de mapas, pero si te preocupa el consumo de la batería del teléfono, las siguientes son algunas sugerencias que ayudarán a reducir el uso:\n\n1. Desactiva la pantalla lo máximo posible cuando no interactúes con la aplicación.\n2. Cuando no uses la aplicación, ciérrala. Soundscape usa los servicios de localización continuamente mientras se ejecuta por lo que siempre conoce tu ubicación, incluso cuando no estás en movimiento. No te olvides de reiniciar la aplicación al reanudar el trayecto.\n3. Con tiempo frío, mantén el teléfono en una temperatura cálida ya que el rendimiento de las baterías empeora con temperaturas bajas."; /* */ @@ -4302,7 +4302,7 @@ /* */ -"faq.mobile_data_use.answer" = "La cantidad de datos móviles que use dependerá de cómo utilices Soundscape. Hemos diseñado Soundscape para que utilice solo una pequeña cantidad de datos cuando estés fuera; por ejemplo, por medio de puntos de ahorro mientras caminas, a fin de que no tengas que volver a descargarlos cada vez que vuelvas a un punto donde ya hayas estado. Para usar menos datos móviles, conéctate siempre que puedas a una red Wi-Fi, en especial cuando descargues la aplicación. Cuando no uses Soundscape, pulsa el botón \"Suspender\" para suspender Soundscape, o bien cierra totalmente la aplicación."; +"faq.mobile_data_use.answer" = "La cantidad de datos móviles que use dependerá de cómo utilices Soundscape. Hemos diseñado la aplicación para que consuma solo una pequeña cantidad de datos cuando estés fuera; por ejemplo, guardando puntos mientras caminas, a fin de que no tengas que volver a descargarlos cada vez que regreses a un sitio donde ya hayas estado. Para usar menos datos móviles, conéctate siempre que puedas a Wi-Fi, en especial cuando descargues la aplicación. Cuando no uses Soundscape, pulsa el botón \"Suspender\" para poner Soundscape en suspensión, o bien cierra totalmente la aplicación."; /* */ @@ -4310,7 +4310,7 @@ /* */ -"faq.difference_from_map_apps.answer" = "Soundscape ofrece una descripción de tu entorno mediante la exploración y la orientación. Usando el sonido espacial, Soundscape avisará de puntos de interés, parques, carreteras y cruces desde la dirección en la que se encuentran físicamente en tu entorno inmediato mientras caminas. Por ejemplo, si pasas por una tienda que se encuentre a tu derecha, oirás el nombre de la tienda sonando a tu derecha. Cuando te acerques a un cruce, oirás el sonido del nombre de cada carretera proveniente de la dirección a la que se dirige, comenzando por la izquierda, adelante y a la derecha.\n\nEn lugar de indicaciones paso a paso, a menudo proporcionadas por aplicaciones de mapas o GPS tradicionales, Soundscape reproducirá una señal de audio en la dirección de tu destino, lo que te permitirá llegar allí en tus condiciones con el mejor conocimiento posible de tu entorno y de la ubicación de tu destino. Soundscape se ha diseñado para ejecutarse en segundo plano, lo que te permite usar una aplicación de indicaciones paso a paso, y seguirá proporcionando todo el tiempo información del entorno mientras llegas a tu destino."; +"faq.difference_from_map_apps.answer" = "Soundscape ofrece una descripción de tu entorno mediante la exploración y la orientación. Usando el sonido espacial, Soundscape avisará de puntos de interés, parques, carreteras y cruces desde la dirección en la que se encuentran físicamente en tu entorno inmediato mientras caminas. Por ejemplo, si pasas por una tienda que se encuentre a tu derecha, oirás el nombre de la tienda sonando a tu derecha. Cuando te acerques a un cruce, oirás el sonido del nombre de cada carretera proveniente de la dirección a la que se dirige, comenzando por la izquierda, adelante y a la derecha.\n\nEn lugar de indicaciones paso a paso, a menudo proporcionadas por otras aplicaciones de mapas, Soundscape reproducirá una señal de audio en la dirección de tu destino, lo que te permitirá llegar allí en tus condiciones con el mejor conocimiento posible de tu entorno y de la ubicación de tu destino. Soundscape se ha diseñado para ejecutarse en segundo plano, lo que te permite usar una aplicación de indicaciones paso a paso, y seguirá proporcionando todo el tiempo información del entorno mientras llegues a tu destino."; /* */ @@ -4318,7 +4318,7 @@ /* */ -"faq.use_with_wayfinding_apps.answer" = "Soundscape se ha diseñado para ayudar a completar la información de tu entorno que es posible que no conozcas de otra manera. Aunque no se ha diseñado como una aplicación de navegación paso a paso, se puede usar junto con esas aplicaciones para proporcionar información complementaria. Para usar Soundscape con estas aplicaciones, inicia tu aplicación de navegación primero. A continuación, pasa a Soundscape y establece una señal en el mismo destino que la aplicación de navegación. En este punto, ambas aplicaciones se estarán ejecutando y oirás indicaciones de ruta a pie de tu aplicación de navegación, a la vez que recibirás de Soundscape actualizaciones sobre puntos de interés, cruces y la distancia a la que se encuentras de tu destino."; +"faq.use_with_wayfinding_apps.answer" = "Soundscape se ha diseñado para ayudar a completar la información de tu entorno que es posible que no conozcas de otra manera. Aunque no se ha diseñado como una aplicación de navegación paso a paso, se puede usar junto con esas aplicaciones para proporcionar información complementaria. Para usar Soundscape con estas aplicaciones, inicia tu aplicación de navegación primero. A continuación, pasa a Soundscape y establece una señal en el mismo destino que la aplicación de navegación. En este punto, ambas aplicaciones se estarán ejecutando y oirás indicaciones de ruta a pie de tu aplicación de navegación, a la vez que recibirás de Soundscape actualizaciones sobre puntos de interés, cruces y la distancia a tu destino."; /* */ @@ -4326,7 +4326,7 @@ /* */ -"faq.controlling_what_you_hear.answer" = "Soundscape ofrece varias formas de controlar lo que oyes y cuándo:\n\n1. Detener inmediatamente todo el audio: Toca dos veces la pantalla con dos dedos para desactivar inmediatamente todo el audio, incluido cualquier aviso que se esté reproduciendo en ese momento y la señal si está activada. Los avisos se reanudarán automáticamente cuando te acerques al siguiente cruce o punto de interés, pero la señal de audio no. Selecciona el botón \"Reactivar señal\" en la pantalla de inicio para reanudar la audición de la señal.\n2. Detener los avisos automáticos: Cuando no estés viajando o hayas llegado a un destino, probablemente no necesitarás que Soundscape siga avisándote de las cosas que te rodean. En lugar de salir de la aplicación, puedes poner Soundscape en el modo de aplazamiento y se reactivará de nuevo cuando salgas, o puedes poner Soundscape en el modo de reposo y permanecerá desactivado hasta que lo reactives. Alternativamente, puedes seleccionar \"Ajustes\" en el menú y elegir desactivar todos los avisos en la sección \"Administrar Avisos\".\n3. Detener la señal: Hay varios escenarios para los que podrías establecer un destino, pero no necesitar la señal audible activada. Por ejemplo, puede que sepas exactamente cómo llegar a tu destino, pero solo quieras recibir actualizaciones automáticas sobre la distancia. O puede que sepas más o menos cómo llegar a tu destino, y sólo necesites la señal de audio cuando casi hayas llegado. En cualquier caso, puedes elegir cuándo oír la señal alternando el botón \"Silenciar señal\"/\"Reactivar señal\" en la pantalla de inicio."; +"faq.controlling_what_you_hear.answer" = "Soundscape ofrece varias maneras de controlar lo que se oye y cuándo:\n\n1. Detener inmediatamente todo el audio: pulsa dos veces en la pantalla con dos dedos para desactivar inmediatamente todo el audio, incluido cualquier aviso que se esté reproduciendo y la señal si está activada. Los avisos se reanudarán automáticamente al aproximarse al siguiente cruce o punto de interés, pero la señal de audio no. Selecciona el botón \"Reactivar señal\" en la pantalla principal para volver a oír la señal.\n2. Detener los avisos automáticos: cuando no estés viajando o hayas llegado a un destino, probablemente no necesitarás que Soundscape siga notificándote elementos de tu entorno. En lugar de salir de la aplicación, puedes poner Soundscape en el modo de aplazamiento y se reactivará cuando salgas o bien, puedes poner Soundscape en el modo de suspensión y permanecerá desactivado hasta que lo reactives. Alternativamente, puedes seleccionar \"Ajustes\" en el menú y desactivar todos los avisos en la sección \"Administrar avisos\".\n3. Detener la señal: hay varios escenarios para los que podrías establecer un destino, pero no necesitar la señal audible activada. Por ejemplo, puede que sepas exactamente cómo llegar a tu destino, pero solo desees obtener actualizaciones automáticas sobre la distancia. O puede que sepas más o menos cómo llegar a tu destino, y sólo necesites la señal de audio cuando casi hayas llegado. En cualquier caso, puedes elegir cuándo oír la señal alternando el botón \"Silenciar señal\"/\"Reactivar señal\" en la pantalla principal."; /* */ @@ -4334,7 +4334,7 @@ /* */ -"faq.holding_phone_flat.answer" = "¡No, no! Mientras caminas puedes guardar el teléfono en una bolsa o bolsillo o donde sea conveniente. El paisaje sonoro usará la dirección que estás caminando para averiguar qué avisos anunciar a tu izquierda y a tu derecha. Cuando dejas de moverte, Soundscape no sabe hacia qué dirección te diriges. Si la señal de audio está activada, notarás que se calla hasta que comiences a moverte de nuevo. Puedes sacar el teléfono para tocar los botones \"Escuchar mi entorno\" en la parte inferior de la pantalla de inicio en cualquier momento, pero asegúrate de sujetarlo con la parte superior apuntando hacia la dirección en la que estás mirando y con la pantalla hacia el cielo. En esta posición \"plana\", Soundscape utilizará la brújula del teléfono para determinar hacia qué dirección te estás mirando y proporcionar avisos espaciales precisos. Si la señal está activada, también te darás cuenta de que vuelve a todo su volumen."; +"faq.holding_phone_flat.answer" = "¡No, no! Cuando camines, puedes meter el teléfono en una bolsa o bolsillo o donde sea conveniente. Soundscape usará la dirección hacia la que caminas para averiguar qué avisos emitirá a tu izquierda y a tu derecha. Cuando dejes de moverte, Soundscape no sabrá hacia dónde estás orientado. Si la señal de audio está activada, observarás que se calla hasta que vuelvas a moverte. Puedes sacar el teléfono para presionar los botones \"Escuchar mi entorno\" en la parte inferior de la pantalla principal en cualquier momento, pero asegúrate de sujetarlo con la parte superior apuntando en la dirección en la que estás mirando y con la pantalla hacia arriba. En esta posición \"plana\", Soundscape usará la brújula del teléfono para determinar hacia qué dirección estás orientado y proporcionar avisos espaciales precisos. Si la señal está activada, también observarás que el volumen se restablece por completo."; /* */ @@ -4342,7 +4342,7 @@ /* */ -"faq.personalize_experience.answer" = "Soundscape te permite personalizar tres aspectos clave de los avisos que oyes mientras caminas:\n\n1. Voz: puedes elegir cuál de las voces disponibles en iOS quieres que use Soundscape , así como la velocidad a la que se pronuncian los mensajes. En el menú, selecciona \" Ajustes \" y, a continuación, en \" Ajustes Generales\", selecciona Voz para ajustar la velocidad de habla y la configuración de voz . Se pueden descargar voces adicionales, incluidas las voces de calidad mejorada, en la aplicación Ajustes de iOS en Ajustes > Accesibilidad > Contenido leído > Voces.\n2. Distancia métrica: Soundscape te permite escuchar todas las distancias en pies o metros. En el menú, selecciona \" Ajustes \" y, a continuación, en \" Ajustes Generales\", selecciona \"Idioma y región\". La sección Unidades de medida te permite alternar entre dos opciones: Imperial (pies) y Métrico (metros).\n3. Marcadores: puedes marcar tu mundo con cualquier cosa que te interese. Puedes marcar cosas que sean personales y relevantes para ti, como tu casa, tu oficina y tu supermercado preferido. Luego, Soundscape te indicará automáticamente los lugares marcados a medida que pases por ellos o te acerques a ellos, o también puedes usar el botón Marcadores cercanos en la parte inferior de la pantalla de inicio para oír un aviso espacial de los lugares marcados a tu alrededor. Estos marcadores seguirán siendo personales para ti y no estarán disponibles para nadie más.\n\nAdemás de lo anterior, las siguientes configuraciones de VoiceOver pueden influir en el comportamiento de Soundscape :\n\n1. Sugerencias de VoiceOver: cuando las sugerencias de VoiceOver están activadas, escucharás más información sobre todos los botones en la pantalla principal de Soundscape . Puedes activar las sugerencias de VoiceOver navegando a la aplicación Ajustes de iOS y yendo a Accesibilidad > VoiceOver > Verbosidad, y activando la configuración Leer indicaciones.\n2. Atenuación de audio: Soundscape está diseñado para funcionar con la atenuación de audio desactivada. Cuando la atenuación de audio está activada, los avisos automáticos pueden resultar difíciles de oír si se utiliza VoiceOver simultáneamente. Recomendamos desactivar la atenuación de audio para que sea más fácil oír todos los avisos automáticos que se producen mientras interactúas con el teléfono. La atenuación de audio se puede desactivar en la configuración de VoiceOver o a través del rotor de VoiceOver.\n3. Desbloqueo con Touch ID o Face ID: configurar el teléfono para que se desbloquee con Touch ID o Face ID hará que desbloquear el teléfono sea rápido y fácil y, a su vez, te permitirá acceder a los botones Mi ubicación , Alrededor de mí y Delante de mí lo más rápido posible cuando estés en movimiento. Configura el desbloqueo con Touch ID o Face ID en la aplicación Configuración de iOS ."; +"faq.personalize_experience.answer" = "Soundscape te permite personalizar tres aspectos clave de los avisos que oyes cuando caminas:\n\n1. Voz: puedes elegir la voz que quieres escuchar en Soundscape entre las voces disponibles en iOS, así como la velocidad de pronunciación de los avisos. En el menú, selecciona \"Ajustes\" y luego, en \"Ajustes generales\", selecciona \"Voz\" para ajustar la velocidad de habla y la voz. Se pueden descargar más voces, incluidas las voces de calidad mejorada, en los ajustes de iOS en Ajustes > Accesibilidad > Lectura y voz (Contenido leído) > Voces.\n2. Medida de la distancia: Soundscape te permite escuchar las distancias en pies o en metros. En el menú, selecciona \"Ajustes\" y después, en \"Ajustes generales\", selecciona \"Idioma y región\". La sección Unidades de medida te permite alternar entre Imperial (pies) y Métrica (metros).\n3. Marcadores: puedes marcar tu mundo con cualquier cosa que te interese. Puedes marcar cosas que sean personales y relevantes para ti, como tu casa, tu oficina y tu tienda de comestibles preferida. Luego, Soundscape te avisará automáticamente de los lugares marcados cuando pases a pie o te acerques a ellos. También puedes usar el botón \"Marcadores cercanos\" de la parte inferior de la pantalla de inicio para oír un aviso espacial de los lugares marcados a tu alrededor. Los marcadores seguirán siendo personales y nadie más podrá verlos.\n\nAdemás de estas posibilidades, los siguientes ajustes pueden influir en el comportamiento de Soundscape:\n\n1. Consejos de VoiceOver: cuando los consejos de VoiceOver estén activados, escucharás más información sobre todos los botones en la pantalla principal. Puedes activar los consejos de VoiceOver de la siguiente manera: ve a los ajustes de iOS, luego a Accesibilidad > VoiceOver > Verbosidad y, por último, activa las indicaciones.\n2. Atenuación de audio: Soundscape está diseñado para funcionar con la atenuación de audio desactivada. Cuando la atenuación de audio está activada, puede ser difícil oír los avisos automáticos si se usa VoiceOver a la vez. Recomendamos desactivar la atenuación de audio para que sea más fácil oír todos los avisos automáticos. La atenuación de audio se puede desactivar en los ajustes de VoiceOver o a través del rotor de VoiceOver.\n3. Touch ID o Face ID para desbloquear: si configuras tu teléfono para que se desbloquee por medio de Touch ID o Face ID, será más fácil y rápido desbloquearlo, y podrás obtener acceso más deprisa a los botones \"Mi ubicación\", \"Alrededor de mí\" y \"Delante de mí\" cuando camines. Configura el desbloqueo con Touch ID o Face ID en la aplicación de ajustes de iOS."; /* */ @@ -4354,35 +4354,35 @@ /* */ -"faq.tip.beacon_quiet" = "Si te metes el teléfono en el bolsillo y dejas de moverte, bajará el volumen del sonido de la señal porque Soundscape no sabrá hacia qué dirección estás orientado. Para solucionar esto, empieza a andar de nuevo o saca el teléfono y mantenlo en posición horizontal."; +"faq.tip.beacon_quiet" = "Si metes el teléfono en el bolsillo y dejas de moverte, bajará el volumen del sonido de la señal porque Soundscape no sabrá hacia dónde estás orientado. Para solucionar esto, empieza a andar de nuevo o saca el teléfono y mantenlo en posición horizontal."; /* */ -"faq.tip.setting_beacon_on_address" = "Puedes establecer una señal en cualquier dirección. En la pantalla de inicio, pulsa sobre la barra de búsqueda y escribe la dirección. Tras seleccionar la dirección en los resultados de la búsqueda, se mostrará una pantalla de \"Detalles de la ubicación\" con una opción para \"Iniciar señal de audio\" en la dirección. De este modo, puedes establecer una señal en negocios, lugares, puntos de interés y residencias que no estén en Open Street Map."; +"faq.tip.setting_beacon_on_address" = "Puedes establecer una señal en cualquier dirección. En la pantalla principal, pulsa en la barra de búsqueda y escribe la dirección. Tras seleccionar la dirección en los resultados de la búsqueda, aparecerá una pantalla \"Detalles de la ubicación\" con la opción para \"Iniciar señal de audio\" en la dirección. De esta manera, puedes establecer una señal en negocios, lugares, puntos de interés y residencias que no se incluyan en Open Street Map."; /* */ -"faq.tip.finding_bus_stops" = "Para encontrar paradas de autobuses cercanos, selecciona el filtro \"Transporte público\" en la lista Lugares cercanos."; +"faq.tip.finding_bus_stops" = "Para encontrar paradas de autobús cercanos, selecciona el filtro \"Transporte público\" en la lista Lugares cercanos."; /* */ -"faq.tip.turning_beacon_off" = "Puedes activar y desactivar el sonido rítmico de la señal con el botón de silencio de la pantalla de inicio. Si la señal está silenciada, seguirás recibiendo actualizaciones sobre la distancia a tu destino cada 50 metros aproximadamente."; +"faq.tip.turning_beacon_off" = "Puedes activar y desactivar el sonido rítmico de la señal con el botón de silencio en la pantalla principal. Si la señal está silenciada, seguirás recibiendo actualizaciones de la distancia a tu destino cada 50 metros aproximadamente."; /* */ -"faq.tip.turning_off_auto_callouts" = "Si quieres seguir interactuando con Soundscape pero no quieres oír los avisos automáticos, puedes desactivarlos yendo a la sección \"Administrar Avisos\" de la pantalla \"Ajustes\" del menú y desactivando \"Permitir Avisos\". O, si no vas a utilizar Soundscape, puedes ponerlo en modo de reposo o de aplazamiento utilizando el botón \"Suspender\" de la pantalla de inicio."; +"faq.tip.turning_off_auto_callouts" = "Si quieres seguir interactuando con Soundscape pero no deseas oír los avisos automáticos, para desactivar avisos, ve a la sección\"Administrar avisos\" de la pantalla \"Ajustes\" en el menú. O bien, si no vas a usar Soundscape, puedes ponerlo en el modo de suspensión o de aplazamiento con el botón \"Suspender\" en la pantalla principal."; /* */ -"faq.tip.hold_phone_flat" = "Soundscape funciona mejor cuando te mantienes el teléfono en posición horizontal con la pantalla hacia arriba y la parte superior del teléfono apuntando al lado contrario de ti."; +"faq.tip.hold_phone_flat" = "Soundscape funciona mejor cuando mantienes el teléfono en posición horizontal con la pantalla hacia arriba y la parte superior del teléfono apuntando al lado contrario de ti."; /* */ -"faq.tip.create_marker_at_bus_stop" = "Si hay una ruta de autobús que tomas regularmente, establece tus paradas de recogida y salida como Marcadores. De esta forma se guardarán para que puedas encontrarlas fácilmente, sólo tienes que ir a \"Marcadores y Rutas\" desde la pantalla de inicio y encontrarlas en la página \"Marcadores\". Puedes establecer una señal en ellos y recibirás actualizaciones periódicas sobre lo cerca que estás de tu parada de salida. Nota: puedes desactivar el sonido rítmico y seguirás recibiendo actualizaciones de la distancia a lo largo del camino."; +"faq.tip.create_marker_at_bus_stop" = "Si hay una ruta de autobús que tomas a menudo, establece tus paradas de recogida y salida como marcadores. De esta manera se guardarán para que puedas volver a encontrarlas fácilmente, sólo tienes que ir a \"Marcadores y rutas\" desde la pantalla principal y encontrarlas en la página \"Marcadores\". Puedes establecer una señal en ellas y recibirás actualizaciones periódicas sobre lo cerca que estás a la parada de salida. Nota: puedes desactivar el sonido rítmico y seguirás obteniendo actualizaciones de la distancia por el camino."; /* */ -"faq.tip.two_finger_double_tap" = "Para silenciar los avisos activos, pulsa la pantalla dos veces con dos dedos."; +"faq.tip.two_finger_double_tap" = "Para silenciar los avisos activos, pulsa en la pantalla dos veces con dos dedos."; @@ -4392,7 +4392,7 @@ "mail.msoutlook" = "Microsoft Outlook"; "mail.default" = "Por defecto"; "mail.fastmail" = "Fastmail"; -"mail.yahoo" = "Correo Yahoo"; +"mail.yahoo" = "Yahoo Mail"; "mail.protonmail" = "Proton Mail"; "mail.spark" = "Spark"; "filter.parks" = "Parques"; @@ -4416,42 +4416,48 @@ "osm.tag.green_space" = "zona verde"; "osm.tag.recreation_area" = "área recreativa"; "whats_new.1_2_0.0.title" = "Agitar para repetir el último aviso"; -"whats_new.1_2_0.1.title" = "Configuración de la distancia de silenciar la señal"; +"whats_new.1_2_0.1.title" = "Configuración de la distancia de silencio de la señal"; "whats_new.1_2_0.2.title" = "Categorías en lugares cercanos"; -"whats_new.1_2_0.2.description" = "Ahora puedes filtrar la lista de lugares cercanos por categorías como transporte público, comida y bebida, etc."; +"whats_new.1_2_0.2.description" = "Ahora puedes filtrar la lista de lugares cercanos por categorías como Transporte público, Comida y bebida, etc."; "osm.tag.bar" = "Bar"; "osm.tag.fast_food" = "Comida rápida"; "osm.tag.ice_cream" = "Heladería"; -"whats_new.1_2_0.0.description" = "Ahora puedes agitar tu dispositivo para repetir el último aviso. Para habilitar esta función, activa el botón 'Repetir Avisos' en los ajustes."; -"whats_new.1_2_0.1.description" = "Ahora puedes ajustar la distancia a la que la señal se silencia automáticamente cuando te acercas. Puedes ajustar esta opción en la configuración de la señal de audio.\n\nNos gustaría conocer tu experiencia con la desactivación de la señal de audio a diferentes distancias (0,5 y 10 metros). En nuestras pruebas internas estamos observando algunas incoherencias en el comportamiento y nos gustaría conocer la opinión de una base más amplia de usuarios."; +"whats_new.1_2_0.0.description" = "Ahora puedes agitar tu dispositivo para repetir el último aviso. Para habilitar esta función, activa el botón \"Repetir avisos\" en los ajustes."; +"whats_new.1_2_0.1.description" = "Ahora puedes ajustar la distancia a la que la señal se silencia automáticamente cuando te acercas. Simplemente ve a la configuración de la señal de audio y mueve el control deslizante \"Distancia de silenciar el audio\"."; "donation.body" = "Por favor, apoya el desarrollo continuo de la aplicación Soundscape Community donando en nuestra página de recaudación de fondos. Cada donación nos acerca un paso más a nuestra visión de ayudar a crear un mundo donde TODOS tengan el mismo acceso a la información sobre su entorno a través de nuestra tecnología que mejora la vida."; "menu.donate" = "Donar"; "donation.title" = "Donar a Soundscape Community"; -"donation.link" = "Ir a la Página de Recaudación de Fondos"; -"devices.connect_headset.completed.boseframes" = "¡Enhorabuena! Tus Bose Frames están listas para usar, ¡así que puedes guardar tu teléfono en el bolsillo y ponerte en marcha! Soundscape seguirá ahora la orientación de tu cabeza para que no tengas que sostener el teléfono en la mano."; +"donation.link" = "Ir a la página de recaudación de fondos"; +"devices.connect_headset.completed.boseframes" = "¡Enhorabuena! Tus Bose Frames están listas para usar. ¡Guarda el teléfono en el bolsillo y empieza a moverte! Soundscape seguirá ahora la orientación de tu cabeza para que no tengas que llevar el teléfono en la mano."; "devices.callouts.check_audio.bose_frames" = "Bose Frames conectadas."; "devices.callouts.check_audio.bose_frames.disconnected" = "Soundscape está buscando tus Bose Frames. Asegúrate de que están conectadas al teléfono."; -"devices.explain_ar.connected.boseframes" = "Tus Bose Frames están listas para usar, ¡así que puedes guardar tu teléfono en el bolsillo y ponerte en marcha! Soundscape está siguiendo la orientación de tu cabeza para que no tengas que sostener el teléfono en la mano."; +"devices.explain_ar.connected.boseframes" = "Tus Bose Frames están listas para usar. ¡Guarda el teléfono en el bolsillo y empieza a moverte! Soundscape está siguiendo la orientación de tu cabeza para que no tengas que llevar el teléfono en la mano."; "help.using_headsets.bose_frames.title" = "Uso de Bose Frames"; "help.using_headsets.bose_frames.when" = "Puedes usar Bose Frames en cualquier momento con Soundscape. El uso de Bose Frames te proporciona un audio de alta calidad que no dificulta la audición ambiental y te permite tener una experiencia mayor de manos libres."; -"help.using_headsets.bose_frames.how.3" = "Uso de los controles multimedia en los auriculares:
cuando los controles multimedia estén activados en la configuración de Soundscape, podrás usarlos en las Bose Frames para silenciar o reactivar la señal, avisar de tu ubicación o repetir el último aviso de llamada. Para obtener más información, ve la sección de ayuda \"Uso de controles multimedia\"."; +"help.using_headsets.bose_frames.how.3" = "Uso de los controles multimedia en los auriculares:
cuando los controles multimedia estén habilitados en la configuración de Soundscape, podrás usarlos en las Bose Frames para silenciar o reactivar la señal, avisar de tu ubicación o repetir el último aviso de llamada. Para obtener más información, ve la sección de ayuda \"Uso de controles multimedia\"."; "help.using_headsets.bose_frames.how.1" = "Conexión de un dispositivo:
ve a la opción \"Auriculares con seguimiento de cabeza\" en el menú de Soundscape para conectar las Bose Frames y sigue las instrucciones que aparecen en pantalla. Ten en cuenta que tendrás que emparejar las Bose Frames en los ajustes de Bluetooth del teléfono antes de conectarlas a Soundscape."; -"help.using_headsets.bose_frames.how.4" = "Solución de problemas de los auriculares:
Si tienes problemas para conectar las Bose Frames a Soundscape, asegúrate de que son de uno de los modelos compatibles: Altos o Rondos. Si son uno de estos modelos, asegúrate de que las Frames aparecen en la aplicación de Bose Connect. Si se muestran y sigues teniendo problemas con la conexión, intenta desemparejar y volver a emparejar los auriculares a través del menú Bluetooth del teléfono.
La compatibilidad con las Bose Frames es nueva y nos encantaría escuchar tus comentarios. Puedes contactarnos eligiendo la opción \"Enviar comentarios\" en el menú."; -"help.using_headsets.bose_frames.how.2" = "Calibración de los auriculares:
tus Bose Frames tendrán que calibrarse para saber con precisión frente a que dirección te encuentras. cada vez que las conectes a Soundscape, se te informará que se las necesitan calibrar mediante un timbre de audio. Para calibrar las Bose Frames, sigue las instrucciones que aparecen en la pantalla. Cuando el timbre deje de sonar, las Bose Frames estarán calibradas. Soundscape seguirá ahora la dirección de tu cabeza para que no tengas que llevar el teléfono en la mano. También puedes repetir esta calibración, en cualquier momento, incluso si no está sonando el timbre, si crees que la precisión del audio espacial no es buena."; -"help.using_headsets.bose_frames.what" = "Soundscape admite audio espacial con seguimiento dinámico de la cabeza cuando se utilizan las versiones Alto o Rondo de Bose Frames. Cuando se conecten, los sensores de las Bose Frames indican a Soundscape la dirección frente a la cual te encuentras. Esto ayuda a Soundscape a mejorar tu experiencia de audio haciendo que sea más natural a medida que te mueves por el mundo. Cuando uses Soundscape con las Bose Frames conectadas, no es necesario sostener el teléfono para que Soundscape funcione bien."; +"help.using_headsets.bose_frames.how.4" = "Solución de problemas de los auriculares:
si tienes problemas para conectar las Bose Frames a Soundscape, asegúrate de que son de uno de los modelos compatibles: Altos o Rondos. Si son uno de estos modelos, asegúrate de que las Frames aparecen en la aplicación Bose Connect. Si se muestran y sigues teniendo problemas con la conexión, intenta desemparejar y volver a emparejar los auriculares a través del menú Bluetooth del teléfono.
Nos encantaría escuchar tus comentarios sobre la compatibilidad con las Bose Frames. Puedes contactarnos eligiendo la opción \"Enviar comentarios\" en el menú."; +"help.using_headsets.bose_frames.how.2" = "Calibración de los auriculares:
tus Bose Frames tendrán que calibrarse para saber con precisión hacia dónde estás mirando. cada vez que las conectes a Soundscape, se te informará que se las necesitan calibrar mediante un timbre de audio. Para calibrar las Bose Frames, sigue las instrucciones que aparecen en la pantalla. Cuando el timbre deje de sonar, las Bose Frames estarán calibradas. Soundscape seguirá ahora la dirección de tu cabeza para que no tengas que llevar el teléfono en la mano. Puedes repetir esta calibración en cualquier momento, incluso si no está sonando el timbre, si crees que la precisión del audio espacial no es buena."; +"help.using_headsets.bose_frames.what" = "Soundscape admite audio espacial con seguimiento de cabeza al usar las versiones Alto o Rondo de Bose Frames. Cuando se conecten, los sensores de las Bose Frames le indicarán a Soundscape la dirección en la que está orientada tu cabeza. Esto le ayuda a Soundscape a mejorar tu experiencia de audio, haciéndola más natural a medida que te mueves por el mundo. Cuando usas Soundscape con las Bose Frames conectadas, no es necesario sostener el teléfono para que la aplicación funcione bien."; "whats_new.1_3_0.0.title" = "Compatibilidad con Bose Frames"; -"whats_new.1_3_0.0.description" = "Ahora Soundscape admite audio espacial con seguimiento dinámico de la cabeza cuando se utilizan las versiones Alto o Rondo de Bose Frames. Cuando se conecten, los sensores de las Bose Frames indican a Soundscape la dirección frente a la cual te encuentras. Esto ayuda a Soundscape a mejorar tu experiencia de audio haciendo que sea más natural a medida que te mueves por el mundo. Cuando uses Soundscape con los Bose Frames conectadas, no es necesario sostener el teléfono para que Soundscape funcione bien. Para empezar, ve a la opción \"Auriculares con seguimiento de cabeza\" en el menú de Soundscape para conectar las Bose Frames y sigue las instrucciones que aparecen en pantalla. Ten en cuenta que tendrás que emparejar las Bose Frames en los ajustes de Bluetooth del teléfono antes de conectarlas a Soundscape."; -"whats_new.1_3_0.1.description" = "Si vives en las áreas de Austin o San Antonio en Texas y deseas ayudarnos a probar una función en la que estamos trabajando con NaviLens, comuníquate con nosotros a través del botón Enviar comentarios del menú principal."; +"whats_new.1_3_0.0.description" = "Ahora Soundscape admite seguimiento de cabeza con las versiones Alto o Rondo de Bose Frames. Cuando se conecten, tus Bose Frames indicarán a Soundscape hacia dónde estás mirando, lo que ayudará a Soundscape a mejorar tu experiencia de audio. Para conectar tus Bose Frames a Soundscape, ve a la opción \"Auriculares con seguimiento de cabeza\" en el menú de Soundscape."; +"whats_new.1_3_0.1.description" = "Si vives en las áreas de Austin o San Antonio en Texas y deseas ayudarnos a probar una función en la que estamos trabajando con NaviLens, comuníquate con nosotros a través del botón \"Enviar comentarios\" del menú."; "whats_new.1_3_0.1.title" = "Prueba en Texas"; -"location_detail.action.navilens.hint" = "Pulsa dos veces para iniciar NaviLens."; -"navilens.title" = "Iniciar NaviLens"; +"beacon.action.navilens" = "Iniciar NaviLens"; "troubleshooting.tile_server_url" = "URL del servidor de teselas"; -"troubleshooting.tile_server_url.explanation" = "Este es el servidor desde el que Soundscape obtiene los datos de mapas. Normalmente no debes cambiar este a menos que estés desarrollando o probando Soundscape."; -"route_detail.action.start_reversed_route.hint" = "Pulsa dos veces para iniciar esta ruta de regreso."; -"route_detail.reverse.error.title" = "Falla de ruta de regreso"; -"route_detail.action.start_reversed_route.disabled.hint" = "Añade puntos antes de iniciar la ruta de regreso."; +"troubleshooting.tile_server_url.explanation" = "Este es el servidor del que Soundscape obtiene los datos de mapas. Normalmente no debes cambiar este a menos que estés desarrollando o probando Soundscape."; +"route_detail.action.start_reversed_route.hint" = "Pulsa dos veces para iniciar esta ruta de regreso"; +"route_detail.reverse.error.title" = "Error al invertir la ruta"; +"route_detail.action.start_reversed_route.disabled.hint" = "Agregar puntos antes de iniciar la ruta de regreso"; "route_detail.reverse.error.message" = "Se ha producido un error al intentar invertir la ruta. Inténtalo de nuevo."; "routes.reverse_name_format" = "%@ de regreso"; "route_detail.action.start_reversed_route" = "Iniciar ruta de regreso"; -"faq.tip.reverse_route" = "Cuando seleccionas \"Iniciar ruta de regreso\" en la pantalla \"Detalles de la ruta\", será más fácil tomar una ruta de regreso, y se guardará una copia de la ruta con los puntos en orden de regreso. Ten en cuenta que \"Iniciar ruta de regreso\" no guardará otra copia de la ruta ya guardada."; -"help.text.routes.content.how.1a" = "Seguimiento de una ruta:
selecciona tu ruta en la página \"Marcadores y Rutas\" y, a continuación, \"Iniciar Ruta\". Volverás a la pantalla de inicio y Soundscape establecerá una señal en el primer punto de ruta. A medida que vas por la ruta, la señal avanzará al siguiente punto hasta completar la ruta. Si en cualquier momento deseas saltar hacia delante o hacia atrás un punto de ruta, pulsa en \"Siguiente punto de ruta\" o \"Punto de ruta anterior."; +"faq.tip.reverse_route" = "Cuando selecciones \"Iniciar ruta de regreso\" en la pantalla \"Detalles de la ruta\", será más fácil tomar una ruta de regreso, y se guardará una copia de la ruta con los puntos en orden inverso. Ten en cuenta que \"Iniciar ruta de regreso\" no guardará otra copia de la ruta ya guardada."; +"help.text.routes.content.how.1a" = "Seguimiento de una ruta:
selecciona tu ruta en la página \"Marcadores y rutas\" y, a continuación, \"Iniciar ruta\". Volverás a la pantalla de inicio y Soundscape establecerá una señal en el primer punto de ruta. A medida que vayas por la ruta, la señal avanzará al siguiente punto hasta completar la ruta. Si en cualquier momento deseas saltar hacia delante o hacia atrás un punto de ruta, pulsa en \"Siguiente punto de ruta\" o \"Punto de ruta anterior\"."; +"location_detail.action.beacon_or_navilens.hint" = "Pulsa dos veces para iniciar NaviLens o establecer una señal de audio según qué tan cerca esté esta ubicación"; +"beacon.suggest_navilens" = "Usa el botón NaviLens para llegar a tu destino."; +"location_detail.action.beacon_or_navilens" = "Iniciar NaviLens o señal de audio"; +"filter.navilens" = "Códigos NaviLens"; +"troubleshooting.user_data" = "Datos de usuario"; +"troubleshooting.user_data.button" = "Eliminar todos los marcadores y rutas"; +"troubleshooting.user_data.explanation" = "Borra todos los datos de mapas, incluidos los marcadores y rutas guardados. Esta acción no se puede deshacer."; diff --git a/apps/ios/GuideDogs/Assets/Localization/fa-IR.lproj/InfoPlist.strings b/apps/ios/GuideDogs/Assets/Localization/fa-IR.lproj/InfoPlist.strings new file mode 100644 index 000000000..2789a8b00 --- /dev/null +++ b/apps/ios/GuideDogs/Assets/Localization/fa-IR.lproj/InfoPlist.strings @@ -0,0 +1,30 @@ +/* + InfoPlist.strings + GuideDogs + + Copyright (c) Microsoft Corporation. + Licensed under the MIT License. +*/ + +/* A message that tells the user why the app is requesting the ability to connect to Bluetooth peripherals. {NumberedPlaceholder="Soundscape"} */ +"NSBluetoothPeripheralUsageDescription" = "Soundscape uses Bluetooth LE to connect to accessories."; + +/* A message that tells the user why the app is requesting the ability to connect to Bluetooth peripherals. This + Permission is new to iOS 13. + {NumberedPlaceholder="Soundscape"} */ +"NSBluetoothAlwaysUsageDescription" = "Soundscape uses Bluetooth LE to connect to accessories."; + +/* A message that tells the user why the app is requesting access to the user’s location information at all times. {NumberedPlaceholder="Soundscape"} */ +"NSLocationAlwaysUsageDescription" = "Soundscape uses your location to provide you with relevant information about your surroundings."; + +/* A message that tells the user why the app is requesting access to the user's location at all times in iOS versions earlier than iOS 10.0. {NumberedPlaceholder="Soundscape"} */ +"NSLocationAlwaysAndWhenInUseUsageDescription" = "Soundscape uses your location to provide you with relevant information about your surroundings."; + +/* A message that tells the user why the app is requesting access to the user’s location information while running in the foreground. {NumberedPlaceholder="Soundscape"} */ +"NSLocationWhenInUseUsageDescription" = "Soundscape uses your location to provide you with relevant information about your surroundings."; + +/* A message that tells the user why the app is requesting access to the device’s accelerometer. {NumberedPlaceholder="Soundscape"} */ +"NSMotionUsageDescription" = "Soundscape uses motion detection to personalize automatic callouts."; + +/* A message that tells the user why the app is requesting access to the user’s photo library. {NumberedPlaceholder="Soundscape"} */ +"NSPhotoLibraryUsageDescription" = "Soundscape uses the photo library for attaching photos to feedback."; diff --git a/apps/ios/GuideDogs/Assets/Localization/fa-IR.lproj/Localizable.strings b/apps/ios/GuideDogs/Assets/Localization/fa-IR.lproj/Localizable.strings new file mode 100644 index 000000000..e10139546 --- /dev/null +++ b/apps/ios/GuideDogs/Assets/Localization/fa-IR.lproj/Localizable.strings @@ -0,0 +1,2490 @@ +//------------------------------------------------------------------------------ +// MARK: General +//------------------------------------------------------------------------------ +/* Title for an affirmative alert button */ +"general.alert.yes" = "بله"; +/* Title for a negative alert button */ +"general.alert.no" = "خیر"; +/* Title for button to dismiss alert */ +"general.alert.dismiss" = "بستن"; +/* Title for a button that allows a user to skip a step */ +"general.alert.skip" = "رد کردن"; +/* Title for button to cancel alert */ +"general.alert.cancel" = "لغو"; +/* Title for button to dismiss alert */ +"general.alert.not_now" = "الآن نه"; +/* Title for button to disconnect a device */ +"general.alert.disconnect" = "قطع اتصال"; +/* Title for button to forget a device */ +"general.alert.forget" = "فراموش کردن"; +/* Alert button title for done */ +"general.alert.done" = "انجام شد"; +/* Alert button title to exit a screen */ +"general.alert.exit" = "خروج"; +/* Alert button title to delete an object */ +"general.alert.delete" = "حذف"; +/* Alert button title to reset the state of an experience back to it's original state */ +"general.alert.reset" = "بازنشانی"; +/* Alert button title to remove an object */ +"general.alert.remove" = "برداشتن"; +/* Alert button title to resume an activity */ +"general.alert.resume" = "ادامه"; +/* Alert button title to keep an object */ +"general.alert.keep" = "نگه داشتن"; +/* Alert button title to edit an object */ +"general.alert.edit" = "ویرایش"; +/* Alert button title to add an object */ +"general.alert.add" = "افزودن"; +/* Alert button title to download an object */ +"general.alert.download" = "دانلود"; +/* Alert button title to show more details of an object */ +"general.alert.details" = "جزئیات"; +/* Alert button title to move to next object */ +"general.alert.next" = "بعدی"; +/* Alert button title for actions where the user is prompted if they would like to continue with the current action (as opposed to cancelling the current action) */ +"general.alert.continue" = "ادامه دادن"; +/* Alert button title to stop an action (such as a download) */ +"general.alert.stop" = "توقف"; +/* Button title to close a modal UI */ +"general.alert.close" = "بستن"; +/* Alert button title to choose an action */ +"general.alert.choose_an_action" = "انتخاب یک عمل"; +/* Alert title to choose another application */ +"general.alert.choose_an_app" = "انتخاب یک برنامه"; +/* Alert for a destructive action */ +"general.alert.destructive_undone_message" = "این عمل قابل بازگشت نیست"; +/* Alert button title to open the settings */ +"general.alert.open_settings" = "باز کردن تنظیمات"; +/* Alert button title to open an item */ +"general.alert.open" = "باز کردن"; +/* Alert button title to replace an item */ +"general.alert.replace" = "جایگزین کردن"; +/* Alert title for alerts that ask users to confirm a choice they made */ +"general.alert.confirmation_title" = "آیا مطمئن هستید؟"; +/* Alert action to discard changes */ +"general.alert.discard" = "نادیده گرفتن تغییرات"; +/* Clear text from a text field */ +"general.text.clear_text" = "پاک کردن متن"; +/* Clear text from a text field */ +"general.text.clear" = "پاک کردن"; +/* Text displayed when information loading is almost ready */ +"general.loading.almost_ready" = "تقریباً آماده است…"; +/* Text displayed when information is loading */ +"general.loading.loading" = "در حال بارگذاری…"; +/* Text displayed when information is loading */ +"general.loading.no_punctuation" = "در حال بارگذاری"; +/* A percentage, %@ is a number, %% represents the percentage symbol "%". "4.2%" */ +"general.percentage" = "%@%%"; +/* A percentage, %@ is a number, %% represents the percentage symbol "%". "40% Complete" */ +"general.percentage.complete" = "%@%% تکمیل شده"; +/* Title for the default offline alert */ +"general.alert.offline_default.title" = "حالت آفلاین"; +/* Message for the default offline alert */ +"general.alert.offline_default.message" = "Soundscape در حالت آفلاین کار می‌کند. با این وجود، Soundscape به کار خود ادامه می‌دهد، اما برخی از عملکردها ممکن است محدود باشند."; +/* Title for the offline alert when searching */ +"general.alert.offline_search.title" = "جستجو در دسترس نیست"; +/* Message for the offline alert when searching */ +"general.alert.offline_search.message" = "وقتی Soundscape در حالت آفلاین کار می‌کند، جستجو غیرفعال است. برای بازگشت به صفحه قبل، این پیام را ببندید."; +/* Offline alert, Learn more */ +"general.alert.offline.learn_more" = "بیشتر بدانید"; +/* Message for a generic error message displayed to the user */ +"general.alert.error.message" = "لطفاً بعداً دوباره امتحان کنید."; +/* Text displayed while we are doing work to start an experience */ +"general.loading.start" = "در حال آماده‌سازی…"; +/* Text displayed while we are doing work to end an experience */ +"general.loading.end" = "در حال پاک‌سازی…"; +/* VoiceOver label for a button that mutes the audio when it is tapped */ +"general.mute" = "بی‌صدا"; +/* Title for a slider that controls the volume level */ +"general.volume" = "صدا"; +/* This is a voiceover label for a custom tab view control (tabs at the bottom of the screen that allow the user to switch between views - for an example of this, see iOS's Phone app). "Tab" should be translated in the same way that it is translated when using VoiceOver on the tabs in the iOS Phone app. %1$@ is the name of the tab (for instance, on the Markers and Routes screen, this will be either "Markers" or "Routes"). %2$@ is the index of the tab and %3$@ is the total number of the tabs (an example of this final part would be "1 of 2" or "2 of 2". {NumberedPlaceholder="%1$@","%2$@","%3$@"} */ +"general.tabs" = "%1$@، زبانه، %2$@ از %3$@"; +/* The title for an alert displayed which will link to a user survey */ +"general.alert.survey.title" = "خوشحال می‌شویم نظر شما را بدانیم!"; +/* The message for an alert displayed which will link to a user survey */ +"general.alert.survey.message" = "آیا برای تکمیل یک نظرسنجی ۵ دقیقه‌ای وقت دارید؟"; +/* A string that is surrounded by quotation marks. Should be translated to the appropriate punctuation marks for each locale, i.e., " " for English, « » for Russian, etc. {NumberedPlaceholder="%@"} */ +"general.text.string_with_quotation_marks" = "«%@»"; +/* Play audio */ +"general.play" = "پخش"; +/* Stop playing audio */ +"general.stop" = "توقف"; +/* Indicates that an item is being downloaded */ +"general.downloading" = "در حال دانلود"; +/* Button title to open an app */ +"general.app_open" = "باز کردن برنامه"; +/* Button title to download an app */ +"general.app_download" = "دانلود برنامه"; +//------------------------------------------------------------------------------ +// MARK: - Errors +//------------------------------------------------------------------------------ +/* Generic error message */ +"general.error.error_occurred" = "خطا رخ داد"; +//------------------------------------------------------------------------------ +// MARK: Errors (Location) +//------------------------------------------------------------------------------ +/* Error message to turn on device location services. "Location Services" is an iOS term that can be found in the Privacy section in the iPhone Settings app. {NumberedPlaceholder="Soundscape"} */ +"general.error.location_services" = "برای استفاده از Soundscape، خدمات موقعیت مکانی را روشن کنید"; +/* Error message to turn on device precise location services. Ensure "Precise Location" is translated the same as in the iOS Settings app under Maps > Location > Precise Location (this refers to an Apple feature called "Precise Location" in US English). {NumberedPlaceholder="Soundscape"} */ +"general.error.precise_location" = "برای استفاده از Soundscape، موقعیت مکانی دقیق را روشن کنید"; +/* Error message to authorize location services. "Location Services" is an iOS term that can be found in the Privacy section in the iPhone Settings app. */ +"general.error.location_services.authorize.title" = "اجازه دسترسی به خدمات موقعیت مکانی"; +/* Error message to authorize location services. "Location Services" is an iOS term that can be found in the Privacy section in the iPhone Settings app. {NumberedPlaceholder="Soundscape"} */ +"general.error.location_services.authorize.description" = "Soundscape از موقعیت مکانی شما برای پیدا کردن و اطلاع‌رسانی درباره مکان‌ها و اشیاء اطرافتان استفاده می‌کند. این برنامه برای استفاده از خدمات موقعیت مکانی به اجازه شما نیاز دارد."; +/* Error message to authorize location services. Quotes written as " Keep newlines (\n) between sentences.. {NumberedPlaceholder="\n"} */ +"general.error.location_services.authorize.instructions" = "۱. برنامه تنظیمات را در زیر باز کنید\n۲. «موقعیت مکانی» را انتخاب کنید\n۳. «همیشه» یا «هنگام استفاده از برنامه» را انتخاب کنید"; +/* Error message to turn on precise location. Ensure "Precise Location" is translated the same as in the iOS Settings app under Maps > Location > Precise Location (this refers to an Apple feature called "Precise Location" in US English). Quotes written as ". Keep newlines (\n) between sentences. {NumberedPlaceholder="\n"} */ +"general.error.location_services.precise_location.instructions" = "۱. برنامه تنظیمات را در زیر باز کنید\n۲. «موقعیت مکانی» را انتخاب کنید\n۳. «موقعیت مکانی دقیق» را روشن کنید"; +/* Error message to open Soundscape to resume setting location services. "Location Services" is an iOS term that can be found in the Privacy section in the iPhone Settings app. {NumberedPlaceholder="Soundscape"} */ +"general.error.location_services_resume" = "برای ادامه تنظیمات خدمات موقعیت مکانی، Soundscape را باز کنید"; +/* Error message to enable device location services. "Location Services" is an iOS term that can be found in the Privacy section in the iPhone Settings app. */ +"general.error.location_services_enable" = "فعال کردن خدمات موقعیت مکانی"; +/* Error message to enable location services. "Location Services" is an iOS term that can be found in the Privacy section in the iPhone Settings app. {NumberedPlaceholder="Soundscape"} */ +"general.error.location_services_enable_description" = "خدمات موقعیت مکانی در حال حاضر غیرفعال است. Soundscape نمی‌تواند وقتی خدمات موقعیت مکانی خاموش است کار کند."; +/* Error message to turn on location services in Soundscape to continue with instructions on how to do so on device. Keep newlines (\n) between sentences. "Location Services" is an iOS term that can be found in the Privacy section in the iPhone Settings app. {NumberedPlaceholder="\n"} */ +"general.error.location_services_enable_instructions.2" = "برای ادامه، خدمات موقعیت مکانی را در برنامه تنظیمات روشن کنید.\n\n۱. دکمه بازگشت (با عنوان تنظیمات) را فشار دهید\n۲. حریم خصوصی و امنیت را انتخاب کنید\n۳. خدمات موقعیت مکانی را انتخاب کنید\n۴. خدمات موقعیت مکانی را روشن کنید"; +/* Error message to turn on location services in Soundscape to continue with instructions on how to do so on device. Keep newlines (\n) between sentences. "Location Services" is an iOS term that can be found in the Privacy section in the iPhone Settings app. {NumberedPlaceholder="\n"} */ +"general.error.location_services_enable_instructions.3" = "برای ادامه، خدمات موقعیت مکانی را در برنامه تنظیمات روشن کنید.\n\n۱. باز کردن تنظیمات را فشار دهید\n۲. دکمه بازگشت (با عنوان تنظیمات) را فشار دهید\n۳. حریم خصوصی و امنیت را انتخاب کنید\n۴. خدمات موقعیت مکانی را انتخاب کنید\n۵. خدمات موقعیت مکانی را روشن کنید"; +/* Error message Sounscape is haveing trouble determining current location */ +"general.error.location_services_find_location_error" = "ما در پیدا کردن موقعیت مکانی فعلی شما با مشکل مواجه هستیم."; +/* Error message when Soundscape does not know the user's heading */ +"general.error.heading" = "Soundscape مطمئن نیست که به کدام جهت رو کرده‌اید. لطفاً گوشی خود را صاف نگه دارید یا شروع به راه رفتن کنید و دوباره امتحان کنید."; +/* Error message Soundscape is having trouble determining current location. Try again later */ +"general.error.location_services_find_location_error.try_again" = "ما در پیدا کردن موقعیت مکانی فعلی شما با مشکل مواجه هستیم. لطفاً بعداً دوباره امتحان کنید."; +//------------------------------------------------------------------------------ +// MARK: Errors (Network) +//------------------------------------------------------------------------------ +/* Error message that you are not connected to Wi-Fi Oops - a playful informal synonym for uh oh, my bad, an error etc. */ +"general.error.wifi" = "اوه! به نظر می‌رسد به وای-فای متصل نیستید."; +/* Error message that you will need to connect to Wi-Fi in order to download */ +"general.error.wifi.info" = "برای دانلود به اتصال وای-فای نیاز دارید."; +/* Error message that the internet is not connected. */ +"general.error.network_connection_required" = "اتصال به شبکه مورد نیاز است"; +/* Error message that the internet is not connected. {NumberedPlaceholder="Soundscape"} */ +"general.error.network_connection_required.deleting_data" = "هنگام حذف و بارگذاری مجدد داده‌های نقشه Soundscape، اتصال به شبکه مورد نیاز است. بررسی کنید که گوشی شما در حالت پرواز نباشد."; +//------------------------------------------------------------------------------ +// MARK: Errors (BLE) +//------------------------------------------------------------------------------ +/* Error message title to authorized Bluetooth setting by the user */ +"general.error.ble.unauthorized.title" = "اجازه دسترسی به بلوتوث"; +/* Error message description to authorized Bluetooth setting by the user */ +"general.error.ble.unauthorized.message" = "برای اتصال دستگاه‌هایتان، اجازه دسترسی به بلوتوث لازم است. برای فعال کردن بلوتوث، برنامه تنظیمات را در زیر باز کنید. توجه داشته باشید که این کار ممکن است باعث راه‌اندازی مجدد برنامه شود."; +//------------------------------------------------------------------------------ +// MARK: Errors (Other) +//------------------------------------------------------------------------------ +/* Error message that Soundscape is having trouble adding a marker to this location. Try again later */ +"general.error.add_marker_error" = "ما در نشانه‌گذاری این مکان با مشکل مواجه هستیم. لطفاً بعداً دوباره امتحان کنید."; +/* Error message that Soundscape is having trouble setting a beacon. Try again later */ +"general.error.set_beacon_error" = "در حال حاضر برای تنظیم نشانهٔ صوتی با مشکل مواجه هستیم. لطفاً بعداً دوباره امتحان کنید."; +/* Error message that the preview experience could not be started */ +"general.error.preview" = "پیش‌نمایش موقعیت مکانی در این مکان قابل شروع نیست."; +//------------------------------------------------------------------------------ +// MARK: - Motion & Fitness (Enable) +//------------------------------------------------------------------------------ +/* "Motion & Fitness" is an iOS term that can be found in the Privacy section in the iPhone Settings app. Translation for fr_FR and fr_CA: "Mouvements et forme" */ +"device_motion.title" = "حرکت و تناسب اندام"; +/* Notification to enable motion and fitness activity on the device. Ensure that "Motion & Fitness" is translated the same as device_motion.title. */ +"device_motion.enable.title" = "فعال کردن ردیابی حرکت و تناسب اندام"; +/* Notification to enable motion and fitness activity on the device. Ensure that "Motion & Fitness" is translated the same as device_motion.title. {NumberedPlaceholder="Soundscape"} */ +"device_motion.enable.description" = "ردیابی حرکت و تناسب اندام در حال حاضر غیرفعال است. Soundscape نمی‌تواند وقتی ردیابی حرکت و تناسب اندام خاموش است کار کند."; +/* Notification to enable motion and fitness activity on the device. Keep newlines (\n) between sentences. Ensure that "Motion & Fitness" is translated the same as device_motion.title. {NumberedPlaceholder="Soundscape"} */ +"device_motion.enable.instructions" = "برای ادامه، ردیابی تناسب اندام را در برنامه تنظیمات روشن کنید.\n\n۱. باز کردن تنظیمات را فشار دهید\n۲. دکمه بازگشت (با عنوان تنظیمات) را فشار دهید\n۳. حریم خصوصی و امنیت را انتخاب کنید\n۴. حرکت و تناسب اندام را انتخاب کنید\n۵. ردیابی تناسب اندام را روشن کنید\n۶. Soundscape را مجدداً راه‌اندازی کنید"; +//------------------------------------------------------------------------------ +// MARK: Motion & Fitness (Authorize) +//------------------------------------------------------------------------------ +/* Notification to authorize motion and fitness activity on the device. Ensure that "Motion & Fitness" is translated the same as device_motion.title. */ +"device_motion.authorize.title" = "اجازه دسترسی به ردیابی حرکت و تناسب اندام"; +/* Notification to authorize motion and fitness activity on the device. Ensure that "Motion & Fitness" is translated the same as device_motion.title. {NumberedPlaceholder="Soundscape"} */ +"device_motion.authorize.description" = "این کار به Soundscape اجازه می‌دهد تا تجربه شما را بر اساس اینکه در حال راه رفتن، در وسیله نقلیه یا ثابت هستید، بهبود بخشد. برنامه برای استفاده از حرکت و تناسب اندام به اجازه شما نیاز دارد. قبل از اینکه به Soundscape اجازه استفاده از این دسترسی را بدهید، ممکن است لازم باشد ردیابی تناسب اندام را در تنظیمات → حریم خصوصی و امنیت → حرکت و تناسب اندام فعال کنید."; +/* Notification to authorize motion and fitness activity on the device. Keep newlines (\n) between sentences. Ensure that "Motion & Fitness" is translated the same as device_motion.title. {NumberedPlaceholder="\n"} */ +"device_motion.authorize.instructions" = "۱. برنامه تنظیمات را در زیر باز کنید\n۲. ردیابی حرکت و تناسب اندام را روشن کنید"; +// ------------------------------------------------------------------------------ +// MARK: - Supported email clients +// ------------------------------------------------------------------------------ +/* Text indicating the system-default mail client on iOS. This can change, so should say "default" or similar / +"mail.default" = "پیش‌فرض"; +/ Translated name of Gmail, Google's email service / +"mail.gmail" = "جیمیل"; +/ Translated name of Outlook, Microsoft's email service / +"mail.msoutlook" = "Microsoft Outlook"; +/ Translated name of Fastmail (https://www.fastmail.com) / +"mail.fastmail" = "Fastmail"; +/ Translated name of Proton Mail (https://protonmail.com) / +"mail.protonmail" = "Proton Mail"; +/ Translated name of Spark's email service (https://sparkmailapp.com/) / +"mail.spark" = "Spark"; +/ Translated name of Airmail (https://airmailapp.com/) / +"mail.airmail" = "Airmail"; +/ Translated name of Yahoo Mail (https://mail.yahoo.com) / +"mail.yahoo" = "Yahoo Mail"; +/ Translated name of Dispatch Mail app (No site URL found, was dispatchapp.net) */ +"mail.dispatch" = "Dispatch"; +//------------------------------------------------------------------------------ +// MARK: - Settings +//------------------------------------------------------------------------------ +/* Title, Settings */ +"settings.screen_title" = "تنظیمات"; +/* Alert, would you like to delete stored data? */ +"settings.clear_cache.alert_title" = "داده‌های ذخیره‌شده حذف شوند؟"; +/* Message, Soundscape stores map data to reduce device data and battery consumption {NumberedPlaceholder="Soundscape"} */ +"settings.clear_cache.alert_message" = "Soundscape داده‌های نقشه را برای کاهش مصرف داده تلفن همراه و باتری ذخیره می‌کند. حذف داده‌های ذخیره‌شده باعث می‌شود Soundscape مجبور به بارگذاری مجدد داده‌ها شود."; +/* Alert, would you like to keep saved markers */ +"settings.clear_cache.markers.alert_title" = "نشانگرها و مسیرها حذف شوند؟"; +/* Quotes written as " Delete removes markers and beacons resetting the app to a new installation build and cannot be undone. */ +"settings.clear_cache.markers.alert_message" = "آیا مطمئنید که می‌خواهید همه نشانگرها و مسیرها را حذف کنید؟ انتخاب «حذف» برنامه را به حالت نصب اولیه بازمی‌گرداند و این عمل قابل بازگشت نیست!"; +/* Alert title, the stored data wasn't deleted */ +"settings.clear_cache.no_service.title" = "امکان پاک کردن داده‌های نقشه ذخیره‌شده وجود ندارد"; +/* Message, the cached data cannot be deleted when there is no internet connection */ +"settings.clear_cache.no_service.message" = "Soundscape در حال حاضر نمی‌تواند به اینترنت متصل شود. هنگام پاک کردن داده‌های نقشه ذخیره‌شده، اتصال به اینترنت لازم است تا داده‌ها بتوانند بازخوانی شوند."; +/* Alert, opt-out of app telemetry */ +"settings.telemetry.optout.alert_title" = "انصراف از ارسال داده‌های تله‌متری"; +/* Message, Opting out will clear the stored information and opt-out of future telemetry collection. Confirm if sure. */ +"settings.telemetry.optout.alert_message" = "این عمل اطلاعات ذخیره‌شده را پاک کرده و از جمع‌آوری داده‌های تله‌متری در آینده انصراف می‌دهد. آیا مطمئن هستید؟"; +/* Button, Opt-out */ +"settings.telemetry.optout.action" = "انصراف"; +/* Version history, %@ is the numerical version of the app, "Version 1.7" {NumberedPlaceholder="%@"} */ +"settings.version.history.version" = "نسخه %@"; +/* The app's version and build numbers, %1$@ and %2$@ are numbers. "Version 1.2 (20)" {NumberedPlaceholder="%1$@","%2$@"} */ +"settings.version.about.version" = "نسخه %1$@ (%2$@)"; +/* Setting selection to send feedback {NumberedPlaceholder="Soundscape"} */ +"settings.feedback.subject" = "بازخورد Soundscape"; +/* Prompt that is asking the user to select an email application from the list of email apps they have installed on their phone. */ +"settings.feedback.choose_email_app" = "یک برنامه ایمیل انتخاب کنید:"; +/* Warning that informs the user that they do not have any mail apps installed. This is displayed when the user taps the button to provide us with feedback. */ +"settings.feedback.no_mail_client_error" = "هیچ برنامه ایمیلی نصب نشده است"; +/* Setting title, Voice */ +"settings.general.voice" = "صدا"; +/* Settings title unit of measurement, Imperial (Feet) */ +"settings.units.imperial" = "امپریال (فوت)"; +/* Settings title unit of measurement, Metric (Meters) */ +"settings.units.metric" = "متریک (متر)"; +/* Settings title, Clear stored map data */ +"settings.clear_data" = "پاک کردن داده‌های نقشه ذخیره‌شده"; +/* Settings title, About Soundscape {NumberedPlaceholder="Soundscape"} */ +"settings.about_app" = "درباره Soundscape"; +/* Settings title,General Settings */ +"settings.section.general" = "تنظیمات عمومی"; +/* Settings title,Units of Measure */ +"settings.section.units" = "واحدهای اندازه‌گیری"; +/* Settings title, Troubleshooting */ +"settings.section.troubleshooting" = "عیب‌یابی"; +/* Settings title, About */ +"settings.section.about" = "درباره"; +/* Settings title, Telemetry */ +"settings.section.telemetry" = "تله‌متری"; +/* Settings title, Share Usage Data */ +"settings.section.share_usage_data" = "اشتراک‌گذاری داده‌های استفاده"; +/* Footer to Telemetry settings selection, help app improve by automatically sending diagnostics and data usage from the user. Personal data not collected {NumberedPlaceholder="Soundscape"} */ +"settings.section.telemetry.footer" = "با ارسال خودکار داده‌های تشخیصی، گزارش خطا و استفاده، به بهبود Soundscape کمک کنید. هیچ داده شخصی جمع‌آوری نمی‌شود."; +/* Settings title, Language */ +"settings.language.screen_title" = "زبان"; +/* Settings title, Language and Region */ +"settings.language.screen_title.2" = "زبان و منطقه"; +/* Language selection validation message, %@ is a language name. "Would you like to change the app language to English?" {NumberedPlaceholder="%@"} */ +"settings.language.change_alert" = "آیا می‌خواهید زبان برنامه را به %@ تغییر دهید؟"; +/* Language selection validation button title. %@ is a language name e.g. "Change to English" {NumberedPlaceholder="%@"} */ +"settings.language.change_alert_action" = "تغییر به %@"; +/* Language display name. %1$@ is a language name, %2$@ is the country name. e.g. "English (United Kingdom)" {NumberedPlaceholder="%1$@", "%2$@"} */ +"settings.language.language_name" = "%1$@ (%2$@)"; +//------------------------------------------------------------------------------ +// MARK: Settings (Audio) +//------------------------------------------------------------------------------ +/* The title for the screen which configures media controls (play/pause/next/etc) related settings */ +"settings.audio.media_controls" = "کنترل‌های رسانه"; +/* A title for a toggle for an audio setting which determines if the current app's audio will be mixed with others. If ON, this app will output audio which could be played at the same time as other apps that play audio, such as another music player app. */ +"settings.audio.mix_with_others.title" = "فعال کردن کنترل‌های رسانه"; +/* The detailed description for the toggle setting "settings.audio.mix_with_others.title". The "Media Controls" refer to the iOS music controls (play, pause, next, etc.) {NumberedPlaceholder="Soundscape"} */ +"settings.audio.mix_with_others.description" = "از این گزینه برای کنترل Soundscape با دکمه‌های هدفون و دکمه‌های پخش رسانه در صفحه قفل استفاده کنید. توجه داشته باشید که وقتی این گزینه روشن است، Soundscape نمی‌تواند همزمان با پخش رسانه‌های دیگر مانند پادکست یا موسیقی استفاده شود."; +/* The detailed description for the alert that confirms where a user wants to turn on the "Enable Media Controls" setting or not {NumberedPlaceholder="Soundscape"} */ +"setting.audio.mix_with_others.confirmation" = "روشن کردن این تنظیمات باعث می‌شود که اعلان‌های صوتی و دیگر صداهای Soundscape هر زمان که از یک برنامه رسانه دیگر استفاده کنید، متوقف شوند. می‌توانید برای ادامه دادن اعلان‌های صوتی به Soundscape بازگردید."; +//------------------------------------------------------------------------------ +// MARK: Settings (Volume) +//------------------------------------------------------------------------------ +/* Title of the slider that controls the volume level of all audio other than beacon or speech audio */ +"settings.volume.other" = "جلوه‌های صوتی"; +//------------------------------------------------------------------------------ +// MARK: Settings (Voice) +//------------------------------------------------------------------------------ +/* Preview of the voice */ +"voice.action.preview" = "پیش‌نمایش"; +/* The phrase spoken by each voice when previewing, %@ is the name of the voice being previewed */ +"voice.preview" = "سلام. نام من %@ است."; +/* Setting for the rate of speech. The speed of the text-to-speech voice. */ +"voice.settings.speaking_rate" = "سرعت گفتار"; +/* Screen title to select a speech voice to for use. */ +"voice.voices" = "صداها"; +/* Prompt to approve speech rate. This is the test output for changing the text-to-speech voice speed. */ +"voice.voice_rate_test" = "این صدا چطور است؟"; +/* Voice name and locale, %1$@ name of voice and %2$@ is the locale, ", )." {NumberedPlaceholder="%1$@","%2$@"} */ +"voice.title.voice_name_and_locale" = "%1$@، %2$@."; +/* Voice name and locale is selected, %1$@ name of voice %2$@ locale, ", , Selected" {NumberedPlaceholder="%1$@","%2$@"} */ +"voice.title.voice_name_and_locale_selected" = "%1$@، %2$@، انتخاب شده."; +/* Hint, a voice has been selected, swip up or down to preview */ +"voice.voice_cell.selected.acc_hint" = "این صدا در حال حاضر انتخاب شده است. برای پیش‌نمایش، انگشت خود را به بالا یا پایین بکشید."; +/* Hint, double tap to use selected voice. Swipe up or down to preview */ +"voice.voice_cell.use.acc_hint" = "برای استفاده از این صدا دو بار ضربه بزنید. برای پیش‌نمایش، انگشت خود را به بالا یا پایین بکشید."; +//------------------------------------------------------------------------------ +// MARK: Settings (Apple Voice) +//------------------------------------------------------------------------------ +/* Label for the section containing voices in other languages in the language selection table */ +"voice.apple.other_languages" = "زبان‌های دیگر"; +/* Label for voices designated as being male */ +"voice.apple.male" = "مرد"; +/* Label for voices designated as being female */ +"voice.apple.female" = "زن"; +/* Subtitle used to indicate to the user that a particular voice is the current default voice in a given locale, %@ is the name of a region, "United States (Default Voice)" */ +"voice.apple.default" = "%@ (صدای پیش‌فرض)"; +/* Sample text used for previewing the available text-to-speech voices. %@ is the name of the selected voice, "This is Tom. How does this sound?", {NumberedPlaceholder="%@"} */ +"voice.apple.preview" = "این صدای %@ است. چطور به نظر می‌رسد؟"; +/* Hint explaining that if the user double taps a voice in the list of voices, it will be selected and a preview will be played. */ +"voice.apple.preview_hint" = "برای انتخاب و پخش پیش‌نمایش دو بار ضربه بزنید"; +/* This is the title of an alert presented to the user when they selecte a default version of a voice which has an enhanced version to inform them that they can download an enhanced version from the iOS Settings app */ +"voice.settings.enhanced_available.title" = "صدای بهبودیافته در دسترس است!"; +/* This is an alert presented to the user when they select a default version of a voice which has an enhanced version to inform them that they can download an enhanced version from the iOS Settings app, "Spoken Content" should be translated the same way it is in the iOS Settings app under Accessibility > Spoken Content, {NumberedPlaceholder="iOS"} */ +"voice.settings.enhanced_available" = "یک نسخه با کیفیت بالاتر از این صدا ممکن است در دسترس باشد. برای دانلود آن و صداهای دیگر، به بخش محتوای گفتاری در تنظیمات دسترسی‌پذیری iOS بروید."; +/* This is one of the options available to the user when they are presented with the alert described by the key ""voice.settings.enhanced_available" */ +"voice.settings.enhanced_available.button" = "استفاده از نسخه فعلی"; +/* This is a warning that explains that Siri voices are not compatible with Soundscape and will not appear in the list of voices users can choose from, {NumberedPlaceholder="Siri","Soundscape"} */ +"voice.apple.no_siri" = "توجه داشته باشید که صداهای سیری برای Soundscape در دسترس نیستند و در لیست زیر نمایش داده نمی‌شوند."; +//------------------------------------------------------------------------------ +// MARK: Settings (Beacon) +//------------------------------------------------------------------------------ +/* Title of the settings screen for beacons. This screen allows users to configure the way the audio beacon sounds. See Terms for the definition of "beacon". */ +"beacon.settings_title" = "تنظیمات نشانهٔ صوتی"; +/* Title of a section in the beacon settings page where the user can select the distance threshold when a beacon automatically stops playing. */ +"beacon.settings.vicinity" = "فاصله قطع خودکار صدا"; +/* Title of a section in the beacon settings page where the user can select a style for their beacon. The various styles mainly differ in the sounds that are played for the beacon, though there are two styles that include some haptics as well. */ +"beacon.settings.style" = "سبک‌های صوتی"; +/* Title of a section in the beacon settings page where the user can select a haptic style for their beacon. "Haptic" refers to vibration feedback that the user can feel. */ +"beacon.settings.style.haptic" = "سبک‌های لمسی"; +/* Explanatory text that tells users how haptic beacon styles differ from normal audio-only beacon styles, {NumberedPlaceholder="Soundscape"} */ +"beacon.settings.style.haptic.explanation" = "این سبک‌های نشانهٔ صوتی علاوه بر صدای معمول، شامل بازخورد لمسی (ویبره) نیز هستند. بازخورد لمسی فقط زمانی در دسترس است که قفل گوشی شما باز باشد و Soundscape در حال اجرا باشد."; +/* Title of a section of settings related to the departure and arrival cues. See documentation for the string 'beacon.setting.melodies' for more context on the departure and arrival cues. */ +"beacon.settings.cues" = "عزیمت و رسیدن"; +/* Title of a setting that allows sounds called the "departure cue" and "arrival cue" to play when a beacon is started (e.g. the user is "departing" for the location of the beacon) and when it ends (e.g. the user has "arrived" at the location of the beacon). These sounds help to distinguish to the user when beacons start and stop. */ +"beacon.settings.melodies" = "فعال کردن صداهای راهنما برای عزیمت و رسیدن"; +/* This text explains to users what they should be listening for when they are choosing a new beacon audio style */ +"beacon.settings.explanation" = "سبک نشانهٔ صوتی را انتخاب کنید که شنیدن آن راحت باشد و در محیط‌های بیرون و پر سر و صدا به آسانی شنیده شود. اطمینان حاصل کنید که می‌توانید جهت آن را به راحتی از طریق دستگاه شنیداری دلخواه خود (هدفون یا بلندگوی گوشی) تشخیص دهید."; +//------------------------------------------------------------------------------ +// MARK: Settings (Bluetooth Peripherals) +//------------------------------------------------------------------------------ +/* Button label, pressing this button will cause Soundscape to disconnect from this device and not reconnect to it in the future */ +"settings.bluetooth.forget" = "فراموش کردن این دستگاه"; +//------------------------------------------------------------------------------ +// MARK: Settings (Troubleshooting) +//------------------------------------------------------------------------------ +/* Title of the table section that allows user to set the tile server URL. */ +"troubleshooting.tile_server_url" = "آدرس سرور نقشه (Tile Server URL)"; +/* Explanation of the tile server URL setting. {NumberedPlaceholder="Soundscape"} */ +"troubleshooting.tile_server_url.explanation" = "این سروری است که Soundscape داده‌های نقشه را از آن دریافت می‌کند. معمولاً نیازی به تغییر این مورد ندارید، مگر اینکه در حال توسعه یا آزمایش Soundscape باشید."; +/* Title of the table section that contains info about the current accuracy of the phone's GPS signal provided by Apple's Location Services feature. */ +"troubleshooting.gps_status" = "دقت موقعیت مکانی"; +/* Preserve meters units - Do not convert. Explanation of how to interpret the location accuracy (i.e. from GPS) displayed in this section of the Troubleshooting screen (using meters for the units). {NumberedPlaceholder="Soundscape","10","20"} */ +"troubleshooting.gps_status.explanation.meters" = "این مقدار تخمینی از دقت Soundscape در تشخیص موقعیت شماست. کمتر از ۱۰± متر خوب است. کمتر از ۲۰± متر قابل قبول است. هر مقدار دیگری ضعیف محسوب می‌شود. داده‌های موقعیت مکانی وقتی در فضای باز و زیر هیچ سازه‌ای نباشید، دقیق‌تر هستند."; +/* Preserve feet units - Do not convert. Explanation of how to interpret the location accuracy (i.e. from GPS) displayed in this section of the Troubleshooting screen (using feet for the units). {NumberedPlaceholder="Soundscape","30","60"} */ +"troubleshooting.gps_status.explanation.feet" = "این مقدار تخمینی از دقت Soundscape در تشخیص موقعیت شماست. کمتر از ۳۰± فوت خوب است. کمتر از ۶۰± فوت قابل قبول است. هر مقدار دیگری ضعیف محسوب می‌شود. داده‌های موقعیت مکانی وقتی در فضای باز و زیر هیچ سازه‌ای نباشید، دقیق‌تر هستند."; +/* Preserve meters units - Do not convert. Label containing the current GPS accuracy of the phone in meters, %@ is accuracy value, "±12 meters" {NumberedPlaceholder="%@"} */ +"troubleshooting.gps_status.meters" = "±%@ متر"; +/* Preserve feet unit - Do not convert. Label containing the current GPS accuracy of the phone in feet, %@ is accuracy value, "±36 feet" {NumberedPlaceholder="%@"} */ +"troubleshooting.gps_status.feet" = "±%@ فوت"; +/* Label for a button that allows user to check if the app's audio is playing through their headset correctly. */ +"troubleshooting.check_audio" = "بررسی صدا"; +/* Voiceover hint that explains the action of the "Check Audio" button. */ +"troubleshooting.check_audio.hint" = "برای بررسی وضعیت هدفون‌های خود دو بار ضربه بزنید"; +/* Explanation of what the "Check Audio" button does, displayed below the button */ +"troubleshooting.check_audio.explanation" = "این دکمه را فشار دهید تا از وضعیت هدفون‌هایی که با Soundscape استفاده می‌کنید، مطلع شوید."; +/* Label for the section of the troubleshooting page that deals with deleting the cached map data */ +"troubleshooting.cache" = "داده‌های نقشه"; +/* VoiceOver hint that explains the action of the "Delete Stored Map Data" button */ +"troubleshooting.cache.hint" = "برای حذف و بارگذاری مجدد داده‌های نقشه ذخیره‌شده دو بار ضربه بزنید"; +/* Explanation of what the "Delete Stored Map Data" button does, displayed below the button */ +"troubleshooting.cache.explanation" = "Soundscape داده‌های نقشه را هنگام راه رفتن دانلود می‌کند تا بتواند شما را از اشیاء و مکان‌های اطرافتان مطلع کند. اگر با Soundscape مشکل دارید یا حافظه زیادی مصرف می‌کند، می‌توانید داده‌های نقشه ذخیره‌شده را پاک کنید و Soundscape فقط داده‌های نقشه نزدیک به مکان فعلی شما را مجدداً دانلود خواهد کرد."; +/* Title for the user data section in troubleshooting */ +"troubleshooting.user_data" = "داده‌های کاربر"; +/* Label for the button that allows user to delete all map data, including saved markers and routes */ +"troubleshooting.user_data.button" = "حذف همه نشانگرها و مسیرها"; +/* Explanation for the user data section in troubleshooting */ +"troubleshooting.user_data.explanation" = "همه داده‌های نقشه، از جمله نشانگرها و مسیرهای ذخیره‌شده را حذف کنید. این عمل قابل بازگشت نیست."; +//------------------------------------------------------------------------------ +// MARK: Settings (About) +//------------------------------------------------------------------------------ +/* Settings About Title, What's New? */ +"settings.about.title.whats_new" = "چه خبر؟"; +/* Settings About Title, Privacy and Cookies */ +"settings.about.title.privacy" = "بیانیه حریم خصوصی جامعه Soundscape"; +/* Settings About Title, Service Agreement */ +"settings.about.title.service_agreement" = "توافقنامه خدمات"; +/* Settings About Title, Third Party Notices */ +"settings.about.title.third_party" = "اعلامیه‌های شخص ثالث"; +/* Settings About Title, Copyright Notices */ +"settings.about.title.copyright" = "اعلامیه‌های حق تکثیر"; +//------------------------------------------------------------------------------ +// MARK: Settings (New Feature) +//------------------------------------------------------------------------------ +/* Settings new feature, %1$@ is the feature number out of %2$@ number of features, "<2> of <3>" {NumberedPlaceholder="%1$@", "%2$@"} */ +"settings.new_feature.num_of_num" = "%1$@ از %2$@"; +/* Settings new feature, instruction to double tap to close announcements */ +"settings.new_feature.accept_button.acc_label" = "برای بستن اطلاعیه‌ها دو بار ضربه بزنید"; +/* Settings new feature, instruction to double tap to view next update announcement */ +"settings.new_feature.accept_button.acc_hint" = "برای مشاهده اطلاعیه به‌روزرسانی بعدی دو بار ضربه بزنید"; +/* Settings New Feature, title Recent Updates */ +"settings.new_feature.recent_updates" = "به‌روزرسانی‌های اخیر"; +//------------------------------------------------------------------------------ +// MARK: - Beacon +//------------------------------------------------------------------------------ +/* Title, Beacon. See Terms defintion of Beacon. */ +"beacon.generic_name" = "نشانهٔ صوتی"; +/* Name of a beacon style. This is the name of the most recent version of the beacon audio we had in Soundscape as of the v4.1 release, so we refer to it as the "current" beacon. */ +"beacon.styles.current" = "فعلی"; +/* Name of a beacon style. This is the name of the first style of beacon audio we had in Soundscape, so we refer to it as "Original" */ +"beacon.styles.original" = "اصلی"; +/* Name of a beacon style. In this context, "flare" refers to a bright burst of light. The audio for this beacon style is bright and fun */ +"beacon.styles.flare" = "درخشش"; +/* Name of a beacon style. In this context, "shimmer" is used as a synonym for "flare". The audio for this beacon is bright and fun (just as with the style refered to by beacon.styles.flare), but it is a bit softer than the "Flare" style. */ +"beacon.styles.shimmer" = "سوسو"; +/* Name of a beacon style. This beacon style name is intended to hint at the percussive, tapping, nature of the beacon audio. */ +"beacon.styles.tactile" = "ضربه‌ای"; +/* Name of a beacon style. Refers to a short high pitched ringing sound that repeats in this beacon style. */ +"beacon.styles.ping" = "پینگ"; +/* Name of a beacon style. This beacon style is based on the sound of an object being dropped on a hard floor, hence the name "Drop" is alluding to that sound. */ +"beacon.styles.drop" = "قطره"; +/* Name of a beacon style. This name is alluding to the radar-like nature of this beacon (hence "signal") which has an impulse which repeats over and over */ +"beacon.styles.signal" = "سیگنال"; +/* Name of a beacon style. "Signal" is used in the same way here as in the string with key 'beacon.styles.signal'. The difference here is that this version is a slower version of the beacon audio. */ +"beacon.styles.signal.slow" = "سیگنال (آهسته)"; +/* Name of a beacon style. "Signal" is used in the same way here as in the string with key 'beacon.styles.signal'. The difference here is that this version is a much slower version of the beacon audio. */ +"beacon.styles.signal.very_slow" = "سیگنال (بسیار آهسته)"; +/* Name of a beacon style. This beacon style has a similar timbre to the sound that is generated when a mallet is used to play the xylophone, hence the name "mallet". */ +"beacon.styles.mallet" = "چکشی"; +/* Name of a beacon style. "Mallet" is used in the same way here as in the string with key 'beacon.styles.mallet'. The difference here is that this version is a slower version of the beacon audio. */ +"beacon.styles.mallet.slow" = "چکشی (آهسته)"; +/* Name of a beacon style. "Mallet" is used in the same way here as in the string with key 'beacon.styles.mallet'. The difference here is that this version is a much slower version of the beacon audio. */ +"beacon.styles.mallet.very_slow" = "چکشی (بسیار آهسته)"; +/* Name of a beacon style. Unlike the other beacon styles, this style include haptic feedback (e.g. vibration feedback from the iPhone). The term "wand" is used to refer to a pointing device. Together, this name is intended to convey that this beacon style provides haptic feedback to the user when they hold their phone in front of them and point it around. */ +"beacon.styles.haptic.wand" = "چوب‌دستی لمسی"; +/* Name of a beacon style. Similarly to 'beacon.styles.haptic.wand' string, the beacon style this string refers to includes haptic feedback (e.g. vibration feedback from the iPhone). The term "pulse" alludes to the fact that the haptic feedback continues to repeat (e.g. it pulses on and off) so long as the user holds their phone in front of themselves and points it around. */ +"beacon.styles.haptic.pulse" = "پالس لمسی"; +/* Title, Audio Beacon */ +"beacon.audio_beacon" = "نشانهٔ صوتی"; +/* Notification, %@ is a location, "Beacon on " {NumberedPlaceholder="%@"} */ +"beacon.beacon_on" = "نشانهٔ صوتی روی %@"; +/* Included in the beacon UI when the distance to the beacon is not known */ +"beacon.distance.unknown" = "فاصله نامعلوم"; +/* Button, Remove Beacon */ +"beacon.action.remove_beacon" = "حذف نشانهٔ صوتی"; +/* Notification, Double tap this button to remove current audio beacon */ +"beacon.action.remove_beacon.double_tap.acc_hint" = "برای حذف نشانهٔ صوتی فعلی دو بار ضربه بزنید"; +/* Button, Mute Beacon */ +"beacon.action.mute_beacon" = "بی‌صدا کردن نشانهٔ صوتی"; +/* Notification, Double tap to mute the audio beacon */ +"beacon.action.mute_beacon.acc_hint" = "برای بی‌صدا کردن نشانهٔ صوتی دو بار ضربه بزنید"; +/* Button, Unmute Beacon */ +"beacon.action.unmute_beacon" = "باصدا کردن نشانهٔ صوتی"; +/* Notification, Double tap to unmute the audio beacon */ +"beacon.action.unmute_beacon.acc_hint" = "برای باصدا کردن نشانهٔ صوتی دو بار ضربه بزنید"; +/* Button, Mute or Unmute Beacon */ +"beacon.action.mute_unmute_beacon" = "بی‌صدا/باصدا کردن نشانهٔ صوتی"; +/* Button, Call out Beacon */ +"beacon.action.callout_beacon" = "اعلام نشانهٔ صوتی"; +/* Button, Launch NaviLens */ +"beacon.action.navilens" = "راه‌اندازی NaviLens"; +/* Notification, Double tap to unmute or mute the audio beacon */ +"beacon.action.mute_unmute_beacon.acc_hint" = "برای بی‌صدا یا باصدا کردن نشانهٔ صوتی دو بار ضربه بزنید"; +/* Title text of the button used to view the detail view */ +"beacon.action.view_details" = "مشاهده جزئیات"; +/* Hint text of the button used to view the detail view */ +"beacon.action.view_details.acc_hint.details" = "برای مشاهده جزئیات بیشتر دو بار ضربه بزنید"; +/* Button, Beacon Distance Update */ +"beacon.distance_update" = "به‌روزرسانی فاصله نشانهٔ صوتی"; +/* Notification, Beacon location nearby. */ +"beacon.beacon_location_within" = "نشانهٔ صوتی در محدوده %@"; +/* Notification, Beacon location nearby. Audio beacon has been muted. */ +"beacon.beacon_location_within_audio_beacon_muted" = "نشانهٔ صوتی در محدوده %@. نشانهٔ صوتی بی‌صدا شده است."; +/* Suggest the user launch NaviLens for the remaining distance. Appended to beacon.beacon_location_within_audio_beacon_muted. */ +"beacon.suggest_navilens" = "برای رسیدن به مقصد خود از دکمه NaviLens استفاده کنید."; +//------------------------------------------------------------------------------ +// MARK: - Preview +//------------------------------------------------------------------------------ +/* Street Preview, View title, Street Preview is functionality that allows the user to select any location in the world to preview the area at street level in order to familiarise and build a mental map of the space. {NumberedPlaceholder="Soundscape Street Preview"} */ +"preview.title" = "پیش‌نمایش خیابان Soundscape"; +/* Text displayed when the current location is not known while previewing */ +"preview.current_intersection_unknown.label" = "موقعیت فعلی نامعلوم"; +/* Text displaying the next intersection that the user will encounter along a selected road, "To Main St & 2nd Ave" {NumberedPlaceholder="%@"} */ +"preview.next_intersection.label" = "به سمت %@"; +/* Text displayed when the user is approaching an intersection */ +"preview.approaching_intersection.label" = "در حال نزدیک شدن به تقاطع"; +/* Label to display compass orientation, %1$@ is the heading in degrees and %2$@ is the cardinal direction, "230° SW" {NumberedPlaceholder="%1$@", "%2$@"} */ +"preview.content.orientation.text.with_cardinal" = "%1$@ درجه %2$@"; +/* Label to display compass orientation without a cardinal direction, %1$@ is the heading in degrees, "230°" {NumberedPlaceholder="%1$@"} */ +"preview.content.orientation.text.without_cardinal" = "%1$@ درجه"; +/* Label to display when the user is facing a road that they can travel down, %1$@ is the cardinal direction and %2$@ is the name of the road that they can travel down, "SW on Main Street" {NumberedPlaceholder="%1$@", "%2$@"} */ +"preview.content.edge.text" = "%1$@ در خیابان %2$@"; +/* Accessibility hint for the button to select a direction of travel */ +"preview.content.edge.text.accessibility_hint" = "برای رفتن به تقاطع بعدی دو بار ضربه بزنید"; +/* Title for button to go to the next intersection */ +"preview.go.title" = "برو"; +/* Title for button to go back to the previous intersection */ +"preview.go_back.title" = "قبلی"; +/* Accessibility hint for button to go back */ +"preview.go_back.accessibility_text" = "برای بازگشت به تقاطع قبلی خود دو بار ضربه بزنید"; +/* Text for the "Search" button */ +"preview.search.label" = "کاوش در اطراف"; +/* Accessibility hint for the "Explore" button */ +"preview.search.accessibility_hint" = "برای جستجو یا مرور مکان‌های اطراف دو بار ضربه بزنید"; +/* Title for the alert displayed when ther user tries to restart the preview experience at a new location */ +"preview.alert.restart.title" = "پیش‌نمایش از قبل در حال انجام است"; +/* Message for the alert displayed when ther user tries to restart the preview experience at a new location. {NumberedPlaceholder="Soundscape Street Preview"} */ +"preview.alert.restart.message" = "آیا می‌خواهید پیش‌نمایش خیابان Soundscape را در این مکان مجدداً راه‌اندازی کنید؟"; +/* Button for the alert displayed when ther user tries to restart the preview experience at a new location */ +"preview.alert.restart.button" = "راه‌اندازی مجدد"; +/* Callout that occurs when the preview experience pauses, The translation for "Street preview" should match the translation for "preview.title". {NumberedPlaceholder="Street Preview"} */ +"preview.callout.paused" = "پیش‌نمایش خیابان متوقف شد"; +/* Callout that occurs when the user exits the preview experience. {NumberedPlaceholder="Soundscape Street Preview"} */ +"preview.callout.end" = "پایان دادن به پیش‌نمایش خیابان Soundscape"; +/* Callout that occurs when users tap the button to return to the previous intersection they were at in the preview */ +"preview.callout.previous" = "بازگشت به تقاطع قبلی"; +/* Callout that occurs when the user starts preview mode at an intersection, %@ is the name of the intersection, "Starting preview at 9th Avenue North and Harrison Street" {NumberedPlaceholder="%@","Street Preview"} */ +"preview.callout.start.at" = "شروع پیش‌نمایش خیابان در %@"; +/* Callout that occurs when the user starts preview mode along a road, %@ is the name of the road, "Starting preview along 9th Avenue North" {NumberedPlaceholder="%@","Street Preview"} */ +"preview.callout.start.along" = "شروع پیش‌نمایش خیابان در امتداد %@"; +/* Callout that occurs when the user resumes a paused preview at an intersection, %@ is the name of the intersection, "Continuing preview at 9th Avenue North and Harrison Street" {NumberedPlaceholder="%@","Street Preview"} */ +"preview.callout.continue.at" = "ادامه پیش‌نمایش خیابان در %@"; +/* Callout that occurs when the user resumes a paused preview mode along a road, %@ is the name of the road, "Continuing preview along 9th Avenue North" {NumberedPlaceholder="%@","Street Preview"} */ +"preview.callout.continue.along" = "ادامه پیش‌نمایش خیابان در امتداد %@"; +/* Callout that occurs the first time the user gets to the "road finder" experience during their first use of the Street Preview experience. This is telling them to physically turn their phone so the app can tell them about the roads they are pointing the phone towards. */ +"preview.callout.road_finder.instructions" = "برای پیش‌نمایش جاده‌های موجود، گوشی خود را بچرخانید"; +/* This callout occurs the first time the user tries to tap the "Go" button when they are not pointed down a valid road. This explains that they need to point their phone down a valid road before hitting the Go button. */ +"preview.callout.road_finder.error_instructions" = "برای انتخاب یک جاده بچرخید و سپس دکمه «برو» را فشار دهید"; +/* Callout that occurs when a user is pointing their phone down an available road, %1$@ is the name of the road, %2$@ is the cardinal direction it moves away in, "9th Ave North, heading south" {NumberedPlaceholder="%1$@", "%2$@"} */ +"preview.callout.road_finder.road" = "%1$@، به سمت %2$@"; +/* Callout that occurs when a user is pointing their phone down an available road looking for the next intersection, %@ is the name of the next intersection in that direction, "Next intersection: 9th Avenue North and Harrison Street" {NumberedPlaceholder="%@"} */ +"preview.callout.road_finder.intersection" = "تقاطع بعدی: %@"; +/* Callout that occurs when a user is pointing their phone down an available road looking for the next intersection but the road loops around and returns to the current intersection (e.g. a roundabout or a "close" in the UK) */ +"preview.callout.road_finder.intersection.same" = "تقاطع بعدی: به تقاطع فعلی برمی‌گردد"; +/* Callout that occurs when a user is pointing their phone down an available road looking for the next intersection but the road terminates in a dead end rather than another intersection */ +"preview.callout.road_finder.intersection.end" = "تقاطع بعدی: انتهای جاده"; +/* Callout that occurs when the user travels down a road (in preview mode) that ends without connecting to any other streets (a road with no exit) */ +"preview.callout.approach.end" = "در حال نزدیک شدن به انتهای جاده"; +/* Callout that occurs when the user selects a road that requires a left hand turn, %@ is the name of the street that the user is turning on {NumberedPlaceholder="%@"} */ +"preview.callout.turn.left" = "به چپ پیچیدید. اکنون در امتداد %@ هستید"; +/* Callout that occurs when the user selects a road that requires a right-hand turn, %@ is the name of the street that the user is turning on {NumberedPlaceholder="%@"} */ +"preview.callout.turn.right" = "به راست پیچیدید. اکنون در امتداد %@ هستید"; +/* Callout that occurs when the user selects to continue down the same road, %@ is the name of the street that the user is continuing along {NumberedPlaceholder="%@"} */ +"preview.callout.turn.continue" = "ادامه در امتداد %@"; +/* Callout that occurs when the user is currently in a roundabout and selects a road that leaves the roundabout, %@ is the name of the street that the user is turning on {NumberedPlaceholder="%@"} */ +"preview.callout.turn.roundabout" = "از میدان خارج شدید. اکنون در امتداد %@ هستید"; +/* Title for a setting to include unnamed roads */ +"preview.include_unnamed_roads.title" = "جاده‌های بی‌نام"; +/* Subtitle for a setting to include unnamed roads. {NumberedPlaceholder="Soundscape Street Preview"} */ +"preview.include_unnamed_roads.subtitle" = "شامل کردن جاده‌های بی‌نام در طول پیش‌نمایش خیابان Soundscape"; +/* Voiceover label for a button to turn on a setting to include unnamed roads */ +"preview.include_unnamed_roads.label.off" = "فعال کردن جاده‌های بی‌نام"; +/* Voiceover label for a button to turn off a setting to include unnamed roads */ +"preview.include_unnamed_roads.label.on" = "غیرفعال کردن جاده‌های بی‌نام"; +/* Voiceover hint for a button to turn on a setting to include unnamed roads. {NumberedPlaceholder="Soundscape Street Preview"} */ +"preview.include_unnamed_roads.hint.off" = "برای شامل کردن جاده‌های بی‌نام در طول پیش‌نمایش خیابان Soundscape دو بار ضربه بزنید"; +/* Voiceover hint for a button to turn off a setting to include unnamed roads. {NumberedPlaceholder="Soundscape Street Preview"} */ +"preview.include_unnamed_roads.hint.on" = "برای حذف جاده‌های بی‌نام در طول پیش‌نمایش خیابان Soundscape دو بار ضربه بزنید"; +/* Accessibility hint for the button to end the preview tutorial */ +"preview.tutorial.done.hint" = "برای خروج از آموزش دو بار ضربه بزنید"; +/* Title for the first set of tutorial content. {NumberedPlaceholder="Soundscape Street Preview"} */ +"preview.tutorial.title.1" = "به پیش‌نمایش خیابان Soundscape خوش آمدید!"; +/* First set of tutorial content */ +"preview.tutorial.content.1" = "هر منطقه‌ای در جهان را کاوش کرده و از آن حس بگیرید. برای بهترین تجربه، توصیه می‌کنیم بایستید و در جای خود بچرخید و از هدفون استریو استفاده کنید."; +/* Title for the second set of tutorial content */ +"preview.tutorial.title.2" = "چه اتفاقی قرار است بیفتد"; +/* Second set of tutorial content, %@ is the name of the location where the preview experience is starting, Quotes written as " */ +"preview.tutorial.content.2" = "شما به وسط خیابانی نزدیک به مکان انتخابی خود منتقل شده‌اید. با استفاده از گوشی به عنوان یک اشاره‌گر، به آرامی بچرخید و با چرخیدن شما، نام خیابان‌ها اعلام خواهد شد. وقتی رو به خیابانی که می‌خواهید در آن پیش بروید قرار گرفتید، روی «برو» ضربه بزنید تا به تقاطع بعدی بروید."; +/* Title for the third set of tutorial content */ +"preview.tutorial.title.3" = "ادامه کاوش شما"; +/* Third set of tutorial content Quotes written as " */ +"preview.tutorial.content.3" = "در هر تقاطع، می‌توانید دوباره از گوشی برای انتخاب جاده‌ای که می‌خواهید در آن پیش بروید استفاده کنید، یا می‌توانید با استفاده از دکمه‌های آشنای Soundscape در پایین صفحه، محیط اطراف خود را کاوش کنید. می‌توانید روی «کاوش در اطراف» ضربه بزنید تا نشانهٔ صوتی را در هر نقطه مورد علاقه شروع کنید، مکان خود را تغییر دهید، یا فقط منطقه را با جزئیات بیشتر کاوش کنید."; +/* Fourth set of tutorial content */ +"preview.tutorial.content.4" = "لذت ببرید و خوش بگذرانید!"; +//------------------------------------------------------------------------------ +// MARK: - Location Detail +//------------------------------------------------------------------------------ +/* Location Details, View title */ +"location_detail.title.default" = "جزئیات مکان"; +/* Marker Details, View title */ +"location_detail.title.marker" = "جزئیات نشانگر"; +/* Waypoint Details, View title */ +"location_detail.title.waypoint" = "جزئیات ایستگاه"; +/* Title for the action to set a beacon */ +"location_detail.action.beacon" = "شروع نشانهٔ صوتی"; +/* Text label for the action to start audio beacon at a NaviLens-enabled location */ +"location_detail.action.beacon_or_navilens" = "شروع NaviLens یا نشانهٔ صوتی"; +/* Voiceover hint for the action to set a beacon */ +"location_detail.action.beacon.hint" = "برای تنظیم یک نشانهٔ صوتی در این مکان دو بار ضربه بزنید"; +/* Voiceover hint for the action to set a beacon or launch NaviLens */ +"location_detail.action.beacon_or_navilens.hint" = "بسته به نزدیکی این مکان، برای راه‌اندازی NaviLens یا تنظیم یک نشانهٔ صوتی دو بار ضربه بزنید"; +/* Text displayed when audio beacon action is disabled */ +"location_detail.action.beacon.hint.disabled" = "تنظیم یک نشانهٔ صوتی جدید در حین فعال بودن راهنمای مسیر غیرفعال است"; +/* Voiceover hint for the action to save marker */ +"location_detail.action.save.hint" = "برای ذخیره این مکان به عنوان یک نشانگر دو بار ضربه بزنید"; +/* Voiceover hint for the action to edit marker */ +"location_detail.action.edit.hint" = "برای ویرایش نشانگر دو بار ضربه بزنید"; +/* Voiceover hint for the action to share */ +"location_detail.action.share.hint" = "برای اشتراک‌گذاری این مکان دو بار ضربه بزنید"; +/* Voiceover hint for the action to preview */ +"location_detail.action.preview.hint" = "برای شروع پیش‌نمایش در این مکان دو بار ضربه بزنید"; +/* Text displayed when street preview is disabled */ +"location_detail.action.preview.hint.disabled" = "پیش‌نمایش خیابان در حین فعال بودن راهنمای مسیر غیرفعال است"; +/* Voiceover hint for the action to get directions */ +"location_detail.action.directions.hint" = "برای باز کردن این مکان در یک برنامه نقشه خارجی دو بار ضربه بزنید"; +/* Default address for a location */ +"location_detail.default.address" = "آدرس نامعلوم"; +/* Default annotation for a location */ +"location_detail.default.annotation" = "بدون یادداشت برای نشانگر"; +/* Accessibility hint to select a location */ +"location.select.hint" = "برای انتخاب این مکان دو بار ضربه بزنید"; +/* Text displayed when the location cannot be saved as a marker */ +"location_detail.disabled.save" = "ذخیره کردن یک نشانگر در این مکان در حال حاضر در دسترس نیست"; +/* Text displayed when the location cannot be shared */ +"location_detail.disabled.share" = "اشتراک‌گذاری این مکان در حال حاضر در دسترس نیست"; +/* Text displayed when no actions can be taken for a loction */ +"location_detail.disabled.generic" = "این مکان در حال حاضر در دسترس نیست"; +/* Title text displayed when the user is viewing the expanded map view */ +"location_detail.map.view.title" = "مکان انتخاب شده"; +/* Hint text displayed when the user is viewing the expanded map view */ +"location_detail.map.view.hint" = "برای انتخاب یک مکان جدید ویرایش کنید"; +/* Title text displayed when the user is selecting a location via the expanded map view */ +"location_detail.map.edit.title" = "ویرایش مکان"; +/* Hint text displayed when the user is selecting a location via the expanded map view */ +"location_detail.map.edit.hint" = "نقشه را به مکان صحیح منتقل کنید"; +/* Accessibility label used when the user is moving the marker location via custom Voiceover experience, Here, "nudge" means moving a small distance. */ +"location_detail.map.edit.accessibility_label" = "جابجایی اندک نشانگر"; +/* Accessibility hint used when the user is moving the marker location via custom Voiceover experience, Here, "nudge" means moving a small distance. */ +"location_detail.map.edit.compass.accessibility_hint" = "برای جابجایی اندک نشانگر در جهتی که گوشی شما اشاره می‌کند دو بار ضربه بزنید. برای جابجایی اندک در جهتی دیگر از اقدامات استفاده کنید."; +/* Accessibility hint used when the user is moving the marker location via custom Voiceover experience, Here, "nudge" means moving a small distance. */ +"location_detail.map.edit.north.accessibility_hint" = "برای جابجایی اندک نشانگر به سمت شمال دو بار ضربه بزنید. برای جابجایی اندک در جهتی دیگر از اقدامات استفاده کنید."; +/* Accessibility hint used when the user is moving the marker location via custom Voiceover experience, Here, "nudge" means moving a small distance. */ +"location_detail.map.edit.south.accessibility_hint" = "برای جابجایی اندک نشانگر به سمت جنوب دو بار ضربه بزنید. برای جابجایی اندک در جهتی دیگر از اقدامات استفاده کنید."; +/* Accessibility hint used when the user is moving the marker location via custom Voiceover experience, Here, "nudge" means moving a small distance. */ +"location_detail.map.edit.east.accessibility_hint" = "برای جابجایی اندک نشانگر به سمت شرق دو بار ضربه بزنید. برای جابجایی اندک در جهتی دیگر از اقدامات استفاده کنید."; +/* Accessibility hint used when the user is moving the marker location via custom Voiceover experience, Here, "nudge" means moving a small distance. */ +"location_detail.map.edit.west.accessibility_hint" = "برای جابجایی اندک نشانگر به سمت غرب دو بار ضربه بزنید. برای جابجایی اندک در جهتی دیگر از اقدامات استفاده کنید."; +/* Accessibility annoucement used to tell the user where a marker has moved to via custom Voiceover experience, %@ is a localized distance / direction string, "Nudging, 15 meters northwest of original location", Here, "nudge" means moving a small distance, {NumberedPlaceholder="%@"} */ +"location_detail.map.edit.accessibility_annoucement" = "در حال جابجایی اندک، %@ از مکان اصلی"; +/* Accessibility action used when the user is moving the marker location via custom Voiceover experience and wants to move the marker in the direction that their phone is pointing, Here, "nudge" means moving a small distance. */ +"location_detail.map.edit.accessibility_action.compass" = "جابجایی اندک در جهت گوشی"; +/* Accessibility action used when the user is moving the marker location via custom Voiceover experience and wants to move the marker north of its current location, Here, "nudge" means moving a small distance. */ +"location_detail.map.edit.accessibility_action.north" = "جابجایی اندک به شمال"; +/* Accessibility action used when the user is moving the marker location via custom Voiceover experience and wants to move the marker south of its current location, Here, "nudge" means moving a small distance. */ +"location_detail.map.edit.accessibility_action.south" = "جابجایی اندک به جنوب"; +/* Accessibility action used when the user is moving the marker location via custom Voiceover experience and wants to move the marker east of its current location, Here, "nudge" means moving a small distance. */ +"location_detail.map.edit.accessibility_action.east" = "جابجایی اندک به شرق"; +/* Accessibility action used when the user is moving the marker location via custom Voiceover experience and wants to move the marker west of its current location, Here, "nudge" means moving a small distance. */ +"location_detail.map.edit.accessibility_action.west" = "جابجایی اندک به غرب"; +/* Accessibility action used when the user is moving the marker location via custom Voiceover experience and wants to move the marker to the user's current location */ +"location_detail.map.edit.accessibility_action.current_location" = "انتقال به مکان فعلی"; +/* Callout made when starting the audio beacon while the user is moving a marker via custom Voiceover experience, %@ is a localized distance / direction string, "Nudging, 15 meters northwest of original location", Here, "nudge" means moving a small distance, {NumberedPlaceholder="%@"} */ +"location_detail.map.edit.accessibility.beacon.callout" = "شروع نشانهٔ صوتی برای ردیابی مکان نشانگر. در حال جابجایی اندک، %@ از مکان اصلی."; +/* Accessibility label for the icon which displays the number of the waypoint. %@ is the index of the waypoint. (e.g., "Waypoint 1") {NumberedPlaceholder="%@"} */ +"location_detail.waypoint" = "ایستگاه %@"; +/* Accessibility hint for markers in a list which has already been added to a route */ +"location_detail.add_waypoint.existing.hint" = "برای حذف این نشانگر از مسیر خود دو بار ضربه بزنید"; +/* Accessibility hint for markers in a list that can be added to a list */ +"location_detail.add_waypoint.new.hint" = "برای افزودن این نشانگر به مسیر خود دو بار ضربه بزنید"; +/* Accessibility hint for markers in a list that can be created abd added to a list */ +"location_detail.add_waypoint.marker.hint" = "برای ایجاد یک نشانگر و افزودن آن به عنوان یک ایستگاه دو بار ضربه بزنید"; +//------------------------------------------------------------------------------ +// MARK: - Route Detail +//------------------------------------------------------------------------------ +/* Title for the action to start playing the audio for a route */ +"route_detail.action.start_route" = "شروع مسیر"; +/* Title for the action to stop playing the audio for a route */ +"route_detail.action.stop_route" = "توقف مسیر"; +/* Title for the action to start the recreational activity. In this context, "activity" is referring to outdoor recreational activities like hiking, kayaking, snoeshoeing, etc. */ +"route_detail.action.start_event" = "شروع فعالیت"; +/* Title for the action to pause the recreational activity. In this context, "activity" is referring to outdoor recreational activities like hiking, kayaking, snoeshoeing, etc. */ +"route_detail.action.stop_event" = "توقف فعالیت"; +/* Title for the action to start playing the audio for a reversed route */ +"route_detail.action.start_reversed_route" = "شروع مسیر معکوس"; +/* Accessibility hint for the edit button on the Route Detail screen */ +"route_detail.action.edit" = "ویرایش مسیر"; +/* Accessibility hint for the reversed route button on the Route Detail screen */ +"route_detail.action.start_reversed_route.hint" = "برای شروع این مسیر به صورت معکوس دو بار ضربه بزنید"; +/* Voiceover hint for the action to start the route in reverse when the action is disabled. This action is only disabled when no waypoints have been added to a route yet. */ +"route_detail.action.start_reversed_route.disabled.hint" = "قبل از شروع مسیر معکوس، ایستگاه‌ها را اضافه کنید"; +/* Voiceover hint for the action to start the route */ +"route_detail.action.start_route.hint" = "برای شروع این مسیر دو بار ضربه بزنید"; +/* Voiceover hint for the action to start the route when the action is disabled. This action is only disabled when no waypoints have been added to a route yet. */ +"route_detail.action.start_route.disabled.hint" = "قبل از شروع مسیر، ایستگاه‌ها را اضافه کنید"; +/* Voiceover hint for the action to stop the route */ +"route_detail.action.stop_route.hint" = "برای توقف این مسیر دو بار ضربه بزنید"; +/* Voiceover hint for the action to start the recreational activity. In this context, "activity" is referring to outdoor recreational activities like hiking, kayaking, snoeshoeing, etc. */ +"route_detail.action.start_event.hint" = "برای شروع این فعالیت دو بار ضربه بزنید"; +/* Voiceover hint for the action to pause the recreational activity. In this context, "activity" is referring to outdoor recreational activities like hiking, kayaking, snoeshoeing, etc. */ +"route_detail.action.stop_event.hint" = "برای توقف این فعالیت و ذخیره پیشرفت خود دو بار ضربه بزنید"; +/* Voiceover hint for the action to reset the recreational activity so that the user can try it again. In this context, "activity" is referring to outdoor recreational activities like hiking, kayaking, snoeshoeing, etc. */ +"route_detail.action.reset.hint" = "برای بازنشانی این فعالیت و دانلود هر گونه به‌روزرسانی موجود دو بار ضربه بزنید"; +/* Voiceover hint for the action to share */ +"route_detail.action.share.hint" = "برای اشتراک‌گذاری این مسیر دو بار ضربه بزنید"; +/* Accessibility hint for the edit button on the Route Detail screen */ +"route_detail.action.edit.hint" = "برای ویرایش این مسیر دو بار ضربه بزنید"; +/* Add button on the Route list screen */ +"route_detail.action.create" = "مسیر جدید"; +/* VoiceOver hint for the add button on the Route list screen */ +"route_detail.action.create.hint" = "برای ایجاد یک مسیر جدید دو بار ضربه بزنید"; +/* Accessbility label for the index of a waypoint in a route and an indication that the audio beacon is currently playing on this waypoint's location, %@ is the index, "Waypoint 2. Current beacon." {NumberedPlaceholder="%@"} */ +"route_detail.waypoint.current_beacon" = "ایستگاه %@. نشانهٔ صوتی فعلی."; +/* This is the name that will be used when a route does not have a defined name */ +"route_detail.name.default" = "مسیر"; +/* Text displayed to indicate the time elapsed in a recreational activity, %@ is the time elapsed, "01:45:12 elapsed", {NumberedPlaceholder="%@"} */ +"route.title.time" = "%@ گذشته"; +/* Title text displayed for a route, %1$@ is the name of the route, %2$@ is the index of the current waypoint and %3$@ is the total number of waypoints in the route, "Home to Work・Waypoint 1 of 3", {NumberedPlaceholder="%1$@", "%2$@", "%3$@", "・"} */ +"route.title" = "%1$@・ایستگاه %2$@ از %3$@"; +/* Text to display how many waypoints are remaining, %@ is the number of remaining waypoints, "2 remaining", {NumberedPlaceholder="%@"} */ +"route.waypoint.progress" = "%@ ایستگاه باقی مانده"; +/* Text to display when the route is completed but still visible on the home screen, %@ is the time elapsed, "Completed in 01:22:12", {NumberedPlaceholder="%@"} */ +"route.waypoint.progress.complete.elapsed" = "تکمیل شده در %@"; +/* Text to display when the route is completed but still visible on the home screen */ +"route.waypoint.progress.complete" = "تکمیل شد!"; +/* Text displayed for when a route ends and the route was completed, %@ is name of the route, "Route Completed!・Home to Work", {NumberedPlaceholder="%@", "・"} */ +"route.end.completed" = "مسیر تکمیل شد!・%@"; +/* Accessibility Text displayed for when a route ends and the route was completed, %@ is name of the route, "Route Completed! Home to Work", {NumberedPlaceholder="%@"} */ +"route.end.completed.accessibility" = "مسیر تکمیل شد! %@"; +/* Text displayed for when a route ends but the route was not completed, %@ is name of the route, "Route Ended・Home to Work", {NumberedPlaceholder="%@", "・"} */ +"route.end.not_completed" = "مسیر متوقف شد・%@"; +/* Accessibility Text displayed for when a route ends but the route was not completed, %@ is name of the route, "Route Ended, Home to Work", {NumberedPlaceholder="%@"} */ +"route.end.not_completed.accessibility" = "مسیر متوقف شد، %@"; +/* Text displayed for when a route ends and the route was completed, %@ is the number of waypoints reached, "3 Waypoints Reached・Last Waypoint Nearby", {NumberedPlaceholder="%@", "・"} */ +"route.end.completed.summary" = "%@ ایستگاه طی شد・ایستگاه آخر در نزدیکی است"; +/* Accessibility Text displayed for when a route ends and the route was completed, %@ is the number of waypoints reached, "3 Waypoints Reached・Last Waypoint Nearby", {NumberedPlaceholder="%@"} */ +"route.end.completed.summary.accessibility" = "%@ ایستگاه طی شد، ایستگاه آخر در نزدیکی است"; +/* Text displayed for when a route ends but the route was not completed, %1$@ is the number of waypoints reached, %2$@ the total number of waypoints, %3$@ is the number of waypoints remaining, "1 of 3 Waypoints Reached・1 Remaining", {NumberedPlaceholder="%1$@", "%2$@","%3$@", "・"} */ +"route.end.not_completed.summary" = "%1$@ از %2$@ ایستگاه طی شد・%3$@ باقی مانده"; +/* Accessibility Text displayed for when a route ends but the route was not completed, %1$@ is the number of waypoints reached, %2$@ the total number of waypoints, %3$@ is the number of waypoints remaining, "1 of 3 Waypoints Reached, 1 Remaining", {NumberedPlaceholder="%1$@", "%2$@","%3$@"} */ +"route.end.not_completed.summary.accessibility" = "%1$@ از %2$@ ایستگاه طی شد، %3$@ باقی مانده"; +/* Accessibility label used for the title of a route - The label replaces the dot character used in the "route.title" string with a comma, %1$@ is the name of the route, %2$@ is the index of the current waypoint and %3$@ is the total number of waypoints in the route, "Home to Work, Waypoint 1 of 3", {NumberedPlaceholder="%1$@", "%2$@", "%3$@"} */ +"route.title.accessibility_label" = "%1$@، ایستگاه %2$@ از %3$@"; +/* Title text of the button used to move to the previous waypoint */ +"route_detail.action.previous" = "ایستگاه قبلی"; +/* Hint text of the button used to move to the previous waypoint */ +"route_detail.action.previous.hint" = "برای تنظیم نشانهٔ صوتی روی ایستگاه قبلی دو بار ضربه بزنید"; +/* Title text of the button used to move to the next waypoint */ +"route_detail.action.next" = "ایستگاه بعدی"; +/* Hint text of the button used to move to the next waypoint */ +"route_detail.action.next.hint" = "برای تنظیم نشانهٔ صوتی روی ایستگاه بعدی دو بار ضربه بزنید"; +/* Text displayed in cluster annotations on the map. %@ is the index of the first clustered annotation and the +... indicates that there are additional annotations in that cluster {NumberedPlaceholder="%@"} */ +"waypoint_detail.annotation.cluster.title" = "%@،..."; +/* Label for the description edit field */ +"route_detail.edit.description" = "توضیحات"; +/* Default text used in the description edit field */ +"route_detail.edit.description.default" = "توضیحاتی درباره مسیر خود اضافه کنید"; +/* Label for the add waypoints button */ +"route_detail.edit.waypoints_button" = "افزودن ایستگاه‌ها"; +/* Label for the name edit field */ +"route_detail.edit.waypoints_label" = "ایستگاه‌ها"; +/* Label for the delete button */ +"route_detail.edit.delete" = "حذف مسیر"; +/* Title for the alert to confirm deleting route */ +"route_detail.edit.delete.title" = "آیا مطمئنید که می‌خواهید این مسیر را حذف کنید؟"; +/* Message for the alert to confirm deleting route */ +"route_detail.edit.delete.message" = "این عمل قابل بازگشت نیست."; +/* Title for the alert to confirm discarding unsaved changes */ +"route_detail.edit.cancel.title" = "تغییرات ذخیره‌نشده"; +/* Message for the alert to confirm discarding unsaved changes */ +"route_detail.edit.cancel.message" = "آیا مطمئنید که می‌خواهید تغییرات خود را نادیده بگیرید؟"; +/* Title displayed in the beacon view */ +"route_detail.beacon.title" = "مسیر هدایت‌شده"; +/* Title displayed for orienteering activities */ +"route_detail.orienteering.title" = "مسیریابی"; +/* Title of button to end a route */ +"route_detail.beacon.stop" = "پایان مسیر"; +/* Title for the alert when reversing a route fails */ +"route_detail.reverse.error.title" = "معکوس کردن مسیر ناموفق بود"; +/* Message for the alert when reversing a route fails */ +"route_detail.reverse.error.message" = "هنگام تلاش برای معکوس کردن مسیر خطایی رخ داد. لطفاً دوباره امتحان کنید."; +/* Title for the alert displayed when a route or tour is updated */ +"route.update.success.title" = "به‌روزرسانی کامل شد!"; +/* Message for the alert displayed when a route or tour is updated */ +"route.update.success.message" = "فعالیت تفریحی شما به‌روز است"; +/* Title for the alert displayed when a route or tour fails to update */ +"route.update.fail.title" = "به‌روزرسانی ناموفق بود"; +/* Message for the alert displayed when a route or tour fails to update */ +"route.update.fail.message" = "هنگام به‌روزرسانی فعالیت تفریحی شما خطایی رخ داد"; +/* Title for the alert displayed when the route or tour is already updated */ +"route.update.unavailable.title" = "شما به‌روز هستید!"; +/* Message for the alert displayed when the route or tour is already updated */ +"route.update.unavailable.message" = "فعالیت تفریحی شما از قبل به‌روز است"; +//------------------------------------------------------------------------------ +// MARK: - Tour Detail +//------------------------------------------------------------------------------ +/* Title displayed in the beacon view */ +"tour_detail.beacon.title" = "تور هدایت‌شده"; +/* Title of button to end a tour */ +"tour_detail.beacon.stop" = "پایان تور"; +/* Title of a waypoint */ +"waypoint.title" = "ایستگاه"; +/* Tells the user the current distance to the waypoint, %@ is the distance, "Waypoint, 30 meters." {NumberedPlaceholder="%@"} */ +"waypoint.callout" = "ایستگاه، %@."; +/* Accessibility label for the progress view, %1$@ is the waypoint name, %2$@ is the distance, %3$@ is the time elapsed, %4$@ is the number of remaining waypoints, "Beacon set on home. 450 feet NW. 02:31 elapsed. 2 waypoints remaining." {NumberedPlaceholder="%1$@","%2$@","%3$@","%4$@"} */ +"tour.progress.elapsed_distance.accessibility" = "نشانهٔ صوتی روی %1$@ تنظیم شده. %2$@. %3$@ گذشته. %4$@ ایستگاه باقی مانده."; +/* Accessibility label for the progress view, %1$@ is the waypoint name, %2$@ is the distance, %3$@ is the number of remaining waypoints, "Beacon set on home. 450 feet NW. 2 waypoints remaining." {NumberedPlaceholder="%1$@","%2$@","%3$@"} */ +"tour.progress.distance.accessibility" = "نشانهٔ صوتی روی %1$@ تنظیم شده. %2$@. %3$@ ایستگاه باقی مانده."; +/* Accessibility label for the progress view, %1$@ is the waypoint name, %2$@ is the time elapsed, %3$@ is the number of remaining waypoints, "Beacon set on home. 02:31 elapsed. 2 waypionts remaining." {NumberedPlaceholder="%1$@","%2$@","%3$@"} */ +"tour.progress.elapsed.accessibility" = "نشانهٔ صوتی روی %1$@ تنظیم شده. %2$@ گذشته. %3$@ ایستگاه باقی مانده."; +/* Accessibility label for the progress view, %1$@ is the waypoint name, %2$@ is the number of remaining waypoints, "Beacon set on home. 2 waypoints remaining." {NumberedPlaceholder="%1$@","%2$@"} */ +"tour.progress.accessibility" = "نشانهٔ صوتی روی %1$@ تنظیم شده. %2$@ ایستگاه باقی مانده."; +/* Accessibility label for the progress view, %1$@ is the waypoint name, %2$@ is the distance, %3$@ is the time elapsed, "Beacon set on home. 450 feet NW. 02:31 elapsed. 1 waypoint remaining." {NumberedPlaceholder="%1$@","%2$@","%3$@"} */ +"tour.progress.elapsed_distance.accessibility.singular" = "نشانهٔ صوتی روی %1$@ تنظیم شده. %2$@. %3$@ گذشته. ۱ ایستگاه باقی مانده."; +/* Accessibility label for the progress view, %1$@ is the waypoint name, %2$@ is the distance, "Beacon set on home. 450 feet NW. 1 waypoint remaining." {NumberedPlaceholder="%1$@","%2$@"} */ +"tour.progress.distance.accessibility.singular" = "نشانهٔ صوتی روی %1$@ تنظیم شده. %2$@. ۱ ایستگاه باقی مانده."; +/* Accessibility label for the progress view, %1$@ is the waypoint name, %2$@ is the time elapsed, "Beacon set on home. 02:31 elapsed. 1 waypoint remaining." {NumberedPlaceholder="%1$@","%2$@"} */ +"tour.progress.elapsed.accessibility.singular" = "نشانهٔ صوتی روی %1$@ تنظیم شده. %2$@ گذشته. ۱ ایستگاه باقی مانده."; +/* Accessibility label for the progress view, %@ is the waypoint name, "Beacon set on home. 1 waypoint remaining." {NumberedPlaceholder="%@"} */ +"tour.progress.accessibility.singular" = "نشانهٔ صوتی روی %@ تنظیم شده. ۱ ایستگاه باقی مانده."; +/* Voiceover label when audio is available for a given waypoint */ +"waypoint.audio_available" = "صدا در دسترس است"; +/* Voiceover label when images are available for a given waypoint */ +"waypoint.images_available" = "تصاویر در دسترس است"; +/* Voiceover label when images and audio are available for a given waypoint */ +"waypoint.audio_images_available" = "تصاویر و صدا در دسترس است."; +/* Voiceover label to callout the current waypoint */ +"waypoint.callout.button.title" = "اعلام ایستگاه"; +/* Voiceover hint to callout the current waypoint */ +"waypoint.callout.button.hint" = "برای شنیدن جزئیات بیشتر دو بار ضربه بزنید"; +//------------------------------------------------------------------------------ +// MARK: - Recommender +//------------------------------------------------------------------------------ +/* Title displayed on the view that recommends features to users */ +"recommender.view.title" = "پیشنهاد"; +//------------------------------------------------------------------------------ +// MARK: - First Use Experience - Sharing +//------------------------------------------------------------------------------ +/* Title of the alert that will be displayed the first time that the user shares a marker or route in Soundscape */ +"first_use_experience.share.alert.title" = "اشتراک‌گذاری در Soundscape"; +/* Message of the alert that will be displayed the first time that the user shares a marker or route in Soundscape */ +"first_use_experience.share.alert.message" = "وقتی یک نشانگر یا مسیر Soundscape را به اشتراک می‌گذارید، شما در حال اشتراک‌گذاری مکان‌های مرتبط با آن نشانگر یا مسیر هستید. شما باید فقط با افرادی که به آن‌ها اعتماد دارید به اشتراک بگذارید."; +//------------------------------------------------------------------------------ +// MARK: - Universal Links +//------------------------------------------------------------------------------ +/* Title for the error alert that is displayed when the app fails to act on a universal link */ +"universal_links.alert.error.title" = "اوه! مشکلی پیش آمد."; +/* Message for the error alert that is displayed when the app fails to act on a universal link */ +"universal_links.alert.import_error.message" = "به نظر می‌رسد لینک نامعتبر است."; +/* Message for the error alert that is displayed when the app fails to create and share a universal link */ +"universal_links.alert.share_error.message" = "این محتوا قابل اشتراک‌گذاری نبود."; +/* Alert action to save as marker */ +"universal_links.alert.action.marker" = "ذخیره به عنوان نشانگر"; +/* Alert action to set a beacon */ +"universal_links.alert.action.beacon" = "تنظیم یک نشانهٔ صوتی"; +/* Title for alert that is displayed when importing a marker. Quotes written as " {NumberedPlaceholder="%@"} */ +"universal_links.marker.alert.title" = "شما یک نشانگر دریافت کرده‌اید: «%@»"; +/* Message for alert that is displayed when importing a marker */ +"universal_links.marker.alert.message" = "شما باید فقط از نشانگرهایی استفاده کنید که از طرف فردی قابل اعتماد دریافت کرده‌اید."; +/* Title for alert that is displayed when importing a marker that already exists */ +"universal_links.marker_existing.alert.title" = "نشانگر از قبل وجود دارد"; +/* Title for alert that is displayed when importing a marker that already exists */ +"universal_links.marker_existing.alert.message" = "یک نشانگر از قبل در این مکان وجود دارد. آیا می‌خواهید آن را جایگزین کنید؟"; +/* Message to display alongside a URL that can be used to import a marker. Quotes written as " {NumberedPlaceholder="%@"} */ +"universal_links.marker.share.message" = "یک نشانگر Soundscape با شما به اشتراک گذاشتم! «%@»"; +//------------------------------------------------------------------------------ +// MARK: - User Activities +//------------------------------------------------------------------------------ +/* Referes to the Apple iOS Siri Shortcuts feature. {NumberedPlaceholder="Siri"} */ +"siri_shortcuts.title" = "میان‌برهای سیری"; +/* Referes to the Apple iOS Siri Shortcuts feature in Beta. {NumberedPlaceholder="Siri"} */ +"siri_shortcuts.title.beta" = "میان‌برهای سیری (بتا)"; +/* Referes to the Apple iOS Siri Shortcuts feature. {NumberedPlaceholder="Siri", "Soundscape"} */ +"siri_shortcuts.description" = "پس از افزودن میان‌برهای سیری، قادر خواهید بود با صدای خود آنها را حتی زمانی که Soundscape در حال اجرا نیست، فراخوانی کنید."; +/* Title for an action that can be invoked by a voice command. Users will hear their current location. */ +"user_activity.my_location.title" = "مکان من کجاست؟"; +/* Title for an action that can be invoked by a voice command. Users will hear things around them. */ +"user_activity.around_me.title" = "اطراف من چه خبر است؟"; +/* Title for an action that can be invoked by a voice command. Users will hear things ahead of them. */ +"user_activity.ahead_of_me.title" = "جلوی من چه خبر است؟"; +/* Title for an action that can be invoked by a voice command. Users will hear markers nearby. */ +"user_activity.nearby_markers.title" = "شنیدن نشانگرهای نزدیک"; +/* Title for an action that can be invoked by a voice command. Users will be navigated to the search screen. */ +"user_activity.search.title" = "جستجو در Soundscape"; +/* Title for an action that can be invoked by a voice command. The app will save a marker with the user's current location. */ +"user_activity.save_marker.title" = "ذخیره نشانگر"; +/* Title for an action that can be invoked by a voice command. The app will start Street Preview from the current location. */ +"user_activity.street_preview.title" = "شروع پیش‌نمایش خیابان"; +//------------------------------------------------------------------------------ +// MARK: - URL Resources (Soundscape Custom Documents) +//------------------------------------------------------------------------------ +/* Message to display alongside a URL that can be used to import a marker. Quotes written as " {NumberedPlaceholder="%@"} */ +"url_resource.alert.route.share.message" = "یک مسیر Soundscape با شما به اشتراک گذاشتم! «%@»"; +/* Title for alert that is displayed when importing a route. Quotes written as " {NumberedPlaceholder="%@"} */ +"url_resource.alert.route.import.title" = "شما یک مسیر دریافت کرده‌اید: «%@»"; +/* Message for alert that is displayed when importing a route */ +"url_resource.alert.route.import.message" = "شما باید فقط از مسیرهایی استفاده کنید که از طرف فردی قابل اعتماد دریافت کرده‌اید. مسیرها توسط جامعه Soundscape ایجاد، به اشتراک گذاشته یا بررسی نمی‌شوند و ممکن است حاوی خطا باشند."; +/* Title for alert that is displayed when importing an existing route. */ +"url_resource.alert.route.import_existing.title" = "مسیر از قبل وجود دارد"; +/* Message for alert that is displayed when importing an existing route */ +"url_resource.alert.route.import_existing.message" = "آیا می‌خواهید آن را جایگزین کنید؟ جایگزینی این مسیر، نشانگرهای استفاده شده در این مسیر را نیز جایگزین خواهد کرد."; +/* Save action for alert that is displayed when importing a route */ +"url_resource.alert.route.import.save" = "ذخیره مسیر"; +/* Message for the error alert that is displayed when the app fails to act on a URL resource */ +"url_resource.alert.route.import_error.message" = "به نظر می‌رسد محتوا نامعتبر است."; +//------------------------------------------------------------------------------ +// MARK: - Routes +//------------------------------------------------------------------------------ +/* Title of the option for displaying a the user's list of saved routes */ +"routes.title" = "مسیرها"; +/* Button, Route deleted */ +"routes.action.deleted" = "مسیر حذف شد"; +/* Error message, We are unable to delete this marker. Try again later */ +"routes.action.deleted_error" = "در حال حاضر قادر به حذف این مسیر نیستیم. لطفاً بعداً دوباره امتحان کنید."; +/* Title of the view that is shown when the user navigates to the routes list, but they have not yet created any routes */ +"routes.no_routes.title" = "شروع کار با ایستگاه‌های مسیر"; +/* This text is displayed to the user when they navigate to the routes list but have not yet created any routes. It explains how a route is a set of ordered markers. */ +"routes.no_routes.hint.1" = "با سازماندهی مجموعه‌ای از نشانگرها به عنوان ایستگاه در یک مسیر، برای خود یا دیگران مسیری ایجاد کنید."; +/* This text is displayed to the user when they navigate to the routes list but have not yet created any routes. It explains that the beacon will automatically shift between the route waypoints as they walk the route. */ +"routes.no_routes.hint.2" = "هنگامی که با Soundscape در مسیر خود هستید، با رسیدن به هر ایستگاه به شما اطلاع داده می‌شود و نشانهٔ صوتی به طور خودکار به ایستگاه بعدی منتقل می‌شود."; +/* Text for the first paragraph displayed when the waypoints list is empty for a route */ +"route.no_waypoints.hint.1" = "مسیر خود را نامگذاری کرده و یک توضیح اختیاری اضافه کنید. سپس می‌توانید ایستگاه‌ها را در حین حرکت اضافه کنید یا آنها را از لیست نشانگرهای خود انتخاب کنید."; +/* Text for the second paragraph displayed when the waypoints list is empty for a route */ +"route.no_waypoints.hint.2" = "شما می‌توانید ترتیب ایستگاه‌ها را در یک مسیر در هر زمان با ویرایش مسیر تغییر دهید."; +/* Title for the route tutorial screen */ +"routes.tutorial.title" = "در طول سفر خود ایستگاه‌هایتان را بشنوید"; +/* Explanation of the route guidance feature that is presented to the user the first time that they try to start route guidance {NumberedPlaceholder="Soundscape"} */ +"routes.tutorial.details" = "شما اکنون به صفحه اصلی Soundscape باز خواهید گشت و یک نشانهٔ صوتی روی اولین ایستگاه شما قرار خواهد گرفت. وقتی به ایستگاه می‌رسید، نشانهٔ صوتی به ایستگاه بعدی در مسیر شما منتقل می‌شود."; +/* Callout indicating a the user has arrived at the final waypoint in their route and the route experience is now complete. */ +"routes.callout.complete" = "مسیر کامل شد!"; +/* Text for a button that will cause the list of routes to be sorted by their names */ +"routes.sort.by_name" = "مرتب‌سازی بر اساس نام"; +/* VoiceOver hint for a button that will cause the list of routes to be sorted by their names */ +"routes.sort.by_name.hint" = "برای مرتب‌سازی بر اساس نام دو بار ضربه بزنید"; +/* Text for a button that will cause the list of routes to be sorted by their distance from the user */ +"routes.sort.by_distance" = "مرتب‌سازی بر اساس فاصله"; +/* VoiceOver hint for a button that will cause the list of routes to be sorted by their distance from the user */ +"routes.sort.by_distance.hint" = "برای مرتب‌سازی بر اساس فاصله دو بار ضربه بزنید"; +/* Title of an alert for imporing routes */ +"routes.import.alert.title" = "خطای مسیر"; +/* Message of an alert for imporing routes */ +"routes.import.alert.message" = "داده‌های ایستگاه برای یک یا چند مسیر شما موجود نیست. لطفاً مسیرهای زیر را بررسی کرده و در صورت لزوم ایستگاه‌ها را دوباره اضافه کنید."; +/* The reversed Route name format */ +"routes.reverse_name_format" = "معکوس %@"; +//------------------------------------------------------------------------------ +// MARK: - Markers +//------------------------------------------------------------------------------ +/* Title, Markers See Terms defintion of Marker(s) */ +"markers.title" = "نشانگرها"; +/* Button, Delete Marker */ +"markers.action.delete" = "حذف نشانگر"; +/* Button, Marker deleted */ +"markers.action.deleted" = "نشانگر حذف شد"; +/* Error message, We are unable to delete this marker. Try again later */ +"markers.action.deleted_error" = "در حال حاضر قادر به حذف این نشانگر نیستیم. لطفاً بعداً دوباره امتحان کنید."; +/* Error Message, We are having trouble updating this marker. Try again later. */ +"markers.action.update_error" = "در حال حاضر در به‌روزرسانی این نشانگر با مشکل مواجه هستیم. لطفاً بعداً دوباره امتحان کنید."; +/* Button, Add to Markers */ +"markers.action.add_to_markers" = "افزودن به نشانگرها"; +/* Sort by category, Name. Used when a user is presented an option to sort a location list by name. */ +"markers.sort_button.sort_by_name" = "نام"; +/* Sort by category, Name. This is the voiceover label used when a user a location list is sorted by name. */ +"markers.sort_button.sort_by_name.voiceover" = "مرتب شده بر اساس نام"; +/* Sort by category, Distance. Used when a user is presented an option to sort a location list by distance. */ +"markers.sort_button.sort_by_distance" = "فاصله"; +/* Sort by category, Distance. This is the voiceover label used when a user a location list is sorted by distance. */ +"markers.sort_button.sort_by_distance.voiceover" = "مرتب شده بر اساس فاصله"; +/* Title, No Markers Yet! */ +"markers.no_markers.title" = "شروع کار با نشانگرها"; +/* Text that explains to the user what "markers" are and how they can be used. Ensure "Save as Marker" is translated to be the same as "universal_links.alert.action.marker". Quotes written as " */ +"markers.no_markers.hint.1" = "برای مقاصد مورد علاقه خود، ایستگاه‌های یک مسیر، یا هر مکانی که می‌خواهید اعلام شود، نشانگر ایجاد کنید. به سادگی یک مکان، یا حتی مکان فعلی خود را، از صفحه اصلی انتخاب کرده و «ذخیره به عنوان نشانگر» را انتخاب کنید."; +/* Additional text that explains how users can use markers. This string is displayed below the string with key "markers.no_markers.hint.1" */ +"markers.no_markers.hint.2" = "سعی کنید خانه، ورودی محل کار، یا مکان مورد علاقه خود در پارک را نشانه‌گذاری کنید."; +/* Title, Save Marker */ +"markers.edit_screen.title.save" = "ذخیره نشانگر"; +/* Title, Edit Marker */ +"markers.edit_screen.title.edit" = "ویرایش نشانگر"; +/* Notification, Double tap to save this marker */ +"markers.edit_screen.done_button.acc_hint" = "برای ذخیره این نشانگر دو بار ضربه بزنید"; +/* This is a label that is displayed on the Save Marker screen when the user is saving a new marker and adding it to a route. %@ is the name of the route. Example: "Saving to Route: Home to Grocery Store" (where "Home to Grocery Store" is the name of a route the user created {NumberedPlaceholder="%@"} */ +"markers.edit_screen.route" = "در حال ذخیره در مسیر: %@"; +/* Button, Marker See Terms definition of Marker(s) */ +"markers.generic_name" = "نشانگر"; +/* Marker Information, %@ is the name of the marker, "Marker. " {NumberedPlaceholder="%@"} */ +"markers.marker_with_name" = "نشانگر. %@"; +/* Notification, Marker created */ +"markers.marker_created" = "نشانگر ایجاد شد"; +/* Marker Information, %@ is the localized date and time, "Marker created on " {NumberedPlaceholder="%@"} */ +"markers.marker_created_on" = "نشانگر در %@ ایجاد شد"; +/* Marker Information, %1$@ is distance with units and %2$@ is a point of interest, "Marker <120 feet> from " {NumberedPlaceholder="%1$@", "%2$@"} */ +"markers.marker_distance_from_poi" = "نشانگر %1$@ از %2$@"; +/* Marker Information, %@ is a location, "Marker at " {NumberedPlaceholder="%@"} */ +"markers.marker_at" = "نشانگر در %@"; +/* Marker Information, %@ is a street name, "Marker along " {NumberedPlaceholder="%@"} */ +"markers.marker_along" = "نشانگر در امتداد %@"; +/* Represents a marker that is new in a list view. %@ is a location. "New. " {NumberedPlaceholder="%@"} */ +"markers.new_badge.acc_label" = "جدید. %@"; +/* Marker alert, Are you sure you want to delete this marker? */ +"markers.destructive_delete_message" = "آیا مطمئنید که می‌خواهید این نشانگر را حذف کنید؟"; +/* Marker Information, This marker is part of the following routes: Route A, Route B. Use "\n" to represent a new line character. {NumberedPlaceholder="\n"} */ +"markers.destructive_delete_message.routes" = "این نشانگر بخشی از مسیرهای زیر است:\n%@"; +/* A marker property that allows users to leave a custom explanation or comment on the marker */ +"markers.annotation" = "یادداشت"; +//------------------------------------------------------------------------------ +// MARK: - Search +//------------------------------------------------------------------------------ +/* Search results, No results found. Edit text or press Search for more. */ +"search.no_results_found_with_action" = "نتیجه‌ای یافت نشد. متن را ویرایش کنید یا برای گزینه‌های بیشتر جستجو را فشار دهید."; +/* Search results, No results Found. Try editing your search term. */ +"search.no_results_found_with_hint" = "نتیجه‌ای یافت نشد. عبارت جستجوی خود را ویرایش کنید."; +/* Search results, No results found. */ +"searching.no_results_found_title" = "اوه! نتیجه‌ای یافت نشد"; +/* Search results, No results found. */ +"searching.no_results_found_message" = "اگر به دنبال مکان خاصی هستید، می‌توانید با نام یا آدرس جستجو کنید."; +/* Search results, No results found when offline. */ +"searching.offline" = "جستجو در حالت آفلاین غیرفعال است"; +/* Search Entry, %@ is a location or address, "Search for "Woodland Park Zoo"" Quotes written as " {NumberedPlaceholder="%@"} */ +"search.search_for" = "جستجو برای «%@»"; +/* Notification, Searching */ +"search.searching" = "در حال جستجو"; +/* Notification, Searching... */ +"search.searching_with_punctuation" = "در حال جستجو…"; +/* Description text for the search field, "destination" should be translated the same as it is in "first_launch.prompt.message" */ +"search.choose_destination" = "انتخاب مقصد"; +/* Search result, %@ results found. First result: %@ */ +"search.results_found_first_result" = "%@ نتیجه یافت شد. اولین نتیجه: %@"; +/* Error Message, e there are any places nearby. If you're looking for a specific place, you can try searching by name or address */ +"search.no_results_found_error" = "به نظر نمی‌رسد مکان‌های نزدیکی وجود داشته باشد. اگر به دنبال مکان خاصی هستید، می‌توانید با نام یا آدرس جستجو کنید."; +/* Search using current location */ +"search.use_current_location" = "مکان فعلی"; +/* Nearby Places screen title */ +"search.nearby.screen_title" = "مکان‌های نزدیک"; +/* Browse your markers */ +"search.view_markers" = "نشانگرها و مسیرها"; +/* Accessibility hint when the user selects the markers button on the home screen */ +"search.button.markers.accessibility_hint" = "برای انتخاب یا ویرایش نشانگرها و مسیرهای ذخیره شده خود دو بار ضربه بزنید"; +/* Accessibility hint when the user selects the nearby places button on the home screen */ +"search.button.nearby.accessibility_hint" = "برای کاوش رستوران‌ها، ایستگاه‌های حمل‌ونقل و موارد دیگر در نزدیکی دو بار ضربه بزنید"; +/* Accessibility hint when the user selects the current location button on the home screen */ +"search.button.current_location.accessibility_hint" = "برای پیش‌نمایش، نشانه‌گذاری یا اشتراک‌گذاری مکان فعلی خود با یک دوست دو بار ضربه بزنید"; +/* Search filter alert title */ +"filter.alert_title" = "فیلتر کردن مکان‌ها بر اساس دسته‌بندی"; +/* Set filter */ +"filter.set" = "اعمال فیلتر"; +/* Clear filter */ +"filter.clear.capital" = "پاک کردن فیلتر"; +/* Accessibility hint for the "Clear Filter" button */ +"filter.clear.hint" = "برای پاک کردن فیلتر انتخاب شده دو بار ضربه بزنید"; +/* Search filter button description */ +"filter.double_tap_places_category" = "برای فیلتر کردن مکان‌ها بر اساس دسته‌بندی دو بار ضربه بزنید"; +/* Filters, All Places */ +"filter.all" = "همه مکان‌ها"; +/* Filters, Transit */ +"filter.transit" = "حمل و نقل عمومی"; +/* Filters, Food & Drink */ +"filter.food_drink" = "غذا و نوشیدنی"; +/* Filters, Parks */ +"filter.parks" = "پارک‌ها"; +/* Filter, Things To Do */ +"filter.things_to_do" = "کارهایی برای انجام دادن"; +/* Filters, Groceries & Convenience Stores */ +"filter.groceries" = "خواربارفروشی‌ها و فروشگاه‌های رفاه"; +/* Filters, Banks & ATMs */ +"filter.banks" = "بانک‌ها و عابربانک‌ها"; +/* Filters, NaviLens Codes */ +"filter.navilens" = "کدهای NaviLens"; +/* Displayed next to the name of the filter to indicate that the filter is currently selected. %@ is the name of a filter */ +"filter.selected" = "%@ (انتخاب شده)"; +/* Message displayed when category filters are not available, %@ is a placeholder for the value of the filter.all translated string, Quotes written as " {NumberedPlaceholder="%@"} */ +"filter.not_available" = "برخی از فیلترهای دسته‌بندی در دسترس نیستند. شما همچنان می‌توانید با انتخاب «%@» مکان‌های اطراف را مرور کنید."; +//------------------------------------------------------------------------------ +// MARK: - Callouts +//------------------------------------------------------------------------------ +/* Title for the button panel at the bottom of the home view */ +"callouts.panel.title" = "شنیدن محیط اطرافم"; +/* Button, Turn all callouts on or off */ +"callouts.turn_on_off" = "روشن یا خاموش کردن همه اعلان‌های صوتی"; +/* Button, Callouts On */ +"callouts.callouts_on" = "اعلان‌های صوتی روشن"; +/* Button, Callouts Off */ +"callouts.callouts_off" = "اعلان‌های صوتی خاموش"; +/* Button, Allow Callouts */ +"callouts.allow_callouts" = "اجازه دادن به اعلان‌های صوتی"; +/* Callouts Title, Places and Landmarks */ +"callouts.places_and_landmarks" = "مکان‌ها و نقاط شاخص"; +/* Callouts Information, Nearby places like shops and restaurants */ +"callouts.places_and_landmarks.info" = "مکان‌های نزدیک مانند فروشگاه‌ها و رستوران‌ها"; +/* Callouts Title, Mobility. Mobility: "The ability to move or be moved freely." */ +"callouts.mobility" = "جابجایی"; +/* Callouts Information, Intersection and transportation information */ +"callouts.mobility.info" = "اطلاعات تقاطع و حمل و نقل"; +/* Title for a toggle under the Manage Callouts settings section. This toggle enables or disables periodic callouts that inform the user about their distance from the location of the audio beacon. */ +"callouts.audio_beacon" = "فاصله تا نشانهٔ صوتی"; +/* Callouts Information, Updates about didtance to the audio beacon when it's set */ +"callouts.audio_beacon.info" = "به‌روزرسانی‌ها درباره فاصله تا نشانهٔ صوتی هنگام تنظیم بودن آن"; +/* Shake callouts */ +"callouts.shake_callouts" = "تکرار اعلان‌های صوتی"; +/* Shake callouts info */ +"callouts.shake_callouts.info" = "برای تکرار آخرین اعلان صوتی، دستگاه را تکان دهید"; +/* Callouts Title, Automatic Callouts */ +"callouts.automatic_callouts" = "اعلان‌های صوتی خودکار"; +/* Callout Title, Intersection Callout */ +"callouts.intersection_callout" = "اعلان صوتی تقاطع"; +/* Callouts Title, Ahead of You */ +"callouts.ahead_of_you" = "جلوی شما"; +/* Callouts Title, Around you */ +"callouts.around_you" = "اطراف شما"; +/* Callouts Title, Marked Points */ +"callouts.marked_points" = "نقاط نشانه‌گذاری شده"; +/* Callouts notification, There is nothing to call out right now */ +"callouts.nothing_to_call_out_now" = "در حال حاضر چیزی برای اعلام وجود ندارد."; +/* Callouts Title, Nearby Markers */ +"callouts.nearby_markers" = "نشانگرهای نزدیک"; +/* Callouts notification, There are no nearby markers to call out right now. Use "nearby markers" from callouts.nearby_markers. */ +"callouts.no_nearby_markers_to_call_out_now" = "در حال حاضر هیچ نشانگر نزدیکی برای اعلام وجود ندارد."; +/* Callouts Button, Repeat. Used as a button title or an action name in order to repeat the last heard audio. */ +"callouts.action.repeat" = "تکرار"; +/* Callouts Button, More Info */ +"callouts.action.more_info" = "اطلاعات بیشتر"; +/* Callouts notification, A hardware device only has a certain amount of battery remaining, %1$@ name of device %2$@ percent of battery remaining, "Soundscape remote only has 20 percent battery remaining." {NumberedPlaceholder="%1$@", "%2$@"} */ +"callouts.hardware.low_battery" = "%1$@ فقط %2$@ درصد باتری باقی مانده دارد."; +/* Title for callouts that happen when departing a location */ +"callouts.departure" = "اعلان صوتی عزیمت"; +/* Title for callouts that happen when arriving to a location */ +"callouts.arrival" = "اعلان صوتی رسیدن"; +//------------------------------------------------------------------------------ +// MARK: - Sleep/Snooze +//------------------------------------------------------------------------------ +/* Sleep Title, Putting the app in an idle state that is interrupted by movement. */ +"sleep.snoozing" = "در حال چرت زدن"; +/* Sleep Title, Sleep. Putting the app in an idle state for a period of time. */ +"sleep.sleep" = "خواب"; +/* App is currently Sleeping. Putting the app in an idle state for a period of time. */ +"sleep.sleeping" = "در حالت خواب"; +/* Sleep Notification, the app is currently in snoozing mode. When you leave your current location, the app will automatically wake up. "Location Services" refers to the feature of the same name in iOS. It should be translated in the same manner that it is in the Settings app under Settings > Privacy > Location Services. {NumberedPlaceholder="Soundscape"} */ +"sleep.snoozing.message" = "Soundscape در حال حاضر در حال چرت زدن است. وقتی از مکان فعلی خود خارج شوید، Soundscape به طور خودکار بیدار خواهد شد. این کار از خدمات موقعیت مکانی در حالت کم‌مصرف برای صرفه‌جویی در باتری گوشی شما استفاده می‌کند. برای بیدار شدن فوری، روی دکمه زیر ضربه بزنید."; +/* Sleep Notification, the app is currently in sleep mode. This prevents Soundscape from using your location information or downloading data. This conserves battery when you are not using the app. Tap the button below to wake the app. "Location Services" refers to the feature of the same name in iOS. It should be translated in the same manner that it is in the Settings app under Settings > Privacy > Location Services. {NumberedPlaceholder="Soundscape"} */ +"sleep.sleeping.message" = "Soundscape در حال حاضر در حالت خواب است. این کار از استفاده Soundscape از خدمات موقعیت مکانی یا دانلود داده‌ها جلوگیری می‌کند. این کار هنگام عدم استفاده از Soundscape باعث صرفه‌جویی در باتری می‌شود. برای بیدار کردن Soundscape روی دکمه زیر ضربه بزنید."; +/* Sleep Notification, Double tap to put Soundscape to sleep. Putting the app in an idle state for a period of time. {NumberedPlaceholder="Soundscape"} */ +"sleep.sleep.acc_hint" = "برای قرار دادن Soundscape در حالت خواب دو بار ضربه بزنید"; +/* Sleep Button, restore the app from a sleep (idle) state when a user leaves his location. */ +"sleep.wake_up_when_i_leave" = "وقتی از اینجا رفتم بیدار شو"; +/* Sleep Button, restore the app from a sleep (idle) state. */ +"sleep.wake_up_now" = "همین الان بیدار شو"; +/* Sleep Button, similar to sleep.wake_up_when_i_leave. Text that is shown in a small round button. It should be constrained to two lines with up to 12 characters each. Use "\n" to represent a new line character. {NumberedPlaceholder="\n"} */ +"sleep.ui.wake_on_leave" = "بیدار شو\nهنگام خروج"; +/* Sleep Button, similar to sleep.wake_up_now. Text that is shown in a small round button. It should be constrained to two lines with up to 12 characters each. Use "\n" to represent a new line character. {NumberedPlaceholder="\n"} */ +"sleep.ui.wake_up_now" = "همین الان\nبیدار شو"; +//------------------------------------------------------------------------------ +// MARK: - Intersections +//------------------------------------------------------------------------------ +/* Notification, Approaching Intersection */ +"intersection.approaching_intersection" = "نزدیک شدن به تقاطع"; +/* Notification, %1$@ is a road name, %2$@ is the distance with units and %3$@ is the orientation, "Intersection with <5 meters> " {NumberedPlaceholder="%1$@", "%2$@","%3$@"} */ +"directions.intersection_with_name_distance_direction" = "تقاطع با %1$@ در فاصله %2$@ %3$@"; +/* Notification, %1$@ is a road name, %2$@ is the distance with units, "Intersection with <5 meters> away" {NumberedPlaceholder="%1$@", "%2$@"} */ +"directions.intersection_with_name_distance" = "تقاطع با %1$@ در فاصله %2$@"; +/* Notification, %1$@ is a road name, %2$@ is the orientation, "Intersection with ahead" {NumberedPlaceholder="%1$@", "%2$@"} */ +"directions.intersection_with_name_direction" = "تقاطع با %1$@ در %@"; +/* Notification, %@ is a road name, "Intersection with nearby" {NumberedPlaceholder="%@"} */ +"directions.intersection_with_name" = "تقاطع با %@ در نزدیکی"; +/* Notification past tense, %1$@ is a road name, %2$@ is the distance with units and %3$@ is the orientation, "Intersection with was <5 meters> " {NumberedPlaceholder="%1$@", "%2$@", "%3$@"} */ +"directions.intersection_with_name_was_distance_direction" = "تقاطع با %1$@ در فاصله %2$@ %3$@ بود"; +/* Notification, %@ will be a localized string with two or more roads, " Intersection" or " Intersection" {NumberedPlaceholder="%@"} */ +"intersection.named_intersection" = "تقاطع %@"; +//------------------------------------------------------------------------------ +// MARK: - Directions +//------------------------------------------------------------------------------ +/* Notification, %@ is a point of interest, "At Starbucks" {NumberedPlaceholder="%@"} */ +"directions.at_poi" = "در %@"; +/* Notification, %@ road name, "Along Pike Street." {NumberedPlaceholder="%@"} */ +"directions.along_road" = "در امتداد %@."; +/* Button, My location */ +"directions.my_location" = "مکان من"; +/* Notification, %@ physical address, "Near address <1600 Pennsylvania Avenue>" {NumberedPlaceholder="%@"} */ +"directions.near_address" = "نزدیک آدرس %@"; +/* Notification, %1$@ is a road name, %2$@ is the distance with units, "Intersects with in <200 feet>" {NumberedPlaceholder="%1$@", "%2$@"} */ +"directions.intersects_with_in" = "با %1$@ در %2$@ تقاطع دارد"; +/* Notification announced to the user that they are near a location, %@ is a physical address or the name of a place, examples: "Near 123 Columbia Street", "Near Starbucks", {NumberedPlaceholder="%@"} */ +"directions.near_name" = "نزدیک %@"; +/* Notification, Address is unknown */ +"directions.unknown_address" = "آدرس نامعلوم است"; +/* Notification, Unknown Road */ +"directions.unknown_road" = "جاده ناشناس"; +/* Button, Previous location */ +"directions.previous_location" = "مکان قبلی"; +/* Notification, %@ road name, "Previous Location, Along " {NumberedPlaceholder="%@"} */ +"directions.previous_location_along" = "مکان قبلی، در امتداد %@"; +/* Notification, Entrance List */ +"directions.amenity.entrance_list" = "لیست ورودی‌ها"; +/* Notification, %1$@ is a road name, %2$@ is the distance with units and %3$@ is the orientation, "Nearest road, , is <5 meters> " {NumberedPlaceholder="%1$@", "%2$@","%3$@"} */ +"directions.nearest_road_name_is_distance_direction" = "نزدیک‌ترین جاده، %1$@، در فاصله %2$@ %3$@ است"; +/* Notification, %1$@ is a road name, %2$@ is the distance with units, "Nearest road, , is <5 meters> away" {NumberedPlaceholder="%1$@", "%2$@"} */ +"directions.nearest_road_name_is_distance" = "نزدیک‌ترین جاده، %1$@، در فاصله %2$@ است"; +/* Notification past tense, %1$@ is a road name, %2$@ is the distance with units and %3$@ is the orientation, "Nearest road, , was <5 meters> " {NumberedPlaceholder="%1$@", "%2$@","%3$@"} */ +"directions.nearest_road_name_was_distance_direction" = "نزدیک‌ترین جاده، %1$@، در فاصله %2$@ %3$@ بود"; +/* Notification, %1$@ is the point of interest, %2$@ is the distance with units, %3$@ is the orientation, " is <5 meters> {NumberedPlaceholder="%1$@", "%2$@","%3$@"} */ +"directions.poi_name_is_distance_direction" = "%1$@ در فاصله %2$@ %3$@ است"; +/* Notification, %1$@ is the point of interest, %2$@ is the distance with units, " is <5 meters> away {NumberedPlaceholder="%1$@", "%2$@"} */ +"directions.poi_name_is_distance" = "%1$@ در فاصله %2$@ است"; +/* Notification past tense, %1$@ is the point of interest, %2$@ is the distance with units and %3$@ is the orientation, " was <5 meters> {NumberedPlaceholder="%1$@", "%2$@","%3$@"} */ +"directions.poi_name_was_distance_direction" = "%1$@ در فاصله %2$@ %3$@ بود"; +/* Notification, %1$@ is a number, %2$@ is the distance with units and %3$@ is the orientation, "Roundabout with <3> exits <5 meters> " {NumberedPlaceholder="%1$@", "%2$@","%3$@"} */ +"directions.roundabout_with_exits_distance_direction" = "میدان با %1$@ خروجی در فاصله %2$@ %3$@"; +/* Notification, %1$@ is a number, and %2$@ is the distance with units, "Roundabout with <3> exits <5 meters> away" {NumberedPlaceholder="%1$@", "%2$@"} */ +"directions.roundabout_with_exits_distance" = "میدان با %1$@ خروجی در فاصله %2$@"; +/* Notification past tense, %1$@ is a number, %2$@ is the distance with units and %3$@ is the orientation, "Roundabout with <3> exits was <5 meters> " {NumberedPlaceholder="%1$@", "%2$@","%3$@"} */ +"directions.roundabout_with_exits_was_distance_direction" = "میدان با %1$@ خروجی در فاصله %2$@ %3$@ بود"; +/* Notification, %1$@ is a number and %2$@ is the orientation, "Roundabout with <3> exits " {NumberedPlaceholder="%1$@", "%2$@"} */ +"directions.roundabout_with_exits_direction" = "میدان با %1$@ خروجی %2$@"; +/* Notification, %1$@ is a number, "Roundabout with <3> exits" {NumberedPlaceholder="%1$@"} */ +"directions.roundabout_with_exits" = "میدان با %1$@ خروجی در نزدیکی"; +/* Notification, %@ is a point of interest, "Approaching " {NumberedPlaceholder="%@"} */ +"directions.approaching_name" = "نزدیک شدن به %@"; +/* Notification, Approaching Roundabout */ +"directions.approaching_roundabout" = "نزدیک شدن به میدان"; +/* Notification, %@ is the name, "Approaching roundabout" {NumberedPlaceholder="%@"} */ +"directions.approaching_name_roundabout" = "نزدیک شدن به میدان %@"; +/* Notification, %@ is the road, " roundabout" {NumberedPlaceholder="%@"} */ +"directions.name_roundabout" = "میدان %@"; +/* Notification, %1$@ is the road and %2$@ is a number, "Approaching roundabout with <3> exits" {NumberedPlaceholder="%1$@", "%2$@"} */ +"directions.approaching_name_roundabout_with_exits" = "نزدیک شدن به میدان %@ با %2$@ خروجی"; +/* Notification, %1$@ is the name and %2$@ is a number, "Approaching with <3> exits" {NumberedPlaceholder="%1$@", "%2$@"} */ +"directions.approaching_name_with_exits" = "نزدیک شدن به %1$@ با %2$@ خروجی"; +/* Notification, %1$@ is the road and %2$@ is a number, " roundabout with <3> exits" {NumberedPlaceholder="%1$@", "%2$@"} */ +"directions.name_roundabout_with_exits" = "میدان %1$@ با %2$@ خروجی"; +/* Notification, %1$@ is the name and %2$@ is a number, " with <3> exits" {NumberedPlaceholder="%1$@", "%2$@"} */ +"directions.name_with_exits" = "%1$@ با %2$@ خروجی"; +/* Notification, %@ street name, ", goes left {NumberedPlaceholder="%@"} */ +"directions.name_goes_left" = "%@، به سمت چپ می‌رود"; +/* Notification, %@ street name, ", goes left in roundabout {NumberedPlaceholder="%@"} */ +"directions.name_goes_left.roundabout" = "%@، در میدان به سمت چپ می‌رود"; +/* Notification, %@ street name, ", goes right {NumberedPlaceholder="%@"} */ +"directions.name_goes_right" = "%@، به سمت راست می‌رود"; +/* Notification, %@ street name, ", goes right in roundabout {NumberedPlaceholder="%@"} */ +"directions.name_goes_right.roundabout" = "%@، در میدان به سمت راست می‌رود"; +/* Notification, %@ street name, ", continues ahead {NumberedPlaceholder="%@"} */ +"directions.name_continues_ahead" = "%@، مستقیم ادامه می‌یابد"; +/* Notification, %@ street name, ", continues ahead in roundabout {NumberedPlaceholder="%@"} */ +"directions.name_continues_ahead.roundabout" = "%@، در میدان مستقیم ادامه می‌یابد"; +/* Notification orientation, ahead. Used as the direction name in sentances such as ", ". */ +"directions.direction.ahead" = "مستقیم"; +/* Notification orientation, ahead to the right. Used as the direction name in sentances such as ", ". */ +"directions.direction.ahead_to_the_right" = "مستقیم به راست"; +/* Notification orientation, to the right. Used as the direction name in sentances such as ", ". */ +"directions.direction.to_the_right" = "به سمت راست"; +/* Notification orientation, behind to the right. Used as the direction name in sentances such as ", ". */ +"directions.direction.behind_to_the_right" = "پشت به راست"; +/* Notification orientation. Used as the direction name in sentances such as ", ". */ +"directions.direction.behind" = "پشت سر"; +/* Notification orientation, behind to the left. Used as the direction name in sentances such as ", ". */ +"directions.direction.behind_to_the_left" = "پشت به چپ"; +/* Notification orientation, to the left. Used as the direction name in sentances such as ", ". */ +"directions.direction.to_the_left" = "به سمت چپ"; +/* Notification orientation, ahead to the left. Used as the direction name in sentances such as ", ". */ +"directions.direction.ahead_to_the_left" = "مستقیم به چپ"; +/* Notification, away, such as 'a location is away' */ +"directions.direction.away" = "فاصله"; +/* Notification, %@ is the point of interest, "Starbucks close by" {NumberedPlaceholder="%@"} */ +"directions.name_close_by" = "%@ در نزدیکی"; +/* Notification, %1$@ is a point of interest and %2$@ is distance with units, " about <5 meters>" {NumberedPlaceholder="%1$@", "%2$@"} */ +"directions.name_about_distance" = "%1$@ حدود %2$@"; +/* Notification, %1$@ is a point of interest and %2$@ is the distance with units, " around <5 meters>" {NumberedPlaceholder="%1$@", "%2$@"} */ +"directions.name_around_distance" = "%1$@ در اطراف %2$@"; +/* Notification, %1$@ is a point of interest and %2$@ is a physical address," is nearby. Street address is " {NumberedPlaceholder="%1$@", "%2$@"} */ +"directions.name_is_nearby_street_address" = "%1$@ در نزدیکی است. آدرس خیابان %@ است."; +/* Notification, %1$@ is a point of interest, %2$@ is distance with units and %3$@ is a physical address, " is currently <5 meters>. Street address is " {NumberedPlaceholder="%1$@", "%2$@","%3$@"} */ +"directions.name_is_currently_street_address" = "%1$@ در حال حاضر %2$@ فاصله دارد. آدرس خیابان %3$@ است."; +/* Notification, %1$@ is a point of interest and %2$@ is a physical address, ". Street address is . Distance unknown." {NumberedPlaceholder="%1$@", "%2$@"} */ +"directions.name_street_address" = "%1$@. آدرس خیابان %2$@ است. فاصله نامعلوم."; +/* Notification at locations with NaviLens codes */ +"directions.navilens_available" = "NaviLens در دسترس است"; +//------------------------------------------------------------------------------ +// MARK: Directions (Traveling with Cardinal Directions) +//------------------------------------------------------------------------------ +/* Traveling in a vehicle such as a train, bus, car with a cardinal direction, %@ is a road name. Whenever the vehicle changes roads, the app will announce a location update by saying the direction the vehicle is travelling in and the name of the road e.g. Travelling east along High Street */ +"directions.traveling.n" = "در حال حرکت به سمت شمال"; +"directions.traveling.ne" = "در حال حرکت به سمت شمال شرقی"; +"directions.traveling.e" = "در حال حرکت به سمت شرق"; +"directions.traveling.se" = "در حال حرکت به سمت جنوب شرقی"; +"directions.traveling.s" = "در حال حرکت به سمت جنوب"; +"directions.traveling.sw" = "در حال حرکت به سمت جنوب غربی"; +"directions.traveling.w" = "در حال حرکت به سمت غرب"; +"directions.traveling.nw" = "در حال حرکت به سمت شمال غربی"; +/* Facing a cardinal direction. If the user is not travelling in a vehicle, or not moving (e.g. on foot) but is stationary along a road somewhere, the application will know which way the user is facing e.g. Facing east along High Street */ +"directions.facing.n" = "رو به شمال"; +"directions.facing.ne" = "رو به شمال شرقی"; +"directions.facing.e" = "رو به شرق"; +"directions.facing.se" = "رو به جنوب شرقی"; +"directions.facing.s" = "رو به جنوب"; +"directions.facing.sw" = "رو به جنوب غربی"; +"directions.facing.w" = "رو به غرب"; +"directions.facing.nw" = "رو به شمال غربی"; +/* Walking with a cardinal direction. If the user is walking and heading along a road in a specific direction then the app will know the direction of travel of the user along that road e.g. Heading east along High Street. This is different to when a user is moving in a vehicle. */ +"directions.heading.n" = "به سمت شمال"; +"directions.heading.ne" = "به سمت شمال شرقی"; +"directions.heading.e" = "به سمت شرق"; +"directions.heading.se" = "به سمت جنوب شرقی"; +"directions.heading.s" = "به سمت جنوب"; +"directions.heading.sw" = "به سمت جنوب غربی"; +"directions.heading.w" = "به سمت غرب"; +"directions.heading.nw" = "به سمت شمال غربی"; +//------------------------------------------------------------------------------ +// MARK: Directions (Traveling Along with Cardinal Directions) +//------------------------------------------------------------------------------ +/* Traveling in a vehicle such as a train, bus, car with a cardinal direction, %@ is a road name. Whenever the vehicle changes roads, the app will announce a location update by saying the direction the vehicle is travelling in and the name of the road e.g. Travelling east along High Street {NumberedPlaceholder="%@"} */ +"directions.along.traveling.n" = "در حال حرکت به سمت شمال در امتداد %@"; +"directions.along.traveling.ne" = "در حال حرکت به سمت شمال شرقی در امتداد %@"; +"directions.along.traveling.e" = "در حال حرکت به سمت شرق در امتداد %@"; +"directions.along.traveling.se" = "در حال حرکت به سمت جنوب شرقی در امتداد %@"; +"directions.along.traveling.s" = "در حال حرکت به سمت جنوب در امتداد %@"; +"directions.along.traveling.sw" = "در حال حرکت به سمت جنوب غربی در امتداد %@"; +"directions.along.traveling.w" = "در حال حرکت به سمت غرب در امتداد %@"; +"directions.along.traveling.nw" = "در حال حرکت به سمت شمال غربی در امتداد %@"; +/* Facing a cardinal direction. If the user is not travelling in a vehicle, or not moving (e.g. on foot) but is stationary along a road somewhere, the application will know which way the user is facing e.g. Facing east along High Street, %@ is a road name {NumberedPlaceholder="%@"} */ +"directions.along.facing.n" = "رو به شمال در امتداد %@"; +"directions.along.facing.ne" = "رو به شمال شرقی در امتداد %@"; +"directions.along.facing.e" = "رو به شرق در امتداد %@"; +"directions.along.facing.se" = "رو به جنوب شرقی در امتداد %@"; +"directions.along.facing.s" = "رو به جنوب در امتداد %@"; +"directions.along.facing.sw" = "رو به جنوب غربی در امتداد %@"; +"directions.along.facing.w" = "رو به غرب در امتداد %@"; +"directions.along.facing.nw" = "رو به شمال غربی در امتداد %@"; +/* Walking with a cardinal direction. If the user is walking and heading along a road in a specific direction then the app will know the direction of travel of the user along that road e.g. Heading east along High Street. This is different to when a user is moving in a vehicle, %@ is a road name {NumberedPlaceholder="%@"} */ +"directions.along.heading.n" = "به سمت شمال در امتداد %@"; +"directions.along.heading.ne" = "به سمت شمال شرقی در امتداد %@"; +"directions.along.heading.e" = "به سمت شرق در امتداد %@"; +"directions.along.heading.se" = "به سمت جنوب شرقی در امتداد %@"; +"directions.along.heading.s" = "به سمت جنوب در امتداد %@"; +"directions.along.heading.sw" = "به سمت جنوب غربی در امتداد %@"; +"directions.along.heading.w" = "به سمت غرب در امتداد %@"; +"directions.along.heading.nw" = "به سمت شمال غربی در امتداد %@"; +//------------------------------------------------------------------------------ +// MARK: Directions (Cardinal Directions) +//------------------------------------------------------------------------------ +/* Direction, North */ +"directions.cardinal.north" = "شمال"; +"directions.cardinal.north_east" = "شمال شرقی"; +"directions.cardinal.east" = "شرق"; +"directions.cardinal.south_east" = "جنوب شرقی"; +"directions.cardinal.south" = "جنوب"; +"directions.cardinal.south_west" = "جنوب غربی"; +"directions.cardinal.west" = "غرب"; +"directions.cardinal.north_west" = "شمال غربی"; +/* Direction, Abbreviation for North */ +"directions.cardinal.north.abb" = "ش"; +"directions.cardinal.north_east.abb" = "ش‌ش"; +"directions.cardinal.east.abb" = "ش"; +"directions.cardinal.south_east.abb" = "ج‌ش"; +"directions.cardinal.south.abb" = "ج"; +"directions.cardinal.south_west.abb" = "ج‌غ"; +"directions.cardinal.west.abb" = "غ"; +"directions.cardinal.north_west.abb" = "ش‌غ"; +//------------------------------------------------------------------------------ +// MARK: - Distance +//------------------------------------------------------------------------------ +/* Notification, %1$@ point of interest %2$@ distance, ", <5 meters>" {NumberedPlaceholder="%1$@", "%2$@"} */ +"directions.name_distance" = "%1$@، %2$@"; +/* Preserve m unit but can translate abbreviation of meter m. Distance string. %@ is a number, "15 m" {NumberedPlaceholder="%@"} */ +"distance.format.m" = "%@ م"; +/* Preserve meter unit - Do not convert but can translate. Distance string, singular. %@ is a singular number, "1 meter" {NumberedPlaceholder="%@"} */ +"distance.format.meter" = "%@ متر"; +/* Preserve meters unit - Do not convert but can translate. Distance string, plural. %@ is a plural number, "15 meters" {NumberedPlaceholder="%@"} */ +"distance.format.meters" = "%@ متر"; +/* Preserve km unit - Do not convert but can translate abbreviation of kilometer. Distance string. %@ is a number, "15 km" {NumberedPlaceholder="%@"} */ +"distance.format.km" = "%@ کیلومتر"; +/* Preserve kilometer unit - Do not convert but can translate. Distance string, singular. %@ is a singular number, "1 kilometer" {NumberedPlaceholder="%@"} */ +"distance.format.kilometer" = "%@ کیلومتر"; +/* Preserve kilometers unit - Do not convert but can translate. Distance string, plural. %@ is a plural number, "15 kilometers" {NumberedPlaceholder="%@"} */ +"distance.format.kilometers" = "%@ کیلومتر"; +/* Preserve ft (Feet Abbreviation) unit - Do not convert but can translate. Distance string. %@ is a number, "15 ft" {NumberedPlaceholder="%@"} */ +"distance.format.ft" = "%@ فوت"; +/* Preserve foot unit - Do not convert but can translate. Distance string, singular. %@ is a singular number, "1 foot" {NumberedPlaceholder="%@"} */ +"distance.format.foot" = "%@ فوت"; +/* Preserve feet unit - Do not convert but can translate. Distance string, plural. %@ is a plural number, "15 feet" {NumberedPlaceholder="%@"} */ +"distance.format.feet" = "%@ فوت"; +/* Preserve mi unit - Do not convert but can translate abbreviation of mile. Distance string. %@ is a number, "15 mi" {NumberedPlaceholder="%@"} */ +"distance.format.mi" = "%@ مایل"; +/* Preserve mile unit - Do not convert but can translate. Distance string, singular. %@ is a singular number, "1 mile" {NumberedPlaceholder="%@"} */ +"distance.format.mile" = "%@ مایل"; +/* Preserve miles unit - Do not convert but can translate. Distance string, plural.%@ is a plural number, "15 miles" {NumberedPlaceholder="%@"} */ +"distance.format.miles" = "%@ مایل"; +//------------------------------------------------------------------------------ +// MARK: - UI +//------------------------------------------------------------------------------ +/* Similar to directions.my_location. Text that is shown in a small square button. It should be constrained to two lines with up to 8 characters each. Use "\n" to represent a new line character. {NumberedPlaceholder="\n"} */ +"ui.action_button.my_location" = "مکان\nمن"; +/* Accessibility Notification, Double tap to hear about your current location. */ +"ui.action_button.my_location.acc_hint" = "برای شنیدن اطلاعات درباره مکان فعلی خود دو بار ضربه بزنید"; +/* Similar to callouts.nearby_markers. Text that is shown in a small square button. It should be constrained to two lines with up to 8 characters each. Use "\n" to represent a new line character. {NumberedPlaceholder="\n"} */ +"ui.action_button.nearby_markers" = "نشانگرهای\nنزدیک"; +/* Accessibility Notification, Double tap to hear about nearby places that you have marked */ +"ui.action_button.nearby_markers.acc_hint" = "برای شنیدن اطلاعات درباره مکان‌های نشانه‌گذاری شده نزدیک دو بار ضربه بزنید"; +/* Similar to help.orient.page_title. Text that is shown in a small square button. It should be constrained to two lines with up to 8 characters each. Use "\n" to represent a new line character. {NumberedPlaceholder="\n"} */ +"ui.action_button.around_me" = "اطراف\nمن"; +/* Accessibility Notification, Double tap to hear about places in the four quadrants around you */ +"ui.action_button.around_me.acc_hint" = "برای شنیدن اطلاعات درباره مکان‌ها در چهار جهت اطراف خود دو بار ضربه بزنید"; +/* Similar to help.explore.page_title. Text that is shown in a small square button. It should be constrained to two lines with up to 8 characters each. Use "\n" to represent a new line character. {NumberedPlaceholder="\n"} */ +"ui.action_button.ahead_of_me" = "جلوی\nمن"; +/* Accessibility Notification, Double tap to hear about places in front of you */ +"ui.action_button.ahead_of_me.acc_hint" = "برای شنیدن اطلاعات درباره مکان‌های جلوی خود دو بار ضربه بزنید"; +/* Title, Menu */ +"ui.menu" = "منو"; +/* VoiceOver hint for the menu button */ +"ui.menu.hint" = "برای باز کردن منو دو بار ضربه بزنید"; +/* Button title, Close Menu */ +"ui.menu.close" = "بستن منو"; +/* Button, Continue */ +"ui.continue" = "ادامه"; +/* Title, Donate */ +"menu.donate" = "حمایت مالی"; +/* Title, Activities, In this context, "Recreational Activity" is referring to outdoor activities like hiking, kayaking, snoeshoeing, etc. */ +"menu.events" = "فعالیت‌های تفریحی"; +/* Title, Head Tracking Headphones, "head tracking headphones" is a term that refers to headphones which include sensors that track a person's head movements */ +"menu.devices" = "هدفون‌های ردیاب سر"; +/* Title, Manage Callouts */ +"menu.manage_callouts" = "مدیریت اعلان‌های صوتی"; +/* Title, Help and Tutorials */ +"menu.help_and_tutorials" = "راهنما و آموزش‌ها"; +/* Title, Send Feedback */ +"menu.send_feedback" = "ارسال بازخورد"; +/* Title, Rate the app in App Store */ +"menu.rate" = "امتیازدهی"; +/* Title, Shows a webpage with resources for learning about how to use Soundscape {NumberedPlaceholder="Soundscape"} */ +"menu.learning_resources" = "وبلاگ Soundscape"; +/* Screen Back button title */ +"ui.back_button.title" = "بازگشت"; +// ... [Remaining sections translated similarly] ... +// The full translation is very long. I will continue from the last point. +//------------------------------------------------------------------------------ +// MARK: UI (Home Screen) +//------------------------------------------------------------------------------ +/* Accessibility label for External GPS Connected */ +"bar_icon.external_GPS.acc_label" = "آیکون اتصال GPS خارجی"; +/* History view, %1$@ is the number of items out of %2$@ total items, "Item <1> of <14>" {NumberedPlaceholder="%1$@", "%2$@"} */ +"history_view.item_of" = "مورد %1$@ از %2$@"; +/* History view, No Callouts Yet */ +"history_view.item_of.no_callouts_yet" = "هنوز هیچ اعلان صوتی وجود ندارد"; +//------------------------------------------------------------------------------ +// MARK: UI (POI Screen) +//------------------------------------------------------------------------------ +/* Title, Select a Location */ +"poi_screen.screen_title.select_a_location" = "یک مکان را انتخاب کنید"; +/* Notification, Loading Nearby Places */ +"poi_screen.loading_title.loading" = "در حال بارگذاری مکان‌های نزدیک"; +/* Error message */ +"poi_screen.loading_title.finding_error" = "اوه! ما در پیدا کردن مکان‌های نزدیک با مشکل مواجه هستیم. لطفاً بعداً دوباره امتحان کنید."; +/* Error message, %@ is a string search quary */ +"poi_screen.loading_title.no_places_matching" = "هیچ مکانی با %@ مطابقت ندارد. فیلتر دیگری را امتحان کنید"; +/* Header, Nearby */ +"poi_screen.section_header.nearby" = "نزدیک"; +/* Accessibility label for a search result that is a suggested search query, %@ suggested search query, "Suggested search: " {NumberedPlaceholder="%@"} */ +"poi_cell.accessibility_label.suggested_search" = "جستجوی پیشنهادی: %@"; +/* Accessibility hint for a search result that is a suggested search query, %@ suggested search query, "Double tap to search for: " {NumberedPlaceholder="%@"} */ +"poi_cell.accessibility_hint.suggested_search" = "برای جستجوی: %@ دو بار ضربه بزنید"; +/* Header for recent callouts section */ +"poi_screen.header.recent.callouts" = "اعلان‌های صوتی اخیر"; +//------------------------------------------------------------------------------ +// MARK: UI (Location Callout Cell) +//------------------------------------------------------------------------------ +/* Location Callout Cell, Marked Location */ +"location_callout_cell.marked_location" = "مکان نشانه‌گذاری شده"; +/* Location Callout Cell for the nearest road, %@ road name, "Nearest road, <27th Avenue West>" {NumberedPlaceholder="%@"} */ +"location_callout_cell.nearest_road" = "نزدیک‌ترین جاده، %@."; +/* Location Callout Cell, Nearest road and beacon set on, %1$@ road name %2$@ location, "Nearest road, <27th Avenue West>. Beacon was set on ." {NumberedPlaceholder="%1$@", "%2$@"} */ +"location_callout_cell.nearest_road.beacon_set_on" = "نزدیک‌ترین جاده، %1$@. نشانهٔ صوتی روی %@ تنظیم شده بود."; +/* Location Callout Cell, Nearest road and nearest point of interest, %1$@ road name %2$@ point of interest, "Nearest road, . Nearest POI, ." {NumberedPlaceholder="%1$@", "%2$@"} */ +"location_callout_cell.nearest_road.nearest_poi" = "نزدیک‌ترین جاده، %1$@. نزدیک‌ترین نقطه مورد علاقه، %@."; +//------------------------------------------------------------------------------ +// MARK: UI (AR Headset) +//------------------------------------------------------------------------------ +/* List of the two supported AirPods versions, {NumberedPlaceholder="Apple AirPods"} */ +"devices.airpods.supported_versions" = "Apple AirPods با صدای فضایی"; +/* Title of the screen displayed to users before they connect to their head tracking headphones which indicates that they need to first pair the device's audio in the iOS settings app */ +"devices.title.pair_audio" = "جفت‌سازی صدای هدفون"; +/* Title of the screen displayed to users when they first connect to their augemented reality headset */ +"devices.title.first_connection" = "هدفون متصل شد"; +/* Title of the screen displayed to users when they need to calibrate their headset */ +"devices.title.calibrate" = "کالیبراسیون هدفون"; +/* Title of the screen displayed to users when they successfully connect their headset */ +"devices.title.completed_connection" = "هدفون آماده است"; +/* Explanation of what head tracking headphones are and how Soundscape uses them. */ +"devices.explain_ar.disconnected" = "هدفون‌های ردیاب سر، هدفون‌های بلوتوثی با حسگرهایی هستند که به Soundscape می‌گویند شما به کدام سمت رو کرده‌اید. این به Soundscape کمک می‌کند تا تجربه صوتی شما را بهبود بخشد و با حرکت شما در جهان، آن را طبیعی‌تر کند.\n\nبرای اتصال یک دستگاه، روی دکمه زیر ضربه بزنید."; +/* Message indicating that the app has successfully been connected to a head tracking headset, {NumberedPlaceholder="AirPods","Soundscape"} */ +"devices.explain_ar.connected.airpods" = "ایرپادهای شما برای استفاده آماده هستند، پس می‌توانید گوشی خود را در جیبتان بگذارید و بروید! Soundscape جهت سر شما را ردیابی می‌کند، بنابراین نیازی به نگه داشتن گوشی در دستتان نیست."; +/* Message indicating that the app has successfully been connected to Bose Frames */ +"devices.explain_ar.connected.boseframes" = "Bose Frames شما برای استفاده آماده هستند، پس می‌توانید گوشی خود را در جیبتان بگذارید و بروید! Soundscape جهت سر شما را ردیابی می‌کند، بنابراین نیازی به نگه داشتن گوشی در دستتان نیست."; +/* Message indicating that the app has successfully been paired to head tracking headphones but is not connected, %@ headset name, "Soundscape is not currently connected to your AirPods Pro. Please ensure your headset is turned on and near your phone." {NumberedPlaceholder="%@"} */ +"devices.explain_ar.paired" = "Soundscape در حال حاضر به %@ شما متصل نیست. لطفاً اطمینان حاصل کنید که هدفون شما روشن و نزدیک گوشی شماست."; +/* Message indicating that the app is connecting to head tracking headphones, %@ headphones name, "Soundscape is connecting to your AirPods. One moment...", {NumberedPlaceholder="Soundscape"} */ +"devices.explain_ar.connecting" = "Soundscape در حال اتصال به %@ شماست. یک لحظه صبر کنید…"; +/* Label for a button that starts the process for connecting a bluetooth head tracking headset to the app */ +"devices.connect_headset" = "اتصال هدفون"; +/* Label of the button users will press when they are ready to start calibrating their AR headset during the initial pairing process */ +"devices.connect_headset.calibrate.button" = "شروع کالیبراسیون"; +/* Message displayed to users explaining that their AR headset needs to be calibrated before use */ +"devices.connect_headset.calibrate.explanation" = "هدفون شما با موفقیت به Soundscape متصل شد اما قبل از استفاده باید کالیبره شود. Soundscape هر زمان که نیاز به کالیبراسیون هدفون باشد، به شما اطلاع خواهد داد، برای مثال هر بار که آن را روشن می‌کنید."; +/* Title of an error message that is shown to the user when connecting to their head tracking headset fails */ +"devices.connect_headset.error_title" = "اتصال ناموفق"; +/* Error message shown to the user when they need to update the firmware on their AR Headphones before they can connect to Soundscape. {NumberedPlaceholder="AR Headphones","Cortana"} */ +"devices.connect_headset.unsupported_firmware" = "هدفون‌های واقعیت افزوده شما قبل از اتصال به Soundscape نیاز به به‌روزرسانی دارند. برای به‌روزرسانی هدفون خود به برنامه Cortana بروید."; +/* Message that is shown to the user when connecting to their head tracking headset fails */ +"devices.connect_headset.failed" = "Soundscape نتوانست به هدفون شما متصل شود. لطفاً بعداً دوباره امتحان کنید."; +/* Message that is shown to the user when connecting to their head tracking headset fails */ +"devices.connect_headset.unavailable" = "دستگاهی که انتخاب کرده‌اید در حال حاضر برای اتصال در دسترس نیست. لطفاً بعداً دوباره امتحان کنید."; +/* Prompt presented to the user when they try to connect to an head tracking headset */ +"devices.connect_headset.explanation" = "نوع هدفون را از لیست هدفون‌های پشتیبانی شده در زیر انتخاب کنید."; +/* Prompt presented to the user before they connect to their headset which indicates that they need to pair to the device through iOS Settings > Bluetooth */ +"devices.connect_headset.audio" = "قبل از اتصال هدفون خود به Soundscape، مطمئن شوید که با گوشی شما جفت شده باشد. اگر هنوز جفت نشده است، به بخش بلوتوث در برنامه تنظیمات iOS بروید تا دستگاه خود را جفت کنید و سپس به Soundscape بازگردید."; +/* Prompt presented to the user when they need to calibrate their device */ +"devices.connect_headset.calibrate" = "هدفون شما نیاز به کالیبراسیون دارد. آنها را از سر خود بردارید، به آرامی برای حدود ۱۰ ثانیه در همه جهات تکان دهید و دوباره روی سر خود قرار دهید. اگر صدای زنگ کالیبراسیون همچنان پخش می‌شود، این کار باید تکرار شود."; +/* Prompt presented to the user when they need to calibrate their device */ +"devices.connect_headset.calibrate.in_ear" = "هدفون شما نیاز به کالیبراسیون دارد. سر خود را به آرامی برای حدود ۱۰ ثانیه در همه جهات تکان دهید. اگر صدای زنگ کالیبراسیون همچنان پخش می‌شود، این کار باید تکرار شود."; +/* Message displayed to the user after they successfully connect Soundscape to their AR headset. {NumberedPlaceholder="AirPods", "Soundscape"} */ +"devices.connect_headset.completed.airpods" = "تبریک! ایرپادهای شما برای استفاده آماده هستند، پس می‌توانید گوشی خود را در جیبتان بگذارید و بروید! Soundscape اکنون جهت سر شما را ردیابی می‌کند، بنابراین نیازی به نگه داشتن گوشی در دستتان نیست. یک کلیک روی دکمه هدفون، نشانهٔ صوتی را بی‌صدا یا باصدا می‌کند، دو کلیک مکان شما را اعلام می‌کند و سه کلیک آخرین اعلان صوتی را تکرار می‌کند."; +/* D.o for Bose Frame (Rondo) */ +"devices.connect_headset.completed.boseframes" = "تبریک! Bose Frames شما برای استفاده آماده هستند، پس می‌توانید گوشی خود را در جیبتان بگذارید و بروید! Soundscape اکنون جهت سر شما را ردیابی می‌کند، بنابراین نیازی به نگه داشتن گوشی در دستتان نیست."; +/* Button label for a button that allows users to test their newly connected headset */ +"devices.connect_headset.completed.test" = "هدفون خود را بررسی کنید"; +/* VoiceOver hint for the button that allows users to test their newly connected headset, %@ is the type of headset, "Double tap to check your AirPods Pro". {NumberedPlaceholder="%@"} */ +"devices.connect_headset.completed.test.hint" = "برای بررسی %@ خود دو بار ضربه بزنید"; +/* Title of the Check Headset screen */ +"devices.test_headset.title" = "بررسی هدفون"; +/* Label explaining to the user that how the headset test works and what they should do */ +"devices.test_headset.explanation" = "ما یک نشانهٔ صوتی در سمت راست شما قرار داده‌ایم. به جایی که هست گوش دهید و سر خود را به سمت آن بچرخانید. توجه کنید که چگونه می‌توانید این کار را حتی زمانی که گوشی شما در جیبتان است انجام دهید. وقتی تمام شد، برای بازگشت به Soundscape روی دکمه زیر ضربه بزنید و از پیاده‌روی بعدی خود با هدفون ردیاب سر جدیدتان لذت ببرید."; +/* Button title for a button that ends the headset testing process and returns the user to Soundscape */ +"devices.test_headset.continue" = "بازگشت به Soundscape"; +/* Announcement that occurs when the user presses the "Check Your Headphones" button */ +"devices.test_headset.callout" = "ما یک نشانهٔ صوتی در سمت راست شما قرار داده‌ایم. به جایی که هست گوش دهید و سر خود را به سمت آن بچرخانید. توجه کنید که چگونه می‌توانید این کار را حتی زمانی که گوشی شما در جیبتان است انجام دهید."; +/* Title of a prompt that is presented to users when they tap the "Forget This Device" button to disconnect and forget a head tracking headset */ +"devices.forget_headset.prompt.forget" = "آیا مطمئن هستید که می‌خواهید این هدفون را فراموش کنید؟"; +/* Explanation provided to the user in the prompt that is displayed when they tap the "Disconnect" button to disconnect from a head tracking headset */ +"devices.forget_headset.prompt.explanation" = "این کار هدفون شما را از Soundscape قطع می‌کند. می‌توانید در آینده دوباره از اینجا به Soundscape متصل شوید."; +/* Callout for when an AR headset has been connected, %@ device name, "AirPods Pro connected." */ +"devices.callouts.connected" = "%@ متصل شد."; +/* Callout for when an AR headset needs to be calibrated */ +"devices.callouts.needs_calibration" = "هدفون شما نیاز به کالیبراسیون دارد. آنها را از سر خود بردارید و به آرامی در همه جهات تکان دهید."; +/* Callout for when an AR headset needs to be calibrated */ +"devices.callouts.needs_calibration.in_ear" = "هدفون شما نیاز به کالیبراسیون دارد. سر خود را به آرامی در همه جهات تکان دهید."; +/* Callout for when an AR headset has successfully calibrated, %@ device name, "Your AirPods Pro require calibration." */ +"devices.callouts.calibrated" = "کالیبراسیون کامل شد"; +/* Callout for when an AR headset disconnects, %@ device name, "AirPods Pro disconnected." */ +"devices.callouts.disconnected" = "%@ قطع شد."; +/* Status announcement when Soundscape is not connected to a head tracking headset */ +"devices.callouts.check_audio.default" = "هدفون ردیاب سر متصل نیست."; +/* Status announcement when Soundscape is connected to a Apple AirPods {NumberedPlaceholder="Apple AirPods"} */ +"devices.callouts.check_audio.airpods" = "Apple AirPods متصل شد."; +/* Status announcement when Soundscape is trying to listen to heading updates from AirPods but they are not currently connected. {NumberedPlaceholder="AirPods", "Soundscape"} */ +"devices.callouts.check_audio.airpods.disconnected" = "Soundscape در حال جستجوی ایرپادهای شماست. مطمئن شوید که به گوشی شما متصل هستند."; +/* */ +"devices.callouts.check_audio.bose_frames" = "Bose Frames متصل شد."; +/* */ +"devices.callouts.check_audio.bose_frames.disconnected" = "Soundscape در حال جستجوی Bose Frames شماست. مطمئن شوید که به گوشی شما متصل هستند."; +/* Label of a button that allows users to force Soundscape to reconnect to their AirPods Pro device if it isn't connecting automatically */ +"devices.troubleshoot.reconnect" = "اتصال مجدد"; +/* Custom alert description displayed when AirPods head tracking is not supported on the given iOS or device {NumberedPlaceholder="Apple AirPods", "iOS 14.4", "iPhone 7"} */ +"devices.airpods_unavailable.alert.description" = "این دستگاه از ردیابی سر با Apple AirPods پشتیبانی نمی‌کند. بررسی کنید که دستگاه شما آیفون ۷ یا جدیدتر باشد و iOS 14.4 یا جدیدتر را اجرا کند."; +/* Title for the alert that is displayed when a head tracking device is available, %@ is the name of the device, "Do you want to enable head tracking with your Apple AirPods?", {NumberedPlaceholder="%@"} */ +"devices.reachability.alert.title" = "ردیابی سر با %@ فعال شود؟"; +/* Description for the alert that is displayed when a head tracking device is available, %@ is the name of the device, {NumberedPlaceholder="Soundscape", "%@"} */ +"devices.reachability.alert.description" = "%@ شما می‌تواند به Soundscape بگوید که به کدام جهت رو کرده‌اید، و این به Soundscape کمک می‌کند تا تجربه صوتی شما را بهبود بخشد. می‌توانید ردیابی سر را در تنظیمات هدفون‌های ردیاب سر فعال کنید."; +//------------------------------------------------------------------------------ +// MARK: Behavior (Route Guidance; formerly "Scavenger Hunt") +//------------------------------------------------------------------------------ +/* Title of the screen that lists all of the downloaded activities. In this context, "activities" is referring to outdoor recreational activities like hiking, kayaking, snoeshoeing, etc. */ +"behavior.experiences.events_list_nav_title" = "فعالیت‌ها"; +/* Title of the screen that lists all of the details for an activity. In this context, "activity" is referring to outdoor recreational activities like hiking, kayaking, snoeshoeing, etc. */ +"behavior.experiences.event_nav_title" = "جزئیات فعالیت"; +/* Title of the screen that lists all of the deatils for a route */ +"behavior.experiences.route_nav_title" = "جزئیات مسیر"; +/* Title for a prompt that gives the user the option to reset or delete an activity. */ +"behavior.experiences.more_actions" = "اقدامات بیشتر"; +/* Title of an error message shown to users when we are unable to download an activity that they clicked a universal link for */ +"behavior.experiences.download_failed.title" = "دانلود فعالیت ناموفق بود"; +/* Error message shown to users when we are unable to download an activity that they clicked a universal link for. "Send Feedback" should be translated the same as the string with key 'menu.send_feedback' */ +"behavior.experiences.download_failed.error" = "تلاش برای دانلود فعالیت ناموفق بود. لطفاً بعداً دوباره امتحان کنید. اگر این مشکل ادامه داشت، از ویژگی «ارسال بازخورد» استفاده کنید یا با سازنده فعالیت تماس بگیرید."; +/* Title of the prompt presented to users when they tap the "Reset" action for an activity. In this context, "activity" is referring to outdoor recreational activities like hiking, kayaking, snoeshoeing, etc. */ +"behavior.experiences.reset.title" = "این فعالیت بازنشانی شود؟"; +/* Title of the accessibility action for reseting the state of an activity. In this context, "activity" is referring to outdoor recreational activities like hiking, kayaking, snoeshoeing, etc. */ +"behavior.experiences.reset_action" = "بازنشانی فعالیت"; +/* Title of the accessibility action for reseting the state of an activity and checking online to see if there are any updates for the activity */ +"behavior.experiences.reset_and_update_action" = "بررسی برای به‌روزرسانی‌ها"; +/* Prompt presented to users when they tap the "Reset" action for an activity. This prompt informs the user what happens when they reset an activity and confirms whether or not they want to proceed. */ +"behavior.experiences.reset.prompt" = "بازنشانی این فعالیت، پیشرفت فعلی شما را حذف می‌کند و به شما امکان می‌دهد این فعالیت را از ابتدا شروع کنید. همچنین می‌توانید برای به‌روزرسانی‌ها بررسی کنید. این کار اطلاعات به‌روز شده برای این فعالیت را در صورت وجود، دانلود می‌کند."; +/* Explanation prompt that tells the users that if they choose to check for updates to the event, the event will be reset and any available updates will be downloaded. */ +"behavior.experiences.updates.prompt" = "اگر هر گونه به‌روزرسانی موجود باشد، این کار این فعالیت را بازنشانی کرده و به‌روزرسانی‌ها را دانلود می‌کند."; +/* Confirmation announcement read out to VoiceOver users after they reset an activity */ +"behavior.experiences.reset.confirmation" = "فعالیت بازنشانی شد"; +/* Title of the accessibility action for deleting a downloaded recreational activity */ +"behavior.experiences.delete_action" = "حذف فعالیت"; +/* Title of an alert warning users when they are about to delete the downloaded data for a recreational activity */ +"behavior.experience.delete.title" = "این فعالیت حذف شود؟"; +/* Text displayed on an alert explaining that if the user selects "Yes" then the downloaded recreational activity data will be deleted */ +"behavior.experience.delete.explanation" = "اگر این فعالیت را حذف کنید، از گوشی شما حذف خواهد شد."; +/* Confirmation announcement read out to VoiceOver users after they delete a recreational activity */ +"behavior.experiences.delete.confirmation" = "فعالیت حذف شد"; +/* Title of a message that indicates the user currently has no recreational activities downloaded, {NumberedPlaceholder="Soundscape"} */ +"behavior.experiences.no_events.title" = "فعالیت‌های تفریحی Soundscape (بتا)"; +/* Text that explains to users what "Recreational Activities" are. "Non-profit organizations" is a term synonymous with "charities" or "non-government organizations" (NGOs). */ +"behavior.experiences.no_events.caption.1" = "سازمان‌های غیرانتفاعی، کسب‌وکارها و دولت‌های محلی می‌توانند تجربیات مبتنی بر Soundscape خود را ایجاد کنند. نمونه‌ها شامل برنامه‌ها و رویدادهای ورزشی تطبیقی، فعالیت‌های گنج‌یابی، مسیرهای منتخب، راهنماهای شهری منتخب و موارد دیگر است."; +/* Text that explains to users that they can contact us if their organization (e.g. non-profit NGO) is interested in creating their own recreational activities {NumberedPlaceholder="yourproduct@yourdomain.com"} */ +"behavior.experiences.no_events.caption.2" = "برای کسب اطلاعات بیشتر یا ابراز علاقه سازمان خود برای ایجاد تجربیات سفارشی Soundscape، لطفاً به ما در yourproduct@yourdomain.com بنویسید"; +/* Title of the route in the Now Playing control on the lock screen, %1$@ route name, %2$@ waypoint name, "Discovery Park Hike: Waypoint 5" {NumberedPlaceholder="%1$@","%2$@"} */ +"behavior.scavenger_hunt.media_player_title" = "%1$@: %2$@"; +/* By line with the name of the author of the scavenger hunt experience, %@ author, "By Author" {NumberedPlaceholder="%@"} */ +"behavior.scavenger_hunt.by_line" = "توسط %@"; +/* Callout indicating a waypoint is nearby, %@ waypoint name, "Some Place is nearby" {NumberedPlaceholder="%@"} */ +"behavior.scavenger_hunt.callout.nearby_with_name" = "%@ در نزدیکی است"; +/* Callout indicating a recreational activity is complete. In this context, "activity" is referring to outdoor recreational activities like hiking, kayaking, snoeshoeing, etc. */ +"behavior.scavenger_hunt.callout.complete" = "فعالیت کامل شد! تبریک!"; +/* Callout indicating the recreational activity experience is ending and the user is being returned to the normal Soundscape experience {NumberedPlaceholder="Soundscape"} */ +"behavior.scavenger_hunt.callout.pausing_hunt" = "بازگشت به تجربه عادی Soundscape."; +/* Callout indicating the current waypoint has changed, %1$@ waypoint name, %2$@ distance to waypoint, %3$@ waypoint index, %4$@ total number of waypoints. "Beacon set on control 1. 450 feet away. 1 of 4." {NumberedPlaceholder="%1$@","%2$@","%3$@","%4$@"} */ +"behavior.scavenger_hunt.callout.next_flag" = "نشانهٔ صوتی روی %1$@ تنظیم شد، %2$@ فاصله، %3$@ از %4$@"; +/* Callout indicating the current waypoint has changed (without distance), %1$@ waypoint name, %2$@ waypoint index, %3$@ total number of waypoints. "Beacon set on control 1. 1 of 4" {NumberedPlaceholder="%1$@","%2$@","%3$@"} */ +"behavior.scavenger_hunt.callout.next_flag.no_distance" = "نشانهٔ صوتی روی %1$@ تنظیم شد، %2$@ از %3$@"; +/* Callout indicating the recreational activity has started. In this context, "activity" is referring to outdoor recreational activities like hiking, kayaking, snoeshoeing, etc. */ +"behavior.scavenger_hunt.callout.started" = "فعالیت شروع شد!"; +/* Text for a badge that indicates that the recreational activity is currently active and running */ +"behavior.experience.badges.active" = "فعال"; +/* Text for a badge that indicates that the recreational activity has already been completed */ +"behavior.experience.badges.complete" = "تکمیل شده"; +/* Text for a badge that indicates that the recreational activity has not yet been completed */ +"behavior.experience.badges.not_complete" = "تکمیل نشده"; +//------------------------------------------------------------------------------ +// MARK: - Time +//------------------------------------------------------------------------------ +/* Time value, Just now */ +"time.just_now" = "همین الان"; +/* Time unit past tense, 1 minute ago */ +"time.one_minute_ago" = "۱ دقیقه پیش"; +/* Time unit past tense, %@ is a number, "<15> minutes ago" {NumberedPlaceholder="%@"} */ +"time.num_minutes_ago" = "%@ دقیقه پیش"; +/* Time unit past tense, 1 hour ago */ +"time.one_hour_ago" = "۱ ساعت پیش"; +/* Time unit past tense, Over 1 hour ago */ +"time.over_one_hour_ago" = "بیش از ۱ ساعت پیش"; +/* Notification, %@ is a point of interest, "Announced " {NumberedPlaceholder="%@"} */ +"announced_name" = "اعلام شد %@."; +/* Notification, %1$@ is a point of interest, %2$@ is time ago. ", announced <1 minute ago>." {NumberedPlaceholder="%1$@", "%2$@"} */ +"announced_name.named" = "%1$@، اعلام شده در %2$@."; +/* Notification, %1$@ is a point of interest, %2$@ is time ago, %3$@ is distance with units, ", announced <1 minute ago>, <20 meters> away" {NumberedPlaceholder="%1$@", "%2$@", "%3$@"} */ +"announced_name_distance_away.named" = "%1$@، اعلام شده در %2$@، %3$@ فاصله."; +/* Notification, %@ is a point of interest, "Previous Location. Announced " {NumberedPlaceholder="%@"} */ +"previous_location.announced_name" = "مکان قبلی. اعلام شد %@."; +/* Notification, %1$@ is a point of interest %2$@ is distance with units, "Previous Location. Announced , currently <20 meters> away" {NumberedPlaceholder="%1$@", "%2$@"} */ +"previous_location.announced_name_distance" = "مکان قبلی. اعلام شد %1$@، در حال حاضر %2$@ فاصله."; +/* Notification, %@ is a point of interest, "Beacon Distance update. Announced " {NumberedPlaceholder="%@"} */ +"beacon_distance_update.announced_name" = "به‌روزرسانی فاصله نشانهٔ صوتی. اعلام شد %@."; +/* Notification, %1$@ is a point of interest %2$@ is distance with units, "Beacon distance update. Announced , beacon is currently <20 meters> away" {NumberedPlaceholder="%1$@", "%2$@"} */ +"beacon_distance_update.announced_name_distance" = "به‌روزرسانی فاصله نشانهٔ صوتی. اعلام شد %1$@، نشانهٔ صوتی در حال حاضر %2$@ فاصله دارد."; +/* Notification, %@ is a point of interest, "Intersection call out. Announced " {NumberedPlaceholder="%@"} */ +"intersection_callout.announced_name" = "اعلان صوتی تقاطع. اعلام شد %@."; +/* Notification, %1$@ is a point of interest %2$@ is distance with units, "Intersection call out. Announced , beacon is currently <20 meters> away" {NumberedPlaceholder="%1$@", "%2$@"} */ +"intersection_callout.announced_name_distance" = "اعلان صوتی تقاطع. اعلام شد %1$@، تقاطع در حال حاضر %2$@ فاصله دارد."; +//------------------------------------------------------------------------------ +// MARK: - Third Party Apps +//------------------------------------------------------------------------------ +/* An title shown to user when he wants to open a location in a third party maps app */ +"third_party_apps.general.maps" = "باز کردن در برنامه نقشه خارجی"; +//------------------------------------------------------------------------------ +// MARK: - iCloud +//------------------------------------------------------------------------------ +/* A message which tells the user the iCloud storage is full. {NumberedPlaceholder="Soundscape", "iCloud"} */ +"icloud.kv_store.quota_violation_alert.title" = "حافظه iCloud Soundscape پر است"; +/* A message which tells the user why the iCloud storage is full. {NumberedPlaceholder="iCloud"} */ +"icloud.kv_store.quota_violation_alert.message" = "حافظه iCloud برای این برنامه پر است. برای ایجاد یک نشانگر جدید، باید با حذف برخی از نشانگرهای موجود خود، فضا آزاد کنید."; +//------------------------------------------------------------------------------ +// MARK: - Misc +//------------------------------------------------------------------------------ +/* Unknown POI or direction. Expresses uncertainty. */ +"poi.unknown" = "ناشناخته"; +/* Unkown place */ +"poi.unknown_place" = "مکان ناشناخته"; +/* Audio player button action */ +"audio_player.action.play_again" = "پخش دوباره"; +/* Notification, coming soon */ +"text.coming_soon" = "به زودی…"; +/* Notification, Cleaning things up */ +"text.cleaning_things" = "در حال پاک‌سازی…"; +/* Notification, Double tap to repeat */ +"action.double_tap_to_repeat" = "برای تکرار دو بار ضربه بزنید"; +/* Title, Location. Used as screen title for a location detail page. Also used as the default name for markers when a more specific default cannot be generated. */ +"location" = "مکان"; +/* Notification, Oops! Means informally that something went wrong. */ +"text.oops" = "اوه!"; +//------------------------------------------------------------------------------ +// MARK: - Tutorials +//------------------------------------------------------------------------------ +/* Screen title */ +"tutorial.title.plural" = "آموزش‌ها"; +/* Tutorial notification to Exit Tutorial */ +"tutorial.exit" = "خروج از آموزش"; +/* Button to skip tutorial */ +"tutorial.skip" = "رد کردن آموزش"; +/* Tutorial warning, Are you sure you want to exit the tutorial */ +"tutorial.exit.alert_title" = "آیا مطمئن هستید که می‌خواهید از آموزش خارج شوید؟"; +//------------------------------------------------------------------------------ +// MARK: Tutorials (Markers) +//------------------------------------------------------------------------------ +/* Tutorial title, Getting Started with Markers */ +"tutorial.markers.getting_started" = "شروع کار با نشانگرها"; +/* Tutorial title, Mark Your World */ +"tutorial.markers.mark_your_world" = "جهان خود را نشانه‌گذاری کنید"; +/* Tutorial title, Experience Your World */ +"tutorial.markers.experience_your_world" = "جهان خود را تجربه کنید"; +/* Tutorial title, Add Marker */ +"tutorial.markers.add_marker" = "افزودن نشانگر"; +/* Tutorial title, Your Marker */ +"tutorial.markers.your_marker" = "نشانگر شما"; +/* Tutorial notification, Double tap to mark this location */ +"tutorial.markers.mark_location.acc_hint" = "برای نشانه‌گذاری این مکان دو بار ضربه بزنید"; +//------------------------------------------------------------------------------ +// MARK: Tutorials (Markers Texts) +//------------------------------------------------------------------------------ +/* Tutorial, Introduction to Markers. "Add Marker" same as tutorial.markers.add_marker. {NumberedPlaceholder="Soundscape"} */ +"tutorial.markers.text.Intro" = "با Soundscape، می‌توانید هر چیزی را که برایتان مهم است نشانه‌گذاری کنید. به عنوان مثال، می‌توانید خانه، ایستگاه اتوبوس، یا حتی مکانی که در آن هستید را نشانه‌گذاری کنید.\nبیایید امتحان کنیم. دکمه افزودن نشانگر را در زیر فشار دهید و به عنوان مثال یک مکان یا آدرس نزدیک را برای نشانه‌گذاری انتخاب کنید."; +/* Tutorial, Edit Marker. {NumberedPlaceholder="@!marker_name!!", "Soundscape","\n"} */ +"tutorial.markers.text.EditMarker" = "عالی! شما @!marker_name!! را به عنوان یک نشانگر انتخاب کرده‌اید. وقتی نزدیک آن باشید، Soundscape آن را اعلام خواهد کرد.\nدر صفحه بعد می‌توانید نام آن را در صورت تمایل تغییر دهید."; +/* Tutorial, Nearby Markers. {NumberedPlaceholder="@!marker_name!!", "\n"} */ +"tutorial.markers.text.NearbyMarkers" = "عالی! شما یک نشانگر جدید به نام @!marker_name!! دارید.\nاکنون، برای شنیدن مکان نشانگر خود، دکمه نشانگرهای نزدیک را فشار دهید. این دکمه را می‌توانید در پایین صفحه اصلی پیدا کنید.\nاکنون امتحان کنید."; +/* Tutorial, set Audio Beacon from Marker. {NumberedPlaceholder="@!marker_name!!", "\n"} */ +"tutorial.markers.text.AudioBeacon" = "همچنین می‌توانید یک نشانهٔ صوتی روی نشانگر خود تنظیم کنید.\nبیایید آن را امتحان کنیم. این نشانهٔ صوتی روی @!marker_name!! است.\nبا دقت به جایی که هست گوش دهید و گوشی خود را صاف نگه داشته، به سمت آن بچرخید."; +/* Tutorial, Marker Wrap Up. {NumberedPlaceholder="@!marker_name!!", "\n"} */ +"tutorial.markers.text.WrapUp" = "عالی، شما اکنون رو به نشانگر خود، @!marker_name!!، هستید.\nبه نظر می‌رسد که یاد گرفته‌اید!\nمی‌توانید لیست نشانگرهای خود را با انتخاب نشانگرها و مسیرها از صفحه اصلی مدیریت کنید.\nو همیشه می‌توانید از صفحات راهنما و آموزش‌ها برای مرور دوباره این آموزش یا خواندن یک راهنمای جامع در مورد هر کاری که می‌توانید با نشانگرها انجام دهید، بازدید کنید. نشانهٔ صوتی که برای این آموزش تنظیم کرده‌اید اکنون پاک شده و به صفحه قبل بازگردانده خواهید شد."; +//------------------------------------------------------------------------------ +// MARK: Tutorials (Beacon) +//------------------------------------------------------------------------------ +/* Tutorial title, Getting Started with Beacons */ +"tutorial.beacon.getting_started" = "شروع کار با نشانه‌های صوتی"; +/* Tutorial notification, Double tap to load a list of places where you can set the beacon */ +"tutorial.beacon.set_a_beacon.acc_hint" = "برای بارگذاری لیستی از مکان‌هایی که می‌توانید نشانهٔ صوتی را تنظیم کنید دو بار ضربه بزنید. یک مکان را از لیست انتخاب کنید تا آموزش شروع شود."; +/* Tutorial notification. Keep newlines (\n) between sentences. "Start Audio Beacon" same as location_detail.action.beacon. Quotes written as " {NumberedPlaceholder="Soundscape","\n"} */ +"tutorial.beacon.getting_started.text" = "وقتی یک نشانهٔ صوتی را روی یک مکان تنظیم می‌کنید، Soundscape صدایی را از جهت آن مکان پخش می‌کند. این آموزش شما را در تنظیم و استفاده از نشانهٔ صوتی راهنمایی می‌کند.\n\nدکمه «شروع نشانهٔ صوتی» را در زیر فشار دهید تا لیستی از مکان‌های نزدیک باز شود. یک مکان را از لیست انتخاب کنید و آموزش شروع خواهد شد."; +/* Tutorial title, Your Destination */ +"tutorial.beacon.your_destination" = "مقصد شما"; +/* Tutorial notification, Double tap to use location selected for the beacon tutorial */ +"tutorial.beacon.mark_location.acc_hint" = "برای استفاده از این مکان برای آموزش نشانهٔ صوتی دو بار ضربه بزنید"; +/* Tutorial notification, %@ is a location, "You selected as the location for the beacon." {NumberedPlaceholder="%@"} */ +"tutorial.beacon.poi_selected" = "شما %@ را به عنوان مکان نشانهٔ صوتی انتخاب کرده‌اید."; +/* Tutorial title, The Audio Beacon */ +"tutorial.beacon.the_audio_beacon" = "نشانهٔ صوتی"; +/* Tutorial notification, %@ is the destination, "You selected as the location of your audio beacon." {NumberedPlaceholder="%@"} */ +"tutorial.beacon.the_audio_beacon.text" = "شما %@ را به عنوان مکان نشانهٔ صوتی خود انتخاب کرده‌اید."; +/* Tutorial notification, Great! You Found Your Beacon! */ +"tutorial.beacon.found_the_beacon" = "عالی! شما نشانهٔ صوتی خود را پیدا کردید!"; +/* Tutorial title, Need Some Silence? */ +"tutorial.beacon.need_some_silence" = "به کمی سکوت نیاز دارید؟"; +//------------------------------------------------------------------------------ +// MARK: Tutorials (Beacon Texts) +//------------------------------------------------------------------------------ +/* Tutorial, Intro to Beacons {NumberedPlaceholder="Soundscape"} */ +"tutorial.beacons.text.IntroPart1" = "وقتی یک نشانهٔ صوتی را روی یک مکان تنظیم می‌کنید، Soundscape صدایی را از جهت آن مکان پخش می‌کند. این آموزش شما را در تنظیم و استفاده از نشانهٔ صوتی راهنمایی می‌کند."; +/* Tutorial, Intro to Beacons continued. "Start Audio Beacon" needs to be translated same as location_detail.action.beacon. Quotes written as " */ +"tutorial.beacons.text.IntroPart2" = "دکمه «شروع نشانهٔ صوتی» را در زیر فشار دهید تا لیستی از مکان‌های نزدیک باز شود. یک مکان را از لیست انتخاب کنید و آموزش شروع خواهد شد."; +/* Tutorial, Beacon phone orientation is flat */ +"tutorial.beacons.text.OrientationIsFlat" = "شما در حال حاضر گوشی خود را صاف با صفحه رو به آسمان نگه داشته‌اید. مطمئن شوید که بالای گوشی مستقیم به جلو اشاره می‌کند."; +/* Tutorial, Beacon phone orientation is not flat */ +"tutorial.beacons.text.OrientationIsNotFlat" = "برای شروع، گوشی خود را صاف در دست خود با صفحه رو به آسمان و با بالای گوشی که مستقیم به جلو اشاره می‌کند نگه دارید."; +/* Tutorial, Phone orientation doesn't matter because the user is wearing AirPods Pro {NumberedPlaceholder="Soundscape","AirPods"} */ +"tutorial.beacons.text.OrientationAirPods" = "ایرپادهای شما به Soundscape متصل هستند. پس از اتصال، نحوه نگه داشتن گوشی شما مهم نیست. حتی می‌تواند در جیب یا کیف شما باشد."; +/* Tutorial, Beacon phone orientation repeat */ +"tutorial.beacons.text.OrientationRepeat" = "برای ادامه، گوشی خود را صاف در دست خود نگه دارید تا صفحه رو به آسمان باشد"; +/* Tutorial, phone must be held flat when you are standing still */ +"tutorial.beacons.text.HoldingPhone" = "نگه داشتن گوشی خود به این صورت فقط زمانی لازم است که ثابت ایستاده‌اید. هنگام راه رفتن می‌توانید گوشی را در جیب یا کیف قابل دسترس قرار دهید."; +/* Tutorial notification, phone must be held flat when you are standing still */ +"tutorial.beacons.text.HoldingPhone.great" = "عالی! نگه داشتن گوشی خود به این صورت فقط زمانی لازم است که ثابت ایستاده‌اید. هنگام راه رفتن می‌توانید گوشی را در جیب یا کیف قابل دسترس قرار دهید."; +/* Tutorial, Initializing the Beacon. {NumberedPlaceholder="@!destination!!", "Soundscape"} */ +"tutorial.beacons.text.BeaconInitial" = "اکنون که یک نشانهٔ صوتی روی @!destination!! تنظیم کرده‌اید، Soundscape شروع به پخش صدایی از جهت آن مکان می‌کند. اکنون، نشانهٔ صوتی می‌آید."; +/* Tutorial, Beacon out of Bounds sound */ +"tutorial.beacons.text.BeaconOutOfBounds" = "اگر با دقت گوش دهید متوجه خواهید شد که از یک جهت خاص در اطراف شما پخش می‌شود."; +/* Tutorial, Beacon out of Bounds sound change when phone is rotated */ +"tutorial.beacons.text.BeaconOutOfBoundsRotate" = "اکنون، در حالی که هنوز گوشی خود را صاف نگه داشته‌اید، به آرامی به سمت جهت نشانهٔ صوتی بچرخید. وقتی مستقیماً به سمت آن رو کرده باشید، صدای زنگ خواهید شنید."; +/* Tutorial, Beacon out of bounds sound change when head tracking headphones is rotated */ +"tutorial.beacons.text.BeaconOutOfBoundsRotate.ar_headset" = "اکنون، به آرامی به سمت جهت نشانهٔ صوتی بچرخید. وقتی مستقیماً به سمت آن رو کرده باشید، صدای زنگ خواهید شنید."; +/* Tutorial, Beacon out of Bounds repeat */ +"tutorial.beacons.text.BeaconOutOfBoundsRepeat" = "به آرامی بچرخید تا زنگی را بشنوید که نشان می‌دهد در جهت نشانهٔ صوتی رو کرده‌اید."; +/* Tutorial, Beacon out of Bounds confirmation. {NumberedPlaceholder="@!destination!!"} */ +"tutorial.beacons.text.BeaconOutOfBoundsConfirmation" = "عالی، شما اکنون در جهت @!destination!! رو کرده‌اید."; +/* Tutorial, Beacon in bounds sound. {NumberedPlaceholder="@!destination!!"} */ +"tutorial.beacons.text.BeaconInBounds" = "اگر با دقت گوش دهید متوجه خواهید شد که از درست جلوی شما پخش می‌شود و علاوه بر صدای عادی نشانهٔ صوتی، صدای زنگ نیز وجود دارد. این به این دلیل است که شما مستقیماً به سمت @!destination!! رو کرده‌اید."; +/* Tutorial, Beacon in of Bounds sound change when phone is rotated. {NumberedPlaceholder="@!destination!!"} */ +"tutorial.beacons.text.BeaconInBoundsRotate" = "اکنون سعی کنید به آرامی از جهت نشانهٔ صوتی دور شوید، در حالی که هنوز گوشی خود را صاف نگه داشته‌اید. صدای زنگ متوقف می‌شود و نشانهٔ صوتی همچنان به شما نشان می‌دهد که @!destination!! کجاست. اکنون آن را امتحان کنید."; +/* Tutorial, Beacon in bounds sound change when head tracking headset is rotated. {NumberedPlaceholder="@!destination!!"} */ +"tutorial.beacons.text.BeaconInBoundsRotate.ar_headset" = "اکنون سعی کنید به آرامی از جهت نشانهٔ صوتی دور شوید. صدای زنگ متوقف می‌شود و نشانهٔ صوتی همچنان به شما نشان می‌دهد که @!destination!! کجاست. اکنون آن را امتحان کنید."; +/* Tutorial, Beacon in of Bounds repeat */ +"tutorial.beacons.text.BeaconInBoundsRepeat" = "به آرامی از جهت نشانهٔ صوتی دور شوید."; +/* Tutorial, Beacon explanation */ +"tutorial.beacons.text.MobilitySkills" = "نشانهٔ صوتی همیشه مستقیماً به سمت مکانی که انتخاب کرده‌اید اشاره می‌کند. به شما مسیرها را برای دنبال کردن یا جهت‌ها را برای رسیدن به آن مکان نمی‌دهد. از این نشانهٔ صوتی به عنوان ابزاری برای تصمیم‌گیری در مورد نحوه رسیدن به آنجا استفاده کنید."; +/* Tutorial, Automatic Callouts {NumberedPlaceholder="Soundscape"} */ +"tutorial.beacons.text.AutomaticCallout" = "همانطور که در سفر خود پیشرفت می‌کنید، Soundscape گاهی اوقات شما را در مورد فاصله تا مکان نشانه‌گذاری شده با یک اعلان صوتی مانند این به‌روز می‌کند."; +/* Tutorial, Home Screen {NumberedPlaceholder="Soundscape"} */ +"tutorial.beacons.text.HomeScreen" = "اطلاعات فاصله نیز در صفحه اصلی همراه با آدرس خیابان مکان نشانهٔ صوتی، اگر آن را داشته باشیم، نمایش داده می‌شود. Soundscape به شما اطلاع می‌دهد که چه زمانی به مکان نشانهٔ صوتی نزدیک می‌شوید، در این مرحله نشانهٔ صوتی خاموش می‌شود."; +/* Tutorial, Mute Beacon */ +"tutorial.beacons.text.Mute" = "اگر به هر دلیلی نیاز دارید که برنامه ساکت باشد، می‌توانید از دکمه بی‌صدا کردن نشانهٔ صوتی یا دکمه خواب در صفحه اصلی استفاده کنید، یا می‌توانید با دو انگشت در هر جای صفحه دو بار ضربه بزنید. یک ضربه دوگانه با دو انگشت هر گونه اعلان صوتی فعلی را متوقف کرده و نشانهٔ صوتی را بی‌صدا می‌کند. اکنون آن را امتحان کنید."; +/* Tutorial, Mute Beacon Repeat */ +"tutorial.beacons.text.MuteRepeat" = "با دو انگشت در هر جای صفحه دو بار ضربه بزنید"; +/* Tutorial, Beacon Wrap Up */ +"tutorial.beacons.text.WrapUp" = "به نظر می‌رسد که یاد گرفته‌اید! اگر می‌خواهید این آموزش را تکرار کنید، می‌توانید در هر زمان از صفحه راهنما و آموزش‌ها به آن دسترسی داشته باشید. نشانهٔ صوتی که برای این آموزش تنظیم کرده‌اید اکنون پاک شده و به صفحه قبل بازگردانده خواهید شد."; +//------------------------------------------------------------------------------ +// MARK: - Help +//------------------------------------------------------------------------------ +/* Help Title, Help */ +"settings.help.title" = "راهنما"; +/* Help section title, Configuring Soundscape */ +"help.configuration.section.title" = "پیکربندی Soundscape"; +/* Help title, Links to a help page that describes how to use Apple AirPods headphones with Soundscape, {NumberedPlaceholder="Apple AirPods"} */ +"help.using_headsets.airpods.title" = "استفاده از Apple AirPods"; +/* Help title, Links to a help page that describes how to use Bose Frames headphones with Soundscape, {NumberedPlaceholder="Bose Frames"} */ +"help.using_headsets.bose_frames.title" = "استفاده از Bose Frames"; +/* Help section title. This section contains help articles on the audio beacon and the automatic callout features. */ +"settings.help.section.beacons_and_pois" = "نشانه‌های صوتی و اعلان‌ها"; +/* Help Section Title, Offline */ +"help.offline.section_title" = "استفاده آفلاین از Soundscape"; +/* Help section title */ +"settings.help.section.home_screen_buttons" = "دکمه‌های «شنیدن محیط اطرافم»"; +/* Help content describing how user can choose a voice and download additional voices */ +"help.config.voices.content" = "Soundscape می‌تواند از هر یک از صداهایی که در برنامه تنظیمات iOS دانلود کرده‌اید استفاده کند، به جز صداهای سیری که برای Soundscape در دسترس نیستند. توصیه می‌کنیم یکی از صداهای با کیفیت بالاتر «بهبودیافته» را انتخاب کنید، اما ابتدا باید آن را دانلود کنید. می‌توانید صداها را در برنامه تنظیمات iOS با رفتن به دسترسی‌پذیری > محتوای گفتاری > صداها و ضربه زدن روی یک صدا دانلود کنید. در برنامه Soundscape، می‌توانید صدایی را که می‌خواهید استفاده کنید با ضربه زدن روی «تنظیمات» در منوی اصلی و سپس از «تنظیمات عمومی» انتخاب «صدا» انتخاب کنید."; +/* Help Page Title, Offline */ +"help.offline.page_title" = "چرا Soundscape آفلاین کار می‌کند؟"; +/* Help Description, Offline */ +"help.offline.description" = "وقتی اتصال اینترنت وجود ندارد یا در خدمات Soundscape قطعی وجود دارد، Soundscape به حالت آفلاین منتقل می‌شود. با این وجود، Soundscape به کار خود ادامه می‌دهد، اما برخی از عملکردها ممکن است محدود باشند."; +/* Help Limitations Title, Offline */ +"help.offline.limitations_heading" = "محدودیت‌ها"; +/* Help Limitations Description, Offline */ +"help.offline.limitations_description" = "اعلان‌های صوتی اگر در منطقه‌ای باشید که قبلاً از آن عبور کرده‌اید و در تاریخچه اعلان‌های صوتی شما ذخیره شده است، به کار خود ادامه خواهند داد. به طور مشابه، می‌توانید یک نشانهٔ صوتی قرار دهید یا یک نشانگر روی مکان‌هایی که در تاریخچه اعلان‌های صوتی شما ذخیره شده‌اند ایجاد کنید."; +/* Help Troubleshooting Title, Offline */ +"help.offline.troubleshooting_heading" = "چه کاری می‌توانید انجام دهید؟"; +/* Help Troubleshooting Description, Offline */ +"help.offline.troubleshooting_description" = "Soundscape سعی می‌کند وقتی گوشی شما به وای-فای یا داده تلفن همراه متصل است و در منطقه‌ای با سیگنال خوب هستید، به عملکرد عادی بازگردد. اگر گوشی شما اتصال اینترنت خوبی دارد، اما Soundscape به عملکرد عادی باز نمی‌گردد، ممکن است در خدمات Soundscape قطعی وجود داشته باشد."; +/* Help Title, Around Me */ +"help.orient.page_title" = "اطراف من"; +/* Help Title, Ahead of Me */ +"help.explore.page_title" = "جلوی من"; +/* Help Title, Creating Markers */ +"help.creating_markers.page_title" = "ایجاد نشانگرها"; +/* Help Title, Customizing Markers */ +"help.edit_markers.page_title" = "سفارشی‌سازی نشانگرها"; +/* Help Title, This is a help topic related to using the media control buttons on headphones */ +"help.remote.page_title" = "استفاده از کنترل‌های رسانه"; +/* Help Tutorial, Hint when disabled while route guidance is active */ +"help.tutorial.footer.disabled" = "آموزش‌ها در حین فعال بودن راهنمای مسیر غیرفعال هستند"; +/* Help Tutorial, "What is it?" section title */ +"help.text.section_title.what" = "این چیست؟"; +/* Help Tutorial, "When would I use it?" section title */ +"help.text.section_title.when" = "چه زمانی از آن استفاده کنم؟"; +/* Help Tutorial, "How does it work?" section title */ +"help.text.section_title.how" = "چگونه کار می‌کند؟"; +/* Help Tutorial, "More Help" section title */ +"help.more_help.section_title" = "راهنمایی بیشتر"; +/* Help Tutorial, Link to the Company Support website */ +"help.support" = "پشتیبانی جامعه Soundscape"; +//------------------------------------------------------------------------------ +// MARK: - Terms of Use +//------------------------------------------------------------------------------ +/* Title Terms of Use */ +"terms_of_use.title" = "شرایط استفاده"; +/* Notification message to accept or decline the terms in the Company Service Agreement, Quotes written as " */ +"terms_of_use.message" = "استفاده شما از Soundscape تابع شرایط %@ و شرایط ذکر شده در زیر (در مجموع، «شرایط استفاده») است."; +/* Label used to prompt the user to accept terms of use */ +"terms_of_use.message.prompt" = "لطفاً برای موافقت و ادامه، کادر زیر را علامت بزنید."; +/* Title of the link to the Company Services Agreement. This value will be used in the placeholder %@ that appears in the terms_of_use.message string */ +"terms_of_use.service_agreement" = "توافقنامه خدمات جامعه Soundscape"; +/* Terms of use checkbox accessibility label */ +"terms_of_use.accept_checkbox.acc_label" = "پذیرش شرایط استفاده"; +/* Double tap to check the accept terms of use checkbox. Quotes written as " */ +"terms_of_use.accept_checkbox.on.acc_hint" = "برای علامت زدن کادر «پذیرش شرایط استفاده» دو بار ضربه بزنید"; +/* Double tap to uncheck the accept terms of use checkbox. Quotes written as " */ +"terms_of_use.accept_checkbox.off.acc_hint" = "برای برداشتن علامت از کادر «پذیرش شرایط استفاده» دو بار ضربه بزنید"; +/* Terms of use accept checkbox has been checked */ +"terms_of_use.accept_checkbox.on.acc_value" = "علامت‌زده شده"; +/* Terms of use accept checkbox has been unchecked */ +"terms_of_use.accept_checkbox.off.acc_value" = "علامت‌زده نشده"; +/* App's medical device and safety disclaimer, "(1)" and (2)" are used for an inline, numbered list */ +"terms_of_use.medical_safety_disclaimer" = "شما تصدیق می‌کنید که Soundscape (۱) به عنوان یک دستگاه پزشکی طراحی، در نظر گرفته یا در دسترس قرار نگرفته است، و (۲) به عنوان جایگزینی برای مشاوره، تشخیص، درمان یا قضاوت پزشکی حرفه‌ای طراحی یا در نظر گرفته نشده است و نباید به جای یا به عنوان جایگزینی برای مشاوره، تشخیص، درمان یا قضاوت پزشکی حرفه‌ای استفاده شود.\n\nاعلامیه ایمنی\nSoundscape یک کمک ناوبری است و نباید به جای مهارت‌های حرکتی، آگاهی از محیط اطراف و قضاوت خوب استفاده شود. هنگام پیمایش در محیط خود احتیاط کنید زیرا داده‌های نقشه‌برداری گنجانده شده در برنامه Soundscape از یک برنامه شخص ثالث گرفته شده است و بنابراین، ممکن است در دقت اطلاعات ارائه شده محدودیت‌هایی وجود داشته باشد."; +/* Label for the accept button that will be displayed as a new feature annoucement to existing users */ +"terms_of_use.accept.new_features" = "پذیرش"; +/* Accessibility hint for the accept button that will be displayed as a new feature annoucement to existing users */ +"terms_of_use.accept.new_features.accessibility_hint" = "برای پذیرش و بستن اطلاعیه‌ها دو بار ضربه بزنید"; +//------------------------------------------------------------------------------ +// MARK: - First Launch +//------------------------------------------------------------------------------ +/* Button title accessibility hint. Quotes written as " */ +"first_launch.get_started_button.off.acc_hint" = "قبل از اینکه بتوانید این دکمه را فشار دهید، باید کادر «پذیرش شرایط استفاده» را علامت بزنید"; +/* Notification, Welcome message */ +"first_launch.welcome_text" = "خوش آمدید! قبل از شروع، باید برخی تنظیمات را انجام دهیم و چندین اجازه را درخواست کنیم. برای شروع دکمه بعدی را فشار دهید."; +/* Notification, Welcome message when using welcome audio */ +"first_launch.welcome_audio_text" = "خوش آمدید! Soundscape با استفاده از راهنمایی صوتی منحصر به فرد و با اعلام جاده‌ها، تقاطع‌ها و مکان‌ها هنگام نزدیک شدن به آنها، به شما کمک می‌کند تا از جایی که هستید و به کجا می‌روید آگاه باشید. برای شروع دکمه بعدی را فشار دهید."; +/* Notification, Permission is required */ +"first_launch.permission_required" = "این اجازه لازم است"; +/* Notification, Soundscap Language {NumberedPlaceholder="Soundscape"} */ +"first_launch.soundscape_language" = "زبان Soundscape"; +/* Notification, introductuction to Soundscap Language {NumberedPlaceholder="Soundscape"} */ +"first_launch.soundscape_language.text" = "زبانی را که می‌خواهید Soundscape استفاده کند انتخاب کنید. همیشه می‌توانید انتخاب خود را در تنظیمات برنامه تغییر دهید."; +/* Notification, Introduction to app location information {NumberedPlaceholder="Soundscape"} */ +"first_launch.location.text" = "Soundscape یک برنامه مبتنی بر مکان است. ما از مکان شما برای پیدا کردن و اعلام چیزهای اطراف شما استفاده می‌کنیم."; +/* Notification to enable location settings on your device */ +"first_launch.location.enable_location" = "فعال کردن مکان"; +/* Notification, Device Motion */ +"first_launch.device_motion" = "حرکت دستگاه"; +/* Notification, introductuction to app motion information {NumberedPlaceholder="Soundscape"} */ +"first_launch.device_motion.text" = "این به Soundscape اجازه می‌دهد تا تجربه شما را بر اساس اینکه در حال راه رفتن، در وسیله نقلیه یا ثابت هستید، بهبود بخشد."; +/* Notification, Lighting up your way with sound. A marketing tag line for the app. */ +"first_launch.lighting_way_with_sound" = "روشن کردن راه شما با صدا"; +/* Notification, introduction to 3D sound in the app */ +"first_launch.lighting_way_with_sound.text_alt" = "Soundscape از صدای سه بعدی برای اطلاع شما از آنچه در اطرافتان است استفاده می‌کند. به عنوان مثال، اگر مقصد شما در سمت راست شما باشد، صدایی از آن جهت خواهید شنید، یا اگر یک کافی‌شاپ در سمت چپ شما باشد، یک اعلان صوتی از آن جهت خواهید شنید."; +/* Notification, Heading Somewhere? */ +"first_launch.heading_somewhere" = "به جایی می‌روید؟"; +/* Notification, Introduction to audio beacon {NumberedPlaceholder="Soundscape"} */ +"first_launch.heading_somewhere.text" = "یک نشانهٔ صوتی را روی مقصد خود قرار دهید و Soundscape شما را از مکان آن و محیط اطراف شما در طول راه مطلع خواهد کرد. از Soundscape در کنار مهارت‌های مسیریابی خود و حتی برنامه ناوبری مورد علاقه خود برای پیدا کردن راه خود به مقصد استفاده کنید."; +/* Notification, Setting off on your way? */ +"first_launch.setting_off_way" = "در راه خود هستید؟"; +/* Notification, Introduction to using the app on the go {NumberedPlaceholder="Soundscape"} */ +"first_launch.setting_off_way.text" = "گوشی را کنار بگذارید و راه بروید. Soundscape با اعلام جاده‌ها، تقاطع‌ها و نقاط شاخص هنگام نزدیک شدن به آنها، به شما کمک می‌کند تا از جایی که هستید آگاه باشید. اعلان‌های صوتی را می‌توان در تنظیمات تنظیم کرد."; +/* Notification, Want to find more things nearby? */ +"first_launch.find_things_nearby" = "می‌خواهید چیزهای بیشتری در نزدیکی پیدا کنید؟"; +/* Notification, Introduction to finding things nearby */ +"first_launch.find_things_nearby.text" = "گوشی را صاف در دست خود نگه دارید و از دکمه‌ها برای مکان‌یابی جاده‌ها و تقاطع‌های آینده، جهت‌یابی به سمت نقاط شاخص آشنا در اطراف خود و کاوش نقاط شاخص پیش روی خود استفاده کنید."; +/* Title text for the welcome screen in the first launch experience */ +"first_launch.welcome.title" = "خوش آمدید!"; +/* Accessibility label for the title text for the welcome screen in the first launch experience */ +"first_launch.welcome.title.accessibility_label" = "به Soundscape خوش آمدید!"; +/* Short description included in the welcome screen in the first launch experience {NumberedPlaceholder="Soundscape"} */ +"first_launch.welcome.description" = "با اطمینان با استفاده از صدای فضایی Soundscape پیمایش کنید"; +/* Button text to get started with app setup */ +"first_launch.welcome.button" = "شروع کنید"; +/* Title text for the screen that tells users how they can listen to Soundscape audio {NumberedPlaceholder="Soundscape"} */ +"first_launch.headphones.title" = "گوش دادن به Soundscape"; +/* Message text for the screen that tells users how they can listen to Soundscape audio {NumberedPlaceholder="Soundscape"} */ +"first_launch.headphones.message.1" = "Soundscape با هر جفت هدفون عالی کار می‌کند. اگر می‌خواهید از هدفون استفاده کنید، اکنون آنها را بردارید."; +/* Message text for the screen that tells users how they can listen to Soundscape audio {NumberedPlaceholder="Soundscape"} */ +"first_launch.headphones.message.2" = "اگر هدفون ندارید یا ترجیح می‌دهید از آنها استفاده نکنید، مشکلی نیست! Soundscape با بلندگوهای گوشی شما کار خواهد کرد."; +/* Title text for the screen that introduces Soundscape callouts */ +"first_launch.callouts.title" = "محیط اطراف خود را بشنوید"; +/* Message text for the screen that introduces Soundscape callouts {NumberedPlaceholder="Soundscape"} */ +"first_launch.callouts.message" = "Soundscape با اعلام جاده‌ها، تقاطع‌ها و نقاط مورد علاقه هنگام نزدیک شدن به آنها، به شما کمک می‌کند تا از جایی که هستید و به کجا می‌روید آگاه باشید."; +/* Text for button that plays example callouts {NumberedPlaceholder="Soundscape"} */ +"first_launch.callouts.listen" = "به نمونه‌ای از آنچه Soundscape ممکن است در پیاده‌روی بعدی شما اعلام کند گوش دهید"; +/* Accessibility text for button that plays example callouts */ +"first_launch.callouts.listen.accessibility_label" = "گوش دادن"; +/* Accessibility hint for button that plays example callouts {NumberedPlaceholder="Soundscape"} */ +"first_launch.callouts.listen.accessibility_hint" = "برای گوش دادن به نمونه‌ای از آنچه Soundscape ممکن است در پیاده‌روی بعدی شما اعلام کند دو بار ضربه بزنید"; +/* Example callout for a coffee shop / cafe */ +"first_launch.callouts.example.1" = "کافه"; +/* Example callout for a generic street name. In the US, a generic street name is "Main Street" but this might vary by locale */ +"first_launch.callouts.example.3" = "خیابان اصلی به چپ می‌رود"; +/* Example callout for a generic street name. In the US, a generic street name is "Main Street" but this might vary by locale */ +"first_launch.callouts.example.4" = "خیابان اصلی به راست می‌رود"; +/* Title text for screen that asks for location permissions {NumberedPlaceholder="Soundscape"} */ +"first_launch.permissions.title" = "پیمایش با Soundscape"; +/* Message text for screen that asks for location permissions {NumberedPlaceholder="Soundscape"} */ +"first_launch.permissions.message" = "هنگام پیمایش با Soundscape شما توسط یک نشانهٔ صوتی راهنمایی خواهید شد. برای انجام این کار، Soundscape به شما نیاز دارد که مجوزهای زیر را فعال کنید:"; +/* Title text for permission to use iOS Location Services */ +"first_launch.permissions.location" = "خدمات موقعیت مکانی با موقعیت دقیق"; +/* Title text for permission to use iOS Motion & Fitness data */ +"first_launch.permissions.motion" = "حرکت و تناسب اندام"; +/* Text to indicate that a permission is required */ +"first_launch.permissions.required" = "این مجوز لازم است"; +/* Title text for screen to choose an audio beacon */ +"first_launch.beacon.title" = "یک نشانهٔ صوتی انتخاب کنید"; +/* Message text that explains what an audio beacon is {NumberedPlaceholder="Soundscape"} */ +"first_launch.beacon.message.1" = "هنگام پیمایش با Soundscape، شما نشانهٔ صوتی را در جهت مقصد خود خواهید شنید. با دنبال کردن صدای آن، همیشه خواهید دانست که به کدام سمت بروید."; +/* Message text to tell the user to listen to the audio beacons and prompts the user to select their preference */ +"first_launch.beacon.message.2" = "به نشانه‌های صوتی موجود گوش دهید و اولویت خود را انتخاب کنید."; +/* Message text to tell the user that the audio beacon can be changed in app settings */ +"first_launch.beacon.message.3" = "این را می‌توان بعداً در تنظیمات برنامه تغییر داد."; +/* Label for the picker control that is used to select a beacon */ +"first_launch.select_beacon" = "انتخاب نشانهٔ صوتی"; +/* Title text for screen where user listens to audio beacon */ +"first_launch.beacon.audio.title" = "نشانهٔ صوتی فضایی"; +/* Message text for screen where user listens to audio beacon */ +"first_launch.beacon.audio.message" = "نشانهٔ صوتی حرکت گوشی شما را دنبال می‌کند و از صدای فضایی استفاده می‌کند تا شما همیشه از مکان آن آگاه باشید."; +/* Callout that is made when starting a standard audio beacon demo during first launch */ +"first_launch.beacon.callout.standard" = "قرار دادن نشانهٔ صوتی در سمت راست شما. گوشی خود را بچرخانید تا صدای آن را دنبال کنید و صدای فضایی نشانهٔ صوتی را تجربه کنید."; +/* Callout that is made when starting a haptic audio beacon demo during first launch */ +"first_launch.beacon.callout.haptic" = "قرار دادن نشانهٔ صوتی در جلوی شما. گوشی خود را به چپ و راست بچرخانید تا بازخورد لمسی نشانهٔ صوتی را تجربه کنید."; +/* Callout that is made when starting a standard audio beacon demo during first launch */ +"first_launch.beacon.callout.headtracking.standard" = "قرار دادن نشانهٔ صوتی در سمت راست شما. بچرخید تا صدای آن را دنبال کنید و صدای فضایی نشانهٔ صوتی را تجربه کنید."; +/* Callout that is made when starting a haptic audio beacon demo during first launch */ +"first_launch.beacon.callout.headtracking.haptic" = "قرار دادن نشانهٔ صوتی در جلوی شما. به چپ و راست بچرخید تا بازخورد لمسی نشانهٔ صوتی را تجربه کنید."; +/* Callout made during onboarding experience to tell the user that the audio beacon is currently in front of the user */ +"first_launch.beacon.callout.ahead" = "نشانهٔ صوتی در جلو"; +/* Callout made during onboarding experience to tell the user that the audio beacon is currently behind the user */ +"first_launch.beacon.callout.behind" = "نشانهٔ صوتی در پشت"; +/* Title text for last screen in the first launch experience */ +"first_launch.prompt.title" = "شما آماده‌اید!"; +/* Message text for the last screen in the first launch experience, "destination" should be translated the same as it is in "search.choose_destination" {NumberedPlaceholder="Soundscape"} */ +"first_launch.prompt.message" = "شما برای اولین پیاده‌روی خود با Soundscape آماده هستید. برای امتحان کردن آن اکنون، فقط یک مقصد نزدیک را انتخاب کنید، نشانهٔ صوتی را شروع کنید، و آن را در جهت مقصد خود خواهید شنید."; +/* Button for the last screen in the first launch experience */ +"first_launch.prompt.button" = "پایان"; +/* Button to re-enter the onboarding experience from the Help & Tutorials section */ +"first_launch.help.title" = "راه‌اندازی برنامه"; +//------------------------------------------------------------------------------ +// MARK: - Help (Texts) +//------------------------------------------------------------------------------ +/* Notification, Information on what a beacon is used for {NumberedPlaceholder="Soundscape"} */ +"help.text.destination_beacons.what" = "تنظیم یک نشانهٔ صوتی روی یک مکان نزدیک به Soundscape اجازه می‌دهد تا شما را با پخش صدایی از جهت آن مکان مطلع کند. این نشانهٔ صوتی را می‌توان در صفحه اصلی بی‌صدا یا باصدا کرد. علاوه بر این، Soundscape اطلاعاتی درباره مکان در صفحه اصلی نمایش می‌دهد، از جمله فاصله تا آن و آدرس خیابان آن در صورت مشخص بودن."; +/* Notification, Information on when to use a beacon */ +"help.text.destination_beacons.when" = "تنظیم یک نشانهٔ صوتی زمانی مفید است که می‌خواهید یک نقطه شاخص آشنا را در حین کاوش در یک منطقه جدید ردیابی کنید یا وقتی به جایی می‌روید و می‌خواهید در طول راه از محیط اطراف خود مطلع شوید. ویژگی نشانهٔ صوتی به شما جهت‌های گام به گام نمی‌دهد، اما یک صدای شنیداری مداوم به شما می‌دهد که جهت نشانهٔ صوتی را نسبت به جایی که در حال حاضر هستید به شما می‌گوید. با استفاده از نشانهٔ صوتی، مهارت‌های مسیریابی موجود خود و حتی برنامه ناوبری مورد علاقه خود، می‌توانید نحوه رسیدن به مکان‌های نزدیک را خودتان انتخاب کنید."; +/* Notification, Information how to set a beacon. Ensure that "Set a Beacon" is translated the same as universal_links.alert.action.beacon. Quotes written as " {NumberedPlaceholder="","","
"} */ +"help.text.destination_beacons.how.1" = "برای تنظیم یک نشانهٔ صوتی:
ابتدا، جزئیات یک مکان را با استفاده از نوار جستجو برای جستجوی یک مکان، یا با ضربه زدن روی یکی از دکمه‌های «مکان‌های نزدیک»، «نشانگرها و مسیرها» یا «مکان فعلی» و انتخاب یک مکان مشاهده کنید. سپس از صفحه «جزئیات مکان»، دکمه «شروع نشانهٔ صوتی» را انتخاب کنید. ضربه زدن روی این دکمه شما را به صفحه اصلی باز می‌گرداند و یک نشانهٔ صوتی شنیداری از جهت مکانی که انتخاب کرده‌اید روشن می‌کند. نام مکان به همراه فاصله و آدرس فیزیکی آن، در صورت وجود، اکنون در صفحه اصلی نمایش داده می‌شود."; +/* Notification, Information how to set a beacon continued. Ensure that "Remove Beacon" is translated the same as beacon.action.remove_beacon. Quotes written as " {NumberedPlaceholder="","","
"} */ +"help.text.destination_beacons.how.2" = "برای حذف نشانهٔ صوتی فعلی:
به سادگی دکمه «حذف نشانهٔ صوتی» را در صفحه اصلی فشار دهید."; +/* Notification, Information how to set a beacon continued. Ensure that "Mute Beacon" is translated the same as beacon.action.mute_beacon and "Remove Beacon" is translated the same as beacon.action.remove_beacon. Quotes written as " {NumberedPlaceholder="","","
"} */ +"help.text.destination_beacons.how.3" = "برای بی‌صدا کردن نشانهٔ صوتی شنیداری:
روی دکمه «بی‌صدا کردن نشانهٔ صوتی» در زیر دکمه «حذف نشانهٔ صوتی» در صفحه اصلی ضربه بزنید."; +/* Notification, Information about what a callout is. Ensure that "Manage Callouts" is translated the same as menu.manage_callouts. Quotes written as " {NumberedPlaceholder="Soundscape"} */ +"help.text.automatic_callouts.what" = "Soundscape می‌تواند با اعلام نام آنها از جهتی که در آن قرار دارند، شما را از چیزهای اطراف خود هنگام نزدیک شدن به آنها مطلع کند. برنامه این کار را به طور خودکار برای انواع چیزها مانند کسب‌وکارها، ایستگاه‌های اتوبوس و حتی تقاطع‌ها انجام می‌دهد. می‌توانید آنچه را که برنامه به طور خودکار اعلام می‌کند در بخش «مدیریت اعلان‌های صوتی» از صفحه «تنظیمات» پیکربندی کنید، و می‌توانید همه اعلان‌های صوتی را زمانی که می‌خواهید برنامه ساکت باشد خاموش کنید."; +/* Notification, Information on when you will hear callouts. {NumberedPlaceholder="","","
"} */ +"help.text.automatic_callouts.when.1" = "کاوش در یک منطقه جدید:
اعلان‌های صوتی خودکار را روشن کنید و راه بروید تا در حین عبور از همه فروشگاه‌ها، رستوران‌ها و موارد مشابه مطلع شوید."; +/* Notification, Information on when you will hear callouts continued. {NumberedPlaceholder="","","
"} */ +"help.text.automatic_callouts.when.2" = "راه رفتن به یک مکان خاص:
وقتی در راه خود به یک مکان خاص هستید، اعلان‌های صوتی خودکار برای تقاطع‌ها می‌توانند به ویژه مفید باشند. اعلان‌های صوتی تقاطع به شما در مورد طرح تقاطع‌ها هنگام نزدیک شدن به آنها اطلاع می‌دهند و جاده‌ای را که در آن هستید هنگام خروج از آنها تأیید می‌کنند."; +/* Notification, Information on when you will hear callouts continued. Ensure that "My Location" is translated the same as directions.my_location and "Nearby Markers" is translated the same as callouts.nearby_markers and "Around Me" is translated the same as help.orient.page_title and "Ahead of Me" is translated the same as help.explore.page_title. Quotes written as " {NumberedPlaceholder="","","
","",""} */ +"help.text.automatic_callouts.when.3" = "وقتی به سکوت نیاز دارید:
وقتی می‌خواهید از یک جاده عبور کنید یا فقط نیاز دارید که برنامه ساکت باشد، می‌توانید اعلان‌های صوتی را خاموش کنید. وقتی اعلان‌های صوتی خاموش هستند، برنامه فقط در صورتی به شما اطلاعات می‌دهد که به صورت دستی روی یکی از دکمه‌های «مکان من»، «نشانگرهای نزدیک»، «اطراف من» یا «جلوی من» ضربه بزنید."; +/* Notification, Information how to turn on callouts. Ensure that "Manage Callouts" is translated the same as menu.manage_callouts and "Callouts Off" is translated the same as callouts.callouts_off and "Allow callouts" is translated the same as callouts.allow_callouts. Quotes written as " {NumberedPlaceholder="","","
"} */ +"help.text.automatic_callouts.how.1" = "روشن یا خاموش کردن اعلان‌های صوتی:
خاموش کردن اعلان‌های صوتی برنامه را ساکت می‌کند. اعلان‌های صوتی را می‌توان با رفتن به بخش «مدیریت اعلان‌های صوتی» از صفحه «تنظیمات» و سپس تغییر وضعیت دکمه «اجازه دادن به اعلان‌های صوتی» روشن یا خاموش کرد. همچنین می‌توانید اعلان‌های صوتی را با استفاده از فرمان «پرش به جلو» (دو بار ضربه بزنید و نگه دارید) اگر هدفون شما دکمه‌های کنترل رسانه دارد روشن یا خاموش کنید. به طور متناوب، می‌توانید از دکمه «خواب» در گوشه بالا سمت راست صفحه اصلی برای جلوگیری از اعلان‌های صوتی Soundscape تا زمانی که آن را بیدار کنید استفاده کنید."; +/* Notification, Information how to turn on callouts continued. Ensure that "Manage Callouts" is translated the same as menu.manage_callouts and "Allow callouts" is translated the same as callouts.allow_callouts. Quotes written as " {NumberedPlaceholder="","","
"} */ +"help.text.automatic_callouts.how.2" = "مدیریت اعلان‌های صوتی که می‌شنوید:
برای انتخاب انواع چیزهایی که Soundscape به طور خودکار اعلام می‌کند، به صفحه «تنظیمات» در منوی اصلی بروید. بخش «مدیریت اعلان‌های صوتی» از صفحه «تنظیمات» حاوی لیستی از انواع چیزهایی است که برنامه می‌تواند اعلام کند. هر مورد یک دکمه تغییر وضعیت دارد که می‌توانید آن را روشن یا خاموش کنید. اگر می‌خواهید همه اعلان‌های صوتی را خاموش کنید، روی دکمه تغییر وضعیت «اجازه دادن به اعلان‌های صوتی» در بالای لیست ضربه بزنید."; +/* Notification, Information about what My Location does. Ensure that "My Location" is translated the same as directions.my_location. Quotes written as " {NumberedPlaceholder="",""} */ +"help.text.my_location.what" = "دکمه «مکان من» به سرعت اطلاعاتی را به شما می‌دهد که به شما کمک می‌کند بفهمید در حال حاضر کجا هستید. «مکان من» به شما در مورد مکان فعلی شما از جمله چیزهایی مانند جهتی که رو کرده‌اید، جایی که جاده‌ها یا تقاطع‌های نزدیک هستند و جایی که نقاط مورد علاقه نزدیک هستند، اطلاع می‌دهد."; +/* Notification, Information on when you would need to use My Location. Ensure that "My Location" is translated the same as directions.my_location. Quotes written as " {NumberedPlaceholder="",""} */ +"help.text.my_location.when" = "«مکان من» زمانی مفید است که نیاز دارید بفهمید کجا هستید یا به کدام جهت اصلی رو کرده‌اید."; +/* Notification, Information how to use My Location. Ensure that "My Location" is translated the same as directions.my_location. Quotes written as " {NumberedPlaceholder="",""} */ +"help.text.my_location.how" = "مانند همه چهار دکمه در پایین صفحه اصلی، گوشی خود را با صفحه صاف (رو به آسمان) و بالای گوشی که در جهتی که رو کرده‌اید اشاره می‌کند نگه دارید قبل از اینکه دکمه «مکان من» را فشار دهید. این مانند یک قطب‌نما عمل می‌کند که به برنامه می‌گوید به کدام جهت رو کرده‌اید. به سادگی، روی دکمه «مکان من» ضربه بزنید و گوش دهید."; +/* Notification, Information about what Nearby Markers does. Ensure that "Nearby Markers" is translated the same as callouts.nearby_markers. Quotes written as " {NumberedPlaceholder="",""} */ +"help.text.nearby_markers.what" = "دکمه «نشانگرهای نزدیک» به شما در مورد حداکثر چهار نشانگر که به شما نزدیک‌ترین هستند اطلاع می‌دهد. «نشانگرهای نزدیک» برای کمک به شما در جهت‌یابی با استفاده از مکان‌هایی که از قبل می‌شناسید در نظر گرفته شده است."; +/* Notification, Information about when to use Nearby Markers. Ensure that "Nearby Markers" is translated the same as callouts.nearby_markers. Quotes written as " {NumberedPlaceholder="",""} */ +"help.text.nearby_markers.when" = "وقتی در حال تلاش برای جهت‌یابی و جهت‌دهی خود به محیط اطراف خود هستید، از «نشانگرهای نزدیک» برای شنیدن در مورد مکان‌های مکان‌هایی که می‌شناسید استفاده کنید."; +/* Notification, Information about how to use Nearby Markers. Ensure that "Nearby Markers" is translated the same as callouts.nearby_markers. Quotes written as " {NumberedPlaceholder="",""} */ +"help.text.nearby_markers.how" = "مانند همه چهار دکمه در پایین صفحه اصلی، گوشی خود را با صفحه صاف (رو به آسمان) و بالای گوشی که در جهتی که رو کرده‌اید اشاره می‌کند نگه دارید قبل از اینکه دکمه «نشانگرهای نزدیک» را فشار دهید. این مانند یک قطب‌نما عمل می‌کند که به برنامه می‌گوید به کدام جهت رو کرده‌اید. به سادگی، روی دکمه «نشانگرهای نزدیک» ضربه بزنید و تا چهار نشانگر نزدیک خود را خواهید شنید."; +/* Notification, Information about what Around Me does. Ensure that "Around Me" is translated the same as help.orient.page_title. Quotes written as " {NumberedPlaceholder="",""} */ +"help.text.around_me.what" = "دکمه «اطراف من» به شما در مورد یک چیز در هر یک از چهار ربع اطراف شما (جلو، راست، پشت و چپ) اطلاع می‌دهد. «اطراف من» برای کمک به شما در جهت‌یابی به محیط اطراف خود در نظر گرفته شده است."; +/* Notification, Information about when to use Around Me. Ensure that "Around Me" is translated the same as help.orient.page_title. Quotes written as " {NumberedPlaceholder="",""} */ +"help.text.around_me.when" = "وقتی در حال تلاش برای جهت‌یابی و جهت‌دهی خود به محیط اطراف خود هستید، از «اطراف من» برای شنیدن در مورد چیزهای اطراف خود استفاده کنید."; +/* Notification, Information about how to use Around Me. Ensure that "Around Me" is translated the same as help.orient.page_title. Quotes written as " {NumberedPlaceholder="",""} */ +"help.text.around_me.how" = "مانند همه چهار دکمه در پایین صفحه اصلی، گوشی خود را با صفحه صاف (رو به آسمان) و بالای گوشی که در جهتی که رو کرده‌اید اشاره می‌کند نگه دارید قبل از اینکه دکمه «اطراف من» را فشار دهید. این مانند یک قطب‌نما عمل می‌کند که به برنامه می‌گوید به کدام جهت رو کرده‌اید. به سادگی، روی دکمه «اطراف من» ضربه بزنید و چهار نقطه مورد علاقه را که در اطراف شما چیده شده‌اند خواهید شنید."; +/* Notification, Information about what Ahead of Me does. Ensure that "Ahead of Me" is translated the same as help.explore.page_title. Quotes written as " {NumberedPlaceholder="",""} */ +"help.text.ahead_of_me.what" = "دکمه «جلوی من» به شما در مورد حداکثر پنج چیز پیش روی شما اطلاع می‌دهد. «جلوی من» برای کمک به شما در کاوش راه پیش روی خود هنگام یادگیری در مورد یک منطقه جدید در نظر گرفته شده است."; +/* Notification, Information about when to use Ahead of Me. Ensure that "Ahead of Me" is translated the same as help.explore.page_title. Quotes written as " {NumberedPlaceholder="",""} */ +"help.text.ahead_of_me.when" = "وقتی در حال راه رفتن در خیابان هستید، سعی کنید از «جلوی من» برای کشف مکان‌ها و چیزهایی که در هر دو طرف خیابان پیش رو می‌آیند استفاده کنید."; +/* Notification, Information about how to use Ahead of Me. Ensure that "Ahead of Me" is translated the same as help.explore.page_title. Quotes written as " {NumberedPlaceholder="",""} */ +"help.text.ahead_of_me.how" = "مانند همه چهار دکمه در پایین صفحه اصلی، گوشی خود را با صفحه صاف (رو به آسمان) و بالای گوشی که در جهتی که رو کرده‌اید اشاره می‌کند نگه دارید قبل از اینکه دکمه «جلوی من» را فشار دهید. این مانند یک قطب‌نما عمل می‌کند که به برنامه می‌گوید به کدام جهت رو کرده‌اید. به سادگی، روی دکمه «جلوی من» ضربه بزنید و چندین نقطه مورد علاقه را که همه تقریباً پیش روی شما هستند خواهید شنید."; +/* Notification, Information about what headphone media controls do in Soundscape. Keep HTML tags. {NumberedPlaceholder="Soundscape", "
"} */ +"help.text.remote_control.what" = "شما می‌توانید با دکمه‌های کنترل رسانه روی هدفون خود به برخی ویژگی‌ها در Soundscape دسترسی داشته باشید. این قابلیت با هر هدفون سیمی یا بلوتوثی که دکمه‌های کنترل رسانه مانند پخش، مکث، بعدی، قبلی و غیره دارد کار می‌کند. هدفون‌های مختلف ممکن است شامل دکمه‌های متفاوتی باشند، بنابراین لطفاً به لیست اقدامات زیر مراجعه کنید تا مشخص کنید کدام یک برای شما در دسترس است.
توجه داشته باشید که این ویژگی فقط با هدفون‌هایی کار می‌کند که از کنترل‌های رسانه اپل (مانند پخش و مکث) پشتیبانی می‌کنند."; +/* Notification, Information about when to use media controls on headphones. {NumberedPlaceholder="Soundscape"} */ +"help.text.remote_control.when" = "کنترل‌های رسانه هدفون را می‌توان در حین اجرای Soundscape استفاده کرد. این درست است چه در حال حاضر در Soundscape باشید یا در حالی که Soundscape در پس‌زمینه است و حتی در حالی که دستگاه شما قفل است. با این حال توجه داشته باشید که دکمه‌های کنترل رسانه هدفون با Soundscape کار نخواهند کرد اگر در حال پخش صوتی مانند موسیقی، پادکست یا ویدیو با برنامه دیگری هستید."; +/* Notification, Information about how to use media controls on headphones. Ensure that "My Location" is translated the same as directions.my_location and "Around Me" is translated the same as help.orient.page_title. Quotes written as " {NumberedPlaceholder="

","
","⏯","

","⏭","","","⏮","⏩","⏪"} */ +"help.text.remote_control.how" = "

شما می‌توانید با استفاده از دکمه‌های کنترل رسانه روی هدفون خود به ویژگی‌های زیر در Soundscape دسترسی داشته باشید:


⏯ پخش/مکث: هر گونه اعلان صوتی فعلی را بی‌صدا کنید و اگر نشانهٔ صوتی تنظیم شده است، صدای نشانهٔ صوتی را تغییر وضعیت دهید.

⏭ بعدی: اعلان صوتی «مکان من».

⏮ قبلی: تکرار آخرین اعلان صوتی.

⏩ پرش به جلو: روشن و خاموش کردن اعلان‌های صوتی.

⏪ پرش به عقب: اعلان صوتی «اطراف من».

"; +/* Notification, Markers content {NumberedPlaceholder="Soundscape"} */ +"help.text.markers.content.1" = "با Soundscape، می‌توانید جهان خود و هر چیزی را که برایتان مهم است نشانه‌گذاری کنید."; +/* Notification, Markers content continued */ +"help.text.markers.content.2" = "می‌توانید چیزهایی را که شخصی و مرتبط با شما هستند مانند خانه، دفتر کار و فروشگاه مواد غذایی مورد علاقه خود را نشانه‌گذاری کنید. می‌توانید هر مکان یا آدرسی را نشانه‌گذاری کنید، اما همچنین می‌توانید چیزهایی را که معمولاً روی نقشه‌ها نیستند نشانه‌گذاری کنید، به عنوان مثال، ورودی ساختمان‌ها یا پارک‌ها، دکمه‌های فشار برای راه رفتن، گذرگاه‌های عابر پیاده یا پل‌ها، ایستگاه‌های اتوبوس یا حتی درخت مورد علاقه سگتان و از اینها به عنوان مرجع در طول پیاده‌روی خود استفاده کنید."; +/* Notification, Markers content continued {NumberedPlaceholder="Soundscape"} */ +"help.text.markers.content.3" = "برای تجربه مکان‌های نشانه‌گذاری شده، Soundscape به طور خودکار مکان‌های نشانه‌گذاری شده را هنگام راه رفتن یا نزدیک شدن به آنها اعلام می‌کند، یا می‌توانید از دکمه نشانگرهای نزدیک در پایین صفحه اصلی برای شنیدن یک اعلان صوتی فضایی از مکان‌های نشانه‌گذاری شده در اطراف خود استفاده کنید. حتی می‌توانید یک نشانهٔ صوتی را روی هر مکان نشانه‌گذاری شده تنظیم کنید. وقتی این کار را انجام می‌دهید، نشانهٔ صوتی Soundscape که با آن آشنا هستید، شنیده می‌شود و می‌توانید آن را طبق معمول کار کنید."; +/* Notification, Creating Markers help content, Quotation marks are written as " */ +"help.text.creating_markers.content.1" = "شما می‌توانید نشانگرها را به سه روش ایجاد کنید: جستجوی مکانی که می‌خواهید ذخیره کنید با استفاده از نوار جستجو، پیدا کردن جایی با استفاده از دکمه «مکان‌های نزدیک»، یا استفاده از دکمه «مکان فعلی»، که همه آنها را می‌توان در صفحه اصلی Soundscape پیدا کرد. پس از پیدا کردن مکانی که می‌خواهید، انتخاب آن شما را به صفحه «جزئیات مکان» می‌برد. در این صفحه، دکمه‌ای به نام «ذخیره به عنوان نشانگر» را انتخاب کنید."; +/* Notification, Creating Markers help content continued, Quotation marks are written as " */ +"help.text.creating_markers.content.2" = "اکنون گزینه سفارشی‌سازی این نشانگر را خواهید داشت. می‌توانید نام آن را تغییر دهید، و همچنین یک یادداشت اضافه کنید که همراه با نشانگر برای ارائه اطلاعات اضافی اعلام خواهد شد. سپس دکمه «انجام شد» را برای ذخیره نشانگر خود انتخاب کنید."; +/* Notification, Customizing Markers help content. "Markers & Routes" should be translated the same as the string with key 'search.view_markers'. Quotes written as " */ +"help.text.customizing_markers.content.1" = "اگر می‌خواهید نام یک نشانگری را که قبلاً ایجاد کرده‌اید تغییر دهید، یا یک یادداشت به آن اضافه کنید، نشانگر را از زبانه «نشانگرها» در صفحه «نشانگرها و مسیرها» انتخاب کنید و سپس دکمه «ویرایش نشانگر» را انتخاب کنید. می‌توانید از این برای دادن نام‌های مستعار توصیفی یا مفید به نشانگرها و همچنین دادن یک توضیح طولانی‌تر به آنها با استفاده از فیلد یادداشت استفاده کنید."; +/* Notification, Customizing Markers help content continued */ +"help.text.customizing_markers.content.2" = "از این صفحه ویرایش، همچنین می‌توانید یک نشانگر را در صورت عدم نیاز دیگر حذف کنید."; +/* Help content explaining what the "routes" feature is */ +"help.text.routes.content.what" = "مسیرها مجموعه‌ای از ایستگاه‌ها هستند. با رسیدن به هر ایستگاه به شما اطلاع داده می‌شود و نشانهٔ صوتی به طور خودکار به ایستگاه بعدی منتقل می‌شود."; +/* Help content explaining when a user might choose to use the routes feature */ +"help.text.routes.content.when" = "ممکن است بخواهید در جایی که می‌شناسید یک مسیر ایجاد و استفاده کنید تا مطمئن شوید در مسیر باقی می‌مانید، یا ممکن است بخواهید از آن به عنوان ابزاری برای آشنایی با یک سفر جدید استفاده کنید."; +/* Help content explaining how a user can create a route. Quotes written as " */ +"help.text.routes.content.how.1" = "ایجاد یک مسیر:
ابتدا، به «نشانگرها و مسیرها» بروید، زبانه «مسیرها» را انتخاب کنید و سپس دکمه «مسیر جدید» را انتخاب کنید. به مسیر یک نام و یک توضیح اختیاری بدهید، سپس ایستگاه‌ها را در حین حرکت اضافه کنید یا آنها را از لیست نشانگرهای خود انتخاب کنید. می‌توانید ترتیب ایستگاه‌ها را در یک مسیر در هر زمان با ویرایش مسیر تغییر دهید."; +/* Help content explaining how a user can follow a route. Quotes written as " */ +"help.text.routes.content.how.1a" = "دنبال کردن یک مسیر:
مسیر خود را از صفحه «نشانگرها و مسیرها» انتخاب کنید و سپس شروع مسیر را انتخاب کنید. شما به صفحه اصلی باز خواهید گشت و Soundscape یک نشانهٔ صوتی را روی اولین ایستگاه تنظیم می‌کند. همانطور که در مسیر خود پیش می‌روید، نشانهٔ صوتی به ایستگاه بعدی منتقل می‌شود تا زمانی که مسیر تکمیل شود. اگر در هر زمانی می‌خواهید به جلو یا عقب یک ایستگاه بپرید، «ایستگاه بعدی» یا «ایستگاه قبلی» را فشار دهید."; +/* Help content explaining how a user can edit a route. Quotes written as " */ +"help.text.routes.content.how.2" = "ویرایش یک مسیر:
مسیر خود را در صفحه «نشانگرها و مسیرها» انتخاب کنید و سپس «ویرایش مسیر» را انتخاب کنید. از اینجا می‌توانید ایستگاه‌ها را اضافه و حذف کنید، و همچنین نام و توضیحات مسیر را ویرایش کنید."; +/* Help content explaining how a user can share a route. "Share" should be translated in the same way as it is for the key share.title. Quotes written as " */ +"help.text.routes.content.how.3" = "اشتراک‌گذاری یک مسیر:
مسیر خود را در صفحه «نشانگرها و مسیرها» انتخاب کنید و سپس گزینه «اشتراک‌گذاری» را با استفاده از همه گزینه‌های اشتراک‌گذاری معمول موجود برای شما انتخاب کنید."; +/* Help content describing how Apple AirPods work with Soundscape and which versions are supported {NumberedPlaceholder="Soundscape","AirPods"} */ +"help.using_headsets.airpods.what" = "Soundscape از صدای فضایی با ردیابی پویای سر هنگام استفاده از ایرپادهای سازگار پشتیبانی می‌کند. پس از اتصال، حسگرهای موجود در ایرپادها به Soundscape جهت رو کردن سر شما را می‌گویند. این به Soundscape کمک می‌کند تا تجربه صوتی شما را بهبود بخشد و با حرکت شما در جهان، آن را طبیعی‌تر کند. وقتی از Soundscape با ایرپادهای متصل استفاده می‌کنید، نیازی به نگه داشتن گوشی خود برای کارکرد صحیح Soundscape ندارید."; +/* Information on when users can use Apple AirPods headphones with Soundscape, {NumberedPlaceholder="Soundscape","AirPods"} */ +"help.using_headsets.airpods.when" = "شما می‌توانید از ایرپادها با Soundscape هر زمانی که به طور معمول از Soundscape استفاده می‌کنید استفاده کنید. استفاده از ایرپادها به شما صدای با کیفیت بالا می‌دهد و به شما امکان می‌دهد تجربه دست‌ آزاد بیشتری داشته باشید."; +/* Information on how to connect Apple AirPods with Soundscape, "Head Tracking Headphones" should be translated the same as the string with key "menu.devices", {NumberedPlaceholder="Soundscape","AirPods"} */ +"help.using_headsets.airpods.how.1" = "اتصال یک دستگاه:
به مورد «هدفون‌های ردیاب سر» در منوی Soundscape بروید تا ایرپادهای خود را متصل کنید و دستورالعمل‌های روی صفحه را دنبال کنید. توجه داشته باشید که قبل از اتصال آنها در Soundscape، باید ایرپادهای خود را در تنظیمات بلوتوث به گوشی خود جفت کنید."; +/* Information on how to use the media buttons on Apple AirPods with Soundscape (e.g. clicking the pressure sensor on one of the AirPods for play/pause), Quotes written as ", "Using Media Controls" should be translated the same as string with key "help.remote.page_title", {NumberedPlaceholder="Soundscape","AirPods"} */ +"help.using_headsets.airpods.how.2" = "استفاده از کنترل‌های رسانه روی هدفون شما:
وقتی کنترل‌های رسانه در تنظیمات Soundscape فعال هستند، می‌توانید از کنترل‌های رسانه روی ایرپادهای خود برای بی‌صدا یا باصدا کردن نشانهٔ صوتی، اعلام مکان خود یا تکرار آخرین اعلان صوتی استفاده کنید. برای اطلاعات بیشتر، به بخش راهنمای «استفاده از کنترل‌های رسانه» مراجعه کنید."; +/* Help content describing how Bose Frames work with Soundscape and which versions are supported {NumberedPlaceholder="Soundscape","Bose Frames"} */ +"help.using_headsets.bose_frames.what" = "Soundscape از صدای فضایی با ردیابی پویای سر هنگام استفاده از نسخه‌های Alto یا Rondo از Bose Frames پشتیبانی می‌کند. پس از اتصال، حسگرهای موجود در Bose Frames به Soundscape جهت رو کردن سر شما را می‌گویند. این به Soundscape کمک می‌کند تا تجربه صوتی شما را بهبود بخشد و با حرکت شما در جهان، آن را طبیعی‌تر کند. وقتی از Soundscape با Bose Frames متصل استفاده می‌کنید، نیازی به نگه داشتن گوشی خود برای کارکرد صحیح Soundscape ندارید."; +/* Information on when users can use Bose Frames headphones with Soundscape, {NumberedPlaceholder="Soundscape","Bose Frames"} */ +"help.using_headsets.bose_frames.when" = "شما می‌توانید از Bose Frames با Soundscape هر زمانی که به طور معمول از Soundscape استفاده می‌کنید استفاده کنید. استفاده از Bose Frames به شما صدای با کیفیت بالا می‌دهد که صدای محیط را مسدود نمی‌کند و به شما امکان می‌دهد تجربه دست‌ آزاد بیشتری داشته باشید."; +/* Information on how to connect Bose Frames with Soundscape, "Head Tracking Headphones" should be translated the same as the string with key "menu.devices", {NumberedPlaceholder="Soundscape","Bose Frames"} */ +"help.using_headsets.bose_frames.how.1" = "اتصال یک دستگاه:
به مورد «هدفون‌های ردیاب سر» در منوی Soundscape بروید تا Bose Frames خود را متصل کنید و دستورالعمل‌های روی صفحه را دنبال کنید. توجه داشته باشید که قبل از اتصال آنها در Soundscape، باید Bose Frames خود را در تنظیمات بلوتوث به گوشی خود جفت کنید."; +/* information on how to calibrate Bose Frames with Soundscape, Quotes written as ", {NumberedPlaceholder="Soundscape","Bose Frames"} */ +"help.using_headsets.bose_frames.how.2" = "کالیبراسیون هدفون شما:
Bose Frames شما برای دانستن دقیق اینکه به کدام سمت رو کرده‌اید نیاز به کالیبراسیون دارند. هر بار که آنها را به Soundscape متصل می‌کنید، با یک زنگ صوتی به شما اطلاع داده می‌شود که نیاز به کالیبراسیون است. برای کالیبره کردن Bose Frames خود، دستورالعمل‌های ارائه شده روی صفحه را دنبال کنید. وقتی زنگ متوقف شد، Bose Frames شما کالیبره شده‌اند و Soundscape اکنون جهت سر شما را ردیابی می‌کند، بنابراین نیازی به نگه داشتن گوشی در دستتان نیست. می‌توانید این کالیبراسیون را در هر زمانی، حتی اگر زنگ در حال پخش نباشد، تکرار کنید، اگر فکر می‌کنید دقت صدای فضایی شما ضعیف است."; +/* Information on how to use the media buttons on Bose Frames */ +"help.using_headsets.bose_frames.how.3" = "استفاده از کنترل‌های رسانه روی هدفون شما:
وقتی کنترل‌های رسانه در تنظیمات Soundscape فعال هستند، می‌توانید از کنترل‌های رسانه روی Bose Frames خود برای بی‌صدا یا باصدا کردن نشانهٔ صوتی، اعلام مکان خود یا تکرار آخرین اعلان صوتی استفاده کنید. برای اطلاعات بیشتر، به بخش راهنمای «استفاده از کنترل‌های رسانه» مراجعه کنید."; +/* Trouble shooting information for Bose Frames */ +"help.using_headsets.bose_frames.how.4" = "عیب‌یابی هدفون شما:
اگر در اتصال Bose Frames خود به Soundscape مشکل دارید، مطمئن شوید که آنها یکی از مدل‌های پشتیبانی شده هستند - Altos یا Rondos. اگر آنها یکی از این مدل‌ها هستند، سپس مطمئن شوید که Frames در برنامه Bose Connect ظاهر می‌شوند. اگر آنها نشان داده می‌شوند و هنوز در اتصال مشکل دارید، سعی کنید هدفون‌ها را از طریق منوی بلوتوث گوشی خود لغو جفت‌سازی و دوباره جفت‌سازی کنید.
پشتیبانی از Bose Frames جدید است و ما دوست داریم بازخورد شما را بشنویم. می‌توانید با انتخاب گزینه «ارسال بازخورد» در منو با ما تماس بگیرید."; +//------------------------------------------------------------------------------ +// MARK: - OSM Tags +//------------------------------------------------------------------------------ +/* Open Street Map term. Pedestrians can cross a street here; e.g., zebra crossing. Known as crosswalks in American English, and crossings in British English. */ +"osm.tag.crossing" = "گذرگاه عابر پیاده"; +/* Open Street Map term. Used to describe the type of the feature which is currently under construction. */ +"osm.tag.construction" = "در دست ساخت"; +/* Open Street Map term. NOT DEFINED IN OSM */ +"osm.tag.dangerous_area" = "منطقه خطرناک"; +/* Open Street Map term. This refers to a village, town or city townhall, which is often the seat of the mayor, or may be merely a community meeting place. */ +"osm.tag.townhall" = "شهرداری"; +/* Open Street Map term. For flights of steps on footways and paths.. */ +"osm.tag.steps" = "پله‌ها"; +/* Open Street Map term. An elevator (or lift) is used to travel vertically, providing passenger and freight access between pathways at different floor levels. */ +"osm.tag.elevator" = "آسانسور"; +/* Open Street Map term. A walking path is is a generic path, either multi-use or unspecified usage, open to all pedestrians and not intended for motorized vehicles. */ +"osm.tag.walking_path" = "مسیر پیاده‌روی"; +/* Open Street Map term. Is a road or an area mainly or exclusively for pedestrians in which some vehicle traffic may be authorized (e.g. emergency, taxi, delivery, ...). Typically found in shopping areas, town centres, places with tourism attractions and recreation/civic areas, where wide expanses of hard surface are provided for pedestrians to walk. */ +"osm.tag.pedestrian_street" = "پیاده‌راه"; +/* Open Street Map term. A bicycle path is is a generic path, either multi-use or unspecified usage, open to all cyclists and not intended for motorized vehicles. May be shared with pedestrians. */ +"osm.tag.bicycle_path" = "مسیر دوچرخه‌سواری"; +/* Open Street Map term. Used for roads that are used for accessing residential areas and in residential areas but which are not normally used as through routes. */ +"osm.tag.residential_street" = "خیابان مسکونی"; +/* Open Street Map term. Used in two senses: 1. As a service way for access to buildings or places 2. Frontage road parallel to a major road. */ +"osm.tag.service_road" = "جاده خدماتی"; +/* Open Street Map term. Any highway, route, way, or thoroughfare on land which connects one location to another and has been paved or otherwise improved to allow travel by some conveyance, including motorised vehicles, cyclists, pedestrians, horse riders, and others (but not trains). */ +"osm.tag.road" = "جاده"; +/* Open Street Map term. Any road, route, way, or thoroughfare on land which connects one location to another and has been paved or otherwise improved to allow travel by some conveyance, including motorised vehicles, cyclists, pedestrians, horse riders, and others (but not trains). */ +"osm.tag.highway" = "بزرگراه"; +/* Open Street Map term. Any highway that has a given name. Used as a display name for place or a location. %@ is an highway name, such as "London Highway". */ +"osm.tag.highway.named" = "بزرگراه %@"; +/* Open Street Map term. Any highway that has a reference number or name. Used as a display name for place or a location. %@ is an highway id, such as "Highway 520" or "Highway B". */ +"osm.tag.highway.refed" = "بزرگراه %@"; +/* Open Street Map term. An intersection is a junction where two or more roads meet or cross. */ +"osm.tag.intersection" = "تقاطع"; +/* Open Street Map term. A roundabout is a type of circular intersection or junction in which road traffic is permitted to flow in one direction around a central island. */ +"osm.tag.roundabout" = "میدان"; +/* Open Street Map term. Used to describe a road or highway leading to and from a major highway e.g., a freeway or motorway. */ +"osm.tag.highway_ramp" = "رمپ بزرگراه"; +/* Open Street Map term. Used as to describe the section of highway where two or more roads or highways merge with one another. */ +"osm.tag.merging_lane" = "مسیر ادغام"; +/* Open Street Map term. Used to describe a block or building typically housing companies, but offices may be also used by any other kind of organization like charities, government, any NGO etc.. */ +"osm.tag.office_building" = "ساختمان اداری"; +/* Open Street Map term. Used for any generic building that is used as a school. */ +"osm.tag.school_building" = "ساختمان مدرسه"; +/* Open Street Map term. Used as a display name for place or a location. */ +"osm.tag.covered_pavilion" = "آلاچیق سرپوشیده"; +/* Open Street Map term. A small local shop carrying a variety of everyday products, mostly including single-serving food items such as milk, bread, snacks, groceries to over-the-counter medications, household items, stationery, and small auto supplies such as fuses. */ +"osm.tag.convenience_store" = "فروشگاه رفاه"; +/* Open Street Map term. A doorway through which people can enter or exit a building. */ +"osm.tag.building_entrance" = "ورودی ساختمان"; +/* Open Street Map term. Used to designate a place or an area where all employees, passengers or a large crowd assemble in case of an emergency in an installation, building or a public place. */ +"osm.tag.assembly_point" = "نقطه تجمع"; +/* Open Street Map term. Used to describe fence-like barriers positioned along paths, footways, cycleways or tracks which serve to either slow cycle access or prevent it entirely depending on spacing and layout. */ +"osm.tag.cycle_barrier" = "مانع دوچرخه"; +/* Open Street Map term. Used to describe a barrier to allow one person at a time to pass. Use this for small turnstiles like the ones in supermarkets or some subways. */ +"osm.tag.turnstile" = "گیت گردان"; +/* Open Street Map term. Used to describe a hole in the road surface which is covered with a series of bars that allow wheeled vehicles but not animals to cross. */ +"osm.tag.cattle_grid" = "گارد گاو"; +/* Open Street Map term. A gate is a section in a wall or fence which can be opened to allow or restrict access. They are usually made of wood or metal. */ +"osm.tag.gate" = "دروازه"; +/* Open Street Map term. Used to refer to a public toilet. */ +"osm.tag.restroom" = "سرویس بهداشتی"; +/* Open Street Map term. Used to describe a facility used by the public, customers, or other authorised users for parking motor vehicles, such as cars and trucks, commonly known as a car park (British English) or parking lot (American English). */ +"osm.tag.parking_lot" = "پارکینگ"; +/* Open Street Map term. Used to describe the entry/exit point to a parking area. */ +"osm.tag.parking_entrance" = "ورودی پارکینگ"; +/* Open Street Map term. A place for people to sit. */ +"osm.tag.bench" = "نیمکت"; +/* Open Street Map term. Used for the locating the point where taxis wait, not the point where passengers wait. */"osm.tag.taxi_waiting_area" = "محل انتظار تاکسی"; +/* Open Street Map term. A place where letters and parcels may be sent or collected.. */"osm.tag.post_office" = "اداره پست"; +/* Open Street Map term. A physical box used as a facility for the public to deposit outgoing postal items, such as letters and other small goods, intended for collection by the operator.. */ +"osm.tag.post_box" = "صندوق پست"; +/* Open Street Map term. A single small container for depositing garbage that is easily accessible for pedestrians. */ +"osm.tag.waste_basket" = "سطل زباله"; +/* Open Street Map term. A place where people can bathe under water sprays. May be run as a local amenity by the government, or part of commercial provisions. */ +"osm.tag.shower" = "دوش"; +/* Open Street Map term. Refers to any parking space designed for bicycles, where one can leave a pedal cycle unattended in reasonable security. */ +"osm.tag.bike_parking" = "پارکینگ دوچرخه"; +/* Open Street Map term. A public telephone, phone box, or telephone on a stand or wall. Usually you pay to use them, often only via a pre-pay card. */ +"osm.tag.telephone" = "تلفن"; +/* Open Street Map term. Used to map a fuel station, also known as a filling station, petrol station, gas station and petrol garage. It is the retail-type facility where motor vehicles can be refueled. */ +"osm.tag.gas_station" = "پمپ بنزین"; +/* Open Street Map term. A financial establishment where customers can, among other services, deposit and withdraw money, take loans, make investments and transfer funds. This definition encompasses banks, credit unions, building societies, and other similar establishments. It does not include money lenders or financial offices that are not banks */ +"osm.tag.bank" = "بانک"; +/* Open Street Map term. An automated teller machine (ATM), or automatic banking machine (ABM), or "cash machine", is a computerised telecommunications device that provides the clients of a financial institution with access to financial transactions in a public space without the need for a cashier, human clerk or bank teller. */ +"osm.tag.atm" = "عابربانک"; +/* Open Street Map term. Used as a display name for place or a location. %@ is a bank name, such as "Chase ATM". */ +"osm.tag.atm.named" = "عابربانک %@"; +/* Open Street Map term. Used as a display name for place or a location. %@ is an ATM id, such as "ATM 7" or "ATM B". */ +"osm.tag.atm.refed" = "عابربانک %@"; +/* Open Street Map term. A bus stop is a place where passengers can board or alight from a bus. Its position may be marked by a shelter, pole, bus lay-by, or road markings. / +"osm.tag.bus_stop" = "ایستگاه اتوبوس"; +/ Open Street Map term. A landmark is A tree or other feature remarkable due to its size or prominent location, usually visible from great distances and useful for navigation. */ +"osm.tag.landmark" = "نقطه شاخص"; +/* Open Street Map term. Used as a display name for place or a location. %@ is a bus stop name, such as "London Bus Stop". */ +"osm.tag.bus_stop.named" = "ایستگاه اتوبوس %@"; +/* Open Street Map term. An informal place with sit-down facilities selling beverages and light meals and/or snacks. */ +"osm.tag.cafe" = "کافه"; +/* Open Street Map term. Generally a formal eating places with sit-down facilities selling full meals served by waiters and often licensed (where allowed) to sell alcoholic drinks. */ +"osm.tag.restaurant" = "رستوران"; +/* Open Street Map term. Fast food is a place where food that is prepared and served very quickly. */ +"osm.tag.fast_food" = "فست فود"; +/* Open Street Map term. A bar is an place where alcoholic beverages are served. */ +"osm.tag.bar" = "بار"; +/* Open Street Map term. An ice cream shop is a place where ice cream is sold. */ +"osm.tag.ice_cream" = "بستنی فروشی"; +/* Open Street Map term. A pub is a place selling beer and other alcoholic drinks; may also provide food or accommodation (UK). */ +"osm.tag.pub" = "میخانه"; +/* Open Street Map term. A coffee shop isa place that typically sells coffee and pastries. */ +"osm.tag.coffee_shop" = "کافی شاپ"; +/* Open Street Map term. A monument is a structure created to commemorate a person. / +"osm.tag.monument" = "یادبود"; +/ Other OSM tags... */"osm.tag.statue" = "مجسمه";"osm.tag.museum" = "موزه";"osm.tag.historic" = "تاریخی";"osm.tag.cathedral" = "کلیسای جامع"; +/* Open Street Map term. Used as a display name for place or a location. %@ is a bus stop id, such as "Bus Stop 7" or "Bus Stop B". */ +"osm.tag.bus_stop.refed" = "ایستگاه اتوبوس %@"; +/* Open Street Map term. Used for a container or centre that accepts waste for recycling, and donations of used goods. */ +"osm.tag.recycling_bin" = "سطل بازیافت"; +/* Open Street Map term. A water feature with cultural, decorational or historical significance or which serves a recreational purpose. */ +"osm.tag.fountain" = "فواره"; +/* Open Street Map term. This covers places such as mosques, churches, cathedrals, synagogues, temples, etc. */ +"osm.tag.place_of_worship" = "مکان عبادت"; +/* Open Street Map term. Used for places where humans can obtain potable water for consumption. */ +"osm.tag.water_fountain" = "آبخوری"; +/* Open Street Map term. A facility used to clean the exterior and, in some cases, the interior of motor vehicles. */ +"osm.tag.car_wash" = "کارواش"; +/* Open Street Map term. A machine which dispenses items such as snacks, beverages, alcohol, cigarettes, lottery tickets, cologne, consumer products and even gold and gems to customers automatically, after the customer inserts currency or credit into the machine. */ +"osm.tag.vending_machine" = "دستگاه فروش خودکار"; +/* Open Street Map term. Outdoor (sometimes indoor) areas specifically designed for children to play. */ +"osm.tag.playground" = "زمین بازی"; +/* Open Street Map term. An area designed for practising a particular sport, normally designated with appropriate markings. Examples include tennis courts, basketball courts, soccer pitches, and riding arenas. */ +"osm.tag.sports_field" = "زمین ورزشی"; +/* Open Street Map term. A place built for swimming as a recreational activity or sport. */ +"osm.tag.swimming_pool" = "استخر شنا"; +/* Open Street Map term. A distinguishable planned space, usually outdoors, set aside for the display, cultivation, and enjoyment of plants and other forms of nature. */ +"osm.tag.garden" = "باغ"; +/* Open Street Map term. An area of open space for recreational use, usually designed and in semi-natural state with grassy areas, trees and bushes. Parks are usually urban, but not always. */ +"osm.tag.park" = "پارک"; +"osm.tag.nature_reserve" = "ذخیره‌گاه طبیعی"; +"osm.tag.botanical_garden" = "باغ گیاه‌شناسی"; +"osm.tag.public_garden" = "باغ عمومی"; +"osm.tag.field" = "میدان"; +"osm.tag.reserve" = "ذخیره‌گاه"; +"osm.tag.green_space" = "فضای سبز"; +"osm.tag.recreation_area" = "منطقه تفریحی"; +/* Open Street Map term. A table with benches, ideal for food and rest. */ +"osm.tag.picnic_table" = "میز پیک‌نیک"; +/* Open Street Map term. A locality that is suitable for outdoors eating and may have any of a number of facilities to aid a picnic. */ +"osm.tag.picnic_area" = "منطقه پیک‌نیک"; +//------------------------------------------------------------------------------ +// MARK: - Banners +//------------------------------------------------------------------------------ +/* Scavenger Hunt Banner */ +"banner.custom_behavior.scavenger_hunt" = "شکار گنج فعال است."; +/* Scavenger Hunt Banner, Hint */ +"banner.custom_behavior.scavenger_hunt.hint" = "برای خواندن درباره یا متوقف کردن شکار گنج دو بار ضربه بزنید"; +/* Default banner when offline */ +"banner.offline_default.message" = "Soundscape آفلاین کار می‌کند. بیشتر بدانید"; +/* Offline banner when in Help */ +"banner.offline_help.message" = "Soundscape آفلاین کار می‌کند."; +/* Offline banner when searching */ +"banner.offline_search.message" = "Soundscape آفلاین کار می‌کند. مکان‌ها به مکان‌هایی که قبلاً از کنارشان عبور کرده‌اید یا قبلاً نشانه‌گذاری کرده‌اید محدود است. بیشتر بدانید"; +/* Banner when Soundscape goes back online */ +"banner.online.message" = "Soundscape دوباره آنلاین شد"; +//------------------------------------------------------------------------------ +// MARK: - Share +//------------------------------------------------------------------------------ +/* Title, Share the app with others */ +"share.title" = "اشتراک‌گذاری"; +/* Title, Share the app with others {NumberedPlaceholder="Soundscape"} */ +"share.prompt.title" = "از Soundscape لذت می‌برید؟"; +/* Message, Share the app with others {NumberedPlaceholder="Soundscape"} */ +"share.prompt.message" = "Soundscape را به دوستان و خانواده خود معرفی کنید"; +/* Message, Share the app with others {NumberedPlaceholder="Soundscape"} */ +"share.action.message" = "Soundscape را امتحان کنید، برنامه‌ای که از استفاده از آن برای ناوبری با صدای سه بعدی لذت می‌برم:"; +// MARK: - Local Push Notifications +//------------------------------------------------------------------------------ +/* A title for a notification that will be displayed to the user after some time to remind to use the app {NumberedPlaceholder="Soundscape"} */ +"push.local.home.title" = "Soundscape را در خانه امتحان کنید"; +/* A description for a notification that will be displayed to the user after some time to remind to use the app */ +"push.local.home.body" = "فقط یک مقصد نزدیک را انتخاب کنید، نشانهٔ صوتی را شروع کنید و آن را در جهت مقصد خود خواهید شنید."; +/* A title for a notification that will be displayed to the user after some time to remind to use the app {NumberedPlaceholder="Soundscape"} */ +"push.local.walk.title" = "Soundscape را در پیاده‌روی بعدی خود امتحان کنید"; +/* A description for a notification that will be displayed to the user after some time to remind to use the app */ +"push.local.walk.body" = "فقط برنامه را شروع کنید و از تجربه لذت ببرید. حتی نیازی به انتخاب مقصد ندارید."; +//------------------------------------------------------------------------------ +// MARK: - What's New +//------------------------------------------------------------------------------ +/* Title for the shake to repeat last callout feature */ +"whats_new.1_2_0.0.title" = "برای تکرار آخرین اعلان صوتی تکان دهید"; +/* Description of shake to repeat feature */ +"whats_new.1_2_0.0.description" = "اکنون می‌توانید دستگاه خود را برای تکرار آخرین اعلان صوتی تکان دهید. برای فعال کردن این ویژگی، دکمه «تکرار اعلان‌های صوتی» را در تنظیمات روشن کنید."; +/* Title of the beacon vicinity distance feature */ +"whats_new.1_2_0.1.title" = "تنظیم فاصله بی‌صدا شدن نشانهٔ صوتی"; +/* Description of the beacon vicinity distance feature */ +"whats_new.1_2_0.1.description" = "اکنون می‌توانید فاصله‌ای را که در آن نشانهٔ صوتی هنگام نزدیک شدن به طور خودکار بی‌صدا می‌شود تنظیم کنید. فقط به تنظیمات نشانهٔ صوتی بروید و نوار لغزنده «فاصله بی‌صدا شدن صدا» را حرکت دهید."; +/* Title of the categories in places nearby feature */ +"whats_new.1_2_0.2.title" = "دسته‌بندی‌ها در مکان‌های نزدیک"; +/* Description of the categories in places nearby feature */ +"whats_new.1_2_0.2.description" = "اکنون می‌توانید لیست مکان‌های نزدیک را بر اساس دسته‌بندی‌هایی مانند حمل و نقل عمومی، غذا و نوشیدنی و غیره فیلتر کنید."; +/* Title of the Bose Frames support feature */ +"whats_new.1_3_0.0.title" = "پشتیبانی از Bose Frames"; +/* Description of the Bose Frames support feature */ +"whats_new.1_3_0.0.description" = "Soundscape اکنون از صدای فضایی با ردیابی پویای سر هنگام استفاده از نسخه‌های Alto یا Rondo از Bose Frames پشتیبانی می‌کند. پس از اتصال، حسگرهای موجود در Bose Frames به Soundscape جهت رو کردن سر شما را می‌گویند. این به Soundscape کمک می‌کند تا تجربه صوتی شما را بهبود بخشد و با حرکت شما در جهان، آن را طبیعی‌تر کند. وقتی از Soundscape با Bose Frames متصل استفاده می‌کنید، نیازی به نگه داشتن گوشی خود برای کارکرد صحیح Soundscape ندارید. برای شروع، به مورد «هدفون‌های ردیاب سر» در منوی Soundscape بروید تا Bose Frames خود را متصل کنید و دستورالعمل‌های روی صفحه را دنبال کنید. توجه داشته باشید که قبل از اتصال آنها در Soundscape، باید Bose Frames خود را در تنظیمات بلوتوث به گوشی خود جفت کنید."; +/* Title of the request for testing in Texas */ +"whats_new.1_3_0.1.title" = "آزمایش در تگزاس"; +/* Description of the request for testing in Texas */ +"whats_new.1_3_0.1.description" = "اگر در مناطق آستین یا سن آنتونیو در تگزاس زندگی می‌کنید و می‌خواهید به ما در آزمایش یک ویژگی که با NaviLens کار می‌کنیم کمک کنید، لطفاً از طریق دکمه ارسال بازخورد از منوی اصلی با ما تماس بگیرید."; +/* Description of how users can download new voices. "Settings" and "Spoken Content" should be translated in the same way they are translated in the iOS Settin gs app. {NumberedPlaceholder="iOS"} */ +"voice.apple.additional" = "صداهای اضافی، از جمله صداهای با کیفیت بهبودیافته، را می‌توان در بخش محتوای گفتاری از تنظیمات دسترسی‌پذیری iOS دانلود کرد."; +// MARK: - FAQs +/* Title of the Frequently Asked Questions page */ +"faq.title" = "سوالات متداول"; +/* Abbreviated title "FAQ" standing for "Frequently Asked Questions" */ +"faq.title.abbreviated" = "سوالات متداول"; +/* Title of the "Tips & Tricks" section in the help content */ +"faq.tips.title" = "نکات و ترفندها"; +// MARK: What is Soundscape? +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.section.what_is_soundscape" = "Soundscape چیست و چگونه باید از آن استفاده کنم؟"; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.when_to_use_soundscape.question" = "چه زمانی باید از Soundscape استفاده کنم؟"; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. ’Lighting up your way with sound’ is a marketing tagline for the app. Intersection - A junction where two or more roads meet or cross. 3D sound is where the audio through your headphones sounds as though it is coming from a given direction, as if it was actually coming from a speaker. Quotes written as " {NumberedPlaceholder="Soundscape"} */ +"faq.when_to_use_soundscape.answer" = "Soundscape ویژگی‌ها و مزایایی دارد که سناریوها و مقیاس‌های زمانی مختلفی را در بر می‌گیرد. علاوه بر این، ارزش Soundscape برای شما ممکن است با گذشت زمان تکامل یابد، بنابراین نحوه استفاده شما از آن امروز ممکن است با نحوه استفاده شما از آن در سه ماه دیگر متفاوت باشد. مردم اغلب در مورد برنامه‌ها از نظر «این برنامه در حل چه مشکلی خوب است؟» فکر می‌کنند. Soundscape مطمئناً می‌تواند به صورت موردی زمانی که نیاز به اطلاعات خاصی دارید استفاده شود - مانند ردیابی یک مقصد در حین رسیدن به آن، کمک به جهت‌یابی هنگام خروج از ایستگاه مترو، جهت‌یابی هنگام خروج از ماشین، یا پیدا کردن نام خیابان‌ها برای، یا فاصله تا، تقاطع بعدی. با این حال، فلسفه پشت Soundscape «روشن کردن جهان شما با صدا» است که برای استفاده در هر زمانی که بیرون هستید طراحی شده است تا آگاهی محیطی از محیط اطراف شما را فراهم کند، مانند آگاه نگه داشتن شما از نام خیابان‌هایی که در آن هستید، جهتی که به آن می‌روید و نام کسب‌وکارهایی که از کنارشان عبور می‌کنید. در این حالت استفاده، کاربران ما به Soundscape به عنوان یک «برنامه همراه خوب» اشاره کرده‌اند که از «کشف اتفاقی» پشتیبانی می‌کند، برای «پر کردن شکاف‌های نقشه ذهنی شما» و ارائه «اعتماد به نفس بیشتر هنگام راه رفتن». در اینجا چند نمونه دیگر از نحوه ادغام Soundscape توسط کاربران ما در زندگی خود آورده شده است:\n\n«Soundscape به من کمک کرد تا پس از پیاده شدن از اتوبوس و رفتن در جهت اشتباه، به مسیر خود بازگردم.»\n\n«حتی در شهری که ۳ سال در آن زندگی کرده‌ام، با Soundscape تصویر بهتری از آنچه در اطرافم است ساخته‌ام.»\n\n«صدای سه بعدی تجربه من از یک پیاده‌روی را افزایش می‌دهد، زیرا احساس می‌کنم بیشتر به محیط خود متصل هستم… اکنون که برنامه را برای استفاده دارم، بیشتر احتمال دارد مسیر جدیدی را امتحان کنم.»\n\n«من دلتنگ کشف اتفاقی هنگام راه رفتن و توجه به چیزها هستم. داشتن Soundscape خوب است - برای شنیدن در مورد چیزهای اطراف من نیازی به تلاش نیست. اطلاعات رابطه‌ای مفید است و یک برنامه عالی برای آگاهی از موقعیت و کاوش در راهروهای تجاری است.»\n\n«[من از Soundscape استفاده کردم] برای پیدا کردن یک میخانه در وسط یورک. [من] از طیف وسیعی از گزینه‌های آن برای پیدا کردن و سپس واقعاً پیدا کردن آن استفاده کردم. من را به فاصله ۳ متری در رساند - عالی!»"; +/* Marker - A location that has been marked as important by the user or application. This can be an address, a business or a custom place such as an entrance, a bus stop or a bench. */ +"faq.markers_function.question" = "نشانگرها چیستند و چگونه می‌توانم بیشترین بهره را از آنها ببرم؟"; +/* Marker - A location that has been marked as important by the user or application. This can be an address, a business or a custom place such as an entrance, a bus stop or a bench. 'The list' is referring to the list of places that appears when you add a new Marker. Quotes written as " {NumberedPlaceholder="Soundscape"} */ +"faq.markers_function.answer" = "نشانگرها مکان‌هایی هستند که شما ذخیره کرده‌اید. آنها می‌توانند مکان‌هایی باشند که در برنامه قابل کشف هستند، یا می‌توانند مکان‌های کاملاً جدیدی باشند که خودتان اضافه کرده‌اید. می‌توانید مکان فعلی خود را به عنوان یک نشانگر با انتخاب دکمه «مکان فعلی» در صفحه اصلی و سپس انتخاب «ذخیره به عنوان نشانگر» ذخیره کنید. می‌توانید مکان‌های دیگر را به عنوان یک نشانگر با جستجوی مکانی که می‌خواهید ذخیره کنید با استفاده از نوار جستجو، یا پیدا کردن جایی با استفاده از دکمه «مکان‌های نزدیک»، که هر دو را می‌توان در صفحه اصلی Soundscape پیدا کرد، ذخیره کنید. پس از پیدا کردن مکانی که می‌خواهید، انتخاب آن شما را به صفحه «جزئیات مکان» می‌برد. در این صفحه، دکمه‌ای به نام «ذخیره به عنوان نشانگر» را انتخاب کنید."; +// MARK: Getting the Best Experience +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.section.getting_the_best_experience" = "چگونه می‌توانم بهترین بهره را از Soundscape ببرم؟"; +/* A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. */ +"faq.what_can_I_set.question" = "چه چیزی را می‌توانم به عنوان نشانهٔ صوتی تنظیم کنم؟"; +/* An 'audio beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. Intersection - A junction where two or more roads meet or cross., Marker - A location that has been marked as important by the user or application. This can be an address, a business or a custom place such as an entrance, a bus stop or a bench. Point of interest - A specific location that someone may find useful or interesting. Quotation marks are written as " */ +"faq.what_can_I_set.answer" = "شما می‌توانید یک نشانهٔ صوتی را روی هر کسب‌وکار، مکان، نقطه مورد علاقه، آدرس یا تقاطع تنظیم کنید. چند راه برای تنظیم یک مکان به عنوان نشانهٔ صوتی وجود دارد. ابتدا، جزئیات یک مکان را با استفاده از نوار جستجو برای جستجوی یک مکان، یا با ضربه زدن روی یکی از دکمه‌های «مکان‌های نزدیک»، «نشانگرها و مسیرها» یا «مکان فعلی» و انتخاب یک مکان مشاهده کنید. سپس از صفحه «جزئیات مکان»، دکمه «شروع نشانهٔ صوتی» را انتخاب کنید. ضربه زدن روی این دکمه شما را به صفحه اصلی باز می‌گرداند و یک نشانهٔ صوتی شنیداری از جهت مکانی که انتخاب کرده‌اید روشن می‌کند. نام مکان به همراه فاصله و آدرس فیزیکی آن، در صورت وجود، اکنون در صفحه اصلی نمایش داده می‌شود."; +/* A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. */ +"faq.how_to_use_beacon.question" = "چگونه از نشانهٔ صوتی مانند یک حرفه‌ای استفاده کنم؟"; +/* A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. 'As the crow flies' is as expression which means roughly 'in a straight line'.'Spatilized' is referring to 'spatial audio' or '3D audio' which is where the audio through your headphones sounds as though it is coming from a given direction, as if it was actually coming from a speaker. 'Sweep the phone' is referring to rotating the phone around to point it in different directions. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. Quotes written as " {NumberedPlaceholder="Soundscape"} */ +"faq.how_to_use_beacon.answer" = "شما می‌توانید نشانهٔ صوتی شنیداری را به عنوان یک «فانوس دریایی برای گوش‌ها» در نظر بگیرید که به شما اطلاع می‌دهد مقصد شما نسبت به مکان شما کجاست، به صورت خط مستقیم. مانند یک فانوس دریایی، به شما نمی‌گوید چگونه به آنجا برسید - ممکن است در طول راه نیاز به انتخاب‌های ناوبری زیادی داشته باشید، درست همانطور که یک قایق بادبانی برای نزدیک شدن به فانوس دریایی باید «تک»‌های استراتژیک زیادی انجام دهد. صدای ریتمیک مداوم نشانهٔ صوتی از جهت مقصد فضایی می‌شود و به شما کمک می‌کند تا در حین راه رفتن از مکان آن نسبت به خود آگاه باشید. وقتی مستقیماً به سمت مقصد راه می‌روید، یا گوشی را در آن جهت اشاره می‌کنید، صدای «زنگ» با صدای بلندتری شنیده می‌شود. این ویژگی به شما امکان می‌دهد جهت مقصد را دقیقاً مشخص کنید زیرا جهت صدای ریتمیک گاهی اوقات در محیط‌های پر سر و صدا به سختی قابل درک است. هنگام جستجو برای صدای «زنگ» با صدای بلندتر، گوشی را صاف نگه دارید و گوشی را به آرامی جارو کنید؛ چرخاندن سر خود برای اشاره در همان جهت گوشی اطمینان حاصل می‌کند که بهترین تجربه صوتی فضایی را دارید.\n\nاستعاره فانوس دریایی برای طراحی نشانهٔ صوتی چندین پیامد طبیعی دارد:\n\n۱. هیچ جهت «صحیحی» برای سفر هنگام استفاده از نشانهٔ صوتی وجود ندارد، در عوض، با Soundscape شما انتخاب می‌کنید چگونه به آنجا برسید؛\n۲. صدای «زنگ» با صدای بلندتر فقط به شما در مشخص کردن جهت مقصد کمک می‌کند - این نشانه‌ای از نحوه رسیدن به آنجا نیست؛\n۳. اگر به طور کلی می‌دانید چگونه به مقصد خود برسید، ممکن است بخواهید نشانهٔ صوتی را برای بیشتر سفر خود بی‌صدا کنید و فقط زمانی که به آن نزدیک می‌شوید آن را روشن کنید."; +/* A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. */ +"faq.why_does_beacon_disappear.question" = "چرا نشانهٔ صوتی شنیداری گاهی اوقات ناپدید می‌شود؟"; +/* A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.why_does_beacon_disappear.answer" = "نشانهٔ صوتی شنیداری Soundscape اساساً یک نشانه جهتی است که به شما می‌گوید مقصد شما نسبت به جهتی که رو کرده‌اید کجاست. وقتی Soundscape در مورد اینکه به کدام سمت رو کرده‌اید مطمئن نیست، صدای نشانهٔ صوتی را کم می‌کند. بیشتر اوقات این اتفاق می‌افتد اگر با گوشی ذخیره شده در جیب یا کیف راه رفته باشید و حرکت خود را متوقف کنید، مانند عبور از یک خیابان. نشانهٔ صوتی پس از شروع دوباره حرکت، یا اگر گوشی را صاف نگه دارید و آن را از خود دور کنید، بلندتر می‌شود."; +/* A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. */ +"faq.beacon_on_address.question" = "آیا می‌توانم یک نشانهٔ صوتی را روی یک آدرس تنظیم کنم؟"; +/* Marker - A location that has been marked as important by the user or application. This can be an address, a business or a custom place such as an entrance, a bus stop or a bench., A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. 'Voiceover' is an iPhone feature to help people who are visually impaired use the iPhone. Quotes written as " {NumberedPlaceholder="VoiceOver"} */ +"faq.beacon_on_address.answer" = "بله می‌توانید. آدرس‌ها به طور پیش‌فرض لیست نمی‌شوند اما می‌توان آنها را با استفاده از فیلد جستجو پیدا کرد. برای ذخیره این آدرس تا نیازی به جستجوی دوباره آن نداشته باشید، می‌توانید آن را به عنوان یک نشانگر از صفحه اصلی با انتخاب دکمه «افزودن به نشانگرها»، یا با استفاده از اقدامات VoiceOver روی نشانهٔ صوتی در صفحه اصلی اضافه کنید."; +/* A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. */ +"faq.beacon_on_home.question" = "چگونه یک نشانهٔ صوتی را روی خانه خود تنظیم کنم؟"; +/* A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. Marker - A location that has been marked as important by the user or application; this can be an address, a business or a custom place such as an entrance, a bus stop or a bench. "Start Audio Beacon" should be translated the same as "location_detail.action.beacon". Quotes written as " {NumberedPlaceholder="Soundscape"} */ +"faq.beacon_on_home.answer" = "Soundscape از تنظیم نشانه‌های صوتی روی آدرس‌ها پشتیبانی می‌کند. برای تنظیم یک نشانهٔ صوتی روی خانه خود، یا هر آدرس دیگری، از صفحه اصلی، روی نوار جستجو ضربه بزنید و سپس آدرس را تایپ کنید. در صفحه «جزئیات مکان»، روی دکمه «شروع نشانهٔ صوتی» ضربه بزنید."; +/* A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.how_close_to_destination.question" = "وقتی یک نشانهٔ صوتی را روی یک مقصد تنظیم می‌کنم، Soundscape چقدر مرا به آنجا نزدیک می‌کند؟"; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. {NumberedPlaceholder="Soundscape"} */ +"faq.how_close_to_destination.answer" = "Soundscape می‌تواند مکان مقصد شما را تا چند متر مشخص کند، اما نه کمتر. وقتی Soundscape تشخیص دهد که به مقصد خود نزدیک هستید، یک اعلان صوتی نهایی خواهید شنید که مقصد شما در نزدیکی است و نشانهٔ صوتی خاموش می‌شود. می‌توانید زمانی که نشانهٔ صوتی خاموش می‌شود را با رفتن به «نشانهٔ صوتی» از صفحه «تنظیمات» و سپس حرکت دادن نوار لغزنده «فاصله بی‌صدا شدن صدا» به بالا یا پایین تنظیم کنید."; +/* A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. */ +"faq.turn_beacon_back_on.question" = "آیا می‌توانم نشانهٔ صوتی را وقتی به مقصد خود نزدیک هستم دوباره روشن کنم؟"; +/* Preserve meter unit - Do not convert. A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. "Location Services" refers to the feature of the same name in iOS. It should be translated in the same manner that it is in the Settings app under Settings > Privacy > Location Services. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. Quotes written as " {NumberedPlaceholder="Soundscape","10"} */ +"faq.turn_beacon_back_on.answer" = "بله، می‌توانید نشانهٔ صوتی را پس از خاموش شدن توسط Soundscape با انتخاب دکمه «باصدا کردن نشانهٔ صوتی» دوباره روشن کنید؛ با این حال، از آنجا که خدمات موقعیت مکانی فقط تا حدود ۱۰ متر دقیق است، ما نمی‌توانیم رفتار نشانهٔ صوتی را زمانی که در چند متری مقصد خود هستید تضمین کنیم."; +/* Intersection - A junction where two or more roads meet or cross. Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.road_names.question" = "چرا Soundscape هنگام نزدیک شدن به یک تقاطع نام جاده‌ها را دو بار اعلام می‌کند؟"; +/* Intersection - A junction where two or more roads meet or cross. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. 'Spatial audio' is where the audio through your headphones sounds as though it is coming from a given direction, as if it was actually coming from a speaker. 'T' here refers to the shape of the intersection, it's a three way intersection that resembles the shape of the letter 'T'. {NumberedPlaceholder="Soundscape"} */ +"faq.road_names.answer" = "برای تطبیق با انواع طرح‌های تقاطع، Soundscape تقاطع‌ها را به عنوان بخش‌هایی از جاده‌ها که از یک نقطه مشترک جدا می‌شوند توصیف می‌کند. Soundscape از صدای فضایی برای نشان دادن نام جاده‌ای که به چپ می‌رود، نام جاده‌ای که مستقیم ادامه می‌یابد و نام جاده‌ای که به راست می‌رود، به این ترتیب استفاده می‌کند. اگر توصیف تقاطع با جاده‌ای که در آن هستید شروع شود به جای جاده‌ای به چپ، آنگاه تقاطع یک T است که جاده‌ای که در آن هستید مستقیم ادامه می‌یابد و یک جاده از سمت راست تلاقی می‌کند. به طور مشابه، اگر توصیف فقط شامل یک جاده به چپ و راست باشد، خواهید دانست که جاده‌ای که در آن هستید در یک T پیش روی شما به پایان می‌رسد. این روش توصیف تقاطع‌ها همچنین از موردی که یک جاده در یک تقاطع نام خود را تغییر می‌دهد پشتیبانی می‌کند."; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.why_not_every_business.question" = "چرا Soundscape هر کسب‌وکاری را که از کنارش عبور می‌کنم اعلام نمی‌کند؟"; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape","Open Street Map","OSM"} */ +"faq.why_not_every_business.answer" = "Soundscape طوری طراحی شده که بیش از حد پرحرف نباشد. علاوه بر این، از Open Street Map به عنوان منبع داده‌های خود استفاده می‌کند. Open Street Map (OSM, https://www.openstreetmap.org/) یک نقشه از جهان است که توسط جامعه توسعه و ویرایش می‌شود و به افراد متکی است تا داده‌ها را وارد و مدیریت کنند. اگر Soundscape یک کسب‌وکار یا نقطه مورد علاقه را اعلام نمی‌کند، محتمل‌ترین دلیل این است که آن کسب‌وکار هنوز توسط یکی از اعضای جامعه OSM اضافه نشده یا در برخی موارد به‌روزرسانی نشده است."; +/* Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. */ +"faq.callouts_stopping_in_vehicle.question" = "چرا برخی از اعلان‌های صوتی وقتی در وسیله نقلیه هستم، متوقف می‌شوند؟"; +/* Intersection - A junction where two or more roads meet or cross. Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, Approaching Intersection, Oxford Street goes left, Regents Street Continues ahead, Oxford Street goes right. Or Approaching Intersection, High Street continues ahead, Richmond Avenue goes right. */ +"faq.callouts_stopping_in_vehicle.answer" = "برای جلوگیری از زیاد شدن بیش از حد اعلان‌های صوتی، برخی دسته‌بندی‌ها، مانند تقاطع‌ها، هنگام سفر با وسیله نقلیه به طور خودکار اعلام نمی‌شوند."; +/* Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. */ +"faq.miss_a_callout.question" = "اگر یک اعلان صوتی را به خاطر سر و صدای محیط متوجه نشدم یا از دست دادم، چه کار کنم؟"; +/* Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. Quotes written as ". {NumberedPlaceholder="Soundscape"} */ +"faq.miss_a_callout.answer" = "Soundscape لیستی از اعلان‌های صوتی اخیر شما را نگه می‌دارد تا بتوانید اعلان‌هایی را که ممکن است از دست داده باشید، دوباره مرور کنید. برای پیدا کردن این لیست، روی نوار جستجو در صفحه اصلی Soundscape ضربه بزنید. در پایین این صفحه، بخشی برای «اعلان‌های صوتی اخیر» وجود دارد که اعلان صوتی از دست رفته شما در آن لیست شده است. همچنین، می‌توانید گوشی خود را تکان دهید تا آخرین اعلان صوتی تکرار شود. از بخش «مدیریت اعلان‌های صوتی» در صفحه «تنظیمات»، «تکرار اعلان‌های صوتی» را روشن کنید."; +// MARK: How Soundscape Works +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.section.how_soundscape_works" = "Soundscape چگونه کار می‌کند؟"; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.supported_phones.question" = "Soundscape روی چه گوشی‌هایی اجرا می‌شود؟"; +/* iPhone SE, 6S are Apple's models of phones. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape","Apple iOS","iPhone SE","iPhone 6S"} */ +"faq.supported_phones.answer" = "Soundscape در حال حاضر برای Apple iOS، روی آیفون SE، آیفون 6S و مدل‌های جدیدتر در دسترس است."; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.supported_headsets.question" = "از چه هدفون‌هایی باید با Soundscape استفاده کنم؟"; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. 3D spatial audio is where the audio through your headphones sounds as though it is coming from a given direction, as if it was actually coming from a speaker. Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. {NumberedPlaceholder="Soundscape"} */ +"faq.supported_headsets.answer" = "اینکه از چه هدفونی با Soundscape استفاده می‌کنید، یک موضوع شخصی است و هر گزینه‌ای مزایا و معایب خود را دارد. تنها الزام، استفاده از یک جفت هدفون استریو است تا بتوانید از اعلان‌های صوتی فضایی سه‌بعدی Soundscape بهره‌مند شوید."; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.battery_impact.question" = "Soundscape چه تأثیری بر باتری آیفون من دارد؟"; +/* Sleep - To put the app in an idle state for a period of time. Snooze - To put the app in an idle state that is interrupted by user movement. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape","iPhone"} */ +"faq.battery_impact.answer" = "عمر باتری بسته به مدل و عمر آیفون شما به طور قابل توجهی متفاوت است. بزرگترین عامل مصرف باتری، روشن بودن صفحه نمایش است، بنابراین برای به حداکثر رساندن عمر باتری گوشی، باید صفحه نمایش را تا حد امکان قفل نگه دارید. برای کمک به به حداقل رساندن تأثیر بر باتری آیفون، Soundscape دارای حالت خواب و حالت چرت زدن است. برای کاهش بیشتر مصرف باتری، زمانی که از Soundscape استفاده نمی‌کنید، باید آن را از طریق App Switcher آیفون خود به طور کامل ببندید."; +/* Sleep - To put the app in an idle state for a period of time. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.sleep_mode_battery.question" = "چگونه از حالت خواب برای به حداقل رساندن تأثیر Soundscape بر باتری گوشی خود استفاده کنم؟"; +/* Sleep - To put the app in an idle state for a period of time. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. "Location Services" refers to the feature of the same name in iOS. It should be translated in the same manner that it is in the Settings app under Settings > Privacy > Location Services. Quotes written as " {NumberedPlaceholder="Soundscape"} */ +"faq.sleep_mode_battery.answer" = "برای قرار دادن Soundscape در حالت خواب، دکمه «خواب» را در گوشه بالا سمت راست صفحه اصلی انتخاب کنید. وقتی این گزینه را انتخاب می‌کنید، Soundscape استفاده از خدمات موقعیت مکانی و داده تلفن همراه را متوقف می‌کند تا زمانی که شما آن را بیدار کنید."; +/* Snooze - To put the app in an idle state that is interrupted by user movement. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.snooze_mode_battery.question" = "چگونه از حالت چرت زدن برای به حداقل رساندن تأثیر Soundscape بر باتری گوشی خود استفاده کنم؟"; +/* Snooze - To put the app in an idle state that is interrupted by user movement. Sleep - To put the app in an idle state for a period of time. Wake Up - To restore the app from a sleep (idle) state. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. Quotes written as " {NumberedPlaceholder="Soundscape"} */ +"faq.snooze_mode_battery.answer" = "برای قرار دادن Soundscape در حالت چرت زدن، دکمه «خواب» را در گوشه بالا سمت راست صفحه اصلی انتخاب کنید. پس از اینکه Soundscape در حالت خواب قرار گرفت، دکمه «وقتی از اینجا رفتم بیدار شو» را انتخاب کنید و Soundscape تا زمانی که مکان فعلی خود را ترک کنید، در حالت کم‌مصرف قرار می‌گیرد."; +/* A question about how different headsets affect the phone's battery consumption */ +"faq.headset_battery_impact.question" = "انتخاب هدفون من چه تأثیری بر عمر باتری گوشی‌ام دارد؟"; +/* An answer to the question about how different headsets affect the phone's battery consumption. */ +"faq.headset_battery_impact.answer" = "در آزمایش‌های ما، مصرف باتری هدفون‌های بلوتوث با هدفون‌های سیمی قابل مقایسه است و نباید عامل مهمی در انتخاب هدفون باشد. با این حال، هر دو نوع هدفون داخل گوش و هدایت استخوانی دارای مدل‌های سیمی و بی‌سیم هستند."; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.background_battery_impact.question" = "اجرای Soundscape در پس‌زمینه چه تأثیری بر عمر باتری گوشی من دارد؟"; +/* 'Location Services' in the name of the iPhone feature that gives an app the iPhones location. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.background_battery_impact.answer" = "Soundscape از خدمات موقعیت مکانی برای تعیین مکان شما استفاده می‌کند. در آزمایش‌های ما، Soundscape بیشتر از یک برنامه نقشه معمولی باتری مصرف نمی‌کند؛ اما اگر نگران مصرف باتری گوشی خود هستید، در اینجا چند نکته برای کاهش مصرف آورده شده است:\n\n۱. تا حد امکان صفحه نمایش را زمانی که با برنامه تعامل ندارید، خاموش کنید.\n۲. زمانی که از برنامه استفاده نمی‌کنید، آن را ببندید. Soundscape به طور مداوم از خدمات موقعیت مکانی استفاده می‌کند تا همیشه مکان شما را بداند، حتی زمانی که حرکت نمی‌کنید. فراموش نکنید که هنگام شروع مجدد سفر، برنامه را دوباره راه‌اندازی کنید.\n۳. در هوای سرد، گوشی خود را گرم نگه دارید زیرا باتری‌ها در دمای پایین‌تر عملکرد ضعیف‌تری دارند."; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.mobile_data_use.question" = "Soundscape چه مقدار داده تلفن همراه مصرف می‌کند؟"; +/* Wi-Fi - The set of standards for delivering digital information over high-frequency, wireless local area networks, defined by IEEE 802.11. 'Force close' is referring to the way to completely close an iPhone app rather than just putting it in to the background. "Sleep" should be translated the in the same way as the string for key "sleep.sleep". Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.mobile_data_use.answer" = "مقدار داده تلفن همراه مصرفی به نحوه استفاده شما از Soundscape بستگی دارد. ما Soundscape را طوری طراحی کرده‌ایم که هنگام بیرون بودن، فقط مقدار کمی داده مصرف کند، مثلاً با ذخیره کردن نقاطی که از کنارشان عبور می‌کنید تا هر بار که به مکانی که قبلاً بوده‌اید بازمی‌گردید، نیازی به دانلود مجدد آنها نباشد. برای کاهش مقدار داده تلفن همراه مصرفی، اطمینان حاصل کنید که هر زمان ممکن است به وای-فای متصل هستید، به خصوص برای دانلود برنامه. زمانی که از Soundscape استفاده نمی‌کنید، باید از دکمه «خواب» برای قرار دادن Soundscape در حالت خواب استفاده کنید یا برنامه را به طور کامل ببندید."; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.difference_from_map_apps.question" = "Soundscape چه تفاوتی با دیگر برنامه‌های نقشه دارد؟"; +/* Wayfinding - The process or activity of ascertaining one’s position and planning and following a route. 3D sound is where the audio through your headphones sounds as though it is coming from a given direction, as if it was actually coming from a speaker. Intersection - A junction where two or more roads meet or cross. Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using spatial audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.difference_from_map_apps.answer" = "Soundscape توضیحات محیطی از اطراف شما را برای کمک به کاوش و مسیریابی ارائه می‌دهد. با استفاده از صدای فضایی، Soundscape نقاط مورد علاقه، پارک‌ها، جاده‌ها و تقاطع‌ها را از جهتی که به صورت فیزیکی در محیط اطراف شما قرار دارند، هنگام راه رفتن اعلام می‌کند. به عنوان مثال، اگر از کنار یک فروشگاه در سمت راست خود عبور کنید، نام فروشگاه را از سمت راست خود خواهید شنید. با نزدیک شدن به یک تقاطع، نام هر جاده را از جهتی که در آن قرار دارد، از چپ، مستقیم و راست خواهید شنید.\n\nبه جای مسیرهای گام به گام که اغلب توسط دیگر برنامه‌های نقشه ارائه می‌شود، Soundscape یک نشانهٔ صوتی را در جهت مقصد شما پخش می‌کند و شما را قادر می‌سازد تا با افزایش آگاهی از محیط اطراف و مکان مقصد خود، راه خود را پیدا کنید. Soundscape طوری طراحی شده که در پس‌زمینه اجرا شود و به شما امکان می‌دهد از یک برنامه مسیرهای گام به گام استفاده کنید، در حالی که همچنان آگاهی محیطی را در حین رسیدن به مقصد خود فراهم می‌کند."; +/* Wayfinding - The process or activity of ascertaining one’s position and planning and following a route. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.use_with_wayfinding_apps.question" = "چگونه از Soundscape با یک برنامه مسیریابی استفاده کنم؟"; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. Intersection - A junction where two or more roads meet or cross. {NumberedPlaceholder="Soundscape"} */ +"faq.use_with_wayfinding_apps.answer" = "Soundscape برای کمک به پر کردن جزئیاتی از محیط شما طراحی شده است که در غیر این صورت ممکن است از آنها آگاه نباشید. در حالی که به عنوان یک برنامه ناوبری گام به گام طراحی نشده است، می‌توان از آن در کنار چنین برنامه‌هایی برای ارائه اطلاعات تکمیلی استفاده کرد. برای استفاده از Soundscape با این برنامه‌ها، ابتدا برنامه ناوبری خود را شروع کنید. سپس، به Soundscape بروید و یک نشانهٔ صوتی را روی همان مقصدی که در برنامه ناوبری دارید، تنظیم کنید. در این مرحله، هر دو برنامه در حال اجرا خواهند بود و شما مسیرهای پیاده‌روی را از برنامه ناوبری خود خواهید شنید، در حالی که به‌روزرسانی‌هایی در مورد نقاط مورد علاقه، تقاطع‌ها و فاصله تا مقصد خود را از Soundscape دریافت می‌کنید."; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.controlling_what_you_hear.question" = "چگونه آنچه را که در Soundscape می‌شنوم و زمان شنیدن آن را کنترل کنم؟"; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. A 'beacon' or 'audio beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. Intersection - A junction where two or more roads meet or cross. Point of interest - A specific location that someone may find useful or interesting. Snooze - To put the app in an idle state that is interrupted by user movement. Sleep - To put the app in an idle state for a period of time. Quotes written as " {NumberedPlaceholder="Soundscape"} */ +"faq.controlling_what_you_hear.answer" = "Soundscape چندین راه برای کنترل آنچه می‌شنوید و زمان آن را فراهم می‌کند:\n\n۱. توقف فوری همه صداها: با دو انگشت روی صفحه دو بار ضربه بزنید تا همه صداها، از جمله هر اعلان صوتی در حال پخش و نشانهٔ صوتی اگر روشن باشد، فوراً خاموش شوند. اعلان‌های صوتی با نزدیک شدن به تقاطع یا نقطه مورد علاقه بعدی به طور خودکار از سر گرفته می‌شوند، اما نشانهٔ صوتی شنیدنی اینطور نیست. دکمه «باصدا کردن نشانهٔ صوتی» را در صفحه اصلی انتخاب کنید تا دوباره نشانهٔ صوتی را بشنوید.\n۲. توقف اعلان‌های صوتی خودکار: زمانی که در حال سفر نیستید یا به مقصدی رسیده‌اید، احتمالاً نیازی ندارید که Soundscape به اطلاع‌رسانی در مورد چیزهای اطراف شما ادامه دهد. به جای خروج از برنامه، می‌توانید Soundscape را در حالت چرت زدن قرار دهید و با حرکت شما بیدار خواهد شد، یا می‌توانید Soundscape را در حالت خواب قرار دهید و تا زمانی که شما آن را بیدار نکنید، خاموش خواهد ماند. همچنین، می‌توانید از منو «تنظیمات» را انتخاب کرده و همه اعلان‌های صوتی را در بخش «مدیریت اعلان‌های صوتی» خاموش کنید.\n۳. توقف نشانهٔ صوتی: سناریوهای مختلفی وجود دارد که ممکن است مقصدی را تنظیم کنید، اما به نشانهٔ صوتی شنیدنی نیاز نداشته باشید. به عنوان مثال، ممکن است دقیقاً بدانید چگونه به مقصد خود برسید، اما فقط می‌خواهید به‌روزرسانی‌های خودکار در مورد فاصله خود دریافت کنید. یا، ممکن است تقریباً بدانید چگونه به مقصد خود برسید و فقط زمانی که تقریباً به آنجا رسیده‌اید به نشانهٔ صوتی نیاز داشته باشید. در هر صورت، می‌توانید با تغییر دکمه «بی‌صدا کردن نشانهٔ صوتی»/«باصدا کردن نشانهٔ صوتی» در صفحه اصلی، زمان شنیدن نشانهٔ صوتی را انتخاب کنید."; +/* A frequently asked question about how the user should hold their phone */ +"faq.holding_phone_flat.question" = "آیا باید همیشه گوشی را در دستم نگه دارم؟"; +/* Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. A 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. Quotes written as " {NumberedPlaceholder="Soundscape"} */ +"faq.holding_phone_flat.answer" = "خیر! هنگام راه رفتن می‌توانید گوشی را در کیف یا جیب یا هر جای مناسب دیگری قرار دهید. Soundscape از جهت راه رفتن شما برای تشخیص اینکه کدام اعلان‌های صوتی را در سمت چپ و راست شما اعلام کند، استفاده خواهد کرد. وقتی حرکت را متوقف می‌کنید، Soundscape نمی‌داند که به کدام جهت رو کرده‌اید. اگر نشانهٔ صوتی شنیدنی روشن باشد، متوجه خواهید شد که تا زمانی که دوباره شروع به حرکت کنید، صدای آن کم می‌شود. می‌توانید هر زمان که بخواهید گوشی را بیرون بیاورید تا روی دکمه‌های «شنیدن محیط اطرافم» در پایین صفحه اصلی ضربه بزنید، اما اطمینان حاصل کنید که گوشی را طوری نگه داشته‌اید که بالای گوشی به سمتی که رو کرده‌اید و صفحه نمایش به سمت آسمان باشد. در این حالت «صاف»، Soundscape از قطب‌نمای گوشی برای تعیین جهتی که رو کرده‌اید استفاده کرده و اعلان‌های صوتی فضایی دقیقی ارائه می‌دهد. اگر نشانهٔ صوتی روشن باشد، همچنین متوجه خواهید شد که به حجم کامل خود بازمی‌گردد."; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.personalize_experience.question" = "به چه روش‌هایی می‌توانم تجربه Soundscape خود را شخصی‌سازی کنم؟"; +/* All of the terms in the string "Settings > Accessibility > Spoken Content > Voices" should be translated such that they are consistant with those in the iOS Settings app. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. 'Nearby Markers' is the name of one of the buttons in the app. 'Voiceover' is an iPhone feature to help people who are visually impaired use the iPhone. 'Audio Ducking' is the name of an accessibility feature on the iPhone which reduces the volume of an app while 'Voiceover' is speaking. 'Touch ID' is the name of the iPhone feature for unlocking your phone using your finger print. 'Face ID' is the name of the iPhone feature for unlocking your phone using your face. 'Passcode' and 'iPhone Unlock' are all names of sections in the iPhone 'Settings' app. 'My Location', 'Around Me' and 'Ahead of Me' are buttons in the Soundscape app. {NumberedPlaceholder="Soundscape", "VoiceOver","Touch ID", "Face ID","iOS"} */ +"faq.personalize_experience.answer" = "Soundscape به شما امکان می‌دهد سه جنبه کلیدی اعلان‌های صوتی را که هنگام راه رفتن می‌شنوید، سفارشی کنید:\n\n۱. صدا: می‌توانید انتخاب کنید که Soundscape از کدام یک از صداهای موجود در iOS استفاده کند، و همچنین سرعت صحبت کردن اعلان‌های صوتی را تنظیم کنید. از منو، «تنظیمات» را انتخاب کرده و سپس از «تنظیمات عمومی» «صدا» را برای تنظیم سرعت گفتار و تنظیمات صدا انتخاب کنید. صداهای اضافی، از جمله صداهای با کیفیت بهبود یافته، را می‌توان در برنامه تنظیمات iOS در تنظیمات > دسترسی‌پذیری > محتوای گفتاری > صداها دانلود کرد.\n۲. اندازه‌گیری فاصله: Soundscape به شما امکان می‌دهد تمام فواصل را به فوت یا متر بشنوید. از منو، «تنظیمات» را انتخاب کرده و سپس از «تنظیمات عمومی» «زبان و منطقه» را انتخاب کنید. بخش واحدهای اندازه‌گیری به شما امکان می‌دهد بین دو گزینه جابجا شوید: امپریال (فوت) و متریک (متر).\n۳. نشانگرها: می‌توانید دنیای خود را با هر چیزی که برایتان مهم است، نشانه‌گذاری کنید. می‌توانید چیزهایی را که شخصی و مرتبط با شما هستند مانند خانه، دفتر کار و فروشگاه مواد غذایی مورد علاقه‌تان را نشانه‌گذاری کنید. سپس Soundscape به طور خودکار مکان‌های نشانه‌گذاری شده را هنگام عبور یا نزدیک شدن به آنها اعلام می‌کند، یا می‌توانید از دکمه نشانگرهای نزدیک در پایین صفحه اصلی برای شنیدن یک اعلان صوتی فضایی از مکان‌های نشانه‌گذاری شده در اطراف خود استفاده کنید. این نشانگرها برای شما شخصی باقی می‌مانند و برای دیگران در دسترس نخواهند بود.\n\nعلاوه بر موارد فوق، تنظیمات زیر می‌توانند بر رفتار Soundscape تأثیر بگذارند:\n\n۱. نکات VoiceOver: وقتی نکات VoiceOver روشن باشد، اطلاعات بیشتری در مورد تمام دکمه‌های صفحه اصلی خواهید شنید. می‌توانید با رفتن به برنامه تنظیمات iOS و رفتن به دسترسی‌پذیری > VoiceOver > تفصیل، و روشن کردن تنظیمات بیان نکات، نکات VoiceOver را روشن کنید.\n۲. کاهش صدای خودکار: Soundscape طوری طراحی شده که با خاموش بودن کاهش صدای خودکار کار کند. وقتی کاهش صدای خودکار روشن باشد، اگر VoiceOver همزمان استفاده شود، شنیدن اعلان‌های صوتی خودکار ممکن است دشوار باشد. توصیه می‌کنیم کاهش صدای خودکار را خاموش کنید تا شنیدن تمام اعلان‌های صوتی خودکار آسان‌تر شود. کاهش صدای خودکار را می‌توان در تنظیمات VoiceOver یا از طریق روتور VoiceOver خاموش کرد.\n۳. Touch ID یا Face ID برای باز کردن قفل: تنظیم گوشی برای باز کردن قفل با استفاده از Touch ID یا Face ID، باز کردن قفل گوشی را سریع و آسان می‌کند و به نوبه خود به شما امکان می‌دهد تا در حین حرکت به سرعت به دکمه‌های مکان من، اطراف من و جلوی من دسترسی داشته باشید. باز کردن قفل Touch ID یا Face ID را در برنامه تنظیمات iOS تنظیم کنید."; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape","Open Street Map"} */ +"faq.what_is_osm.question" = "Open Street Map چیست و چرا ما از آن برای Soundscape استفاده می‌کنیم؟"; +/* Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape","Open Street Map"} */ +"faq.what_is_osm.answer" = "Soundscape از داده‌های نقشه جغرافیایی برای ارائه اعلان‌های اطلاعاتی در برنامه استفاده می‌کند. منبع اصلی نقشه‌ای که ما استفاده می‌کنیم Open Street Map (www.openstreetmap.org) است که یک پلتفرم نقشه‌برداری غنی ایجاد شده توسط جامعه است و به سازمان‌ها و افراد امکان می‌دهد تا کیفیت و جزئیات اطلاعات ارائه شده و دسترسی‌پذیری فضاهای خود را با استفاده از ابزارهای نویسندگی نقشه Open Street Map بهبود بخشند."; +// MARK: Tips & Tricks +/* The 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.tip.beacon_quiet" = "اگر گوشی خود را در جیب خود قرار دهید و حرکت را متوقف کنید، صدای نشانهٔ صوتی کم می‌شود زیرا Soundscape نمی‌تواند تشخیص دهد که به کدام جهت رو کرده‌اید. این مشکل را با شروع مجدد راه رفتن یا بیرون آوردن گوشی و نگه داشتن آن به صورت صاف حل کنید."; +/* The 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. "Start Audio Beacon" should be translated the same as "location_detail.action.beacon" Quotes written as " */ +"faq.tip.setting_beacon_on_address" = "شما می‌توانید یک نشانهٔ صوتی را روی هر آدرسی تنظیم کنید. از صفحه اصلی، روی نوار جستجو ضربه بزنید و سپس آدرس را تایپ کنید. پس از انتخاب آدرس در نتایج جستجو، صفحه «جزئیات مکان» نشان داده می‌شود که حاوی گزینه «شروع نشانهٔ صوتی» روی آدرس است. به این ترتیب، می‌توانید یک نشانهٔ صوتی را روی کسب‌وکارها، مکان‌ها، نقاط مورد علاقه و اقامتگاه‌هایی که در Open Street Map نیستند، تنظیم کنید."; +/* 'Nearby Places' is a screen in the app that shows a list of places that are close to the user. Quotes written as " */ +"faq.tip.finding_bus_stops" = "شما می‌توانید ایستگاه‌های اتوبوس نزدیک را با انتخاب فیلتر «حمل و نقل عمومی» در لیست مکان‌های نزدیک پیدا کنید."; +/* Preserve meters unit - Do not convert. The 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. {NumberedPlaceholder="50"} */ +"faq.tip.turning_beacon_off" = "می‌توانید صدای ریتمیک نشانهٔ صوتی را با استفاده از دکمه بی‌صدا در صفحه اصلی روشن و خاموش کنید. اگر نشانهٔ صوتی بی‌صدا باشد، همچنان هر ۵۰ متر یا بیشتر به‌روزرسانی‌هایی در مورد فاصله تا مقصد خود دریافت خواهید کرد."; +/* 'Manage Callouts' is the name of one of the sections on the Soundscape Settings screen. Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. Snooze - To put the app in an idle state that is interrupted by user movement. Sleep - To put the app in an idle state for a period of time. Quotes written as " {NumberedPlaceholder="Soundscape"} */ +"faq.tip.turning_off_auto_callouts" = "اگر همچنان می‌خواهید با Soundscape تعامل داشته باشید اما نمی‌خواهید اعلان‌های صوتی خودکار را بشنوید، می‌توانید آنها را با رفتن به بخش «مدیریت اعلان‌های صوتی» در صفحه «تنظیمات» از منو و سپس خاموش کردن «اجازه دادن به اعلان‌های صوتی» خاموش کنید. یا، اگر قرار نیست از Soundscape استفاده کنید، می‌توانید آن را با استفاده از دکمه «خواب» در صفحه اصلی در حالت خواب یا چرت زدن قرار دهید."; +/* Soundscape - The app that explores the use of innovative audio-based technology to enable people, particularly those with blindness or low vision, to build a richer awareness of their surroundings, thus becoming more confident and empowered to get around by using 3D audio cues to enrich ambient awareness and provide a new way to relate to the environment. {NumberedPlaceholder="Soundscape"} */ +"faq.tip.hold_phone_flat" = "Soundscape زمانی بهترین عملکرد را دارد که گوشی را صاف نگه دارید به طوری که صفحه نمایش رو به آسمان باشد و بالای گوشی به سمت جلو باشد."; +/* Marker - A location that has been marked as important by the user or application. This can be an address, a business or a custom place such as an entrance, a bus stop or a bench. The 'beacon' is an audio signal that helps fix the position of a location - the audio signal is played from the direction of a location which helps navigating towards that direction. 'Manage Markers' is the name of one of the options in the Soundscape menu. Quotes written as " */ +"faq.tip.create_marker_at_bus_stop" = "اگر یک مسیر اتوبوس وجود دارد که به طور منظم از آن استفاده می‌کنید، ایستگاه‌های سوار شدن و پیاده شدن خود را به عنوان نشانگر تنظیم کنید. به این ترتیب آنها ذخیره می‌شوند تا بتوانید دوباره به راحتی آنها را پیدا کنید، فقط به «نشانگرها و مسیرها» از صفحه اصلی بروید و آنها را در صفحه «نشانگرها» پیدا کنید. می‌توانید یک نشانهٔ صوتی را روی آنها تنظیم کنید و به‌روزرسانی‌های دوره‌ای در مورد اینکه چقدر به ایستگاه خروج خود نزدیک هستید، دریافت خواهید کرد. توجه: می‌توانید صدای ریتمیک را خاموش کنید و همچنان در طول مسیر به‌روزرسانی‌های فاصله را دریافت خواهید کرد."; +/* Callout - a short audio clip with speech and/or sound effect serving as a piece of information. For example, the application can output an audio callout to notify the user that the battery is low. */ +"faq.tip.two_finger_double_tap" = "دو بار ضربه زدن با دو انگشت روی صفحه، هرگونه اعلان صوتی فعال را بی‌صدا می‌کند."; +/* Describe feature for automatically reversing a route. Quotes written as " */ +"faq.tip.reverse_route" = "انتخاب «شروع مسیر معکوس» از صفحه «جزئیات مسیر» به شما امکان می‌دهد یک مسیر را به صورت معکوس طی کنید و یک کپی از مسیر را با ایستگاه‌ها در ترتیب معکوس ذخیره می‌کند. توجه داشته باشید که «شروع مسیر معکوس» اگر مسیر قبلاً ذخیره شده باشد، کپی دیگری از همان مسیر را ذخیره نخواهد کرد."; +/* Title for donation screen */ +"donation.title" = "حمایت مالی از جامعه Soundscape"; +/* text for donation screen */ +"donation.body" = "لطفاً با حمایت مالی در صفحه جمع‌آوری کمک‌های مالی ما، از توسعه مداوم برنامه جامعه Soundscape حمایت کنید. هر کمک مالی ما را یک قدم به چشم‌انداز خود نزدیک‌تر می‌کند تا به تحقق جهانی کمک کنیم که در آن همه از طریق فناوری بهبودبخش زندگی ما، دسترسی برابری به اطلاعات پیرامون خود داشته باشند."; +/* Donation link title */ +"donation.link" = "رفتن به صفحه جمع‌آوری کمک‌های مالی"; + + + + + + + + + + + + + + + + + + + + diff --git a/apps/ios/GuideDogs/Assets/Localization/fi-FI.lproj/Localizable.strings b/apps/ios/GuideDogs/Assets/Localization/fi-FI.lproj/Localizable.strings index 840f33418..787957c27 100644 --- a/apps/ios/GuideDogs/Assets/Localization/fi-FI.lproj/Localizable.strings +++ b/apps/ios/GuideDogs/Assets/Localization/fi-FI.lproj/Localizable.strings @@ -4131,7 +4131,7 @@ /* */ -"faq.when_to_use_soundscape.answer" = "Soundscapella on ominaisuuksia ja hyötyjä monissa erilaisissa skenaarioissa ja aikajaksoilla. Kokemasi Soundscapen hyödyllisyys voi myös kehittyä ajan myötä, joten saatat käyttää sitä tänään eri tavalla kuin kolmen kuukauden päästä. Sovelluksista ajatellaan usein: \"Minkä ongelman tämä sovellus ratkaisee hyvin?\" Soundscapea voidaan käyttää tapauskohtaisesti erityisten tietotarpeiden täyttämiseen, kuten päämäärän seurantaan matkalla sinne, suunnistamisen helpottamiseen metroasemalta poistuttaessa, sijainnin ymmärtämiseen autosta poistuttaessa tai seuraavan risteyksen kadunnimien tai etäisyyden selvittämiseen. Soundscapen filosofia on kuitenkin \"valaisee maailmasi äänellä\", ja se on suunniteltu käytettäväksi joka kerta, kun olet ulkona tarjoamaan tietoisuutta ympäristöstä, kuten pysymään ajan tasalla kaduista, joilla liikut, kulkusuunnastasi ja niiden yritysten nimistä, joiden ohi kävelet. Käyttäjämme ovat kutsuneet Soundscapea tässä käyttötilassa \"kivaksi seuralaissovellukseksi\", joka tukee \"intuitiivista näkemystä\" \"mielikuvakartan aukkojen täyttämisestä\" ja tarjoaa parempaa \"itseluottamusta kävellessä\". Tässä on lisää esimerkintöjä siitä, kuinka käyttäjämme sisällyttävät Soundscapen elämäänsä:\n\n\"Soundscape auttoi minut takaisin oikealle reitille, kun poistuin linja-autosta ja lähdin väärään suuntaan.\"\n\n\Jopa kaupungissa, jossa olen asunut kolme vuotta, olen rakentanut paremman kuvan siitä, mitä ympärilläni on [Soundscapen avulla].\"\n\n\"3D-ääni parantaa kävelykokemustani, koska tunnen olevani paremmassa yhteydessä ympäristööni…kokeilen todennäköisemmin uutta reittiä, kun sovellus on käytössäni.\"\n\n\"Kaipaan intuitiivista kokemusta ympäriinsä kävelystä ja asioiden huomaamisesta. Soundscapen käyttö on mukavaa, sillä ympäristöni asioista kuuleminen on vaivatonta. Tiedot suhteista ovat hyödyllisiä ja se on mahtava sovellus ympäristötietoisuuden kehittämiseksi ja kauppakäytävien tutkimiseen.\"\n\n\"[Käytin Soundscapea] löytääkseni pubin keskellä Yorkia. [Käytin] useita sovelluksen toimintoja selvittääkseni ensin sen sijainnin ja sitten löytääkseni sen. Sovellus toi minut kolmen metrin päähän ovesta, upeaa!\""; +"faq.when_to_use_soundscape.answer" = "Soundscapella on ominaisuuksia ja hyötyjä monissa erilaisissa skenaarioissa ja aikajaksoilla. Kokemasi Soundscapen hyödyllisyys voi myös kehittyä ajan myötä, joten saatat käyttää sitä tänään eri tavalla kuin kolmen kuukauden päästä. Sovelluksista ajatellaan usein: \"Minkä ongelman tämä sovellus ratkaisee hyvin?\" Soundscapea voidaan käyttää tapauskohtaisesti erityisten tietotarpeiden täyttämiseen, kuten päämäärän seurantaan matkalla sinne, suunnistamisen helpottamiseen metroasemalta poistuttaessa, sijainnin ymmärtämiseen autosta poistuttaessa tai seuraavan risteyksen kadunnimien tai etäisyyden selvittämiseen. Soundscapen filosofia on kuitenkin \"valaisee maailmasi äänellä\", ja se on suunniteltu käytettäväksi joka kerta, kun olet ulkona tarjoamaan tietoisuutta ympäristöstä, kuten pysymään ajan tasalla kaduista, joilla liikut, kulkusuunnastasi ja niiden yritysten nimistä, joiden ohi kävelet. Käyttäjämme ovat kutsuneet Soundscapea tässä käyttötilassa \"kivaksi seuralaissovellukseksi\", joka tukee \"intuitiivista näkemystä\" \"mielikuvakartan aukkojen täyttämisestä\" ja tarjoaa parempaa \"itseluottamusta kävellessä\". Tässä on lisää esimerkintöjä siitä, kuinka käyttäjämme sisällyttävät Soundscapen elämäänsä:\n\n\"Soundscape auttoi minut takaisin oikealle reitille, kun poistuin linja-autosta ja lähdin väärään suuntaan.\"\n\nJopa kaupungissa, jossa olen asunut kolme vuotta, olen rakentanut paremman kuvan siitä, mitä ympärilläni on [Soundscapen avulla].\"\n\n\"3D-ääni parantaa kävelykokemustani, koska tunnen olevani paremmassa yhteydessä ympäristööni…kokeilen todennäköisemmin uutta reittiä, kun sovellus on käytössäni.\"\n\n\"Kaipaan intuitiivista kokemusta ympäriinsä kävelystä ja asioiden huomaamisesta. Soundscapen käyttö on mukavaa, sillä ympäristöni asioista kuuleminen on vaivatonta. Tiedot suhteista ovat hyödyllisiä ja se on mahtava sovellus ympäristötietoisuuden kehittämiseksi ja kauppakäytävien tutkimiseen.\"\n\n\"[Käytin Soundscapea] löytääkseni pubin keskellä Yorkia. [Käytin] useita sovelluksen toimintoja selvittääkseni ensin sen sijainnin ja sitten löytääkseni sen. Sovellus toi minut kolmen metrin päähän ovesta, upeaa!\""; /* */ diff --git a/apps/ios/GuideDogs/Assets/Localization/nl-NL.lproj/Localizable.strings b/apps/ios/GuideDogs/Assets/Localization/nl-NL.lproj/Localizable.strings index ca15fd969..0ab5e416f 100644 --- a/apps/ios/GuideDogs/Assets/Localization/nl-NL.lproj/Localizable.strings +++ b/apps/ios/GuideDogs/Assets/Localization/nl-NL.lproj/Localizable.strings @@ -4131,7 +4131,7 @@ /* */ -"faq.when_to_use_soundscape.answer" = "Soundscape heeft voorzieningen en voordelen voor allerlei verschillende scenario’s en momenten. Bovendien kan de waarde van Soundscape voor u in de loop der tijd veranderen doordat u het over drie maanden misschien anders gebruikt dan nu. Mensen proberen vaak te bedenken \"waarvoor kan deze app goed worden gebruikt?\" U kunt Soundscape incidenteel gebruiken, wanneer u specifieke informatie zoekt, zoals het bijhouden van de voortgang naar uw bestemming, voor oriëntatie als u uit de metro komt, het bepalen van uw positie wanneer u uit de auto stapt, het zoeken naar straatnamen of het bepalen van de afstand tot het volgende kruispunt. Soundscape is echter gebaseerd op de filosofie \"de wereld verlichten met geluid \", en ontworpen voor wanneer u onderweg bent, om u meer bewust te maken van uw omgeving, zoals de namen van de straat waarin u loopt, de richting waarin u gaat en de namen van de bedrijven die u passeert. Gebruikers beschrijven deze toepassing van Soundscape als volgt: \"fijne companion-app\" met \"meerwaarde\", om \"lacunes op te vullen in mijn mentale voorstelling\" en om met \"extra zelfvertrouwen te lopen\". Hier zijn nog een paar voorbeelden van hoe gebruikers Soundscape toepassen:\n\n\"Soundscape hielp me om de juiste route terug te vinden toen ik na het uitstappen uit de bus de verkeerde kant op liep.\\n\n\Zelfs in de stad waar ik al 3 jaar woon, heb ik [met Soundscape] een beter beeld gekregen van wat er Om me heen is.\\n\n\Het 3D-geluid geeft een betere beleving bij het lopen en ik voel meer verbinding met mijn omgeving… Ik zal met deze app nu eerder een nieuwe route uitproberen.\\n\n\Als je gewoon rondloopt, weet je veel dingen niet en mis je van alles. Met Soundscape hoef je geen moeite te doen om van alles te horen over je omgeving. De relationele informatie is nuttig en het is een geweldige app om je bewust te worden van je situatie en het ontdekken van winkelstraten.\"\n\n\"[Ik heb Soundscape gebruikt] om een pub te zoeken midden in York. Met allerlei opties heb ik eerst de pub geselecteerd en daarna de route gevolgd. De app bracht me tot 3 meter voor de deur. Geweldig!\""; +"faq.when_to_use_soundscape.answer" = "Soundscape heeft voorzieningen en voordelen voor allerlei verschillende scenario’s en momenten. Bovendien kan de waarde van Soundscape voor u in de loop der tijd veranderen doordat u het over drie maanden misschien anders gebruikt dan nu. Mensen proberen vaak te bedenken \"waarvoor kan deze app goed worden gebruikt?\" U kunt Soundscape incidenteel gebruiken, wanneer u specifieke informatie zoekt, zoals het bijhouden van de voortgang naar uw bestemming, voor oriëntatie als u uit de metro komt, het bepalen van uw positie wanneer u uit de auto stapt, het zoeken naar straatnamen of het bepalen van de afstand tot het volgende kruispunt. Soundscape is echter gebaseerd op de filosofie \"de wereld verlichten met geluid \", en ontworpen voor wanneer u onderweg bent, om u meer bewust te maken van uw omgeving, zoals de namen van de straat waarin u loopt, de richting waarin u gaat en de namen van de bedrijven die u passeert. Gebruikers beschrijven deze toepassing van Soundscape als volgt: \"fijne companion-app\" met \"meerwaarde\", om \"lacunes op te vullen in mijn mentale voorstelling\" en om met \"extra zelfvertrouwen te lopen\". Hier zijn nog een paar voorbeelden van hoe gebruikers Soundscape toepassen:\n\n\"Soundscape hielp me om de juiste route terug te vinden toen ik na het uitstappen uit de bus de verkeerde kant op liep.\\n\nZelfs in de stad waar ik al 3 jaar woon, heb ik [met Soundscape] een beter beeld gekregen van wat er Om me heen is.\\n\nHet 3D-geluid geeft een betere beleving bij het lopen en ik voel meer verbinding met mijn omgeving… Ik zal met deze app nu eerder een nieuwe route uitproberen.\\n\nAls je gewoon rondloopt, weet je veel dingen niet en mis je van alles. Met Soundscape hoef je geen moeite te doen om van alles te horen over je omgeving. De relationele informatie is nuttig en het is een geweldige app om je bewust te worden van je situatie en het ontdekken van winkelstraten.\"\n\n\"[Ik heb Soundscape gebruikt] om een pub te zoeken midden in York. Met allerlei opties heb ik eerst de pub geselecteerd en daarna de route gevolgd. De app bracht me tot 3 meter voor de deur. Geweldig!\""; /* */ diff --git a/apps/ios/GuideDogs/Assets/Localization/pt-BR.lproj/Localizable.strings b/apps/ios/GuideDogs/Assets/Localization/pt-BR.lproj/Localizable.strings index 5d8eee218..98584c385 100644 --- a/apps/ios/GuideDogs/Assets/Localization/pt-BR.lproj/Localizable.strings +++ b/apps/ios/GuideDogs/Assets/Localization/pt-BR.lproj/Localizable.strings @@ -1050,10 +1050,6 @@ "location_detail.action.preview.hint.disabled" = "O Street Preview será desativado enquanto a orientação pela rota estiver ativa"; -/* */ -"navilens.title" = "Iniciar NaviLens"; - - /* */ "location_detail.action.directions.hint" = "Dê um toque duplo para abrir esta localização em um aplicativo de mapas externo"; diff --git a/apps/ios/GuideDogs/Assets/Localization/pt-PT.lproj/Localizable.strings b/apps/ios/GuideDogs/Assets/Localization/pt-PT.lproj/Localizable.strings index ac267efcd..e7ea84618 100644 --- a/apps/ios/GuideDogs/Assets/Localization/pt-PT.lproj/Localizable.strings +++ b/apps/ios/GuideDogs/Assets/Localization/pt-PT.lproj/Localizable.strings @@ -1049,9 +1049,6 @@ /* */ "location_detail.action.preview.hint.disabled" = "O Street Preview está desativado enquanto a orientação de rotas está ativa"; -/* */ -"navilens.title" = "Iniciar NaviLens"; - /* */ "location_detail.action.directions.hint" = "Faça duplo toque para abrir esta localização numa aplicação de mapas externa"; diff --git a/apps/ios/GuideDogs/Assets/Localization/ru.lproj/InfoPlist.strings b/apps/ios/GuideDogs/Assets/Localization/ru.lproj/InfoPlist.strings new file mode 100644 index 000000000..2e1a1e4a5 --- /dev/null +++ b/apps/ios/GuideDogs/Assets/Localization/ru.lproj/InfoPlist.strings @@ -0,0 +1,7 @@ +/* + InfoPlist.strings + Soundscape + + Copyright (c) Soundscape Community contributors. + Licensed under the MIT License. +*/ diff --git a/apps/ios/GuideDogs/Assets/Localization/ru.lproj/Localizable.strings b/apps/ios/GuideDogs/Assets/Localization/ru.lproj/Localizable.strings new file mode 100644 index 000000000..e69de29bb diff --git a/apps/ios/GuideDogs/Code/App/AppContext.swift b/apps/ios/GuideDogs/Code/App/AppContext.swift index c95dcd7c6..e65c0592b 100644 --- a/apps/ios/GuideDogs/Code/App/AppContext.swift +++ b/apps/ios/GuideDogs/Code/App/AppContext.swift @@ -376,7 +376,7 @@ extension AppContext { struct Links { static func privacyPolicyURL(for locale: Locale) -> URL { - return URL(string: "https://ialabs.ie/privacy-policy")! + return URL(string: "https://vially.io/privacy-policy")! } static func servicesAgreementURL(for locale: Locale) -> URL { diff --git a/apps/ios/GuideDogs/Code/App/BuildSettings.swift b/apps/ios/GuideDogs/Code/App/BuildSettings.swift index e108c0255..8c44acf43 100644 --- a/apps/ios/GuideDogs/Code/App/BuildSettings.swift +++ b/apps/ios/GuideDogs/Code/App/BuildSettings.swift @@ -20,9 +20,9 @@ class BuildSettings { enum Source: String { case local - case appCenter case testFlight case appStore + case adhoc } // MARK: Properties @@ -41,8 +41,6 @@ class BuildSettings { switch configuration { case .debug: return .local - case .adhoc: - return .appCenter case .release: // TestFlight builds contain an App Store receipt file named "sandboxReceipt" // Other sources have a receipt file named "receipt" @@ -52,6 +50,8 @@ class BuildSettings { } else { return .appStore } + case .adhoc: + return .adhoc } } diff --git a/apps/ios/GuideDogs/Code/App/Framework Extensions/String Extensions/String+Extension.swift b/apps/ios/GuideDogs/Code/App/Framework Extensions/String Extensions/String+Extension.swift index 74100798f..c96de692f 100644 --- a/apps/ios/GuideDogs/Code/App/Framework Extensions/String Extensions/String+Extension.swift +++ b/apps/ios/GuideDogs/Code/App/Framework Extensions/String Extensions/String+Extension.swift @@ -131,10 +131,6 @@ extension String { return output } - - func accessibilityString() -> String { - return self.lowercased().replacingOccurrences(of: "callout", with: "call out") - } public func urlEncoded(plusForSpace: Bool = true) -> String? { let allowed = NSMutableCharacterSet.alphanumeric() diff --git a/apps/ios/GuideDogs/Code/App/Logging/GDATelemetry.swift b/apps/ios/GuideDogs/Code/App/Logging/GDATelemetry.swift index 417f79a9d..053c23863 100644 --- a/apps/ios/GuideDogs/Code/App/Logging/GDATelemetry.swift +++ b/apps/ios/GuideDogs/Code/App/Logging/GDATelemetry.swift @@ -5,9 +5,9 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. // +// This is just a stub, MS used AppCenter which is being depricated. import Foundation -import AppCenterAnalytics public class GDATelemetry { @@ -21,8 +21,7 @@ public class GDATelemetry { } set { SettingsContext.shared.telemetryOptout = !newValue - Analytics.enabled = newValue - } + } } class func trackScreenView(_ screenName: String, with properties: [String: String]? = nil) { @@ -48,8 +47,6 @@ public class GDATelemetry { if debugLog { print("[TEL] Event tracked: \(eventName)" + (propertiesToSend.isEmpty ? "" : " \(propertiesToSend)")) } - - Analytics.trackEvent(eventName, withProperties: propertiesToSend) } } diff --git a/apps/ios/GuideDogs/Code/App/Settings/SettingsContext.swift b/apps/ios/GuideDogs/Code/App/Settings/SettingsContext.swift index bca0eddd0..9e62b9eaf 100644 --- a/apps/ios/GuideDogs/Code/App/Settings/SettingsContext.swift +++ b/apps/ios/GuideDogs/Code/App/Settings/SettingsContext.swift @@ -31,7 +31,6 @@ class SettingsContext { fileprivate static let appUseCount = "GDAAppUseCount" fileprivate static let newFeaturesLastDisplayedVersion = "GDANewFeaturesLastDisplayedVersion" fileprivate static let clientIdentifier = "GDAUserDefaultClientIdentifier" - fileprivate static let servicesHostName = "GDAServicesHostName" fileprivate static let metricUnits = "GDASettingsMetric" fileprivate static let locale = "GDASettingsLocaleIdentifier" fileprivate static let voiceID = "GDAAppleSynthVoice" @@ -63,6 +62,8 @@ class SettingsContext { fileprivate static let ttsGain = "GDATTSAudioGain" fileprivate static let beaconGain = "GDABeaconAudioGain" fileprivate static let afxGain = "GDAAFXAudioGain" + fileprivate static let autoUnmuteEnabled = "GDAAutoUnmuteEnabled" + // MARK: Notification Keys @@ -111,7 +112,9 @@ class SettingsContext { Keys.audioSessionMixesWithOthers: true, Keys.markerSortStyle: SortStyle.distance.rawValue, Keys.leaveImmediateVicinityDistance: 30.0, - Keys.enterImmediateVicinityDistance: 15.0 + Keys.enterImmediateVicinityDistance: 15.0, + Keys.autoUnmuteEnabled: false + ]) resetLocaleIfNeeded() @@ -164,22 +167,6 @@ class SettingsContext { } } - var servicesHostName: String { - get { - // Allow URL to be reset to default when it is cleared - if let servicesHostName = userDefaults.string(forKey: Keys.servicesHostName), !servicesHostName.isEmpty { - return servicesHostName - } else { - let servicesHostName = "https://tiles.soundscape.services" - userDefaults.set(servicesHostName, forKey: Keys.servicesHostName) - return servicesHostName - } - } - set(newValue) { - userDefaults.set(newValue, forKey: Keys.servicesHostName) - } - } - var metricUnits: Bool { get { return userDefaults.bool(forKey: Keys.metricUnits) @@ -339,6 +326,16 @@ class SettingsContext { } } + var autoUnmuteEnabled: Bool { + get { + return userDefaults.bool(forKey: Keys.autoUnmuteEnabled) + } + set { + userDefaults.set(newValue, forKey: Keys.autoUnmuteEnabled) + } + } + + // MARK: Push Notifications var apnsDeviceToken: Data? { @@ -397,8 +394,6 @@ class SettingsContext { } set { userDefaults.set(newValue, forKey: Keys.leaveImmediateVicinityDistance) - // Ensure leave is always 15m greater than enter - userDefaults.set(max(newValue - 15.0, 0.0), forKey: Keys.enterImmediateVicinityDistance) } } @@ -408,8 +403,6 @@ class SettingsContext { } set { userDefaults.set(newValue, forKey: Keys.enterImmediateVicinityDistance) - // Ensure leave is always 15m greater than enter - userDefaults.set(newValue + 15.0, forKey: Keys.leaveImmediateVicinityDistance) } } } @@ -504,3 +497,4 @@ extension SettingsContext: AutoCalloutSettingsProvider { } } } + diff --git a/apps/ios/GuideDogs/Code/App/Soundscape-Bridging-Header.h b/apps/ios/GuideDogs/Code/App/Soundscape-Bridging-Header.h index 29ef59b75..bcac9a000 100644 --- a/apps/ios/GuideDogs/Code/App/Soundscape-Bridging-Header.h +++ b/apps/ios/GuideDogs/Code/App/Soundscape-Bridging-Header.h @@ -12,4 +12,4 @@ // Helpers #import "GDAJSONObject.h" #import "ObjCExceptionHandling.h" -#import "GDAStateMachine.h" + diff --git a/apps/ios/GuideDogs/Code/Audio/AudioEngine.swift b/apps/ios/GuideDogs/Code/Audio/AudioEngine.swift index ec4cd795e..e20f7a1a8 100644 --- a/apps/ios/GuideDogs/Code/Audio/AudioEngine.swift +++ b/apps/ios/GuideDogs/Code/Audio/AudioEngine.swift @@ -550,6 +550,11 @@ class AudioEngine: AudioEngineProtocol { return } + // Check if we should start before activating the session + guard shouldStart() else { + return + } + if activateAudioSession { // We try to forcibly activate the audio session, even if we believe it's not needed (`needsActivation == false`). // This is because of the following issue: @@ -565,19 +570,6 @@ class AudioEngine: AudioEngineProtocol { isSessionInterrupted = false } - guard shouldStart() else { - // If the audio engine has started, make sure all the paused players are resumed if needed. - if state == .started { - if !resume() { - // If resuming wasn't successful because one of the players could not be resumed, - // that player will be marked as done. If this was the case, try to play the - // next sound, which will either play or report finished. - playNextSound() - } - } - return - } - if isConfigChangePending { connectNodes() isConfigChangePending = false @@ -964,7 +956,7 @@ class AudioEngine: AudioEngineProtocol { guard self.state != .stopped else { GDLogAudioError("Unable to play sounds. Audio engine is stopped.") - callback?(false) + Task { @MainActor in callback?(false) } return } @@ -1099,7 +1091,9 @@ class AudioEngine: AudioEngineProtocol { self.play(nextSounds, completion: completion) } - callback?(success) + Task { @MainActor in + callback?(success) + } } // MARK: 3D Audio Environment @@ -1253,6 +1247,14 @@ extension AudioEngine: AudioSessionManagerDelegate { // Make sure the interruption flag is cleared if the audio session is re-activated. isSessionInterrupted = false + // Don't try to start the engine if there's a call in progress and we're not active. + // The session might be activated by the system or remain active during interruptions, + // but we shouldn't start audio playback until the app is actually ready. + guard shouldStart() else { + GDLogAudioVerbose("Audio session activated but engine should not start yet") + return + } + start(activateAudioSession: false) } diff --git a/apps/ios/GuideDogs/Code/Audio/DiscreteAudioPlayer.swift b/apps/ios/GuideDogs/Code/Audio/DiscreteAudioPlayer.swift index aeba9e942..f5fb2b32d 100644 --- a/apps/ios/GuideDogs/Code/Audio/DiscreteAudioPlayer.swift +++ b/apps/ios/GuideDogs/Code/Audio/DiscreteAudioPlayer.swift @@ -251,43 +251,48 @@ class DiscreteAudioPlayer: BaseAudioPlayer { guard let `self` = self else { return } - - guard self.layerStates[layer].bufferQueue.isEmpty else { - self.wasPaused = true - return - } + // Serialize all state access on the player's queue to avoid races + self.queue.async { + if !self.layerStates[layer].bufferQueue.isEmpty { + self.wasPaused = true + return + } - guard self.layerStates[layer].playbackDispatchGroupWasEntered else { - GDLogAudioVerbose("Silent buffer played back, but dispatch group was never entered!") - return - } - - guard !self.layerStates[layer].playbackDispatchGroupWasLeft else { - GDLogAudioVerbose("Silent buffer played back, but dispatch group was already left!") - return + guard self.layerStates[layer].playbackDispatchGroupWasEntered else { + GDLogAudioVerbose("Silent buffer played back, but dispatch group was never entered!") + return + } + + guard !self.layerStates[layer].playbackDispatchGroupWasLeft else { + GDLogAudioVerbose("Silent buffer played back, but dispatch group was already left!") + return + } + + self.layerStates[layer].playbackDispatchGroupWasLeft = true + self.channelPlayedBackDispatchGroup.leave() } - - self.layerStates[layer].playbackDispatchGroupWasLeft = true - self.channelPlayedBackDispatchGroup.leave() } return } // Schedule this buffer (and use the dispatch group to know when it is done playing) - layerStates[layer].bufferQueue.enqueue(buffer) - layerStates[layer].bufferCount += 1 + // Serialize mutations to layer state on the queue + queue.async { [weak self] in + guard let self = self else { return } + self.layerStates[layer].bufferQueue.enqueue(buffer) + self.layerStates[layer].bufferCount += 1 + } layers[layer].player.scheduleBuffer(buffer, completionCallbackType: .dataRendered) { [weak self] (_) in guard let `self` = self else { return } - - // Only log completion and remove from the buffer queue if the audio actually played back - guard !self.wasPaused else { - return - } - + // Ensure reads/writes occur on the queue to avoid races self.queue.async { + // Only log completion and remove from the buffer queue if the audio actually played back + if self.wasPaused { + return + } _ = self.layerStates[layer].bufferQueue.dequeue() } } diff --git a/apps/ios/GuideDogs/Code/Behaviors/Default/Callouts/DestinationCallout.swift b/apps/ios/GuideDogs/Code/Behaviors/Default/Callouts/DestinationCallout.swift index 00180996c..aaf398f2b 100644 --- a/apps/ios/GuideDogs/Code/Behaviors/Default/Callouts/DestinationCallout.swift +++ b/apps/ios/GuideDogs/Code/Behaviors/Default/Callouts/DestinationCallout.swift @@ -91,7 +91,12 @@ struct DestinationCallout: POICalloutProtocol { // Inform the user why the audio beacon has stopped if causedAudioDisabled { let earcon = GlyphSound(.beaconFound) - let tts = TTSSound(GDLocalizedString("beacon.beacon_location_within_audio_beacon_muted", formattedDistance), at: markerLocation) + var text = GDLocalizedString("beacon.beacon_location_within_audio_beacon_muted", formattedDistance) + // Append suggestion to launch NaviLens if available at location + if (poi != nil) && LocationDetail(entity: poi!).source.hasNaviLens { + text += " " + GDLocalizedString("beacon.suggest_navilens") + } + let tts = TTSSound(text, at: markerLocation) guard let layered = LayeredSound(earcon, tts) else { return Sounds([earcon, tts]) diff --git a/apps/ios/GuideDogs/Code/Behaviors/Default/Callouts/POICallout.swift b/apps/ios/GuideDogs/Code/Behaviors/Default/Callouts/POICallout.swift index 32345c262..4469c1f15 100644 --- a/apps/ios/GuideDogs/Code/Behaviors/Default/Callouts/POICallout.swift +++ b/apps/ios/GuideDogs/Code/Behaviors/Default/Callouts/POICallout.swift @@ -171,8 +171,9 @@ struct POICallout: POICalloutProtocol { sounds.append(TTSSound(formattedName, at: soundLocation)) } - // Announce "NaviLens available" for NaviLens-enabled locations - if poi.superCategory == "navilens" { + // Announce "NaviLens available" for NaviLens-enabled locations, + // unless NaviLens is already in the name + if poi.superCategory == "navilens" && !name.lowercased().contains("navilens") { sounds.append(TTSSound(GDLocalizedString("directions.navilens_available"), at: soundLocation)) } @@ -185,9 +186,9 @@ struct POICallout: POICalloutProtocol { func moreInfoDescription(for location: CLLocation?) -> String { guard let locationDescription = distanceDescription(for: location, tts: true) else { - return GDLocalizedString("announced_name.named", origin.localizedStringForAccessibility, timeDescription) + return GDLocalizedString("announced_name.named", origin.localizedString, timeDescription) } - return GDLocalizedString("announced_name_distance_away.named", origin.localizedStringForAccessibility, timeDescription, locationDescription) + return GDLocalizedString("announced_name_distance_away.named", origin.localizedString, timeDescription, locationDescription) } } diff --git a/apps/ios/GuideDogs/Code/Behaviors/Guided Tour/TourDetail.swift b/apps/ios/GuideDogs/Code/Behaviors/Guided Tour/TourDetail.swift index 4cdd212b0..8831e988a 100644 --- a/apps/ios/GuideDogs/Code/Behaviors/Guided Tour/TourDetail.swift +++ b/apps/ios/GuideDogs/Code/Behaviors/Guided Tour/TourDetail.swift @@ -41,6 +41,10 @@ class TourDetail: RouteDetailProtocol { var id: String { return event.id } + + var isExpired: Bool { + return event.isExpired + } var displayName: String { if let name = name, name.isEmpty == false { diff --git a/apps/ios/GuideDogs/Code/Behaviors/Helpers/CalloutStateMachine.swift b/apps/ios/GuideDogs/Code/Behaviors/Helpers/CalloutStateMachine.swift index 95925c9ac..d77954e6b 100644 --- a/apps/ios/GuideDogs/Code/Behaviors/Helpers/CalloutStateMachine.swift +++ b/apps/ios/GuideDogs/Code/Behaviors/Helpers/CalloutStateMachine.swift @@ -11,39 +11,24 @@ import CoreLocation -private enum State: String { - case unknown = "[Unknown]" - case wildcard = "*" - case off = "[Off]" - case start = "[Start]" - case starting = "[Starting]" - case stop = "[Stop]" - case stopping = "[Stopping]" - case announceCallout = "[AnnounceCallout]" - case announcingCallout = "[AnnouncingCallout]" - case delayingCalloutAnnounced = "[DelayingCalloutAnnounced]" - case complete = "[Complete]" - case failed = "[Failed]" -} - -private enum StateMachineEvent: String { - case start = "(Start)" - case started = "(Started)" - case stop = "(Stop)" - case stopped = "(Stopped)" - case hush = "(Hush)" - case delayCalloutAnnounced = "(CalloutDelay)" - case calloutAnnounced = "(CalloutAnnounced)" - case complete = "(Complete)" - case completed = "(Completed)" - case failed = "(Failed)" -} - protocol CalloutStateMachineDelegate: AnyObject { func calloutsDidFinish(id: UUID) } class CalloutStateMachine { + + // MARK: State Machine + + private enum State { + case off + case start + case playingPrefixSounds + case stop + case stopping + case announcingCallout + case delayingCalloutAnnounced + case complete + } // MARK: Properties @@ -54,20 +39,20 @@ class CalloutStateMachine { private weak var motionActivityContext: MotionActivityProtocol! private weak var audioEngine: AudioEngineProtocol! + private var state: State = .off private var hushed = false private var playHushedSound = false - private var stateMachine: GDAStateMachine! private var calloutGroup: CalloutGroup? private var calloutIterator: IndexingIterator<[CalloutProtocol]>? private var lastGroupID: UUID? var currentState: String { - return stateMachine?.currentState?.name ?? State.unknown.rawValue + return String(describing: state) } var isPlaying: Bool { - return stateMachine.currentState.name != State.off.rawValue + return state != .off } // MARK: Initialization @@ -81,387 +66,248 @@ class CalloutStateMachine { motionActivityContext = motion self.geo = geo - stateMachine = buildStateMachine() + state = .off } // MARK: Methods func start(_ callouts: CalloutGroup) { - // The state machine must be stopped before you can call start(...) guard !isPlaying else { - GDLogVerbose(.stateMachine, "Unable to start callout group. State machine is currently in state: \(stateMachine.currentState.name ?? State.unknown.rawValue)") + GDLogVerbose(.stateMachine, "Unable to start callout group. State machine is currently in state: \(String(describing: state))") return } - calloutGroup = callouts hushed = false playHushedSound = false callouts.onStart?() - stateMachine.fireEvent(.start) - } - - func hush(playSound: Bool = false) { - hushed = true - if playSound { - playHushedSound = true + GDLogVerbose(.stateMachine, "Entering state: \(State.start)") + state = .start + // Stop current sounds if needed + if callouts.stopSoundsBeforePlaying { + self.audioEngine.stopDiscrete() } - stateMachine.fireEvent(.hush) - } - - func stop() { - if isPlaying { - stateMachine.fireEvent(.stop) - } - } - - private func buildStateMachine() -> GDAStateMachine { - let states: [GDAStateMachineState] = [ - stateOff(), - stateStart(), - stateStarting(), - stateStop(), - stateStopping(), - stateAnnounceCallout(), - stateAnnouncingCallout(), - stateDelayingCalloutAnnounced(), - stateComplete(), - stateFailed() - ] + callouts.delegate?.calloutsStarted(for: callouts) - let events: [GDAStateMachineEvent] = [ - // START - GDAStateMachine.event(name: .start, - transitions: [.off: .start]), - - // STARTING - GDAStateMachine.event(name: .started, transitions: [.starting: .announceCallout]), - - // HUSH - GDAStateMachine.event(name: .hush, - transitions: [.wildcard: .stop]), - - // DELAY CALLOUT ANNOUNCED - GDAStateMachine.event(name: .delayCalloutAnnounced, - transitions: [.announcingCallout: .delayingCalloutAnnounced, - .complete: .complete, - .off: .off - ]), - - // EXPLORE QUADRANT RESULT ANNOUNCED - GDAStateMachine.event(name: .calloutAnnounced, - transitions: [.announcingCallout: .announceCallout, - .delayingCalloutAnnounced: .announceCallout, - .complete: .complete, - .off: .off]), - - // STOP - GDAStateMachine.event(name: .stop, transitions: [ - .starting: .stop, - .announcingCallout: .stop, - .complete: .off, - .off: .off, - .wildcard: .complete - ]), - - // STOPPING - GDAStateMachine.event(name: .stopped, transitions: [.stopping: .complete]), - - // COMPLETE - GDAStateMachine.event(name: .complete, transitions: [.wildcard: .complete]), - - // COMPLETED - GDAStateMachine.event(name: .completed, transitions: [.complete: .off]), - - // FAILED - GDAStateMachine.event(name: .failed, transitions: [.wildcard: .failed]) - ] + // Prepare the iterator for the callouts + self.calloutIterator = callouts.callouts.makeIterator() - return GDAStateMachine(name: "CalloutMachine", states: states, events: events) - } -} - -extension CalloutStateMachine { - - private func stateOff() -> GDAStateMachineState { - return GDAStateMachine.state(name: .off, enter: { [weak self] (_, _, _) in - GDLogVerbose(.stateMachine, "Entering state: \(State.off)") - - guard let strongSelf = self else { - return - } - - if let lastGroupID = strongSelf.lastGroupID { - strongSelf.lastGroupID = nil - DispatchQueue.main.async { - strongSelf.delegate?.calloutsDidFinish(id: lastGroupID) - } - } - }) - } - - private func stateStart() -> GDAStateMachineState { - return GDAStateMachine.state(name: .start, enter: { [weak self] (_, nextStateName, _) in - GDLogVerbose(.stateMachine, "Entering state: \(State.start)") - - guard let strongSelf = self else { - return - } - - guard let calloutGroup = strongSelf.calloutGroup else { - nextStateName?.pointee = State.failed.rawValue as NSString - return - } - - // Stop current sounds if needed - if calloutGroup.stopSoundsBeforePlaying { - strongSelf.audioEngine.stopDiscrete() - } - - calloutGroup.delegate?.calloutsStarted(for: calloutGroup) - - // Prepare the iterator for the callouts - strongSelf.calloutIterator = calloutGroup.callouts.makeIterator() - - // Play the sounds indicating that the mode has started - var sounds: [Sound] = calloutGroup.playModeSounds ? [GlyphSound(.enterMode)] : [] - - if let prefixSounds = calloutGroup.prefixCallout?.sounds(for: strongSelf.geo?.location) { - sounds.append(contentsOf: prefixSounds.soundArray) - } - - if sounds.count > 0 { - strongSelf.audioEngine.play(Sounds(sounds)) { (success) in - guard strongSelf.currentState != State.stopping.rawValue else { - GDLogVerbose(.stateMachine, "Callout interrupted. Stopping...") - strongSelf.stateMachine.fireEvent(.stopped) - calloutGroup.onComplete?(false) - return - } - - guard strongSelf.currentState != State.off.rawValue else { - GDLogVerbose(.stateMachine, "Callouts immediately interrupted. Cleaning up...") - calloutGroup.onComplete?(false) - return - } - - guard success else { - GDLogVerbose(.stateMachine, "Callout did not finish playing successfully. Terminating state machine...") - strongSelf.stateMachine.fireEvent(.failed) - return - } - - GDLogVerbose(.stateMachine, "Enter mode sound played") - strongSelf.stateMachine.fireEvent(.started) - } - - // Transition to the state to allow mode sounds and prefix sounds to play - nextStateName?.pointee = State.starting.rawValue as NSString - } else { - // Transition to the state to announce callouts - nextStateName?.pointee = State.announceCallout.rawValue as NSString - } - }) - } - - private func stateStarting() -> GDAStateMachineState { - return GDAStateMachine.state(name: .starting, enter: { (_, _, _) in - GDLogVerbose(.stateMachine, "Entering state: \(State.starting)") - }) - } - - private func stateStop() -> GDAStateMachineState { - return GDAStateMachine.state(name: .stop, enter: { [weak self] (_, nextStateName, _) in - GDLogVerbose(.stateMachine, "Entering state: \(State.stop)") - - guard let strongSelf = self else { - return - } - - if strongSelf.audioEngine.isDiscreteAudioPlaying { - // The audio engine is currently playing a discrete sound. Stop it and then move to the .stopping state and wait - // until the sound is actually stopped (see the completion handlers passed to audioEngine.play() in the .start - // and .announceCallout states). - strongSelf.audioEngine.stopDiscrete(with: strongSelf.hushed && strongSelf.playHushedSound ? GlyphSound(.hush) : nil) - nextStateName?.pointee = State.stopping.rawValue as NSString - } else { - // In this case, discrete audio isn't currently playing, but we might be between sounds, so still call stopDiscrete in - // order to clear the sounds queue in the audio engine before moving to the complete state - strongSelf.audioEngine.stopDiscrete(with: strongSelf.hushed && strongSelf.playHushedSound ? GlyphSound(.hush) : nil) - nextStateName?.pointee = State.complete.rawValue as NSString - } - }) - } - - private func stateStopping() -> GDAStateMachineState { - return GDAStateMachine.state(name: .stopping, enter: { (_, _, _) in - GDLogVerbose(.stateMachine, "Entering state: \(State.stopping)") - }) - } - - private func stateAnnounceCallout() -> GDAStateMachineState { - return GDAStateMachine.state(name: .announceCallout, enter: { [weak self] (_, nextStateName, _) in - GDLogVerbose(.stateMachine, "Entering state: \(State.announceCallout)") - - guard let strongSelf = self else { - return - } - - guard let calloutGroup = strongSelf.calloutGroup else { - nextStateName?.pointee = State.failed.rawValue as NSString - return - } - - guard let callout = strongSelf.calloutIterator?.next() else { - calloutGroup.onComplete?(true) - nextStateName?.pointee = State.complete.rawValue as NSString - return - } - - // If this callout is not within the region to live, skip to the next callout - if let delegate = calloutGroup.delegate, !delegate.isCalloutWithinRegionToLive(callout) { - calloutGroup.delegate?.calloutSkipped(callout) - nextStateName?.pointee = State.announceCallout.rawValue as NSString - return - } - - calloutGroup.delegate?.calloutStarting(callout) - strongSelf.history?.insert(callout) - - let sounds: Sounds - if let repeatLocation = calloutGroup.repeatingFromLocation { - sounds = callout.sounds(for: repeatLocation, isRepeat: true) - } else { - sounds = callout.sounds(for: strongSelf.geo?.location, automotive: strongSelf.motionActivityContext.isInVehicle) - } - - strongSelf.audioEngine.play(sounds) { (success) in - calloutGroup.delegate?.calloutFinished(callout, completed: success) - - guard strongSelf.currentState != State.stopping.rawValue else { + // Play the sounds indicating that the mode has started + var sounds: [Sound] = callouts.playModeSounds ? [GlyphSound(.enterMode)] : [] + + if let prefixSounds = callouts.prefixCallout?.sounds(for: self.geo?.location) { + sounds.append(contentsOf: prefixSounds.soundArray) + } + + if sounds.count > 0 { + self.audioEngine.play(Sounds(sounds)) { (success) in + if self.state == .stopping { GDLogVerbose(.stateMachine, "Callout interrupted. Stopping...") - strongSelf.stateMachine.fireEvent(.stopped) - calloutGroup.onComplete?(false) + self.complete() + callouts.onComplete?(false) return } - - guard strongSelf.currentState != State.off.rawValue else { + + if self.state == .off { GDLogVerbose(.stateMachine, "Callouts immediately interrupted. Cleaning up...") - calloutGroup.onComplete?(false) + callouts.onComplete?(false) return } guard success else { GDLogVerbose(.stateMachine, "Callout did not finish playing successfully. Terminating state machine...") - calloutGroup.onComplete?(false) - strongSelf.stateMachine.fireEvent(.failed) + self.complete(failed: true) return } - strongSelf.stateMachine.fireEvent(.delayCalloutAnnounced) + GDLogVerbose(.stateMachine, "Enter mode sound played") + self.announceCallout() } - CalloutStateMachineLogger.log(callout: callout, context: strongSelf.calloutGroup?.logContext) - - nextStateName?.pointee = State.announcingCallout.rawValue as NSString - }) + // Transition to the state to allow mode sounds and prefix sounds to play + self.state = .playingPrefixSounds + } else { + announceCallout() + } } - private func stateAnnouncingCallout() -> GDAStateMachineState { - return GDAStateMachine.state(name: .announcingCallout, enter: { (_, _, _) in - GDLogVerbose(.stateMachine, "Entering state: \(State.announcingCallout)") - }) + func hush(playSound: Bool = false) { + hushed = true + + if playSound { + playHushedSound = true + } + stateStop() + } + + func stop() { + switch state { + case .playingPrefixSounds, .announcingCallout: + stateStop() + case .complete, .off: + calloutsDidFinish() + case .start, .stop, .stopping, .delayingCalloutAnnounced: + complete() + } } - private func stateDelayingCalloutAnnounced() -> GDAStateMachineState { - return GDAStateMachine.state(name: .delayingCalloutAnnounced, enter: { [weak self] (_, nextStateName, _) in - GDLogVerbose(.stateMachine, "Entering state: \(State.delayingCalloutAnnounced)") - - guard let strongSelf = self else { - return - } - - if let delay = strongSelf.calloutGroup?.calloutDelay, delay >= 0.0 { - DispatchQueue.main.asyncAfter(deadline: .now() + delay) { [weak self] in - guard let strongSelf = self, strongSelf.currentState == State.delayingCalloutAnnounced.rawValue else { - return - } - - strongSelf.stateMachine.fireEvent(.calloutAnnounced) - } - } else { - nextStateName?.pointee = State.announceCallout.rawValue as NSString + private func eventDelayCalloutAnnounced() { + switch state { + case .announcingCallout: + stateDelayingCalloutAnnounced() + case .complete: + complete() + case .off: + calloutsDidFinish() + case .delayingCalloutAnnounced, .start, .playingPrefixSounds, .stop, .stopping: + GDLogError(.stateMachine, "Invalid state transition: eventDelayCalloutAnnounced() called from state .\(state)") + } + } + + private func eventCalloutAnnounced() { + switch state{ + case .announcingCallout: + announceCallout() + case .delayingCalloutAnnounced: + announceCallout() + case .complete: + complete() + case .off: + calloutsDidFinish() + case .start, .playingPrefixSounds, .stop, .stopping: + GDLogError(.stateMachine, "Invalid state transition: eventCalloutAnnounced() called from state .\(state)") + } + } + + private func calloutsDidFinish() { + GDLogVerbose(.stateMachine, "Entering state: \(State.off)") + state = .off + if let lastGroupID = self.lastGroupID { + self.lastGroupID = nil + Task { @MainActor in + self.delegate?.calloutsDidFinish(id: lastGroupID) } - }) + } + } + + private func stateStop() { + GDLogVerbose(.stateMachine, "Entering state: \(State.stop)") + state = .stop + + if self.audioEngine.isDiscreteAudioPlaying { + // The audio engine is currently playing a discrete sound. Stop it and then move to the .stopping state and wait + // until the sound is actually stopped (see the completion handlers passed to audioEngine.play() in the .start + // and .announceCallout states). + self.audioEngine.stopDiscrete(with: self.hushed && self.playHushedSound ? GlyphSound(.hush) : nil) + state = .stopping + } else { + // In this case, discrete audio isn't currently playing, but we might be between sounds, so still call stopDiscrete in + // order to clear the sounds queue in the audio engine before moving to the complete state + self.audioEngine.stopDiscrete(with: self.hushed && self.playHushedSound ? GlyphSound(.hush) : nil) + complete() + } } - private func stateComplete() -> GDAStateMachineState { - return GDAStateMachine.state(name: .complete, enter: { [weak self] (_, nextStateName, _) in - GDLogVerbose(.stateMachine, "Entering state: \(State.complete)") + private func announceCallout() { + guard let calloutGroup = self.calloutGroup else { + complete(failed: true) + return + } + + guard let callout = self.calloutIterator?.next() else { + calloutGroup.onComplete?(true) + complete() + return + } + + // If this callout is not within the region to live, skip to the next callout + if let delegate = calloutGroup.delegate, !delegate.isCalloutWithinRegionToLive(callout) { + calloutGroup.delegate?.calloutSkipped(callout) + announceCallout() + return + } + + calloutGroup.delegate?.calloutStarting(callout) + self.history?.insert(callout) + + let sounds: Sounds + if let repeatLocation = calloutGroup.repeatingFromLocation { + sounds = callout.sounds(for: repeatLocation, isRepeat: true) + } else { + sounds = callout.sounds(for: self.geo?.location, automotive: self.motionActivityContext.isInVehicle) + } + + self.audioEngine.play(sounds) { (success) in + calloutGroup.delegate?.calloutFinished(callout, completed: success) - guard let strongSelf = self else { + if self.state == .stopping { + GDLogVerbose(.stateMachine, "Callout interrupted. Stopping...") + self.complete() + calloutGroup.onComplete?(false) return } - if !strongSelf.hushed && strongSelf.calloutGroup?.playModeSounds ?? false { - strongSelf.audioEngine.play(GlyphSound(.exitMode)) { (_) in - GDLogVerbose(.stateMachine, "Exit mode sound played") - - strongSelf.lastGroupID = strongSelf.calloutGroup?.id - strongSelf.calloutIterator = nil - strongSelf.calloutGroup = nil - strongSelf.stateMachine.fireEvent(.completed) - } - } else { - strongSelf.lastGroupID = strongSelf.calloutGroup?.id - strongSelf.calloutIterator = nil - strongSelf.calloutGroup = nil - nextStateName?.pointee = State.off.rawValue as NSString + if self.state == .off { + GDLogVerbose(.stateMachine, "Callouts immediately interrupted. Cleaning up...") + calloutGroup.onComplete?(false) + return } - }) - } - - /// This is the same as COMPLETE except no additional sounds may be played - private func stateFailed() -> GDAStateMachineState { - return GDAStateMachine.state(name: .failed, enter: { [weak self] (_, nextStateName, _) in - GDLogVerbose(.stateMachine, "Entering state: \(State.failed)") - guard let strongSelf = self else { + guard success else { + GDLogVerbose(.stateMachine, "Callout did not finish playing successfully. Terminating state machine...") + calloutGroup.onComplete?(false) + self.complete(failed: true) return } - strongSelf.lastGroupID = strongSelf.calloutGroup?.id - strongSelf.calloutIterator = nil - strongSelf.calloutGroup = nil - nextStateName?.pointee = State.off.rawValue as NSString - }) - } - -} - -extension GDAStateMachine { - fileprivate func fireEvent(_ event: StateMachineEvent) { - self.fireEvent(withName: event.rawValue) + self.eventDelayCalloutAnnounced() + } + + CalloutStateMachine.log(callout: callout, context: self.calloutGroup?.logContext) + + state = .announcingCallout } - fileprivate class func state(name: State, timeout: TimeInterval = 0.0, enter: GDAStateEnterAction? = nil, exit: GDAStateExitAction? = nil) -> GDAStateMachineState { - return GDAStateMachineState(name: name.rawValue, timeout: timeout, enterAction: enter, exitAction: exit) + private func stateDelayingCalloutAnnounced() { + GDLogVerbose(.stateMachine, "Entering state: \(State.delayingCalloutAnnounced)") + state = .delayingCalloutAnnounced + + if let delay = self.calloutGroup?.calloutDelay, delay >= 0.0 { + DispatchQueue.main.asyncAfter(deadline: .now() + delay) { [weak self] in + guard let strongSelf = self, strongSelf.state == .delayingCalloutAnnounced else { + return + } + + strongSelf.eventCalloutAnnounced() + } + } else { + announceCallout() + } } - fileprivate class func event(name: StateMachineEvent, transitions stateTransitions: [State: State]) -> GDAStateMachineEvent { - var transitions: [String: String] = [:] + private func complete(failed: Bool = false) { + GDLogVerbose(.stateMachine, "Entering state: \(State.complete)") + state = .complete - for (start, end) in stateTransitions { - transitions[start.rawValue] = end.rawValue + if !failed && !self.hushed && self.calloutGroup?.playModeSounds == true { + self.audioEngine.play(GlyphSound(.exitMode)) { (_) in + GDLogVerbose(.stateMachine, "Exit mode sound played") + + self.lastGroupID = self.calloutGroup?.id + self.calloutIterator = nil + self.calloutGroup = nil + self.calloutsDidFinish() + } + } else { + self.lastGroupID = self.calloutGroup?.id + self.calloutIterator = nil + self.calloutGroup = nil + calloutsDidFinish() } - - return GDAStateMachineEvent(name: name.rawValue, transitions: transitions) } -} - -private class CalloutStateMachineLogger { + class func log(callout: CalloutProtocol, context: String?) { var properties = ["type": callout.logCategory, "activity": AppContext.shared.motionActivityContext.currentActivity.rawValue, @@ -473,4 +319,4 @@ private class CalloutStateMachineLogger { GDATelemetry.track("callout", with: properties) } -} +} \ No newline at end of file diff --git a/apps/ios/GuideDogs/Code/Behaviors/Helpers/GDAStateMachine/GDAStateMachine.h b/apps/ios/GuideDogs/Code/Behaviors/Helpers/GDAStateMachine/GDAStateMachine.h deleted file mode 100644 index 19097c13d..000000000 --- a/apps/ios/GuideDogs/Code/Behaviors/Helpers/GDAStateMachine/GDAStateMachine.h +++ /dev/null @@ -1,91 +0,0 @@ -// -// GDAStateMachine.h -// Soundscape -// -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -// -// Description: -// -// This class represents a state machine. A state machine is constructed with states and events and -// begins in an initial state. As events occur, the state machine takes transitions from input states -// to output states, as specified in the event declarations. -// - -@import Foundation; -#import "GDAStateMachineDelegate.h" - -// State enter action. -typedef void (^GDAStateEnterAction)(id object, NSString ** nextStateName, id * nextStateObject); - -// State exit action. -typedef void (^GDAStateExitAction)(void); - -// GDAStateMachineState interface. -@interface GDAStateMachineState : NSObject - -// Properties. -@property (nonatomic, readonly) NSString * name; -@property (nonatomic, readonly) NSTimeInterval timeout; -@property (nonatomic, readonly) GDAStateEnterAction enterAction; -@property (nonatomic, readonly) GDAStateExitAction exitAction; - -// Class initializer. -- (instancetype)initWithName:(NSString *)name - timeout:(NSTimeInterval)timeout - enterAction:(GDAStateEnterAction)enterAction - exitAction:(GDAStateExitAction)exitAction; - -@end - -// GDAStateMachineEvent interface. -@interface GDAStateMachineEvent : NSObject - -// Properties. -@property (nonatomic, readonly) NSString * name; -@property (nonatomic, readonly) NSDictionary * transitions; - -// Class initializer. -- (instancetype)initWithName:(NSString *)name - transitions:(NSDictionary *)transitions; - -@end - -// GDAStateMachine interface. -@interface GDAStateMachine : NSObject - -// Properties. -@property (nonatomic, weak) id delegate; -@property (nonatomic, readonly) NSString * name; -@property (nonatomic, readonly) NSString * previousStateName; -@property (nonatomic, readonly) GDAStateMachineState * currentState; - -// Returns a new state machine. -+ (instancetype)stateMachineWithName:(NSString *)name - states:(NSArray *)states - events:(NSArray *)events; - -// Returns a new state machine. -+ (instancetype)stateMachineWithName:(NSString *)name - states:(NSArray *)states - events:(NSArray *)events - defaultStateName:(NSString *)defaultStateName; - -// Returns a new state machine state. -+ (id)stateWithName:(NSString *)name - timeout:(NSTimeInterval)timeout - enterAction:(GDAStateEnterAction)enterAction - exitAction:(GDAStateExitAction)exitAction; - -// Returns a new state machine event. -+ (id)eventWithName:(NSString *)name - transitions:(NSDictionary *)transitions; - -// Fires an event by name. -- (BOOL)fireEventWithName:(NSString *)eventName; - -// Fires an event by name. -- (BOOL)fireEventWithName:(NSString *)eventName - object:(id)object; - -@end diff --git a/apps/ios/GuideDogs/Code/Behaviors/Helpers/GDAStateMachine/GDAStateMachine.m b/apps/ios/GuideDogs/Code/Behaviors/Helpers/GDAStateMachine/GDAStateMachine.m deleted file mode 100644 index 31bd2ddde..000000000 --- a/apps/ios/GuideDogs/Code/Behaviors/Helpers/GDAStateMachine/GDAStateMachine.m +++ /dev/null @@ -1,481 +0,0 @@ -// -// GDAStateMachine.m -// Soundscape -// -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -// -// Description: -// -// This class represents a state machine. A state machine is constructed with states and events and -// begins in an initial state. As events occur, the state machine takes transitions from input states -// to output states, as specified in the event declarations. -// - -#import "GDAStateMachine.h" -#import - -// Logging. -static inline void Log(NSString * format, ...) -{ - // Removed logs for now. - return; - -// // Format the log entry. -// va_list args; -// va_start(args, format); -// NSString * formattedString = [[NSString alloc] initWithFormat:format arguments:args]; -// va_end(args); -// -// // Log the log entry. -// NSLog(@"%@", [NSString stringWithFormat:@" StateMachine: %@", formattedString]); -} - -// GDAStateMachineState implementation. -@implementation GDAStateMachineState - -// Class initializer. -- (instancetype)initWithName:(NSString *)name - timeout:(NSTimeInterval)timeout - enterAction:(GDAStateEnterAction)enterAction - exitAction:(GDAStateExitAction)exitAction -{ - // Initialize superclass. - self = [super init]; - - // Handle errors. - if (!self) - { - return nil; - } - - // Initialize. - _name = name; - _timeout = timeout; - _enterAction = enterAction; - _exitAction = exitAction; - - // Done. - return self; -} - -@end - -// GDAStateMachineEvent implementation. -@implementation GDAStateMachineEvent - -// Class initializer. -- (instancetype)initWithName:(NSString *)name - transitions:(NSDictionary *)transitions -{ - // Initialize superclass. - self = [super init]; - - // Handle errors. - if (!self) - { - return nil; - } - - // Initialize. - _name = name; - _transitions = transitions; - - // Done. - return self; -} - -@end - -// GDAStateMachine (Internal) interface. -@interface GDAStateMachine (Internal) - -// Class initializer. -- (instancetype)initWithName:(NSString *)name - states:(NSArray *)states - events:(NSArray *)events - defaultStateName:(NSString *)defaultStateName; - -// Transitions to the specified state. -- (void)transitionToState:(GDAStateMachineState *)state - object:(id)object; - -@end - -// GDAStateMachine implementation. -@implementation GDAStateMachine -{ -@private - // The mutex. - pthread_mutex_t _mutex; - - // The default state. - GDAStateMachineState * _defaultState; - - // The timeout state. - GDAStateMachineState * _timeoutState; - - // The states dictionary. The key is the state name. The entry is a GDAStateMachineState object. - NSDictionary * _states; - - // The events dictionary. Each key is an event name. The entry is a dictionary of transitions. - NSDictionary * _events; - - // The state number. Used for timeout processing. - uint64_t _stateNumber; -} - -// Class initializer. -- (instancetype)init -{ - // Initialize superclass. - self = [super init]; - - // Handle errors. - if (!self) - { - return nil; - } - - // Done. - return self; -} - -// Returns a new state machine. -+ (instancetype)stateMachineWithName:(NSString *)name - states:(NSArray *)states - events:(NSArray *)events -{ - return [[GDAStateMachine alloc] initWithName:name - states:states - events:events - defaultStateName:@""]; -} - -// Returns a new state machine. -+ (instancetype)stateMachineWithName:(NSString *)name - states:(NSArray *)states - events:(NSArray *)events - defaultStateName:(NSString *)defaultStateName -{ - return [[GDAStateMachine alloc] initWithName:name - states:states - events:events - defaultStateName:defaultStateName]; -} - -// Returns a new state machine state. -+ (id)stateWithName:(NSString *)name - timeout:(NSTimeInterval)timeout - enterAction:(GDAStateEnterAction)enterAction - exitAction:(GDAStateExitAction)exitAction -{ - return [[GDAStateMachineState alloc] initWithName:name - timeout:timeout - enterAction:enterAction - exitAction:exitAction]; -} - -// Returns a new state machine event. -+ (id)eventWithName:(NSString *)name - transitions:(NSDictionary *)transitions -{ - return [[GDAStateMachineEvent alloc] initWithName:name - transitions:transitions]; -} - -// Fires an event by name. -- (BOOL)fireEventWithName:(NSString *)eventName -{ - return [self fireEventWithName:eventName - object:nil]; -} - -// Fires an event by name. -- (BOOL)fireEventWithName:(NSString *)eventName - object:(id)object -{ - // Find the event. If it can't be found, raise an exception. - NSDictionary * transitions = _events[eventName]; - if (!transitions) - { - [NSException raise:@"Undefined Event" - format:@"State machine '%@' does not contain an event named '%@'.", _name, eventName]; - } - - // Lock. - pthread_mutex_lock(&_mutex); - - // Look for an explicit transition from the current state. - GDAStateMachineState * toState = transitions[[_currentState name]]; - - // If we found an explicit transition from the current state, great. - BOOL result; - if (toState) - { - // Explicit transition found. - result = YES; - - // Log. - Log(@"%@: Event '%@' fired. Explicit transition from state '%@' to state '%@'.", _name, eventName, [_currentState name], [toState name]); - } - else - { - // An explicit transition from the current state wasn't found. Look for a wildcard transition. - toState = transitions[@"*"]; - - // If a wildcard transition was found, great. - if (toState) - { - // Wildcard transition found. - result = YES; - - // Log. - Log(@"%@: Event '%@' fired. Wildcard transition from state '%@' to state '%@'.", _name, eventName, [_currentState name], [toState name]); - } - else - { - // State machine error. Do not make a state transition. - toState = nil; - result = NO; - } - } - - // If we have a new state to transition to, do it. - if (toState && _currentState != toState) - { - [self transitionToState:toState - object:object]; - } - - // Unlock. - pthread_mutex_unlock(&_mutex); - - // If there was a state machine error, notify the delegate. - if (!result) - { - // Log. - Log(@"%@: Event '%@' fired. State machine error. Not transition from state '%@' was found.", _name, eventName, [_currentState name]); - - // Notify the delegate. - if ([[self delegate] respondsToSelector:@selector(stateMachineError:)]) - { - [[self delegate] stateMachineError:self]; - } - } - - // Retun the result. - return result; -} - -@end - -// GDAStateMachine (Internal) implementation. -@implementation GDAStateMachine (Internal) - -// Class initializer. -- (instancetype)initWithName:(NSString *)name - states:(NSArray *)states - events:(NSArray *)events - defaultStateName:(NSString *)defaultStateName -{ - // Initialize superclass. - self = [super init]; - - // Handle errors. - if (!self) - { - return nil; - } - - // Initialize. - pthread_mutex_init(&_mutex, NULL); - _name = name; - - // The default state is the first state. - if(defaultStateName != nil && ![defaultStateName isEqualToString:@""]){ - NSUInteger index = [states indexOfObjectPassingTest:^BOOL(GDAStateMachineState * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { - BOOL result = NO; - - if([[obj name] isEqualToString: defaultStateName]){ - result = YES; - } - - return result; - }]; - - _defaultState = states[index]; - }else{ - _defaultState = states[0]; - } - - // Set-up states. - NSMutableDictionary * mutableStates = [[NSMutableDictionary alloc] initWithCapacity:[states count]]; - for (GDAStateMachineState * state in states) - { - // Check for duplicate state definitions. - if (mutableStates[[state name]]) - { - [NSException raise:@"Duplicate State" - format:@"State machine '%@' defines state '%@' more than once.", _name, [state name]]; - } - - // Note the timeout statem. - if ([[state name] isEqualToString:@"[Timeout]"]) - { - _timeoutState = state; - } - - // Add the state. - mutableStates[[state name]] = state; - } - _states = mutableStates; - - // If a timeout state wasn't explicitly defined, use the detault state. - if (!_timeoutState) - { - _timeoutState = _defaultState; - } - - // Set-up events. - NSMutableDictionary *> * mutableEvents = [[NSMutableDictionary *> alloc] initWithCapacity:[events count]]; - for (GDAStateMachineEvent * event in events) - { - // Check for duplicate event definitions. - if (mutableEvents[[event name]]) - { - [NSException raise:@"Duplicate Event" - format:@"State machine '%@' defines event '%@' more than once.", _name, [event name]]; - } - - // Process the transitions. - NSMutableDictionary * mutableTransitions = [[NSMutableDictionary alloc] init]; - [[event transitions] enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL * stop) { - // Get the from state name and to state name. - NSString * fromStateName = (NSString *)key; - NSString * toStateName = (NSString *)obj; - -// // Verify the from state. -// if (![fromStateName isEqualToString:@"*"] && !_states[fromStateName]) -// { -// [NSException raise:@"Event Definition Error" -// format:@"State machine '%@' event '%@' from state '%@' not defined.", _name, [event name], fromStateName]; -// } - - // Verify the to state. - GDAStateMachineState * toState = _states[toStateName]; -// if (!toState) -// { -// [NSException raise:@"Event Definition Error" -// format:@"State machine '%@' event '%@' to state '%@' not defined.", _name, [event name], toStateName]; -// } - - // Add the transition. - mutableTransitions[fromStateName] = toState; - }]; - - // Add the event and its transitions. - mutableEvents[[event name]] = (NSDictionary *)mutableTransitions; - } - _events = mutableEvents; - -#if defined(Logging) - // Log. - Log(@"%@: Initialized (States: %u Events: %u)", _name, [_states count], [_events count]); -#endif - - // Transition to the default state. - [self transitionToState:_defaultState - object:nil]; - - // Done. - return self; -} - -// Transitions to the specified state. -- (void)transitionToState:(GDAStateMachineState *)state - object:(id)object -{ - // Log. - Log(@"%@: Transition from state '%@' to state '%@'.", _name, [_currentState name], [state name]); - - // If the current state has an exit action, call it. - if ([_currentState exitAction]) - { - [_currentState exitAction]; - } - - // Increment the state number. - _stateNumber++; - - //set the previous state - _previousStateName = [_currentState name]; - - // Set the current state. - _currentState = state; - - // If the current state specifies a timeout, set-up timeout processing before calling the enter action. - NSTimeInterval timeout = [state timeout]; - if (timeout) - { - // Capture the state number for timeout processing. - uint64_t stateNumber = _stateNumber; - - // Log. - Log(@"%@: State '%@' will time out after %.0f seconds.", _name, [state name], timeout); - - // Schedule timeout processing. - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeout * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - // Lock. - pthread_mutex_lock(&self->_mutex); - - // If the operation timed out, change to the default state. - BOOL timedout = self->_stateNumber == stateNumber; - if (timedout) - { - // Log. - Log(@"%@: State '%@' timed out after %.0f seconds. Transition to state '%@'", self->_name, [state name], timeout, [self->_timeoutState name]); - - // Transition to the timeout state. - [self transitionToState:self->_timeoutState - object:[state name]]; - } - - // Unlock. - pthread_mutex_unlock(&self->_mutex); - - // If the operation timed out, notify the delegate. - if (timedout && [[self delegate] respondsToSelector:@selector(stateMachine:timedOutWithState:)]) - { - [[self delegate] stateMachine:self timedOutWithState:[state name]]; - } - }); - } - - // If the current state has an enter action, call it. - if ([state enterAction]) - { - // Call the enter action. - NSString * nextStateName = nil; - id nextStateObject = nil; - [state enterAction](object, &nextStateName, &nextStateObject); - - // If the enter action specifies a next state, immediately transition to that state. - if (nextStateName) - { - // Find the next state. - GDAStateMachineState * nextState = _states[nextStateName]; - if (!nextState) - { - [NSException raise:@"Undefined State" - format:@"State machine '%@' state '%@' enter action transitions to next state '%@' which is not defined.", _name, [state name], nextStateName]; - } - - // Transition. - [self transitionToState:nextState - object:nextStateObject]; - } - } -} - -@end diff --git a/apps/ios/GuideDogs/Code/Behaviors/Helpers/GDAStateMachine/GDAStateMachineDelegate.h b/apps/ios/GuideDogs/Code/Behaviors/Helpers/GDAStateMachine/GDAStateMachineDelegate.h deleted file mode 100644 index 41079b08d..000000000 --- a/apps/ios/GuideDogs/Code/Behaviors/Helpers/GDAStateMachine/GDAStateMachineDelegate.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// GDAStateMachineDelegate.h -// Soundscape -// -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -// -// Description: -// -// This protocol defines the events that emitted by the GDAStateMachine class. -// - -// Forward declarations. -@class GDAStateMachine; -@class GDAStateMachineState; -@class GDAStateMachineEvent; - -// GDAStateMachineDelegate protocol. -@protocol GDAStateMachineDelegate -@required - -// Notifies the delegate of a state machine error. -- (void)stateMachineError:(GDAStateMachine *)stateMachine; - -// Notifies the delegate of a state machine timeout. -- (void)stateMachine:(GDAStateMachine *)stateMachine - timedOutWithState:(NSString *)state; - -@end diff --git a/apps/ios/GuideDogs/Code/Data/Models/Extensions/OSM Entity/GDASpatialDataResultEntity+Typeable.swift b/apps/ios/GuideDogs/Code/Data/Models/Extensions/OSM Entity/GDASpatialDataResultEntity+Typeable.swift index 79c4ac246..0002bb596 100644 --- a/apps/ios/GuideDogs/Code/Data/Models/Extensions/OSM Entity/GDASpatialDataResultEntity+Typeable.swift +++ b/apps/ios/GuideDogs/Code/Data/Models/Extensions/OSM Entity/GDASpatialDataResultEntity+Typeable.swift @@ -22,6 +22,8 @@ extension GDASpatialDataResultEntity: Typeable { return isBank() case .grocery: return isGrocery() + case .navilens: + return isNaviLens() } } @@ -75,4 +77,8 @@ extension GDASpatialDataResultEntity: Typeable { private func isGrocery() -> Bool { return isAnyOf(tags: ["convenience", "supermarket"]); } + + private func isNaviLens() -> Bool { + return superCategory == "navilens" + } } diff --git a/apps/ios/GuideDogs/Code/Data/Models/Helpers/Types/PrimaryType.swift b/apps/ios/GuideDogs/Code/Data/Models/Helpers/Types/PrimaryType.swift index 64b98c3fd..c66445080 100644 --- a/apps/ios/GuideDogs/Code/Data/Models/Helpers/Types/PrimaryType.swift +++ b/apps/ios/GuideDogs/Code/Data/Models/Helpers/Types/PrimaryType.swift @@ -15,6 +15,7 @@ enum PrimaryType: String, CaseIterable, Type { case park case bank case grocery + case navilens func matches(poi: POI) -> Bool { guard let typeable = poi as? Typeable else { diff --git a/apps/ios/GuideDogs/Code/Generators/Callouts/Protocols/CalloutOrigin.swift b/apps/ios/GuideDogs/Code/Generators/Callouts/Protocols/CalloutOrigin.swift index 5fae3e552..590cdb4b6 100644 --- a/apps/ios/GuideDogs/Code/Generators/Callouts/Protocols/CalloutOrigin.swift +++ b/apps/ios/GuideDogs/Code/Generators/Callouts/Protocols/CalloutOrigin.swift @@ -16,9 +16,6 @@ struct CalloutOrigin: RawRepresentable, Equatable, Hashable { var localizedString: String - var localizedStringForAccessibility: String { - return localizedString.lowercasedWithAppLocale().replacingOccurrences(of: "callout", with: "call out") - } init?(rawValue: String) { self.rawValue = rawValue diff --git a/apps/ios/GuideDogs/Code/Language/Localization/LocalizationContext.swift b/apps/ios/GuideDogs/Code/Language/Localization/LocalizationContext.swift index e0860259e..a1cac095e 100644 --- a/apps/ios/GuideDogs/Code/Language/Localization/LocalizationContext.swift +++ b/apps/ios/GuideDogs/Code/Language/Localization/LocalizationContext.swift @@ -160,6 +160,16 @@ class LocalizationContext { break } } + // Fallback: match only on language part if no exact match found + if _firstSupportedLocale == nil { + for preferredLocale in Locale.preferredLocales { + if let languageCode = preferredLocale.languageCode, + let locale = supportedLocales.first(where: { $0.languageCode == languageCode }) { + _firstSupportedLocale = locale + break + } + } + } return _firstSupportedLocale } diff --git a/apps/ios/GuideDogs/Code/Visual UI/Controls/New Feature Announcement/FeaturePageViewController.swift b/apps/ios/GuideDogs/Code/Visual UI/Controls/New Feature Announcement/FeaturePageViewController.swift index 021bce253..7c84b1471 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Controls/New Feature Announcement/FeaturePageViewController.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Controls/New Feature Announcement/FeaturePageViewController.swift @@ -19,7 +19,6 @@ class FeaturePageViewController: UIViewController { var image: UIImage? var header: String! var attributedBody: NSMutableAttributedString! - var bodyAccessibilityLabel: String! var contentView: UIView! var buttonLabel: String? var buttonAccessibilityHint: String? @@ -29,7 +28,6 @@ class FeaturePageViewController: UIViewController { vc.image = feature.localizedImage vc.header = feature.localizedTitle - vc.bodyAccessibilityLabel = feature.localizedAccessibilityDescription.accessibilityString() let description = feature.localizedDescription vc.attributedBody = NSMutableAttributedString(string: description) @@ -53,9 +51,7 @@ class FeaturePageViewController: UIViewController { // Do any additional setup after loading the view. featureImageView.image = image headerLabel.text = header - headerLabel.accessibilityLabel = header.accessibilityString() bodyTextView.attributedText = attributedBody - bodyTextView.attributedText.accessibilityLabel = bodyAccessibilityLabel bodyTextView.textContainerInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) bodyTextView.textContainer.lineFragmentPadding = 0 diff --git a/apps/ios/GuideDogs/Code/Visual UI/Controls/New Feature Announcement/NewFeaturesViewController.swift b/apps/ios/GuideDogs/Code/Visual UI/Controls/New Feature Announcement/NewFeaturesViewController.swift index ef7f9506a..48e1f7a17 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Controls/New Feature Announcement/NewFeaturesViewController.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Controls/New Feature Announcement/NewFeaturesViewController.swift @@ -113,7 +113,7 @@ class NewFeaturesViewController: UIViewController { UIAccessibility.post(notification: UIAccessibility.Notification.screenChanged, argument: vc.headerLabel) } else { let total = self?.featurePages.count ?? index + 1 - UIAccessibility.post(notification: UIAccessibility.Notification.screenChanged, argument: "\(index + 1) of \(total). \(vc.header.accessibilityString()). \(vc.bodyAccessibilityLabel ?? "")") + UIAccessibility.post(notification: UIAccessibility.Notification.screenChanged, argument: "\(index + 1) of \(total). \(vc.header ?? "")") } self?.refreshControls() diff --git a/apps/ios/GuideDogs/Code/Visual UI/Controls/Settings/CalloutSettingsCellView.swift b/apps/ios/GuideDogs/Code/Visual UI/Controls/Settings/CalloutSettingsCellView.swift index 8b6d09251..a1661f0b1 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Controls/Settings/CalloutSettingsCellView.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Controls/Settings/CalloutSettingsCellView.swift @@ -13,90 +13,83 @@ protocol CalloutSettingsCellViewDelegate: AnyObject { } internal enum CalloutSettingCellType { - case all, poi, mobility, beacon, shake + case all, poi, beacon, shake + case transportation + case intersection + case safety } class CalloutSettingsCellView: UITableViewCell { - + weak var delegate: CalloutSettingsCellViewDelegate? - + var type: CalloutSettingCellType! { didSet { guard let type = type, let settingSwitch = self.accessoryView as? UISwitch else { return } - - // Update the switch + settingSwitch.isEnabled = type == .all || SettingsContext.shared.automaticCalloutsEnabled - + switch type { case .all: settingSwitch.isOn = SettingsContext.shared.automaticCalloutsEnabled - return case .poi: settingSwitch.isOn = SettingsContext.shared.placeSenseEnabled - return - case .mobility: - settingSwitch.isOn = SettingsContext.shared.mobilitySenseEnabled - return case .beacon: settingSwitch.isOn = SettingsContext.shared.destinationSenseEnabled - return case .shake: settingSwitch.isOn = SettingsContext.shared.shakeCalloutsEnabled + case .transportation: + settingSwitch.isOn = SettingsContext.shared.mobilitySenseEnabled + case .intersection: + settingSwitch.isOn = SettingsContext.shared.intersectionSenseEnabled + case .safety: + settingSwitch.isOn = SettingsContext.shared.safetySenseEnabled } } } - + @IBAction func onSettingValueChanged(_ sender: Any) { guard let type = type, let settingSwitch = self.accessoryView as? UISwitch else { return } - - defer { - delegate?.onCalloutSettingChanged(type) - } - + + defer { delegate?.onCalloutSettingChanged(type) } + let isOn = settingSwitch.isOn - - let log: ([String]) -> Void = { (categories: [String]) in + + let log: ([String]) -> Void = { categories in for category in categories { GDLogActionInfo("Toggled \(category) callouts to: \(isOn)") - GDATelemetry.track("settings.autocallouts_\(category)", value: isOn.description) } } - + switch type { case .all: SettingsContext.shared.automaticCalloutsEnabled = isOn GDATelemetry.track("settings.allow_callouts", value: isOn.description) - return - case .poi: - // Places, Landmark, and Information Senses SettingsContext.shared.placeSenseEnabled = isOn SettingsContext.shared.landmarkSenseEnabled = isOn SettingsContext.shared.informationSenseEnabled = isOn log(["places", "landmarks", "info"]) - return - - case .mobility: - // Mobility, Safety, and Intersection Sense - SettingsContext.shared.mobilitySenseEnabled = isOn - SettingsContext.shared.safetySenseEnabled = isOn - SettingsContext.shared.intersectionSenseEnabled = isOn - log(["mobility", "safety", "intersections"]) - return - case .beacon: - // Destination sense SettingsContext.shared.destinationSenseEnabled = isOn log(["destination"]) - return case .shake: SettingsContext.shared.shakeCalloutsEnabled = isOn GDATelemetry.track("settings.shake_callouts", value: isOn.description) + case .transportation: + SettingsContext.shared.mobilitySenseEnabled = isOn + log(["mobility"]) + case .intersection: + SettingsContext.shared.intersectionSenseEnabled = isOn + log(["intersections"]) + case .safety: + SettingsContext.shared.safetySenseEnabled = isOn + log(["safety"]) } } } diff --git a/apps/ios/GuideDogs/Code/Visual UI/Helpers/Guided Tours/GuidedTourAction.swift b/apps/ios/GuideDogs/Code/Visual UI/Helpers/Guided Tours/GuidedTourAction.swift index 58452b0d0..f1ac31d19 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Helpers/Guided Tours/GuidedTourAction.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Helpers/Guided Tours/GuidedTourAction.swift @@ -64,7 +64,7 @@ enum GuidedTourAction: String, Action { if detail.isGuidanceActive { return [GuidedTourActionState(.stopTour)] } else { - return [GuidedTourActionState(.startTour, isEnabled: isDefaultBehaviorActive), GuidedTourActionState(.checkForUpdates)] + return [GuidedTourActionState(.startTour, isEnabled: (isDefaultBehaviorActive && !detail.isExpired)), GuidedTourActionState(.checkForUpdates)] } } } diff --git a/apps/ios/GuideDogs/Code/Visual UI/Helpers/Integrations.swift b/apps/ios/GuideDogs/Code/Visual UI/Helpers/Integrations.swift index d09e048c0..86582089c 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Helpers/Integrations.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Helpers/Integrations.swift @@ -6,7 +6,13 @@ // Copyright © 2025 Soundscape community. All rights reserved. // -func launchNaviLens() { +func launchNaviLens(detail: LocationDetail) { + // Silence Soundscape before launching NaviLens + // Find the home screen in the view stack and trigger the sleep button + let rootVc = AppContext.rootViewController as? UINavigationController; + let homeVc = rootVc?.viewControllers.first as? HomeViewController; + homeVc?.onSleepTouchUpInside(); + // Launch NaviLens app, or open App Store listing if not installed let navilensUrl = URL(string: "navilens://")! let appStoreUrl = URL(string: "https://apps.apple.com/us/app/navilens/id1273704914")! @@ -16,3 +22,28 @@ func launchNaviLens() { UIApplication.shared.open(appStoreUrl) } } + +func guideToNaviLens(detail: LocationDetail) throws { + // Launch NaviLens if close enough, otherwise start beacon + guard let location = AppContext.shared.geolocationManager.location else { + // Location is unknown + return launchNaviLens(detail: detail) + } + + // If our GPS is more precise than we are close, use a beacon + if location.distance(from: detail.location) > location.horizontalAccuracy { + try LocationActionHandler.beacon(locationDetail: detail) + } else { + launchNaviLens(detail: detail) + } +} + +func safeGuideToNaviLens(poi: POI) { + // Launch NaviLens if starting a beacon throws an error + let detail = LocationDetail(entity: poi) + do { + try guideToNaviLens(detail: detail) + } catch { + launchNaviLens(detail: detail) + } +} diff --git a/apps/ios/GuideDogs/Code/Visual UI/Helpers/Location/Location Action/LocationAction.swift b/apps/ios/GuideDogs/Code/Visual UI/Helpers/Location/Location Action/LocationAction.swift index e27e9d3dd..6667cded9 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Helpers/Location/Location Action/LocationAction.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Helpers/Location/Location Action/LocationAction.swift @@ -31,18 +31,19 @@ enum LocationAction { } static func actions(for detail: LocationDetail) -> [LocationAction] { - var result: [LocationAction] + var result: [LocationAction] = [.beacon] + if detail.source.hasNaviLens { + // NaviLens action replaces beacon action + result = [.navilens] + } if detail.isMarker { - result = [.beacon, .edit, .preview, .share(isEnabled: true)] + result += [.edit, .preview, .share(isEnabled: true)] } else { // If the location does not have a backup coordinate // disable the save and share actions let isEnabled = detail.source.isCachingEnabled - result = [.beacon, .save(isEnabled: isEnabled), .preview, .share(isEnabled: isEnabled)] - } - if detail.source.hasNaviLens { - result += [.navilens] + result += [.save(isEnabled: isEnabled), .preview, .share(isEnabled: isEnabled)] } return result } @@ -75,7 +76,7 @@ enum LocationAction { case .beacon: return GDLocalizedString("location_detail.action.beacon") case .preview: return GDLocalizedString("preview.title") case .share: return GDLocalizedString("share.title") - case .navilens: return GDLocalizedString("navilens.title") + case .navilens: return GDLocalizedString("location_detail.action.beacon_or_navilens") } } @@ -86,7 +87,7 @@ enum LocationAction { case .beacon: return isEnabled ? GDLocalizedString("location_detail.action.beacon.hint") : GDLocalizedString("location_detail.action.beacon.hint.disabled") case .preview: return isEnabled ? GDLocalizedString("location_detail.action.preview.hint") : GDLocalizedString("location_detail.action.preview.hint.disabled") case .share(let isEnabled): return isEnabled ? GDLocalizedString("location_detail.action.share.hint") : GDLocalizedString("location_detail.disabled.share") - case .navilens: return GDLocalizedString("location_detail.action.navilens.hint") + case .navilens: return GDLocalizedString("location_detail.action.beacon_or_navilens.hint") } } diff --git a/apps/ios/GuideDogs/Code/Visual UI/Helpers/Nearby Table/NearbyTableFilter.swift b/apps/ios/GuideDogs/Code/Visual UI/Helpers/Nearby Table/NearbyTableFilter.swift index ce7595562..e8da40914 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Helpers/Nearby Table/NearbyTableFilter.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Helpers/Nearby Table/NearbyTableFilter.swift @@ -24,6 +24,7 @@ struct NearbyTableFilter: Equatable { NearbyTableFilter(type: .park), NearbyTableFilter(type: .grocery), NearbyTableFilter(type: .bank), + NearbyTableFilter(type: .navilens), ] } @@ -70,6 +71,9 @@ struct NearbyTableFilter: Equatable { case .grocery: self.localizedString = GDLocalizedString("filter.groceries") self.image = UIImage(named: "Groceries & Convenience Stores") + case .navilens: + self.localizedString = GDLocalizedString("filter.navilens") + self.image = UIImage(named: "navilens") } } else { // There is no `PrimaryType` filter selected diff --git a/apps/ios/GuideDogs/Code/Visual UI/Helpers/Search/SearchResultsUpdater.swift b/apps/ios/GuideDogs/Code/Visual UI/Helpers/Search/SearchResultsUpdater.swift index d7c08aeea..18c879582 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Helpers/Search/SearchResultsUpdater.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Helpers/Search/SearchResultsUpdater.swift @@ -38,6 +38,7 @@ class SearchResultsUpdater: NSObject { private(set) var searchBarButtonClicked = false private var location: CLLocation? var context: Context = .partialSearchText + private var localSearch: MKLocalSearch? // MARK: Initialization @@ -125,9 +126,9 @@ extension SearchResultsUpdater: UISearchResultsUpdating { let request = MKLocalSearch.Request() request.naturalLanguageQuery = searchText let coordinate = self.location!.coordinate - request.region = MKCoordinateRegion(center: coordinate, latitudinalMeters: 75000, longitudinalMeters: 75000) - let search = MKLocalSearch(request: request) - search.start(completionHandler: searchWithTextCallback) + request.region = MKCoordinateRegion(center: coordinate, latitudinalMeters: 1000, longitudinalMeters: 1000) + localSearch = MKLocalSearch(request: request) + localSearch!.start(completionHandler: searchWithTextCallback) } } @@ -170,12 +171,13 @@ extension SearchResultsUpdater: UISearchBarDelegate { let request = MKLocalSearch.Request() request.naturalLanguageQuery = searchText let coordinate = self.location!.coordinate - request.region = MKCoordinateRegion(center: coordinate, latitudinalMeters: 75000, longitudinalMeters: 75000) - let search = MKLocalSearch(request: request) - search.start(completionHandler: searchWithTextCallback) + request.region = MKCoordinateRegion(center: coordinate, latitudinalMeters: 5000, longitudinalMeters: 5000) + localSearch = MKLocalSearch(request: request) + localSearch!.start(completionHandler: searchWithTextCallback) } private func searchWithTextCallback(using response: MKLocalSearch.Response?, error: Error?) -> Void { + localSearch = nil // finished with the MKLocalSearch instance guard error == nil else { return } diff --git a/apps/ios/GuideDogs/Code/Visual UI/Modifiers/DeleteModifier.swift b/apps/ios/GuideDogs/Code/Visual UI/Modifiers/DeleteModifier.swift deleted file mode 100644 index d5eebafcc..000000000 --- a/apps/ios/GuideDogs/Code/Visual UI/Modifiers/DeleteModifier.swift +++ /dev/null @@ -1,111 +0,0 @@ -// -// DeleteModifier.swift -// Soundscape -// -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -// - -import SwiftUI - -struct Delete: ViewModifier { - @ScaledMetric(relativeTo: .title) var iconSize: CGFloat = 24.0 - - let action: () -> Void - - @State var offset: CGSize = .zero - @State var initialOffset: CGSize = .zero - @State var contentWidth: CGFloat = 0.0 - @State var deletionDistance: CGFloat = 80.0 - @State var waitingForMinGesture = true - @State var willDeleteIfReleased = false - - // MARK: Constants - - let minGetureWidth: CGFloat = -40.0 - let tappableDeletionWidth: CGFloat = -80.0 - let deletionSkipLength: CGFloat = 60.0 - - func body(content: Content) -> some View { - content - .background( - GeometryReader { geometry in - ZStack(alignment: .trailing) { - Rectangle() - .foregroundColor(.red) - - Image(systemName: "trash") - .frame(height: iconSize) - .font(.title) - .foregroundColor(.white) - .padding() - } - .accessibilityHidden(true) - .frame(width: -offset.width) - .offset(x: geometry.size.width) - .onAppear { - contentWidth = geometry.size.width - deletionDistance -= contentWidth - } - .gesture(TapGesture().onEnded { delete() }) - } - ) - .offset(x: offset.width, y: 0) - .gesture( - DragGesture() - .onChanged { gesture in - if waitingForMinGesture && gesture.translation.width > minGetureWidth { - return - } else if waitingForMinGesture && gesture.translation.width < minGetureWidth { - waitingForMinGesture = false - offset.width = gesture.translation.width + initialOffset.width + minGetureWidth - } else if gesture.translation.width + initialOffset.width <= 0 { - offset.width = gesture.translation.width + initialOffset.width - } - - if self.offset.width < deletionDistance && !willDeleteIfReleased { - // Trigger haptic feedback and jump the offset further along - // to the left - hapticFeedback() - willDeleteIfReleased = true - initialOffset.width -= deletionSkipLength - offset.width -= deletionSkipLength - } else if offset.width > deletionDistance && willDeleteIfReleased { - hapticFeedback() - willDeleteIfReleased = false - } - } - .onEnded { _ in - if offset.width < deletionDistance { - delete() - } else if offset.width < tappableDeletionWidth { - offset.width = tappableDeletionWidth - initialOffset.width = tappableDeletionWidth - } else { - offset = .zero - initialOffset = .zero - } - waitingForMinGesture = true - } - ) - .animation(.interactiveSpring()) - } - - private func delete() { - offset.width = -contentWidth - action() - } - - private func hapticFeedback() { - let generator = UIImpactFeedbackGenerator(style: .medium) - generator.impactOccurred() - } -} - -extension View { - - func onDelete(perform action: @escaping () -> Void) -> some View { - self.modifier(Delete(action: action)) - } - -} diff --git a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/BaseTableViewController.swift b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/BaseTableViewController.swift index fc8489f6f..24897612d 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/BaseTableViewController.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/BaseTableViewController.swift @@ -28,12 +28,6 @@ class BaseTableViewController: UITableViewController { view.textLabel?.textColor = Colors.Foreground.primary view.backgroundView?.backgroundColor = Colors.Background.quaternary - - if let text = view.textLabel?.text, text.lowercased().contains("callout") { - view.accessibilityLabel = text.lowercased().replacingOccurrences(of: "callout", with: "call out") - } else { - view.accessibilityLabel = view.textLabel?.text - } } override func tableView(_ tableView: UITableView, willDisplayFooterView view: UIView, forSection section: Int) { @@ -41,12 +35,6 @@ class BaseTableViewController: UITableViewController { view.textLabel?.textColor = Colors.Foreground.primary view.backgroundView?.backgroundColor = Colors.Background.quaternary - - if let text = view.textLabel?.text, text.lowercased().contains("callout") { - view.accessibilityLabel = text.lowercased().replacingOccurrences(of: "callout", with: "call out") - } else { - view.accessibilityLabel = view.textLabel?.text - } } override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { diff --git a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Help/HelpPageFAQViewController.swift b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Help/HelpPageFAQViewController.swift index bdc479986..b98c1432b 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Help/HelpPageFAQViewController.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Help/HelpPageFAQViewController.swift @@ -33,7 +33,6 @@ class HelpPageFAQViewController: UIViewController { func showParagraphs(stackView: UIStackView, stub: UILabel, paragraphs: [String]) { stub.attributedText = paragraphs.first?.getFormattedString() ?? NSAttributedString(string: GDLocalizedString("text.coming_soon")) - stub.accessibilityLabel = paragraphs.first?.getVoiceOverLabel() guard paragraphs.count > 1 else { return @@ -42,7 +41,6 @@ class HelpPageFAQViewController: UIViewController { for paragraph in paragraphs.suffix(from: 1) { let label = UILabel(frame: CGRect.zero) label.attributedText = paragraph.getFormattedString() - label.accessibilityLabel = paragraph.getVoiceOverLabel() label.numberOfLines = 0 stackView.addArrangedSubview(label) diff --git a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Help/HelpPageGenericViewController.swift b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Help/HelpPageGenericViewController.swift index 8816ae566..ae2c651bc 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Help/HelpPageGenericViewController.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Help/HelpPageGenericViewController.swift @@ -28,23 +28,11 @@ class HelpPageGenericViewController: UIViewController { func loadContent(_ content: TextHelpPage) { title = content.title - if content.title.lowercased().contains("callout") { - let titleLabel = UILabel(frame: CGRect.zero) - titleLabel.text = content.title - titleLabel.accessibilityLabel = content.title.lowercased().replacingOccurrences(of: "callout", with: "call out") - titleLabel.textColor = UIColor.white - titleLabel.textAlignment = .natural - titleLabel.font = UIFont.systemFont(ofSize: 17.0, weight: .semibold) - - navigationItem.titleView = titleLabel - } - self.content = content } func showParagraphs(stackView: UIStackView, stub: UILabel, paragraphs: [String]) { stub.attributedText = paragraphs.first?.getFormattedString() ?? NSAttributedString(string: GDLocalizedString("text.coming_soon")) - stub.accessibilityLabel = paragraphs.first?.getVoiceOverLabel() guard paragraphs.count > 1 else { return @@ -53,7 +41,6 @@ class HelpPageGenericViewController: UIViewController { for paragraph in paragraphs.suffix(from: 1) { let label = UILabel(frame: CGRect.zero) label.attributedText = paragraph.getFormattedString() - label.accessibilityLabel = paragraph.getVoiceOverLabel() label.numberOfLines = 0 stackView.addArrangedSubview(label) diff --git a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Help/HelpPageViewController.swift b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Help/HelpPageViewController.swift index 99c9b9fdd..b59456caf 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Help/HelpPageViewController.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Help/HelpPageViewController.swift @@ -51,17 +51,6 @@ class HelpPageViewController: UIViewController { func loadContent(_ content: SectionedHelpPage) { title = content.title - if content.title.lowercased().contains("callout") { - let titleLabel = UILabel(frame: CGRect.zero) - titleLabel.text = content.title - titleLabel.accessibilityLabel = content.title.lowercased().replacingOccurrences(of: "callout", with: "call out") - titleLabel.textColor = UIColor.white - titleLabel.textAlignment = .natural - titleLabel.font = UIFont.systemFont(ofSize: 17.0, weight: .semibold) - - navigationItem.titleView = titleLabel - } - what = content.what when = content.when how = content.how @@ -70,7 +59,6 @@ class HelpPageViewController: UIViewController { func showParagraphs(stackView: UIStackView, stub: UILabel, paragraphs: [String]) { stub.attributedText = paragraphs.first?.getFormattedString() ?? NSAttributedString(string: GDLocalizedString("text.coming_soon")) - stub.accessibilityLabel = paragraphs.first?.getVoiceOverLabel() guard paragraphs.count > 1 else { return @@ -79,7 +67,6 @@ class HelpPageViewController: UIViewController { for paragraph in paragraphs.suffix(from: 1) { let label = UILabel(frame: CGRect.zero) label.attributedText = paragraph.getFormattedString() - label.accessibilityLabel = paragraph.getVoiceOverLabel() label.numberOfLines = 0 stackView.addArrangedSubview(label) @@ -120,10 +107,6 @@ extension String { return try? NSAttributedString(data: html.data, options: options, documentAttributes: nil) } - func getVoiceOverLabel() -> String? { - let lowercase = self.getFormattedString()?.string.replacingOccurrences(of: "callout", with: "call out") - return lowercase?.replacingOccurrences(of: "Callout", with: "Call out") - } } extension HelpPageViewController: LargeBannerContainerView { diff --git a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Home/HomeViewController.swift b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Home/HomeViewController.swift index c769a217a..e2da08cd2 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Home/HomeViewController.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Home/HomeViewController.swift @@ -124,6 +124,11 @@ class HomeViewController: UIViewController { // Add search controller to navigation bar configureSearchAndBrowseView() self.navigationItem.hidesSearchBarWhenScrolling = false + + // Don't allow ios 26 to move the search to the bottom. + if #available(iOS 26.0, *) { + self.navigationItem.searchBarPlacementAllowsToolbarIntegration = false + } // Search results will be displayed modally // Use this view controller to define presentation context @@ -688,7 +693,10 @@ extension HomeViewController: LocationActionDelegate { self.present(firstUseAlert, animated: true, completion: nil) } case .navilens: - launchNaviLens() + // Set a beacon on the given location + // and segue to the home view + try guideToNaviLens(detail: detail) + self.navigationController?.popToRootViewController(animated: true) } } catch let error as LocationActionError { let alert = LocationActionAlert.alert(for: error) diff --git a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Launch/DynamicLaunchViewController.swift b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Launch/DynamicLaunchViewController.swift index d991326eb..14eab6e16 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Launch/DynamicLaunchViewController.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Launch/DynamicLaunchViewController.swift @@ -8,9 +8,6 @@ import UIKit -import AppCenter -import AppCenterAnalytics -import AppCenterCrashes import Combine class DynamicLaunchViewController: UIViewController { @@ -43,11 +40,6 @@ class DynamicLaunchViewController: UIViewController { SpatialDataCache.useDefaultGeocoder() } - if !testEnvironment, !UIDeviceManager.isSimulator { - AppCenter.start(withAppSecret: "<#Secret#>", services: [Analytics.self, Crashes.self]) - Analytics.enabled = !SettingsContext.shared.telemetryOptout - Crashes.enabled = !SettingsContext.shared.telemetryOptout - } } /// Notifies the view controller that its view was added to a view hierarchy. diff --git a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/Location Detail/LocationDetailViewController.swift b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/Location Detail/LocationDetailViewController.swift index ba36783c3..a58e712f3 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/Location Detail/LocationDetailViewController.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/Location Detail/LocationDetailViewController.swift @@ -345,7 +345,19 @@ extension LocationDetailViewController: LocationActionDelegate { self.present(firstUseAlert, animated: true, completion: nil) } case .navilens: - launchNaviLens() + // Set a beacon on the given location + // and segue to the home view + try guideToNaviLens(detail: detail) + + if let home = self.navigationController?.viewControllers.first as? HomeViewController { + home.shouldFocusOnBeacon = true + } + + if self.isPresentedModally && !self.isInPreviewController { + self.dismiss(animated: true) + } else { + self.navigationController?.popToRootViewController(animated: true) + } } } catch let error as LocationActionError { let alert = LocationActionAlert.alert(for: error) diff --git a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/NearbyTableViewController.swift b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/NearbyTableViewController.swift index 37e4565ed..c56cf1a81 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/NearbyTableViewController.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/NearbyTableViewController.swift @@ -376,7 +376,10 @@ extension NearbyTableViewController: LocationAccessibilityActionDelegate { self.present(firstUseAlert, animated: true, completion: nil) } case .navilens: - launchNaviLens() + // Set a beacon on the given location + // and segue to the home view + try guideToNaviLens(detail: detail) + self.navigationController?.popToRootViewController(animated: true) } } catch let error as LocationActionError { diff --git a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/SearchResultsTableViewController.swift b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/SearchResultsTableViewController.swift index b3a0f1867..4daacd022 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/SearchResultsTableViewController.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/SearchResultsTableViewController.swift @@ -88,6 +88,11 @@ class SearchResultsTableViewController: UITableViewController { searchVC.navigationItem.searchController = searchController searchVC.navigationItem.hidesSearchBarWhenScrolling = false + + // Don't allow iOS 26 to move the search to the bottom. + if #available(iOS 26.0, *) { + searchVC.navigationItem.searchBarPlacementAllowsToolbarIntegration = false + } let navigationVC = NavigationController(rootViewController: searchVC) return navigationVC diff --git a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/SearchTableViewController.swift b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/SearchTableViewController.swift index 796915542..d50e4d08a 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/SearchTableViewController.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/SearchTableViewController.swift @@ -104,6 +104,11 @@ class SearchTableViewController: BaseTableViewController { // Add search controller to navigation bar self.navigationItem.searchController = self.searchController self.navigationItem.hidesSearchBarWhenScrolling = false + + // Don't allow iOS 26 to move the search to the bottom. + if #available(iOS 26.0, *) { + self.navigationItem.searchBarPlacementAllowsToolbarIntegration = false + } // Search results will be displayed modally // Use this view controller to define presentation context @@ -348,7 +353,10 @@ extension SearchTableViewController: LocationActionDelegate { self.present(firstUseAlert, animated: true, completion: nil) } case .navilens: - launchNaviLens() + // Set a beacon on the given location + // and segue to the home view + try guideToNaviLens(detail: detail) + self.navigationController?.popToRootViewController(animated: true) } } catch let error as LocationActionError { let alert = LocationActionAlert.alert(for: error) diff --git a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/SearchWaypointViewController.swift b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/SearchWaypointViewController.swift index 7e1412cfa..64680ed09 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/SearchWaypointViewController.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/POI Table/SearchWaypointViewController.swift @@ -44,6 +44,11 @@ class SearchWaypointViewController: UIViewController { // Add search controller to navigation bar self.navigationItem.searchController = self.searchController self.navigationItem.hidesSearchBarWhenScrolling = false + + // Don't allow iOS 26 to move the search to the bottom. + if #available(iOS 26.0, *) { + self.navigationItem.searchBarPlacementAllowsToolbarIntegration = false + } // Search results will be displayed modally // Use this view controller to define presentation context diff --git a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Settings/SettingsViewController.swift b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Settings/SettingsViewController.swift index ffd310357..5330a905f 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Settings/SettingsViewController.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Settings/SettingsViewController.swift @@ -11,7 +11,7 @@ import UIKit import AppCenterAnalytics class SettingsViewController: BaseTableViewController { - + private enum Section: Int, CaseIterable { case general = 0 case audio = 1 @@ -19,17 +19,21 @@ class SettingsViewController: BaseTableViewController { case streetPreview = 3 case troubleshooting = 4 case about = 5 - case telemetry = 6 + // case telemetry = 6 } + /// Now 7 rows in the "Callouts" section: All, Places, Mobility, Safety, Intersections, Beacon, Shake private enum CalloutsRow: Int, CaseIterable { case all = 0 case poi = 1 case mobility = 2 - case beacon = 3 - case shake = 4 + case safety = 3 + case intersection = 4 + case beacon = 5 + case shake = 6 } + /// Map each indexPath to its storyboard reuseIdentifier private static let cellIdentifiers: [IndexPath: String] = [ IndexPath(row: 0, section: Section.general.rawValue): "languageAndRegion", IndexPath(row: 1, section: Section.general.rawValue): "voice", @@ -39,22 +43,28 @@ class SettingsViewController: BaseTableViewController { IndexPath(row: 5, section: Section.general.rawValue): "siriShortcuts", IndexPath(row: 0, section: Section.audio.rawValue): "mixAudio", - + + // Callouts section IndexPath(row: CalloutsRow.all.rawValue, section: Section.callouts.rawValue): "allCallouts", IndexPath(row: CalloutsRow.poi.rawValue, section: Section.callouts.rawValue): "poiCallouts", IndexPath(row: CalloutsRow.mobility.rawValue, section: Section.callouts.rawValue): "mobilityCallouts", + IndexPath(row: CalloutsRow.safety.rawValue, section: Section.callouts.rawValue): "safetyCallouts", + IndexPath(row: CalloutsRow.intersection.rawValue, section: Section.callouts.rawValue): "intersectionCallouts", IndexPath(row: CalloutsRow.beacon.rawValue, section: Section.callouts.rawValue): "beaconCallouts", IndexPath(row: CalloutsRow.shake.rawValue, section: Section.callouts.rawValue): "shakeCallouts", IndexPath(row: 0, section: Section.streetPreview.rawValue): "streetPreview", IndexPath(row: 0, section: Section.troubleshooting.rawValue): "troubleshooting", IndexPath(row: 0, section: Section.about.rawValue): "about", - IndexPath(row: 0, section: Section.telemetry.rawValue): "telemetry" + // IndexPath(row: 0, section: Section.telemetry.rawValue): "telemetry" ] + /// Which sub‑rows collapse/expand under "Allow Callouts" private static let collapsibleCalloutIndexPaths: [IndexPath] = [ IndexPath(row: CalloutsRow.poi.rawValue, section: Section.callouts.rawValue), IndexPath(row: CalloutsRow.mobility.rawValue, section: Section.callouts.rawValue), + IndexPath(row: CalloutsRow.safety.rawValue, section: Section.callouts.rawValue), + IndexPath(row: CalloutsRow.intersection.rawValue, section: Section.callouts.rawValue), IndexPath(row: CalloutsRow.beacon.rawValue, section: Section.callouts.rawValue), IndexPath(row: CalloutsRow.shake.rawValue, section: Section.callouts.rawValue) ] @@ -62,6 +72,18 @@ class SettingsViewController: BaseTableViewController { // MARK: Properties @IBOutlet weak var largeBannerContainerView: UIView! + private var expandedSections: Set = [] + + // Section Descriptions + private static let sectionDescriptions: [Section: String] = [ + .general: "General settings for the app.", + .audio: "Control how audio interacts with other media.", + .callouts: "Manage the callouts that help navigate.", + .streetPreview: "Settings for including unnamed roads.", + .troubleshooting: "Options for troubleshooting the app.", + .about: "Information about the app.", + .telemetry: "Manage data collection and privacy." + ] // MARK: View Life Cycle @@ -69,10 +91,10 @@ class SettingsViewController: BaseTableViewController { super.viewWillAppear(animated) GDLogActionInfo("Opened 'Settings'") - GDATelemetry.trackScreenView("settings") self.title = GDLocalizedString("settings.screen_title") + expandedSections = [] // Reset expansions } override func numberOfSections(in tableView: UITableView) -> Int { @@ -93,14 +115,17 @@ class SettingsViewController: BaseTableViewController { } } - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let identifier = SettingsViewController.cellIdentifiers[indexPath] - - guard let sectionType = Section(rawValue: indexPath.section) else { - return tableView.dequeueReusableCell(withIdentifier: identifier ?? "default", for: indexPath) + override func tableView(_ tableView: UITableView, + cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard expandedSections.contains(indexPath.section) else { + return UITableViewCell() } - - switch sectionType { + + let identifier = SettingsViewController.cellIdentifiers[indexPath] ?? "default" + let cell = tableView.dequeueReusableCell(withIdentifier: identifier, + for: indexPath) + + switch Section(rawValue: indexPath.section) { case .callouts: let cell = tableView.dequeueReusableCell(withIdentifier: identifier ?? "default", for: indexPath) as! CalloutSettingsCellView cell.delegate = self @@ -124,21 +149,45 @@ class SettingsViewController: BaseTableViewController { return cell case .audio: - let cell = tableView.dequeueReusableCell(withIdentifier: identifier ?? "default", for: indexPath) as! MixAudioSettingCell - cell.delegate = self - return cell - + (cell as! MixAudioSettingCell).delegate = self default: - return tableView.dequeueReusableCell(withIdentifier: identifier ?? "default", for: indexPath) + break } + return cell } - // MARK: UITableViewDataSource + private func configureCalloutCell(_ cell: CalloutSettingsCellView, + at indexPath: IndexPath) { + cell.delegate = self + guard let rowType = CalloutsRow(rawValue: indexPath.row) else { + return + } + + switch rowType { + case .all: + cell.type = .all + case .poi: + cell.type = .poi + case .mobility: + // the "Mobility" toggle now maps to the transportation case + cell.type = .transportation + case .safety: + cell.type = .safety + case .intersection: + cell.type = .intersection + case .beacon: + cell.type = .beacon + case .shake: + cell.type = .shake + } + } - override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + // MARK: Headers & Footers + + override func tableView(_ tableView: UITableView, + titleForHeaderInSection section: Int) -> String? { guard let sectionType = Section(rawValue: section) else { return nil } - switch sectionType { case .general: return GDLocalizedString("settings.section.general") case .audio: return GDLocalizedString("settings.audio.media_controls") @@ -150,9 +199,14 @@ class SettingsViewController: BaseTableViewController { } } - override func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? { + override func tableView(_ tableView: UITableView, + titleForFooterInSection section: Int) -> String? { guard let sectionType = Section(rawValue: section) else { return nil } - + + if expandedSections.contains(section) { + return SettingsViewController.sectionDescriptions[sectionType] + } + switch sectionType { case .audio: return GDLocalizedString("settings.audio.mix_with_others.description") case .streetPreview: return GDLocalizedString("preview.include_unnamed_roads.subtitle") @@ -160,56 +214,83 @@ class SettingsViewController: BaseTableViewController { default: return nil } } + + override func tableView(_ tableView: UITableView, + willDisplayHeaderView view: UIView, + forSection section: Int) { + guard let header = view as? UITableViewHeaderFooterView else { return } + header.tag = section + header.addGestureRecognizer( + UITapGestureRecognizer(target: self, + action: #selector(handleHeaderTap(_:))) + ) + + // Styling as before... + header.textLabel?.textColor = .white + header.textLabel?.font = UIFont.boldSystemFont(ofSize: 18) + header.contentView.backgroundColor = UIColor(named: "HeaderBackgroundColor") + header.layer.cornerRadius = 8.0 + header.layer.masksToBounds = true + header.contentView.layoutMargins = UIEdgeInsets(top: 10, + left: 15, + bottom: 10, + right: 15) + + let chevron = UIImageView(image: UIImage(systemName: "chevron.right")) + chevron.tintColor = .white + chevron.translatesAutoresizingMaskIntoConstraints = false + header.contentView.addSubview(chevron) + NSLayoutConstraint.activate([ + chevron.trailingAnchor.constraint(equalTo: header.contentView.trailingAnchor, constant: -15), + chevron.centerYAnchor.constraint(equalTo: header.contentView.centerYAnchor), + chevron.widthAnchor.constraint(equalToConstant: 20), + chevron.heightAnchor.constraint(equalToConstant: 20) + ]) + } + + @objc private func handleHeaderTap(_ gesture: UITapGestureRecognizer) { + guard let header = gesture.view as? UITableViewHeaderFooterView else { return } + let section = header.tag + + if expandedSections.contains(section) { + expandedSections.remove(section) + } else { + expandedSections.insert(section) + } + tableView.reloadSections(IndexSet(integer: section), with: .automatic) + } } extension SettingsViewController: MixAudioSettingCellDelegate { func onSettingValueChanged(_ cell: MixAudioSettingCell, settingSwitch: UISwitch) { - // Note: The UI for this setting is "Enable Media Controls" but the setting is stored as - // "Mixes with Others" (the inverse of "Enable Media Controls") - guard settingSwitch.isOn else { - // If the setting switch is now off, the user disabled media controls. This doesn't - // require a warning alert, so just set mixesWithOthers to true and return. updateSetting(true) return } - - // Otherwise, the user is turning on media controls, so we need to show a warning to make sure - // they understand what this change means in terms of how other audio apps will stop Soundscape - // from playing. This warning was added based on bug bash feedback on 12/3/20. - // Show an alert indicating that the user can download an enhanced version of the voice in Settings let alert = UIAlertController(title: GDLocalizedString("general.alert.confirmation_title"), message: GDLocalizedString("setting.audio.mix_with_others.confirmation"), preferredStyle: .alert) - - let mixAction = UIAlertAction(title: GDLocalizedString("settings.audio.mix_with_others.title"), style: .default) { [weak self] (_) in - // Make the setting switch - turn off mixesWithOthers + let mixAction = UIAlertAction(title: GDLocalizedString("settings.audio.mix_with_others.title"), + style: .default) { [weak self] _ in self?.updateSetting(false) self?.focusOnCell(cell) } alert.addAction(mixAction) alert.preferredAction = mixAction - - alert.addAction(UIAlertAction(title: GDLocalizedString("general.alert.cancel"), style: .cancel, handler: { [weak self] (_) in - // Toggle the setting back off + alert.addAction(UIAlertAction(title: GDLocalizedString("general.alert.cancel"), + style: .cancel) { [weak self] _ in settingSwitch.isOn = false - - // Track that the user decided not to enable media controls GDATelemetry.track("settings.mix_audio.cancel", with: ["context": "app_settings"]) - self?.focusOnCell(cell) - })) - + }) present(alert, animated: true) } - + private func updateSetting(_ newValue: Bool) { SettingsContext.shared.audioSessionMixesWithOthers = newValue AppContext.shared.audioEngine.mixWithOthers = newValue - GDATelemetry.track("settings.mix_audio", - with: ["value": "\(SettingsContext.shared.audioSessionMixesWithOthers)", - "context": "app_settings"]) + with: ["value": "\(newValue)", "context": "app_settings"]) } private func focusOnCell(_ cell: MixAudioSettingCell) { @@ -221,25 +302,19 @@ extension SettingsViewController: MixAudioSettingCellDelegate { extension SettingsViewController: CalloutSettingsCellViewDelegate { func onCalloutSettingChanged(_ type: CalloutSettingCellType) { - guard type == .all else { - return - } - - let indexPaths = SettingsViewController.collapsibleCalloutIndexPaths - - if SettingsContext.shared.automaticCalloutsEnabled && !tableView.contains(indexPaths: indexPaths) { - tableView.insertRows(at: indexPaths, with: .automatic) - } else if !SettingsContext.shared.automaticCalloutsEnabled && tableView.contains(indexPaths: indexPaths) { - tableView.deleteRows(at: indexPaths, with: .automatic) + guard type == .all else { return } + let paths = SettingsViewController.collapsibleCalloutIndexPaths + if SettingsContext.shared.automaticCalloutsEnabled { + tableView.insertRows(at: paths, with: .automatic) + } else { + tableView.deleteRows(at: paths, with: .automatic) } } } extension SettingsViewController: LargeBannerContainerView { - func setLargeBannerHeight(_ height: CGFloat) { largeBannerContainerView.setHeight(height) tableView.reloadData() } - } diff --git a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Settings/StatusTableViewController.swift b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Settings/StatusTableViewController.swift index f32fcff1a..4e8dc9256 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Settings/StatusTableViewController.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Settings/StatusTableViewController.swift @@ -16,6 +16,7 @@ class StatusTableViewController: BaseTableViewController { static let audio = 1 static let url = 2 static let cache = 3 + static let userData = 4 } private struct CellIdentifier { @@ -73,7 +74,7 @@ class StatusTableViewController: BaseTableViewController { // MARK: - Table view data source override func numberOfSections(in tableView: UITableView) -> Int { - return 4 + return 5 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { @@ -82,6 +83,7 @@ class StatusTableViewController: BaseTableViewController { case Section.audio: return 1 case Section.url: return 1 case Section.cache: return 1 + case Section.userData: return 1 default: return 0 } } @@ -92,6 +94,7 @@ class StatusTableViewController: BaseTableViewController { case Section.audio: return GDLocalizedString("troubleshooting.check_audio") case Section.url: return GDLocalizedString("troubleshooting.tile_server_url") case Section.cache: return GDLocalizedString("troubleshooting.cache") + case Section.userData: return GDLocalizedString("troubleshooting.user_data") default: return nil } } @@ -107,6 +110,7 @@ class StatusTableViewController: BaseTableViewController { case Section.audio: return GDLocalizedString("troubleshooting.check_audio.explanation") case Section.url: return GDLocalizedString("troubleshooting.tile_server_url.explanation") case Section.cache: return GDLocalizedString("troubleshooting.cache.explanation") + case Section.userData: return GDLocalizedString("troubleshooting.user_data.explanation") default: return nil } } @@ -133,8 +137,7 @@ class StatusTableViewController: BaseTableViewController { let cell: ButtonTableViewCell = tableView.dequeueReusableCell(forIndexPath: indexPath) cell.backgroundColor = Colors.Background.quaternary - cell.button.removeTarget(self, action: #selector(urlTouchUpInside), for: .touchUpInside) - cell.button.removeTarget(self, action: #selector(clearCacheTouchUpInside), for: .touchUpInside) + cell.button.removeTarget(nil, action: nil, for: .touchUpInside) cell.button.addTarget(self, action: #selector(crosscheckTouchUpInside), for: .touchUpInside) cell.button.accessibilityLabel = GDLocalizedString("troubleshooting.check_audio") cell.button.accessibilityHint = GDLocalizedString("troubleshooting.check_audio.hint") @@ -147,8 +150,7 @@ class StatusTableViewController: BaseTableViewController { let cell: ButtonTableViewCell = tableView.dequeueReusableCell(forIndexPath: indexPath) cell.backgroundColor = Colors.Background.quaternary - cell.button.removeTarget(self, action: #selector(clearCacheTouchUpInside), for: .touchUpInside) - cell.button.removeTarget(self, action: #selector(crosscheckTouchUpInside), for: .touchUpInside) + cell.button.removeTarget(nil, action: nil, for: .touchUpInside) cell.button.addTarget(self, action: #selector(urlTouchUpInside), for: .touchUpInside) cell.button.accessibilityLabel = GDLocalizedString("troubleshooting.tile_server_url") cell.button.accessibilityHint = GDLocalizedString("troubleshooting.tile_server_url.explanation") @@ -162,8 +164,7 @@ class StatusTableViewController: BaseTableViewController { let cell: ButtonTableViewCell = tableView.dequeueReusableCell(forIndexPath: indexPath) cell.backgroundColor = Colors.Background.quaternary - cell.button.removeTarget(self, action: #selector(urlTouchUpInside), for: .touchUpInside) - cell.button.removeTarget(self, action: #selector(crosscheckTouchUpInside), for: .touchUpInside) + cell.button.removeTarget(nil, action: nil, for: .touchUpInside) cell.button.addTarget(self, action: #selector(clearCacheTouchUpInside), for: .touchUpInside) cell.button.accessibilityLabel = GDLocalizedString("settings.clear_data") cell.button.accessibilityHint = GDLocalizedString("troubleshooting.cache.hint") @@ -172,6 +173,17 @@ class StatusTableViewController: BaseTableViewController { return cell + case Section.userData: + let cell: ButtonTableViewCell = tableView.dequeueReusableCell(forIndexPath: indexPath) + cell.backgroundColor = Colors.Background.quaternary + cell.button.removeTarget(nil, action: nil, for: .touchUpInside) + cell.button.addTarget(self, action: #selector(deleteUserDataTouchUpInside), for: .touchUpInside) + cell.button.accessibilityLabel = GDLocalizedString("troubleshooting.user_data.button") + cell.button.accessibilityHint = GDLocalizedString("troubleshooting.user_data.explanation") + cell.button.backgroundColor = Colors.Background.error + cell.label.text = GDLocalizedString("troubleshooting.user_data.button") + return cell + default: fatalError() } @@ -262,9 +274,20 @@ extension StatusTableViewController { present(alert, animated: true, completion: nil) } - /// ask the user if they want to keep the markers. - /// This is not used, but could be reenabled for debug builds in the future. - private func displayMarkersPrompt() { + @objc func deleteUserDataTouchUpInside() { + // Only allow the cache to be deleted if we have a network connection to reload the cache + guard AppContext.shared.offlineContext.state != .offline else { + let alert = UIAlertController(title: GDLocalizedString("general.error.network_connection_required"), + message: GDLocalizedString("general.error.network_connection_required.deleting_data"), + preferredStyle: UIAlertController.Style.alert) + + alert.addAction(UIAlertAction(title: GDLocalizedString("general.alert.dismiss"), style: .cancel, handler: nil)) + + present(alert, animated: true, completion: nil) + + return + } + let alert = UIAlertController(title: GDLocalizedString("settings.clear_cache.markers.alert_title"), message: GDLocalizedString("settings.clear_cache.markers.alert_message"), preferredStyle: UIAlertController.Style.actionSheet) @@ -275,22 +298,13 @@ extension StatusTableViewController { } })) - alert.addAction(UIAlertAction(title: GDLocalizedString("general.alert.keep"), style: .default, handler: { _ in - self.performSegue(withIdentifier: Segue.showLoadingModal, sender: self) - - // Check that tiles can be downloaded before we attempt to delete the cache - AppContext.shared.spatialDataContext.checkServiceConnection { [weak self] (success) in - guard success else { - self?.displayUnableToClearCacheWarning() - return - } - - // Clear the cache and keep the markers - self?.clearCache(false) - } - })) - alert.addAction(UIAlertAction(title: GDLocalizedString("general.alert.delete"), style: .destructive, handler: { _ in + AppContext.shared.eventProcessor.hush(playSound: false) + + if SettingsContext.shared.automaticCalloutsEnabled { + self.reenableCalloutsAfterReload = true + SettingsContext.shared.automaticCalloutsEnabled = false + } self.performSegue(withIdentifier: Segue.showLoadingModal, sender: self) // Check that tiles can be downloaded before we attempt to delete the cache diff --git a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Settings/VersionHistoryTableViewController.swift b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Settings/VersionHistoryTableViewController.swift index 19dd53d2c..7c4dae60b 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Settings/VersionHistoryTableViewController.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/View Controllers/Settings/VersionHistoryTableViewController.swift @@ -56,10 +56,7 @@ class VersionHistoryTableViewController: BaseTableViewController { let feature = features(for: indexPath.section)[indexPath.row] cell.textLabel?.text = feature.localizedTitle - cell.textLabel?.accessibilityLabel = feature.localizedTitle.accessibilityString() - cell.detailTextLabel?.text = feature.localizedDescription - cell.detailTextLabel?.accessibilityLabel = feature.localizedAccessibilityDescription.accessibilityString() return cell } diff --git a/apps/ios/GuideDogs/Code/Visual UI/Views/Beacon/BeaconToolbarView.swift b/apps/ios/GuideDogs/Code/Visual UI/Views/Beacon/BeaconToolbarView.swift index ca7e8558d..4b9166e89 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Views/Beacon/BeaconToolbarView.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Views/Beacon/BeaconToolbarView.swift @@ -135,7 +135,9 @@ struct BeaconToolbarView: View { // Launch NaviLens (applies to both beacon and route waypoint) if beacon.locationDetail.source.hasNaviLens { - Button(action: launchNaviLens, label: { + Button(action: { + launchNaviLens(detail: beacon.locationDetail) + }, label: { Image("navilens") .renderingMode(.template) .resizable() @@ -145,7 +147,7 @@ struct BeaconToolbarView: View { }) .foregroundColor(.white) - .accessibilityLabel(GDLocalizedTextView("navilens.title")) + .accessibilityLabel(GDLocalizedTextView("beacon.action.navilens")) } Spacer() diff --git a/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/MarkerCell.swift b/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/MarkerCell.swift index 99265c753..bf20c320e 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/MarkerCell.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/MarkerCell.swift @@ -137,6 +137,7 @@ struct MarkerCell: View { .padding([.trailing]) .accessibilityHidden(true) } + .contentShape(Rectangle()) .background(Color.primaryBackground) .accessibilityElement(children: .combine) } diff --git a/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/MarkersAndRoutesList.swift b/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/MarkersAndRoutesList.swift index bc694822b..0a4d68112 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/MarkersAndRoutesList.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/MarkersAndRoutesList.swift @@ -107,14 +107,11 @@ struct MarkersAndRoutesList: View { .ignoresSafeArea() VStack(spacing: 0) { - ScrollView { - if selectedList == .markers { - MarkersList(sort: $sort) - } else { - RoutesList(sort: $sort) - } + if selectedList == .markers { + MarkersList(sort: $sort) + } else { + RoutesList(sort: $sort) } - .padding([.top], 1) HStack { MarkerRouteTabButton(name: GDLocalizedString("markers.title"), diff --git a/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/MarkersAndRoutesListNavigationHelper.swift b/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/MarkersAndRoutesListNavigationHelper.swift index 412179186..668e7bb88 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/MarkersAndRoutesListNavigationHelper.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/MarkersAndRoutesListNavigationHelper.swift @@ -88,7 +88,10 @@ class MarkersAndRoutesListNavigationHelper: ViewNavigationHelper, LocationAccess } case .navilens: - launchNaviLens() + // Set a beacon on the given location + // and segue to the home view + try guideToNaviLens(detail: detail) + self.popToRootViewController(animated: true) } } catch let error as LocationActionError { let alert = LocationActionAlert.alert(for: error) diff --git a/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/MarkersList.swift b/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/MarkersList.swift index 30cfe7ad0..77df220ab 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/MarkersList.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/MarkersList.swift @@ -54,57 +54,25 @@ struct MarkersList: View { GDATelemetry.trackScreenView("markers_list.empty") } } else { - VStack(spacing: 0) { + List { SortStyleCell(listName: GDLocalizedString("markers.title"), sort: _sort) - + .plainListRowBackground(Color.quaternaryBackground) + ForEach(loader.markerIDs, id: \.self) { id in - MarkerCell(model: MarkerModel(id: id)) - .accessibilityAddTraits(.isButton) - .conditionalAccessibilityAction(routeIsActive == false, named: Text(LocationAction.beacon.text)) { - if let poi = entity(for: id) { - navHelper.didSelectLocationAction(.beacon, entity: poi) - } - } - .conditionalAccessibilityAction(routeIsActive == false, named: Text(LocationAction.edit.text)) { - selectedDetail = LocationDetail(markerId: id, telemetryContext: "markers_list") - goToNavDestination = true - } - .conditionalAccessibilityAction(routeIsActive == false, named: GDLocalizedTextView("general.alert.delete")) { - alert = confirmationAlert(for: id) - showAlert = true - } - .conditionalAccessibilityAction(routeIsActive == false, named: Text(LocationAction.preview.text)) { - if let poi = entity(for: id) { - navHelper.didSelectLocationAction(.preview, entity: poi) - } - } - .accessibilityAction(named: Text(LocationAction.share(isEnabled: true).text), { - if let poi = entity(for: id) { - navHelper.didSelectLocationAction(.share(isEnabled: true), entity: poi) - } - }) - .if(routeIsActive == false, transform: { - $0.onDelete { - delete(id) - } - }) - .onTapGesture { - selectedDetail = LocationDetail(markerId: id, telemetryContext: "markers_list") - - let storyboard = UIStoryboard(name: "POITable", bundle: Bundle.main) - - guard let viewController = storyboard.instantiateViewController(identifier: "LocationDetailView") as? LocationDetailViewController else { - return - } - - viewController.locationDetail = selectedDetail - viewController.deleteAction = .popToViewController(type: MarkersAndRoutesListHostViewController.self) - viewController.onDismissPreviewHandler = navHelper.onDismissPreviewHandler - - navHelper.pushViewController(viewController, animated: true) - } + markerRow(id) + .deleteDisabled(routeIsActive) + } + .onDelete { offsets in + guard let index = offsets.first else { + return + } + + let id = loader.markerIDs[index] + alert = confirmationAlert(for: id) + showAlert = true } } + .listStyle(PlainListStyle()) .background(Color.quaternaryBackground) .alert(isPresented: $showAlert, content: { alert ?? errorAlert() }) @@ -124,8 +92,10 @@ struct MarkersList: View { private func confirmationAlert(for markerID: String) -> Alert { return Alert.deleteMarkerAlert(markerId: markerID, - deleteAction: { delete(markerID) }, - cancelAction: { selectedDetail = nil }) + deleteAction: { + delete(markerID) + }, + cancelAction: { }) } private func errorAlert() -> Alert { @@ -142,6 +112,49 @@ struct MarkersList: View { showAlert = true } } + + @ViewBuilder + private func markerRow(_ id: String) -> some View { + Button { + selectedDetail = LocationDetail(markerId: id, telemetryContext: "markers_list") + + let storyboard = UIStoryboard(name: "POITable", bundle: Bundle.main) + + guard let viewController = storyboard.instantiateViewController(identifier: "LocationDetailView") as? LocationDetailViewController else { + return + } + + viewController.locationDetail = selectedDetail + viewController.deleteAction = .popToViewController(type: MarkersAndRoutesListHostViewController.self) + viewController.onDismissPreviewHandler = navHelper.onDismissPreviewHandler + + navHelper.pushViewController(viewController, animated: true) + } label: { + MarkerCell(model: MarkerModel(id: id)) + } + .buttonStyle(.plain) + .accessibilityAddTraits(.isButton) + .conditionalAccessibilityAction(routeIsActive == false, named: Text(LocationAction.beacon.text)) { + if let poi = entity(for: id) { + navHelper.didSelectLocationAction(.beacon, entity: poi) + } + } + .conditionalAccessibilityAction(routeIsActive == false, named: Text(LocationAction.edit.text)) { + selectedDetail = LocationDetail(markerId: id, telemetryContext: "markers_list") + goToNavDestination = true + } + .conditionalAccessibilityAction(routeIsActive == false, named: Text(LocationAction.preview.text)) { + if let poi = entity(for: id) { + navHelper.didSelectLocationAction(.preview, entity: poi) + } + } + .accessibilityAction(named: Text(LocationAction.share(isEnabled: true).text), { + if let poi = entity(for: id) { + navHelper.didSelectLocationAction(.share(isEnabled: true), entity: poi) + } + }) + .plainListRowBackground(Color.quaternaryBackground) + } } struct MarkersList_Previews: PreviewProvider { diff --git a/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/RouteCell.swift b/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/RouteCell.swift index 600b32c8b..3d81b5b4e 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/RouteCell.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/RouteCell.swift @@ -100,6 +100,7 @@ struct RouteCell: View { .padding([.trailing]) .accessibilityHidden(true) } + .contentShape(Rectangle()) .background(Color.primaryBackground) .accessibilityElement(children: .combine) } diff --git a/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/RoutesList.swift b/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/RoutesList.swift index 4d2eda90d..912cab6d9 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/RoutesList.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Views/Markers & Routes/RoutesList.swift @@ -80,60 +80,28 @@ struct RoutesList: View { GDATelemetry.trackScreenView("routes_list.empty") } } else { - VStack(spacing: 0) { + List { SortStyleCell(listName: GDLocalizedString("routes.title"), sort: _sort) - + .plainListRowBackground(Color.quaternaryBackground) + ForEach(loader.routeIDs, id: \.self) { id in - RouteCell(model: RouteModel(id: id)) - .accessibilityAddTraits(.isButton) - .conditionalAccessibilityAction(AppContext.shared.eventProcessor.activeBehavior is SoundscapeBehavior && activeRouteID == nil, named: Text(RouteActionState(.startRoute).text)) { - GDATelemetry.track("routes.start", with: ["source": "accessibility_action"]) - - let routeGuidance = RouteGuidance(.init(source: .database(id: id)), - spatialData: AppContext.shared.spatialDataContext, - motion: AppContext.shared.motionActivityContext) - AppContext.shared.eventProcessor.activateCustom(behavior: routeGuidance) - navHelper.popToRootViewController(animated: true) - } - .conditionalAccessibilityAction(id == activeRouteID, named: Text(RouteActionState(.stopRoute).text)) { - GDATelemetry.track("routes.stop", with: ["source": "accessibility_action"]) - - AppContext.shared.eventProcessor.deactivateCustom() - } - .conditionalAccessibilityAction(id != activeRouteID, named: Text(RouteActionState(.edit).text)) { - GDATelemetry.track("routes.edit", with: ["source": "accessibility_action"]) - - selectedDetail = RouteDetail(source: .database(id: id)) - showEditView = true - goToNavDestination = true - } - .conditionalAccessibilityAction(id != activeRouteID, named: GDLocalizedTextView("general.alert.delete")) { - GDATelemetry.track("routes.delete", with: ["source": "accessibility_action"]) - - alert = confirmationAlert(for: id) - showAlert = true - } - .accessibilityAction(named: Text(RouteActionState(.share).text), { - GDATelemetry.track("routes.share", with: ["source": "accessibility_action"]) - - isPresentingForRouteId = id - - if FirstUseExperience.didComplete(.share) { - presentShareActivityViewController() - } else { - isPresentingFirstUseShareAlert = true - } - }) - .onDelete { - delete(id) - } - .onTapGesture { - selectedDetail = RouteDetail(source: .database(id: id)) - showEditView = false - goToNavDestination = true - } + routeRow(id) + } + .onDelete { offsets in + guard let index = offsets.first else { + return + } + + let id = loader.routeIDs[index] + guard id != activeRouteID else { + return + } + + alert = confirmationAlert(for: id) + showAlert = true } } + .listStyle(PlainListStyle()) .background(Color.quaternaryBackground) .alert(isPresented: $showAlert, content: { alert ?? errorAlert() }) @@ -160,7 +128,7 @@ struct RoutesList: View { } let cancel: Alert.Button = .cancel(GDLocalizedTextView("general.alert.cancel")) { - selectedDetail = nil + // No-op } return Alert(title: GDLocalizedTextView("route_detail.edit.delete.title"), @@ -183,6 +151,53 @@ struct RoutesList: View { showAlert = true } } + + @ViewBuilder + private func routeRow(_ id: String) -> some View { + Button { + selectedDetail = RouteDetail(source: .database(id: id)) + showEditView = false + goToNavDestination = true + } label: { + RouteCell(model: RouteModel(id: id)) + } + .buttonStyle(.plain) + .accessibilityAddTraits(.isButton) + .conditionalAccessibilityAction(AppContext.shared.eventProcessor.activeBehavior is SoundscapeBehavior && activeRouteID == nil, named: Text(RouteActionState(.startRoute).text)) { + GDATelemetry.track("routes.start", with: ["source": "accessibility_action"]) + + let routeGuidance = RouteGuidance(.init(source: .database(id: id)), + spatialData: AppContext.shared.spatialDataContext, + motion: AppContext.shared.motionActivityContext) + AppContext.shared.eventProcessor.activateCustom(behavior: routeGuidance) + navHelper.popToRootViewController(animated: true) + } + .conditionalAccessibilityAction(id == activeRouteID, named: Text(RouteActionState(.stopRoute).text)) { + GDATelemetry.track("routes.stop", with: ["source": "accessibility_action"]) + + AppContext.shared.eventProcessor.deactivateCustom() + } + .conditionalAccessibilityAction(id != activeRouteID, named: Text(RouteActionState(.edit).text)) { + GDATelemetry.track("routes.edit", with: ["source": "accessibility_action"]) + + selectedDetail = RouteDetail(source: .database(id: id)) + showEditView = true + goToNavDestination = true + } + .accessibilityAction(named: Text(RouteActionState(.share).text), { + GDATelemetry.track("routes.share", with: ["source": "accessibility_action"]) + + isPresentingForRouteId = id + + if FirstUseExperience.didComplete(.share) { + presentShareActivityViewController() + } else { + isPresentingFirstUseShareAlert = true + } + }) + .deleteDisabled(id == activeRouteID) + .plainListRowBackground(Color.quaternaryBackground) + } } struct RoutesList_Previews: PreviewProvider { diff --git a/apps/ios/GuideDogs/Code/Visual UI/Views/Recommender/Containers/RecommenderContainerView.swift b/apps/ios/GuideDogs/Code/Visual UI/Views/Recommender/Containers/RecommenderContainerView.swift index 24f637b5f..8d27a5bc4 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Views/Recommender/Containers/RecommenderContainerView.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Views/Recommender/Containers/RecommenderContainerView.swift @@ -39,7 +39,7 @@ struct RecommenderContainerView: View { .padding(.horizontal, 18.0) .padding(.vertical, 12.0) .frame(maxWidth: .infinity, alignment: .leading) - .linearGradientBackground(.purple) + .linearGradientBackground(.blue) .accessibilityElement(children: .combine) } diff --git a/apps/ios/GuideDogs/Code/Visual UI/Views/Recommender/Publishers/NaviLens/NavilensRecommenderView.swift b/apps/ios/GuideDogs/Code/Visual UI/Views/Recommender/Publishers/NaviLens/NavilensRecommenderView.swift index f92aa2595..5ecfc65cf 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Views/Recommender/Publishers/NaviLens/NavilensRecommenderView.swift +++ b/apps/ios/GuideDogs/Code/Visual UI/Views/Recommender/Publishers/NaviLens/NavilensRecommenderView.swift @@ -19,10 +19,10 @@ struct NavilensRecommenderView: View { // MARK: Body var body: some View { - Button(action: launchNaviLens, label: { + Button(action: { safeGuideToNaviLens(poi: poi) }, label: { RecommenderContainerView { VStack(alignment: .leading, spacing: 4.0) { - GDLocalizedTextView("navilens.title") + GDLocalizedTextView("location_detail.action.beacon_or_navilens") .font(.body) Text(poi.localizedName) diff --git a/apps/ios/GuideDogs/Code/Visual UI/Views/Settings.storyboard b/apps/ios/GuideDogs/Code/Visual UI/Views/Settings.storyboard index ebc77e8fb..986e696b5 100644 --- a/apps/ios/GuideDogs/Code/Visual UI/Views/Settings.storyboard +++ b/apps/ios/GuideDogs/Code/Visual UI/Views/Settings.storyboard @@ -1,9 +1,8 @@ - + - - + @@ -37,7 +36,7 @@ - + @@ -284,8 +283,8 @@ -