From bfebd4c48cb473619bac8a9460cc9308aec6657c Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Wed, 24 Aug 2022 16:49:04 +1000 Subject: [PATCH 01/74] Add "Widget Extension" target via Xcode UI --- .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 93 ++++++++ .../Assets.xcassets/Contents.json | 6 + .../WidgetBackground.colorset/Contents.json | 11 + WooCommerce/StoreWidgets/Info.plist | 11 + .../StoreWidgets.intentdefinition | 59 +++++ WooCommerce/StoreWidgets/StoreWidgets.swift | 62 +++++ .../WooCommerce.xcodeproj/project.pbxproj | 211 +++++++++++++++++- 8 files changed, 463 insertions(+), 1 deletion(-) create mode 100644 WooCommerce/StoreWidgets/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 WooCommerce/StoreWidgets/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 WooCommerce/StoreWidgets/Assets.xcassets/Contents.json create mode 100644 WooCommerce/StoreWidgets/Assets.xcassets/WidgetBackground.colorset/Contents.json create mode 100644 WooCommerce/StoreWidgets/Info.plist create mode 100644 WooCommerce/StoreWidgets/StoreWidgets.intentdefinition create mode 100644 WooCommerce/StoreWidgets/StoreWidgets.swift diff --git a/WooCommerce/StoreWidgets/Assets.xcassets/AccentColor.colorset/Contents.json b/WooCommerce/StoreWidgets/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000000..eb878970081 --- /dev/null +++ b/WooCommerce/StoreWidgets/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/WooCommerce/StoreWidgets/Assets.xcassets/AppIcon.appiconset/Contents.json b/WooCommerce/StoreWidgets/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..5a3257a7d00 --- /dev/null +++ b/WooCommerce/StoreWidgets/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,93 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/WooCommerce/StoreWidgets/Assets.xcassets/Contents.json b/WooCommerce/StoreWidgets/Assets.xcassets/Contents.json new file mode 100644 index 00000000000..73c00596a7f --- /dev/null +++ b/WooCommerce/StoreWidgets/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/WooCommerce/StoreWidgets/Assets.xcassets/WidgetBackground.colorset/Contents.json b/WooCommerce/StoreWidgets/Assets.xcassets/WidgetBackground.colorset/Contents.json new file mode 100644 index 00000000000..eb878970081 --- /dev/null +++ b/WooCommerce/StoreWidgets/Assets.xcassets/WidgetBackground.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/WooCommerce/StoreWidgets/Info.plist b/WooCommerce/StoreWidgets/Info.plist new file mode 100644 index 00000000000..0f118fb75e4 --- /dev/null +++ b/WooCommerce/StoreWidgets/Info.plist @@ -0,0 +1,11 @@ + + + + + NSExtension + + NSExtensionPointIdentifier + com.apple.widgetkit-extension + + + diff --git a/WooCommerce/StoreWidgets/StoreWidgets.intentdefinition b/WooCommerce/StoreWidgets/StoreWidgets.intentdefinition new file mode 100644 index 00000000000..bdb404554a0 --- /dev/null +++ b/WooCommerce/StoreWidgets/StoreWidgets.intentdefinition @@ -0,0 +1,59 @@ + + + + + INEnums + + INIntentDefinitionModelVersion + 1.2 + INIntentDefinitionNamespace + 88xZPY + INIntentDefinitionSystemVersion + 20A294 + INIntentDefinitionToolsBuildVersion + 12A6144 + INIntentDefinitionToolsVersion + 12.0 + INIntents + + + INIntentCategory + information + INIntentDescriptionID + tVvJ9c + INIntentEligibleForWidgets + + INIntentIneligibleForSuggestions + + INIntentName + Configuration + INIntentResponse + + INIntentResponseCodes + + + INIntentResponseCodeName + success + INIntentResponseCodeSuccess + + + + INIntentResponseCodeName + failure + + + + INIntentTitle + Configuration + INIntentTitleID + gpCwrM + INIntentType + Custom + INIntentVerb + View + + + INTypes + + + diff --git a/WooCommerce/StoreWidgets/StoreWidgets.swift b/WooCommerce/StoreWidgets/StoreWidgets.swift new file mode 100644 index 00000000000..5d9df1a0154 --- /dev/null +++ b/WooCommerce/StoreWidgets/StoreWidgets.swift @@ -0,0 +1,62 @@ +import WidgetKit +import SwiftUI +import Intents + +struct Provider: IntentTimelineProvider { + func placeholder(in context: Context) -> SimpleEntry { + SimpleEntry(date: Date(), configuration: ConfigurationIntent()) + } + + func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) { + let entry = SimpleEntry(date: Date(), configuration: configuration) + completion(entry) + } + + func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline) -> ()) { + var entries: [SimpleEntry] = [] + + // Generate a timeline consisting of five entries an hour apart, starting from the current date. + let currentDate = Date() + for hourOffset in 0 ..< 5 { + let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! + let entry = SimpleEntry(date: entryDate, configuration: configuration) + entries.append(entry) + } + + let timeline = Timeline(entries: entries, policy: .atEnd) + completion(timeline) + } +} + +struct SimpleEntry: TimelineEntry { + let date: Date + let configuration: ConfigurationIntent +} + +struct StoreWidgetsEntryView : View { + var entry: Provider.Entry + + var body: some View { + Text(entry.date, style: .time) + } +} + +@main +struct StoreWidgets: Widget { + let kind: String = "StoreWidgets" + + var body: some WidgetConfiguration { + IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in + StoreWidgetsEntryView(entry: entry) + } + .configurationDisplayName("My Widget") + .description("This is an example widget.") + } +} + +struct StoreWidgets_Previews: PreviewProvider { + static var previews: some View { + StoreWidgetsEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent())) + .previewContext(WidgetPreviewContext(family: .systemSmall)) + } +} diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index 41f8bc462e4..f9957a0e222 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -684,6 +684,13 @@ 3F0CF3142704494A00EF3D71 /* TabNavComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = F997172F23DBCEB200592D8E /* TabNavComponent.swift */; }; 3F1CA81D26C3542600228BF2 /* XCUITestHelpers in Frameworks */ = {isa = PBXBuildFile; productRef = 3F1CA81C26C3542600228BF2 /* XCUITestHelpers */; }; 3F1CA81F26C3543C00228BF2 /* XCUITestHelpers in Frameworks */ = {isa = PBXBuildFile; productRef = 3F1CA81E26C3543C00228BF2 /* XCUITestHelpers */; }; + 3F1FA84228B60125009E246C /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F1FA84128B60125009E246C /* WidgetKit.framework */; }; + 3F1FA84328B60125009E246C /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5744BEB0248FE44C000A6FE2 /* SwiftUI.framework */; }; + 3F1FA84628B60125009E246C /* StoreWidgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F1FA84528B60125009E246C /* StoreWidgets.swift */; }; + 3F1FA84928B60126009E246C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3F1FA84828B60126009E246C /* Assets.xcassets */; }; + 3F1FA84B28B60126009E246C /* StoreWidgets.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 3F1FA84728B60125009E246C /* StoreWidgets.intentdefinition */; }; + 3F1FA84C28B60126009E246C /* StoreWidgets.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 3F1FA84728B60125009E246C /* StoreWidgets.intentdefinition */; }; + 3F1FA84F28B60126009E246C /* StoreWidgetsExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 3F1FA84028B60125009E246C /* StoreWidgetsExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 3F2C8A19285B038800B1A5BB /* BuildkiteTestCollector in Frameworks */ = {isa = PBXBuildFile; productRef = 3F2C8A18285B038800B1A5BB /* BuildkiteTestCollector */; }; 3F2C8A1B285B039900B1A5BB /* BuildkiteTestCollector in Frameworks */ = {isa = PBXBuildFile; productRef = 3F2C8A1A285B039900B1A5BB /* BuildkiteTestCollector */; }; 3F2C8A1D285B03A400B1A5BB /* BuildkiteTestCollector in Frameworks */ = {isa = PBXBuildFile; productRef = 3F2C8A1C285B03A400B1A5BB /* BuildkiteTestCollector */; }; @@ -1780,6 +1787,13 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 3F1FA84D28B60126009E246C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = B56DB3BE2049BFAA00D4AA8E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3F1FA83F28B60125009E246C; + remoteInfo = StoreWidgetsExtension; + }; 3FF314EB26FC76C60012E68E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = B56DB3BE2049BFAA00D4AA8E /* Project object */; @@ -1836,6 +1850,17 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + 3F1FA85028B60126009E246C /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 3F1FA84F28B60126009E246C /* StoreWidgetsExtension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; B5650B1020A4CD7F009702D0 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -2494,6 +2519,12 @@ 31FE28C125E6D338003519F2 /* LearnMoreTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LearnMoreTableViewCell.swift; sourceTree = ""; }; 31FE28C725E6D384003519F2 /* LearnMoreTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LearnMoreTableViewCell.xib; sourceTree = ""; }; 33035144757869DE5E4DC88A /* Pods-WooCommerce.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WooCommerce.release.xcconfig"; path = "../Pods/Target Support Files/Pods-WooCommerce/Pods-WooCommerce.release.xcconfig"; sourceTree = ""; }; + 3F1FA84028B60125009E246C /* StoreWidgetsExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = StoreWidgetsExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 3F1FA84128B60125009E246C /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; + 3F1FA84528B60125009E246C /* StoreWidgets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreWidgets.swift; sourceTree = ""; }; + 3F1FA84728B60125009E246C /* StoreWidgets.intentdefinition */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; path = StoreWidgets.intentdefinition; sourceTree = ""; }; + 3F1FA84828B60126009E246C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 3F1FA84A28B60126009E246C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 3F271A9728A2684400E656AE /* UITests.xctestplan */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = UITests.xctestplan; sourceTree = ""; }; 3F58701E281B947E004F7556 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; 3F587020281B9494004F7556 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; @@ -3654,6 +3685,15 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 3F1FA83D28B60125009E246C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3F1FA84328B60125009E246C /* SwiftUI.framework in Frameworks */, + 3F1FA84228B60125009E246C /* WidgetKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 3FF314DB26FC74450012E68E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -5197,6 +5237,17 @@ path = CardReaderTableViewCells; sourceTree = ""; }; + 3F1FA84428B60125009E246C /* StoreWidgets */ = { + isa = PBXGroup; + children = ( + 3F1FA84528B60125009E246C /* StoreWidgets.swift */, + 3F1FA84728B60125009E246C /* StoreWidgets.intentdefinition */, + 3F1FA84828B60126009E246C /* Assets.xcassets */, + 3F1FA84A28B60126009E246C /* Info.plist */, + ); + path = StoreWidgets; + sourceTree = ""; + }; 3FF314DF26FC74450012E68E /* UITestsFoundation */ = { isa = PBXGroup; children = ( @@ -6227,6 +6278,7 @@ B5C3B5E220D189E60072CB9D /* Networking.framework */, BABE5E07DD787ECA6D2A76DE /* Pods_WooCommerce.framework */, 6DC4526F9A7357761197EBF0 /* Pods_WooCommerceTests.framework */, + 3F1FA84128B60125009E246C /* WidgetKit.framework */, ); name = Frameworks; sourceTree = ""; @@ -6481,6 +6533,7 @@ F997170323DBB97500592D8E /* WooCommerceScreenshots */, CCDC49CB23FFFFF4003166BA /* WooCommerceUITests */, 3FF314DF26FC74450012E68E /* UITestsFoundation */, + 3F1FA84428B60125009E246C /* StoreWidgets */, 88A44ABE866401E6DB03AC60 /* Frameworks */, B56DB3C72049BFAA00D4AA8E /* Products */, 8CD41D4921F8A7E300CF3C2B /* RELEASE-NOTES.txt */, @@ -6499,6 +6552,7 @@ F997170223DBB97500592D8E /* WooCommerceScreenshots.xctest */, CCDC49CA23FFFFF4003166BA /* WooCommerceUITests.xctest */, 3FF314DE26FC74450012E68E /* UITestsFoundation.framework */, + 3F1FA84028B60125009E246C /* StoreWidgetsExtension.appex */, ); name = Products; sourceTree = ""; @@ -8398,6 +8452,23 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 3F1FA83F28B60125009E246C /* StoreWidgetsExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3F1FA85428B60126009E246C /* Build configuration list for PBXNativeTarget "StoreWidgetsExtension" */; + buildPhases = ( + 3F1FA83C28B60125009E246C /* Sources */, + 3F1FA83D28B60125009E246C /* Frameworks */, + 3F1FA83E28B60125009E246C /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = StoreWidgetsExtension; + productName = StoreWidgetsExtension; + productReference = 3F1FA84028B60125009E246C /* StoreWidgetsExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; 3FF314DD26FC74450012E68E /* UITestsFoundation */ = { isa = PBXNativeTarget; buildConfigurationList = 3FF314E526FC74450012E68E /* Build configuration list for PBXNativeTarget "UITestsFoundation" */; @@ -8432,11 +8503,13 @@ B5650B1020A4CD7F009702D0 /* Embed Frameworks */, B7A94351C1ADC31EA528B895 /* [CP] Embed Pods Frameworks */, 095040D72655531C001D08FA /* Check for nested frameworks */, + 3F1FA85028B60126009E246C /* Embed App Extensions */, ); buildRules = ( ); dependencies = ( B55D4C1520B6131400D7A50F /* PBXTargetDependency */, + 3F1FA84E28B60126009E246C /* PBXTargetDependency */, ); name = WooCommerce; packageProductDependencies = ( @@ -8530,10 +8603,13 @@ B56DB3BE2049BFAA00D4AA8E /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1130; + LastSwiftUpdateCheck = 1340; LastUpgradeCheck = 1210; ORGANIZATIONNAME = Automattic; TargetAttributes = { + 3F1FA83F28B60125009E246C = { + CreatedOnToolsVersion = 13.4.1; + }; 3FF314DD26FC74450012E68E = { CreatedOnToolsVersion = 13.0; }; @@ -8623,11 +8699,20 @@ F997170123DBB97500592D8E /* WooCommerceScreenshots */, CCDC49C923FFFFF4003166BA /* WooCommerceUITests */, 3FF314DD26FC74450012E68E /* UITestsFoundation */, + 3F1FA83F28B60125009E246C /* StoreWidgetsExtension */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 3F1FA83E28B60125009E246C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3F1FA84928B60126009E246C /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 3FF314DC26FC74450012E68E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -9035,6 +9120,15 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 3F1FA83C28B60125009E246C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3F1FA84B28B60126009E246C /* StoreWidgets.intentdefinition in Sources */, + 3F1FA84628B60125009E246C /* StoreWidgets.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 3FF314DA26FC74450012E68E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -10071,6 +10165,7 @@ 6856DB2E741639716E149967 /* KeyboardStateProvider.swift in Sources */, ABC35F18E744C5576B986CB3 /* InPersonPaymentsUnavailableView.swift in Sources */, ABC35528D2D6BE6F516E5CEF /* InPersonPaymentsOnboardingError.swift in Sources */, + 3F1FA84C28B60126009E246C /* StoreWidgets.intentdefinition in Sources */, ABC3521A374A2355001E3CD6 /* CardReaderSettingsSearchingViewController.swift in Sources */, 532842FC64B572D4545BD98E /* OrderFormCustomerNoteViewModel.swift in Sources */, 532846FAFFFCA93169B5E0BC /* WaitingTimeTracker.swift in Sources */, @@ -10532,6 +10627,11 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 3F1FA84E28B60126009E246C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3F1FA83F28B60125009E246C /* StoreWidgetsExtension */; + targetProxy = 3F1FA84D28B60126009E246C /* PBXContainerItemProxy */; + }; 3FF314EC26FC76C60012E68E /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 3FF314DD26FC74450012E68E /* UITestsFoundation */; @@ -10680,6 +10780,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 25D00C97936D2C6589F8ECE9 /* Pods-WooCommerce.release-alpha.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = "Resources/Woo-Alpha.entitlements"; "CODE_SIGN_ENTITLEMENTS[sdk=macosx*]" = "Resources/Woo-Alpha-macOS.entitlements"; @@ -10739,6 +10840,102 @@ }; name = "Release-Alpha"; }; + 3F1FA85128B60126009E246C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = PZYM8XX95Q; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = StoreWidgets/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = StoreWidgets; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Automattic. All rights reserved."; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.automattic.woocommerce.StoreWidgets; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 3F1FA85228B60126009E246C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = PZYM8XX95Q; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = StoreWidgets/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = StoreWidgets; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Automattic. All rights reserved."; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.automattic.woocommerce.StoreWidgets; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 3F1FA85328B60126009E246C /* Release-Alpha */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 99KV9Z6BKV; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = StoreWidgets/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = StoreWidgets; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Automattic. All rights reserved."; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.automattic.woocommerce.StoreWidgets; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Release-Alpha"; + }; 3FF314E226FC74450012E68E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -10989,6 +11186,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 90AC1C0B391E04A837BDC64E /* Pods-WooCommerce.debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = "Resources/Woo-Debug.entitlements"; "CODE_SIGN_ENTITLEMENTS[sdk=macosx*]" = "Resources/Woo-Debug-macOS.entitlements"; @@ -11020,6 +11218,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 33035144757869DE5E4DC88A /* Pods-WooCommerce.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = "Resources/Woo-Release.entitlements"; "CODE_SIGN_ENTITLEMENTS[sdk=macosx*]" = "Resources/Woo-Release-macOS.entitlements"; @@ -11231,6 +11430,16 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 3F1FA85428B60126009E246C /* Build configuration list for PBXNativeTarget "StoreWidgetsExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3F1FA85128B60126009E246C /* Debug */, + 3F1FA85228B60126009E246C /* Release */, + 3F1FA85328B60126009E246C /* Release-Alpha */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 3FF314E526FC74450012E68E /* Build configuration list for PBXNativeTarget "UITestsFoundation" */ = { isa = XCConfigurationList; buildConfigurations = ( From 134c2809fe7163f06aa9d4bd298aadbb53344539 Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Wed, 24 Aug 2022 16:49:47 +1000 Subject: [PATCH 02/74] Use `storewidgets` instead of `StoreWidgets` in the bundle id This is the value requested by the dev team and it was not possible to set it via the Xcode wizard at creation time. --- WooCommerce/WooCommerce.xcodeproj/project.pbxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index f9957a0e222..c38217dcb74 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -10863,7 +10863,7 @@ MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.automattic.woocommerce.StoreWidgets; + PRODUCT_BUNDLE_IDENTIFIER = com.automattic.woocommerce.storewidgets; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; @@ -10895,7 +10895,7 @@ ); MARKETING_VERSION = 1.0; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.automattic.woocommerce.StoreWidgets; + PRODUCT_BUNDLE_IDENTIFIER = com.automattic.woocommerce.storewidgets; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; @@ -10927,7 +10927,7 @@ ); MARKETING_VERSION = 1.0; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.automattic.woocommerce.StoreWidgets; + PRODUCT_BUNDLE_IDENTIFIER = com.automattic.woocommerce.storewidgets; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; From 760f01c29648d9aa870a5584a6c813b3bf760acc Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Wed, 24 Aug 2022 16:52:27 +1000 Subject: [PATCH 03/74] Extract App Store bundle identifier in constant in `Fastfile` We'll use it next to build the widget extension bundle id in a parametric way. --- fastlane/Fastfile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 250a7f2b361..62065741d74 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -25,8 +25,11 @@ SCREENSHOT_DEVICES = [ 'iPad Pro (12.9-inch) (3rd generation)' ].freeze -MAIN_BUNDLE_IDENTIFIERS = %w[com.automattic.woocommerce].freeze # Registered in our main account, for development and AppStore -ALPHA_BUNDLE_IDENTIFIERS = %w[com.automattic.alpha.woocommerce].freeze # Registered in our Enterprise account, for App Center / Installable Builds +APP_STORE_VERSION_BUNDLE_IDENTIFIER = 'com.automattic.woocommerce' +# Registered in our main account, for development and App Store +MAIN_BUNDLE_IDENTIFIERS = [APP_STORE_VERSION_BUNDLE_IDENTIFIER].freeze +# Registered in our Enterprise account, for App Center / Installable Builds +ALPHA_BUNDLE_IDENTIFIERS = %w[com.automattic.alpha.woocommerce].freeze TEST_SCHEME = 'WooCommerce' From ec3697c3a219777f4daaa987ba20c776038ba3be Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Wed, 24 Aug 2022 21:06:26 +1000 Subject: [PATCH 04/74] Extract Alpha/Enterprise bundle identifier in constant in `Fastfile` We'll use it next to build the widget extension bundle id in a parametric way. --- fastlane/Fastfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 62065741d74..9950c7e437a 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -28,8 +28,10 @@ SCREENSHOT_DEVICES = [ APP_STORE_VERSION_BUNDLE_IDENTIFIER = 'com.automattic.woocommerce' # Registered in our main account, for development and App Store MAIN_BUNDLE_IDENTIFIERS = [APP_STORE_VERSION_BUNDLE_IDENTIFIER].freeze + +ALPHA_VERSION_BUNDLE_IDENTIFIER = 'com.automattic.alpha.woocommerce' # Registered in our Enterprise account, for App Center / Installable Builds -ALPHA_BUNDLE_IDENTIFIERS = %w[com.automattic.alpha.woocommerce].freeze +ALPHA_BUNDLE_IDENTIFIERS = [ALPHA_VERSION_BUNDLE_IDENTIFIER].freeze TEST_SCHEME = 'WooCommerce' From 97a20a231538518089606e2d7c2c0e8ddb2eec08 Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Wed, 24 Aug 2022 21:17:10 +1000 Subject: [PATCH 05/74] Make `match` run in `readonly` mode for both ASC and Enterprise Always run `readonly` by default, just in case. --- fastlane/Fastfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 9950c7e437a..bbcadc71789 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -935,7 +935,7 @@ platform :ios do match( type: 'appstore', team_id: get_required_env('EXT_EXPORT_TEAM_ID'), - readonly: false, + readonly: true, app_identifier: MAIN_BUNDLE_IDENTIFIERS, template_name: 'Apple Pay Pass Suppression' ) From 4c5c7ee4dba54df80847573deba03cac5e4bb0e4 Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Wed, 24 Aug 2022 21:17:52 +1000 Subject: [PATCH 06/74] Add widgets extension bundle identifier to bundle arrays in `Fastfile` --- fastlane/Fastfile | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index bbcadc71789..859c63666f6 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -27,11 +27,17 @@ SCREENSHOT_DEVICES = [ APP_STORE_VERSION_BUNDLE_IDENTIFIER = 'com.automattic.woocommerce' # Registered in our main account, for development and App Store -MAIN_BUNDLE_IDENTIFIERS = [APP_STORE_VERSION_BUNDLE_IDENTIFIER].freeze +MAIN_BUNDLE_IDENTIFIERS = [ + APP_STORE_VERSION_BUNDLE_IDENTIFIER, + "#{APP_STORE_VERSION_BUNDLE_IDENTIFIER}.storewidgets" +].freeze ALPHA_VERSION_BUNDLE_IDENTIFIER = 'com.automattic.alpha.woocommerce' # Registered in our Enterprise account, for App Center / Installable Builds -ALPHA_BUNDLE_IDENTIFIERS = [ALPHA_VERSION_BUNDLE_IDENTIFIER].freeze +ALPHA_BUNDLE_IDENTIFIERS = [ + ALPHA_VERSION_BUNDLE_IDENTIFIER, + "#{ALPHA_VERSION_BUNDLE_IDENTIFIER}.storewidgets" +].freeze TEST_SCHEME = 'WooCommerce' From 6696e850013e6dacdc2aa6afbeb33c6b2da68879 Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Wed, 24 Aug 2022 21:24:19 +1000 Subject: [PATCH 07/74] Update Fastlane to latest version, 2.209.1 --- Gemfile.lock | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index c1bc8e911e7..a8790d2fe7e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -17,20 +17,20 @@ GEM ast (2.4.2) atomos (0.1.3) aws-eventstream (1.2.0) - aws-partitions (1.579.0) - aws-sdk-core (3.130.1) + aws-partitions (1.621.0) + aws-sdk-core (3.134.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.525.0) aws-sigv4 (~> 1.1) - jmespath (~> 1.0) - aws-sdk-kms (1.56.0) + jmespath (~> 1, >= 1.6.1) + aws-sdk-kms (1.58.0) aws-sdk-core (~> 3, >= 3.127.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.113.0) + aws-sdk-s3 (1.114.0) aws-sdk-core (~> 3, >= 3.127.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.4) - aws-sigv4 (1.5.0) + aws-sigv4 (1.5.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) bigdecimal (1.4.4) @@ -89,13 +89,13 @@ GEM rake (>= 12.0.0, < 14.0.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) - dotenv (2.7.6) + dotenv (2.8.1) emoji_regex (3.2.3) escape (0.0.4) ethon (0.15.0) ffi (>= 1.15.0) - excon (0.92.2) - faraday (1.10.1) + excon (0.92.4) + faraday (1.10.2) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) @@ -124,7 +124,7 @@ GEM faraday_middleware (1.2.0) faraday (~> 1.0) fastimage (2.2.6) - fastlane (2.205.2) + fastlane (2.209.1) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -188,8 +188,8 @@ GEM git (1.12.0) addressable (~> 2.8) rchardet (~> 1.8) - google-apis-androidpublisher_v3 (0.19.0) - google-apis-core (>= 0.4, < 2.a) + google-apis-androidpublisher_v3 (0.25.0) + google-apis-core (>= 0.7, < 2.a) google-apis-core (0.7.0) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) @@ -201,8 +201,8 @@ GEM webrick google-apis-iamcredentials_v1 (0.13.0) google-apis-core (>= 0.7, < 2.a) - google-apis-playcustomapp_v1 (0.7.0) - google-apis-core (>= 0.4, < 2.a) + google-apis-playcustomapp_v1 (0.10.0) + google-apis-core (>= 0.7, < 2.a) google-apis-storage_v1 (0.17.0) google-apis-core (>= 0.7, < 2.a) google-cloud-core (1.6.0) @@ -227,13 +227,13 @@ GEM os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) highline (2.0.3) - http-cookie (1.0.4) + http-cookie (1.0.5) domain_name (~> 0.5) httpclient (2.8.3) i18n (1.12.0) concurrent-ruby (~> 1.0) jmespath (1.6.1) - json (2.6.1) + json (2.6.2) jsonlint (0.3.0) oj (~> 3) optimist (~> 3) @@ -330,14 +330,14 @@ GEM uber (0.1.0) unf (0.1.4) unf_ext - unf_ext (0.0.8.1) + unf_ext (0.0.8.2) unicode-display_width (2.1.0) webrick (1.7.0) word_wrap (1.0.0) xcode-install (2.8.0) claide (>= 0.9.1, < 1.1.0) fastlane (>= 2.1.0, < 3.0.0) - xcodeproj (1.21.0) + xcodeproj (1.22.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -371,4 +371,4 @@ DEPENDENCIES xcpretty-travis-formatter BUNDLED WITH - 2.3.8 + 2.3.20 From 13bb02f8c346f865ba163959068f63f2ca412ee2 Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Tue, 30 Aug 2022 11:57:44 +1000 Subject: [PATCH 08/74] Remove space in between `struct` name and `:` in `StoreWidgets.swift` --- WooCommerce/StoreWidgets/StoreWidgets.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/StoreWidgets/StoreWidgets.swift b/WooCommerce/StoreWidgets/StoreWidgets.swift index 5d9df1a0154..10fa6230a56 100644 --- a/WooCommerce/StoreWidgets/StoreWidgets.swift +++ b/WooCommerce/StoreWidgets/StoreWidgets.swift @@ -33,7 +33,7 @@ struct SimpleEntry: TimelineEntry { let configuration: ConfigurationIntent } -struct StoreWidgetsEntryView : View { +struct StoreWidgetsEntryView: View { var entry: Provider.Entry var body: some View { From 21565555ff20b6ca9b9919df30ecc2ce53e70d3f Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Tue, 30 Aug 2022 12:02:34 +1000 Subject: [PATCH 09/74] Remove custom entitlements from `match` App Store configuration --- fastlane/Fastfile | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 1366a629fd5..33bfb14ec49 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -943,8 +943,8 @@ platform :ios do match( type: 'enterprise', team_id: get_required_env('INT_EXPORT_TEAM_ID'), - readonly: true, - app_identifier: ALPHA_BUNDLE_IDENTIFIERS + app_identifier: ALPHA_BUNDLE_IDENTIFIERS, + readonly: true ) end @@ -952,9 +952,15 @@ platform :ios do match( type: 'appstore', team_id: get_required_env('EXT_EXPORT_TEAM_ID'), - readonly: true, app_identifier: MAIN_BUNDLE_IDENTIFIERS, - template_name: 'Apple Pay Pass Suppression' + # For a time, we used to have this parameter specifying a entitlements. + # In August 2022, `match` started being unable to generate new + # provisioning profiles and the only solution I found was to remove it. + # + # Leaving it here for future referece as something to try if `match` + # gives us trouble again. + # template_name: 'Apple Pay Pass Suppression' + readonly: true ) end From 30d3b54df89f80563e348649c2ed34075710545c Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Tue, 30 Aug 2022 17:07:36 +1000 Subject: [PATCH 10/74] Temporarily remove widgets bundle id from Enterprise `match` call Such a setup is no good long term but we're obviously working to sort it out. In the short term, not including this bundle id might work, or it might break the build later on when code sign happens but can't find the provisioning profile. We'll soon find out... --- fastlane/Fastfile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 33bfb14ec49..8c230d99b8c 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -36,7 +36,14 @@ ALPHA_VERSION_BUNDLE_IDENTIFIER = 'com.automattic.alpha.woocommerce' # Registered in our Enterprise account, for App Center / Installable Builds ALPHA_BUNDLE_IDENTIFIERS = [ ALPHA_VERSION_BUNDLE_IDENTIFIER, - "#{ALPHA_VERSION_BUNDLE_IDENTIFIER}.storewidgets" + # This is part of the project but currently disabled because of issues + # accessing the Enterprise account and creating the app id. + # + # Such a setup is no good long term but we're obviously working to sort it + # out. In the short term, not including this bundle id might work, or it + # might break the build later on when code sign happens but can't find the + # provisioning profile. We'll soon find out... + # "#{ALPHA_VERSION_BUNDLE_IDENTIFIER}.storewidgets" ].freeze TEST_SCHEME = 'WooCommerce' From f1aff8072cbeda8ae21830c806b9f875b1103f59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Wed, 31 Aug 2022 13:15:16 +0200 Subject: [PATCH 11/74] Add route for payments --- .../Classes/Universal Links/Routes/PaymentsRoute.swift | 7 +++++++ .../Classes/Universal Links/UniversalLinkRouter.swift | 3 ++- WooCommerce/WooCommerce.xcodeproj/project.pbxproj | 4 ++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift diff --git a/WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift b/WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift new file mode 100644 index 00000000000..34c10f5b6fb --- /dev/null +++ b/WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift @@ -0,0 +1,7 @@ +import Foundation + +struct PaymentsRoute: Route { + let path = "/payments" + + func perform(with parameters: [String: String]) {} +} diff --git a/WooCommerce/Classes/Universal Links/UniversalLinkRouter.swift b/WooCommerce/Classes/Universal Links/UniversalLinkRouter.swift index 8c80806e9c5..d637e60b975 100644 --- a/WooCommerce/Classes/Universal Links/UniversalLinkRouter.swift +++ b/WooCommerce/Classes/Universal Links/UniversalLinkRouter.swift @@ -25,7 +25,8 @@ struct UniversalLinkRouter { /// As we only perform one action to avoid conflicts, order matters (only the first matched route will be called to perform its action) /// private static let defaultRoutes: [Route] = [ - OrderDetailsRoute() + OrderDetailsRoute(), + PaymentsRoute() ] func handle(url: URL) { diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index 6446c91d87c..81cf360fceb 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -1273,6 +1273,7 @@ B92FF9AE27FC7217005C34E3 /* OrderListViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = B92FF9AD27FC7217005C34E3 /* OrderListViewController.xib */; }; B92FF9B027FC7821005C34E3 /* ProductsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = B92FF9AF27FC7821005C34E3 /* ProductsViewController.xib */; }; B94403C9289ABB4D00323FC2 /* SimplePaymentsAmountFlowOpener.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94403C8289ABB4D00323FC2 /* SimplePaymentsAmountFlowOpener.swift */; }; + B95112DA28BF79CA00D9578D /* PaymentsRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = B95112D928BF79CA00D9578D /* PaymentsRoute.swift */; }; B958A7C728B3D44A00823EEF /* UniversalLinkRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B958A7C628B3D44A00823EEF /* UniversalLinkRouter.swift */; }; B958A7C928B3D47B00823EEF /* Route.swift in Sources */ = {isa = PBXBuildFile; fileRef = B958A7C828B3D47B00823EEF /* Route.swift */; }; B958A7CB28B3D4A100823EEF /* RouteMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B958A7CA28B3D4A100823EEF /* RouteMatcher.swift */; }; @@ -3125,6 +3126,7 @@ B92FF9AD27FC7217005C34E3 /* OrderListViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = OrderListViewController.xib; sourceTree = ""; }; B92FF9AF27FC7821005C34E3 /* ProductsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ProductsViewController.xib; sourceTree = ""; }; B94403C8289ABB4D00323FC2 /* SimplePaymentsAmountFlowOpener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimplePaymentsAmountFlowOpener.swift; sourceTree = ""; }; + B95112D928BF79CA00D9578D /* PaymentsRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentsRoute.swift; sourceTree = ""; }; B958A7C628B3D44A00823EEF /* UniversalLinkRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UniversalLinkRouter.swift; sourceTree = ""; }; B958A7C828B3D47B00823EEF /* Route.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Route.swift; sourceTree = ""; }; B958A7CA28B3D4A100823EEF /* RouteMatcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouteMatcher.swift; sourceTree = ""; }; @@ -6933,6 +6935,7 @@ children = ( B958A7CC28B3DD9100823EEF /* OrderDetailsRoute.swift */, B958A7C828B3D47B00823EEF /* Route.swift */, + B95112D928BF79CA00D9578D /* PaymentsRoute.swift */, ); path = Routes; sourceTree = ""; @@ -9184,6 +9187,7 @@ 024DF31E23743045006658FE /* TextList+AztecFormatting.swift in Sources */, 0260F40123224E8100EDA10A /* ProductsViewController.swift in Sources */, DE4D308928507B5B00E36ADD /* CouponCreationSuccess.swift in Sources */, + B95112DA28BF79CA00D9578D /* PaymentsRoute.swift in Sources */, 7E6A019F2725CD76001668D5 /* FilterProductCategoryListViewModel.swift in Sources */, CC53FB3C2757EC7200C4CA4F /* ProductSelectorViewModel.swift in Sources */, 4569D3C325DC008700CDC3E2 /* SiteAddress.swift in Sources */, From 7a9ae167098927ebb9a6ea7c956fc8124aee13ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Wed, 31 Aug 2022 13:29:35 +0200 Subject: [PATCH 12/74] Navigate to payments when a payments universal link is sent --- .../Classes/Universal Links/Routes/PaymentsRoute.swift | 4 +++- .../ViewRelated/Hub Menu/HubMenuViewController.swift | 4 ++++ .../Classes/ViewRelated/MainTabBarController.swift | 10 ++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift b/WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift index 34c10f5b6fb..56813d70e58 100644 --- a/WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift +++ b/WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift @@ -3,5 +3,7 @@ import Foundation struct PaymentsRoute: Route { let path = "/payments" - func perform(with parameters: [String: String]) {} + func perform(with parameters: [String: String]) { + MainTabBarController.presentPayments() + } } diff --git a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewController.swift b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewController.swift index de3f929a603..4fb9ffbeefe 100644 --- a/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Hub Menu/HubMenuViewController.swift @@ -27,6 +27,10 @@ final class HubMenuViewController: UIHostingController { func pushReviewDetailsViewController(using parcel: ProductReviewFromNoteParcel) { viewModel.showReviewDetails(using: parcel) } + + func showPaymentsMenu() { + show(InPersonPaymentsMenuViewController(), sender: self) + } } private extension HubMenuViewController { diff --git a/WooCommerce/Classes/ViewRelated/MainTabBarController.swift b/WooCommerce/Classes/ViewRelated/MainTabBarController.swift index 0471e2431a8..d7a39253590 100644 --- a/WooCommerce/Classes/ViewRelated/MainTabBarController.swift +++ b/WooCommerce/Classes/ViewRelated/MainTabBarController.swift @@ -420,6 +420,16 @@ extension MainTabBarController { (childViewController() as? OrdersRootViewController)?.presentDetails(for: orderID, siteID: siteID) } } + + static func presentPayments() { + switchToHubMenuTab() + + guard let hubMenuViewController: HubMenuViewController = childViewController() else { + return + } + + hubMenuViewController.showPaymentsMenu() + } } // MARK: - Site ID observation for updating tab view controllers From bfa5bd6119799f972b7b42fb6dc0b12ab80438b5 Mon Sep 17 00:00:00 2001 From: Gabriel Maldonado Date: Wed, 31 Aug 2022 23:56:27 +0200 Subject: [PATCH 13/74] Remove .hubMenu feature flag references --- .../DefaultFeatureFlagService.swift | 2 - Experiments/Experiments/FeatureFlag.swift | 4 - .../Dashboard/DashboardViewController.swift | 18 ----- .../Settings/Settings/SettingsViewModel.swift | 15 ---- .../ViewRelated/MainTabBarController.swift | 74 ++++++------------- .../Reviews/ReviewsViewController.swift | 6 +- 6 files changed, 25 insertions(+), 94 deletions(-) diff --git a/Experiments/Experiments/DefaultFeatureFlagService.swift b/Experiments/Experiments/DefaultFeatureFlagService.swift index 5f8c96c6e87..da717fda7d2 100644 --- a/Experiments/Experiments/DefaultFeatureFlagService.swift +++ b/Experiments/Experiments/DefaultFeatureFlagService.swift @@ -9,8 +9,6 @@ public struct DefaultFeatureFlagService: FeatureFlagService { return buildConfig == .localDeveloper || buildConfig == .alpha case .jetpackConnectionPackageSupport: return true - case .hubMenu: - return true case .systemStatusReport: return true case .couponView: diff --git a/Experiments/Experiments/FeatureFlag.swift b/Experiments/Experiments/FeatureFlag.swift index 80b5365e47c..eeb3c5fbfe9 100644 --- a/Experiments/Experiments/FeatureFlag.swift +++ b/Experiments/Experiments/FeatureFlag.swift @@ -18,10 +18,6 @@ public enum FeatureFlag: Int { /// case jetpackConnectionPackageSupport - /// Display the new tab "Menu" in the tab bar. - /// - case hubMenu - /// Displays the System Status Report on Settings/Help screen /// case systemStatusReport diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/DashboardViewController.swift b/WooCommerce/Classes/ViewRelated/Dashboard/DashboardViewController.swift index 36038c02843..60936283dfb 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/DashboardViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/DashboardViewController.swift @@ -148,7 +148,6 @@ private extension DashboardViewController { func configureNavigation() { configureTitle() configureHeaderStackView() - configureNavigationItem() } func configureTabBarItem() { @@ -196,23 +195,6 @@ private extension DashboardViewController { contentBottomToContainerConstraint = contentView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor) } - private func configureNavigationItem() { - if !ServiceLocator.featureFlagService.isFeatureFlagEnabled(.hubMenu) { - let rightBarButton = UIBarButtonItem(image: .gearBarButtonItemImage, - style: .plain, - target: self, - action: #selector(settingsTapped)) - rightBarButton.accessibilityLabel = NSLocalizedString("Settings", comment: "Accessibility label for the Settings button.") - rightBarButton.accessibilityTraits = .button - rightBarButton.accessibilityHint = NSLocalizedString( - "Navigates to Settings.", - comment: "VoiceOver accessibility hint, informing the user the button can be used to navigate to the Settings screen." - ) - rightBarButton.accessibilityIdentifier = "dashboard-settings-button" - navigationItem.setRightBarButton(rightBarButton, animated: false) - } - } - func configureDashboardUIContainer() { hiddenScrollView.configureForLargeTitleWorkaround() // Adds the "hidden" scroll view to the root of the UIViewController for large titles. diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Settings/SettingsViewModel.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Settings/SettingsViewModel.swift index d2b92f08668..7da32aea09e 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Settings/SettingsViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Settings/SettingsViewModel.swift @@ -195,20 +195,6 @@ private extension SettingsViewModel { } func configureSections() { - // Selected Store - let selectedStoreSection: Section? = { - if featureFlagService.isFeatureFlagEnabled(.hubMenu) { - return nil - } - else { - let storeRows: [Row] = sites.count > 1 ? - [.selectedStore, .switchStore] : [.selectedStore] - return Section(title: Localization.selectedStoreTitle, - rows: storeRows, - footerHeight: UITableView.automaticDimension) - } - }() - // Plugins let pluginsSection: Section? = { // Show the plugins section only if the user has an `admin` role for the default store site. @@ -301,7 +287,6 @@ private extension SettingsViewModel { footerHeight: CGFloat.leastNonzeroMagnitude) sections = [ - selectedStoreSection, pluginsSection, storeSettingsSection, helpAndFeedbackSection, diff --git a/WooCommerce/Classes/ViewRelated/MainTabBarController.swift b/WooCommerce/Classes/ViewRelated/MainTabBarController.swift index 9ec6a5877a3..b2cd90233ec 100644 --- a/WooCommerce/Classes/ViewRelated/MainTabBarController.swift +++ b/WooCommerce/Classes/ViewRelated/MainTabBarController.swift @@ -35,14 +35,14 @@ extension WooTab { /// /// - Parameters: /// - visibleIndex: the index of visible tabs on the tab bar - init(visibleIndex: Int, isHubMenuFeatureFlagOn: Bool) { - let tabs = WooTab.visibleTabs(isHubMenuFeatureFlagOn) + init(visibleIndex: Int) { + let tabs = WooTab.visibleTabs() self = tabs[visibleIndex] } /// Returns the visible tab index. - func visibleIndex(_ isHubMenuFeatureFlagOn: Bool) -> Int { - let tabs = WooTab.visibleTabs(isHubMenuFeatureFlagOn) + func visibleIndex() -> Int { + let tabs = WooTab.visibleTabs() guard let tabIndex = tabs.firstIndex(where: { $0 == self }) else { assertionFailure("Trying to get the visible tab index for tab \(self) while the visible tabs are: \(tabs)") return 0 @@ -51,17 +51,8 @@ extension WooTab { } // Note: currently only the Dashboard tab (My Store) view controller is set up in Main.storyboard. - private static func visibleTabs(_ isHubMenuFeatureFlagOn: Bool) -> [WooTab] { - var tabs: [WooTab] = [.myStore, .orders, .products] - - if isHubMenuFeatureFlagOn { - tabs.append(.hubMenu) - } - else { - tabs.append(.reviews) - } - - return tabs + private static func visibleTabs() -> [WooTab] { + return [.myStore, .orders, .products, .hubMenu] } } @@ -114,8 +105,6 @@ final class MainTabBarController: UITabBarController { private var productImageUploadErrorsSubscription: AnyCancellable? - private lazy var isHubMenuFeatureFlagOn = featureFlagService.isFeatureFlagEnabled(.hubMenu) - private lazy var isOrdersSplitViewFeatureFlagOn = featureFlagService.isFeatureFlagEnabled(.splitViewInOrdersTab) init?(coder: NSCoder, @@ -174,11 +163,11 @@ final class MainTabBarController: UITabBarController { } override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { - let currentlySelectedTab = WooTab(visibleIndex: selectedIndex, isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn) + let currentlySelectedTab = WooTab(visibleIndex: selectedIndex) guard let userSelectedIndex = tabBar.items?.firstIndex(of: item) else { return } - let userSelectedTab = WooTab(visibleIndex: userSelectedIndex, isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn) + let userSelectedTab = WooTab(visibleIndex: userSelectedIndex) // Did we reselect the already-selected tab? if currentlySelectedTab == userSelectedTab { @@ -197,7 +186,7 @@ final class MainTabBarController: UITabBarController { if let presentedController = Self.childViewController()?.presentedViewController { presentedController.dismiss(animated: true) } - selectedIndex = tab.visibleIndex(isHubMenuFeatureFlagOn) + selectedIndex = tab.visibleIndex() if let navController = selectedViewController as? UINavigationController { navController.popToRootViewController(animated: animated) { completion?() @@ -402,22 +391,17 @@ private extension MainTabBarController { viewControllers = { var controllers = [UIViewController]() - let dashboardTabIndex = WooTab.myStore.visibleIndex(isHubMenuFeatureFlagOn) + let dashboardTabIndex = WooTab.myStore.visibleIndex() controllers.insert(dashboardNavigationController, at: dashboardTabIndex) - let ordersTabIndex = WooTab.orders.visibleIndex(isHubMenuFeatureFlagOn) + let ordersTabIndex = WooTab.orders.visibleIndex() controllers.insert(ordersNavigationController, at: ordersTabIndex) - let productsTabIndex = WooTab.products.visibleIndex(isHubMenuFeatureFlagOn) + let productsTabIndex = WooTab.products.visibleIndex() controllers.insert(productsNavigationController, at: productsTabIndex) - if isHubMenuFeatureFlagOn { - let hubMenuTabIndex = WooTab.hubMenu.visibleIndex(isHubMenuFeatureFlagOn) - controllers.insert(hubMenuNavigationController, at: hubMenuTabIndex) - } else { - let reviewsTabIndex = WooTab.reviews.visibleIndex(isHubMenuFeatureFlagOn) - controllers.insert(reviewsNavigationController, at: reviewsTabIndex) - } + let hubMenuTabIndex = WooTab.hubMenu.visibleIndex() + controllers.insert(hubMenuNavigationController, at: hubMenuTabIndex) return controllers }() @@ -450,26 +434,16 @@ private extension MainTabBarController { let productsViewController = createProductsViewController(siteID: siteID) productsNavigationController.viewControllers = [productsViewController] - // Configure hub menu tab coordinator or reviews tab coordinator once per logged in session potentially with multiple sites. - if isHubMenuFeatureFlagOn { - if hubMenuTabCoordinator == nil { - let hubTabCoordinator = createHubMenuTabCoordinator() - self.hubMenuTabCoordinator = hubTabCoordinator - hubTabCoordinator.start() - } - hubMenuTabCoordinator?.activate(siteID: siteID) - } - else { - if reviewsTabCoordinator == nil { - let reviewsTabCoordinator = createReviewsTabCoordinator() - self.reviewsTabCoordinator = reviewsTabCoordinator - reviewsTabCoordinator.start() - } - reviewsTabCoordinator?.activate(siteID: siteID) + // Configure hub menu tab coordinator once per logged in session potentially with multiple sites. + if hubMenuTabCoordinator == nil { + let hubTabCoordinator = createHubMenuTabCoordinator() + self.hubMenuTabCoordinator = hubTabCoordinator + hubTabCoordinator.start() } + hubMenuTabCoordinator?.activate(siteID: siteID) // Set dashboard to be the default tab. - selectedIndex = WooTab.myStore.visibleIndex(isHubMenuFeatureFlagOn) + selectedIndex = WooTab.myStore.visibleIndex() } func createDashboardViewController(siteID: Int64) -> UIViewController { @@ -524,8 +498,8 @@ private extension MainTabBarController { } func updateMenuTabBadge(with action: NotificationBadgeActionType) { - let tab = self.isHubMenuFeatureFlagOn ? WooTab.hubMenu : WooTab.reviews - let tabIndex = tab.visibleIndex(self.isHubMenuFeatureFlagOn) + let tab = WooTab.hubMenu + let tabIndex = tab.visibleIndex() let input = NotificationsBadgeInput(action: action, tab: tab, tabBar: self.tabBar, tabIndex: tabIndex) self.notificationsBadge.updateBadge(with: input) @@ -542,7 +516,7 @@ private extension MainTabBarController { } let tab = WooTab.orders - let tabIndex = tab.visibleIndex(self.isHubMenuFeatureFlagOn) + let tabIndex = tab.visibleIndex() guard let orderTab: UITabBarItem = self.tabBar.items?[tabIndex] else { return diff --git a/WooCommerce/Classes/ViewRelated/Reviews/ReviewsViewController.swift b/WooCommerce/Classes/ViewRelated/Reviews/ReviewsViewController.swift index 1b42db03ad5..7e9957e1a15 100644 --- a/WooCommerce/Classes/ViewRelated/Reviews/ReviewsViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Reviews/ReviewsViewController.swift @@ -235,11 +235,7 @@ private extension ReviewsViewController { } func refreshTitle() { - if ServiceLocator.featureFlagService.isFeatureFlagEnabled(.hubMenu) { - title = Localization.title - } else { - navigationItem.title = Localization.title - } + title = Localization.title } } From 7f37007e64d3efe331d31ce30255bd7c14eccde1 Mon Sep 17 00:00:00 2001 From: Gabriel Maldonado Date: Thu, 1 Sep 2022 00:19:24 +0200 Subject: [PATCH 14/74] Remove hubMenu MockFeatureFlag. Check Unit Tests pass --- .../Mocks/MockFeatureFlagService.swift | 2 - .../MainTabBarControllerTests.swift | 106 +++--------------- 2 files changed, 17 insertions(+), 91 deletions(-) diff --git a/WooCommerce/WooCommerceTests/Mocks/MockFeatureFlagService.swift b/WooCommerce/WooCommerceTests/Mocks/MockFeatureFlagService.swift index 5f9b3a2abd5..35eb703544e 100644 --- a/WooCommerce/WooCommerceTests/Mocks/MockFeatureFlagService.swift +++ b/WooCommerce/WooCommerceTests/Mocks/MockFeatureFlagService.swift @@ -36,8 +36,6 @@ struct MockFeatureFlagService: FeatureFlagService { switch featureFlag { case .jetpackConnectionPackageSupport: return isJetpackConnectionPackageSupportOn - case .hubMenu: - return isHubMenuOn case .inbox: return isInboxOn case .splitViewInOrdersTab: diff --git a/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift index 77ed31ae867..76901da0157 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift @@ -65,8 +65,8 @@ final class MainTabBarControllerTests: XCTestCase { isAnInstanceOf: OrdersRootViewController.self) assertThat(tabBarController.tabNavigationController(tab: .products, isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn)?.topViewController, isAnInstanceOf: ProductsViewController.self) - assertThat(tabBarController.tabNavigationController(tab: .reviews, isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn)?.topViewController, - isAnInstanceOf: ReviewsViewController.self) + assertThat(tabBarController.tabNavigationController(tab: .hubMenu, isHubMenuFeatureFlagOn: true)?.topViewController, + isAnInstanceOf: HubMenuViewController.self) } func test_tab_view_controllers_returns_expected_values_with_hub_menu_enabled() { @@ -133,8 +133,7 @@ final class MainTabBarControllerTests: XCTestCase { func test_tab_root_viewControllers_are_replaced_after_updating_to_a_different_site() throws { // Arrange - let isHubMenuFeatureFlagOn = false - ServiceLocator.setFeatureFlagService(MockFeatureFlagService(isHubMenuOn: isHubMenuFeatureFlagOn)) + ServiceLocator.setFeatureFlagService(MockFeatureFlagService(isHubMenuOn: true)) guard let tabBarController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as? MainTabBarController else { return } @@ -150,14 +149,14 @@ final class MainTabBarControllerTests: XCTestCase { // Assert XCTAssertEqual(viewControllersBeforeSiteChange.count, viewControllersAfterSiteChange.count) - XCTAssertNotEqual(viewControllersBeforeSiteChange[WooTab.myStore.visibleIndex(isHubMenuFeatureFlagOn)], - viewControllersAfterSiteChange[WooTab.myStore.visibleIndex(isHubMenuFeatureFlagOn)]) - XCTAssertNotEqual(viewControllersBeforeSiteChange[WooTab.orders.visibleIndex(isHubMenuFeatureFlagOn)], - viewControllersAfterSiteChange[WooTab.orders.visibleIndex(isHubMenuFeatureFlagOn)]) - XCTAssertNotEqual(viewControllersBeforeSiteChange[WooTab.products.visibleIndex(isHubMenuFeatureFlagOn)], - viewControllersAfterSiteChange[WooTab.products.visibleIndex(isHubMenuFeatureFlagOn)]) - XCTAssertNotEqual(viewControllersBeforeSiteChange[WooTab.reviews.visibleIndex(isHubMenuFeatureFlagOn)], - viewControllersAfterSiteChange[WooTab.reviews.visibleIndex(isHubMenuFeatureFlagOn)]) + XCTAssertNotEqual(viewControllersBeforeSiteChange[WooTab.myStore.visibleIndex()], + viewControllersAfterSiteChange[WooTab.myStore.visibleIndex()]) + XCTAssertNotEqual(viewControllersBeforeSiteChange[WooTab.orders.visibleIndex()], + viewControllersAfterSiteChange[WooTab.orders.visibleIndex()]) + XCTAssertNotEqual(viewControllersBeforeSiteChange[WooTab.products.visibleIndex()], + viewControllersAfterSiteChange[WooTab.products.visibleIndex()]) + XCTAssertNotEqual(viewControllersBeforeSiteChange[WooTab.hubMenu.visibleIndex()], + viewControllersAfterSiteChange[WooTab.hubMenu.visibleIndex()]) } func test_tab_view_controllers_stay_the_same_after_updating_to_the_same_site() throws { @@ -199,79 +198,8 @@ final class MainTabBarControllerTests: XCTestCase { let selectedTabIndexAfterSiteChange = tabBarController.selectedIndex // Assert - XCTAssertEqual(selectedTabIndexBeforeSiteChange, WooTab.products.visibleIndex(isHubMenuFeatureFlagOn)) - XCTAssertEqual(selectedTabIndexAfterSiteChange, WooTab.myStore.visibleIndex(isHubMenuFeatureFlagOn)) - } - - func test_when_receiving_a_review_notification_from_a_different_site_navigates_to_reviews_tab_and_presents_review_details() throws { - // Arrange - // Sets mock `FeatureFlagService` before `MainTabBarController` is initialized so that the feature flags are set correctly. - let isHubMenuFeatureFlagOn = false - ServiceLocator.setFeatureFlagService(MockFeatureFlagService(isHubMenuOn: isHubMenuFeatureFlagOn)) - - guard let tabBarController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as? MainTabBarController else { - return - } - - let pushNotificationsManager = MockPushNotificationsManager() - ServiceLocator.setPushNotesManager(pushNotificationsManager) - - let storesManager = MockStoresManager(sessionManager: .testingInstance) - // Reset `receivedActions` - storesManager.reset() - ServiceLocator.setStores(storesManager) - - // Trigger `viewDidLoad` - XCTAssertNotNil(tabBarController.view) - stores.updateDefaultStore(storeID: 134) - - // Simulate successful state resetting after logging out from push notification store switching - storesManager.whenReceivingAction(ofType: StatsActionV4.self) { action in - if case let .resetStoredStats(completion) = action { - completion() - } - } - storesManager.whenReceivingAction(ofType: OrderAction.self) { action in - if case let .resetStoredOrders(completion) = action { - completion() - } - } - storesManager.whenReceivingAction(ofType: ProductReviewAction.self) { action in - if case let .resetStoredProductReviews(completion) = action { - completion() - } - } - - assertThat(tabBarController.tabNavigationController(tab: .reviews, - - isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn)?.topViewController, - isAnInstanceOf: ReviewsViewController.self) - - // Action - // Send push notification in inactive state - let pushNotification = PushNotification(noteID: 1_234, kind: .comment, title: "", subtitle: "", message: "") - pushNotificationsManager.sendInactiveNotification(pushNotification) - - // Simulate that the network call returns a parcel - let receivedAction = try XCTUnwrap(storesManager.receivedActions.first as? ProductReviewAction) - guard case .retrieveProductReviewFromNote(_, let completion) = receivedAction else { - return XCTFail("Expected retrieveProductReviewFromNote action.") - } - completion(.success(ProductReviewFromNoteParcelFactory().parcel(metaSiteID: 606))) - - // Assert - waitUntil { - tabBarController.tabNavigationController(tab: .reviews, - isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn)?.viewControllers.count == 2 - } - - XCTAssertEqual(tabBarController.selectedIndex, WooTab.reviews.visibleIndex(isHubMenuFeatureFlagOn)) - - // A ReviewDetailsViewController should be pushed - assertThat(tabBarController.tabNavigationController(tab: .reviews, - - isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn)?.topViewController, - isAnInstanceOf: ReviewDetailsViewController.self) + XCTAssertEqual(selectedTabIndexBeforeSiteChange, WooTab.products.visibleIndex()) + XCTAssertEqual(selectedTabIndexAfterSiteChange, WooTab.myStore.visibleIndex()) } func test_when_receiving_product_image_upload_error_a_notice_is_enqueued() throws { @@ -401,7 +329,7 @@ final class MainTabBarControllerTests: XCTestCase { let productsNavigationController = try XCTUnwrap(tabBarController .tabNavigationController(tab: .products, - isHubMenuFeatureFlagOn: featureFlagService.isFeatureFlagEnabled(.hubMenu))) + isHubMenuFeatureFlagOn: true)) waitUntil { productsNavigationController.presentedViewController != nil } @@ -476,7 +404,7 @@ final class MainTabBarControllerTests: XCTestCase { let productsNavigationController = try XCTUnwrap(tabBarController .tabNavigationController(tab: .products, - isHubMenuFeatureFlagOn: featureFlagService.isFeatureFlagEnabled(.hubMenu))) + isHubMenuFeatureFlagOn: true)) waitUntil { productsNavigationController.presentedViewController != nil } @@ -522,7 +450,7 @@ final class MainTabBarControllerTests: XCTestCase { let productsNavigationController = try XCTUnwrap(tabBarController .tabNavigationController(tab: .products, - isHubMenuFeatureFlagOn: featureFlagService.isFeatureFlagEnabled(.hubMenu))) + isHubMenuFeatureFlagOn: true)) waitUntil { productsNavigationController.presentedViewController != nil } @@ -543,7 +471,7 @@ private extension MainTabBarController { } func tabNavigationController(tab: WooTab, isHubMenuFeatureFlagOn: Bool) -> UINavigationController? { - guard let navigationController = viewControllers?.compactMap({ $0 as? UINavigationController })[tab.visibleIndex(isHubMenuFeatureFlagOn)] else { + guard let navigationController = viewControllers?.compactMap({ $0 as? UINavigationController })[tab.visibleIndex()] else { XCTFail("Unexpected access to navigation controller at tab: \(tab)") return nil } From 962fe7e40fbd76a430dbbae8a453b61ce8a6db22 Mon Sep 17 00:00:00 2001 From: Gabriel Maldonado Date: Thu, 1 Sep 2022 00:32:52 +0200 Subject: [PATCH 15/74] Remove isHubMenuOn from MockFeatureFlagService init --- .../Mocks/MockFeatureFlagService.swift | 3 - .../MainTabBarControllerTests.swift | 76 +++++++++---------- .../Settings/SettingsViewModelTests.swift | 4 +- 3 files changed, 36 insertions(+), 47 deletions(-) diff --git a/WooCommerce/WooCommerceTests/Mocks/MockFeatureFlagService.swift b/WooCommerce/WooCommerceTests/Mocks/MockFeatureFlagService.swift index 35eb703544e..87b1b90c044 100644 --- a/WooCommerce/WooCommerceTests/Mocks/MockFeatureFlagService.swift +++ b/WooCommerce/WooCommerceTests/Mocks/MockFeatureFlagService.swift @@ -3,7 +3,6 @@ import Experiments struct MockFeatureFlagService: FeatureFlagService { private let isJetpackConnectionPackageSupportOn: Bool - private let isHubMenuOn: Bool private let isInboxOn: Bool private let isSplitViewInOrdersTabOn: Bool private let isUpdateOrderOptimisticallyOn: Bool @@ -13,7 +12,6 @@ struct MockFeatureFlagService: FeatureFlagService { private let isLoginPrologueOnboardingEnabled: Bool init(isJetpackConnectionPackageSupportOn: Bool = false, - isHubMenuOn: Bool = false, isInboxOn: Bool = false, isSplitViewInOrdersTabOn: Bool = false, isUpdateOrderOptimisticallyOn: Bool = false, @@ -22,7 +20,6 @@ struct MockFeatureFlagService: FeatureFlagService { isBackgroundImageUploadEnabled: Bool = false, isLoginPrologueOnboardingEnabled: Bool = false) { self.isJetpackConnectionPackageSupportOn = isJetpackConnectionPackageSupportOn - self.isHubMenuOn = isHubMenuOn self.isInboxOn = isInboxOn self.isSplitViewInOrdersTabOn = isSplitViewInOrdersTabOn self.isUpdateOrderOptimisticallyOn = isUpdateOrderOptimisticallyOn diff --git a/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift index 76901da0157..f9341193ba0 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift @@ -42,8 +42,7 @@ final class MainTabBarControllerTests: XCTestCase { // Arrange // Sets mock `FeatureFlagService` before `MainTabBarController` is initialized so that the feature flags are set correctly. - let isHubMenuFeatureFlagOn = false - let featureFlagService = MockFeatureFlagService(isHubMenuOn: isHubMenuFeatureFlagOn) + let featureFlagService = MockFeatureFlagService() guard let tabBarController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController(creator: { coder in return MainTabBarController(coder: coder, featureFlagService: featureFlagService) }) else { @@ -59,21 +58,20 @@ final class MainTabBarControllerTests: XCTestCase { // Assert XCTAssertEqual(tabBarController.viewControllers?.count, 4) - assertThat(tabBarController.tabNavigationController(tab: .myStore, isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn)?.topViewController, + assertThat(tabBarController.tabNavigationController(tab: .myStore)?.topViewController, isAnInstanceOf: DashboardViewController.self) - assertThat(tabBarController.tabNavigationController(tab: .orders, isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn)?.topViewController, + assertThat(tabBarController.tabNavigationController(tab: .orders)?.topViewController, isAnInstanceOf: OrdersRootViewController.self) - assertThat(tabBarController.tabNavigationController(tab: .products, isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn)?.topViewController, + assertThat(tabBarController.tabNavigationController(tab: .products)?.topViewController, isAnInstanceOf: ProductsViewController.self) - assertThat(tabBarController.tabNavigationController(tab: .hubMenu, isHubMenuFeatureFlagOn: true)?.topViewController, + assertThat(tabBarController.tabNavigationController(tab: .hubMenu)?.topViewController, isAnInstanceOf: HubMenuViewController.self) } func test_tab_view_controllers_returns_expected_values_with_hub_menu_enabled() { // Arrange // Sets mock `FeatureFlagService` before `MainTabBarController` is initialized so that the feature flags are set correctly. - let isHubMenuFeatureFlagOn = true - let featureFlagService = MockFeatureFlagService(isHubMenuOn: isHubMenuFeatureFlagOn) + let featureFlagService = MockFeatureFlagService() guard let tabBarController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController(creator: { coder in return MainTabBarController(coder: coder, featureFlagService: featureFlagService) }) else { @@ -89,13 +87,13 @@ final class MainTabBarControllerTests: XCTestCase { // Assert XCTAssertEqual(tabBarController.viewControllers?.count, 4) - assertThat(tabBarController.tabNavigationController(tab: .myStore, isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn)?.topViewController, + assertThat(tabBarController.tabNavigationController(tab: .myStore)?.topViewController, isAnInstanceOf: DashboardViewController.self) - assertThat(tabBarController.tabNavigationController(tab: .orders, isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn)?.topViewController, + assertThat(tabBarController.tabNavigationController(tab: .orders)?.topViewController, isAnInstanceOf: OrdersRootViewController.self) - assertThat(tabBarController.tabNavigationController(tab: .products, isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn)?.topViewController, + assertThat(tabBarController.tabNavigationController(tab: .products)?.topViewController, isAnInstanceOf: ProductsViewController.self) - assertThat(tabBarController.tabNavigationController(tab: .hubMenu, isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn)?.topViewController, + assertThat(tabBarController.tabNavigationController(tab: .hubMenu)?.topViewController, isAnInstanceOf: HubMenuViewController.self) } @@ -103,8 +101,7 @@ final class MainTabBarControllerTests: XCTestCase { // Arrange // Sets mock `FeatureFlagService` before `MainTabBarController` is initialized so that the feature flags are set correctly. let isSplitViewInOrdersTabOn = true - let isHubMenuFeatureFlagOn = true - let featureFlagService = MockFeatureFlagService(isHubMenuOn: isHubMenuFeatureFlagOn, isSplitViewInOrdersTabOn: isSplitViewInOrdersTabOn) + let featureFlagService = MockFeatureFlagService(isSplitViewInOrdersTabOn: isSplitViewInOrdersTabOn) guard let tabBarController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController(creator: { coder in return MainTabBarController(coder: coder, featureFlagService: featureFlagService) @@ -121,19 +118,19 @@ final class MainTabBarControllerTests: XCTestCase { // Assert XCTAssertEqual(tabBarController.viewControllers?.count, 4) - assertThat(tabBarController.tabNavigationController(tab: .myStore, isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn)?.topViewController, + assertThat(tabBarController.tabNavigationController(tab: .myStore)?.topViewController, isAnInstanceOf: DashboardViewController.self) - assertThat(tabBarController.tabNavigationController(tab: .orders, isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn)?.topViewController, + assertThat(tabBarController.tabNavigationController(tab: .orders)?.topViewController, isAnInstanceOf: OrdersSplitViewWrapperController.self) - assertThat(tabBarController.tabNavigationController(tab: .products, isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn)?.topViewController, + assertThat(tabBarController.tabNavigationController(tab: .products)?.topViewController, isAnInstanceOf: ProductsViewController.self) - assertThat(tabBarController.tabNavigationController(tab: .hubMenu, isHubMenuFeatureFlagOn: isHubMenuFeatureFlagOn)?.topViewController, + assertThat(tabBarController.tabNavigationController(tab: .hubMenu)?.topViewController, isAnInstanceOf: HubMenuViewController.self) } func test_tab_root_viewControllers_are_replaced_after_updating_to_a_different_site() throws { // Arrange - ServiceLocator.setFeatureFlagService(MockFeatureFlagService(isHubMenuOn: true)) + ServiceLocator.setFeatureFlagService(MockFeatureFlagService()) guard let tabBarController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as? MainTabBarController else { return } @@ -181,8 +178,7 @@ final class MainTabBarControllerTests: XCTestCase { func test_selected_tab_is_dashboard_after_navigating_to_products_tab_then_updating_to_a_different_site() throws { // Arrange - let isHubMenuFeatureFlagOn = false - ServiceLocator.setFeatureFlagService(MockFeatureFlagService(isHubMenuOn: isHubMenuFeatureFlagOn)) + ServiceLocator.setFeatureFlagService(MockFeatureFlagService()) guard let tabBarController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as? MainTabBarController else { return } @@ -327,16 +323,15 @@ final class MainTabBarControllerTests: XCTestCase { let notice = try XCTUnwrap(noticePresenter.queuedNotices.first) notice.actionHandler?() - let productsNavigationController = try XCTUnwrap(tabBarController - .tabNavigationController(tab: .products, - isHubMenuFeatureFlagOn: true)) - waitUntil { - productsNavigationController.presentedViewController != nil - } +// let productsNavigationController = try XCTUnwrap(tabBarController +// .tabNavigationController(tab: .products) +// waitUntil { +// productsNavigationController.presentedViewController != nil +// } // Then - let productNavigationController = try XCTUnwrap(productsNavigationController.presentedViewController as? UINavigationController) - assertThat(productNavigationController.topViewController, isAnInstanceOf: ProductLoaderViewController.self) + //let productNavigationController = try XCTUnwrap(productsNavigationController.presentedViewController as? UINavigationController) + //assertThat(productNavigationController.topViewController, isAnInstanceOf: ProductLoaderViewController.self) } func test_when_receiving_product_image_upload_error_with_feature_flag_off_a_notice_is_not_enqueued() throws { @@ -402,12 +397,11 @@ final class MainTabBarControllerTests: XCTestCase { let notice = try XCTUnwrap(noticePresenter.queuedNotices.first) notice.actionHandler?() - let productsNavigationController = try XCTUnwrap(tabBarController - .tabNavigationController(tab: .products, - isHubMenuFeatureFlagOn: true)) - waitUntil { - productsNavigationController.presentedViewController != nil - } +// let productsNavigationController = try XCTUnwrap(tabBarController +// .tabNavigationController(tab: .products) +// waitUntil { +// productsNavigationController.presentedViewController != nil +// } // Then assertEqual([ @@ -448,12 +442,10 @@ final class MainTabBarControllerTests: XCTestCase { let notice = try XCTUnwrap(noticePresenter.queuedNotices.first) notice.actionHandler?() - let productsNavigationController = try XCTUnwrap(tabBarController - .tabNavigationController(tab: .products, - isHubMenuFeatureFlagOn: true)) - waitUntil { - productsNavigationController.presentedViewController != nil - } +// let productsNavigationController = try XCTUnwrap(tabBarController.tabNavigationController(tab: .products) +// waitUntil { +// productsNavigationController.presentedViewController != nil +// } // Then assertEqual([ @@ -470,7 +462,7 @@ private extension MainTabBarController { viewControllers?.compactMap { $0 as? UINavigationController }.compactMap { $0.viewControllers.first } ?? [] } - func tabNavigationController(tab: WooTab, isHubMenuFeatureFlagOn: Bool) -> UINavigationController? { + func tabNavigationController(tab: WooTab) -> UINavigationController? { guard let navigationController = viewControllers?.compactMap({ $0 as? UINavigationController })[tab.visibleIndex()] else { XCTFail("Unexpected access to navigation controller at tab: \(tab)") return nil diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Settings/SettingsViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Settings/SettingsViewModelTests.swift index 17653cb7219..b15f1f6ef9e 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Settings/SettingsViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Settings/SettingsViewModelTests.swift @@ -50,7 +50,7 @@ final class SettingsViewModelTests: XCTestCase { func test_selectedStoreSection_is_hidden_if_hub_menu_feature_flag_is_on() { // Given - let featureFlagService = MockFeatureFlagService(isHubMenuOn: true) + let featureFlagService = MockFeatureFlagService() let viewModel = SettingsViewModel(stores: stores, storageManager: storageManager, featureFlagService: featureFlagService, @@ -65,7 +65,7 @@ final class SettingsViewModelTests: XCTestCase { func test_selectedStoreSection_is_shown_if_hub_menu_feature_flag_is_off() { // Given - let featureFlagService = MockFeatureFlagService(isHubMenuOn: false) + let featureFlagService = MockFeatureFlagService() let viewModel = SettingsViewModel(stores: stores, storageManager: storageManager, featureFlagService: featureFlagService, From 85fd3f00ff271a1700e4854f9b40548b8ee6baaf Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Thu, 1 Sep 2022 10:59:16 +1000 Subject: [PATCH 16/74] Restore widgets bundle id in Enterprise `match` call This reverts commit 30d3b54df89f80563e348649c2ed34075710545c. The issue that was preventing us from accessing the Enterprise account to provision the Application Identifier for the new extension has been solved. I run the automation to update the Enterprise app code signing separately. CI should now be able to archive the app. --- fastlane/Fastfile | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 32b279daaf2..1dd2690de96 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -38,14 +38,7 @@ ALPHA_VERSION_BUNDLE_IDENTIFIER = 'com.automattic.alpha.woocommerce' # Registered in our Enterprise account, for App Center / Installable Builds ALPHA_BUNDLE_IDENTIFIERS = [ ALPHA_VERSION_BUNDLE_IDENTIFIER, - # This is part of the project but currently disabled because of issues - # accessing the Enterprise account and creating the app id. - # - # Such a setup is no good long term but we're obviously working to sort it - # out. In the short term, not including this bundle id might work, or it - # might break the build later on when code sign happens but can't find the - # provisioning profile. We'll soon find out... - # "#{ALPHA_VERSION_BUNDLE_IDENTIFIER}.storewidgets" + "#{ALPHA_VERSION_BUNDLE_IDENTIFIER}.storewidgets" ].freeze TEST_SCHEME = 'WooCommerce' From d19198482c2811c2c223617529866f8743fa5bc9 Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Thu, 1 Sep 2022 11:21:16 +1000 Subject: [PATCH 17/74] Update StoreWidgets configuration to work with `match` --- WooCommerce/WooCommerce.xcodeproj/project.pbxproj | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index 1bd9f47e48b..b1cae3742ec 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -10940,7 +10940,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = PZYM8XX95Q; GENERATE_INFOPLIST_FILE = YES; @@ -10957,6 +10957,7 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.automattic.woocommerce.storewidgets; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "match AppStore com.automattic.woocommerce.storewidgets"; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; @@ -10972,7 +10973,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 99KV9Z6BKV; GENERATE_INFOPLIST_FILE = YES; @@ -10987,8 +10988,9 @@ ); MARKETING_VERSION = 1.0; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.automattic.woocommerce.storewidgets; + PRODUCT_BUNDLE_IDENTIFIER = com.automattic.alpha.woocommerce.storewidgets; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "match InHouse com.automattic.alpha.woocommerce.storewidgets"; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; From c6751a893ad35a4872054606dcae34f758a174b1 Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Thu, 1 Sep 2022 13:55:08 +1000 Subject: [PATCH 18/74] Update `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` setting in WooCommerce Xcode set it to `YES` when creating the Widgets Extension target in bfebd4c48cb473619bac8a9460cc9308aec6657c, but we need to account for our CocoaPods setup which already takes care of it. To verify this, run `bundle exec pod install` from this commit and in the previous one. You'll notice the previous logs the following warning: ``` [!] The `WooCommerce [Debug]` target overrides the `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` build setting defined in `../Pods/Target Support Files/Pods-WooCommerce/Pods-WooCommerce.debug.xcconfig'. This can lead to problems with the CocoaPods installation - Use the `$(inherited)` flag, or - Remove the build settings from the target. [!] The `WooCommerce [Release]` target overrides the `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` build setting defined in `../Pods/Target Support Files/Pods-WooCommerce/Pods-WooCommerce.release.xcconfig'. This can lead to problems with the CocoaPods installation - Use the `$(inherited)` flag, or - Remove the build settings from the target. [!] The `WooCommerce [Release-Alpha]` target overrides the `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` build setting defined in `../Pods/Target Support Files/Pods-WooCommerce/Pods-WooCommerce.release-alpha.xcconfig'. This can lead to problems with the CocoaPods installation - Use the `$(inherited)` flag, or - Remove the build settings from the target. ``` Also notice that the final computed value for the build setting in the Xcode UI remains "Yes". --- WooCommerce/WooCommerce.xcodeproj/project.pbxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index b1cae3742ec..b573466d582 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -10840,7 +10840,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 25D00C97936D2C6589F8ECE9 /* Pods-WooCommerce.release-alpha.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = "Resources/Woo-Alpha.entitlements"; "CODE_SIGN_ENTITLEMENTS[sdk=macosx*]" = "Resources/Woo-Alpha-macOS.entitlements"; @@ -11248,7 +11248,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 90AC1C0B391E04A837BDC64E /* Pods-WooCommerce.debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = "Resources/Woo-Debug.entitlements"; "CODE_SIGN_ENTITLEMENTS[sdk=macosx*]" = "Resources/Woo-Debug-macOS.entitlements"; @@ -11280,7 +11280,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 33035144757869DE5E4DC88A /* Pods-WooCommerce.release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = "Resources/Woo-Release.entitlements"; "CODE_SIGN_ENTITLEMENTS[sdk=macosx*]" = "Resources/Woo-Release-macOS.entitlements"; From 7c3bf183a0c0f55d862b906b50d0aae8d09bb1b5 Mon Sep 17 00:00:00 2001 From: Gabriel Maldonado Date: Thu, 1 Sep 2022 08:45:30 +0200 Subject: [PATCH 19/74] Typo: Fix failing Unit Tests --- .../MainTabBarControllerTests.swift | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift index f9341193ba0..0d308c2782b 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift @@ -323,15 +323,14 @@ final class MainTabBarControllerTests: XCTestCase { let notice = try XCTUnwrap(noticePresenter.queuedNotices.first) notice.actionHandler?() -// let productsNavigationController = try XCTUnwrap(tabBarController -// .tabNavigationController(tab: .products) -// waitUntil { -// productsNavigationController.presentedViewController != nil -// } + let productsNavigationController = try XCTUnwrap(tabBarController.tabNavigationController(tab: .products)) + waitUntil { + productsNavigationController.presentedViewController != nil + } // Then - //let productNavigationController = try XCTUnwrap(productsNavigationController.presentedViewController as? UINavigationController) - //assertThat(productNavigationController.topViewController, isAnInstanceOf: ProductLoaderViewController.self) + let productNavigationController = try XCTUnwrap(productsNavigationController.presentedViewController as? UINavigationController) + assertThat(productNavigationController.topViewController, isAnInstanceOf: ProductLoaderViewController.self) } func test_when_receiving_product_image_upload_error_with_feature_flag_off_a_notice_is_not_enqueued() throws { @@ -397,11 +396,10 @@ final class MainTabBarControllerTests: XCTestCase { let notice = try XCTUnwrap(noticePresenter.queuedNotices.first) notice.actionHandler?() -// let productsNavigationController = try XCTUnwrap(tabBarController -// .tabNavigationController(tab: .products) -// waitUntil { -// productsNavigationController.presentedViewController != nil -// } + let productsNavigationController = try XCTUnwrap(tabBarController.tabNavigationController(tab: .products)) + waitUntil { + productsNavigationController.presentedViewController != nil + } // Then assertEqual([ @@ -442,10 +440,11 @@ final class MainTabBarControllerTests: XCTestCase { let notice = try XCTUnwrap(noticePresenter.queuedNotices.first) notice.actionHandler?() -// let productsNavigationController = try XCTUnwrap(tabBarController.tabNavigationController(tab: .products) -// waitUntil { -// productsNavigationController.presentedViewController != nil -// } + let productsNavigationController = try XCTUnwrap(tabBarController + .tabNavigationController(tab: .products)) + waitUntil { + productsNavigationController.presentedViewController != nil + } // Then assertEqual([ From fa8f249da76760b4a7d018f30e672f1786bfe758 Mon Sep 17 00:00:00 2001 From: Gabriel Maldonado Date: Thu, 1 Sep 2022 08:56:40 +0200 Subject: [PATCH 20/74] Remove hubMenu feature flag unit tests --- .../Settings/SettingsViewModelTests.swift | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Settings/SettingsViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Settings/SettingsViewModelTests.swift index b15f1f6ef9e..d6f962ba043 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Settings/SettingsViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Settings/SettingsViewModelTests.swift @@ -48,36 +48,6 @@ final class SettingsViewModelTests: XCTestCase { XCTAssertTrue(viewModel.sections.count > 0) } - func test_selectedStoreSection_is_hidden_if_hub_menu_feature_flag_is_on() { - // Given - let featureFlagService = MockFeatureFlagService() - let viewModel = SettingsViewModel(stores: stores, - storageManager: storageManager, - featureFlagService: featureFlagService, - appleIDCredentialChecker: appleIDCredentialChecker) - - // When - viewModel.onViewDidLoad() - - // Then - XCTAssertFalse(viewModel.sections.contains { $0.rows.contains(SettingsViewController.Row.selectedStore) }) - } - - func test_selectedStoreSection_is_shown_if_hub_menu_feature_flag_is_off() { - // Given - let featureFlagService = MockFeatureFlagService() - let viewModel = SettingsViewModel(stores: stores, - storageManager: storageManager, - featureFlagService: featureFlagService, - appleIDCredentialChecker: appleIDCredentialChecker) - - // When - viewModel.onViewDidLoad() - - // Then - XCTAssertTrue(viewModel.sections.contains { $0.rows.contains(.selectedStore) }) - } - func test_sections_contain_install_jetpack_row_when_JCP_support_feature_flag_is_on_and_default_site_is_jcp() { // Given let featureFlagService = MockFeatureFlagService(isJetpackConnectionPackageSupportOn: true) From 01c5673b1f45c08f8e7d6f2f0703a4fa48862828 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Thu, 1 Sep 2022 11:09:28 +0200 Subject: [PATCH 21/74] Add navigation controller item and title. WIP --- .../InPersonPaymentsMenuViewController.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewController.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewController.swift index e1ad50db727..136748407e6 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewController.swift @@ -59,6 +59,9 @@ final class InPersonPaymentsMenuViewController: UIViewController { configureTableView() registerTableViewCells() runCardPresentPaymentsOnboarding() + + navigationController?.setNavigationBarHidden(false, animated: true) + navigationItem.title = "In-Person Payments" } } From 0d286b344ed5ff49b88d375c1b8b382f3cda0cc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Thu, 1 Sep 2022 13:08:20 +0200 Subject: [PATCH 22/74] Move navigation bar setup to its own method --- .../InPersonPaymentsMenuViewController.swift | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewController.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewController.swift index 136748407e6..d168ff3a941 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewController.swift @@ -55,13 +55,11 @@ final class InPersonPaymentsMenuViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + setupNavigationBar() configureSections() configureTableView() registerTableViewCells() runCardPresentPaymentsOnboarding() - - navigationController?.setNavigationBarHidden(false, animated: true) - navigationItem.title = "In-Person Payments" } } @@ -141,6 +139,11 @@ private extension InPersonPaymentsMenuViewController { // MARK: - View configuration // private extension InPersonPaymentsMenuViewController { + func setupNavigationBar() { + navigationController?.setNavigationBarHidden(false, animated: true) + navigationItem.title = InPersonPaymentsView.Localization.title + } + func configureSections() { sections = [ actionsSection, From e203fefe261f7703d4c5a6c87711eac8c7f1ddb9 Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 1 Sep 2022 12:30:45 +0100 Subject: [PATCH 23/74] 7628 Add source to enable_cash_on_delivery_* event --- .../Classes/Analytics/WooAnalyticsEvent.swift | 17 +++++++++++++---- ...eliveryPaymentGatewayNotSetUpViewModel.swift | 6 ++++-- ...ryPaymentGatewayNotSetUpViewModelTests.swift | 3 +++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift b/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift index e2f23f0433b..ae5bd54c1d7 100644 --- a/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift +++ b/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift @@ -751,6 +751,7 @@ extension WooAnalyticsEvent { static let errorDescription = "error_description" static let paymentMethodType = "payment_method_type" static let softwareUpdateType = "software_update_type" + static let source = "source" } static let unknownGatewayID = "unknown" @@ -1189,15 +1190,21 @@ extension WooAnalyticsEvent { ]) } + enum CashOnDeliverySource: String { + case onboarding + case paymentsHub = "payments_hub" + } + /// Tracked when the Cash on Delivery Payment Gateway is successfully enabled, e.g. from the IPP onboarding flow. /// /// - Parameters: /// - countryCode: the country code of the store. /// - static func enableCashOnDeliverySuccess(countryCode: String) -> WooAnalyticsEvent { + static func enableCashOnDeliverySuccess(countryCode: String, source: CashOnDeliverySource) -> WooAnalyticsEvent { WooAnalyticsEvent(statName: .enableCashOnDeliverySuccess, properties: [ - Keys.countryCode: countryCode + Keys.countryCode: countryCode, + Keys.source: source.rawValue ]) } @@ -1207,10 +1214,12 @@ extension WooAnalyticsEvent { /// - countryCode: the country code of the store. /// static func enableCashOnDeliveryFailed(countryCode: String, - error: Error?) -> WooAnalyticsEvent { + error: Error?, + source: CashOnDeliverySource) -> WooAnalyticsEvent { WooAnalyticsEvent(statName: .enableCashOnDeliveryFailed, properties: [ - Keys.countryCode: countryCode + Keys.countryCode: countryCode, + Keys.source: source.rawValue ], error: error) } diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel.swift index 3e58fd75117..47eb842f326 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel.swift @@ -131,13 +131,15 @@ extension InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel { } private func trackEnableCashOnDeliverySuccess() { - let event = Event.enableCashOnDeliverySuccess(countryCode: cardPresentPaymentsConfiguration.countryCode) + let event = Event.enableCashOnDeliverySuccess(countryCode: cardPresentPaymentsConfiguration.countryCode, + source: .onboarding) analytics.track(event: event) } private func trackEnableCashOnDeliveryFailed(error: Error?) { let event = Event.enableCashOnDeliveryFailed(countryCode: cardPresentPaymentsConfiguration.countryCode, - error: error) + error: error, + source: .onboarding) analytics.track(event: event) } } diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests.swift index ba35455b385..00894d96331 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests.swift @@ -189,6 +189,7 @@ final class InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests: let indexOfEvent = try XCTUnwrap(analyticsProvider.receivedEvents.firstIndex(where: { $0 == AnalyticEvents.enableCashOnDeliverySuccess })) let eventProperties = try XCTUnwrap(analyticsProvider.receivedProperties[indexOfEvent]) assertEqual("US", eventProperties[AnalyticProperties.countryCodeKey] as? String) + assertEqual("onboarding", eventProperties[AnalyticProperties.sourceKey] as? String) } func test_enable_failure_logs_enable_failure_event() throws { @@ -211,6 +212,7 @@ final class InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests: let eventProperties = try XCTUnwrap(analyticsProvider.receivedProperties[indexOfEvent]) assertEqual("US", eventProperties[AnalyticProperties.countryCodeKey] as? String) assertEqual("Dotcom Invalid REST Route", eventProperties[AnalyticProperties.errorDescriptionKey] as? String) + assertEqual("onboarding", eventProperties[AnalyticProperties.sourceKey] as? String) } } @@ -227,4 +229,5 @@ private enum AnalyticProperties { static let remindLaterKey = "remind_later" static let countryCodeKey = "country" static let errorDescriptionKey = "error_description" + static let sourceKey = "source" } From 41f2cb2ec7f8f9774af39c7ae2a6cc733482989f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Thu, 1 Sep 2022 14:28:28 +0200 Subject: [PATCH 24/74] Add comment --- WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift b/WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift index 56813d70e58..cb5166efe3b 100644 --- a/WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift +++ b/WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift @@ -1,5 +1,7 @@ import Foundation +/// Links an URL with a /payments path to the Payments Hub Menu +/// struct PaymentsRoute: Route { let path = "/payments" From 990e090c349181c223274ff3ce94784e13bd3fa8 Mon Sep 17 00:00:00 2001 From: Ernesto Carrion Date: Thu, 25 Aug 2022 17:28:46 -0500 Subject: [PATCH 25/74] Add basic template for store info widget --- .../AppIcon.appiconset/Contents.json | 5 + WooCommerce/StoreWidgets/StoreWidgets.swift | 112 ++++++++++++++++++ 2 files changed, 117 insertions(+) diff --git a/WooCommerce/StoreWidgets/Assets.xcassets/AppIcon.appiconset/Contents.json b/WooCommerce/StoreWidgets/Assets.xcassets/AppIcon.appiconset/Contents.json index 5a3257a7d00..9221b9bb1a3 100644 --- a/WooCommerce/StoreWidgets/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/WooCommerce/StoreWidgets/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -70,6 +70,11 @@ "scale" : "2x", "size" : "40x40" }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, { "idiom" : "ipad", "scale" : "2x", diff --git a/WooCommerce/StoreWidgets/StoreWidgets.swift b/WooCommerce/StoreWidgets/StoreWidgets.swift index 10fa6230a56..347b8a4a814 100644 --- a/WooCommerce/StoreWidgets/StoreWidgets.swift +++ b/WooCommerce/StoreWidgets/StoreWidgets.swift @@ -42,6 +42,14 @@ struct StoreWidgetsEntryView: View { } @main +struct StoreWidgetsBundle: WidgetBundle { + var body: some Widget { + StoreWidgets() + StoreInfoWidget() + } +} + + struct StoreWidgets: Widget { let kind: String = "StoreWidgets" @@ -54,9 +62,113 @@ struct StoreWidgets: Widget { } } + +struct StoreInfoEntry: TimelineEntry { + var date: Date + var range: String + var name: String + var revenue: String + var visitors: String + var orders: String + var conversion: String +} + +struct StoreInfoProvider: TimelineProvider { + func placeholder(in context: Context) -> StoreInfoEntry { + StoreInfoEntry(date: .now, + range: "Today", + name: "Ernest Shop", + revenue: "$132.234", + visitors: "67", + orders: "23", + conversion: "37%") + } + + func getSnapshot(in context: Context, completion: @escaping (StoreInfoEntry) -> Void) { + completion(StoreInfoEntry(date: .now, + range: "Today", + name: "Ernest Shop", + revenue: "$132.234", + visitors: "67", + orders: "23", + conversion: "37%")) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline) -> Void) { + print("Get Timeline called") + } +} + +struct StoreInfoView: View { + let entry: StoreInfoEntry + + var body: some View { + VStack(spacing: 8) { + HStack { + Text(entry.name) + Spacer() + Text(entry.range) + } + + HStack() { + VStack(alignment: .leading, spacing: 2) { + Text("Revenue") + Text(entry.revenue) + } + .frame(maxWidth: .infinity, alignment: .leading) + + VStack(alignment: .leading, spacing: 2) { + Text("Visitors") + Text(entry.visitors) + } + .frame(maxWidth: .infinity, alignment: .leading) + + } + + HStack { + VStack(alignment: .leading, spacing: 2) { + Text("Orders") + Text(entry.orders) + + } + .frame(maxWidth: .infinity, alignment: .leading) + + VStack(alignment: .leading, spacing: 2) { + Text("Conversion") + Text(entry.conversion) + } + .frame(maxWidth: .infinity, alignment: .leading) + + } + } + .padding(.horizontal, 16) + } +} + +struct StoreInfoWidget: Widget { + var body: some WidgetConfiguration { + StaticConfiguration(kind: "StoreInfoWidget", provider: StoreInfoProvider()) { entry in + StoreInfoView(entry: entry) + } + .configurationDisplayName("Store Info") + .supportedFamilies([.systemMedium]) + } +} + struct StoreWidgets_Previews: PreviewProvider { static var previews: some View { StoreWidgetsEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent())) .previewContext(WidgetPreviewContext(family: .systemSmall)) + + StoreInfoView( + entry: StoreInfoEntry(date: .now, + range: "Today", + name: "Ernest Shop", + revenue: "$132.234", + visitors: "67", + orders: "23", + conversion: "37%") + ) + .previewContext(WidgetPreviewContext(family: .systemMedium)) } } From 1ed8bbd3eedcea974559e4c46e78111f1f471d9f Mon Sep 17 00:00:00 2001 From: Ernesto Carrion Date: Fri, 26 Aug 2022 22:35:18 -0500 Subject: [PATCH 26/74] Add StoreWidget info types --- .../StoreWidgets/StoreInfoProvider.swift | 77 ++++++++ .../StoreWidgets/StoreInfoWidget.swift | 121 +++++++++++++ WooCommerce/StoreWidgets/StoreWidgets.swift | 168 +----------------- .../WooCommerce.xcodeproj/project.pbxproj | 8 + 4 files changed, 209 insertions(+), 165 deletions(-) create mode 100644 WooCommerce/StoreWidgets/StoreInfoProvider.swift create mode 100644 WooCommerce/StoreWidgets/StoreInfoWidget.swift diff --git a/WooCommerce/StoreWidgets/StoreInfoProvider.swift b/WooCommerce/StoreWidgets/StoreInfoProvider.swift new file mode 100644 index 00000000000..f5ee1e0ab23 --- /dev/null +++ b/WooCommerce/StoreWidgets/StoreInfoProvider.swift @@ -0,0 +1,77 @@ +import WidgetKit + +/// Type that represents the Widget information +/// +struct StoreInfoEntry: TimelineEntry { + /// Date to request new info + /// + var date: Date + + /// Eg: Today, Weekly, Monthly, Yearly + /// + var range: String + + /// Store name + /// + var name: String + + /// Revenue at the range (eg: today) + /// + var revenue: String + + /// Visitors count at the range (eg: today) + /// + var visitors: String + + /// Order count at the range (eg: today) + /// + var orders: String + + /// Conversion at the range (eg: today) + /// + var conversion: String +} + +/// Type that provides data entries to the widget system. +/// +struct StoreInfoProvider: TimelineProvider { + /// Redacted entry with sample data. + /// + func placeholder(in context: Context) -> StoreInfoEntry { + StoreInfoEntry(date: Date(), + range: "Today", + name: "Ernest Shop", + revenue: "$132.234", + visitors: "67", + orders: "23", + conversion: "37%") + } + + /// Quick Snapshot. Required when previewing the widget. + /// TODO: Update with real data. + /// + func getSnapshot(in context: Context, completion: @escaping (StoreInfoEntry) -> Void) { + completion(StoreInfoEntry(date: Date(), + range: "Today", + name: "Ernest Shop", + revenue: "$132.234", + visitors: "67", + orders: "23", + conversion: "37%")) + } + + /// Real data widget. + /// TODO: Update with real data. + /// + func getTimeline(in context: Context, completion: @escaping (Timeline) -> Void) { + let entry = StoreInfoEntry(date: Date(), + range: "Today", + name: "Ernest Shop", + revenue: "$132.234", + visitors: "67", + orders: "23", + conversion: "37%") + let timeline = Timeline(entries: [entry], policy: .never) + completion(timeline) + } +} diff --git a/WooCommerce/StoreWidgets/StoreInfoWidget.swift b/WooCommerce/StoreWidgets/StoreInfoWidget.swift new file mode 100644 index 00000000000..c128352436e --- /dev/null +++ b/WooCommerce/StoreWidgets/StoreInfoWidget.swift @@ -0,0 +1,121 @@ +import WidgetKit +import SwiftUI +import WooFoundation + +/// Main StoreInfo Widget type. +/// +struct StoreInfoWidget: Widget { + var body: some WidgetConfiguration { + StaticConfiguration(kind: "StoreInfoWidget", provider: StoreInfoProvider()) { entry in + StoreInfoView(entry: entry) + } + .configurationDisplayName("Store Info") + .supportedFamilies([.systemMedium]) + } +} + +/// StoreInfo Widget View +/// +struct StoreInfoView: View { + + // Entry to render + let entry: StoreInfoEntry + + var body: some View { + ZStack { + // Background + Color(.brand) + + VStack(spacing: 8) { + + // Store Name + HStack { + Text(entry.name) + .bold() + .font(.footnote) + .foregroundColor(Color(.textInverted)) + + Spacer() + + Text(entry.range) + .font(.caption) + .foregroundColor(Color(.lightText)) + } + + // Revenue & Visitors + HStack() { + VStack(alignment: .leading, spacing: 2) { + Text("Revenue") + .bold() + .font(.caption) + .foregroundColor(Color(.lightText)) + + Text(entry.revenue) + .foregroundColor(Color(.textInverted)) + .font(.title2) + } + .frame(maxWidth: .infinity, alignment: .leading) + + VStack(alignment: .leading, spacing: 2) { + Text("Visitors") + .bold() + .font(.caption) + .foregroundColor(Color(.lightText)) + + Text(entry.visitors) + .foregroundColor(Color(.textInverted)) + .font(.title2) + } + .frame(maxWidth: .infinity, alignment: .leading) + + } + + // Orders & Conversion + HStack { + VStack(alignment: .leading, spacing: 2) { + Text("Orders") + .bold() + .font(.caption) + .foregroundColor(Color(.lightText)) + + Text(entry.orders) + .foregroundColor(Color(.textInverted)) + .font(.title2) + } + .frame(maxWidth: .infinity, alignment: .leading) + + VStack(alignment: .leading, spacing: 2) { + Text("Conversion") + .bold() + .font(.caption) + .foregroundColor(Color(.lightText)) + + Text(entry.conversion) + .foregroundColor(Color(.textInverted)) + .font(.title2) + } + .frame(maxWidth: .infinity, alignment: .leading) + + } + } + .padding(.horizontal, 16) + } + } +} + +// MARK: Previews + +struct StoreWidgets_Previews: PreviewProvider { + static var previews: some View { + StoreInfoView( + entry: StoreInfoEntry(date: Date(), + range: "Today", + name: "Ernest Shop", + revenue: "$132.234", + visitors: "67", + orders: "23", + conversion: "37%") + ) + .previewContext(WidgetPreviewContext(family: .systemMedium)) + } +} diff --git a/WooCommerce/StoreWidgets/StoreWidgets.swift b/WooCommerce/StoreWidgets/StoreWidgets.swift index 347b8a4a814..95e9fce7962 100644 --- a/WooCommerce/StoreWidgets/StoreWidgets.swift +++ b/WooCommerce/StoreWidgets/StoreWidgets.swift @@ -1,174 +1,12 @@ import WidgetKit import SwiftUI -import Intents - -struct Provider: IntentTimelineProvider { - func placeholder(in context: Context) -> SimpleEntry { - SimpleEntry(date: Date(), configuration: ConfigurationIntent()) - } - - func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) { - let entry = SimpleEntry(date: Date(), configuration: configuration) - completion(entry) - } - - func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline) -> ()) { - var entries: [SimpleEntry] = [] - - // Generate a timeline consisting of five entries an hour apart, starting from the current date. - let currentDate = Date() - for hourOffset in 0 ..< 5 { - let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! - let entry = SimpleEntry(date: entryDate, configuration: configuration) - entries.append(entry) - } - - let timeline = Timeline(entries: entries, policy: .atEnd) - completion(timeline) - } -} - -struct SimpleEntry: TimelineEntry { - let date: Date - let configuration: ConfigurationIntent -} - -struct StoreWidgetsEntryView: View { - var entry: Provider.Entry - - var body: some View { - Text(entry.date, style: .time) - } -} +/// Entry point for the Widgets Extension +/// @main struct StoreWidgetsBundle: WidgetBundle { var body: some Widget { - StoreWidgets() + // Add here any widget you want to be available StoreInfoWidget() } } - - -struct StoreWidgets: Widget { - let kind: String = "StoreWidgets" - - var body: some WidgetConfiguration { - IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in - StoreWidgetsEntryView(entry: entry) - } - .configurationDisplayName("My Widget") - .description("This is an example widget.") - } -} - - -struct StoreInfoEntry: TimelineEntry { - var date: Date - var range: String - var name: String - var revenue: String - var visitors: String - var orders: String - var conversion: String -} - -struct StoreInfoProvider: TimelineProvider { - func placeholder(in context: Context) -> StoreInfoEntry { - StoreInfoEntry(date: .now, - range: "Today", - name: "Ernest Shop", - revenue: "$132.234", - visitors: "67", - orders: "23", - conversion: "37%") - } - - func getSnapshot(in context: Context, completion: @escaping (StoreInfoEntry) -> Void) { - completion(StoreInfoEntry(date: .now, - range: "Today", - name: "Ernest Shop", - revenue: "$132.234", - visitors: "67", - orders: "23", - conversion: "37%")) - } - - func getTimeline(in context: Context, completion: @escaping (Timeline) -> Void) { - print("Get Timeline called") - } -} - -struct StoreInfoView: View { - let entry: StoreInfoEntry - - var body: some View { - VStack(spacing: 8) { - HStack { - Text(entry.name) - Spacer() - Text(entry.range) - } - - HStack() { - VStack(alignment: .leading, spacing: 2) { - Text("Revenue") - Text(entry.revenue) - } - .frame(maxWidth: .infinity, alignment: .leading) - - VStack(alignment: .leading, spacing: 2) { - Text("Visitors") - Text(entry.visitors) - } - .frame(maxWidth: .infinity, alignment: .leading) - - } - - HStack { - VStack(alignment: .leading, spacing: 2) { - Text("Orders") - Text(entry.orders) - - } - .frame(maxWidth: .infinity, alignment: .leading) - - VStack(alignment: .leading, spacing: 2) { - Text("Conversion") - Text(entry.conversion) - } - .frame(maxWidth: .infinity, alignment: .leading) - - } - } - .padding(.horizontal, 16) - } -} - -struct StoreInfoWidget: Widget { - var body: some WidgetConfiguration { - StaticConfiguration(kind: "StoreInfoWidget", provider: StoreInfoProvider()) { entry in - StoreInfoView(entry: entry) - } - .configurationDisplayName("Store Info") - .supportedFamilies([.systemMedium]) - } -} - -struct StoreWidgets_Previews: PreviewProvider { - static var previews: some View { - StoreWidgetsEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent())) - .previewContext(WidgetPreviewContext(family: .systemSmall)) - - StoreInfoView( - entry: StoreInfoEntry(date: .now, - range: "Today", - name: "Ernest Shop", - revenue: "$132.234", - visitors: "67", - orders: "23", - conversion: "37%") - ) - .previewContext(WidgetPreviewContext(family: .systemMedium)) - } -} diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index b573466d582..0b7386e36fe 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -522,6 +522,8 @@ 26578C4126277AFF00A15097 /* OrderAddOnsListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26578C4026277AFF00A15097 /* OrderAddOnsListViewController.swift */; }; 265BCA0C2430E741004E53EE /* ProductCategoryTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 265BCA0B2430E741004E53EE /* ProductCategoryTableViewCell.swift */; }; 265BCA0E2430E771004E53EE /* ProductCategoryTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 265BCA0D2430E771004E53EE /* ProductCategoryTableViewCell.xib */; }; + 265C99E228B9BCD0005E6117 /* StoreInfoWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 265C99E028B9BA43005E6117 /* StoreInfoWidget.swift */; }; + 265C99E428B9C834005E6117 /* StoreInfoProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 265C99E328B9C834005E6117 /* StoreInfoProvider.swift */; }; 265D909D2446688C00D66F0F /* ProductCategoryViewModelBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 267CFE1824435A5500AF3A13 /* ProductCategoryViewModelBuilderTests.swift */; }; 2662D90626E1571900E25611 /* ListSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2662D90526E1571900E25611 /* ListSelector.swift */; }; 2662D90826E15D6E00E25611 /* CountrySelectorCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2662D90726E15D6E00E25611 /* CountrySelectorCommand.swift */; }; @@ -2385,6 +2387,8 @@ 26578C4026277AFF00A15097 /* OrderAddOnsListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderAddOnsListViewController.swift; sourceTree = ""; }; 265BCA0B2430E741004E53EE /* ProductCategoryTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductCategoryTableViewCell.swift; sourceTree = ""; }; 265BCA0D2430E771004E53EE /* ProductCategoryTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ProductCategoryTableViewCell.xib; sourceTree = ""; }; + 265C99E028B9BA43005E6117 /* StoreInfoWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInfoWidget.swift; sourceTree = ""; }; + 265C99E328B9C834005E6117 /* StoreInfoProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInfoProvider.swift; sourceTree = ""; }; 2662D90526E1571900E25611 /* ListSelector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListSelector.swift; sourceTree = ""; }; 2662D90726E15D6E00E25611 /* CountrySelectorCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountrySelectorCommand.swift; sourceTree = ""; }; 2662D90926E16B3600E25611 /* FilterListSelector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterListSelector.swift; sourceTree = ""; }; @@ -5267,6 +5271,8 @@ isa = PBXGroup; children = ( 3F1FA84528B60125009E246C /* StoreWidgets.swift */, + 265C99E028B9BA43005E6117 /* StoreInfoWidget.swift */, + 265C99E328B9C834005E6117 /* StoreInfoProvider.swift */, 3F1FA84728B60125009E246C /* StoreWidgets.intentdefinition */, 3F1FA84828B60126009E246C /* Assets.xcassets */, 3F1FA84A28B60126009E246C /* Info.plist */, @@ -9179,6 +9185,8 @@ buildActionMask = 2147483647; files = ( 3F1FA84B28B60126009E246C /* StoreWidgets.intentdefinition in Sources */, + 265C99E228B9BCD0005E6117 /* StoreInfoWidget.swift in Sources */, + 265C99E428B9C834005E6117 /* StoreInfoProvider.swift in Sources */, 3F1FA84628B60125009E246C /* StoreWidgets.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; From f6aaa16b8fb13f23afd3ce2b3d04b979fdf9932d Mon Sep 17 00:00:00 2001 From: Ernesto Carrion Date: Fri, 26 Aug 2022 22:47:36 -0500 Subject: [PATCH 27/74] Organize code --- .../StoreWidgets/StoreInfoWidget.swift | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/WooCommerce/StoreWidgets/StoreInfoWidget.swift b/WooCommerce/StoreWidgets/StoreInfoWidget.swift index c128352436e..02478b3408c 100644 --- a/WooCommerce/StoreWidgets/StoreInfoWidget.swift +++ b/WooCommerce/StoreWidgets/StoreInfoWidget.swift @@ -26,8 +26,7 @@ struct StoreInfoView: View { // Background Color(.brand) - VStack(spacing: 8) { - + VStack(spacing: Layout.sectionSpacing) { // Store Name HStack { Text(entry.name) @@ -44,8 +43,8 @@ struct StoreInfoView: View { // Revenue & Visitors HStack() { - VStack(alignment: .leading, spacing: 2) { - Text("Revenue") + VStack(alignment: .leading, spacing: Layout.cardSpacing) { + Text(Localization.revenue) .bold() .font(.caption) .foregroundColor(Color(.lightText)) @@ -56,8 +55,8 @@ struct StoreInfoView: View { } .frame(maxWidth: .infinity, alignment: .leading) - VStack(alignment: .leading, spacing: 2) { - Text("Visitors") + VStack(alignment: .leading, spacing: Layout.cardSpacing) { + Text(Localization.visitors) .bold() .font(.caption) .foregroundColor(Color(.lightText)) @@ -67,13 +66,12 @@ struct StoreInfoView: View { .font(.title2) } .frame(maxWidth: .infinity, alignment: .leading) - } // Orders & Conversion HStack { - VStack(alignment: .leading, spacing: 2) { - Text("Orders") + VStack(alignment: .leading, spacing: Layout.cardSpacing) { + Text(Localization.orders) .bold() .font(.caption) .foregroundColor(Color(.lightText)) @@ -84,8 +82,8 @@ struct StoreInfoView: View { } .frame(maxWidth: .infinity, alignment: .leading) - VStack(alignment: .leading, spacing: 2) { - Text("Conversion") + VStack(alignment: .leading, spacing: Layout.cardSpacing) { + Text(Localization.conversion) .bold() .font(.caption) .foregroundColor(Color(.lightText)) @@ -98,11 +96,27 @@ struct StoreInfoView: View { } } - .padding(.horizontal, 16) + .padding(.horizontal) } } } +/// Constants definition +/// +private extension StoreInfoView { + enum Localization { + static let revenue = NSLocalizedString("Revenue", comment: "Revenue title label for the store info widget") + static let visitors = NSLocalizedString("Visitors", comment: "Visitors title label for the store info widget") + static let orders = NSLocalizedString("Orders", comment: "Orders title label for the store info widget") + static let conversion = NSLocalizedString("Conversion", comment: "Conversion title label for the store info widget") + } + + enum Layout { + static let sectionSpacing = 8.0 + static let cardSpacing = 2.0 + } +} + // MARK: Previews struct StoreWidgets_Previews: PreviewProvider { From 31979023fdc15957e2f1f27e3c792950b34c8aa6 Mon Sep 17 00:00:00 2001 From: Ernesto Carrion Date: Fri, 26 Aug 2022 22:57:56 -0500 Subject: [PATCH 28/74] Create custom widgets styles --- .../StoreWidgets/StoreInfoViewModifiers.swift | 55 +++++++++++++++++++ .../StoreWidgets/StoreInfoWidget.swift | 36 ++++-------- .../WooCommerce.xcodeproj/project.pbxproj | 4 ++ 3 files changed, 70 insertions(+), 25 deletions(-) create mode 100644 WooCommerce/StoreWidgets/StoreInfoViewModifiers.swift diff --git a/WooCommerce/StoreWidgets/StoreInfoViewModifiers.swift b/WooCommerce/StoreWidgets/StoreInfoViewModifiers.swift new file mode 100644 index 00000000000..c7348b8a3c9 --- /dev/null +++ b/WooCommerce/StoreWidgets/StoreInfoViewModifiers.swift @@ -0,0 +1,55 @@ +import Foundation +import SwiftUI + +// MARK: StoreInfo widget view modifiers. + +public struct StoreNameStyle: ViewModifier { + public func body(content: Content) -> some View { + content + .font(.footnote.weight(.bold)) + .foregroundColor(Color(.textInverted)) + } +} + +public struct StatRangeStyle: ViewModifier { + public func body(content: Content) -> some View { + content + .font(.caption) + .foregroundColor(Color(.lightText)) + } +} + +public struct StatTitleStyle: ViewModifier { + public func body(content: Content) -> some View { + content + .font(.caption.bold()) + .foregroundColor(Color(.lightText)) + } +} + +public struct StatValueStyle: ViewModifier { + public func body(content: Content) -> some View { + content + .font(.title2) + .foregroundColor(Color(.textInverted)) + } +} + +// MARK: View Extensions. +extension View { + func storeNameStyle() -> some View { + self.modifier(StoreNameStyle()) + } + + func statRangeStyle() -> some View { + self.modifier(StatRangeStyle()) + } + + func statTitleStyle() -> some View { + self.modifier(StatTitleStyle()) + } + + func statValueStyle() -> some View { + self.modifier(StatValueStyle()) + } +} diff --git a/WooCommerce/StoreWidgets/StoreInfoWidget.swift b/WooCommerce/StoreWidgets/StoreInfoWidget.swift index 02478b3408c..a3ab76c6ee0 100644 --- a/WooCommerce/StoreWidgets/StoreInfoWidget.swift +++ b/WooCommerce/StoreWidgets/StoreInfoWidget.swift @@ -30,40 +30,32 @@ struct StoreInfoView: View { // Store Name HStack { Text(entry.name) - .bold() - .font(.footnote) - .foregroundColor(Color(.textInverted)) + .storeNameStyle() Spacer() Text(entry.range) - .font(.caption) - .foregroundColor(Color(.lightText)) + .statRangeStyle() } // Revenue & Visitors HStack() { VStack(alignment: .leading, spacing: Layout.cardSpacing) { Text(Localization.revenue) - .bold() - .font(.caption) - .foregroundColor(Color(.lightText)) + .statTitleStyle() Text(entry.revenue) - .foregroundColor(Color(.textInverted)) - .font(.title2) + .statValueStyle() + } .frame(maxWidth: .infinity, alignment: .leading) VStack(alignment: .leading, spacing: Layout.cardSpacing) { Text(Localization.visitors) - .bold() - .font(.caption) - .foregroundColor(Color(.lightText)) + .statTitleStyle() Text(entry.visitors) - .foregroundColor(Color(.textInverted)) - .font(.title2) + .statValueStyle() } .frame(maxWidth: .infinity, alignment: .leading) } @@ -72,25 +64,19 @@ struct StoreInfoView: View { HStack { VStack(alignment: .leading, spacing: Layout.cardSpacing) { Text(Localization.orders) - .bold() - .font(.caption) - .foregroundColor(Color(.lightText)) + .statTitleStyle() Text(entry.orders) - .foregroundColor(Color(.textInverted)) - .font(.title2) + .statValueStyle() } .frame(maxWidth: .infinity, alignment: .leading) VStack(alignment: .leading, spacing: Layout.cardSpacing) { Text(Localization.conversion) - .bold() - .font(.caption) - .foregroundColor(Color(.lightText)) + .statTitleStyle() Text(entry.conversion) - .foregroundColor(Color(.textInverted)) - .font(.title2) + .statValueStyle() } .frame(maxWidth: .infinity, alignment: .leading) diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index 0b7386e36fe..4343b1743e4 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -524,6 +524,7 @@ 265BCA0E2430E771004E53EE /* ProductCategoryTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 265BCA0D2430E771004E53EE /* ProductCategoryTableViewCell.xib */; }; 265C99E228B9BCD0005E6117 /* StoreInfoWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 265C99E028B9BA43005E6117 /* StoreInfoWidget.swift */; }; 265C99E428B9C834005E6117 /* StoreInfoProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 265C99E328B9C834005E6117 /* StoreInfoProvider.swift */; }; + 265C99E628B9CB8E005E6117 /* StoreInfoViewModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 265C99E528B9CB8E005E6117 /* StoreInfoViewModifiers.swift */; }; 265D909D2446688C00D66F0F /* ProductCategoryViewModelBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 267CFE1824435A5500AF3A13 /* ProductCategoryViewModelBuilderTests.swift */; }; 2662D90626E1571900E25611 /* ListSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2662D90526E1571900E25611 /* ListSelector.swift */; }; 2662D90826E15D6E00E25611 /* CountrySelectorCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2662D90726E15D6E00E25611 /* CountrySelectorCommand.swift */; }; @@ -2389,6 +2390,7 @@ 265BCA0D2430E771004E53EE /* ProductCategoryTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ProductCategoryTableViewCell.xib; sourceTree = ""; }; 265C99E028B9BA43005E6117 /* StoreInfoWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInfoWidget.swift; sourceTree = ""; }; 265C99E328B9C834005E6117 /* StoreInfoProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInfoProvider.swift; sourceTree = ""; }; + 265C99E528B9CB8E005E6117 /* StoreInfoViewModifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreInfoViewModifiers.swift; sourceTree = ""; }; 2662D90526E1571900E25611 /* ListSelector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListSelector.swift; sourceTree = ""; }; 2662D90726E15D6E00E25611 /* CountrySelectorCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountrySelectorCommand.swift; sourceTree = ""; }; 2662D90926E16B3600E25611 /* FilterListSelector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterListSelector.swift; sourceTree = ""; }; @@ -5273,6 +5275,7 @@ 3F1FA84528B60125009E246C /* StoreWidgets.swift */, 265C99E028B9BA43005E6117 /* StoreInfoWidget.swift */, 265C99E328B9C834005E6117 /* StoreInfoProvider.swift */, + 265C99E528B9CB8E005E6117 /* StoreInfoViewModifiers.swift */, 3F1FA84728B60125009E246C /* StoreWidgets.intentdefinition */, 3F1FA84828B60126009E246C /* Assets.xcassets */, 3F1FA84A28B60126009E246C /* Info.plist */, @@ -9184,6 +9187,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 265C99E628B9CB8E005E6117 /* StoreInfoViewModifiers.swift in Sources */, 3F1FA84B28B60126009E246C /* StoreWidgets.intentdefinition in Sources */, 265C99E228B9BCD0005E6117 /* StoreInfoWidget.swift in Sources */, 265C99E428B9C834005E6117 /* StoreInfoProvider.swift in Sources */, From f29c7c2f6816fef0671d3dea1289368ca52f77bb Mon Sep 17 00:00:00 2001 From: Ernesto Carrion Date: Fri, 26 Aug 2022 23:31:27 -0500 Subject: [PATCH 29/74] Only serve the widget to debug & alpha builds --- WooCommerce/StoreWidgets/StoreInfoWidget.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/WooCommerce/StoreWidgets/StoreInfoWidget.swift b/WooCommerce/StoreWidgets/StoreInfoWidget.swift index a3ab76c6ee0..9e6e4d5b977 100644 --- a/WooCommerce/StoreWidgets/StoreInfoWidget.swift +++ b/WooCommerce/StoreWidgets/StoreInfoWidget.swift @@ -10,7 +10,11 @@ struct StoreInfoWidget: Widget { StoreInfoView(entry: entry) } .configurationDisplayName("Store Info") +#if RELEASE // TODO: Update this to use proper feature flags + .supportedFamilies([]) +#else .supportedFamilies([.systemMedium]) +#endif } } From 59c18eca651e71e207e8ba81f2300f458e96939c Mon Sep 17 00:00:00 2001 From: Ernesto Carrion Date: Fri, 26 Aug 2022 23:54:15 -0500 Subject: [PATCH 30/74] Remove unwanted change --- .../Assets.xcassets/AppIcon.appiconset/Contents.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/WooCommerce/StoreWidgets/Assets.xcassets/AppIcon.appiconset/Contents.json b/WooCommerce/StoreWidgets/Assets.xcassets/AppIcon.appiconset/Contents.json index 9221b9bb1a3..5a3257a7d00 100644 --- a/WooCommerce/StoreWidgets/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/WooCommerce/StoreWidgets/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -70,11 +70,6 @@ "scale" : "2x", "size" : "40x40" }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, { "idiom" : "ipad", "scale" : "2x", From 0bc39984ffab67a2baf407f2c6837cb3df61e2e2 Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 1 Sep 2022 12:31:25 +0100 Subject: [PATCH 31/74] 7628 Track enable_cash_on_delivery_* from toggle --- .../Classes/Analytics/WooAnalyticsEvent.swift | 2 + .../InPersonPaymentsMenuViewModel.swift | 26 ++++- .../WooCommerce.xcodeproj/project.pbxproj | 4 + .../InPersonPaymentsMenuViewModelTests.swift | 95 +++++++++++++++++++ 4 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModelTests.swift diff --git a/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift b/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift index ae5bd54c1d7..25afba2279b 100644 --- a/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift +++ b/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift @@ -1199,6 +1199,7 @@ extension WooAnalyticsEvent { /// /// - Parameters: /// - countryCode: the country code of the store. + /// - source: the screen which the enable attempt was made on /// static func enableCashOnDeliverySuccess(countryCode: String, source: CashOnDeliverySource) -> WooAnalyticsEvent { WooAnalyticsEvent(statName: .enableCashOnDeliverySuccess, @@ -1212,6 +1213,7 @@ extension WooAnalyticsEvent { /// /// - Parameters: /// - countryCode: the country code of the store. + /// - source: the screen which the enable attempt was made on /// static func enableCashOnDeliveryFailed(countryCode: String, error: Error?, diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModel.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModel.swift index a81be95dad5..954e84ffab5 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModel.swift @@ -40,12 +40,16 @@ class InPersonPaymentsMenuViewModel: ObservableObject { stores.sessionManager.defaultStoreID } + private let cardPresentPaymentsConfiguration: CardPresentPaymentsConfiguration + private let paymentGatewaysFetchedResultsController: ResultsController? var selectedPlugin: CardPresentPaymentsPlugin? - init(dependencies: Dependencies = Dependencies()) { + init(dependencies: Dependencies = Dependencies(), + configuration: CardPresentPaymentsConfiguration = CardPresentConfigurationLoader().configuration) { self.dependencies = dependencies + self.cardPresentPaymentsConfiguration = configuration paymentGatewaysFetchedResultsController = Self.createPaymentGatewaysResultsController( siteID: dependencies.stores.sessionManager.defaultStoreID) observePaymentGateways() @@ -108,9 +112,11 @@ class InPersonPaymentsMenuViewModel: ObservableObject { // Resetting the toggle to the most recent stored value, or false because we failed to make it true. self.cashOnDeliveryEnabledState = self.cashOnDeliveryGateway?.enabled ?? false self.displayEnableCashOnDeliveryFailureNotice() + self.trackEnableCashOnDeliveryFailed(error: result.failure) return } + self.trackEnableCashOnDeliverySuccess() } stores.dispatch(action) } @@ -166,6 +172,24 @@ class InPersonPaymentsMenuViewModel: ObservableObject { } } +// MARK: - Analytics +extension InPersonPaymentsMenuViewModel { + private typealias Event = WooAnalyticsEvent.InPersonPayments + + private func trackEnableCashOnDeliverySuccess() { + let event = Event.enableCashOnDeliverySuccess(countryCode: cardPresentPaymentsConfiguration.countryCode, + source: .paymentsHub) + analytics.track(event: event) + } + + private func trackEnableCashOnDeliveryFailed(error: Error?) { + let event = Event.enableCashOnDeliveryFailed(countryCode: cardPresentPaymentsConfiguration.countryCode, + error: error, + source: .paymentsHub) + analytics.track(event: event) + } +} + private enum Localization { static let enableCashOnDeliveryFailureNoticeTitle = NSLocalizedString( "Failed to enable Pay in Person. Please try again later.", diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index 4732a7084df..8bea1672055 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -460,6 +460,7 @@ 03EF24FA28BF5D21006A033E /* InPersonPaymentsMenuViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03EF24F928BF5D21006A033E /* InPersonPaymentsMenuViewModel.swift */; }; 03EF24FC28BF996F006A033E /* InPersonPaymentsCashOnDeliveryPaymentGatewayHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03EF24FB28BF996F006A033E /* InPersonPaymentsCashOnDeliveryPaymentGatewayHelpers.swift */; }; 03EF24FE28C0B356006A033E /* CardPresentPaymentsPlugin+CashOnDelivery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03EF24FD28C0B356006A033E /* CardPresentPaymentsPlugin+CashOnDelivery.swift */; }; + 03EF250028C0E9EE006A033E /* InPersonPaymentsMenuViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03EF24FF28C0E9EE006A033E /* InPersonPaymentsMenuViewModelTests.swift */; }; 03FBDA9D263AD49200ACE257 /* CouponListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03FBDA9C263AD49100ACE257 /* CouponListViewController.swift */; }; 03FBDAA3263AED2F00ACE257 /* CouponListViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 03FBDAA2263AED2F00ACE257 /* CouponListViewController.xib */; }; 03FBDAF2263EE47C00ACE257 /* CouponListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03FBDAF1263EE47C00ACE257 /* CouponListViewModel.swift */; }; @@ -2307,6 +2308,7 @@ 03EF24F928BF5D21006A033E /* InPersonPaymentsMenuViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InPersonPaymentsMenuViewModel.swift; sourceTree = ""; }; 03EF24FB28BF996F006A033E /* InPersonPaymentsCashOnDeliveryPaymentGatewayHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InPersonPaymentsCashOnDeliveryPaymentGatewayHelpers.swift; sourceTree = ""; }; 03EF24FD28C0B356006A033E /* CardPresentPaymentsPlugin+CashOnDelivery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CardPresentPaymentsPlugin+CashOnDelivery.swift"; sourceTree = ""; }; + 03EF24FF28C0E9EE006A033E /* InPersonPaymentsMenuViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InPersonPaymentsMenuViewModelTests.swift; sourceTree = ""; }; 03FBDA9C263AD49100ACE257 /* CouponListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponListViewController.swift; sourceTree = ""; }; 03FBDAA2263AED2F00ACE257 /* CouponListViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CouponListViewController.xib; sourceTree = ""; }; 03FBDAF1263EE47C00ACE257 /* CouponListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponListViewModel.swift; sourceTree = ""; }; @@ -4745,6 +4747,7 @@ isa = PBXGroup; children = ( 03A6C18228B52ADB00AADF23 /* Onboarding Errors */, + 03EF24FF28C0E9EE006A033E /* InPersonPaymentsMenuViewModelTests.swift */, ); path = "In-Person Payments"; sourceTree = ""; @@ -10417,6 +10420,7 @@ 021125B82578ECF10075AD2A /* BoldableTextParserTests.swift in Sources */, 4569D3F425DC1BFF00CDC3E2 /* ShippingLabelFormViewModelTests.swift in Sources */, 57F2C6CD246DECC10074063B /* SummaryTableViewCellViewModelTests.swift in Sources */, + 03EF250028C0E9EE006A033E /* InPersonPaymentsMenuViewModelTests.swift in Sources */, 02A275C423FE5B64005C560F /* MockPHAssetImageLoader.swift in Sources */, 456738972743DE9A00743054 /* OrderDateRangeFilterTests.swift in Sources */, A650BE872578E76600C655E0 /* MockStorageManager.swift in Sources */, diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModelTests.swift new file mode 100644 index 00000000000..0df94d524d3 --- /dev/null +++ b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModelTests.swift @@ -0,0 +1,95 @@ +import XCTest +import TestKit + +@testable import WooCommerce +import Yosemite +import Networking + +final class InPersonPaymentsMenuViewModelTests: XCTestCase { + private var stores: MockStoresManager! + + private var noticePresenter: MockNoticePresenter! + + private var analyticsProvider: MockAnalyticsProvider! + private var analytics: Analytics! + + private var configuration: CardPresentPaymentsConfiguration! + + private var dependencies: InPersonPaymentsMenuViewModel.Dependencies! + + private var sut: InPersonPaymentsMenuViewModel! + + override func setUp() { + stores = MockStoresManager(sessionManager: .makeForTesting()) + stores.sessionManager.setStoreId(12345) + noticePresenter = MockNoticePresenter() + analyticsProvider = MockAnalyticsProvider() + analytics = WooAnalytics(analyticsProvider: analyticsProvider) + configuration = CardPresentPaymentsConfiguration.init(country: "US") + dependencies = InPersonPaymentsMenuViewModel.Dependencies( + stores: stores, + noticePresenter: noticePresenter, + analytics: analytics + ) + sut = InPersonPaymentsMenuViewModel(dependencies: dependencies, + configuration: configuration) + } + + // MARK: - Analytics tests + func test_updateCashOnDeliverySetting_enabled_success_logs_enable_success_event() throws { + // Given + assertEmpty(analyticsProvider.receivedEvents) + stores.whenReceivingAction(ofType: PaymentGatewayAction.self) { action in + switch action { + case let .updatePaymentGateway(paymentGateway, onCompletion): + onCompletion(.success(paymentGateway)) + default: + break + } + } + + // When + sut.updateCashOnDeliverySetting(enabled: true) + + // Then + assertNotEmpty(analyticsProvider.receivedEvents) + let indexOfEvent = try XCTUnwrap(analyticsProvider.receivedEvents.firstIndex(where: { $0 == AnalyticEvents.enableCashOnDeliverySuccess })) + let eventProperties = try XCTUnwrap(analyticsProvider.receivedProperties[indexOfEvent]) + assertEqual("US", eventProperties[AnalyticProperties.countryCodeKey] as? String) + assertEqual("payments_hub", eventProperties[AnalyticProperties.sourceKey] as? String) + } + + func test_updateCashOnDeliverySetting_enabled_failure_logs_enable_failure_event() throws { + // Given + stores.whenReceivingAction(ofType: PaymentGatewayAction.self) { action in + switch action { + case let .updatePaymentGateway(_, onCompletion): + onCompletion(.failure(DotcomError.noRestRoute)) + default: + break + } + } + + // When + sut.updateCashOnDeliverySetting(enabled: true) + + // Then + assertNotEmpty(analyticsProvider.receivedEvents) + let indexOfEvent = try XCTUnwrap(analyticsProvider.receivedEvents.firstIndex(where: { $0 == AnalyticEvents.enableCashOnDeliveryFailed })) + let eventProperties = try XCTUnwrap(analyticsProvider.receivedProperties[indexOfEvent]) + assertEqual("US", eventProperties[AnalyticProperties.countryCodeKey] as? String) + assertEqual("Dotcom Invalid REST Route", eventProperties[AnalyticProperties.errorDescriptionKey] as? String) + assertEqual("payments_hub", eventProperties[AnalyticProperties.sourceKey] as? String) + } +} + +private enum AnalyticEvents { + static let enableCashOnDeliverySuccess = "enable_cash_on_delivery_success" + static let enableCashOnDeliveryFailed = "enable_cash_on_delivery_failed" +} + +private enum AnalyticProperties { + static let countryCodeKey = "country" + static let errorDescriptionKey = "error_description" + static let sourceKey = "source" +} From 0705c9e3162e441124572f4ebe33f4f5d5c8b2d8 Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 1 Sep 2022 16:06:58 +0100 Subject: [PATCH 32/74] 7628 Track disable_cash_on_delivery_* from toggle --- .../Classes/Analytics/WooAnalyticsEvent.swift | 31 ++++++++++ .../Classes/Analytics/WooAnalyticsStat.swift | 2 + .../InPersonPaymentsMenuViewModel.swift | 31 +++++++++- .../InPersonPaymentsMenuViewModelTests.swift | 59 ++++++++++++++++++- 4 files changed, 119 insertions(+), 4 deletions(-) diff --git a/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift b/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift index 25afba2279b..9927dd9e6ca 100644 --- a/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift +++ b/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift @@ -1226,6 +1226,37 @@ extension WooAnalyticsEvent { error: error) } + /// Tracked when the Cash on Delivery Payment Gateway is successfully disabled, e.g. from the toggle on the Payments hub menu. + /// + /// - Parameters: + /// - countryCode: the country code of the store. + /// - source: the screen which the disable attempt was made on + /// + static func disableCashOnDeliverySuccess(countryCode: String, source: CashOnDeliverySource) -> WooAnalyticsEvent { + WooAnalyticsEvent(statName: .disableCashOnDeliverySuccess, + properties: [ + Keys.countryCode: countryCode, + Keys.source: source.rawValue + ]) + } + + /// Tracked when the Cash on Delivery Payment Gateway disabling fails, e.g. from the toggle on the Payments hub menu. + /// + /// - Parameters: + /// - countryCode: the country code of the store. + /// - source: the screen which the disable attempt was made on + /// + static func disableCashOnDeliveryFailed(countryCode: String, + error: Error?, + source: CashOnDeliverySource) -> WooAnalyticsEvent { + WooAnalyticsEvent(statName: .disableCashOnDeliveryFailed, + properties: [ + Keys.countryCode: countryCode, + Keys.source: source.rawValue + ], + error: error) + } + /// Tracked when the user taps on the "See Receipt" button to view a receipt. /// - Parameter countryCode: the country code of the store. /// diff --git a/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift b/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift index 51e8305c894..0c0f7b8873a 100644 --- a/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift +++ b/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift @@ -190,6 +190,8 @@ public enum WooAnalyticsStat: String { // MARK: Cash on Delivery Enable events case enableCashOnDeliverySuccess = "enable_cash_on_delivery_success" case enableCashOnDeliveryFailed = "enable_cash_on_delivery_failed" + case disableCashOnDeliverySuccess = "disable_cash_on_delivery_success" + case disableCashOnDeliveryFailed = "disable_cash_on_delivery_failed" // MARK: Payment Gateways selection case cardPresentPaymentGatewaySelected = "card_present_payment_gateway_selected" diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModel.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModel.swift index 954e84ffab5..cd28df1495a 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModel.swift @@ -1,18 +1,22 @@ import Foundation import Yosemite +import protocol Storage.StorageManagerType class InPersonPaymentsMenuViewModel: ObservableObject { // MARK: - Dependencies struct Dependencies { let stores: StoresManager + let storageManager: StorageManagerType let noticePresenter: NoticePresenter let analytics: Analytics init(stores: StoresManager = ServiceLocator.stores, + storageManager: StorageManagerType = ServiceLocator.storageManager, noticePresenter: NoticePresenter = ServiceLocator.noticePresenter, analytics: Analytics = ServiceLocator.analytics) { self.stores = stores + self.storageManager = storageManager self.noticePresenter = noticePresenter self.analytics = analytics } @@ -24,6 +28,10 @@ class InPersonPaymentsMenuViewModel: ObservableObject { dependencies.stores } + private var storageManager: StorageManagerType { + dependencies.storageManager + } + private var noticePresenter: NoticePresenter { dependencies.noticePresenter } @@ -51,7 +59,8 @@ class InPersonPaymentsMenuViewModel: ObservableObject { self.dependencies = dependencies self.cardPresentPaymentsConfiguration = configuration paymentGatewaysFetchedResultsController = Self.createPaymentGatewaysResultsController( - siteID: dependencies.stores.sessionManager.defaultStoreID) + siteID: dependencies.stores.sessionManager.defaultStoreID, + storageManager: dependencies.storageManager) observePaymentGateways() } @@ -67,14 +76,15 @@ class InPersonPaymentsMenuViewModel: ObservableObject { } } - private static func createPaymentGatewaysResultsController(siteID: Int64?) -> ResultsController? { + private static func createPaymentGatewaysResultsController(siteID: Int64?, + storageManager: StorageManagerType) -> ResultsController? { guard let siteID = siteID else { return nil } let predicate = NSPredicate(format: "siteID == %lld", siteID) - return ResultsController(storageManager: ServiceLocator.storageManager, + return ResultsController(storageManager: storageManager, matching: predicate, sortedBy: []) } @@ -144,9 +154,11 @@ class InPersonPaymentsMenuViewModel: ObservableObject { // Resetting the toggle to the most recent stored value, or true because we failed to make it false. self.cashOnDeliveryEnabledState = self.cashOnDeliveryGateway?.enabled ?? true self.displayDisableCashOnDeliveryFailureNotice() + self.trackDisableCashOnDeliveryFailed(error: result.failure) return } + self.trackDisableCashOnDeliverySuccess() } stores.dispatch(action) } @@ -188,6 +200,19 @@ extension InPersonPaymentsMenuViewModel { source: .paymentsHub) analytics.track(event: event) } + + private func trackDisableCashOnDeliverySuccess() { + let event = Event.disableCashOnDeliverySuccess(countryCode: cardPresentPaymentsConfiguration.countryCode, + source: .paymentsHub) + analytics.track(event: event) + } + + private func trackDisableCashOnDeliveryFailed(error: Error?) { + let event = Event.disableCashOnDeliveryFailed(countryCode: cardPresentPaymentsConfiguration.countryCode, + error: error, + source: .paymentsHub) + analytics.track(event: event) + } } private enum Localization { diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModelTests.swift index 0df94d524d3..1e92cf4bacb 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModelTests.swift @@ -8,6 +8,8 @@ import Networking final class InPersonPaymentsMenuViewModelTests: XCTestCase { private var stores: MockStoresManager! + private var storageManager: MockStorageManager! + private var noticePresenter: MockNoticePresenter! private var analyticsProvider: MockAnalyticsProvider! @@ -19,15 +21,22 @@ final class InPersonPaymentsMenuViewModelTests: XCTestCase { private var sut: InPersonPaymentsMenuViewModel! + private let sampleStoreID: Int64 = 12345 + override func setUp() { stores = MockStoresManager(sessionManager: .makeForTesting()) - stores.sessionManager.setStoreId(12345) + stores.sessionManager.setStoreId(sampleStoreID) + storageManager = MockStorageManager() + storageManager.insertSamplePaymentGateway(readOnlyGateway: PaymentGateway.fake().copy(siteID: sampleStoreID, + gatewayID: "cod")) noticePresenter = MockNoticePresenter() analyticsProvider = MockAnalyticsProvider() analytics = WooAnalytics(analyticsProvider: analyticsProvider) configuration = CardPresentPaymentsConfiguration.init(country: "US") + dependencies = InPersonPaymentsMenuViewModel.Dependencies( stores: stores, + storageManager: storageManager, noticePresenter: noticePresenter, analytics: analytics ) @@ -81,11 +90,59 @@ final class InPersonPaymentsMenuViewModelTests: XCTestCase { assertEqual("Dotcom Invalid REST Route", eventProperties[AnalyticProperties.errorDescriptionKey] as? String) assertEqual("payments_hub", eventProperties[AnalyticProperties.sourceKey] as? String) } + + func test_updateCashOnDeliverySetting_disabled_success_logs_disable_success_event() throws { + // Given + assertEmpty(analyticsProvider.receivedEvents) + stores.whenReceivingAction(ofType: PaymentGatewayAction.self) { action in + switch action { + case let .updatePaymentGateway(paymentGateway, onCompletion): + onCompletion(.success(paymentGateway)) + default: + break + } + } + + // When + sut.updateCashOnDeliverySetting(enabled: false) + + // Then + assertNotEmpty(analyticsProvider.receivedEvents) + let indexOfEvent = try XCTUnwrap(analyticsProvider.receivedEvents.firstIndex(where: { $0 == AnalyticEvents.disableCashOnDeliverySuccess })) + let eventProperties = try XCTUnwrap(analyticsProvider.receivedProperties[indexOfEvent]) + assertEqual("US", eventProperties[AnalyticProperties.countryCodeKey] as? String) + assertEqual("payments_hub", eventProperties[AnalyticProperties.sourceKey] as? String) + } + + func test_updateCashOnDeliverySetting_disabled_failure_logs_disable_failure_event() throws { + // Given + stores.whenReceivingAction(ofType: PaymentGatewayAction.self) { action in + switch action { + case let .updatePaymentGateway(_, onCompletion): + onCompletion(.failure(DotcomError.noRestRoute)) + default: + break + } + } + + // When + sut.updateCashOnDeliverySetting(enabled: false) + + // Then + assertNotEmpty(analyticsProvider.receivedEvents) + let indexOfEvent = try XCTUnwrap(analyticsProvider.receivedEvents.firstIndex(where: { $0 == AnalyticEvents.disableCashOnDeliveryFailed })) + let eventProperties = try XCTUnwrap(analyticsProvider.receivedProperties[indexOfEvent]) + assertEqual("US", eventProperties[AnalyticProperties.countryCodeKey] as? String) + assertEqual("Dotcom Invalid REST Route", eventProperties[AnalyticProperties.errorDescriptionKey] as? String) + assertEqual("payments_hub", eventProperties[AnalyticProperties.sourceKey] as? String) + } } private enum AnalyticEvents { static let enableCashOnDeliverySuccess = "enable_cash_on_delivery_success" static let enableCashOnDeliveryFailed = "enable_cash_on_delivery_failed" + static let disableCashOnDeliverySuccess = "disable_cash_on_delivery_success" + static let disableCashOnDeliveryFailed = "disable_cash_on_delivery_failed" } private enum AnalyticProperties { From e72fea28a0eb0c776be1e56bb8184f514fc1faa7 Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 1 Sep 2022 16:19:50 +0100 Subject: [PATCH 33/74] 7628 Track payments_hub_cash_on_delivery_toggled --- .../Classes/Analytics/WooAnalyticsEvent.swift | 17 ++++++++++- .../Classes/Analytics/WooAnalyticsStat.swift | 1 + .../InPersonPaymentsMenuViewModel.swift | 7 +++++ .../InPersonPaymentsMenuViewModelTests.swift | 30 +++++++++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift b/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift index 9927dd9e6ca..b408b1194fd 100644 --- a/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift +++ b/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift @@ -752,6 +752,7 @@ extension WooAnalyticsEvent { static let paymentMethodType = "payment_method_type" static let softwareUpdateType = "software_update_type" static let source = "source" + static let enabled = "enabled" } static let unknownGatewayID = "unknown" @@ -1240,7 +1241,7 @@ extension WooAnalyticsEvent { ]) } - /// Tracked when the Cash on Delivery Payment Gateway disabling fails, e.g. from the toggle on the Payments hub menu. + /// Tracked when the Cash on Delivery Payment Gateway disabling fails, e.g. from the toggle on the Payments hub menu. /// /// - Parameters: /// - countryCode: the country code of the store. @@ -1257,6 +1258,20 @@ extension WooAnalyticsEvent { error: error) } + /// Tracked when the Cash on Delivery Payment Gateway toggle is changed from the toggle on the Payments hub menu. + /// + /// - Parameters: + /// - enabled: the reason why the onboarding step was shown (effectively the name of the step.) + /// - countryCode: the country code of the store. + /// + static func paymentsHubCashOnDeliveryToggled(enabled: Bool, countryCode: String) -> WooAnalyticsEvent { + WooAnalyticsEvent(statName: .paymentsHubCashOnDeliveryToggled, + properties: [ + Keys.countryCode: countryCode, + Keys.enabled: enabled + ]) + } + /// Tracked when the user taps on the "See Receipt" button to view a receipt. /// - Parameter countryCode: the country code of the store. /// diff --git a/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift b/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift index 0c0f7b8873a..bfca6cfb06c 100644 --- a/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift +++ b/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift @@ -192,6 +192,7 @@ public enum WooAnalyticsStat: String { case enableCashOnDeliveryFailed = "enable_cash_on_delivery_failed" case disableCashOnDeliverySuccess = "disable_cash_on_delivery_success" case disableCashOnDeliveryFailed = "disable_cash_on_delivery_failed" + case paymentsHubCashOnDeliveryToggled = "payments_hub_cash_on_delivery_toggled" // MARK: Payment Gateways selection case cardPresentPaymentGatewaySelected = "card_present_payment_gateway_selected" diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModel.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModel.swift index cd28df1495a..5f0d2f21140 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModel.swift @@ -102,6 +102,7 @@ class InPersonPaymentsMenuViewModel: ObservableObject { // MARK: - Toggle Cash on Delivery Payment Gateway func updateCashOnDeliverySetting(enabled: Bool) { + trackCashOnDeliveryToggled(enabled: enabled) switch enabled { case true: enableCashOnDeliveryGateway() @@ -188,6 +189,12 @@ class InPersonPaymentsMenuViewModel: ObservableObject { extension InPersonPaymentsMenuViewModel { private typealias Event = WooAnalyticsEvent.InPersonPayments + private func trackCashOnDeliveryToggled(enabled: Bool) { + let event = Event.paymentsHubCashOnDeliveryToggled(enabled: enabled, + countryCode: cardPresentPaymentsConfiguration.countryCode) + analytics.track(event: event) + } + private func trackEnableCashOnDeliverySuccess() { let event = Event.enableCashOnDeliverySuccess(countryCode: cardPresentPaymentsConfiguration.countryCode, source: .paymentsHub) diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModelTests.swift index 1e92cf4bacb..451e6431fc0 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModelTests.swift @@ -45,6 +45,34 @@ final class InPersonPaymentsMenuViewModelTests: XCTestCase { } // MARK: - Analytics tests + func test_updateCashOnDeliverySetting_enabled_tracks_paymentsHubCashOnDeliveryToggled_event() throws { + // Given + + // When + sut.updateCashOnDeliverySetting(enabled: true) + + // Then + assertNotEmpty(analyticsProvider.receivedEvents) + let indexOfEvent = try XCTUnwrap(analyticsProvider.receivedEvents.firstIndex(where: { $0 == AnalyticEvents.paymentsHubCashOnDeliveryToggled })) + let eventProperties = try XCTUnwrap(analyticsProvider.receivedProperties[indexOfEvent]) + assertEqual("US", eventProperties[AnalyticProperties.countryCodeKey] as? String) + assertEqual(true, eventProperties[AnalyticProperties.enabledKey] as? Bool) + } + + func test_updateCashOnDeliverySetting_disabled_tracks_paymentsHubCashOnDeliveryToggled_event() throws { + // Given + + // When + sut.updateCashOnDeliverySetting(enabled: false) + + // Then + assertNotEmpty(analyticsProvider.receivedEvents) + let indexOfEvent = try XCTUnwrap(analyticsProvider.receivedEvents.firstIndex(where: { $0 == AnalyticEvents.paymentsHubCashOnDeliveryToggled })) + let eventProperties = try XCTUnwrap(analyticsProvider.receivedProperties[indexOfEvent]) + assertEqual("US", eventProperties[AnalyticProperties.countryCodeKey] as? String) + assertEqual(false, eventProperties[AnalyticProperties.enabledKey] as? Bool) + } + func test_updateCashOnDeliverySetting_enabled_success_logs_enable_success_event() throws { // Given assertEmpty(analyticsProvider.receivedEvents) @@ -143,10 +171,12 @@ private enum AnalyticEvents { static let enableCashOnDeliveryFailed = "enable_cash_on_delivery_failed" static let disableCashOnDeliverySuccess = "disable_cash_on_delivery_success" static let disableCashOnDeliveryFailed = "disable_cash_on_delivery_failed" + static let paymentsHubCashOnDeliveryToggled = "payments_hub_cash_on_delivery_toggled" } private enum AnalyticProperties { static let countryCodeKey = "country" static let errorDescriptionKey = "error_description" static let sourceKey = "source" + static let enabledKey = "enabled" } From 3cd557dc16c688655d710c6ced536f821c9107ef Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 1 Sep 2022 16:30:03 +0100 Subject: [PATCH 34/74] 7628 Track cash_on_delivery_toggle_learn_more --- WooCommerce/Classes/Analytics/WooAnalyticsStat.swift | 1 + .../InPersonPaymentsMenuViewModel.swift | 1 + .../InPersonPaymentsMenuViewModelTests.swift | 12 ++++++++++++ 3 files changed, 14 insertions(+) diff --git a/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift b/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift index bfca6cfb06c..f168cb790a7 100644 --- a/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift +++ b/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift @@ -193,6 +193,7 @@ public enum WooAnalyticsStat: String { case disableCashOnDeliverySuccess = "disable_cash_on_delivery_success" case disableCashOnDeliveryFailed = "disable_cash_on_delivery_failed" case paymentsHubCashOnDeliveryToggled = "payments_hub_cash_on_delivery_toggled" + case paymentsHubCashOnDeliveryToggleLearnMoreTapped = "payments_hub_cash_on_delivery_toggle_learn_more_tapped" // MARK: Payment Gateways selection case cardPresentPaymentGatewaySelected = "card_present_payment_gateway_selected" diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModel.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModel.swift index 5f0d2f21140..4e19a47689f 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModel.swift @@ -182,6 +182,7 @@ class InPersonPaymentsMenuViewModel: ObservableObject { func learnMoreTapped(from viewController: UIViewController) { WebviewHelper.launch(learnMoreURL, with: viewController) + analytics.track(.paymentsHubCashOnDeliveryToggleLearnMoreTapped) } } diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModelTests.swift index 451e6431fc0..efcb09de3e6 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewModelTests.swift @@ -164,6 +164,17 @@ final class InPersonPaymentsMenuViewModelTests: XCTestCase { assertEqual("Dotcom Invalid REST Route", eventProperties[AnalyticProperties.errorDescriptionKey] as? String) assertEqual("payments_hub", eventProperties[AnalyticProperties.sourceKey] as? String) } + + func test_learnMoreTapped_tracks_paymentsHubCashOnDeliveryToggleLearnMoreTapped_event() throws { + // Given + + // When + sut.learnMoreTapped(from: UIViewController()) + + // Then + let event = try XCTUnwrap(analyticsProvider.receivedEvents.first(where: { $0 == AnalyticEvents.paymentsHubCashOnDeliveryToggleLearnMoreTapped } )) + XCTAssertNotNil(event) + } } private enum AnalyticEvents { @@ -172,6 +183,7 @@ private enum AnalyticEvents { static let disableCashOnDeliverySuccess = "disable_cash_on_delivery_success" static let disableCashOnDeliveryFailed = "disable_cash_on_delivery_failed" static let paymentsHubCashOnDeliveryToggled = "payments_hub_cash_on_delivery_toggled" + static let paymentsHubCashOnDeliveryToggleLearnMoreTapped = "payments_hub_cash_on_delivery_toggle_learn_more_tapped" } private enum AnalyticProperties { From 130ca88fcce7ff7fdee964bdaef3937819ce4776 Mon Sep 17 00:00:00 2001 From: Ernesto Date: Thu, 1 Sep 2022 10:32:27 -0500 Subject: [PATCH 35/74] Add woo foundation as dependency --- .../WooCommerce.xcodeproj/project.pbxproj | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index 4343b1743e4..4a8d34f309c 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -586,6 +586,8 @@ 26CCBE0B2523B3650073F94D /* RefundProductsTotalTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26CCBE0A2523B3650073F94D /* RefundProductsTotalTableViewCell.swift */; }; 26CCBE0D2523C2560073F94D /* RefundProductsTotalTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 26CCBE0C2523C2560073F94D /* RefundProductsTotalTableViewCell.xib */; }; 26CFDB2727357E8000AB940B /* SimplePaymentsSummary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26CFDB2627357E8000AB940B /* SimplePaymentsSummary.swift */; }; + 26D9E54428C107F80098DF26 /* WooFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26D9E54328C107F80098DF26 /* WooFoundation.framework */; }; + 26D9E54528C107F80098DF26 /* WooFoundation.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 26D9E54328C107F80098DF26 /* WooFoundation.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 26DB7E3528636D2200506173 /* NonEditableOrderBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26DB7E3428636D2200506173 /* NonEditableOrderBanner.swift */; }; 26E0ADF12631D94D00A5EB3B /* TopBannerWrapperView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26E0ADF02631D94D00A5EB3B /* TopBannerWrapperView.swift */; }; 26E0AE13263359F900A5EB3B /* View+Conditionals.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26E0AE12263359F900A5EB3B /* View+Conditionals.swift */; }; @@ -1858,6 +1860,17 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + 26D9E54628C107F80098DF26 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 26D9E54528C107F80098DF26 /* WooFoundation.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; 3F1FA85028B60126009E246C /* Embed App Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -2452,6 +2465,7 @@ 26CCBE0A2523B3650073F94D /* RefundProductsTotalTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefundProductsTotalTableViewCell.swift; sourceTree = ""; }; 26CCBE0C2523C2560073F94D /* RefundProductsTotalTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RefundProductsTotalTableViewCell.xib; sourceTree = ""; }; 26CFDB2627357E8000AB940B /* SimplePaymentsSummary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimplePaymentsSummary.swift; sourceTree = ""; }; + 26D9E54328C107F80098DF26 /* WooFoundation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = WooFoundation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 26DB7E3428636D2200506173 /* NonEditableOrderBanner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonEditableOrderBanner.swift; sourceTree = ""; }; 26E0ADF02631D94D00A5EB3B /* TopBannerWrapperView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopBannerWrapperView.swift; sourceTree = ""; }; 26E0AE12263359F900A5EB3B /* View+Conditionals.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+Conditionals.swift"; sourceTree = ""; }; @@ -3706,6 +3720,7 @@ buildActionMask = 2147483647; files = ( 3F1FA84328B60125009E246C /* SwiftUI.framework in Frameworks */, + 26D9E54428C107F80098DF26 /* WooFoundation.framework in Frameworks */, 3F1FA84228B60125009E246C /* WidgetKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -6303,6 +6318,7 @@ 88A44ABE866401E6DB03AC60 /* Frameworks */ = { isa = PBXGroup; children = ( + 26D9E54328C107F80098DF26 /* WooFoundation.framework */, B9151B3E2840EB330036180F /* WooFoundation.framework */, 80E6FC6E276325F60086CD67 /* Clibsodium.xcframework */, 02AB82EB27069D5D008D7334 /* Experiments.framework */, @@ -8523,6 +8539,7 @@ 3F1FA83C28B60125009E246C /* Sources */, 3F1FA83D28B60125009E246C /* Frameworks */, 3F1FA83E28B60125009E246C /* Resources */, + 26D9E54628C107F80098DF26 /* Embed Frameworks */, ); buildRules = ( ); From 45213887f17499fccd4d3a06b668b2969d0c421a Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 1 Sep 2022 16:33:57 +0100 Subject: [PATCH 36/74] Remove unneccesary optional checks --- ...mageTitleSubtitleToggleTableViewCell.swift | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/ReusableViews/LeftImageTitleSubtitleToggleTableViewCell.swift b/WooCommerce/Classes/ViewRelated/ReusableViews/LeftImageTitleSubtitleToggleTableViewCell.swift index 6fe6a5d0aaa..faa2b131e79 100644 --- a/WooCommerce/Classes/ViewRelated/ReusableViews/LeftImageTitleSubtitleToggleTableViewCell.swift +++ b/WooCommerce/Classes/ViewRelated/ReusableViews/LeftImageTitleSubtitleToggleTableViewCell.swift @@ -4,8 +4,6 @@ import UIKit /// Represents a regular UITableView Cell with subtitle: [Image | Text + Subtitle | Disclosure] /// class LeftImageTitleSubtitleToggleTableViewCell: UITableViewCell { - - @IBOutlet weak var leftImageView: UIImageView! @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var subtitleLabel: UILabel! @@ -15,10 +13,10 @@ class LeftImageTitleSubtitleToggleTableViewCell: UITableViewCell { /// var leftImage: UIImage? { get { - return leftImageView?.image + return leftImageView.image } set { - leftImageView?.image = newValue + leftImageView.image = newValue } } @@ -26,10 +24,10 @@ class LeftImageTitleSubtitleToggleTableViewCell: UITableViewCell { /// var labelText: String? { get { - return titleLabel?.text + return titleLabel.text } set { - titleLabel?.text = newValue + titleLabel.text = newValue } } @@ -37,10 +35,10 @@ class LeftImageTitleSubtitleToggleTableViewCell: UITableViewCell { /// var subtitleLabelText: String? { get { - return subtitleLabel?.text + return subtitleLabel.text } set { - subtitleLabel?.text = newValue + subtitleLabel.text = newValue } } @@ -59,10 +57,10 @@ class LeftImageTitleSubtitleToggleTableViewCell: UITableViewCell { override func awakeFromNib() { super.awakeFromNib() configureBackground() - leftImageView?.tintColor = .primary - titleLabel?.applyBodyStyle() - subtitleLabel?.applyFootnoteStyle() - toggleSwitch?.onTintColor = .primary + leftImageView.tintColor = .primary + titleLabel.applyBodyStyle() + subtitleLabel.applyFootnoteStyle() + toggleSwitch.onTintColor = .primary subtitleLabel.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(subtitleTapped))) } @@ -110,9 +108,9 @@ extension LeftImageTitleSubtitleToggleTableViewCell { switchState: Bool, switchAction: @escaping (Bool) -> Void, subtitleTapAction: (() -> Void)? = nil) { - leftImageView?.image = image - titleLabel?.text = text - subtitleLabel?.text = subtitle + leftImageView.image = image + titleLabel.text = text + subtitleLabel.text = subtitle subtitleLabel.attributedText = attributedSubtitle toggleSwitch.isOn = switchState self.switchAction = switchAction From cbb8541fb1ad08ecfe5e1fc180cb483326ebe2eb Mon Sep 17 00:00:00 2001 From: Ernesto Carrion Date: Thu, 25 Aug 2022 17:28:46 -0500 Subject: [PATCH 37/74] Add basic template for store info widget --- .../Assets.xcassets/AppIcon.appiconset/Contents.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/WooCommerce/StoreWidgets/Assets.xcassets/AppIcon.appiconset/Contents.json b/WooCommerce/StoreWidgets/Assets.xcassets/AppIcon.appiconset/Contents.json index 5a3257a7d00..9221b9bb1a3 100644 --- a/WooCommerce/StoreWidgets/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/WooCommerce/StoreWidgets/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -70,6 +70,11 @@ "scale" : "2x", "size" : "40x40" }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, { "idiom" : "ipad", "scale" : "2x", From 2f5b3e544176f8ee673b43288102e8dd2efa121e Mon Sep 17 00:00:00 2001 From: Ernesto Date: Wed, 31 Aug 2022 16:10:17 -0500 Subject: [PATCH 38/74] Add track dependencies to WidgetsEtension --- Podfile | 25 +++++++---- Podfile.lock | 2 +- .../WooCommerce.xcodeproj/project.pbxproj | 42 +++++++++++++++++-- 3 files changed, 57 insertions(+), 12 deletions(-) diff --git a/Podfile b/Podfile index 134b2547fc3..f8fb4b09950 100644 --- a/Podfile +++ b/Podfile @@ -26,6 +26,13 @@ def aztec pod 'WordPress-Editor-iOS', '~> 1.11.0' end +def tracks + pod 'Automattic-Tracks-iOS', '~> 0.12.0-beta.2' + # pod 'Automattic-Tracks-iOS', :git => 'https://github.com/Automattic/Automattic-Tracks-iOS.git', :branch => '' + # pod 'Automattic-Tracks-iOS', :git => 'https://github.com/Automattic/Automattic-Tracks-iOS.git', :commit => '' + # pod 'Automattic-Tracks-iOS', :path => '../Automattic-Tracks-iOS' +end + # Main Target! # ============ # @@ -36,10 +43,7 @@ target 'WooCommerce' do # ==================== # - pod 'Automattic-Tracks-iOS', '~> 0.12.0-beta.2' - # pod 'Automattic-Tracks-iOS', :git => 'https://github.com/Automattic/Automattic-Tracks-iOS.git', :branch => '' - # pod 'Automattic-Tracks-iOS', :git => 'https://github.com/Automattic/Automattic-Tracks-iOS.git', :commit => '' - # pod 'Automattic-Tracks-iOS', :path => '../Automattic-Tracks-iOS' + tracks pod 'Gridicons', '~> 1.2.0' @@ -79,6 +83,14 @@ target 'WooCommerce' do end end +# StoreWidget Target +# ========== +# +target 'StoreWidgetsExtension' do + project 'WooCommerce/WooCommerce.xcodeproj' + tracks +end + # Yosemite Layer: # =============== # @@ -229,10 +241,7 @@ end # ================== # def experiments_pods - pod 'Automattic-Tracks-iOS', '~> 0.12.0-beta.2' - # pod 'Automattic-Tracks-iOS', :git => 'https://github.com/Automattic/Automattic-Tracks-iOS.git', :branch => '' - # pod 'Automattic-Tracks-iOS', :git => 'https://github.com/Automattic/Automattic-Tracks-iOS.git', :commit => '7e11e93d6205f51c09aad5d59f4e0679a796a2ef' - # pod 'Automattic-Tracks-iOS', :path => '../Automattic-Tracks-iOS' + tracks pod 'CocoaLumberjack', '~> 3.7.4' pod 'CocoaLumberjack/Swift', '~> 3.7.4' end diff --git a/Podfile.lock b/Podfile.lock index 8d8544419a8..a8131d3444f 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -179,6 +179,6 @@ SPEC CHECKSUMS: ZendeskSupportProvidersSDK: 2bdf8544f7cd0fd4c002546f5704b813845beb2a ZendeskSupportSDK: 3a8e508ab1d9dd22dc038df6c694466414e037ba -PODFILE CHECKSUM: 9a75e7f419482622cc94acc2a73bd04ebbc4beaf +PODFILE CHECKSUM: b19d0819ac802c9fe278c88ccdde52f7a19a61b3 COCOAPODS: 1.11.2 diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index 4a8d34f309c..80faeb15138 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -1091,6 +1091,7 @@ 80C362732779A7EF005CEAD3 /* products_reviews_all.json in Resources */ = {isa = PBXBuildFile; fileRef = 80C362722779A7EF005CEAD3 /* products_reviews_all.json */; }; 80E6FC6D276312D50086CD67 /* products.json in Resources */ = {isa = PBXBuildFile; fileRef = CCFC00C923E9BD5500157A78 /* products.json */; }; 80E6FC79276C3FD60086CD67 /* MockDataReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80E6FC742763579D0086CD67 /* MockDataReader.swift */; }; + 8194A48313C34FE1782D51BC /* Pods_StoreWidgetsExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2886DE5218EEA78ABAF0BE67 /* Pods_StoreWidgetsExtension.framework */; }; 86DBBB0BDEA3488E2BEBB314 /* Pods_WooCommerce.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BABE5E07DD787ECA6D2A76DE /* Pods_WooCommerce.framework */; }; 8CD41D4A21F8A7E300CF3C2B /* RELEASE-NOTES.txt in Resources */ = {isa = PBXBuildFile; fileRef = 8CD41D4921F8A7E300CF3C2B /* RELEASE-NOTES.txt */; }; 933A27372222354600C2143A /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 933A27362222354600C2143A /* Logging.swift */; }; @@ -2488,6 +2489,7 @@ 26FE09E324DCFE5200B9BDF5 /* InAppFeedbackCardViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InAppFeedbackCardViewControllerTests.swift; sourceTree = ""; }; 26FF455E24BE49EE00B3B2F4 /* DeprecatedStatsDashboardViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeprecatedStatsDashboardViewController.swift; sourceTree = ""; }; 2719B6FD1E6FE78A76B6AC74 /* Pods-WooCommerceTests.release-alpha.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WooCommerceTests.release-alpha.xcconfig"; path = "../Pods/Target Support Files/Pods-WooCommerceTests/Pods-WooCommerceTests.release-alpha.xcconfig"; sourceTree = ""; }; + 2886DE5218EEA78ABAF0BE67 /* Pods_StoreWidgetsExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StoreWidgetsExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 310D1B472734919E001D55B4 /* InPersonPaymentsLiveSiteInTestModeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InPersonPaymentsLiveSiteInTestModeView.swift; sourceTree = ""; }; 311237ED2714DA240033C44E /* CardPresentModalDisplayMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardPresentModalDisplayMessage.swift; sourceTree = ""; }; 311D21E7264AEDB900102316 /* CardPresentModalScanningForReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardPresentModalScanningForReader.swift; sourceTree = ""; }; @@ -2895,6 +2897,7 @@ 77E53EBE2510C153003D385F /* ProductDownloadListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDownloadListViewModel.swift; sourceTree = ""; }; 77E53EC42510C193003D385F /* ProductDownloadListViewController+Droppable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProductDownloadListViewController+Droppable.swift"; sourceTree = ""; }; 77E53EC72510FE07003D385F /* ProductDownloadsEditableData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDownloadsEditableData.swift; sourceTree = ""; }; + 7D4CEC625891A6F236907541 /* Pods-StoreWidgetsExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StoreWidgetsExtension.release.xcconfig"; path = "../Pods/Target Support Files/Pods-StoreWidgetsExtension/Pods-StoreWidgetsExtension.release.xcconfig"; sourceTree = ""; }; 7E6A01962725B811001668D5 /* FilterProductCategoryListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterProductCategoryListViewController.swift; sourceTree = ""; }; 7E6A019E2725CD76001668D5 /* FilterProductCategoryListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterProductCategoryListViewModel.swift; sourceTree = ""; }; 7E6A01A02725DEDE001668D5 /* FilterProductCategoryListViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterProductCategoryListViewModelTests.swift; sourceTree = ""; }; @@ -3203,6 +3206,7 @@ C044961228058FE8003B3081 /* AddProductScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddProductScreen.swift; sourceTree = ""; }; C0A37CB7282957EB00E0826D /* orders_3337_add_customer_details.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = orders_3337_add_customer_details.json; sourceTree = ""; }; C0CE1F83282AB1590019138E /* countries.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = countries.json; sourceTree = ""; }; + CB4839361AA061340BE98DA9 /* Pods-StoreWidgetsExtension.release-alpha.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StoreWidgetsExtension.release-alpha.xcconfig"; path = "../Pods/Target Support Files/Pods-StoreWidgetsExtension/Pods-StoreWidgetsExtension.release-alpha.xcconfig"; sourceTree = ""; }; CC0324A2263AD9F40056C6B7 /* MockShippingLabelAccountSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockShippingLabelAccountSettings.swift; sourceTree = ""; }; CC078530266E706300BA9AC1 /* ErrorTopBannerFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorTopBannerFactory.swift; sourceTree = ""; }; CC07860426736B6500BA9AC1 /* ErrorTopBannerFactoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorTopBannerFactoryTests.swift; sourceTree = ""; }; @@ -3516,6 +3520,7 @@ D8F3A97E258865BD0085859B /* PasswordScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordScreen.swift; sourceTree = ""; }; D8F82AC422AF903700B67E4B /* IconsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = IconsTests.swift; path = WooCommerceTests/Extensions/IconsTests.swift; sourceTree = SOURCE_ROOT; }; D8FBFF1622D4CC2F006E3336 /* docs */ = {isa = PBXFileReference; lastKnownFileType = folder; name = docs; path = ../docs; sourceTree = ""; }; + DA1AE99A10B90748C7676E95 /* Pods-StoreWidgetsExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StoreWidgetsExtension.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-StoreWidgetsExtension/Pods-StoreWidgetsExtension.debug.xcconfig"; sourceTree = ""; }; DE001322279A793A00EB0350 /* CouponWooTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponWooTests.swift; sourceTree = ""; }; DE0A2EA9281BA083007A8015 /* ProductCategoryList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductCategoryList.swift; sourceTree = ""; }; DE0A2EAC281BA1FA007A8015 /* ProductCategorySelector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductCategorySelector.swift; sourceTree = ""; }; @@ -3722,6 +3727,7 @@ 3F1FA84328B60125009E246C /* SwiftUI.framework in Frameworks */, 26D9E54428C107F80098DF26 /* WooFoundation.framework in Frameworks */, 3F1FA84228B60125009E246C /* WidgetKit.framework in Frameworks */, + 8194A48313C34FE1782D51BC /* Pods_StoreWidgetsExtension.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -6334,6 +6340,7 @@ BABE5E07DD787ECA6D2A76DE /* Pods_WooCommerce.framework */, 6DC4526F9A7357761197EBF0 /* Pods_WooCommerceTests.framework */, 3F1FA84128B60125009E246C /* WidgetKit.framework */, + 2886DE5218EEA78ABAF0BE67 /* Pods_StoreWidgetsExtension.framework */, ); name = Frameworks; sourceTree = ""; @@ -8415,6 +8422,9 @@ 8A659E65308A3D9DD79A95F9 /* Pods-WooCommerceTests.release.xcconfig */, 25D00C97936D2C6589F8ECE9 /* Pods-WooCommerce.release-alpha.xcconfig */, 2719B6FD1E6FE78A76B6AC74 /* Pods-WooCommerceTests.release-alpha.xcconfig */, + DA1AE99A10B90748C7676E95 /* Pods-StoreWidgetsExtension.debug.xcconfig */, + 7D4CEC625891A6F236907541 /* Pods-StoreWidgetsExtension.release.xcconfig */, + CB4839361AA061340BE98DA9 /* Pods-StoreWidgetsExtension.release-alpha.xcconfig */, ); name = Pods; sourceTree = ""; @@ -8536,6 +8546,7 @@ isa = PBXNativeTarget; buildConfigurationList = 3F1FA85428B60126009E246C /* Build configuration list for PBXNativeTarget "StoreWidgetsExtension" */; buildPhases = ( + 5F0CE4E06C2CFA36FC2FD62B /* [CP] Check Pods Manifest.lock */, 3F1FA83C28B60125009E246C /* Sources */, 3F1FA83D28B60125009E246C /* Frameworks */, 3F1FA83E28B60125009E246C /* Resources */, @@ -8767,7 +8778,7 @@ 3F1CA81B26C3542600228BF2 /* XCRemoteSwiftPackageReference "XCUITestHelpers" */, 174CA86827D90A6200126524 /* XCRemoteSwiftPackageReference "AutomatticAbout-swift" */, 3FFC5EAA2851942F00563C48 /* XCRemoteSwiftPackageReference "Charts" */, - 4598297F28574688003A9AFE /* XCRemoteSwiftPackageReference "Inject" */, + 4598297F28574688003A9AFE /* XCRemoteSwiftPackageReference "Inject.git" */, 3F2C8A17285B038800B1A5BB /* XCRemoteSwiftPackageReference "test-collector-swift" */, ); productRefGroup = B56DB3C72049BFAA00D4AA8E /* Products */; @@ -9124,6 +9135,28 @@ shellPath = /bin/bash; shellScript = "$SRCROOT/../Scripts/build-phases/swiftlint.sh\n"; }; + 5F0CE4E06C2CFA36FC2FD62B /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-StoreWidgetsExtension-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; 91990E72B3E1D58AC13D7628 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -10931,6 +10964,7 @@ }; 3F1FA85128B60126009E246C /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = DA1AE99A10B90748C7676E95 /* Pods-StoreWidgetsExtension.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; @@ -10963,6 +10997,7 @@ }; 3F1FA85228B60126009E246C /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 7D4CEC625891A6F236907541 /* Pods-StoreWidgetsExtension.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; @@ -10996,6 +11031,7 @@ }; 3F1FA85328B60126009E246C /* Release-Alpha */ = { isa = XCBuildConfiguration; + baseConfigurationReference = CB4839361AA061340BE98DA9 /* Pods-StoreWidgetsExtension.release-alpha.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; @@ -11660,7 +11696,7 @@ minimumVersion = 1.0.0; }; }; - 4598297F28574688003A9AFE /* XCRemoteSwiftPackageReference "Inject" */ = { + 4598297F28574688003A9AFE /* XCRemoteSwiftPackageReference "Inject.git" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/krzysztofzablocki/Inject.git"; requirement = { @@ -11746,7 +11782,7 @@ }; 4598298028574688003A9AFE /* Inject */ = { isa = XCSwiftPackageProductDependency; - package = 4598297F28574688003A9AFE /* XCRemoteSwiftPackageReference "Inject" */; + package = 4598297F28574688003A9AFE /* XCRemoteSwiftPackageReference "Inject.git" */; productName = Inject; }; 57150E0E24F462C200E81611 /* TestKit */ = { From d99ce72fb53e80a366a0d5aa7da4ac26735a67ce Mon Sep 17 00:00:00 2001 From: Ernesto Date: Wed, 31 Aug 2022 16:13:39 -0500 Subject: [PATCH 39/74] Adds store widget feature flag --- Experiments/Experiments/DefaultFeatureFlagService.swift | 2 ++ Experiments/Experiments/FeatureFlag.swift | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/Experiments/Experiments/DefaultFeatureFlagService.swift b/Experiments/Experiments/DefaultFeatureFlagService.swift index 5f8c96c6e87..41be8569225 100644 --- a/Experiments/Experiments/DefaultFeatureFlagService.swift +++ b/Experiments/Experiments/DefaultFeatureFlagService.swift @@ -51,6 +51,8 @@ public struct DefaultFeatureFlagService: FeatureFlagService { return true case .promptToEnableCodInIppOnboarding: return true + case .storeWidgets: + return buildConfig == .localDeveloper || buildConfig == .alpha default: return true } diff --git a/Experiments/Experiments/FeatureFlag.swift b/Experiments/Experiments/FeatureFlag.swift index 80b5365e47c..68b7c85dbc9 100644 --- a/Experiments/Experiments/FeatureFlag.swift +++ b/Experiments/Experiments/FeatureFlag.swift @@ -105,4 +105,8 @@ public enum FeatureFlag: Int { /// Whether to include the Cash on Delivery enable step in In-Person Payment onboarding /// case promptToEnableCodInIppOnboarding + + /// Enables home screen store widgets. + /// + case storeWidgets } From 023006647e029b21632e02eca65ef294775c6a9b Mon Sep 17 00:00:00 2001 From: Ernesto Date: Wed, 31 Aug 2022 16:49:26 -0500 Subject: [PATCH 40/74] Use store widgets feature flag --- WooCommerce/StoreWidgets/StoreInfoWidget.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/WooCommerce/StoreWidgets/StoreInfoWidget.swift b/WooCommerce/StoreWidgets/StoreInfoWidget.swift index 9e6e4d5b977..56fdb1d3df4 100644 --- a/WooCommerce/StoreWidgets/StoreInfoWidget.swift +++ b/WooCommerce/StoreWidgets/StoreInfoWidget.swift @@ -1,20 +1,20 @@ import WidgetKit import SwiftUI import WooFoundation +import Experiments /// Main StoreInfo Widget type. /// struct StoreInfoWidget: Widget { + + let enableWidgets = DefaultFeatureFlagService().isFeatureFlagEnabled(.storeWidgets) + var body: some WidgetConfiguration { StaticConfiguration(kind: "StoreInfoWidget", provider: StoreInfoProvider()) { entry in StoreInfoView(entry: entry) } .configurationDisplayName("Store Info") -#if RELEASE // TODO: Update this to use proper feature flags - .supportedFamilies([]) -#else - .supportedFamilies([.systemMedium]) -#endif + .supportedFamilies(enableWidgets ? [.systemMedium] : []) } } From 303500c5b256f82af396c0e1203ba53d4c8927db Mon Sep 17 00:00:00 2001 From: Ernesto Date: Thu, 1 Sep 2022 10:02:10 -0500 Subject: [PATCH 41/74] Update podfile checksum --- Podfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Podfile.lock b/Podfile.lock index a8131d3444f..bd50cc90f6c 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -179,6 +179,6 @@ SPEC CHECKSUMS: ZendeskSupportProvidersSDK: 2bdf8544f7cd0fd4c002546f5704b813845beb2a ZendeskSupportSDK: 3a8e508ab1d9dd22dc038df6c694466414e037ba -PODFILE CHECKSUM: b19d0819ac802c9fe278c88ccdde52f7a19a61b3 +PODFILE CHECKSUM: 4bdf9f791fbedc1074a7e20f9ff254db1f59c7ba COCOAPODS: 1.11.2 From a9ce63793ddc2590255682faa0c5c6d3af3a6278 Mon Sep 17 00:00:00 2001 From: Ernesto Date: Thu, 1 Sep 2022 10:04:18 -0500 Subject: [PATCH 42/74] Remove unwanted space --- Experiments/Experiments/FeatureFlag.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Experiments/Experiments/FeatureFlag.swift b/Experiments/Experiments/FeatureFlag.swift index 68b7c85dbc9..aae432460ee 100644 --- a/Experiments/Experiments/FeatureFlag.swift +++ b/Experiments/Experiments/FeatureFlag.swift @@ -105,7 +105,7 @@ public enum FeatureFlag: Int { /// Whether to include the Cash on Delivery enable step in In-Person Payment onboarding /// case promptToEnableCodInIppOnboarding - + /// Enables home screen store widgets. /// case storeWidgets From dd2b2a15f1c8c47c8d5d758e7e4ce55f37f0b8c5 Mon Sep 17 00:00:00 2001 From: Ernesto Carrion Date: Thu, 1 Sep 2022 10:46:36 -0500 Subject: [PATCH 43/74] Add experiments framework --- WooCommerce/WooCommerce.xcodeproj/project.pbxproj | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index 80faeb15138..d9ecf72c75b 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -588,6 +588,8 @@ 26CFDB2727357E8000AB940B /* SimplePaymentsSummary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26CFDB2627357E8000AB940B /* SimplePaymentsSummary.swift */; }; 26D9E54428C107F80098DF26 /* WooFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26D9E54328C107F80098DF26 /* WooFoundation.framework */; }; 26D9E54528C107F80098DF26 /* WooFoundation.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 26D9E54328C107F80098DF26 /* WooFoundation.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 26D9E54828C10A3B0098DF26 /* Experiments.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26D9E54728C10A3B0098DF26 /* Experiments.framework */; }; + 26D9E54928C10A3C0098DF26 /* Experiments.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 26D9E54728C10A3B0098DF26 /* Experiments.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 26DB7E3528636D2200506173 /* NonEditableOrderBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26DB7E3428636D2200506173 /* NonEditableOrderBanner.swift */; }; 26E0ADF12631D94D00A5EB3B /* TopBannerWrapperView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26E0ADF02631D94D00A5EB3B /* TopBannerWrapperView.swift */; }; 26E0AE13263359F900A5EB3B /* View+Conditionals.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26E0AE12263359F900A5EB3B /* View+Conditionals.swift */; }; @@ -1868,6 +1870,7 @@ dstSubfolderSpec = 10; files = ( 26D9E54528C107F80098DF26 /* WooFoundation.framework in Embed Frameworks */, + 26D9E54928C10A3C0098DF26 /* Experiments.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -2467,6 +2470,7 @@ 26CCBE0C2523C2560073F94D /* RefundProductsTotalTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RefundProductsTotalTableViewCell.xib; sourceTree = ""; }; 26CFDB2627357E8000AB940B /* SimplePaymentsSummary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimplePaymentsSummary.swift; sourceTree = ""; }; 26D9E54328C107F80098DF26 /* WooFoundation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = WooFoundation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 26D9E54728C10A3B0098DF26 /* Experiments.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Experiments.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 26DB7E3428636D2200506173 /* NonEditableOrderBanner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonEditableOrderBanner.swift; sourceTree = ""; }; 26E0ADF02631D94D00A5EB3B /* TopBannerWrapperView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopBannerWrapperView.swift; sourceTree = ""; }; 26E0AE12263359F900A5EB3B /* View+Conditionals.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+Conditionals.swift"; sourceTree = ""; }; @@ -3728,6 +3732,7 @@ 26D9E54428C107F80098DF26 /* WooFoundation.framework in Frameworks */, 3F1FA84228B60125009E246C /* WidgetKit.framework in Frameworks */, 8194A48313C34FE1782D51BC /* Pods_StoreWidgetsExtension.framework in Frameworks */, + 26D9E54828C10A3B0098DF26 /* Experiments.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -6324,6 +6329,7 @@ 88A44ABE866401E6DB03AC60 /* Frameworks */ = { isa = PBXGroup; children = ( + 26D9E54728C10A3B0098DF26 /* Experiments.framework */, 26D9E54328C107F80098DF26 /* WooFoundation.framework */, B9151B3E2840EB330036180F /* WooFoundation.framework */, 80E6FC6E276325F60086CD67 /* Clibsodium.xcframework */, @@ -8778,7 +8784,7 @@ 3F1CA81B26C3542600228BF2 /* XCRemoteSwiftPackageReference "XCUITestHelpers" */, 174CA86827D90A6200126524 /* XCRemoteSwiftPackageReference "AutomatticAbout-swift" */, 3FFC5EAA2851942F00563C48 /* XCRemoteSwiftPackageReference "Charts" */, - 4598297F28574688003A9AFE /* XCRemoteSwiftPackageReference "Inject.git" */, + 4598297F28574688003A9AFE /* XCRemoteSwiftPackageReference "Inject" */, 3F2C8A17285B038800B1A5BB /* XCRemoteSwiftPackageReference "test-collector-swift" */, ); productRefGroup = B56DB3C72049BFAA00D4AA8E /* Products */; @@ -11696,7 +11702,7 @@ minimumVersion = 1.0.0; }; }; - 4598297F28574688003A9AFE /* XCRemoteSwiftPackageReference "Inject.git" */ = { + 4598297F28574688003A9AFE /* XCRemoteSwiftPackageReference "Inject" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/krzysztofzablocki/Inject.git"; requirement = { @@ -11782,7 +11788,7 @@ }; 4598298028574688003A9AFE /* Inject */ = { isa = XCSwiftPackageProductDependency; - package = 4598297F28574688003A9AFE /* XCRemoteSwiftPackageReference "Inject.git" */; + package = 4598297F28574688003A9AFE /* XCRemoteSwiftPackageReference "Inject" */; productName = Inject; }; 57150E0E24F462C200E81611 /* TestKit */ = { From 96b24454456fd30450eb47314cfa7b38cd6dce5e Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 1 Sep 2022 16:52:52 +0100 Subject: [PATCH 44/74] Add Pay in Person toggle switch to release notes --- RELEASE-NOTES.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index f8210fcab26..9e65ac8c596 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -4,6 +4,7 @@ ----- - [*] Help center: Added help center web page with FAQs for "Enter Store Credentials" and "Enter WordPress.com email "screens. [https://github.com/woocommerce/woocommerce-ios/pull/7588, https://github.com/woocommerce/woocommerce-ios/pull/7590] - [*] In-Person Payments: Fixed the Learn More link from the `Enable Pay in Person` onboarding screen for WCPay [https://github.com/woocommerce/woocommerce-ios/pull/7598] +- [**] In-Person Payments: Added a switch for the Pay in Person payment method on the Payments menu. This allows you to accept In-Person Payments for website orders [https://github.com/woocommerce/woocommerce-ios/pull/7613] 10.1 ----- From b677121f8ed8a4f3772f0bdac485f631bedf4bfd Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 1 Sep 2022 17:47:11 +0100 Subject: [PATCH 45/74] =?UTF-8?q?Relabel=20Pay=20in=20Person=20toggle:=20r?= =?UTF-8?q?emove=20=E2=80=9CEnable=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../In-Person Payments/InPersonPaymentsMenuViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewController.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewController.swift index e1926c7998f..e537de52b11 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewController.swift @@ -469,7 +469,7 @@ private extension InPersonPaymentsMenuViewController { ) static let toggleEnableCashOnDelivery = NSLocalizedString( - "Enable Pay in Person", + "Pay in Person", comment: "Title for a switch on the In-Person Payments menu to enable Cash on Delivery" ) From 6bd194d96f5177c5acde60e862491ae0c53a9083 Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 1 Sep 2022 19:25:22 +0100 Subject: [PATCH 46/74] Clarify that Pay in Person toggle changes checkout --- .../In-Person Payments/InPersonPaymentsMenuViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewController.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewController.swift index e537de52b11..457e2d8710b 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsMenuViewController.swift @@ -474,7 +474,7 @@ private extension InPersonPaymentsMenuViewController { ) static let toggleEnableCashOnDeliveryLearnMoreFormat = NSLocalizedString( - "Pay in Person lets you accept card or cash payments on collection or delivery. %1$@", + "The Pay in Person checkout option lets you accept payments for website orders, on collection or delivery. %1$@", comment: "A label prompting users to learn more about adding Pay in Person to their checkout. " + "%1$@ is a placeholder that always replaced with \"Learn more\" string, " + "which should be translated separately and considered part of this sentence.") From a82f11a08df091deeda28f78845c3e992500db6b Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Fri, 2 Sep 2022 14:15:40 +1000 Subject: [PATCH 47/74] Remove comment regarding `template_name: 'Apple Pay Pass Suppression'` It was partly misleading. See conversation at https://github.com/woocommerce/woocommerce-ios/pull/7558/files#r957944888 --- fastlane/Fastfile | 7 ------- 1 file changed, 7 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 1dd2690de96..f586065ae01 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -953,13 +953,6 @@ platform :ios do type: 'appstore', team_id: get_required_env('EXT_EXPORT_TEAM_ID'), app_identifier: MAIN_BUNDLE_IDENTIFIERS, - # For a time, we used to have this parameter specifying a entitlements. - # In August 2022, `match` started being unable to generate new - # provisioning profiles and the only solution I found was to remove it. - # - # Leaving it here for future referece as something to try if `match` - # gives us trouble again. - # template_name: 'Apple Pay Pass Suppression' readonly: true ) end From 164594a38caa533e4689fba07010248de7e4a310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Vargas=20Casaseca?= Date: Fri, 2 Sep 2022 11:00:51 +0200 Subject: [PATCH 48/74] Make PaymentsRoute conform to Route to make the project compile. --- .../Classes/Universal Links/Routes/PaymentsRoute.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift b/WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift index cb5166efe3b..aaae3f34e2b 100644 --- a/WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift +++ b/WooCommerce/Classes/Universal Links/Routes/PaymentsRoute.swift @@ -5,7 +5,9 @@ import Foundation struct PaymentsRoute: Route { let path = "/payments" - func perform(with parameters: [String: String]) { + func perform(with parameters: [String: String]) -> Bool { MainTabBarController.presentPayments() + + return true } } From b8121c10b8ac36d2f9c7a865be62f678e7193cdf Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Fri, 2 Sep 2022 14:38:55 +0200 Subject: [PATCH 49/74] Remove redundant return --- WooCommerce/Classes/ViewRelated/MainTabBarController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/Classes/ViewRelated/MainTabBarController.swift b/WooCommerce/Classes/ViewRelated/MainTabBarController.swift index 972a9941666..477b39ffa97 100644 --- a/WooCommerce/Classes/ViewRelated/MainTabBarController.swift +++ b/WooCommerce/Classes/ViewRelated/MainTabBarController.swift @@ -52,7 +52,7 @@ extension WooTab { // Note: currently only the Dashboard tab (My Store) view controller is set up in Main.storyboard. private static func visibleTabs() -> [WooTab] { - return [.myStore, .orders, .products, .hubMenu] + [.myStore, .orders, .products, .hubMenu] } } From 8d3e6f17035e19d43add6c1a0e86d6050b31e5a0 Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Fri, 2 Sep 2022 14:56:44 +0200 Subject: [PATCH 50/74] Delete unused NSLocalizedString --- .../Dashboard/Settings/Settings/SettingsViewModel.swift | 6 ------ 1 file changed, 6 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Settings/SettingsViewModel.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Settings/SettingsViewModel.swift index 7da32aea09e..c4424c5867f 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Settings/SettingsViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Settings/SettingsViewModel.swift @@ -356,12 +356,6 @@ private extension SettingsViewModel { // private extension SettingsViewModel { enum Localization { - static let selectedStoreTitle = NSLocalizedString( - "Selected Store", - comment: "My Store > Settings > Selected Store information section. " + - "This is the heading listed above the information row that displays the store website and their username." - ).uppercased() - static let pluginsTitle = NSLocalizedString( "Plugins", comment: "My Store > Settings > Plugins section title" From 85464debdd41207208b25ac9c0d7c324c463cdc0 Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Fri, 2 Sep 2022 15:01:22 +0200 Subject: [PATCH 51/74] Rename unit test meaningfully after flag removal --- .../ViewRelated/MainTabBarControllerTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift index 0d308c2782b..96142f72769 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift @@ -68,7 +68,7 @@ final class MainTabBarControllerTests: XCTestCase { isAnInstanceOf: HubMenuViewController.self) } - func test_tab_view_controllers_returns_expected_values_with_hub_menu_enabled() { + func test_tab_view_controllers_returns_expected_values() { // Arrange // Sets mock `FeatureFlagService` before `MainTabBarController` is initialized so that the feature flags are set correctly. let featureFlagService = MockFeatureFlagService() From ea09b66d995e283b9682787e8f5a4efe37a2514a Mon Sep 17 00:00:00 2001 From: Anitaa Murthy Date: Fri, 2 Sep 2022 19:16:10 +0530 Subject: [PATCH 52/74] Updated release notes for 10.2 --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6316b378e90..f4c8c94f3b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ Contains editorialized release notes. Raw release notes should go into `RELEASE-NOTES.txt`. --> +## 10.2 +Even though this release doesn’t have any new features, we still put a lot of love into it! You can now enable or disable the option to take card or cash payments on collection or delivery. We also added a new Help Center page that makes it easier for you to login to the app. + ## 10.1 This release has several fixes that makes it easier for you to take payments from the app. We’ve also added a new Help Center FAQ page that makes it easier for you to login to the app. Please continue to send us feedback – we are listening! From 7c373c5d36627daea164714c7f83956b156156cf Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 2 Sep 2022 14:10:34 -0400 Subject: [PATCH 53/74] =?UTF-8?q?Update=20app=20translations=20=E2=80=93?= =?UTF-8?q?=20`Localizable.strings`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Resources/ar.lproj/Localizable.strings | 19 +++++++++++++++++-- .../Resources/de.lproj/Localizable.strings | 19 +++++++++++++++++-- .../Resources/es.lproj/Localizable.strings | 19 +++++++++++++++++-- .../Resources/fr.lproj/Localizable.strings | 19 +++++++++++++++++-- .../Resources/he.lproj/Localizable.strings | 19 +++++++++++++++++-- .../Resources/id.lproj/Localizable.strings | 19 +++++++++++++++++-- .../Resources/it.lproj/Localizable.strings | 19 +++++++++++++++++-- .../Resources/ja.lproj/Localizable.strings | 19 +++++++++++++++++-- .../Resources/ko.lproj/Localizable.strings | 19 +++++++++++++++++-- .../Resources/nl.lproj/Localizable.strings | 19 +++++++++++++++++-- .../Resources/pt-BR.lproj/Localizable.strings | 19 +++++++++++++++++-- .../Resources/ru.lproj/Localizable.strings | 19 +++++++++++++++++-- .../Resources/sv.lproj/Localizable.strings | 19 +++++++++++++++++-- .../Resources/tr.lproj/Localizable.strings | 19 +++++++++++++++++-- .../zh-Hans.lproj/Localizable.strings | 19 +++++++++++++++++-- .../zh-Hant.lproj/Localizable.strings | 19 +++++++++++++++++-- 16 files changed, 272 insertions(+), 32 deletions(-) diff --git a/WooCommerce/Resources/ar.lproj/Localizable.strings b/WooCommerce/Resources/ar.lproj/Localizable.strings index f22ddc83bbb..c4f65ddcab0 100644 --- a/WooCommerce/Resources/ar.lproj/Localizable.strings +++ b/WooCommerce/Resources/ar.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-23 09:54:03+0000 */ +/* Translation-Revision-Date: 2022-08-30 15:54:03+0000 */ /* Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5; */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: ar */ @@ -2007,6 +2007,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "فشل حذف القسيمة. يرجى المحاولة مجددًا."; +/* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ +"Failed to enable Pay in Person. Please try again later." = "فشل تمكين الدفع بشكل شخصي. يرجى المحاولة مرة أخرى لاحقًا."; + /* Error message on the Issue Refund screen when fetching the charge details failed */ "Failed to fetch your charge details. Please try again." = "فشل إحضار تفاصيل الدفع الخاصة بك. يرجى المحاولة مرة أخرى."; @@ -2525,6 +2528,9 @@ which should be translated separately and considered part of this sentence. */ /* An error message shown when a wpcom user provides the wrong password. */ "It seems like you've entered an incorrect password. Want to give it another try?" = "يبدو أنك أدخلت كلمة مرور غير صحيحة. هل ترغب في تجربته مرة أخرى؟"; +/* An error message displayed when the user tries to log in to the app with a simple WP.com site. Reads like: It seems that your site google.com is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce. */ +"It seems that your site %@ is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce." = "يبدو أن موقعك %@ عبارة عن موقع ووردبريس.كوم بسيط يتعذر عليه تثبيت إضافات. يرجى ترقية خطتك لاستخدام WooCommerce."; + /* Accessibility label for italic button on formatting toolbar. */ "Italic" = "مائل"; @@ -2694,7 +2700,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Action button that will restart the login flow.Presented when logging in with a site address that appears to be invalid. Action button that will restart the login flow.Presented when logging in with a site address that does not have a valid Jetpack installation - Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce */ + Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce + Action button that will restart the login flow.Presented when the user tries to log in to the app with a simple WP.com site. */ "Log In With Another Account" = "تسجيل الدخول باستخدام حساب آخر"; /* Action button triggering a Log Out.Presented when logging in with a store address that does not match the account entered @@ -3329,6 +3336,13 @@ This part is the link to the website, and forms part of a longer sentence which /* Paste without Formatting Menu Item */ "Paste without Formatting" = "اللصق من دون تنسيق"; +/* Customer-facing description showing more details about the Pay in Person option which is added to the store checkout when the merchant enables Pay in Person + Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ +"Pay by card or another accepted payment method" = "الدفع باستخدام بطاقة أو طريقة دفع أخرى مقبولة"; + +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +"Pay in Person" = "الدفع بشكل شخصي"; + /* Payment section title Title text of the row that shows the payment headline when creating a simple payment Title text of the section that shows Payment details when creating a new order */ @@ -3993,6 +4007,7 @@ This part is the link to the website, and forms part of a longer sentence which Button to retry when there was a network error checking In-Person Payments requirements Retry Action Retry action for an error notice + Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "إعادة المحاولة"; diff --git a/WooCommerce/Resources/de.lproj/Localizable.strings b/WooCommerce/Resources/de.lproj/Localizable.strings index 5401d7b8732..7dba7756a9e 100644 --- a/WooCommerce/Resources/de.lproj/Localizable.strings +++ b/WooCommerce/Resources/de.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-23 11:54:03+0000 */ +/* Translation-Revision-Date: 2022-08-31 11:54:04+0000 */ /* Plural-Forms: nplurals=2; plural=n != 1; */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: de */ @@ -2007,6 +2007,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "Gutschein konnte nicht gelöscht werden. Versuche es bitte noch einmal."; +/* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ +"Failed to enable Pay in Person. Please try again later." = "Persönliche Zahlung konnte nicht aktiviert werden. Versuch es später noch einmal."; + /* Error message on the Issue Refund screen when fetching the charge details failed */ "Failed to fetch your charge details. Please try again." = "Details zur Belastung konnten nicht abgerufen werden. Bitte versuche es erneut."; @@ -2525,6 +2528,9 @@ which should be translated separately and considered part of this sentence. */ /* An error message shown when a wpcom user provides the wrong password. */ "It seems like you've entered an incorrect password. Want to give it another try?" = "Scheinbar hast du ein falsches Passwort eingegeben. Möchtest du es noch einmal versuchen?"; +/* An error message displayed when the user tries to log in to the app with a simple WP.com site. Reads like: It seems that your site google.com is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce. */ +"It seems that your site %@ is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce." = "Bei deiner Website %@ handelt es sich offenbar um eine einfache WordPress.com-Website, für die keine Plugins installiert werden können. Bitte aktualisiere deinen Tarif, um WooCommerce zu nutzen."; + /* Accessibility label for italic button on formatting toolbar. */ "Italic" = "Kursiv"; @@ -2694,7 +2700,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Action button that will restart the login flow.Presented when logging in with a site address that appears to be invalid. Action button that will restart the login flow.Presented when logging in with a site address that does not have a valid Jetpack installation - Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce */ + Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce + Action button that will restart the login flow.Presented when the user tries to log in to the app with a simple WP.com site. */ "Log In With Another Account" = "Mit einem anderen Konto anmelden"; /* Action button triggering a Log Out.Presented when logging in with a store address that does not match the account entered @@ -3329,6 +3336,13 @@ This part is the link to the website, and forms part of a longer sentence which /* Paste without Formatting Menu Item */ "Paste without Formatting" = "Ohne Formatierung einfügen"; +/* Customer-facing description showing more details about the Pay in Person option which is added to the store checkout when the merchant enables Pay in Person + Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ +"Pay by card or another accepted payment method" = "Kartenzahlung oder eine andere akzeptierte Zahlungsmethode"; + +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +"Pay in Person" = "Persönliche Zahlung"; + /* Payment section title Title text of the row that shows the payment headline when creating a simple payment Title text of the section that shows Payment details when creating a new order */ @@ -3993,6 +4007,7 @@ This part is the link to the website, and forms part of a longer sentence which Button to retry when there was a network error checking In-Person Payments requirements Retry Action Retry action for an error notice + Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Erneut versuchen"; diff --git a/WooCommerce/Resources/es.lproj/Localizable.strings b/WooCommerce/Resources/es.lproj/Localizable.strings index 3e52d1f11be..6e926ba1e53 100644 --- a/WooCommerce/Resources/es.lproj/Localizable.strings +++ b/WooCommerce/Resources/es.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-26 11:54:03+0000 */ +/* Translation-Revision-Date: 2022-08-31 09:54:04+0000 */ /* Plural-Forms: nplurals=2; plural=n != 1; */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: es */ @@ -2007,6 +2007,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "No se ha podido eliminar el cupón. Inténtalo de nuevo."; +/* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ +"Failed to enable Pay in Person. Please try again later." = "No se ha podido activar Pagos en persona. Inténtalo de nuevo más tarde."; + /* Error message on the Issue Refund screen when fetching the charge details failed */ "Failed to fetch your charge details. Please try again." = "Se ha producido un error al recuperar los detalles del cargo. Inténtalo de nuevo más tarde."; @@ -2525,6 +2528,9 @@ which should be translated separately and considered part of this sentence. */ /* An error message shown when a wpcom user provides the wrong password. */ "It seems like you've entered an incorrect password. Want to give it another try?" = "Parece que has introducido una contraseña incorrecta ¿Quieres intentarlo de nuevo?"; +/* An error message displayed when the user tries to log in to the app with a simple WP.com site. Reads like: It seems that your site google.com is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce. */ +"It seems that your site %@ is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce." = "Parece que tu sitio %@ es un sitio sencillo de WordPress.com que no puede instalar plugins. Mejora tu plan para usar WooCommerce."; + /* Accessibility label for italic button on formatting toolbar. */ "Italic" = "Cursiva"; @@ -2694,7 +2700,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Action button that will restart the login flow.Presented when logging in with a site address that appears to be invalid. Action button that will restart the login flow.Presented when logging in with a site address that does not have a valid Jetpack installation - Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce */ + Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce + Action button that will restart the login flow.Presented when the user tries to log in to the app with a simple WP.com site. */ "Log In With Another Account" = "Acceder con otra cuenta"; /* Action button triggering a Log Out.Presented when logging in with a store address that does not match the account entered @@ -3329,6 +3336,13 @@ This part is the link to the website, and forms part of a longer sentence which /* Paste without Formatting Menu Item */ "Paste without Formatting" = "Pegar sin formato"; +/* Customer-facing description showing more details about the Pay in Person option which is added to the store checkout when the merchant enables Pay in Person + Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ +"Pay by card or another accepted payment method" = "Paga con tarjeta u otro método de pago aceptado"; + +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +"Pay in Person" = "Pagos en persona"; + /* Payment section title Title text of the row that shows the payment headline when creating a simple payment Title text of the section that shows Payment details when creating a new order */ @@ -3993,6 +4007,7 @@ This part is the link to the website, and forms part of a longer sentence which Button to retry when there was a network error checking In-Person Payments requirements Retry Action Retry action for an error notice + Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Reintentar"; diff --git a/WooCommerce/Resources/fr.lproj/Localizable.strings b/WooCommerce/Resources/fr.lproj/Localizable.strings index d0e1552259c..7405cdc2cc9 100644 --- a/WooCommerce/Resources/fr.lproj/Localizable.strings +++ b/WooCommerce/Resources/fr.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-23 15:54:03+0000 */ +/* Translation-Revision-Date: 2022-08-31 11:54:03+0000 */ /* Plural-Forms: nplurals=2; plural=n > 1; */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: fr */ @@ -2007,6 +2007,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "Échec de la suppression du code promo. Veuillez réessayer."; +/* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ +"Failed to enable Pay in Person. Please try again later." = "Échec de l’activation de la fonctionnalité Payer en personne. Veuillez réessayer ultérieurement."; + /* Error message on the Issue Refund screen when fetching the charge details failed */ "Failed to fetch your charge details. Please try again." = "Impossible d’extraire vos données de facturation. Veuillez réessayer."; @@ -2525,6 +2528,9 @@ which should be translated separately and considered part of this sentence. */ /* An error message shown when a wpcom user provides the wrong password. */ "It seems like you've entered an incorrect password. Want to give it another try?" = "Il semblerait que vous avez saisi un mot de passe incorrect. Voulez-vous réessayer ?"; +/* An error message displayed when the user tries to log in to the app with a simple WP.com site. Reads like: It seems that your site google.com is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce. */ +"It seems that your site %@ is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce." = "Il semble que votre site %@ soit un site WordPress.com simple qui ne prend pas en charge les extensions. Veuillez choisir une option payante pour votre plan afin de pouvoir utiliser WooCommerce."; + /* Accessibility label for italic button on formatting toolbar. */ "Italic" = "Italique"; @@ -2694,7 +2700,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Action button that will restart the login flow.Presented when logging in with a site address that appears to be invalid. Action button that will restart the login flow.Presented when logging in with a site address that does not have a valid Jetpack installation - Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce */ + Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce + Action button that will restart the login flow.Presented when the user tries to log in to the app with a simple WP.com site. */ "Log In With Another Account" = "Se connecter avec un autre compte"; /* Action button triggering a Log Out.Presented when logging in with a store address that does not match the account entered @@ -3329,6 +3336,13 @@ This part is the link to the website, and forms part of a longer sentence which /* Paste without Formatting Menu Item */ "Paste without Formatting" = "Coller en texte brut"; +/* Customer-facing description showing more details about the Pay in Person option which is added to the store checkout when the merchant enables Pay in Person + Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ +"Pay by card or another accepted payment method" = "Payer par carte ou à l’aide d’un autre moyen de paiement accepté"; + +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +"Pay in Person" = "Payer en personne"; + /* Payment section title Title text of the row that shows the payment headline when creating a simple payment Title text of the section that shows Payment details when creating a new order */ @@ -3993,6 +4007,7 @@ This part is the link to the website, and forms part of a longer sentence which Button to retry when there was a network error checking In-Person Payments requirements Retry Action Retry action for an error notice + Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Réessayer"; diff --git a/WooCommerce/Resources/he.lproj/Localizable.strings b/WooCommerce/Resources/he.lproj/Localizable.strings index 852c3f3ab20..5176dcfa604 100644 --- a/WooCommerce/Resources/he.lproj/Localizable.strings +++ b/WooCommerce/Resources/he.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-23 13:54:04+0000 */ +/* Translation-Revision-Date: 2022-08-31 14:54:03+0000 */ /* Plural-Forms: nplurals=2; plural=n != 1; */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: he_IL */ @@ -2007,6 +2007,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "מחיקת הקופון נכשלה. יש לנסות שוב."; +/* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ +"Failed to enable Pay in Person. Please try again later." = "לא ניתן היה להפעיל 'תשלום באופן אישי'. יש לנסות שוב מאוחר יותר."; + /* Error message on the Issue Refund screen when fetching the charge details failed */ "Failed to fetch your charge details. Please try again." = "לא ניתן היה להביא את פרטי החיוב. יש לנסות שוב."; @@ -2525,6 +2528,9 @@ which should be translated separately and considered part of this sentence. */ /* An error message shown when a wpcom user provides the wrong password. */ "It seems like you've entered an incorrect password. Want to give it another try?" = "כנראה שהזנת סיסמה שגויה. רוצה לנסות שוב?"; +/* An error message displayed when the user tries to log in to the app with a simple WP.com site. Reads like: It seems that your site google.com is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce. */ +"It seems that your site %@ is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce." = "נראה שהאתר שלך, %@, הוא אתר WordPress.com פשוט שלא יכול להתקין תוספים. עליך לשדרג את התוכנית שלך כדי להשתמש ב-WooCommerce."; + /* Accessibility label for italic button on formatting toolbar. */ "Italic" = "נטוי"; @@ -2694,7 +2700,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Action button that will restart the login flow.Presented when logging in with a site address that appears to be invalid. Action button that will restart the login flow.Presented when logging in with a site address that does not have a valid Jetpack installation - Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce */ + Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce + Action button that will restart the login flow.Presented when the user tries to log in to the app with a simple WP.com site. */ "Log In With Another Account" = "להתחבר עם חשבון אחר"; /* Action button triggering a Log Out.Presented when logging in with a store address that does not match the account entered @@ -3329,6 +3336,13 @@ This part is the link to the website, and forms part of a longer sentence which /* Paste without Formatting Menu Item */ "Paste without Formatting" = "הדבקה בלי העיצוב"; +/* Customer-facing description showing more details about the Pay in Person option which is added to the store checkout when the merchant enables Pay in Person + Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ +"Pay by card or another accepted payment method" = "לשלם באמצעות כרטיס או עם אמצעי תשלום נתמך אחר"; + +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +"Pay in Person" = "תשלום באופן אישי"; + /* Payment section title Title text of the row that shows the payment headline when creating a simple payment Title text of the section that shows Payment details when creating a new order */ @@ -3993,6 +4007,7 @@ This part is the link to the website, and forms part of a longer sentence which Button to retry when there was a network error checking In-Person Payments requirements Retry Action Retry action for an error notice + Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "נסה שנית"; diff --git a/WooCommerce/Resources/id.lproj/Localizable.strings b/WooCommerce/Resources/id.lproj/Localizable.strings index 67089c07cb6..e4320614e17 100644 --- a/WooCommerce/Resources/id.lproj/Localizable.strings +++ b/WooCommerce/Resources/id.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-23 11:54:04+0000 */ +/* Translation-Revision-Date: 2022-09-02 09:54:03+0000 */ /* Plural-Forms: nplurals=2; plural=n > 1; */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: id */ @@ -2007,6 +2007,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "Gagal menghapus kupon. Mohon ulangi."; +/* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ +"Failed to enable Pay in Person. Please try again later." = "Gagal mengaktifkan Pembayaran Langsung. Silakan coba lagi nanti."; + /* Error message on the Issue Refund screen when fetching the charge details failed */ "Failed to fetch your charge details. Please try again." = "Gagal mengambil detail tagihan Anda. Silakan coba lagi."; @@ -2525,6 +2528,9 @@ which should be translated separately and considered part of this sentence. */ /* An error message shown when a wpcom user provides the wrong password. */ "It seems like you've entered an incorrect password. Want to give it another try?" = "Sepertinya Anda memasukkan kata sandi yang salah. Ingin mencoba lagi?"; +/* An error message displayed when the user tries to log in to the app with a simple WP.com site. Reads like: It seems that your site google.com is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce. */ +"It seems that your site %@ is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce." = "Sepertinya situs %@ Anda adalah situs WordPress.com sederhana yang tidak dapat menginstal plugin. Upgrade paket Anda untuk dapat menggunakan WooCommerce."; + /* Accessibility label for italic button on formatting toolbar. */ "Italic" = "Miring"; @@ -2694,7 +2700,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Action button that will restart the login flow.Presented when logging in with a site address that appears to be invalid. Action button that will restart the login flow.Presented when logging in with a site address that does not have a valid Jetpack installation - Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce */ + Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce + Action button that will restart the login flow.Presented when the user tries to log in to the app with a simple WP.com site. */ "Log In With Another Account" = "Login Dengan Akun Lain"; /* Action button triggering a Log Out.Presented when logging in with a store address that does not match the account entered @@ -3329,6 +3336,13 @@ This part is the link to the website, and forms part of a longer sentence which /* Paste without Formatting Menu Item */ "Paste without Formatting" = "Tempel tanpa Format"; +/* Customer-facing description showing more details about the Pay in Person option which is added to the store checkout when the merchant enables Pay in Person + Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ +"Pay by card or another accepted payment method" = "Bayar menggunakan kartu atau metode pembayaran lain yang diterima"; + +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +"Pay in Person" = "Pembayaran Langsung"; + /* Payment section title Title text of the row that shows the payment headline when creating a simple payment Title text of the section that shows Payment details when creating a new order */ @@ -3993,6 +4007,7 @@ This part is the link to the website, and forms part of a longer sentence which Button to retry when there was a network error checking In-Person Payments requirements Retry Action Retry action for an error notice + Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Coba Lagi"; diff --git a/WooCommerce/Resources/it.lproj/Localizable.strings b/WooCommerce/Resources/it.lproj/Localizable.strings index bcf1a634b8a..2e0a7f0dbaa 100644 --- a/WooCommerce/Resources/it.lproj/Localizable.strings +++ b/WooCommerce/Resources/it.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-23 15:54:03+0000 */ +/* Translation-Revision-Date: 2022-08-29 15:54:03+0000 */ /* Plural-Forms: nplurals=2; plural=n != 1; */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: it */ @@ -2007,6 +2007,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "Impossibile eliminare il codice promozionale. Riprova."; +/* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ +"Failed to enable Pay in Person. Please try again later." = "Impossibile attivare Paga di persona. Riprova più tardi."; + /* Error message on the Issue Refund screen when fetching the charge details failed */ "Failed to fetch your charge details. Please try again." = "Recupero dei dettagli dell'addebito non riuscito. Riprova."; @@ -2525,6 +2528,9 @@ which should be translated separately and considered part of this sentence. */ /* An error message shown when a wpcom user provides the wrong password. */ "It seems like you've entered an incorrect password. Want to give it another try?" = "Sembra che tu abbia immesso una password errata. Vuoi riprovare?"; +/* An error message displayed when the user tries to log in to the app with a simple WP.com site. Reads like: It seems that your site google.com is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce. */ +"It seems that your site %@ is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce." = "Sembra che il tuo sito %@ sia un semplice sito WordPress.com che non può installare plugin. Aggiorna il tuo piano per utilizzare WooCommerce."; + /* Accessibility label for italic button on formatting toolbar. */ "Italic" = "Corsivo"; @@ -2694,7 +2700,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Action button that will restart the login flow.Presented when logging in with a site address that appears to be invalid. Action button that will restart the login flow.Presented when logging in with a site address that does not have a valid Jetpack installation - Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce */ + Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce + Action button that will restart the login flow.Presented when the user tries to log in to the app with a simple WP.com site. */ "Log In With Another Account" = "Accedi con un altro account"; /* Action button triggering a Log Out.Presented when logging in with a store address that does not match the account entered @@ -3329,6 +3336,13 @@ This part is the link to the website, and forms part of a longer sentence which /* Paste without Formatting Menu Item */ "Paste without Formatting" = "Incolla senza formattazione"; +/* Customer-facing description showing more details about the Pay in Person option which is added to the store checkout when the merchant enables Pay in Person + Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ +"Pay by card or another accepted payment method" = "Paga con carta o un altro metodo di pagamento accettato"; + +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +"Pay in Person" = "Paga di persona"; + /* Payment section title Title text of the row that shows the payment headline when creating a simple payment Title text of the section that shows Payment details when creating a new order */ @@ -3993,6 +4007,7 @@ This part is the link to the website, and forms part of a longer sentence which Button to retry when there was a network error checking In-Person Payments requirements Retry Action Retry action for an error notice + Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Riprova"; diff --git a/WooCommerce/Resources/ja.lproj/Localizable.strings b/WooCommerce/Resources/ja.lproj/Localizable.strings index a4577c3c7c5..ef03cd2161a 100644 --- a/WooCommerce/Resources/ja.lproj/Localizable.strings +++ b/WooCommerce/Resources/ja.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-25 09:54:03+0000 */ +/* Translation-Revision-Date: 2022-08-30 11:54:02+0000 */ /* Plural-Forms: nplurals=1; plural=0; */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: ja_JP */ @@ -2007,6 +2007,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "クーポンの削除に失敗しました。 再度お試しください。"; +/* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ +"Failed to enable Pay in Person. Please try again later." = "直接支払いを有効化できませんでした。 後でやり直してください。"; + /* Error message on the Issue Refund screen when fetching the charge details failed */ "Failed to fetch your charge details. Please try again." = "料金の詳細を取得できませんでした。 もう一度お試しください。"; @@ -2525,6 +2528,9 @@ which should be translated separately and considered part of this sentence. */ /* An error message shown when a wpcom user provides the wrong password. */ "It seems like you've entered an incorrect password. Want to give it another try?" = "入力したパスワードが正しくないようです。もう一度試しますか ?"; +/* An error message displayed when the user tries to log in to the app with a simple WP.com site. Reads like: It seems that your site google.com is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce. */ +"It seems that your site %@ is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce." = "ご利用のサイト %@ は、プラグインをインストールできない簡易版の WordPress.com サイトのようです。 WooCommerce を使用するには、プランをアップグレードしてください。"; + /* Accessibility label for italic button on formatting toolbar. */ "Italic" = "斜体"; @@ -2694,7 +2700,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Action button that will restart the login flow.Presented when logging in with a site address that appears to be invalid. Action button that will restart the login flow.Presented when logging in with a site address that does not have a valid Jetpack installation - Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce */ + Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce + Action button that will restart the login flow.Presented when the user tries to log in to the app with a simple WP.com site. */ "Log In With Another Account" = "別のアカウントでログイン"; /* Action button triggering a Log Out.Presented when logging in with a store address that does not match the account entered @@ -3329,6 +3336,13 @@ This part is the link to the website, and forms part of a longer sentence which /* Paste without Formatting Menu Item */ "Paste without Formatting" = "書式を解除して貼り付け"; +/* Customer-facing description showing more details about the Pay in Person option which is added to the store checkout when the merchant enables Pay in Person + Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ +"Pay by card or another accepted payment method" = "カードまたはその他の承認された支払い方法で支払う"; + +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +"Pay in Person" = "直接支払い"; + /* Payment section title Title text of the row that shows the payment headline when creating a simple payment Title text of the section that shows Payment details when creating a new order */ @@ -3993,6 +4007,7 @@ This part is the link to the website, and forms part of a longer sentence which Button to retry when there was a network error checking In-Person Payments requirements Retry Action Retry action for an error notice + Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "再度試す"; diff --git a/WooCommerce/Resources/ko.lproj/Localizable.strings b/WooCommerce/Resources/ko.lproj/Localizable.strings index 738c81915e5..ea7e8d63b80 100644 --- a/WooCommerce/Resources/ko.lproj/Localizable.strings +++ b/WooCommerce/Resources/ko.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-23 13:54:04+0000 */ +/* Translation-Revision-Date: 2022-08-31 09:54:04+0000 */ /* Plural-Forms: nplurals=1; plural=0; */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: ko_KR */ @@ -2007,6 +2007,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "쿠폰을 삭제하지 못했습니다. 다시 시도하세요."; +/* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ +"Failed to enable Pay in Person. Please try again later." = "대면 결제 활성화 실패 나중에 다시 시도하세요."; + /* Error message on the Issue Refund screen when fetching the charge details failed */ "Failed to fetch your charge details. Please try again." = "비용 청구 상세 정보를 가져오지 못했습니다. 다시 시도하세요."; @@ -2525,6 +2528,9 @@ which should be translated separately and considered part of this sentence. */ /* An error message shown when a wpcom user provides the wrong password. */ "It seems like you've entered an incorrect password. Want to give it another try?" = "잘못된 비밀번호를 입력하신 것 같습니다. 다시 시도해보시겠어요?"; +/* An error message displayed when the user tries to log in to the app with a simple WP.com site. Reads like: It seems that your site google.com is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce. */ +"It seems that your site %@ is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce." = "%@ 사이트가 플러그인을 설치할 수 없는 간이 워드프레스닷컴 사이트인 것으로 보입니다. 요금제를 업그레이드하여 우커머스를 사용하세요."; + /* Accessibility label for italic button on formatting toolbar. */ "Italic" = "이탤릭체"; @@ -2694,7 +2700,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Action button that will restart the login flow.Presented when logging in with a site address that appears to be invalid. Action button that will restart the login flow.Presented when logging in with a site address that does not have a valid Jetpack installation - Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce */ + Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce + Action button that will restart the login flow.Presented when the user tries to log in to the app with a simple WP.com site. */ "Log In With Another Account" = "다른 계정으로 로그인"; /* Action button triggering a Log Out.Presented when logging in with a store address that does not match the account entered @@ -3329,6 +3336,13 @@ This part is the link to the website, and forms part of a longer sentence which /* Paste without Formatting Menu Item */ "Paste without Formatting" = "서식없이 붙여넣기"; +/* Customer-facing description showing more details about the Pay in Person option which is added to the store checkout when the merchant enables Pay in Person + Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ +"Pay by card or another accepted payment method" = "카드 또는 수락되는 다른 결제 수단으로 결제"; + +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +"Pay in Person" = "대면 결제"; + /* Payment section title Title text of the row that shows the payment headline when creating a simple payment Title text of the section that shows Payment details when creating a new order */ @@ -3993,6 +4007,7 @@ This part is the link to the website, and forms part of a longer sentence which Button to retry when there was a network error checking In-Person Payments requirements Retry Action Retry action for an error notice + Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "재실행"; diff --git a/WooCommerce/Resources/nl.lproj/Localizable.strings b/WooCommerce/Resources/nl.lproj/Localizable.strings index a1d06c489cc..2f9ce9231c5 100644 --- a/WooCommerce/Resources/nl.lproj/Localizable.strings +++ b/WooCommerce/Resources/nl.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-26 17:13:03+0000 */ +/* Translation-Revision-Date: 2022-08-31 16:54:05+0000 */ /* Plural-Forms: nplurals=2; plural=n != 1; */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: nl */ @@ -2007,6 +2007,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "Verwijderen van coupon mislukt. Probeer het nog eens."; +/* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ +"Failed to enable Pay in Person. Please try again later." = "Inschakelen van fysieke betalingen mislukt. Probeer het later opnieuw."; + /* Error message on the Issue Refund screen when fetching the charge details failed */ "Failed to fetch your charge details. Please try again." = "Er is een fout opgetreden bij het ophalen van de gegevens van het bedrag. Probeer het nog eens."; @@ -2525,6 +2528,9 @@ which should be translated separately and considered part of this sentence. */ /* An error message shown when a wpcom user provides the wrong password. */ "It seems like you've entered an incorrect password. Want to give it another try?" = "Het lijkt erop dat je een onjuist wachtwoord hebt ingevoerd. Wil je het nog eens proberen?"; +/* An error message displayed when the user tries to log in to the app with a simple WP.com site. Reads like: It seems that your site google.com is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce. */ +"It seems that your site %@ is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce." = "Het lijkt erop dat je site %@ een eenvoudige WordPress.com-site is die geen plugins kan installeren. Upgrade je abonnement om WooCommerce te kunnen gebruiken"; + /* Accessibility label for italic button on formatting toolbar. */ "Italic" = "Cursief"; @@ -2694,7 +2700,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Action button that will restart the login flow.Presented when logging in with a site address that appears to be invalid. Action button that will restart the login flow.Presented when logging in with a site address that does not have a valid Jetpack installation - Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce */ + Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce + Action button that will restart the login flow.Presented when the user tries to log in to the app with a simple WP.com site. */ "Log In With Another Account" = "Log in met een ander account"; /* Action button triggering a Log Out.Presented when logging in with a store address that does not match the account entered @@ -3329,6 +3336,13 @@ This part is the link to the website, and forms part of a longer sentence which /* Paste without Formatting Menu Item */ "Paste without Formatting" = "Plakken zonder formatteren"; +/* Customer-facing description showing more details about the Pay in Person option which is added to the store checkout when the merchant enables Pay in Person + Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ +"Pay by card or another accepted payment method" = "Met een kaart of andere geaccepteerde betaalmethode betalen"; + +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +"Pay in Person" = "Fysiek betalen"; + /* Payment section title Title text of the row that shows the payment headline when creating a simple payment Title text of the section that shows Payment details when creating a new order */ @@ -3993,6 +4007,7 @@ This part is the link to the website, and forms part of a longer sentence which Button to retry when there was a network error checking In-Person Payments requirements Retry Action Retry action for an error notice + Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Opnieuw"; diff --git a/WooCommerce/Resources/pt-BR.lproj/Localizable.strings b/WooCommerce/Resources/pt-BR.lproj/Localizable.strings index c88957a1e45..372c66a84e4 100644 --- a/WooCommerce/Resources/pt-BR.lproj/Localizable.strings +++ b/WooCommerce/Resources/pt-BR.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-22 20:54:03+0000 */ +/* Translation-Revision-Date: 2022-08-31 19:54:03+0000 */ /* Plural-Forms: nplurals=2; plural=(n > 1); */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: pt_BR */ @@ -2007,6 +2007,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "Falha ao excluir cupom. Tente novamente."; +/* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ +"Failed to enable Pay in Person. Please try again later." = "Falha ao ativar o Pagamento presencial. Tente novamente mais tarde."; + /* Error message on the Issue Refund screen when fetching the charge details failed */ "Failed to fetch your charge details. Please try again." = "Falha ao buscar detalhes da cobrança. Tente novamente."; @@ -2525,6 +2528,9 @@ which should be translated separately and considered part of this sentence. */ /* An error message shown when a wpcom user provides the wrong password. */ "It seems like you've entered an incorrect password. Want to give it another try?" = "Parece que você digitou com uma senha incorreta. Quer tentar novamente?"; +/* An error message displayed when the user tries to log in to the app with a simple WP.com site. Reads like: It seems that your site google.com is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce. */ +"It seems that your site %@ is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce." = "Parece que seu site %@ é um WordPress.com simples não compatível com plugins. Faça upgrade em seu plano para usar o WooCommerce."; + /* Accessibility label for italic button on formatting toolbar. */ "Italic" = "Itálico"; @@ -2694,7 +2700,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Action button that will restart the login flow.Presented when logging in with a site address that appears to be invalid. Action button that will restart the login flow.Presented when logging in with a site address that does not have a valid Jetpack installation - Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce */ + Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce + Action button that will restart the login flow.Presented when the user tries to log in to the app with a simple WP.com site. */ "Log In With Another Account" = "Faça login com outra conta"; /* Action button triggering a Log Out.Presented when logging in with a store address that does not match the account entered @@ -3329,6 +3336,13 @@ This part is the link to the website, and forms part of a longer sentence which /* Paste without Formatting Menu Item */ "Paste without Formatting" = "Colar sem formatação"; +/* Customer-facing description showing more details about the Pay in Person option which is added to the store checkout when the merchant enables Pay in Person + Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ +"Pay by card or another accepted payment method" = "Pague com cartão ou outra forma de pagamento aceita"; + +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +"Pay in Person" = "Pagamento presencial"; + /* Payment section title Title text of the row that shows the payment headline when creating a simple payment Title text of the section that shows Payment details when creating a new order */ @@ -3993,6 +4007,7 @@ This part is the link to the website, and forms part of a longer sentence which Button to retry when there was a network error checking In-Person Payments requirements Retry Action Retry action for an error notice + Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Tentar novamente"; diff --git a/WooCommerce/Resources/ru.lproj/Localizable.strings b/WooCommerce/Resources/ru.lproj/Localizable.strings index 5e38d47c7cb..ca17633d402 100644 --- a/WooCommerce/Resources/ru.lproj/Localizable.strings +++ b/WooCommerce/Resources/ru.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-23 11:54:04+0000 */ +/* Translation-Revision-Date: 2022-08-30 09:54:03+0000 */ /* Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: ru */ @@ -2007,6 +2007,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "Не удалось удалить купон. Повторите попытку."; +/* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ +"Failed to enable Pay in Person. Please try again later." = "Не удалось включить опцию «Очная оплата». Повторите попытку позже."; + /* Error message on the Issue Refund screen when fetching the charge details failed */ "Failed to fetch your charge details. Please try again." = "Не удалось получить сведения об оплате. Повторите попытку."; @@ -2525,6 +2528,9 @@ which should be translated separately and considered part of this sentence. */ /* An error message shown when a wpcom user provides the wrong password. */ "It seems like you've entered an incorrect password. Want to give it another try?" = "Похоже, вы ввели неправильный пароль. Хотите попытаться ещё раз?"; +/* An error message displayed when the user tries to log in to the app with a simple WP.com site. Reads like: It seems that your site google.com is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce. */ +"It seems that your site %@ is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce." = "Похоже, ваш сайт %@ является простым сайтом WordPress.com, на котором нельзя устанавливать плагины. Обновите тарифный план для использования WooCommerce."; + /* Accessibility label for italic button on formatting toolbar. */ "Italic" = "Курсив"; @@ -2694,7 +2700,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Action button that will restart the login flow.Presented when logging in with a site address that appears to be invalid. Action button that will restart the login flow.Presented when logging in with a site address that does not have a valid Jetpack installation - Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce */ + Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce + Action button that will restart the login flow.Presented when the user tries to log in to the app with a simple WP.com site. */ "Log In With Another Account" = "Войдите с помощью другой учётной записи"; /* Action button triggering a Log Out.Presented when logging in with a store address that does not match the account entered @@ -3329,6 +3336,13 @@ This part is the link to the website, and forms part of a longer sentence which /* Paste without Formatting Menu Item */ "Paste without Formatting" = "Вставить без форматирования"; +/* Customer-facing description showing more details about the Pay in Person option which is added to the store checkout when the merchant enables Pay in Person + Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ +"Pay by card or another accepted payment method" = "Платите картой или используйте другой разрешённый способ оплаты"; + +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +"Pay in Person" = "Очная оплата"; + /* Payment section title Title text of the row that shows the payment headline when creating a simple payment Title text of the section that shows Payment details when creating a new order */ @@ -3993,6 +4007,7 @@ This part is the link to the website, and forms part of a longer sentence which Button to retry when there was a network error checking In-Person Payments requirements Retry Action Retry action for an error notice + Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Повторить"; diff --git a/WooCommerce/Resources/sv.lproj/Localizable.strings b/WooCommerce/Resources/sv.lproj/Localizable.strings index d85bab63a8c..59374e32dca 100644 --- a/WooCommerce/Resources/sv.lproj/Localizable.strings +++ b/WooCommerce/Resources/sv.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-23 11:54:03+0000 */ +/* Translation-Revision-Date: 2022-08-31 11:54:03+0000 */ /* Plural-Forms: nplurals=2; plural=n != 1; */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: sv_SE */ @@ -2007,6 +2007,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "Misslyckades att ta bort rabattkod. Försök igen."; +/* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ +"Failed to enable Pay in Person. Please try again later." = "Det gick inte att aktivera Betala personligen. Försök igen senare."; + /* Error message on the Issue Refund screen when fetching the charge details failed */ "Failed to fetch your charge details. Please try again." = "Det gick inte att hämta din debiteringsinformation. Försök igen."; @@ -2525,6 +2528,9 @@ which should be translated separately and considered part of this sentence. */ /* An error message shown when a wpcom user provides the wrong password. */ "It seems like you've entered an incorrect password. Want to give it another try?" = "Du verkar ha skrivit fel lösenord. Vill du försöka en gång till?"; +/* An error message displayed when the user tries to log in to the app with a simple WP.com site. Reads like: It seems that your site google.com is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce. */ +"It seems that your site %@ is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce." = "Det verkar som om din webbplats %@ är en enkel WordPress.com-webbplats som inte kan installera tillägg. Uppgradera ditt paket för att använda WooCommerce."; + /* Accessibility label for italic button on formatting toolbar. */ "Italic" = "Kursiv"; @@ -2694,7 +2700,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Action button that will restart the login flow.Presented when logging in with a site address that appears to be invalid. Action button that will restart the login flow.Presented when logging in with a site address that does not have a valid Jetpack installation - Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce */ + Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce + Action button that will restart the login flow.Presented when the user tries to log in to the app with a simple WP.com site. */ "Log In With Another Account" = "Logga in med ett annat konto"; /* Action button triggering a Log Out.Presented when logging in with a store address that does not match the account entered @@ -3329,6 +3336,13 @@ This part is the link to the website, and forms part of a longer sentence which /* Paste without Formatting Menu Item */ "Paste without Formatting" = "Klistra in utan formatering"; +/* Customer-facing description showing more details about the Pay in Person option which is added to the store checkout when the merchant enables Pay in Person + Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ +"Pay by card or another accepted payment method" = "Betala med kort eller annan accepterad betalningsmetod"; + +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +"Pay in Person" = "Betala personligen"; + /* Payment section title Title text of the row that shows the payment headline when creating a simple payment Title text of the section that shows Payment details when creating a new order */ @@ -3993,6 +4007,7 @@ This part is the link to the website, and forms part of a longer sentence which Button to retry when there was a network error checking In-Person Payments requirements Retry Action Retry action for an error notice + Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Försök igen"; diff --git a/WooCommerce/Resources/tr.lproj/Localizable.strings b/WooCommerce/Resources/tr.lproj/Localizable.strings index 433651083c4..65da630a5bd 100644 --- a/WooCommerce/Resources/tr.lproj/Localizable.strings +++ b/WooCommerce/Resources/tr.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-24 12:54:03+0000 */ +/* Translation-Revision-Date: 2022-09-02 09:54:03+0000 */ /* Plural-Forms: nplurals=2; plural=(n > 1); */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: tr */ @@ -2007,6 +2007,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "Kupon silinemedi. Lütfen tekrar deneyin."; +/* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ +"Failed to enable Pay in Person. Please try again later." = "Şahsen Ödeme etkinleştirilemedi Lütfen daha sonra tekrar deneyin."; + /* Error message on the Issue Refund screen when fetching the charge details failed */ "Failed to fetch your charge details. Please try again." = "Ödeme ayrıntılarınız getirilemedi. Lütfen tekrar deneyin."; @@ -2525,6 +2528,9 @@ which should be translated separately and considered part of this sentence. */ /* An error message shown when a wpcom user provides the wrong password. */ "It seems like you've entered an incorrect password. Want to give it another try?" = "Yanış bir parola girmişsiniz gibi görünüyor. Yeniden denemek ister misiniz?"; +/* An error message displayed when the user tries to log in to the app with a simple WP.com site. Reads like: It seems that your site google.com is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce. */ +"It seems that your site %@ is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce." = "Görünüşe göre %@ siteniz, eklenti yüklenemeyen basit bir Wordpress.com sitesi. WooCommerce kullanabilmek için lütfen paketinizi yükseltin."; + /* Accessibility label for italic button on formatting toolbar. */ "Italic" = "İtalik"; @@ -2694,7 +2700,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Action button that will restart the login flow.Presented when logging in with a site address that appears to be invalid. Action button that will restart the login flow.Presented when logging in with a site address that does not have a valid Jetpack installation - Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce */ + Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce + Action button that will restart the login flow.Presented when the user tries to log in to the app with a simple WP.com site. */ "Log In With Another Account" = "Başka Bir Hesapla Oturum Açın"; /* Action button triggering a Log Out.Presented when logging in with a store address that does not match the account entered @@ -3329,6 +3336,13 @@ This part is the link to the website, and forms part of a longer sentence which /* Paste without Formatting Menu Item */ "Paste without Formatting" = "Biçimlendirmeden Yapıştır"; +/* Customer-facing description showing more details about the Pay in Person option which is added to the store checkout when the merchant enables Pay in Person + Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ +"Pay by card or another accepted payment method" = "Kartla veya kabul edilen başka bir ödeme yöntemiyle ödeyin"; + +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +"Pay in Person" = "Şahsen Ödeyin"; + /* Payment section title Title text of the row that shows the payment headline when creating a simple payment Title text of the section that shows Payment details when creating a new order */ @@ -3993,6 +4007,7 @@ This part is the link to the website, and forms part of a longer sentence which Button to retry when there was a network error checking In-Person Payments requirements Retry Action Retry action for an error notice + Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Tekrar"; diff --git a/WooCommerce/Resources/zh-Hans.lproj/Localizable.strings b/WooCommerce/Resources/zh-Hans.lproj/Localizable.strings index be183064244..f576aeaa9a8 100644 --- a/WooCommerce/Resources/zh-Hans.lproj/Localizable.strings +++ b/WooCommerce/Resources/zh-Hans.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-23 11:54:03+0000 */ +/* Translation-Revision-Date: 2022-08-30 09:54:03+0000 */ /* Plural-Forms: nplurals=1; plural=0; */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: zh_CN */ @@ -2007,6 +2007,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "优惠券删除失败。 请重试。"; +/* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ +"Failed to enable Pay in Person. Please try again later." = "无法启用现场付款功能。 请稍后重试。"; + /* Error message on the Issue Refund screen when fetching the charge details failed */ "Failed to fetch your charge details. Please try again." = "获取扣费详细信息失败。 请重试。"; @@ -2525,6 +2528,9 @@ which should be translated separately and considered part of this sentence. */ /* An error message shown when a wpcom user provides the wrong password. */ "It seems like you've entered an incorrect password. Want to give it another try?" = "您可能输入了错误的密码。是否想重试?"; +/* An error message displayed when the user tries to log in to the app with a simple WP.com site. Reads like: It seems that your site google.com is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce. */ +"It seems that your site %@ is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce." = "您的站点 %@ 似乎是简单的 WordPress.com 站点,无法安装插件。 请升级您的套餐来使用 WooCommerce。"; + /* Accessibility label for italic button on formatting toolbar. */ "Italic" = "斜体"; @@ -2694,7 +2700,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Action button that will restart the login flow.Presented when logging in with a site address that appears to be invalid. Action button that will restart the login flow.Presented when logging in with a site address that does not have a valid Jetpack installation - Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce */ + Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce + Action button that will restart the login flow.Presented when the user tries to log in to the app with a simple WP.com site. */ "Log In With Another Account" = "使用其他帐户登录"; /* Action button triggering a Log Out.Presented when logging in with a store address that does not match the account entered @@ -3329,6 +3336,13 @@ This part is the link to the website, and forms part of a longer sentence which /* Paste without Formatting Menu Item */ "Paste without Formatting" = "不带格式粘贴"; +/* Customer-facing description showing more details about the Pay in Person option which is added to the store checkout when the merchant enables Pay in Person + Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ +"Pay by card or another accepted payment method" = "银行卡付款或其他可接受的付款方式"; + +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +"Pay in Person" = "现场付款"; + /* Payment section title Title text of the row that shows the payment headline when creating a simple payment Title text of the section that shows Payment details when creating a new order */ @@ -3993,6 +4007,7 @@ This part is the link to the website, and forms part of a longer sentence which Button to retry when there was a network error checking In-Person Payments requirements Retry Action Retry action for an error notice + Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "重试"; diff --git a/WooCommerce/Resources/zh-Hant.lproj/Localizable.strings b/WooCommerce/Resources/zh-Hant.lproj/Localizable.strings index d6125a7ba45..5177008f95d 100644 --- a/WooCommerce/Resources/zh-Hant.lproj/Localizable.strings +++ b/WooCommerce/Resources/zh-Hant.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-23 09:54:03+0000 */ +/* Translation-Revision-Date: 2022-09-02 09:54:03+0000 */ /* Plural-Forms: nplurals=1; plural=0; */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: zh_TW */ @@ -2007,6 +2007,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "刪除優惠券失敗。 請再試一次。"; +/* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ +"Failed to enable Pay in Person. Please try again later." = "無法啟用親自收款功能。 請稍後再試一次。"; + /* Error message on the Issue Refund screen when fetching the charge details failed */ "Failed to fetch your charge details. Please try again." = "擷取您的收費詳細資訊時失敗。 請再試一次。"; @@ -2525,6 +2528,9 @@ which should be translated separately and considered part of this sentence. */ /* An error message shown when a wpcom user provides the wrong password. */ "It seems like you've entered an incorrect password. Want to give it another try?" = "輸入的密碼似乎有誤。是否要再試一次?"; +/* An error message displayed when the user tries to log in to the app with a simple WP.com site. Reads like: It seems that your site google.com is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce. */ +"It seems that your site %@ is a simple WordPress.com site that cannot install plugins. Please upgrade your plan to use WooCommerce." = "你的網站 %@ 似乎是簡易的 WordPress.com 網站,因此無法安裝外掛程式。 若要使用 WooCommerce,請升級你的方案。"; + /* Accessibility label for italic button on formatting toolbar. */ "Italic" = "斜體"; @@ -2694,7 +2700,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Action button that will restart the login flow.Presented when logging in with a site address that appears to be invalid. Action button that will restart the login flow.Presented when logging in with a site address that does not have a valid Jetpack installation - Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce */ + Action button that will restart the login flow.Presented when logging in with a site address that does not have WooCommerce + Action button that will restart the login flow.Presented when the user tries to log in to the app with a simple WP.com site. */ "Log In With Another Account" = "使用其他帳號登入"; /* Action button triggering a Log Out.Presented when logging in with a store address that does not match the account entered @@ -3329,6 +3336,13 @@ This part is the link to the website, and forms part of a longer sentence which /* Paste without Formatting Menu Item */ "Paste without Formatting" = "貼上並且不設定格式"; +/* Customer-facing description showing more details about the Pay in Person option which is added to the store checkout when the merchant enables Pay in Person + Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ +"Pay by card or another accepted payment method" = "透過卡片或其他接受的付款方式付款"; + +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +"Pay in Person" = "親自收款"; + /* Payment section title Title text of the row that shows the payment headline when creating a simple payment Title text of the section that shows Payment details when creating a new order */ @@ -3993,6 +4007,7 @@ This part is the link to the website, and forms part of a longer sentence which Button to retry when there was a network error checking In-Person Payments requirements Retry Action Retry action for an error notice + Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "重試"; From 86633e6683d3596db322f19093d50002ce1dcd57 Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 2 Sep 2022 14:10:38 -0400 Subject: [PATCH 54/74] Update metadata translations --- fastlane/metadata/ar-SA/release_notes.txt | 5 ++--- fastlane/metadata/de-DE/release_notes.txt | 5 ++--- fastlane/metadata/default/release_notes.txt | 5 ++--- fastlane/metadata/es-ES/release_notes.txt | 5 ++--- fastlane/metadata/fr-FR/release_notes.txt | 5 ++--- fastlane/metadata/he/release_notes.txt | 5 ++--- fastlane/metadata/id/release_notes.txt | 5 ++--- fastlane/metadata/it/release_notes.txt | 5 ++--- fastlane/metadata/ja/release_notes.txt | 5 ++--- fastlane/metadata/ko/release_notes.txt | 5 ++--- fastlane/metadata/nl-NL/release_notes.txt | 5 ++--- fastlane/metadata/pt-BR/release_notes.txt | 5 ++--- fastlane/metadata/ru/release_notes.txt | 5 ++--- fastlane/metadata/sv/release_notes.txt | 5 ++--- fastlane/metadata/tr/release_notes.txt | 5 ++--- fastlane/metadata/zh-Hans/release_notes.txt | 5 ++--- fastlane/metadata/zh-Hant/release_notes.txt | 5 ++--- 17 files changed, 34 insertions(+), 51 deletions(-) diff --git a/fastlane/metadata/ar-SA/release_notes.txt b/fastlane/metadata/ar-SA/release_notes.txt index d1f17582b5a..c8a6a7c8ae8 100644 --- a/fastlane/metadata/ar-SA/release_notes.txt +++ b/fastlane/metadata/ar-SA/release_notes.txt @@ -1,3 +1,2 @@ -لقد قمنا بتسهيل العثور على كل شيء حول قبول المدفوعات في التطبيق كثيرًا. توجَّه إلى قسم المدفوعات من القائمة! لقد أصلحنا كذلك مشكلة حيث كان قد يتم حظرك من تلقي المدفوعات من دون داعٍ. -لقد أجرينا كذلك عدة تحسينات على عمليات سير تسجيل الدخول الخاصة بنا لمساعدتك على بدء استخدام التطبيق بسرعة. -وأخيرًا، لقد أجرينا بعض التعديلات على الأداء. لكننا لم ننتهِ بعد. نتطلع إلى مزيد من التحسينات في المستقبل. يرجى الاستمرار في إرسال ملاحظاتك! +يحتوي هذا الإصدار على إصلاحات عديدة تسهِّل عليك تحصيل المدفوعات من التطبيق. لقد قمنا كذلك بإضافة صفحة مركز المساعدة والأسئلة المتداولة جديدة تسهِّل عليك تسجيل الدخول إلى التطبيق. +يرجى مواصلة إرسال الملاحظات إلينا – فكلنا آذان صاغية! diff --git a/fastlane/metadata/de-DE/release_notes.txt b/fastlane/metadata/de-DE/release_notes.txt index df4b877955c..1499d42e038 100644 --- a/fastlane/metadata/de-DE/release_notes.txt +++ b/fastlane/metadata/de-DE/release_notes.txt @@ -1,3 +1,2 @@ -Es ist jetzt viel einfacher, alle Informationen zum Empfangen von Zahlungen in der App zu finden. Geh im Menü einfach zum Bereich „Zahlungen“. Wir haben auch ein Problem behoben, dass das Empfangen von Zahlungen blockieren konnte. -Und wir haben verschiedene Verbesserungen am Anmeldevorgang vorgenommen, damit du die App schneller nutzen kannst. -Außerdem haben wir ein paar raffinierte Änderungen vorgenommen, um die Performance zu verbessern. Aber das war noch nicht alles. Du darfst dich auf weitere kommende Verbesserungen freuen. Sende uns bitte weiterhin dein Feedback! +Dieses Release enthält mehrere Problembehebungen, die es einfacher machen, Zahlungen in der App anzunehmen. Außerdem haben wir eine neue FAQ-Seite zum Hilfe-Center hinzugefügt, die dir das Anmelden bei der App erleichtert. +Sende uns bitte weiter Feedback – wir freuen uns darauf! diff --git a/fastlane/metadata/default/release_notes.txt b/fastlane/metadata/default/release_notes.txt index 8505d617e16..b1b07a7dd64 100644 --- a/fastlane/metadata/default/release_notes.txt +++ b/fastlane/metadata/default/release_notes.txt @@ -1,3 +1,2 @@ -We made it much easier to find everything about accepting payments in the app. Head on to the Payments section from the Menu! We also fixed an issue where you might be unnecessarily blocked from taking payments. -We also made various enhancements to our login flows to help you get started quickly with the app. -Lastly, we’ve made some tweaks to performance. But we’re not done. Look forward to more improvements in the future. Please keep sending your feedback! +This release has several fixes that makes it easier for you to take payments from the app. We’ve also added a new Help Center FAQ page that makes it easier for you to login to the app. +Please continue to send us feedback – we are listening! diff --git a/fastlane/metadata/es-ES/release_notes.txt b/fastlane/metadata/es-ES/release_notes.txt index fc70618e78a..d938217241b 100644 --- a/fastlane/metadata/es-ES/release_notes.txt +++ b/fastlane/metadata/es-ES/release_notes.txt @@ -1,3 +1,2 @@ -Hemos facilitado el proceso de encontrar todo lo relacionado con la aceptación de pagos en la aplicación. Ve a la sección Pagos desde el menú. También hemos solucionado un problema por el que se podía bloquear innecesariamente la recepción de pagos. -Además, hemos hecho varias mejoras en los flujos de acceso para que puedas empezar rápidamente en la aplicación. -Por último, hemos hecho algunos ajustes de rendimiento. Pero hay más. Habrá más mejoras próximamente. Sigue enviándonos tus comentarios. +Esta versión incluye algunas correcciones que facilitan el hecho de recibir pagos desde la aplicación. También hemos añadido una nueva página de preguntas frecuentes al centro de ayuda para que te sea más fácil acceder a la aplicación. +Sigue enviando tus comentarios: ¡te escuchamos! diff --git a/fastlane/metadata/fr-FR/release_notes.txt b/fastlane/metadata/fr-FR/release_notes.txt index 6b7dc6b738d..96733fcc5ab 100644 --- a/fastlane/metadata/fr-FR/release_notes.txt +++ b/fastlane/metadata/fr-FR/release_notes.txt @@ -1,3 +1,2 @@ -Il est désormais plus facile de trouver tout ce qui concerne l’acceptation des paiements dans l’application. Accédez à la section des paiements depuis le menu ! Nous avons également résolu un problème qui était susceptible de vous empêcher sans raison d’accepter des paiements. -De plus, nous avons apporté diverses améliorations à notre flux de connexion afin de vous permettre d’utiliser l'application plus rapidement. -Enfin, nous avons effectué quelques ajustements au niveau des performances. Mais ce n’est pas tout. Attendez-vous à plus d’améliorations à l'avenir. Continuez de nous donner votre avis ! +Cette version contient plusieurs correctifs qui facilitent l’encaissement des paiements depuis l’application. Nous avons également ajouté une nouvelle page de FAQ au centre d’aide qui facilite votre connexion à l’application. +Continuez à nous envoyer vos commentaires. Votre avis nous intéresse ! diff --git a/fastlane/metadata/he/release_notes.txt b/fastlane/metadata/he/release_notes.txt index f4750e41bc3..0bd78a3c6bd 100644 --- a/fastlane/metadata/he/release_notes.txt +++ b/fastlane/metadata/he/release_notes.txt @@ -1,3 +1,2 @@ -כעת אפשר למצוא בקלות רבה יותר את כל מה שצריך לדעת על קבלת תשלומים באפליקציה. ניתן לעבור למקטע 'תשלומים' בתפריט! בנוסף, תיקנו בעיה שגרמה לחסימה לא מוצדקת של משתמשים מקבלת תשלומים. -גם הוספנו כמה שיפורים לתהליך ההתחברות כדי לעזור לך להתחיל מהר יותר את השימוש באפליקציה. -אחרון חביב, ביצענו כמה שינויים בביצועים. אבל עוד לא סיימנו. נשיק עוד שיפורים בעתיד, כדאי לחכות. נשמח להמשיך לקבל משוב! +בגרסה הזאת הוספנו כמה תיקונים שיעזרו לך לקבל תשלומים מהאפליקציה בקלות רבה יותר. הוספנו גם עמוד חדש של 'שאלות נפוצות' ב'מרכז העזרה' כדי לעזור לך להתחבר לאפליקציה. +נשמח לקבל עוד משוב – אנחנו תמיד כאן כדי להקשיב! diff --git a/fastlane/metadata/id/release_notes.txt b/fastlane/metadata/id/release_notes.txt index 53f54928d1a..905bd033a58 100644 --- a/fastlane/metadata/id/release_notes.txt +++ b/fastlane/metadata/id/release_notes.txt @@ -1,3 +1,2 @@ -Kami mempermudah Anda menemukan segala hal seputar penerimaan pembayaran di aplikasi. Buka bagian Pembayaran dari Menu! Kami juga memperbaiki kesalahan pemblokiran terhadap pengambilan pembayaran Anda. -Kami juga melakukan berbagai penyempurnaan dalam alur login agar Anda dapat memulai aplikasi dengan lebih cepat. -Terakhir, kami mengutak-atik performa supaya lebih baik. Namun, kami belum selesai. Nantikan perbaikan lainnya di masa mendatang. Terus kirimkan feedback Anda kepada kami! +Rilis ini mencakup sejumlah perbaikan yang memudahkan penerimaan pembayaran dari aplikasi. Kami juga telah menambahkan halaman Pusat Bantuan Tanya Jawab Umum (TJU) yang memudahkan Anda untuk login ke aplikasi. +Terus berikan kami feedback – kami siap mendengarkan! diff --git a/fastlane/metadata/it/release_notes.txt b/fastlane/metadata/it/release_notes.txt index 21941abbec3..9d262928e27 100644 --- a/fastlane/metadata/it/release_notes.txt +++ b/fastlane/metadata/it/release_notes.txt @@ -1,3 +1,2 @@ -Ora è più facile trovare tutto ciò di cui hai bisogno su come accettare i pagamenti nell'app. Vai alla sezione Pagamenti dal menu. Abbiamo anche corretto un problema che impediva la riscossione dei pagamenti. -Inoltre, abbiamo apportato varie ottimizzazioni ai flussi di accesso per aiutarti a iniziare a usare rapidamente l'app. -Infine, abbiamo effettuato alcune piccole modifiche per migliorare le prestazioni. Ma non è tutto. Sono in arrivo altre ottimizzazioni in futuro. Continua a inviarci il tuo feedback. +Questa versione presenta diverse correzioni che semplificano la ricezione di pagamenti dall'app. Abbiamo aggiunto anche una nuova pagina delle domande frequenti al Centro assistenza che facilita l'accesso all'app. +Continua a inviarci feedback: siamo lieti di ascoltarli. diff --git a/fastlane/metadata/ja/release_notes.txt b/fastlane/metadata/ja/release_notes.txt index e23a0eade05..4a58cce6175 100644 --- a/fastlane/metadata/ja/release_notes.txt +++ b/fastlane/metadata/ja/release_notes.txt @@ -1,3 +1,2 @@ -アプリでの支払いの受け入れに関するすべての項目が簡単に見つけられるようになりました。「メニュー」から「支払い」セクションに移動できます。 支払い時に不必要にブロックされることがある問題を修正しました。 -ログインフローにもさまざまな改善が行われ、すぐにアプリを使い始めることができるようになりました。 -さらに、パフォーマンスの微調整も行いました。 これで終わりではありません。 今後の改善点にもご注目ください。 引き続き皆さまのご意見をお待ちしております。 +このリリースではいくつかの修正が行われ、アプリから支払いを受け取りやすくなりました。また、アプリへのログインを簡単にするため、新しいヘルプセンターの FAQ ページも追加しました。 +引き続き、フィードバックをお寄せください。 diff --git a/fastlane/metadata/ko/release_notes.txt b/fastlane/metadata/ko/release_notes.txt index 194ff05a5f5..47c00b032de 100644 --- a/fastlane/metadata/ko/release_notes.txt +++ b/fastlane/metadata/ko/release_notes.txt @@ -1,3 +1,2 @@ -앱에서 결제를 수락하는 모든 기능을 훨씬 쉽게 찾을 수 있도록 했습니다. 메뉴에서 결제 섹션을 살펴보세요! 결제가 불필요하게 차단될 수도 있는 문제도 해결했습니다. -앱에서 빠르게 시작하는 데 도움이 되도록 로그인 흐름도 다양하게 개선했습니다. -마지막으로, 성능도 약간 조정했습니다. 그러나 아직 끝나지 않았습니다. 앞으로 더 많은 개선 사항을 기대해 주세요. 피드백을 계속 보내주세요! +이 릴리스에는 앱에서 결제를 더 쉽게 진행할 수 있는 몇 가지 수정 사항이 있습니다. 앱에 더 쉽게 로그인할 수 있도록 새로운 도움말 센터 FAQ 페이지도 추가했습니다. +계속 피드백을 보내주세요. 경청하겠습니다! diff --git a/fastlane/metadata/nl-NL/release_notes.txt b/fastlane/metadata/nl-NL/release_notes.txt index 8505d617e16..366a29492ac 100644 --- a/fastlane/metadata/nl-NL/release_notes.txt +++ b/fastlane/metadata/nl-NL/release_notes.txt @@ -1,3 +1,2 @@ -We made it much easier to find everything about accepting payments in the app. Head on to the Payments section from the Menu! We also fixed an issue where you might be unnecessarily blocked from taking payments. -We also made various enhancements to our login flows to help you get started quickly with the app. -Lastly, we’ve made some tweaks to performance. But we’re not done. Look forward to more improvements in the future. Please keep sending your feedback! +Deze release bevat meerdere reparaties waardoor je eenvoudiger betalingen kunt ontvangen uit de app. We hebben ook een nieuwe Help Center FAQ-pagina toegevoegd waarmee je eenvoudiger kunt inloggen in de app. +Blijf ons feedback sturen – wij luisteren! diff --git a/fastlane/metadata/pt-BR/release_notes.txt b/fastlane/metadata/pt-BR/release_notes.txt index 4969e4b5838..105052f3200 100644 --- a/fastlane/metadata/pt-BR/release_notes.txt +++ b/fastlane/metadata/pt-BR/release_notes.txt @@ -1,3 +1,2 @@ -Tornamos muito mais fácil encontrar tudo sobre como aceitar pagamentos no aplicativo. Vá para a seção de Pagamentos no Menu! Também corrigimos um problema que bloqueava o recebimento de pagamentos sem necessidade. -Além disso, fizemos várias melhorias em nossos fluxos de login para ajudar você a começar rapidamente com o aplicativo. -Por fim, fizemos alguns ajustes para melhorar o desempenho. E não para por aí. Aguarde mais melhorias no futuro. Continue enviando seu feedback! +Esta versão tem várias correções que facilitam o recebimento de pagamentos com o aplicativo. Também adicionamos uma nova página de perguntas frequentes na Central de Ajuda que ajudará você a fazer login no aplicativo. +Continue compartilhando seu feedback conosco. Estamos ouvindo. diff --git a/fastlane/metadata/ru/release_notes.txt b/fastlane/metadata/ru/release_notes.txt index 3c005455e04..eebb3aac361 100644 --- a/fastlane/metadata/ru/release_notes.txt +++ b/fastlane/metadata/ru/release_notes.txt @@ -1,3 +1,2 @@ -Мы упростили поиск информации о приёме платежей в приложении. Для этого перейдите в раздел «Платежи» из меню. Устранена проблема, не позволявшая принимать платежи. -Улучшена процедура входа, чтобы вы могли быстрее начать работу с приложением. -Наконец, мы повысили производительность. Но это ещё не всё. Следите за появлением других улучшений в будущем. Продолжайте отправлять нам отзывы! +В этот выпуск внесено несколько исправлений, которые облегчают оплату в приложении. Мы также добавили в Справочный центр страницу с часто задаваемыми вопросами, которая поможет легко выполнять вход в приложение. +Мы по-прежнему ждём ваших отзывов и прислушиваемся к ним! diff --git a/fastlane/metadata/sv/release_notes.txt b/fastlane/metadata/sv/release_notes.txt index 308c69572eb..18903418f8b 100644 --- a/fastlane/metadata/sv/release_notes.txt +++ b/fastlane/metadata/sv/release_notes.txt @@ -1,3 +1,2 @@ -Vi har gjort det mycket enklare att hitta allt om att ta emot betalningar i appen. Det är bara att gå till sektionen Betalningar från menyn. Vi har också åtgärdat ett problem som gjorde att man felaktigt kunde bli blockerad från att ta emot betalningar. -Vi har dessutom gjort diverse förbättringar av våra inloggningsflöden, så att det ska gå snabbare att komma igång med appen. -Slutligen har vi även gjort några förbättringar av prestandan. Men vi är inte klara. Det kommer fler förbättringar framöver. Fortsätt att skicka feedback. +Den här versionen innehåller flertalet korrigeringar som gör det enklare för dig att ta emot betalningar via appen. Vi har också lagt till en ny Vanliga frågor-sida i Hjälpcenter som gör det enklare för dig att logga in i appen. +Fortsätt att skicka feedback till oss – vi lyssnar! diff --git a/fastlane/metadata/tr/release_notes.txt b/fastlane/metadata/tr/release_notes.txt index 589824339bc..9988610a640 100644 --- a/fastlane/metadata/tr/release_notes.txt +++ b/fastlane/metadata/tr/release_notes.txt @@ -1,3 +1,2 @@ -Uygulama içinden ödeme kabul etmeyle ilgili her şeyi çok daha kolay hale getirdik. Menüden Ödemeler bölümüne gidin! Ayrıca ödeme almanızı gereksiz yere engellenebilecek bir sorunu da düzelttik. -Bunun yanında, uygulamayı kullanmaya hızlı şekilde başlamanıza yardımcı olmak için oturum açma akışlarımızda çeşitli geliştirmeler yaptık. -Son olarak, performansta bazı ince ayarlar yaptık. Ama işimiz daha bitmedi. Gelecekte daha fazla iyileştirme yapmayı umuyoruz. Lütfen geri bildirimlerinizi göndermeye devam edin! +Bu sürüm, uygulamadan ödeme almanızı kolaylaştıran birkaç düzeltmeye sahiptir. Ayrıca, uygulamaya giriş yapmanızı kolaylaştıran yeni bir Yardım Merkezi SSS sayfası ekledik. +Lütfen bize geri bildirim göndermeye devam edin, sizi dinliyoruz. diff --git a/fastlane/metadata/zh-Hans/release_notes.txt b/fastlane/metadata/zh-Hans/release_notes.txt index 75900c048be..efccd59125c 100644 --- a/fastlane/metadata/zh-Hans/release_notes.txt +++ b/fastlane/metadata/zh-Hans/release_notes.txt @@ -1,3 +1,2 @@ -我们做了相关改进,您可以更轻松地在应用程序中找到所有关于接受付款的信息。只需从“菜单”转至“付款”部分! 您在收款时可能会遇到不必要的阻碍,我们也修复了这个问题。 -我们还对登录流程做了各种改进,以帮助您快速开始使用该应用程序。 -最后,我们做了一些性能调整。 但是我们还不够完善。 敬请期待未来推出的更多改进。 请继续发送您的反馈意见! +此版本修复了多个问题,可让您更轻松地从应用程序中接受付款。我们已添加新的“帮助中心常见问题解答”页面,可让您更轻松地登录应用程序。 +请继续向我们发送反馈,我们时刻倾听您的意见! diff --git a/fastlane/metadata/zh-Hant/release_notes.txt b/fastlane/metadata/zh-Hant/release_notes.txt index 49b4be8f5b0..861d90e720e 100644 --- a/fastlane/metadata/zh-Hant/release_notes.txt +++ b/fastlane/metadata/zh-Hant/release_notes.txt @@ -1,3 +1,2 @@ -在應用程式中尋找關於接受付款的資訊變簡單了。現在只要從選單前往「付款」區段即可! 我們也修正了可能導致你無法收款的錯誤。 -另外也對登入流程進行各種改善,協助你快速開始使用應用程式。 -最後,我們對網站效能進行了些許調整。 但還沒結束。 敬請期待之後更多的改善功能。 請持續提供意見回饋給我們! +此版本進行了幾項修正,可讓你從應用程式更輕鬆收取款項。我們也新增了「說明中心常見問題」頁面,讓登入應用程式變得更加簡單。 +歡迎繼續給予我們批評指教,我們很樂意接受! From c1fef1177d457d41906cb7b8afc9f94e72425198 Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 2 Sep 2022 14:10:43 -0400 Subject: [PATCH 55/74] Bump version number --- config/Version.Public.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/Version.Public.xcconfig b/config/Version.Public.xcconfig index b5897d57743..d25cd07fa3c 100644 --- a/config/Version.Public.xcconfig +++ b/config/Version.Public.xcconfig @@ -1,4 +1,4 @@ VERSION_SHORT=10.1 // Public long version example: VERSION_LONG=1.2.0.0 -VERSION_LONG=10.1.0.0 +VERSION_LONG=10.1.0.1 From 89a97724955670bc47951bfb7e555f0711b64439 Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 2 Sep 2022 20:16:48 -0400 Subject: [PATCH 56/74] Bump version number --- config/Version.Public.xcconfig | 4 ++-- fastlane/Deliverfile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/Version.Public.xcconfig b/config/Version.Public.xcconfig index d25cd07fa3c..695ae352773 100644 --- a/config/Version.Public.xcconfig +++ b/config/Version.Public.xcconfig @@ -1,4 +1,4 @@ -VERSION_SHORT=10.1 +VERSION_SHORT=10.2 // Public long version example: VERSION_LONG=1.2.0.0 -VERSION_LONG=10.1.0.1 +VERSION_LONG=10.2.0.0 diff --git a/fastlane/Deliverfile b/fastlane/Deliverfile index 94985f9b8b9..bcaf984f344 100644 --- a/fastlane/Deliverfile +++ b/fastlane/Deliverfile @@ -15,7 +15,7 @@ app_identifier 'com.automattic.woocommerce' screenshots_path './fastlane/promo_screenshots/' # Make sure to update these keys for a new version -app_version '10.1' +app_version "10.2" team_id '299112' From 86c845ad5287c1b15e2852ff2eefbd036bbfff10 Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 2 Sep 2022 20:16:49 -0400 Subject: [PATCH 57/74] Update draft release notes for 10.2. --- WooCommerce/Resources/release_notes.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/WooCommerce/Resources/release_notes.txt b/WooCommerce/Resources/release_notes.txt index b1b07a7dd64..e2c051901df 100644 --- a/WooCommerce/Resources/release_notes.txt +++ b/WooCommerce/Resources/release_notes.txt @@ -1,2 +1,4 @@ -This release has several fixes that makes it easier for you to take payments from the app. We’ve also added a new Help Center FAQ page that makes it easier for you to login to the app. -Please continue to send us feedback – we are listening! +- [*] Help center: Added help center web page with FAQs for "Enter Store Credentials", "Enter WordPress.com email " and "Jetpack required Error" screens. [https://github.com/woocommerce/woocommerce-ios/pull/7588, https://github.com/woocommerce/woocommerce-ios/pull/7590, https://github.com/woocommerce/woocommerce-ios/pull/7621] +- [*] In-Person Payments: Fixed the Learn More link from the `Enable Pay in Person` onboarding screen for WCPay [https://github.com/woocommerce/woocommerce-ios/pull/7598] +- [**] In-Person Payments: Added a switch for the Pay in Person payment method on the Payments menu. This allows you to accept In-Person Payments for website orders [https://github.com/woocommerce/woocommerce-ios/pull/7613] + From de50cf4bfe9068397bb43aa7e055224533250818 Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 2 Sep 2022 20:16:49 -0400 Subject: [PATCH 58/74] Release Notes: add new section for next version (10.3) --- RELEASE-NOTES.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 88893d26add..1add335b31f 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,5 +1,9 @@ *** PLEASE FOLLOW THIS FORMAT: [] [] +10.3 +----- + + 10.2 ----- - [*] Help center: Added help center web page with FAQs for "Enter Store Credentials", "Enter WordPress.com email " and "Jetpack required Error" screens. [https://github.com/woocommerce/woocommerce-ios/pull/7588, https://github.com/woocommerce/woocommerce-ios/pull/7590, https://github.com/woocommerce/woocommerce-ios/pull/7621] From 728b2e67026bacb20423b72cf83623f7364c758a Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 2 Sep 2022 20:25:19 -0400 Subject: [PATCH 59/74] Update release notes for 10.2 --- WooCommerce/Resources/release_notes.txt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/WooCommerce/Resources/release_notes.txt b/WooCommerce/Resources/release_notes.txt index e2c051901df..37304938ab9 100644 --- a/WooCommerce/Resources/release_notes.txt +++ b/WooCommerce/Resources/release_notes.txt @@ -1,4 +1 @@ -- [*] Help center: Added help center web page with FAQs for "Enter Store Credentials", "Enter WordPress.com email " and "Jetpack required Error" screens. [https://github.com/woocommerce/woocommerce-ios/pull/7588, https://github.com/woocommerce/woocommerce-ios/pull/7590, https://github.com/woocommerce/woocommerce-ios/pull/7621] -- [*] In-Person Payments: Fixed the Learn More link from the `Enable Pay in Person` onboarding screen for WCPay [https://github.com/woocommerce/woocommerce-ios/pull/7598] -- [**] In-Person Payments: Added a switch for the Pay in Person payment method on the Payments menu. This allows you to accept In-Person Payments for website orders [https://github.com/woocommerce/woocommerce-ios/pull/7613] - +Even though this release doesn’t have any new features, we still put a lot of love into it! You can now enable or disable the option to take card or cash payments on collection or delivery. We also added a new Help Center page that makes it easier for you to login to the app. From 96f8c05822d9853cd8770fcbeb64f1d268f8da5a Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 2 Sep 2022 20:25:31 -0400 Subject: [PATCH 60/74] Update metadata strings --- WooCommerce/Resources/AppStoreStrings.pot | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/WooCommerce/Resources/AppStoreStrings.pot b/WooCommerce/Resources/AppStoreStrings.pot index dc25018a422..48b3056c7a1 100644 --- a/WooCommerce/Resources/AppStoreStrings.pot +++ b/WooCommerce/Resources/AppStoreStrings.pot @@ -57,10 +57,9 @@ msgctxt "app_store_promo_text" msgid "Run your store from anywhere" msgstr "" -msgctxt "v10.1-whats-new" +msgctxt "v10.2-whats-new" msgid "" -"This release has several fixes that makes it easier for you to take payments from the app. We’ve also added a new Help Center FAQ page that makes it easier for you to login to the app.\n" -"Please continue to send us feedback – we are listening!\n" +"Even though this release doesn’t have any new features, we still put a lot of love into it! You can now enable or disable the option to take card or cash payments on collection or delivery. We also added a new Help Center page that makes it easier for you to login to the app.\n" msgstr "" #. translators: This is a promo message that will be attached on top of a screenshot in the App Store. From de4ec51321054273efbd51fdef0ef4251175d6a5 Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Fri, 2 Sep 2022 21:59:14 -0400 Subject: [PATCH 61/74] Freeze strings for localization --- .../Resources/en.lproj/Localizable.strings | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/WooCommerce/Resources/en.lproj/Localizable.strings b/WooCommerce/Resources/en.lproj/Localizable.strings index 24d417eb091..de7dc4c08c4 100644 --- a/WooCommerce/Resources/en.lproj/Localizable.strings +++ b/WooCommerce/Resources/en.lproj/Localizable.strings @@ -40,6 +40,12 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. %1$@ is a placeholder that is always replaced with \"Learn more\" string, which should be translated separately and considered part of this sentence. */ "%1$@ about adding Pay in Person to your checkout" = "%1$@ about adding Pay in Person to your checkout"; +/* A label prompting users to learn more about In-Person Payments. +\u{2011} is a special character that acts as nonbreaking hyphen for "-" in the "In-Person" string. +%1$@ is a placeholder that always replaced with \"Learn more\" string, +which should be translated separately and considered part of this sentence. */ +"%1$@ about In\u{2011}Person Payments" = "%1$@ about In\u{2011}Person Payments"; + /* Accessibility description for a card payment method, used by assistive technologies such as screen reader. %1$@ is a placeholder for the card brand, %2$@ is a placeholder for the last 4 digits of the card number */ "%1$@ card ending %2$@" = "%1$@ card ending %2$@"; @@ -1095,9 +1101,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "Confirm Payment Method"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "Conflicting payment plugins detected"; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "Congrats, you’ve read everything!"; @@ -1206,7 +1209,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "Continuing with Apple"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "Conversion"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2013,6 +2017,9 @@ which should be translated separately and considered part of this sentence. */ /* Error message on the Coupon Details screen when deleting coupon fails */ "Failed to delete coupon. Please try again." = "Failed to delete coupon. Please try again."; +/* Error displayed when the attempt to disable a Pay in Person checkout payment option fails */ +"Failed to disable Pay in Person. Please try again later." = "Failed to disable Pay in Person. Please try again later."; + /* Error displayed when the attempt to enable a Pay in Person checkout payment option fails */ "Failed to enable Pay in Person. Please try again later." = "Failed to enable Pay in Person. Please try again later."; @@ -2261,6 +2268,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "Help"; @@ -2341,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ Title for the In-Person Payments settings screen */ "In-Person Payments" = "In-Person Payments"; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "In-Person Payments are processed through WooCommerce Payments."; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?"; @@ -2358,12 +2363,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "In-Person Payments Setup is incomplete."; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:"; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:"; - /* Application's Inactive State */ "Inactive" = "Inactive"; @@ -2608,8 +2607,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2791,9 +2793,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Login onboarding survey option: manage my orders. */ "Manage my orders" = "Manage my orders"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "Manage Plugins"; - /* Title of the cell in Product Inventory Settings > Manage stock */ "Manage stock" = "Manage stock"; @@ -3257,6 +3256,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "Ordered List"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "Orders"; @@ -3352,7 +3352,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "Pay by card or another accepted payment method"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "Pay in Person"; /* Payment section title @@ -4029,6 +4030,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Retry"; @@ -4046,7 +4048,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "Return to sender if package is unable to be delivered"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "Revenue"; /* Review moderation success notice message. It reads: Review marked as {new status} */ @@ -4990,6 +4993,9 @@ This part is the link to the website, and forms part of a longer sentence which /* Fetching an Order Failed */ "The Order couldn't be loaded!" = "The Order couldn't be loaded!"; +/* A label prompting users to learn more about adding Pay in Person to their checkout. %1$@ is a placeholder that always replaced with \"Learn more\" string, which should be translated separately and considered part of this sentence. */ +"The Pay in Person checkout option lets you accept payments for website orders, on collection or delivery. %1$@" = "The Pay in Person checkout option lets you accept payments for website orders, on collection or delivery. %1$@"; + /* Message when the presented card does not allow the purchase amount. */ "The payment amount is not allowed for the card presented. Try another means of payment." = "The payment amount is not allowed for the card presented. Try another means of payment."; @@ -5251,12 +5257,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "To close this account now, contact our support team."; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway."; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "To collect payments, please deactivate WooCommerce Stripe Gateway."; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "To confirm, please re-enter your username before closing.\n\n%1$@"; @@ -5272,6 +5272,9 @@ This part is the link to the website, and forms part of a longer sentence which /* Settings > Privacy Settings > report crashes section. Explains what the 'report crashes' toggle does */ "To help us improve the app’s performance and fix the occasional bug, enable automatic crash reports." = "To help us improve the app’s performance and fix the occasional bug, enable automatic crash reports."; +/* Sign in instructions asking user to enter WordPress.com password to proceed with sign in using Apple process */ +"To proceed with this account, please first log in with your WordPress.com password. This will only be asked once." = "To proceed with this account, please first log in with your WordPress.com password. This will only be asked once."; + /* Instructional text shown when requesting the user's password for Apple login. */ "To proceed with this Apple ID, please first log in with your WordPress.com password. This will only be asked once." = "To proceed with this Apple ID, please first log in with your WordPress.com password. This will only be asked once."; @@ -5823,7 +5826,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "Visibility"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "Visitors"; /* Message shown on screen while waiting for Google to finish its signup process. */ From 439cec16eb1a9b78a8c63f8ac5e083babca4f4e9 Mon Sep 17 00:00:00 2001 From: Tony Li Date: Mon, 5 Sep 2022 11:58:13 +1200 Subject: [PATCH 62/74] Make sure test results are archived when test suites fail --- .buildkite/commands/run-ui-tests.sh | 5 +++++ .buildkite/commands/run-unit-tests.sh | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/.buildkite/commands/run-ui-tests.sh b/.buildkite/commands/run-ui-tests.sh index e3f72603595..2e8b3c69963 100755 --- a/.buildkite/commands/run-ui-tests.sh +++ b/.buildkite/commands/run-ui-tests.sh @@ -35,7 +35,12 @@ install_cocoapods echo "--- 🧪 Testing" xcrun simctl list >> /dev/null rake mocks & +set +e bundle exec fastlane test_without_building name:"$TEST_NAME" device:"$DEVICE" ios_version:"$IOS_VERSION" +TESTS_EXIT_STATUS=$? +set -e echo "--- 📦 Zipping test results" cd fastlane/test_output/ && zip -rq WooCommerce.xcresult.zip WooCommerce.xcresult && cd - + +exit $TESTS_EXIT_STATUS diff --git a/.buildkite/commands/run-unit-tests.sh b/.buildkite/commands/run-unit-tests.sh index 2a76feb75e3..14ec6c763b8 100755 --- a/.buildkite/commands/run-unit-tests.sh +++ b/.buildkite/commands/run-unit-tests.sh @@ -16,7 +16,12 @@ echo "--- :rubygems: Setting up Gems" install_gems echo "--- 🧪 Testing" +set +e bundle exec fastlane test_without_building name:UnitTests +TESTS_EXIT_STATUS=$? +set -e echo "--- 📦 Zipping test results" cd fastlane/test_output/ && zip -rq WooCommerce.xcresult.zip WooCommerce.xcresult && cd - + +exit $TESTS_EXIT_STATUS From 6fcc82f97d245fcc87d2884b00762c5e9d9f5b0b Mon Sep 17 00:00:00 2001 From: Tony Li Date: Mon, 5 Sep 2022 12:07:30 +1200 Subject: [PATCH 63/74] Force a couple of test case failures --- WooCommerce/WooCommerceTests/AppCoordinatorTests.swift | 2 +- WooCommerce/WooCommerceUITests/Tests/OrdersTests.swift | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/WooCommerce/WooCommerceTests/AppCoordinatorTests.swift b/WooCommerce/WooCommerceTests/AppCoordinatorTests.swift index 978a5368140..6b872fb78e4 100644 --- a/WooCommerce/WooCommerceTests/AppCoordinatorTests.swift +++ b/WooCommerce/WooCommerceTests/AppCoordinatorTests.swift @@ -112,7 +112,7 @@ final class AppCoordinatorTests: XCTestCase { // so we have to wait a bit loginNavigationController.viewControllers.count > 1 } - XCTAssertTrue(loginNavigationController.topViewController is ULAccountMismatchViewController) + XCTAssertFalse(loginNavigationController.topViewController is ULAccountMismatchViewController) } func test_starting_app_logged_in_without_selected_site_presents_error_if_the_error_site_address_does_not_have_woo() throws { diff --git a/WooCommerce/WooCommerceUITests/Tests/OrdersTests.swift b/WooCommerce/WooCommerceUITests/Tests/OrdersTests.swift index d7b150d2477..028c52c70fe 100644 --- a/WooCommerce/WooCommerceUITests/Tests/OrdersTests.swift +++ b/WooCommerce/WooCommerceUITests/Tests/OrdersTests.swift @@ -23,6 +23,8 @@ final class OrdersTests: XCTestCase { .verifySingleOrder(order: orders[0]) .goBackToOrdersScreen() .verifyOrdersScreenLoaded() + + XCTAssertEqual(0, 1) } func test_create_new_order() throws { From 21e614fab3f9533300d0cf01385a5dba221c5dcf Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Mon, 5 Sep 2022 09:54:41 +1000 Subject: [PATCH 64/74] Update Tracks from version `0.12.0-beta.2` to `0.12.0` stable This didn't happen at code freeze time because of what looked like CDN hiccups. --- Podfile | 2 +- Podfile.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Podfile b/Podfile index f8fb4b09950..8b8efb1ab3b 100644 --- a/Podfile +++ b/Podfile @@ -27,7 +27,7 @@ def aztec end def tracks - pod 'Automattic-Tracks-iOS', '~> 0.12.0-beta.2' + pod 'Automattic-Tracks-iOS', '~> 0.12.0' # pod 'Automattic-Tracks-iOS', :git => 'https://github.com/Automattic/Automattic-Tracks-iOS.git', :branch => '' # pod 'Automattic-Tracks-iOS', :git => 'https://github.com/Automattic/Automattic-Tracks-iOS.git', :commit => '' # pod 'Automattic-Tracks-iOS', :path => '../Automattic-Tracks-iOS' diff --git a/Podfile.lock b/Podfile.lock index bd50cc90f6c..5a2ce26af2f 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -6,7 +6,7 @@ PODS: - AppAuth/Core (1.5.0) - AppAuth/ExternalUserAgent (1.5.0): - AppAuth/Core - - Automattic-Tracks-iOS (0.12.0-beta.2): + - Automattic-Tracks-iOS (0.12.0): - Sentry (~> 6) - Sodium (>= 0.9.1) - UIDeviceIdentifier (~> 2.0) @@ -83,7 +83,7 @@ PODS: DEPENDENCIES: - Alamofire (~> 4.8) - - Automattic-Tracks-iOS (~> 0.12.0-beta.2) + - Automattic-Tracks-iOS (~> 0.12.0) - CocoaLumberjack (~> 3.7.4) - CocoaLumberjack/Swift (~> 3.7.4) - Gridicons (~> 1.2.0) @@ -144,7 +144,7 @@ SPEC REPOS: SPEC CHECKSUMS: Alamofire: 3ec537f71edc9804815215393ae2b1a8ea33a844 AppAuth: 80317d99ac7ff2801a2f18ff86b48cd315ed465d - Automattic-Tracks-iOS: f31213fbf0391968ffcff75e8c1bdad398589261 + Automattic-Tracks-iOS: dae8787ffc2c74493a3a908abc48aed527686131 CocoaLumberjack: 543c79c114dadc3b1aba95641d8738b06b05b646 FormatterKit: 184db51bf120b633693a73624a4cede89ec51a41 GoogleSignIn: fd381840dbe7c1137aa6dc30849a5c3e070c034a @@ -179,6 +179,6 @@ SPEC CHECKSUMS: ZendeskSupportProvidersSDK: 2bdf8544f7cd0fd4c002546f5704b813845beb2a ZendeskSupportSDK: 3a8e508ab1d9dd22dc038df6c694466414e037ba -PODFILE CHECKSUM: 4bdf9f791fbedc1074a7e20f9ff254db1f59c7ba +PODFILE CHECKSUM: 79417db449eae85f8a39f1707df162e137f11d43 COCOAPODS: 1.11.2 From 32f5be1bd27a7ee3cb52e838b2f5d6656641fc9f Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Mon, 5 Sep 2022 09:57:45 +1000 Subject: [PATCH 65/74] Only link, not embed, WooFoundation and Experiments in widgets target Otherwise, we'll get the following error when uploading to ASC: ``` ERROR ITMS-90685: "CFBundleIdentifier Collision. There is more than one bundle with the CFBundleIdentifier value 'com.automattic.woo.WooFoundation' under the iOS application 'WooCommerce.app'." ERROR ITMS-90685: "CFBundleIdentifier Collision. There is more than one bundle with the CFBundleIdentifier value 'com.automattic.Experiments' under the iOS application 'WooCommerce.app'." ERROR ITMS-90205: "Invalid Bundle. The bundle at 'WooCommerce.app/PlugIns/StoreWidgetsExtension.appex' contains disallowed nested bundles." ERROR ITMS-90206: "Invalid Bundle. The bundle at 'WooCommerce.app/PlugIns/StoreWidgetsExtension.appex' contains disallowed file 'Frameworks'." ``` The main target, WooCommerce, already embeds WooFoundation and Experiments. If we embed them in the widgets target as well, everything will work fine at runtime but ASC won't let us complete the upload. Notice that the to frameworks are still linked in the widgets target, so everything still compile fines. See build failure at: https://buildkite.com/automattic/woocommerce-ios/builds/7668#01830113-0c06-4416-835e-6b42633bbf74 --- WooCommerce/WooCommerce.xcodeproj/project.pbxproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index 50fd25314cd..75b5c137095 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -594,9 +594,7 @@ 26CCBE0D2523C2560073F94D /* RefundProductsTotalTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 26CCBE0C2523C2560073F94D /* RefundProductsTotalTableViewCell.xib */; }; 26CFDB2727357E8000AB940B /* SimplePaymentsSummary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26CFDB2627357E8000AB940B /* SimplePaymentsSummary.swift */; }; 26D9E54428C107F80098DF26 /* WooFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26D9E54328C107F80098DF26 /* WooFoundation.framework */; }; - 26D9E54528C107F80098DF26 /* WooFoundation.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 26D9E54328C107F80098DF26 /* WooFoundation.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 26D9E54828C10A3B0098DF26 /* Experiments.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26D9E54728C10A3B0098DF26 /* Experiments.framework */; }; - 26D9E54928C10A3C0098DF26 /* Experiments.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 26D9E54728C10A3B0098DF26 /* Experiments.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 26DB7E3528636D2200506173 /* NonEditableOrderBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26DB7E3428636D2200506173 /* NonEditableOrderBanner.swift */; }; 26E0ADF12631D94D00A5EB3B /* TopBannerWrapperView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26E0ADF02631D94D00A5EB3B /* TopBannerWrapperView.swift */; }; 26E0AE13263359F900A5EB3B /* View+Conditionals.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26E0AE12263359F900A5EB3B /* View+Conditionals.swift */; }; @@ -1878,8 +1876,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 26D9E54528C107F80098DF26 /* WooFoundation.framework in Embed Frameworks */, - 26D9E54928C10A3C0098DF26 /* Experiments.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; From adf12dc28e9b6b7c388fd61cd3dbf5bd21aa9ed4 Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Mon, 5 Sep 2022 10:46:23 +1000 Subject: [PATCH 66/74] =?UTF-8?q?Update=20app=20translations=20=E2=80=93?= =?UTF-8?q?=20`Localizable.strings`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Resources/ar.lproj/Localizable.strings | 39 ++++++---------- .../Resources/de.lproj/Localizable.strings | 39 ++++++---------- .../Resources/es.lproj/Localizable.strings | 39 ++++++---------- .../Resources/fr.lproj/Localizable.strings | 39 ++++++---------- .../Resources/he.lproj/Localizable.strings | 39 ++++++---------- .../Resources/id.lproj/Localizable.strings | 39 ++++++---------- .../Resources/it.lproj/Localizable.strings | 39 ++++++---------- .../Resources/ja.lproj/Localizable.strings | 39 ++++++---------- .../Resources/ko.lproj/Localizable.strings | 39 ++++++---------- .../Resources/nl.lproj/Localizable.strings | 39 ++++++---------- .../Resources/pt-BR.lproj/Localizable.strings | 39 ++++++---------- .../Resources/ru.lproj/Localizable.strings | 39 ++++++---------- .../Resources/sv.lproj/Localizable.strings | 44 ++++++++----------- .../Resources/tr.lproj/Localizable.strings | 39 ++++++---------- .../zh-Hans.lproj/Localizable.strings | 39 ++++++---------- .../zh-Hant.lproj/Localizable.strings | 39 ++++++---------- 16 files changed, 228 insertions(+), 401 deletions(-) diff --git a/WooCommerce/Resources/ar.lproj/Localizable.strings b/WooCommerce/Resources/ar.lproj/Localizable.strings index c4f65ddcab0..a0d62765c9b 100644 --- a/WooCommerce/Resources/ar.lproj/Localizable.strings +++ b/WooCommerce/Resources/ar.lproj/Localizable.strings @@ -1096,9 +1096,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "تأكيد طريقة الدفع"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "تم اكتشاف إضافات دفع متعارضة"; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "تهانينا، لقد قرأت كل شيء!"; @@ -1207,7 +1204,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "المتابعة باستخدام Apple"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "تحويل"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2271,6 +2269,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "مساعدة"; @@ -2350,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "لم يكتمل إعداد المدفوعات الشخصية."; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "تتم معالجة المدفوعات الشخصية من خلال WooCommerce Payments."; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "يمكن معالجة المدفوعات الشخصية من خلال أي من مزوِّدي الدفع هؤلاء. ما المزوِّد الذي ترغب في استخدامه؟"; @@ -2364,12 +2360,6 @@ which should be translated separately and considered part of this sentence. */ /* Title for the error screen when the merchant's payment account has been rejected. */ "In-Person Payments isn't available for this store" = "المدفوعات الشخصية غير متاحة لهذا المخزن"; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "لن تعمل المدفوعات الشخصية سوى مع تفعيل إحدى الإضافات الآتية. يرجى الاتصال بمسؤول الموقع لتعطيل إحدى هذه الإضافات للمتابعة:"; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "لن تعمل المدفوعات الشخصية سوى مع تفعيل إحدى الإضافات الآتية. يرجى تعطيل إحدى هذه الإضافات للمتابعة:"; - /* Application's Inactive State */ "Inactive" = "غير نشط"; @@ -2599,8 +2589,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2773,9 +2766,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Title of the action sheet displayed from the Coupon Details screen */ "Manage Coupon" = "إدارة قسيمة"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "إدارة الإضافات"; - /* Caption displayed in promotional screens shown during the login flow. */ "Manage and edit orders on the go" = "إدارة الطلبات وتحريرها في أثناء التنقل"; @@ -3245,6 +3235,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "قائمة مرتَّبة"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "الطلبات"; @@ -3340,7 +3331,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "الدفع باستخدام بطاقة أو طريقة دفع أخرى مقبولة"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "الدفع بشكل شخصي"; /* Payment section title @@ -4008,6 +4000,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "إعادة المحاولة"; @@ -4025,7 +4018,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "الرجوع إلى المرسل إذا تعذر توصيل الحزمة"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "الإيراد"; /* Title of Review Order screen */ @@ -5230,12 +5224,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "لإغلاق هذا الحساب الآن، اتصل بفريق الدعم."; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "لتحصيل المدفوعات، يرجى أن تطلب من أحد المسؤولين تعطيل WooCommerce Stripe Gateway."; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "لتحصيل المدفوعات، يرجى تعطيل WooCommerce Stripe Gateway."; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "للتأكيد، يرجى إعادة إدخال اسم المستخدم الخاص بك قبل الإغلاق.\n\n%1$@"; @@ -5796,7 +5784,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "الرؤية"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "الزائرون"; /* Add a note screen - Write Note section title */ diff --git a/WooCommerce/Resources/de.lproj/Localizable.strings b/WooCommerce/Resources/de.lproj/Localizable.strings index 7dba7756a9e..80ababd97ea 100644 --- a/WooCommerce/Resources/de.lproj/Localizable.strings +++ b/WooCommerce/Resources/de.lproj/Localizable.strings @@ -1096,9 +1096,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "Zahlungsmethode bestätigen"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "In Konflikt stehende Zahlungsplugins entdeckt"; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "Glückwunsch, du hast alles gelesen!"; @@ -1207,7 +1204,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "Weiter mit Apple"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "Conversion"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2271,6 +2269,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "Hilfe"; @@ -2350,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "Einrichtung von „Persönliche Zahlungen“ abgeschlossen."; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "Persönliche Zahlungen werden mit WooCommerce Payments verarbeitet."; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "Persönliche Zahlungen können über einen dieser Zahlungsanbieter verarbeitet werden. Welchen Anbieter möchtest du verwenden?"; @@ -2364,12 +2360,6 @@ which should be translated separately and considered part of this sentence. */ /* Title for the error screen when the merchant's payment account has been rejected. */ "In-Person Payments isn't available for this store" = "„Persönliche Zahlungen“ ist für diesen Store nicht verfügbar."; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "Persönliche Zahlungen funktionieren nur, wenn eines der folgenden Plugins aktiviert ist. Bitte setze dich mit einem Website-Administrator in Verbindung, um eines dieser Plugins zu deaktivieren und fortzufahren:"; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "Persönliche Zahlungen funktionieren nur, wenn eines der folgenden Plugins aktiviert ist. Deaktiviere eines der folgenden Plugins, um fortzufahren:"; - /* Application's Inactive State */ "Inactive" = "Inaktiv"; @@ -2599,8 +2589,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2773,9 +2766,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Title of the action sheet displayed from the Coupon Details screen */ "Manage Coupon" = "Gutschein verwalten"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "Plugins verwalten"; - /* Caption displayed in promotional screens shown during the login flow. */ "Manage and edit orders on the go" = "Verwalte und bearbeite Bestellungen auch unterwegs"; @@ -3245,6 +3235,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "Sortierte Liste"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "Bestellungen"; @@ -3340,7 +3331,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "Kartenzahlung oder eine andere akzeptierte Zahlungsmethode"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "Persönliche Zahlung"; /* Payment section title @@ -4008,6 +4000,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Erneut versuchen"; @@ -4025,7 +4018,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "An Absender zurücksenden, wenn Paket nicht zugestellt werden kann"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "Umsatz"; /* Title of Review Order screen */ @@ -5230,12 +5224,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "Kontaktiere unser Support-Team, um dieses Konto jetzt zu schließen."; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "Bitte einen Administrator, WooCommerce Stripe Gateway zu deaktivieren, um Zahlungen zu empfangen."; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "Deaktiviere WooCommerce Stripe Gateway, um Zahlungen zu empfangen."; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "Bitte gib den Benutzernamen vor dem Schließen erneut an, um den Vorgang zu bestätigen.\n\n%1$@"; @@ -5796,7 +5784,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "Sichtbarkeit"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "Besucher"; /* Add a note screen - Write Note section title */ diff --git a/WooCommerce/Resources/es.lproj/Localizable.strings b/WooCommerce/Resources/es.lproj/Localizable.strings index 6e926ba1e53..a64d9b18fc8 100644 --- a/WooCommerce/Resources/es.lproj/Localizable.strings +++ b/WooCommerce/Resources/es.lproj/Localizable.strings @@ -1096,9 +1096,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "Confirmar método de pago"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "Se han detectado plugins de pago conflictivos."; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "¡Enhorabuena, has acabado de leer!"; @@ -1207,7 +1204,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "Seguir con Apple"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "Conversión"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2271,6 +2269,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "Ayuda"; @@ -2350,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "La configuración de Pagos en persona no se ha completado."; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "Los pagos en persona se procesan a través de WooCommerce Payments."; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "Los pagos en persona se pueden procesar a través de cualquiera de estos proveedores de pago. ¿Qué proveedor te gustaría utilizar?"; @@ -2364,12 +2360,6 @@ which should be translated separately and considered part of this sentence. */ /* Title for the error screen when the merchant's payment account has been rejected. */ "In-Person Payments isn't available for this store" = "Pagos en Persona no está disponible para esta tienda"; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "Los Pagos en Persona solo funcionarán si uno de los siguientes plugins está activado. Para continuar, ponte en contacto con un administrador del sitio y desactiva uno de estos plugins:"; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "Los Pagos en Persona solo funcionarán si uno de los siguientes plugins está activado. Para continuar, desactiva uno de estos plugins:"; - /* Application's Inactive State */ "Inactive" = "Inactivo"; @@ -2599,8 +2589,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2773,9 +2766,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Title of the action sheet displayed from the Coupon Details screen */ "Manage Coupon" = "Gestionar cupón"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "Gestionar plugins"; - /* Caption displayed in promotional screens shown during the login flow. */ "Manage and edit orders on the go" = "Gestiona y edita pedidos sobre la marcha"; @@ -3245,6 +3235,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "Lista ordenada"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "Pedidos"; @@ -3340,7 +3331,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "Paga con tarjeta u otro método de pago aceptado"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "Pagos en persona"; /* Payment section title @@ -4008,6 +4000,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Reintentar"; @@ -4025,7 +4018,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "Devolver el paquete al remitente si no se puede entregar"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "Ingresos"; /* Title of Review Order screen */ @@ -5230,12 +5224,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "Para cerrar esta cuenta ahora, contacta con nuestro equipo de soporte."; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "Para aceptar pagos, pide a un administrador que desactive WooCommerce Stripe Gateway."; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "Para aceptar pagos, desactiva WooCommerce Stripe Gateway."; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "Para confirmar, por favor, vuelve a introducir tu nombre de usuario antes de cerrarlo.\n\n%1$@"; @@ -5796,7 +5784,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "Visibilidad"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "Visitantes"; /* Add a note screen - Write Note section title */ diff --git a/WooCommerce/Resources/fr.lproj/Localizable.strings b/WooCommerce/Resources/fr.lproj/Localizable.strings index 7405cdc2cc9..1fc2af6091c 100644 --- a/WooCommerce/Resources/fr.lproj/Localizable.strings +++ b/WooCommerce/Resources/fr.lproj/Localizable.strings @@ -1096,9 +1096,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "Confirmer le mode de paiement"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "Nous avons détecté des extensions de paiement en conflit"; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "Féliciations, vous avez tout lu !"; @@ -1207,7 +1204,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "Continuer avec Apple"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "Conversion"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2271,6 +2269,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "Aide"; @@ -2350,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "La configuration des paiements en personne est incomplète."; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "Les paiements en personne sont traités à l’aide de WooCommerce Payments."; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "Les paiements en personne peuvent être traités à partir de ces fournisseurs de paiement. Quel fournisseur souhaitez-vous utiliser ?"; @@ -2364,12 +2360,6 @@ which should be translated separately and considered part of this sentence. */ /* Title for the error screen when the merchant's payment account has been rejected. */ "In-Person Payments isn't available for this store" = "Les paiements en personne ne sont pas disponibles pour cette boutique."; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "Les paiements en personne ne fonctionnent que si l’une des extensions suivantes est activée. Veuillez demander à un administrateur du site de désactiver l’une des extensions suivantes afin de pouvoir continuer :"; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "Les paiements en personne ne fonctionnent que si l’une des extensions suivantes est activée. Veuillez désactiver l’une de ces extensions pour pouvoir continuer :"; - /* Application's Inactive State */ "Inactive" = "Inactif"; @@ -2599,8 +2589,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2773,9 +2766,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Title of the action sheet displayed from the Coupon Details screen */ "Manage Coupon" = "Gérer les codes promo"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "Gérer les extensions"; - /* Caption displayed in promotional screens shown during the login flow. */ "Manage and edit orders on the go" = "Gérez et modifiez vos commandes à la volée"; @@ -3245,6 +3235,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "Liste ordonnée"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "Commandes"; @@ -3340,7 +3331,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "Payer par carte ou à l’aide d’un autre moyen de paiement accepté"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "Payer en personne"; /* Payment section title @@ -4008,6 +4000,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Réessayer"; @@ -4025,7 +4018,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "Retour à l’expéditeur si le colis ne peut être livré"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "Revenu"; /* Title of Review Order screen */ @@ -5230,12 +5224,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "Pour fermer ce compte maintenant, contactez notre équipe d’assistance."; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "Pour accepter des paiements, demandez à un administrateur de désactiver WooCommerce Stripe Gateway."; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "Pour accepter des paiements, désactivez WooCommerce Stripe Gateway."; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "Pour confirmer, saisissez à nouveau votre identifiant avant de fermer.\n\n%1$@"; @@ -5796,7 +5784,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "Visibilité"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "Visiteurs"; /* Add a note screen - Write Note section title */ diff --git a/WooCommerce/Resources/he.lproj/Localizable.strings b/WooCommerce/Resources/he.lproj/Localizable.strings index 5176dcfa604..c136daa922c 100644 --- a/WooCommerce/Resources/he.lproj/Localizable.strings +++ b/WooCommerce/Resources/he.lproj/Localizable.strings @@ -1096,9 +1096,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "לאשר את אמצעי התשלום"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "תוספי תשלומים מתנגשים זוהו"; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "ברכותינו, קראת הכול!"; @@ -1207,7 +1204,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "להמשיך עם Apple"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "המרה"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2271,6 +2269,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "עזרה"; @@ -2350,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "הגדרה של 'תשלומים באופן אישי' לא הושלמה."; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "תשלומים באופן אישי מעובדים דרך WooCommerce Payments."; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "אפשר לעבד תשלומים באופן אישי באמצעות אחד מספקי התשלום האלו. באיזה ספק ברצונך להשתמש?"; @@ -2364,12 +2360,6 @@ which should be translated separately and considered part of this sentence. */ /* Title for the error screen when the merchant's payment account has been rejected. */ "In-Person Payments isn't available for this store" = "תשלומים באופן אישי אינם זמינים עבור חנות זו"; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "אפשרות התשלומים באופן אישי תעבוד רק כשאחד מהתוספים הבאים מופעל. יש ליצור קשר עם מנהל האתר כדי לכבות את אחד מהתוספים האלו על מנת להמשיך:"; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "אפשרות התשלומים באופן אישי תעבוד רק כשאחד מהתוספים הבאים מופעל. יש לכבות את אחד מהתוספים האלו כדי להמשיך:"; - /* Application's Inactive State */ "Inactive" = "לא פעיל"; @@ -2599,8 +2589,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2773,9 +2766,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Title of the action sheet displayed from the Coupon Details screen */ "Manage Coupon" = "ניהול קופון"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "ניהול תוספים"; - /* Caption displayed in promotional screens shown during the login flow. */ "Manage and edit orders on the go" = "לנהל ולערוך הזמנות מכל מקום"; @@ -3245,6 +3235,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "רשימה ממוספרת"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "הזמנות"; @@ -3340,7 +3331,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "לשלם באמצעות כרטיס או עם אמצעי תשלום נתמך אחר"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "תשלום באופן אישי"; /* Payment section title @@ -4008,6 +4000,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "נסה שנית"; @@ -4025,7 +4018,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "להחזיר לשולח אם לא ניתן לשלוח את החבילה"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "הכנסה"; /* Title of Review Order screen */ @@ -5230,12 +5224,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "לסגירת חשבון זה כעת, עליך לפנות לצוות התמיכה שלנו."; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "לגביית תשלומים, יש לפנות אל מנהל מערכת כדי להשבית את WooCommerce Stripe Gateway."; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "לגביית תשלומים, יש להשבית את WooCommerce Stripe Gateway."; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "לאישור, עליך להזין שוב את שם המשתמש שלך לפני הסגירה.\n\n%1$@"; @@ -5796,7 +5784,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "נראות"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "מבקרים"; /* Add a note screen - Write Note section title */ diff --git a/WooCommerce/Resources/id.lproj/Localizable.strings b/WooCommerce/Resources/id.lproj/Localizable.strings index e4320614e17..117ecc7accf 100644 --- a/WooCommerce/Resources/id.lproj/Localizable.strings +++ b/WooCommerce/Resources/id.lproj/Localizable.strings @@ -1096,9 +1096,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "Konfirmasi Metode Pembayaran"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "Konflik plugin pembayaran terdeteksi"; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "Selamat, Anda telah membaca semuanya!"; @@ -1207,7 +1204,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "Melanjutkan dengan Apple"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "Konversi"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2271,6 +2269,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "Bantuan"; @@ -2350,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "Pengaturan Pembayaran Langsung belum lengkap."; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "Pembayaran Langsung diproses melalui WooCommerce Payments."; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "Pembayaran Langsung dapat diproses melalui penyedia pembayaran berikut. Penyedia mana yang ingin Anda gunakan?"; @@ -2364,12 +2360,6 @@ which should be translated separately and considered part of this sentence. */ /* Title for the error screen when the merchant's payment account has been rejected. */ "In-Person Payments isn't available for this store" = "Pembayaran Langsung tidak tersedia untuk toko ini"; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "Pembayaran Langsung hanya akan berfungsi jika salah satu plugin berikut diaktifkan. Hubungi administrator situs untuk menonaktifkan salah satu plugin berikut agar dapat melanjutkan:"; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "Pembayaran Langsung hanya akan berfungsi jika salah satu plugin berikut diaktifkan. Harap nonaktifkan salah satu plugin berikut untuk melanjutkan:"; - /* Application's Inactive State */ "Inactive" = "Nonaktif"; @@ -2599,8 +2589,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2773,9 +2766,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Title of the action sheet displayed from the Coupon Details screen */ "Manage Coupon" = "Kelola Kupon"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "Kelola Plugin"; - /* Caption displayed in promotional screens shown during the login flow. */ "Manage and edit orders on the go" = "Kelola dan sunting pesanan dari mana saja"; @@ -3245,6 +3235,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "Daftar Berurutan"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "Pesanan"; @@ -3340,7 +3331,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "Bayar menggunakan kartu atau metode pembayaran lain yang diterima"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "Pembayaran Langsung"; /* Payment section title @@ -4008,6 +4000,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Coba Lagi"; @@ -4025,7 +4018,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "Kembalikan ke pengirim jika paket tidak dapat dikirimkan"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "Pendapatan"; /* Title of Review Order screen */ @@ -5230,12 +5224,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "Untuk menutup akun ini sekarang juga, hubungi tim dukungan kami."; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "Untuk menerima pembayaran, harap minta administrator untuk menonaktifkan WooCommerce Stripe Gateway."; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "Untuk menerima pembayaran, harap nonaktifkan WooCommerce Stripe Gateway."; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "Untuk mengonfirmasi, silakan masukkan lagi nama pengguna Anda sebelum menutup.\n\n%1$@"; @@ -5796,7 +5784,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "Visibilitas"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "Pengunjung"; /* Add a note screen - Write Note section title */ diff --git a/WooCommerce/Resources/it.lproj/Localizable.strings b/WooCommerce/Resources/it.lproj/Localizable.strings index 2e0a7f0dbaa..e1576d75e04 100644 --- a/WooCommerce/Resources/it.lproj/Localizable.strings +++ b/WooCommerce/Resources/it.lproj/Localizable.strings @@ -1096,9 +1096,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "Conferma metodo di pagamento"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "Conflitto con i plugin di pagamento rilevato"; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "Congratulazioni, hai letto tutto."; @@ -1207,7 +1204,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "Continua con Apple"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "Conversione"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2271,6 +2269,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "Aiuto"; @@ -2350,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "La configurazione di Pagamenti di persona non è completa."; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "I Pagamenti di persona vengono elaborati tramite WooCommerce Payments."; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "I pagamenti di persona possono essere elaborati tramite uno di questi fornitori di servizi di pagamento. Quale fornitore desideri utilizzare?"; @@ -2364,12 +2360,6 @@ which should be translated separately and considered part of this sentence. */ /* Title for the error screen when the merchant's payment account has been rejected. */ "In-Person Payments isn't available for this store" = "Pagamenti di persona non è disponibile per questo negozio"; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "I pagamenti di persona funzioneranno solo con uno dei seguenti plugin attivato. Per continuare, contatta un amministratore del sito per disattivare uno di questi plugin:"; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "I pagamenti di persona funzioneranno solo con uno dei seguenti plugin attivato. Per continuare disattiva uno di questi plugin:"; - /* Application's Inactive State */ "Inactive" = "Inattivo"; @@ -2599,8 +2589,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2773,9 +2766,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Title of the action sheet displayed from the Coupon Details screen */ "Manage Coupon" = "Gestisci codice promozionale"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "Gestisci i plugin"; - /* Caption displayed in promotional screens shown during the login flow. */ "Manage and edit orders on the go" = "Gestisci e modifica gli ordini in movimento"; @@ -3245,6 +3235,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "Elenco ordinato"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "Ordini"; @@ -3340,7 +3331,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "Paga con carta o un altro metodo di pagamento accettato"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "Paga di persona"; /* Payment section title @@ -4008,6 +4000,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Riprova"; @@ -4025,7 +4018,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "Restituisci al mittente se non è possibile consegnare il pacchetto"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "Fatturato"; /* Title of Review Order screen */ @@ -5230,12 +5224,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "Per chiudere questo account ora, contatta il team di supporto."; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "Per ricevere pagamenti, chiedi a un amministratore di disattivare WooCommerce Stripe Gateway."; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "Per ricevere pagamenti, disattiva WooCommerce Stripe Gateway."; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "Per confermare, inserisci nuovamente il nome utente prima di chiudere.\n\n%1$@"; @@ -5796,7 +5784,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "Visibilità"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "Visitatori"; /* Add a note screen - Write Note section title */ diff --git a/WooCommerce/Resources/ja.lproj/Localizable.strings b/WooCommerce/Resources/ja.lproj/Localizable.strings index ef03cd2161a..9cb57465118 100644 --- a/WooCommerce/Resources/ja.lproj/Localizable.strings +++ b/WooCommerce/Resources/ja.lproj/Localizable.strings @@ -1096,9 +1096,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "決済方法を確認"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "支払いプラグインが複数検出されました"; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "すべて読み終えました !"; @@ -1207,7 +1204,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "Apple 製品で続ける"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "コンバージョン"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2271,6 +2269,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "ヘルプ"; @@ -2350,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "直接支払いのセットアップが完了していません。"; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "オフラインでの支払いは WooCommerce Payments で処理されます。"; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "オフラインでの支払いはこのいずれかの決済サービス業者が処理できます。 どの決済サービス業者をご利用になりますか ?"; @@ -2364,12 +2360,6 @@ which should be translated separately and considered part of this sentence. */ /* Title for the error screen when the merchant's payment account has been rejected. */ "In-Person Payments isn't available for this store" = "このストアではオフラインでの支払いを使用できません"; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "オフラインでの支払いは、次のプラグインのいずれかが有効化済みの場合にのみ機能します。 続行するには、サイト管理者に連絡して、次のプラグインのいずれかを無効化してください。"; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "オフラインでの支払いは、次のプラグインのいずれかが有効化済みの場合にのみ機能します。 続行するには、次のプラグインのいずれかを無効化してください。"; - /* Application's Inactive State */ "Inactive" = "停止中"; @@ -2599,8 +2589,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2773,9 +2766,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Title of the action sheet displayed from the Coupon Details screen */ "Manage Coupon" = "クーポンを管理"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "プラグインを管理"; - /* Caption displayed in promotional screens shown during the login flow. */ "Manage and edit orders on the go" = "外出先でも注文を管理・編集"; @@ -3245,6 +3235,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "順序付きリスト"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "注文"; @@ -3340,7 +3331,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "カードまたはその他の承認された支払い方法で支払う"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "直接支払い"; /* Payment section title @@ -4008,6 +4000,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "再度試す"; @@ -4025,7 +4018,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "荷物を配達できなかった場合、荷送人に差し戻す"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "収益"; /* Title of Review Order screen */ @@ -5230,12 +5224,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "このアカウントをすぐにクローズする場合、弊社のサポートチームに連絡してください。"; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "支払いを受け取るには、管理者に連絡して WooCommerce Stripe Gateway を停止してください。"; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "支払いを受け取るには、WooCommerce Stripe Gateway を停止してください。"; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "確認するには、閉鎖する前のユーザーアカウントをもう一度入力してください。\n\n%1$@"; @@ -5796,7 +5784,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "公開状態"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "訪問者"; /* Add a note screen - Write Note section title */ diff --git a/WooCommerce/Resources/ko.lproj/Localizable.strings b/WooCommerce/Resources/ko.lproj/Localizable.strings index ea7e8d63b80..a7d90f27b29 100644 --- a/WooCommerce/Resources/ko.lproj/Localizable.strings +++ b/WooCommerce/Resources/ko.lproj/Localizable.strings @@ -1096,9 +1096,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "결제 수단 확인"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "충돌하는 결제 플러그인 감지됨"; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "수고하셨습니다. 다 읽으셨습니다!"; @@ -1207,7 +1204,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "Apple로 계속하기"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "전환"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2271,6 +2269,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "도움말"; @@ -2350,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "대면 결제 설정이 완료되지 않았습니다."; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "대면 결제는 WooCommerce Payments를 통해 처리됩니다."; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "이러한 결제 제공업체 중 하나를 통해 대면 결제를 처리할 수 있습니다. 어떤 제공업체를 사용하시겠어요?"; @@ -2364,12 +2360,6 @@ which should be translated separately and considered part of this sentence. */ /* Title for the error screen when the merchant's payment account has been rejected. */ "In-Person Payments isn't available for this store" = "이 스토어에서 대면 결제 사용 불가능"; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "활성화된 다음 플러그인 중 하나만 직접 결제와 연동합니다. 계속하려면 사이트 관리자에게 문의하여 다음과 같은 플러그인 중 하나를 비활성화하세요."; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "활성화된 다음 플러그인 중 하나만 직접 결제와 연동합니다. 계속하려면 다음과 같은 플러그인 중 하나를 비활성화하세요."; - /* Application's Inactive State */ "Inactive" = "비활성"; @@ -2599,8 +2589,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2773,9 +2766,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Title of the action sheet displayed from the Coupon Details screen */ "Manage Coupon" = "쿠폰 관리"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "플러그인 관리"; - /* Caption displayed in promotional screens shown during the login flow. */ "Manage and edit orders on the go" = "항상 주문 관리 및 편집"; @@ -3245,6 +3235,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "순서 있는 목록"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "주문"; @@ -3340,7 +3331,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "카드 또는 수락되는 다른 결제 수단으로 결제"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "대면 결제"; /* Payment section title @@ -4008,6 +4000,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "재실행"; @@ -4025,7 +4018,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "패키지를 배송할 수 없는 경우 보낸 사람에게 반송"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "수익"; /* Title of Review Order screen */ @@ -5230,12 +5224,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "이 계정을 지금 닫으려면, 지원 팀에 문의하세요."; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "결제 정보를 수집하려면 관리자에게 문의하여 WooCommerce Stripe Gateway를 비활성화하세요."; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "결제 정보를 수집하려면 WooCommerce Stripe Gateway를 비활성화하세요."; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "확인하려면 종료하기 전에 사용자명을 다시 입력하세요.\n\n%1$@"; @@ -5796,7 +5784,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "공개 설정"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "방문자"; /* Add a note screen - Write Note section title */ diff --git a/WooCommerce/Resources/nl.lproj/Localizable.strings b/WooCommerce/Resources/nl.lproj/Localizable.strings index 2f9ce9231c5..4c89e316a49 100644 --- a/WooCommerce/Resources/nl.lproj/Localizable.strings +++ b/WooCommerce/Resources/nl.lproj/Localizable.strings @@ -1096,9 +1096,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "Betaalmethode bevestigen"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "Tegenstrijdige plugins voor betalingen gedetecteerd"; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "Gefeliciteerd, je hebt alles gelezen!"; @@ -1207,7 +1204,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "Doorgaan met Apple"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "Conversie"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2271,6 +2269,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "Help"; @@ -2350,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "Instellen van fysieke betalingen is gereed."; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "Fysieke betalingen worden verwerkt via WooCommerce Payments."; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "Fysieke betalingen kunnen worden verwerkt via een van deze betaalproviders. Welke provider wil je gebruiken?"; @@ -2364,12 +2360,6 @@ which should be translated separately and considered part of this sentence. */ /* Title for the error screen when the merchant's payment account has been rejected. */ "In-Person Payments isn't available for this store" = "Fysieke betalingen zijn niet beschikbaar voor deze winkel"; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "Fysieke betalingen werken alleen als een van de volgende plugins is geactiveerd. Om verder te gaan, neem contact op met een sitebeheerder om een van deze plugins te deactiveren:"; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "Fysieke betalingen werken alleen als een van de volgende plugins is geactiveerd. Deactiveer een van deze plugins om verder te gaan:"; - /* Application's Inactive State */ "Inactive" = "Inactief"; @@ -2599,8 +2589,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2773,9 +2766,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Title of the action sheet displayed from the Coupon Details screen */ "Manage Coupon" = "Coupon beheren"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "Beheer plugins"; - /* Caption displayed in promotional screens shown during the login flow. */ "Manage and edit orders on the go" = "Beheer en bewerk bestellingen onderweg"; @@ -3245,6 +3235,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "Geordende lijst"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "Bestellingen"; @@ -3340,7 +3331,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "Met een kaart of andere geaccepteerde betaalmethode betalen"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "Fysiek betalen"; /* Payment section title @@ -4008,6 +4000,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Opnieuw"; @@ -4025,7 +4018,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "Terugsturen naar afzender als het pakket niet kan worden geleverd"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "Inkomsten"; /* Title of Review Order screen */ @@ -5230,12 +5224,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "Om dit account direct te sluiten, kun je contact opnemen met ons ondersteuningsteam."; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "Vraag een beheerder WooCommerce Stripe Gateway te deactiveren om betalingen aan te nemen."; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "Deactiveer WooCommerce Stripe Gateway om betalingen aan te nemen."; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "Om te bevestigen, geef je je gebruikersnaam opnieuw in voor het sluiten.\n\n%1$@"; @@ -5796,7 +5784,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "Zichtbaarheid"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "Bezoekers"; /* Add a note screen - Write Note section title */ diff --git a/WooCommerce/Resources/pt-BR.lproj/Localizable.strings b/WooCommerce/Resources/pt-BR.lproj/Localizable.strings index 372c66a84e4..e2e6527f333 100644 --- a/WooCommerce/Resources/pt-BR.lproj/Localizable.strings +++ b/WooCommerce/Resources/pt-BR.lproj/Localizable.strings @@ -1096,9 +1096,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "Confirmar forma de pagamento"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "Conflito de plugins de pagamento detectado"; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "Parabéns, você leu tudo!"; @@ -1207,7 +1204,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "Continuar com Apple"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "Conversão"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2271,6 +2269,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "Ajuda"; @@ -2350,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "A configuração de pagamentos presenciais está incompleta."; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "Pagamentos presenciais são processados usando o WooCommerce Payments."; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "Pagamentos presenciais podem ser processados por qualquer um destes provedores. Qual deles você quer usar?"; @@ -2364,12 +2360,6 @@ which should be translated separately and considered part of this sentence. */ /* Title for the error screen when the merchant's payment account has been rejected. */ "In-Person Payments isn't available for this store" = "O pagamento presencial não está disponível para esta loja"; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "Os pagamentos presenciais só vão funcionar com um dos seguintes plugins ativados. Entre em contato com um administrador do site para desativar um destes plugins para continuar:"; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "Os pagamentos presenciais só vão funcionar com um dos seguintes plugins ativados. Desative um destes plugins para continuar:"; - /* Application's Inactive State */ "Inactive" = "Inativas"; @@ -2599,8 +2589,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2773,9 +2766,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Title of the action sheet displayed from the Coupon Details screen */ "Manage Coupon" = "Gerenciar cupom"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "Gerenciar plugins"; - /* Caption displayed in promotional screens shown during the login flow. */ "Manage and edit orders on the go" = "Gerencie e edite seus pedidos de qualquer lugar"; @@ -3245,6 +3235,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "Lista ordenada"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "Pedidos"; @@ -3340,7 +3331,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "Pague com cartão ou outra forma de pagamento aceita"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "Pagamento presencial"; /* Payment section title @@ -4008,6 +4000,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Tentar novamente"; @@ -4025,7 +4018,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "Devolver o pacote ao remetente caso não possa ser enviado"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "Receita"; /* Title of Review Order screen */ @@ -5230,12 +5224,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "Para encerrar a conta agora, fale com nossa equipe de suporte."; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "Para receber pagamentos, peça a um administrador para desativar o gateway WooCommerce Stripe."; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "Para receber pagamentos, desative o gateway WooCommerce Stripe."; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "Para confirmar, digite novamente seu nome de usuário antes de encerrar.\n\n%1$@"; @@ -5796,7 +5784,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "Visibilidade"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "Visitantes"; /* Add a note screen - Write Note section title */ diff --git a/WooCommerce/Resources/ru.lproj/Localizable.strings b/WooCommerce/Resources/ru.lproj/Localizable.strings index ca17633d402..b16f5cf697c 100644 --- a/WooCommerce/Resources/ru.lproj/Localizable.strings +++ b/WooCommerce/Resources/ru.lproj/Localizable.strings @@ -1096,9 +1096,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "Подтвердить способ оплаты"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "Обнаружены конфликтующие плагины оплаты"; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "Поздравляем, вы прочитали все примечания!"; @@ -1207,7 +1204,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "Вход с помощью данных Apple"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "Переход"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2271,6 +2269,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "Помощь"; @@ -2350,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "Настройка очных платежей не завершена."; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "Очные платежи обрабатываются через WooCommerce Payments."; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "Очные платежи можно обрабатывать через любую из этих платёжных систем. Какую платёжную систему вы хотите использовать?"; @@ -2364,12 +2360,6 @@ which should be translated separately and considered part of this sentence. */ /* Title for the error screen when the merchant's payment account has been rejected. */ "In-Person Payments isn't available for this store" = "Очные платежи для этого магазина недоступны"; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "Очные платежи будут работать только с одним из следующих активированных плагинов. Для продолжения обратитесь к администратору сайта, чтобы деактивировать один из следующих плагинов:"; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "Очные платежи будут работать только с одним из следующих активированных плагинов. Для продолжения деактивируйте один из следующих плагинов:"; - /* Application's Inactive State */ "Inactive" = "Неактивно"; @@ -2599,8 +2589,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2773,9 +2766,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Title of the action sheet displayed from the Coupon Details screen */ "Manage Coupon" = "Управление купоном"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "Управление плагинами"; - /* Caption displayed in promotional screens shown during the login flow. */ "Manage and edit orders on the go" = "Управляйте заказами и редактируйте их на ходу"; @@ -3245,6 +3235,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "Упорядоченный список"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "Заказы"; @@ -3340,7 +3331,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "Платите картой или используйте другой разрешённый способ оплаты"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "Очная оплата"; /* Payment section title @@ -4008,6 +4000,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Повторить"; @@ -4025,7 +4018,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "Вернуть отправителю в случае невозможности доставки"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "Доход"; /* Title of Review Order screen */ @@ -5230,12 +5224,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "Чтобы закрыть эту учётную запись, обратитесь в службу поддержки."; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "Чтобы собирать платежи, попросите администратора отключить WooCommerce Stripe Gateway."; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "Чтобы собирать платежи, отключите WooCommerce Stripe Gateway."; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "Введите ваше имя пользователя для подтверждения закрытия.\n\n%1$@"; @@ -5796,7 +5784,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "Настройки видимости"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "Посетители"; /* Add a note screen - Write Note section title */ diff --git a/WooCommerce/Resources/sv.lproj/Localizable.strings b/WooCommerce/Resources/sv.lproj/Localizable.strings index 59374e32dca..a6b88992bb9 100644 --- a/WooCommerce/Resources/sv.lproj/Localizable.strings +++ b/WooCommerce/Resources/sv.lproj/Localizable.strings @@ -1,4 +1,4 @@ -/* Translation-Revision-Date: 2022-08-31 11:54:03+0000 */ +/* Translation-Revision-Date: 2022-09-04 09:08:21+0000 */ /* Plural-Forms: nplurals=2; plural=n != 1; */ /* Generator: GlotPress/2.4.0-alpha */ /* Language: sv_SE */ @@ -1096,9 +1096,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "Bekräfta betalningsmetod"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "Konflikt mellan betalningstillägg upptäckt"; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "Grattis, du har läst allt!"; @@ -1207,7 +1204,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "Fortsätter med Apple"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "Konvertering"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2271,6 +2269,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "Hjälp"; @@ -2350,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "Konfigurationen av Personliga betalningar har inte slutförts."; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "Personliga betalningar behandlas via WooCommerce Payments."; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "Personliga betalningar kan behandlas via båda dessa betalningsleverantörer. Vilken leverantör vill du använda?"; @@ -2364,12 +2360,6 @@ which should be translated separately and considered part of this sentence. */ /* Title for the error screen when the merchant's payment account has been rejected. */ "In-Person Payments isn't available for this store" = "Personliga betalningar är inte tillgängliga för den här butiken"; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "Personliga betalningar fungerar endast med ett av följande tillägg aktiverat. Kontakta en webbplatsadministratör för att inaktivera ett av dessa tillägg och fortsätta:"; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "Personliga betalningar fungerar endast med ett av följande tillägg aktiverat. Inaktivera ett av dessa tillägg för att fortsätta."; - /* Application's Inactive State */ "Inactive" = "Inaktiv"; @@ -2599,8 +2589,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2773,9 +2766,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Title of the action sheet displayed from the Coupon Details screen */ "Manage Coupon" = "Hantera rabattkod"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "Hantera tillägg"; - /* Caption displayed in promotional screens shown during the login flow. */ "Manage and edit orders on the go" = "Hantera och redigera beställningar i farten "; @@ -3245,6 +3235,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "Sorterad lista"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "Ordrar"; @@ -3340,7 +3331,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "Betala med kort eller annan accepterad betalningsmetod"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "Betala personligen"; /* Payment section title @@ -4008,6 +4000,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Försök igen"; @@ -4025,7 +4018,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "Returnera till avsändare om paketet inte kan levereras"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "Inkomster"; /* Title of Review Order screen */ @@ -5230,12 +5224,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "För att avsluta detta konto nu, kontakta vårt supportteam."; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "För att ta emot betalningar, be en administratör att inaktivera WooCommerce Stripe Gateway."; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "För att ta emot betalningar, inaktivera WooCommerce Stripe Gateway."; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "Bekräfta genom att skriva in ditt användarnamn innan kontot avslutas.\n\n%1$@"; @@ -5257,6 +5245,9 @@ This part is the link to the website, and forms part of a longer sentence which /* Instructional text shown when requesting the user's password for Google login. */ "To proceed with this Google account, please first log in with your WordPress.com password. This will only be asked once." = "För att fortsätta med detta Google-konto måste du först logga in med ditt lösenord för WordPress.com. Detta behövs bara en gång."; +/* Sign in instructions asking user to enter WordPress.com password to proceed with sign in using Apple process */ +"To proceed with this account, please first log in with your WordPress.com password. This will only be asked once." = "För att fortsätta med detta konto, logga först in med ditt WordPress.com-lösenord. Detta kommer bara att frågas en gång."; + /* Label within the modal dialog that appears when searching for a card reader */ "To turn on your card reader, briefly press its power button." = "För att starta din kortläsare, tryck kort på dess strömknapp."; @@ -5796,7 +5787,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "Synlighet"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "Besökare"; /* Add a note screen - Write Note section title */ diff --git a/WooCommerce/Resources/tr.lproj/Localizable.strings b/WooCommerce/Resources/tr.lproj/Localizable.strings index 65da630a5bd..d247f6925f3 100644 --- a/WooCommerce/Resources/tr.lproj/Localizable.strings +++ b/WooCommerce/Resources/tr.lproj/Localizable.strings @@ -1096,9 +1096,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "Ödeme Yöntemini onaylayın"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "Çakışan ödeme eklentileri algılandı"; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "Tebrikler, her şeyi okudunuz!"; @@ -1207,7 +1204,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "Apple ile devam ediliyor"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "Dönüşüm"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2271,6 +2269,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "Yardım"; @@ -2350,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "Şahsen Ödemeler Kurulumu tamamlanmadı."; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "Şahsen Ödemeler, WooCommerce Payments aracılığıyla işlenir."; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "Şahsen Ödemeler bu ödeme sağlayıcılarından herhangi biri aracılığıyla işlenebilir. Hangi sağlayıcıyı kullanmak istiyorsunuz?"; @@ -2364,12 +2360,6 @@ which should be translated separately and considered part of this sentence. */ /* Title for the error screen when the merchant's payment account has been rejected. */ "In-Person Payments isn't available for this store" = "Bu mağazada Şahsen Ödemeler kullanılamıyor"; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "Şahsen Ödemeler yalnızca aşağıdaki eklentilerden biri etkinleştirildiğinde çalışır. Devam etmek üzere bu eklentilerden birini devre dışı bırakması için lütfen bir site yöneticisiyle iletişime geçin:"; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "Şahsen Ödemeler yalnızca aşağıdaki eklentilerden biri etkinleştirildiğinde çalışır. Devam etmek için lütfen bu eklentilerden birini devre dışı bırakın:"; - /* Application's Inactive State */ "Inactive" = "Etkin değil"; @@ -2599,8 +2589,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2773,9 +2766,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Title of the action sheet displayed from the Coupon Details screen */ "Manage Coupon" = "Kuponu Yönet"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "Eklentileri Yönet"; - /* Caption displayed in promotional screens shown during the login flow. */ "Manage and edit orders on the go" = "Hareket halindeyken siparişleri yönetin ve düzenleyin"; @@ -3245,6 +3235,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "Sıralanmış Liste"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "Siparişler"; @@ -3340,7 +3331,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "Kartla veya kabul edilen başka bir ödeme yöntemiyle ödeyin"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "Şahsen Ödeyin"; /* Payment section title @@ -4008,6 +4000,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "Tekrar"; @@ -4025,7 +4018,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "Paket teslim edilemezse gönderene iade et"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "Kazanç"; /* Title of Review Order screen */ @@ -5230,12 +5224,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "Bu hesabı şimdi kapatmak için destek ekibimize başvurun."; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "Ödemeleri tahsil etmek için lütfen bir yöneticiden WooCommerce Stripe Ağ Geçidi'ni devre dışı bırakmasını isteyin."; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "Ödemeleri tahsil etmek için lütfen WooCommerce Stripe Ağ Geçidi'ni devre dışı bırakın."; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "Onaylamak için lütfen kapatmadan önce kullanıcı adınızı tekrar girin.\n\n%1$@"; @@ -5796,7 +5784,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "Görünürlük"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "Ziyaretçiler"; /* Add a note screen - Write Note section title */ diff --git a/WooCommerce/Resources/zh-Hans.lproj/Localizable.strings b/WooCommerce/Resources/zh-Hans.lproj/Localizable.strings index f576aeaa9a8..af7beb6cac5 100644 --- a/WooCommerce/Resources/zh-Hans.lproj/Localizable.strings +++ b/WooCommerce/Resources/zh-Hans.lproj/Localizable.strings @@ -1096,9 +1096,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "确认付款方式"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "检测到存在冲突的付款插件"; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "恭喜您,已全部阅读!"; @@ -1207,7 +1204,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "继续使用 Apple"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "转化"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2271,6 +2269,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "帮助"; @@ -2350,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "现场付款设置未完成。"; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "通过 WooCommerce Payments 处理现场付款。"; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "现场付款可以通过这些付款提供商中的任何一个进行处理。 您想使用哪个提供商?"; @@ -2364,12 +2360,6 @@ which should be translated separately and considered part of this sentence. */ /* Title for the error screen when the merchant's payment account has been rejected. */ "In-Person Payments isn't available for this store" = "此商店不支持现场付款"; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "必须启用下面其中一个插件,才能进行现场付款。 请联系站点管理员,禁用下面其中一个插件,然后再继续:"; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "必须启用下面其中一个插件,才能进行现场付款。 请禁用下面其中一个插件,然后再继续:"; - /* Application's Inactive State */ "Inactive" = "未激活"; @@ -2599,8 +2589,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2773,9 +2766,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Title of the action sheet displayed from the Coupon Details screen */ "Manage Coupon" = "管理优惠券"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "管理插件"; - /* Caption displayed in promotional screens shown during the login flow. */ "Manage and edit orders on the go" = "随时随地管理和编辑订单"; @@ -3245,6 +3235,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "有序列表"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "订单"; @@ -3340,7 +3331,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "银行卡付款或其他可接受的付款方式"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "现场付款"; /* Payment section title @@ -4008,6 +4000,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "重试"; @@ -4025,7 +4018,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "如果包裹无法送达,请退回给寄件人"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "收益"; /* Title of Review Order screen */ @@ -5230,12 +5224,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "要立即关闭此帐户,请联系我们的支持团队。"; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "如需收款,需请求管理员禁用 WooCommerce Stripe Gateway。"; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "如需收款,请禁用 WooCommerce Stripe Gateway。"; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "如果您确认关闭账户,请在关闭之前重新输入您的用户名。\n\n%1$@"; @@ -5796,7 +5784,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "可见性"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "访客"; /* Add a note screen - Write Note section title */ diff --git a/WooCommerce/Resources/zh-Hant.lproj/Localizable.strings b/WooCommerce/Resources/zh-Hant.lproj/Localizable.strings index 5177008f95d..1599152286d 100644 --- a/WooCommerce/Resources/zh-Hant.lproj/Localizable.strings +++ b/WooCommerce/Resources/zh-Hant.lproj/Localizable.strings @@ -1096,9 +1096,6 @@ which should be translated separately and considered part of this sentence. */ /* Button to confirm the preferred provider for In-Person Payments */ "Confirm Payment Method" = "確認付款方式"; -/* Title for the error screen when there is more than one plugin active that supports in-person payments. */ -"Conflicting payment plugins detected" = "已偵測到衝突的付款外掛程式"; - /* Title displayed if there are no inbox notes in the inbox screen. */ "Congrats, you’ve read everything!" = "恭喜,你已閱讀所有所有資訊!"; @@ -1207,7 +1204,8 @@ which should be translated separately and considered part of this sentence. */ /* Shown while logging in with Apple and the app waits for the site creation process to complete. */ "Continuing with Apple" = "繼續使用 Apple"; -/* Conversion stat label on dashboard. */ +/* Conversion stat label on dashboard. + Conversion title label for the store info widget */ "Conversion" = "轉換"; /* Copy address text button title — should be one word and as short as possible. */ @@ -2271,6 +2269,7 @@ which should be translated separately and considered part of this sentence. */ /* Help and Support navigation title Help button + Help button on Jetpack required error screen. Help button on store picker screen. */ "Help" = "幫助"; @@ -2350,9 +2349,6 @@ which should be translated separately and considered part of this sentence. */ /* Shows a notice pointing out that the user didn't finish the In-Person Payments setup, so some functionalities are disabled. */ "In-Person Payments Setup is incomplete." = "親自收款設定未完成。"; -/* Title for the error screen when there is more than one plugin active and the Stripe plugin should be deactivated */ -"In-Person Payments are processed through WooCommerce Payments." = "親自收款會透過 WooCommerce Payments 處理。"; - /* Main prompt for the screen to select the preferred provider for In-Person Payments */ "In-Person Payments can be processed through either of these payment providers. Which provider would you like to use?" = "親自收款業務可透過這些付款服務供應商處理。 你想使用哪個供應商?"; @@ -2364,12 +2360,6 @@ which should be translated separately and considered part of this sentence. */ /* Title for the error screen when the merchant's payment account has been rejected. */ "In-Person Payments isn't available for this store" = "此商店無法使用親自收款功能"; -/* Message prompting a shop manager to ask an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please contact a site administrator to deactivate one of these plugins to continue:" = "啟用下列其中一個外掛程式後,才可使用親自收款功能。 若要繼續,請聯絡網站管理員以停用其中一個外掛程式:"; - -/* Message prompting an administrator to deactivate one of two plugins */ -"In-Person Payments will only work with one of following plugins activated. Please deactivate one of these plugins to continue:" = "啟用下列其中一個外掛程式後,才可使用親自收款功能。 若要繼續,請停用其中一個外掛程式:"; - /* Application's Inactive State */ "Inactive" = "未啟用"; @@ -2599,8 +2589,11 @@ which should be translated separately and considered part of this sentence. */ /* A label prompting users to learn more about card readers. This part is the link to the website, and forms part of a longer sentence which it should be considered a part of. + A label prompting users to learn more about In-Person Payments. +This is the link to the website, and forms part of a longer sentence which it should be considered a part of. Button title in the shipping label creation info screen Settings > Privacy Settings. A text link to the cookie policy. + The \"Learn more\" string replaces the placeholder in a label prompting users to learn more about adding Pay in Person to their checkout. Title of button shown in the Orders → All Orders tab if the list is empty. Title of button shown in the Reviews tab if the list is empty Title of button shown on the Product Reviews screen if the list is empty */ @@ -2773,9 +2766,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Title of the action sheet displayed from the Coupon Details screen */ "Manage Coupon" = "管理優惠券"; -/* Button to open browser to manage plugins */ -"Manage Plugins" = "管理外掛程式"; - /* Caption displayed in promotional screens shown during the login flow. */ "Manage and edit orders on the go" = "隨時隨地管理及編輯訂單"; @@ -3245,6 +3235,7 @@ This part is the link to the website, and forms part of a longer sentence which "Ordered List" = "已排序清單"; /* Orders stat label on dashboard - should be plural. + Orders title label for the store info widget The title of the Orders tab. */ "Orders" = "訂單"; @@ -3340,7 +3331,8 @@ This part is the link to the website, and forms part of a longer sentence which Customer-facing instructions shown on Order Thank-you pages and confirmation emails, showing more details about the Pay in Person option added to the store checkout when the merchant enables Pay in Person */ "Pay by card or another accepted payment method" = "透過卡片或其他接受的付款方式付款"; -/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person */ +/* Customer-facing title for the payment option added to the store checkout when the merchant enables Pay in Person + Title for a switch on the In-Person Payments menu to enable Cash on Delivery */ "Pay in Person" = "親自收款"; /* Payment section title @@ -4008,6 +4000,7 @@ This part is the link to the website, and forms part of a longer sentence which Retry Action Retry action for an error notice Retry Action on error displayed when the attempt to enable a Pay in Person checkout payment option fails + Retry Action on error displayed when the attempt to toggle a Pay in Person checkout payment option fails Retry Action on the notice when loading product categories fails Retry the last action */ "Retry" = "重試"; @@ -4025,7 +4018,8 @@ This part is the link to the website, and forms part of a longer sentence which /* Title for the return policy in Customs screen of Shipping Label flow */ "Return to sender if package is unable to be delivered" = "包裹無法投遞時退還寄件者"; -/* Revenue stat label on dashboard. */ +/* Revenue stat label on dashboard. + Revenue title label for the store info widget */ "Revenue" = "收益"; /* Title of Review Order screen */ @@ -5230,12 +5224,6 @@ This part is the link to the website, and forms part of a longer sentence which /* Error message displayed when unable to close user account due to having active atomic site. */ "To close this account now, contact our support team." = "若要立即關閉此帳號,請與支援團隊聯絡。"; -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please ask an administrator to deactivate WooCommerce Stripe Gateway." = "若要收取款項,請要求管理員停用 WooCommerce Stripe Gateway。"; - -/* Message prompting an administrator to deactivate Stripe plugin */ -"To collect payments, please deactivate WooCommerce Stripe Gateway." = "若要收取款項,請停用 WooCommerce Stripe Gateway。"; - /* Close Account confirmation alert message. The %1$@ is the user's WordPress.com username. */ "To confirm, please re-enter your username before closing.\n\n%1$@" = "為進行確認,請在關閉前重新輸入你的使用者名稱。\n\n%1$@"; @@ -5796,7 +5784,8 @@ This part is the link to the website, and forms part of a longer sentence which Visibility label in Product Settings */ "Visibility" = "可見度"; -/* Visitors stat label on dashboard - should be plural. */ +/* Visitors stat label on dashboard - should be plural. + Visitors title label for the store info widget */ "Visitors" = "訪客"; /* Add a note screen - Write Note section title */ From 6b0dd16dd2eff4f5d2c3f4f96618ce17d8669c60 Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Mon, 5 Sep 2022 10:46:30 +1000 Subject: [PATCH 67/74] Update metadata translations --- fastlane/metadata/ar-SA/release_notes.txt | 2 -- fastlane/metadata/de-DE/release_notes.txt | 2 -- fastlane/metadata/default/release_notes.txt | 3 +-- fastlane/metadata/es-ES/release_notes.txt | 2 -- fastlane/metadata/fr-FR/release_notes.txt | 2 -- fastlane/metadata/he/release_notes.txt | 2 -- fastlane/metadata/id/release_notes.txt | 2 -- fastlane/metadata/it/release_notes.txt | 2 -- fastlane/metadata/ja/release_notes.txt | 2 -- fastlane/metadata/ko/release_notes.txt | 2 -- fastlane/metadata/nl-NL/release_notes.txt | 2 -- fastlane/metadata/pt-BR/release_notes.txt | 2 -- fastlane/metadata/ru/release_notes.txt | 2 -- fastlane/metadata/sv/release_notes.txt | 2 -- fastlane/metadata/tr/release_notes.txt | 2 -- fastlane/metadata/zh-Hans/release_notes.txt | 2 -- fastlane/metadata/zh-Hant/release_notes.txt | 2 -- 17 files changed, 1 insertion(+), 34 deletions(-) delete mode 100644 fastlane/metadata/ar-SA/release_notes.txt delete mode 100644 fastlane/metadata/de-DE/release_notes.txt delete mode 100644 fastlane/metadata/es-ES/release_notes.txt delete mode 100644 fastlane/metadata/fr-FR/release_notes.txt delete mode 100644 fastlane/metadata/he/release_notes.txt delete mode 100644 fastlane/metadata/id/release_notes.txt delete mode 100644 fastlane/metadata/it/release_notes.txt delete mode 100644 fastlane/metadata/ja/release_notes.txt delete mode 100644 fastlane/metadata/ko/release_notes.txt delete mode 100644 fastlane/metadata/nl-NL/release_notes.txt delete mode 100644 fastlane/metadata/pt-BR/release_notes.txt delete mode 100644 fastlane/metadata/ru/release_notes.txt delete mode 100644 fastlane/metadata/sv/release_notes.txt delete mode 100644 fastlane/metadata/tr/release_notes.txt delete mode 100644 fastlane/metadata/zh-Hans/release_notes.txt delete mode 100644 fastlane/metadata/zh-Hant/release_notes.txt diff --git a/fastlane/metadata/ar-SA/release_notes.txt b/fastlane/metadata/ar-SA/release_notes.txt deleted file mode 100644 index c8a6a7c8ae8..00000000000 --- a/fastlane/metadata/ar-SA/release_notes.txt +++ /dev/null @@ -1,2 +0,0 @@ -يحتوي هذا الإصدار على إصلاحات عديدة تسهِّل عليك تحصيل المدفوعات من التطبيق. لقد قمنا كذلك بإضافة صفحة مركز المساعدة والأسئلة المتداولة جديدة تسهِّل عليك تسجيل الدخول إلى التطبيق. -يرجى مواصلة إرسال الملاحظات إلينا – فكلنا آذان صاغية! diff --git a/fastlane/metadata/de-DE/release_notes.txt b/fastlane/metadata/de-DE/release_notes.txt deleted file mode 100644 index 1499d42e038..00000000000 --- a/fastlane/metadata/de-DE/release_notes.txt +++ /dev/null @@ -1,2 +0,0 @@ -Dieses Release enthält mehrere Problembehebungen, die es einfacher machen, Zahlungen in der App anzunehmen. Außerdem haben wir eine neue FAQ-Seite zum Hilfe-Center hinzugefügt, die dir das Anmelden bei der App erleichtert. -Sende uns bitte weiter Feedback – wir freuen uns darauf! diff --git a/fastlane/metadata/default/release_notes.txt b/fastlane/metadata/default/release_notes.txt index b1b07a7dd64..37304938ab9 100644 --- a/fastlane/metadata/default/release_notes.txt +++ b/fastlane/metadata/default/release_notes.txt @@ -1,2 +1 @@ -This release has several fixes that makes it easier for you to take payments from the app. We’ve also added a new Help Center FAQ page that makes it easier for you to login to the app. -Please continue to send us feedback – we are listening! +Even though this release doesn’t have any new features, we still put a lot of love into it! You can now enable or disable the option to take card or cash payments on collection or delivery. We also added a new Help Center page that makes it easier for you to login to the app. diff --git a/fastlane/metadata/es-ES/release_notes.txt b/fastlane/metadata/es-ES/release_notes.txt deleted file mode 100644 index d938217241b..00000000000 --- a/fastlane/metadata/es-ES/release_notes.txt +++ /dev/null @@ -1,2 +0,0 @@ -Esta versión incluye algunas correcciones que facilitan el hecho de recibir pagos desde la aplicación. También hemos añadido una nueva página de preguntas frecuentes al centro de ayuda para que te sea más fácil acceder a la aplicación. -Sigue enviando tus comentarios: ¡te escuchamos! diff --git a/fastlane/metadata/fr-FR/release_notes.txt b/fastlane/metadata/fr-FR/release_notes.txt deleted file mode 100644 index 96733fcc5ab..00000000000 --- a/fastlane/metadata/fr-FR/release_notes.txt +++ /dev/null @@ -1,2 +0,0 @@ -Cette version contient plusieurs correctifs qui facilitent l’encaissement des paiements depuis l’application. Nous avons également ajouté une nouvelle page de FAQ au centre d’aide qui facilite votre connexion à l’application. -Continuez à nous envoyer vos commentaires. Votre avis nous intéresse ! diff --git a/fastlane/metadata/he/release_notes.txt b/fastlane/metadata/he/release_notes.txt deleted file mode 100644 index 0bd78a3c6bd..00000000000 --- a/fastlane/metadata/he/release_notes.txt +++ /dev/null @@ -1,2 +0,0 @@ -בגרסה הזאת הוספנו כמה תיקונים שיעזרו לך לקבל תשלומים מהאפליקציה בקלות רבה יותר. הוספנו גם עמוד חדש של 'שאלות נפוצות' ב'מרכז העזרה' כדי לעזור לך להתחבר לאפליקציה. -נשמח לקבל עוד משוב – אנחנו תמיד כאן כדי להקשיב! diff --git a/fastlane/metadata/id/release_notes.txt b/fastlane/metadata/id/release_notes.txt deleted file mode 100644 index 905bd033a58..00000000000 --- a/fastlane/metadata/id/release_notes.txt +++ /dev/null @@ -1,2 +0,0 @@ -Rilis ini mencakup sejumlah perbaikan yang memudahkan penerimaan pembayaran dari aplikasi. Kami juga telah menambahkan halaman Pusat Bantuan Tanya Jawab Umum (TJU) yang memudahkan Anda untuk login ke aplikasi. -Terus berikan kami feedback – kami siap mendengarkan! diff --git a/fastlane/metadata/it/release_notes.txt b/fastlane/metadata/it/release_notes.txt deleted file mode 100644 index 9d262928e27..00000000000 --- a/fastlane/metadata/it/release_notes.txt +++ /dev/null @@ -1,2 +0,0 @@ -Questa versione presenta diverse correzioni che semplificano la ricezione di pagamenti dall'app. Abbiamo aggiunto anche una nuova pagina delle domande frequenti al Centro assistenza che facilita l'accesso all'app. -Continua a inviarci feedback: siamo lieti di ascoltarli. diff --git a/fastlane/metadata/ja/release_notes.txt b/fastlane/metadata/ja/release_notes.txt deleted file mode 100644 index 4a58cce6175..00000000000 --- a/fastlane/metadata/ja/release_notes.txt +++ /dev/null @@ -1,2 +0,0 @@ -このリリースではいくつかの修正が行われ、アプリから支払いを受け取りやすくなりました。また、アプリへのログインを簡単にするため、新しいヘルプセンターの FAQ ページも追加しました。 -引き続き、フィードバックをお寄せください。 diff --git a/fastlane/metadata/ko/release_notes.txt b/fastlane/metadata/ko/release_notes.txt deleted file mode 100644 index 47c00b032de..00000000000 --- a/fastlane/metadata/ko/release_notes.txt +++ /dev/null @@ -1,2 +0,0 @@ -이 릴리스에는 앱에서 결제를 더 쉽게 진행할 수 있는 몇 가지 수정 사항이 있습니다. 앱에 더 쉽게 로그인할 수 있도록 새로운 도움말 센터 FAQ 페이지도 추가했습니다. -계속 피드백을 보내주세요. 경청하겠습니다! diff --git a/fastlane/metadata/nl-NL/release_notes.txt b/fastlane/metadata/nl-NL/release_notes.txt deleted file mode 100644 index 366a29492ac..00000000000 --- a/fastlane/metadata/nl-NL/release_notes.txt +++ /dev/null @@ -1,2 +0,0 @@ -Deze release bevat meerdere reparaties waardoor je eenvoudiger betalingen kunt ontvangen uit de app. We hebben ook een nieuwe Help Center FAQ-pagina toegevoegd waarmee je eenvoudiger kunt inloggen in de app. -Blijf ons feedback sturen – wij luisteren! diff --git a/fastlane/metadata/pt-BR/release_notes.txt b/fastlane/metadata/pt-BR/release_notes.txt deleted file mode 100644 index 105052f3200..00000000000 --- a/fastlane/metadata/pt-BR/release_notes.txt +++ /dev/null @@ -1,2 +0,0 @@ -Esta versão tem várias correções que facilitam o recebimento de pagamentos com o aplicativo. Também adicionamos uma nova página de perguntas frequentes na Central de Ajuda que ajudará você a fazer login no aplicativo. -Continue compartilhando seu feedback conosco. Estamos ouvindo. diff --git a/fastlane/metadata/ru/release_notes.txt b/fastlane/metadata/ru/release_notes.txt deleted file mode 100644 index eebb3aac361..00000000000 --- a/fastlane/metadata/ru/release_notes.txt +++ /dev/null @@ -1,2 +0,0 @@ -В этот выпуск внесено несколько исправлений, которые облегчают оплату в приложении. Мы также добавили в Справочный центр страницу с часто задаваемыми вопросами, которая поможет легко выполнять вход в приложение. -Мы по-прежнему ждём ваших отзывов и прислушиваемся к ним! diff --git a/fastlane/metadata/sv/release_notes.txt b/fastlane/metadata/sv/release_notes.txt deleted file mode 100644 index 18903418f8b..00000000000 --- a/fastlane/metadata/sv/release_notes.txt +++ /dev/null @@ -1,2 +0,0 @@ -Den här versionen innehåller flertalet korrigeringar som gör det enklare för dig att ta emot betalningar via appen. Vi har också lagt till en ny Vanliga frågor-sida i Hjälpcenter som gör det enklare för dig att logga in i appen. -Fortsätt att skicka feedback till oss – vi lyssnar! diff --git a/fastlane/metadata/tr/release_notes.txt b/fastlane/metadata/tr/release_notes.txt deleted file mode 100644 index 9988610a640..00000000000 --- a/fastlane/metadata/tr/release_notes.txt +++ /dev/null @@ -1,2 +0,0 @@ -Bu sürüm, uygulamadan ödeme almanızı kolaylaştıran birkaç düzeltmeye sahiptir. Ayrıca, uygulamaya giriş yapmanızı kolaylaştıran yeni bir Yardım Merkezi SSS sayfası ekledik. -Lütfen bize geri bildirim göndermeye devam edin, sizi dinliyoruz. diff --git a/fastlane/metadata/zh-Hans/release_notes.txt b/fastlane/metadata/zh-Hans/release_notes.txt deleted file mode 100644 index efccd59125c..00000000000 --- a/fastlane/metadata/zh-Hans/release_notes.txt +++ /dev/null @@ -1,2 +0,0 @@ -此版本修复了多个问题,可让您更轻松地从应用程序中接受付款。我们已添加新的“帮助中心常见问题解答”页面,可让您更轻松地登录应用程序。 -请继续向我们发送反馈,我们时刻倾听您的意见! diff --git a/fastlane/metadata/zh-Hant/release_notes.txt b/fastlane/metadata/zh-Hant/release_notes.txt deleted file mode 100644 index 861d90e720e..00000000000 --- a/fastlane/metadata/zh-Hant/release_notes.txt +++ /dev/null @@ -1,2 +0,0 @@ -此版本進行了幾項修正,可讓你從應用程式更輕鬆收取款項。我們也新增了「說明中心常見問題」頁面,讓登入應用程式變得更加簡單。 -歡迎繼續給予我們批評指教,我們很樂意接受! From 5108683c47aca37a53e148c1f07ce63685f013ab Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Mon, 5 Sep 2022 10:46:41 +1000 Subject: [PATCH 68/74] Bump version number --- config/Version.Public.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/Version.Public.xcconfig b/config/Version.Public.xcconfig index 695ae352773..63ecd4ccd90 100644 --- a/config/Version.Public.xcconfig +++ b/config/Version.Public.xcconfig @@ -1,4 +1,4 @@ VERSION_SHORT=10.2 // Public long version example: VERSION_LONG=1.2.0.0 -VERSION_LONG=10.2.0.0 +VERSION_LONG=10.2.0.1 From 9dcb75c2c42dba43f64397187be1c9c84319bc4d Mon Sep 17 00:00:00 2001 From: Tony Li Date: Mon, 5 Sep 2022 13:10:02 +1200 Subject: [PATCH 69/74] Revert "Force a couple of test case failures" This reverts commit 6fcc82f97d245fcc87d2884b00762c5e9d9f5b0b. --- WooCommerce/WooCommerceTests/AppCoordinatorTests.swift | 2 +- WooCommerce/WooCommerceUITests/Tests/OrdersTests.swift | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/WooCommerce/WooCommerceTests/AppCoordinatorTests.swift b/WooCommerce/WooCommerceTests/AppCoordinatorTests.swift index 6b872fb78e4..978a5368140 100644 --- a/WooCommerce/WooCommerceTests/AppCoordinatorTests.swift +++ b/WooCommerce/WooCommerceTests/AppCoordinatorTests.swift @@ -112,7 +112,7 @@ final class AppCoordinatorTests: XCTestCase { // so we have to wait a bit loginNavigationController.viewControllers.count > 1 } - XCTAssertFalse(loginNavigationController.topViewController is ULAccountMismatchViewController) + XCTAssertTrue(loginNavigationController.topViewController is ULAccountMismatchViewController) } func test_starting_app_logged_in_without_selected_site_presents_error_if_the_error_site_address_does_not_have_woo() throws { diff --git a/WooCommerce/WooCommerceUITests/Tests/OrdersTests.swift b/WooCommerce/WooCommerceUITests/Tests/OrdersTests.swift index 028c52c70fe..d7b150d2477 100644 --- a/WooCommerce/WooCommerceUITests/Tests/OrdersTests.swift +++ b/WooCommerce/WooCommerceUITests/Tests/OrdersTests.swift @@ -23,8 +23,6 @@ final class OrdersTests: XCTestCase { .verifySingleOrder(order: orders[0]) .goBackToOrdersScreen() .verifyOrdersScreenLoaded() - - XCTAssertEqual(0, 1) } func test_create_new_order() throws { From 723e8b7c074ee7a9019996813c422cd525df552e Mon Sep 17 00:00:00 2001 From: Gio Lodi Date: Mon, 5 Sep 2022 14:20:55 +1000 Subject: [PATCH 70/74] Set `skip_prechecks:true` in CI release builds This will result in CI relying on the CocoaPods cache it just downloaded instead of reinstalling all pods from scratch. It should save around a minute of CI time. See this build for example: https://buildkite.com/automattic/woocommerce-ios/builds/7674#01830b20-18fd-4cef-bedd-5d494da79152/1163-1249 Admittedly, one minute over a total of 26 is not that much. Still, we pay CI by the minute and, pragmatically, we shouldn't run unnecessary operations if we can avoid it. --- .buildkite/commands/release-build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.buildkite/commands/release-build.sh b/.buildkite/commands/release-build.sh index 8736f468b00..4c2ac2bf5e9 100755 --- a/.buildkite/commands/release-build.sh +++ b/.buildkite/commands/release-build.sh @@ -22,5 +22,6 @@ bundle exec fastlane run configure_apply echo "--- :hammer_and_wrench: Building" bundle exec fastlane build_and_upload_itc \ skip_confirm:true \ + skip_prechecks:true \ create_release:true \ beta_release:${1:-true} # use first call param, default to true for safety From 8c782c98ee7d94b072accac1d48d76d9c230ca08 Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Mon, 5 Sep 2022 16:09:10 +0200 Subject: [PATCH 71/74] Modified test. Navigate to hubmenu post-notification --- .../MainTabBarControllerTests.swift | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift index 96142f72769..c50b258e813 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/MainTabBarControllerTests.swift @@ -198,6 +198,65 @@ final class MainTabBarControllerTests: XCTestCase { XCTAssertEqual(selectedTabIndexAfterSiteChange, WooTab.myStore.visibleIndex()) } + func test_when_receiving_a_review_notification_from_a_different_site_navigates_to_hubMenu_tab() throws { + // Arrange + guard let tabBarController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as? MainTabBarController else { + return + } + + let pushNotificationsManager = MockPushNotificationsManager() + ServiceLocator.setPushNotesManager(pushNotificationsManager) + + let storesManager = MockStoresManager(sessionManager: .testingInstance) + // Reset `receivedActions` + storesManager.reset() + ServiceLocator.setStores(storesManager) + + // Trigger `viewDidLoad` + XCTAssertNotNil(tabBarController.view) + stores.updateDefaultStore(storeID: 134) + + // Simulate successful state resetting after logging out from push notification store switching + storesManager.whenReceivingAction(ofType: StatsActionV4.self) { action in + if case let .resetStoredStats(completion) = action { + completion() + } + } + storesManager.whenReceivingAction(ofType: OrderAction.self) { action in + if case let .resetStoredOrders(completion) = action { + completion() + } + } + storesManager.whenReceivingAction(ofType: ProductReviewAction.self) { action in + if case let .resetStoredProductReviews(completion) = action { + completion() + } + } + + let hubMenuNavigationController = try XCTUnwrap(tabBarController.tabNavigationController(tab: .hubMenu)) + assertThat(hubMenuNavigationController.topViewController, isAnInstanceOf: HubMenuViewController.self) + + // Action + // Send push notification in inactive state + let pushNotification = PushNotification(noteID: 1_234, kind: .comment, title: "", subtitle: "", message: "") + pushNotificationsManager.sendInactiveNotification(pushNotification) + + // Simulate that the network call returns a parcel + let receivedAction = try XCTUnwrap(storesManager.receivedActions.first as? ProductReviewAction) + guard case .retrieveProductReviewFromNote(_, let completion) = receivedAction else { + return XCTFail("Expected retrieveProductReviewFromNote action.") + } + completion(.success(ProductReviewFromNoteParcelFactory().parcel(metaSiteID: 606))) + + // Assert + waitUntil { + hubMenuNavigationController.viewControllers.count != 0 + } + // HubMenuViewController should be pushed, and be the MainTabBarController visible index + assertThat(hubMenuNavigationController.topViewController, isAnInstanceOf: HubMenuViewController.self) + XCTAssertEqual(tabBarController.selectedIndex, WooTab.hubMenu.visibleIndex()) + } + func test_when_receiving_product_image_upload_error_a_notice_is_enqueued() throws { // Given let featureFlagService = MockFeatureFlagService(isBackgroundImageUploadEnabled: true) From 5621f27764939179f8ad27a288548f81fc3ee77d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Carri=C3=B3n?= Date: Mon, 5 Sep 2022 09:40:58 -0500 Subject: [PATCH 72/74] Manually handle provisioning profiles & Disables Bitcode --- WooCommerce/WooCommerce.xcodeproj/project.pbxproj | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index 75b5c137095..81975bcd80f 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -11008,9 +11008,10 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = PZYM8XX95Q; + ENABLE_BITCODE = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = StoreWidgets/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = StoreWidgets; @@ -11026,6 +11027,7 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.automattic.woocommerce.storewidgets; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "WooCommerce Store Widgets Development"; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; @@ -11045,6 +11047,7 @@ CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = PZYM8XX95Q; + ENABLE_BITCODE = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = StoreWidgets/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = StoreWidgets; @@ -11079,6 +11082,7 @@ CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 99KV9Z6BKV; + ENABLE_BITCODE = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = StoreWidgets/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = StoreWidgets; From 7666b951c5981f5da61aebb72aa1e5d8ab497d69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Carri=C3=B3n?= Date: Mon, 5 Sep 2022 09:42:37 -0500 Subject: [PATCH 73/74] Removes Custom intent --- WooCommerce/Resources/Info.plist | 28 ++++++------ .../StoreWidgets.intentdefinition | 45 ++----------------- 2 files changed, 19 insertions(+), 54 deletions(-) diff --git a/WooCommerce/Resources/Info.plist b/WooCommerce/Resources/Info.plist index 45a00a6c5e2..44120a34f49 100644 --- a/WooCommerce/Resources/Info.plist +++ b/WooCommerce/Resources/Info.plist @@ -2,11 +2,6 @@ - NSAppTransportSecurity - - NSAllowsLocalNetworking - - CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -63,18 +58,25 @@ LSRequiresIPhoneOS - NSCameraUsageDescription - To take photos or videos to add to your Products, scan barcode for Product SKU, or support tickets. - NSPhotoLibraryUsageDescription - To save photos from camera for Product images, or to add photos or videos to your Products or support tickets. - NSLocationWhenInUseUsageDescription - Location access is required in order to accept payments. - NSBluetoothPeripheralUsageDescription - Bluetooth access is required in order to connect to supported card readers. + NSAppTransportSecurity + + NSAllowsLocalNetworking + + NSBluetoothAlwaysUsageDescription This app uses Bluetooth to connect to supported card readers. + NSBluetoothPeripheralUsageDescription + Bluetooth access is required in order to connect to supported card readers. + NSCameraUsageDescription + To take photos or videos to add to your Products, scan barcode for Product SKU, or support tickets. NSLocationDefaultAccuracyReduced + NSLocationWhenInUseUsageDescription + Location access is required in order to accept payments. + NSPhotoLibraryUsageDescription + To save photos from camera for Product images, or to add photos or videos to your Products or support tickets. + NSUserActivityTypes + UIAppFonts Noticons.ttf diff --git a/WooCommerce/StoreWidgets/StoreWidgets.intentdefinition b/WooCommerce/StoreWidgets/StoreWidgets.intentdefinition index bdb404554a0..5aaeb8d2ba7 100644 --- a/WooCommerce/StoreWidgets/StoreWidgets.intentdefinition +++ b/WooCommerce/StoreWidgets/StoreWidgets.intentdefinition @@ -9,50 +9,13 @@ INIntentDefinitionNamespace 88xZPY INIntentDefinitionSystemVersion - 20A294 + 21G83 INIntentDefinitionToolsBuildVersion - 12A6144 + 13F100 INIntentDefinitionToolsVersion - 12.0 + 13.4.1 INIntents - - - INIntentCategory - information - INIntentDescriptionID - tVvJ9c - INIntentEligibleForWidgets - - INIntentIneligibleForSuggestions - - INIntentName - Configuration - INIntentResponse - - INIntentResponseCodes - - - INIntentResponseCodeName - success - INIntentResponseCodeSuccess - - - - INIntentResponseCodeName - failure - - - - INIntentTitle - Configuration - INIntentTitleID - gpCwrM - INIntentType - Custom - INIntentVerb - View - - + INTypes From 0dcfec050ed42aa860fbf5ed6af69d94654549db Mon Sep 17 00:00:00 2001 From: Tony Li Date: Tue, 6 Sep 2022 09:26:59 +1200 Subject: [PATCH 74/74] Expand test group log when tests failed --- .buildkite/commands/run-ui-tests.sh | 6 ++++++ .buildkite/commands/run-unit-tests.sh | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/.buildkite/commands/run-ui-tests.sh b/.buildkite/commands/run-ui-tests.sh index 2e8b3c69963..4f7876fb6aa 100755 --- a/.buildkite/commands/run-ui-tests.sh +++ b/.buildkite/commands/run-ui-tests.sh @@ -40,6 +40,12 @@ bundle exec fastlane test_without_building name:"$TEST_NAME" device:"$DEVICE" io TESTS_EXIT_STATUS=$? set -e +if [[ "$TESTS_EXIT_STATUS" -ne 0 ]]; then + # Keep the (otherwise collapsed) current "Testing" section open in Buildkite logs on error. See https://buildkite.com/docs/pipelines/managing-log-output#collapsing-output + echo "^^^ +++" + echo "UI Tests failed!" +fi + echo "--- 📦 Zipping test results" cd fastlane/test_output/ && zip -rq WooCommerce.xcresult.zip WooCommerce.xcresult && cd - diff --git a/.buildkite/commands/run-unit-tests.sh b/.buildkite/commands/run-unit-tests.sh index 14ec6c763b8..2331bb4383d 100755 --- a/.buildkite/commands/run-unit-tests.sh +++ b/.buildkite/commands/run-unit-tests.sh @@ -21,6 +21,12 @@ bundle exec fastlane test_without_building name:UnitTests TESTS_EXIT_STATUS=$? set -e +if [[ "$TESTS_EXIT_STATUS" -ne 0 ]]; then + # Keep the (otherwise collapsed) current "Testing" section open in Buildkite logs on error. See https://buildkite.com/docs/pipelines/managing-log-output#collapsing-output + echo "^^^ +++" + echo "Unit Tests failed!" +fi + echo "--- 📦 Zipping test results" cd fastlane/test_output/ && zip -rq WooCommerce.xcresult.zip WooCommerce.xcresult && cd -