diff --git a/README.md b/README.md index 410d386bb9c..811eac96ce8 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,8 @@

A Jetpack-powered mobile app for WooCommerce.

- - CircleCI + + Release @@ -38,7 +38,7 @@ $ cd woocommerce-android ``` -1. Create a new `~/.configure/woocommerce-android/secrets.properties` file. See the [Configuration Files](docs/project-overview.md#configuration-files) section for a breakdown of the properties. +1. Copy `defaults.properties` to the secrets directory: `cp defaults.properties ~/.configure/woocommerce-android/secrets/secrets.properties`. See the [Configuration Files](docs/project-overview.md#configuration-files) section for a breakdown of the properties. 1. Generate the developer oauth2 tokens. These values get copied into the `~/.configure/woocommerce-android/secrets.properties` file in the next step. See the [OAuth2 Authentication](docs/project-overview.md#oauth2-authentication) section for details. 1. In Android Studio, open the project from the local repository. This will auto-generate `local.properties` with the SDK location. 1. Optional: Go to Tools → Device Manager and create an emulated device. diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index ec0483b2ff5..1c7e864c2ae 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -4,9 +4,16 @@ 21.3 ----- - [*] "One time shipping" label in Product Subscriptions now matches its availability state correctly. [https://github.com/woocommerce/woocommerce-android/pull/13021] +- [*] "One time shipping" label should not be shown in Simple product after conversion from Subscriptions product. [https://github.com/woocommerce/woocommerce-android/pull/13032] +- [*] Fixed a bug related to incorrect Shipping settings in Product details when converting from Subscriptions to Simple product. [https://github.com/woocommerce/woocommerce-android/pull/13035] - [Internal] Refactored IPP Payment flow to allow customizing payment collection UI in POS [https://github.com/woocommerce/woocommerce-android/pull/13014] - [*] Blaze Campaign Intro screen now offers creating a new product if the site has no products yet [https://github.com/woocommerce/woocommerce-android/pull/13001] +- [Internal] Updated androidx-lifecycle to 2.8.7. [https://github.com/woocommerce/woocommerce-android/pull/13046/] - [*] When entering a wrong WordPress.com account for login, retrying will bring the step back to the email input screen [https://github.com/woocommerce/woocommerce-android/pull/13024] +- [Internal] Replaces a function in WCSSRExt that then removes the need for commons-io dependency. [https://github.com/woocommerce/woocommerce-android/pull/13073] +- [Internal] Removes coupons feature announcement banner [https://github.com/woocommerce/woocommerce-android/pull/13077] + +- [Internal] Updated androidx-compose-bom to 2024.09.00 [https://github.com/woocommerce/woocommerce-android/pull/13060] ----- 21.2 diff --git a/WooCommerce/build.gradle b/WooCommerce/build.gradle index 8959fc8e102..4522df7b4f9 100644 --- a/WooCommerce/build.gradle +++ b/WooCommerce/build.gradle @@ -429,7 +429,6 @@ dependencies { // ViewModel and LiveData implementation(libs.androidx.fragment.ktx) - implementation(libs.androidx.activity.ktx) implementation(libs.androidx.lifecycle.viewmodel.savedstate) implementation(libs.androidx.lifecycle.process) @@ -442,7 +441,6 @@ dependencies { testImplementation(libs.cashapp.turbine) implementation(libs.apache.commons.text) - implementation(libs.commons.io) implementation(libs.tinder.statemachine) diff --git a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/orders/SingleOrderScreen.kt b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/orders/SingleOrderScreen.kt index 57e19b9ddee..3732a78167b 100644 --- a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/orders/SingleOrderScreen.kt +++ b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/orders/SingleOrderScreen.kt @@ -6,7 +6,6 @@ import androidx.test.espresso.matcher.ViewMatchers import androidx.test.espresso.matcher.ViewMatchers.hasDescendant import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.espresso.matcher.ViewMatchers.withParentIndex import androidx.test.espresso.matcher.ViewMatchers.withText import com.woocommerce.android.R import com.woocommerce.android.e2e.helpers.util.NestedScrollViewExtension @@ -17,7 +16,7 @@ import org.hamcrest.Matchers class SingleOrderScreen : Screen(R.id.orderDetail_container) { fun goBackToOrdersScreen(): OrderListScreen { - if (isElementDisplayed(R.id.orderDetail_container)) { + if (!isElementDisplayed(R.id.order_list_view_root) && isElementDisplayed(R.id.orderDetail_container)) { pressBack() } @@ -44,7 +43,9 @@ class SingleOrderScreen : Screen(R.id.orderDetail_container) { } fun assertOrderId(orderId: Int): SingleOrderScreen { - Espresso.onView(Matchers.allOf(withId(R.id.toolbar), withParentIndex(0))) + Espresso.onView( + Matchers.allOf(withId(R.id.toolbar), ViewMatchers.isDescendantOfA(withId(R.id.orderRefreshLayout))) + ) .check(ViewAssertions.matches(hasDescendant(withText("Order #$orderId")))) .check(ViewAssertions.matches(isDisplayed())) return this diff --git a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/products/ProductListScreen.kt b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/products/ProductListScreen.kt index e293154f5b8..14a70b395bd 100644 --- a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/products/ProductListScreen.kt +++ b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/products/ProductListScreen.kt @@ -1,7 +1,9 @@ package com.woocommerce.android.e2e.screens.products +import androidx.compose.ui.test.junit4.ComposeTestRule +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick import androidx.test.espresso.Espresso -import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers @@ -16,8 +18,7 @@ import org.hamcrest.Matchers import org.hamcrest.Matchers.allOf import org.hamcrest.Matchers.instanceOf -class ProductListScreen : Screen { - constructor() : super(R.id.productsRecycler) +class ProductListScreen : Screen(R.id.productsRecycler) { fun scrollToProduct(productTitle: String): ProductListScreen { scrollToListItem(productTitle, R.id.productsRecycler) @@ -35,6 +36,12 @@ class ProductListScreen : Screen { return this } + fun tapOnAddManually(composeTestRule: ComposeTestRule): ProductListScreen { + val buttonText = getTranslatedString(R.string.product_creation_ai_entry_sheet_manual_option_title) + composeTestRule.onNodeWithText(buttonText).performClick() + return this + } + fun goBackToProductList(): ProductListScreen { while (!isElementDisplayed(R.id.productsRecycler)) { pressBack() @@ -114,8 +121,8 @@ class ProductListScreen : Screen { } fun leaveSearchMode(): ProductListScreen { - var isProductDetailsErrorDisplayed = Screen.isElementDisplayed(R.id.productDetailsErrorImage) - var isSearchTextBarDisplayed = Screen.isElementDisplayed(androidx.appcompat.R.id.search_src_text) + val isProductDetailsErrorDisplayed = Screen.isElementDisplayed(R.id.productDetailsErrorImage) + val isSearchTextBarDisplayed = Screen.isElementDisplayed(androidx.appcompat.R.id.search_src_text) if (isProductDetailsErrorDisplayed && isSearchTextBarDisplayed) { clearSearchBar(androidx.appcompat.R.id.search_src_text) diff --git a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/tests/screenshot/ScreenshotTest.kt b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/tests/screenshot/ScreenshotTest.kt index af704a04dba..1dca2a95827 100644 --- a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/tests/screenshot/ScreenshotTest.kt +++ b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/tests/screenshot/ScreenshotTest.kt @@ -121,6 +121,7 @@ class ScreenshotTest : TestBase(failOnUnmatchedWireMockRequests = false) { TabNavComponent() .gotoProductsScreen() .tapOnCreateProduct() + .tapOnAddManually(composeTestRule) .thenTakeScreenshot("add-product") .goBackToProductList() diff --git a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/tests/ui/OrdersRealAPI.kt b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/tests/ui/OrdersRealAPI.kt index e3c9e31b92e..dd4c4154345 100644 --- a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/tests/ui/OrdersRealAPI.kt +++ b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/tests/ui/OrdersRealAPI.kt @@ -21,7 +21,6 @@ import org.junit.After import org.junit.AfterClass import org.junit.Before import org.junit.BeforeClass -import org.junit.Ignore import org.junit.Rule import org.junit.Test @@ -71,11 +70,7 @@ class OrdersRealAPI : TestBase() { @After fun tearDown() { - OrderListScreen() - .leaveOrClearSearchMode() - - WelcomeScreen - .logoutIfNeeded(composeTestRule) + WelcomeScreen.logoutIfNeeded(composeTestRule) } @Retry(numberOfTimes = 1) @@ -122,9 +117,7 @@ class OrdersRealAPI : TestBase() { .assertOrdersCount(2) } - @Retry(numberOfTimes = 1) @Test - @Ignore fun e2eRealApiOrderDetails() { try { OrderListScreen() diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt index 0b0a4c61232..5dc87271cfc 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefs.kt @@ -6,6 +6,7 @@ import android.annotation.SuppressLint import android.content.Context import android.content.SharedPreferences import android.content.SharedPreferences.Editor +import android.content.SharedPreferences.OnSharedPreferenceChangeListener import androidx.preference.PreferenceManager import com.woocommerce.android.AppPrefs.CardReaderOnboardingStatus.CARD_READER_ONBOARDING_NOT_COMPLETED import com.woocommerce.android.AppPrefs.CardReaderOnboardingStatus.valueOf @@ -39,7 +40,7 @@ import com.woocommerce.android.notifications.NotificationChannelType import com.woocommerce.android.tools.SelectedSite import com.woocommerce.android.ui.payments.cardreader.onboarding.PersistentOnboardingData import com.woocommerce.android.ui.payments.cardreader.onboarding.PluginType -import com.woocommerce.android.ui.prefs.DeveloperOptionsViewModel.DeveloperOptionsViewState.UpdateOptions +import com.woocommerce.android.ui.prefs.developer.DeveloperOptionsViewModel.DeveloperOptionsViewState.UpdateFrequencyUiModel import com.woocommerce.android.ui.prefs.domain.DomainFlowSource import com.woocommerce.android.ui.products.ProductType import com.woocommerce.android.ui.products.ai.AiTone @@ -47,6 +48,9 @@ import com.woocommerce.android.ui.promobanner.PromoBannerType import com.woocommerce.android.util.ThemeOption import com.woocommerce.android.util.ThemeOption.DEFAULT import com.woocommerce.commons.prefs.PreferenceUtils +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow import java.util.Calendar import java.util.Date @@ -260,7 +264,7 @@ object AppPrefs { set(value) = setBoolean(DeletablePrefKey.ENABLE_SIMULATED_INTERAC, value) var updateReaderOptionSelected: String - get() = getString(UPDATE_SIMULATED_READER_OPTION, UpdateOptions.RANDOM.toString()) + get() = getString(UPDATE_SIMULATED_READER_OPTION, UpdateFrequencyUiModel.RANDOM.toString()) set(option) = setString(UPDATE_SIMULATED_READER_OPTION, option) var isEUShippingNoticeDismissed: Boolean @@ -1276,6 +1280,22 @@ object AppPrefs { fun exists(key: PrefKey) = getPreferences().contains(key.toString()) + /** + * Observes changes to the preferences + */ + fun observePrefs(): Flow { + return callbackFlow { + val listener = OnSharedPreferenceChangeListener { _, _ -> + trySend(Unit) + } + getPreferences().registerOnSharedPreferenceChangeListener(listener) + + awaitClose { + getPreferences().unregisterOnSharedPreferenceChangeListener(listener) + } + } + } + /** * Methods used to store values in SharedPreferences that are not backed up * when app is installed/uninstalled. Currently, only used for storing appVersionCode. diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefsWrapper.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefsWrapper.kt index 792e871d6a0..2c8fdc3f07d 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefsWrapper.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppPrefsWrapper.kt @@ -1,14 +1,11 @@ package com.woocommerce.android -import android.content.SharedPreferences.OnSharedPreferenceChangeListener import com.woocommerce.android.notifications.NotificationChannelType import com.woocommerce.android.ui.payments.cardreader.onboarding.PersistentOnboardingData import com.woocommerce.android.ui.payments.cardreader.onboarding.PluginType import com.woocommerce.android.ui.prefs.domain.DomainFlowSource import com.woocommerce.android.ui.promobanner.PromoBannerType -import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.callbackFlow import javax.inject.Inject class AppPrefsWrapper @Inject constructor() { @@ -325,18 +322,7 @@ class AppPrefsWrapper @Inject constructor() { /** * Observes changes to the preferences */ - fun observePrefs(): Flow { - return callbackFlow { - val listener = OnSharedPreferenceChangeListener { _, _ -> - trySend(Unit) - } - AppPrefs.getPreferences().registerOnSharedPreferenceChangeListener(listener) - - awaitClose { - AppPrefs.getPreferences().unregisterOnSharedPreferenceChangeListener(listener) - } - } - } + fun observePrefs(): Flow = AppPrefs.observePrefs() fun updateOnboardingCompletedStatus(siteId: Int, completed: Boolean) { AppPrefs.updateOnboardingCompletedStatus(siteId, completed) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppUrls.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppUrls.kt index db28fd289cf..fe58f2decbf 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/AppUrls.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/AppUrls.kt @@ -61,9 +61,6 @@ object AppUrls { "https://automattic.survey.fm/order-creation-shipping-lines-survey-production" } - // Will be used later when the feature is fully launched. - const val COUPONS_SURVEY = "https://automattic.survey.fm/woo-app-coupon-management-production" - const val WOOCOMMERCE_USER_ROLES = "https://woocommerce.com/posts/a-guide-to-woocommerce-user-roles-permissions-and-security/" const val SHIPPING_LABEL_CUSTOMS_ITN = "https://pe.usps.com/text/imm/immc5_010.htm" diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt index 28c504ac55b..4fe88f817f7 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt @@ -167,10 +167,7 @@ enum class AnalyticsEvent(override val siteless: Boolean = false) : IAnalyticsEv DASHBOARD_SHARE_YOUR_STORE_BUTTON_TAPPED, DASHBOARD_MAIN_STATS_DATE, DASHBOARD_MAIN_STATS_LOADED, - DASHBOARD_TOP_PERFORMERS_DATE, DASHBOARD_TOP_PERFORMERS_LOADED, - DASHBOARD_NEW_STATS_REVERTED_BANNER_DISMISS_TAPPED, - DASHBOARD_NEW_STATS_REVERTED_BANNER_LEARN_MORE_TAPPED, DASHBOARD_WAITING_TIME_LOADED, DASHBOARD_SEE_MORE_ANALYTICS_TAPPED, DASHBOARD_STORE_TIMEZONE_DIFFER_FROM_DEVICE, @@ -178,7 +175,6 @@ enum class AnalyticsEvent(override val siteless: Boolean = false) : IAnalyticsEv STATS_UNEXPECTED_FORMAT, DASHBOARD_STATS_CUSTOM_RANGE_ADD_BUTTON_TAPPED, DASHBOARD_STATS_CUSTOM_RANGE_CONFIRMED, - DASHBOARD_STATS_CUSTOM_RANGE_TAB_SELECTED, DASHBOARD_STATS_CUSTOM_RANGE_EDIT_BUTTON_TAPPED, DASHBOARD_STATS_CUSTOM_RANGE_INTERACTED, DYNAMIC_DASHBOARD_EDIT_LAYOUT_BUTTON_TAPPED, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsTracker.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsTracker.kt index cefa336c1f8..4b4661f6b3d 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsTracker.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsTracker.kt @@ -359,7 +359,6 @@ class AnalyticsTracker private constructor( const val VALUE_FEEDBACK_GIVEN = "gave_feedback" const val VALUE_SHIPPING_LABELS_M4_FEEDBACK = "shipping_labels_m4" const val VALUE_PRODUCT_ADDONS_FEEDBACK = "product_addons" - const val VALUE_COUPONS_FEEDBACK = "coupons" const val VALUE_ANALYTICS_HUB_FEEDBACK = "analytics_hub" const val VALUE_ORDER_SHIPPING_LINES_FEEDBACK = "order_shipping_lines" const val VALUE_STATE_ON = "on" diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/datastore/DashboardDataStoreModule.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/datastore/DashboardDataStoreModule.kt index f6ae4cdf078..2fd5755091f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/datastore/DashboardDataStoreModule.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/datastore/DashboardDataStoreModule.kt @@ -3,7 +3,9 @@ package com.woocommerce.android.datastore import android.content.Context import androidx.datastore.core.DataStore import androidx.datastore.core.DataStoreFactory +import androidx.datastore.core.handlers.ReplaceFileCorruptionHandler import androidx.datastore.dataStoreFile +import com.automattic.android.tracks.crashlogging.CrashLogging import com.woocommerce.android.di.SiteComponent import com.woocommerce.android.di.SiteCoroutineScope import com.woocommerce.android.di.SiteScope @@ -23,12 +25,17 @@ object DashboardDataStoreModule { @SiteScope fun provideDashboardDataStore( appContext: Context, + crashLogging: CrashLogging, @SiteCoroutineScope siteCoroutineScope: CoroutineScope, site: SiteModel ): DataStore = DataStoreFactory.create( produceFile = { appContext.dataStoreFile("dashboard_configuration_${site.id}") }, + corruptionHandler = ReplaceFileCorruptionHandler { + crashLogging.recordEvent("Corrupted data store. DataStore Type: DASHBOARD") + DashboardDataModel.getDefaultInstance() + }, scope = CoroutineScope(siteCoroutineScope.coroutineContext + Dispatchers.IO), serializer = DashboardSerializer ) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/datastore/DataStoreModule.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/datastore/DataStoreModule.kt index 2d8dee4c113..ce8c27e25b4 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/datastore/DataStoreModule.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/datastore/DataStoreModule.kt @@ -3,12 +3,17 @@ package com.woocommerce.android.datastore import android.content.Context import androidx.datastore.core.DataStore import androidx.datastore.core.DataStoreFactory +import androidx.datastore.core.handlers.ReplaceFileCorruptionHandler import androidx.datastore.preferences.core.PreferenceDataStoreFactory import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.emptyPreferences import androidx.datastore.preferences.preferencesDataStoreFile +import com.automattic.android.tracks.crashlogging.CrashLogging import com.woocommerce.android.datastore.DataStoreType.ANALYTICS_CONFIGURATION import com.woocommerce.android.datastore.DataStoreType.ANALYTICS_UI_CACHE +import com.woocommerce.android.datastore.DataStoreType.COUPONS import com.woocommerce.android.datastore.DataStoreType.DASHBOARD_STATS +import com.woocommerce.android.datastore.DataStoreType.LAST_UPDATE import com.woocommerce.android.datastore.DataStoreType.TOP_PERFORMER_PRODUCTS import com.woocommerce.android.datastore.DataStoreType.TRACKER import com.woocommerce.android.di.AppCoroutineScope @@ -30,11 +35,16 @@ class DataStoreModule { @DataStoreQualifier(TRACKER) fun provideTrackerDataStore( appContext: Context, + crashLogging: CrashLogging, @AppCoroutineScope appCoroutineScope: CoroutineScope ): DataStore = PreferenceDataStoreFactory.create( produceFile = { appContext.preferencesDataStoreFile("tracker") }, + corruptionHandler = ReplaceFileCorruptionHandler { + crashLogging.recordEvent("Corrupted data store. DataStore Type: ${TRACKER.name}") + emptyPreferences() + }, scope = CoroutineScope(appCoroutineScope.coroutineContext + Dispatchers.IO) ) @@ -43,11 +53,16 @@ class DataStoreModule { @DataStoreQualifier(ANALYTICS_UI_CACHE) fun provideAnalyticsDataStore( appContext: Context, + crashLogging: CrashLogging, @AppCoroutineScope appCoroutineScope: CoroutineScope ): DataStore = PreferenceDataStoreFactory.create( produceFile = { appContext.preferencesDataStoreFile("analytics") }, + corruptionHandler = ReplaceFileCorruptionHandler { + crashLogging.recordEvent("Corrupted data store. DataStore Type: ${ANALYTICS_UI_CACHE.name}") + emptyPreferences() + }, scope = CoroutineScope(appCoroutineScope.coroutineContext + Dispatchers.IO) ) @@ -56,11 +71,16 @@ class DataStoreModule { @DataStoreQualifier(ANALYTICS_CONFIGURATION) fun provideAnalyticsConfigurationDataStore( appContext: Context, + crashLogging: CrashLogging, @AppCoroutineScope appCoroutineScope: CoroutineScope ): DataStore = PreferenceDataStoreFactory.create( produceFile = { appContext.preferencesDataStoreFile("analytics_configuration") }, + corruptionHandler = ReplaceFileCorruptionHandler { + crashLogging.recordEvent("Corrupted data store. DataStore Type: ${ANALYTICS_CONFIGURATION.name}") + emptyPreferences() + }, scope = CoroutineScope(appCoroutineScope.coroutineContext + Dispatchers.IO) ) @@ -69,11 +89,16 @@ class DataStoreModule { @DataStoreQualifier(DASHBOARD_STATS) fun provideCustomDateRangeDataStore( appContext: Context, + crashLogging: CrashLogging, @AppCoroutineScope appCoroutineScope: CoroutineScope ): DataStore = DataStoreFactory.create( produceFile = { appContext.preferencesDataStoreFile("custom_date_range_configuration") }, + corruptionHandler = ReplaceFileCorruptionHandler { + crashLogging.recordEvent("Corrupted data store. DataStore Type: ${DASHBOARD_STATS.name}") + CustomDateRange.getDefaultInstance() + }, scope = CoroutineScope(appCoroutineScope.coroutineContext + Dispatchers.IO), serializer = CustomDateRangeSerializer ) @@ -83,39 +108,54 @@ class DataStoreModule { @DataStoreQualifier(TOP_PERFORMER_PRODUCTS) fun provideTopPerformersCustomDateRangeDataStore( appContext: Context, + crashLogging: CrashLogging, @AppCoroutineScope appCoroutineScope: CoroutineScope ): DataStore = DataStoreFactory.create( produceFile = { appContext.preferencesDataStoreFile("top_performers_custom_date_range_configuration") }, + corruptionHandler = ReplaceFileCorruptionHandler { + crashLogging.recordEvent("Corrupted data store. DataStore Type: ${TOP_PERFORMER_PRODUCTS.name}") + CustomDateRange.getDefaultInstance() + }, scope = CoroutineScope(appCoroutineScope.coroutineContext + Dispatchers.IO), serializer = CustomDateRangeSerializer ) @Provides @Singleton - @DataStoreQualifier(DataStoreType.COUPONS) + @DataStoreQualifier(COUPONS) fun provideCouponsCustomDateRangeDataStore( appContext: Context, + crashLogging: CrashLogging, @AppCoroutineScope appCoroutineScope: CoroutineScope ): DataStore = DataStoreFactory.create( produceFile = { appContext.preferencesDataStoreFile("dashboard_coupons_custom_date_range_configuration") }, + corruptionHandler = ReplaceFileCorruptionHandler { + crashLogging.recordEvent("Corrupted data store. DataStore Type: ${COUPONS.name}") + CustomDateRange.getDefaultInstance() + }, scope = CoroutineScope(appCoroutineScope.coroutineContext + Dispatchers.IO), serializer = CustomDateRangeSerializer ) @Provides @Singleton - @DataStoreQualifier(DataStoreType.LAST_UPDATE) + @DataStoreQualifier(LAST_UPDATE) fun provideLastUpdateDataStore( appContext: Context, + crashLogging: CrashLogging, @AppCoroutineScope appCoroutineScope: CoroutineScope ) = PreferenceDataStoreFactory.create( produceFile = { appContext.preferencesDataStoreFile("update") }, + corruptionHandler = ReplaceFileCorruptionHandler { + crashLogging.recordEvent("Corrupted data store. DataStore Type: ${LAST_UPDATE.name}") + emptyPreferences() + }, scope = CoroutineScope(appCoroutineScope.coroutineContext + Dispatchers.IO) ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/extensions/StringExt.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/extensions/StringExt.kt index 66d7d747612..ac493d8cb62 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/extensions/StringExt.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/extensions/StringExt.kt @@ -1,7 +1,12 @@ package com.woocommerce.android.extensions import org.apache.commons.text.StringEscapeUtils +import java.text.DecimalFormat import java.util.Locale +import kotlin.math.log10 +import kotlin.math.pow + +const val BYTES_IN_KILOBYTE = 1024.0 /** * Checks if a given string is a Float @@ -100,3 +105,27 @@ fun String.toCamelCase(delimiter: String = " "): String { fun String.capitalize(locale: Locale = Locale.getDefault()) = replaceFirstChar { if (it.isLowerCase()) it.titlecase(locale) else it.toString() } + +/** + * Converts a numeric string representing bytes into a human-readable file size string. + * + * Source: https://stackoverflow.com/a/5599842 + * + * Examples: + * "1024".readableFileSize() -> "1 kB" + * "1500000".readableFileSize() -> "1.4 MB" + * "0".readableFileSize() -> "0" + * Invalid input returns "0" + * + * @return Formatted string with size and unit (e.g., "1.5 GB") + */ +fun String.readableFileSize(): String { + val size = this.toLongOrNull() + if (size == null || size <= 0) return "0" + + val units = arrayOf("B", "kB", "MB", "GB", "TB", "PB", "EB") + val digitGroups = (log10(size.toDouble()) / log10(BYTES_IN_KILOBYTE)).toInt() + + return DecimalFormat("#,##0.#") + .format(size / BYTES_IN_KILOBYTE.pow(digitGroups.toDouble())) + " " + units[digitGroups] +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/extensions/WCSSRModelExt.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/extensions/WCSSRModelExt.kt index b226692b3fe..29bee6443af 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/extensions/WCSSRModelExt.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/extensions/WCSSRModelExt.kt @@ -4,7 +4,6 @@ package com.woocommerce.android.extensions import androidx.core.text.HtmlCompat import com.woocommerce.android.util.WooLog -import org.apache.commons.io.FileUtils.byteCountToDisplaySize import org.json.JSONArray import org.json.JSONException import org.json.JSONObject @@ -38,7 +37,7 @@ fun WCSSRModel.formatResult(): String { sb.append(HEADING_SSR) // Environment - environment?.let { it -> + environment?.let { try { sb.append(formatEnvironmentData(JSONObject(it))) } catch (e: JSONException) { @@ -110,7 +109,7 @@ private fun formatEnvironmentData(data: JSONObject): String { val memoryLimit = data.optString("wp_memory_limit", MISSING_VALUE) if (memoryLimit != MISSING_VALUE) { - sb.append("WP Memory Limit: ${byteCountToDisplaySize(memoryLimit.toLong())}\n") + sb.append("WP Memory Limit: ${memoryLimit.readableFileSize()}\n") } sb.append("WP Debug Mode: ${checkIfTrue(data.optBoolean("wp_debug_mode", false))}\n") @@ -123,7 +122,7 @@ private fun formatEnvironmentData(data: JSONObject): String { val postMaxSize = data.optString("php_post_max_size", MISSING_VALUE) if (postMaxSize != MISSING_VALUE) { - sb.append("PHP Post Max Size: ${byteCountToDisplaySize(postMaxSize.toLong())}\n") + sb.append("PHP Post Max Size: ${postMaxSize.readableFileSize()}\n") } sb.append("PHP Time Limit: ${data.optString("php_max_execution_time", MISSING_VALUE)} s\n") @@ -134,7 +133,7 @@ private fun formatEnvironmentData(data: JSONObject): String { val maxUploadSize = data.optString("max_upload_size", MISSING_VALUE) if (maxUploadSize != MISSING_VALUE) { - sb.append("PHP Post Max Size: ${byteCountToDisplaySize(maxUploadSize.toLong())}\n") + sb.append("Max Upload Size: ${maxUploadSize.readableFileSize()}\n") } sb.append("Default Timezone: ${data.optString("default_timezone", MISSING_VALUE)}\n") diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/model/FeatureFeedbackSettings.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/model/FeatureFeedbackSettings.kt index 76deaa20287..c9b99b8c2e0 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/model/FeatureFeedbackSettings.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/model/FeatureFeedbackSettings.kt @@ -27,7 +27,6 @@ data class FeatureFeedbackSettings( SHIPPING_LABEL_M4, PRODUCT_ADDONS, SIMPLE_PAYMENTS_AND_ORDER_CREATION, - COUPONS, ANALYTICS_HUB, TAP_TO_PAY, ORDER_SHIPPING_LINES diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/barcodescanner/BarcodeScanner.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/barcodescanner/BarcodeScanner.kt index d658881b540..90a964d46bf 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/barcodescanner/BarcodeScanner.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/barcodescanner/BarcodeScanner.kt @@ -24,7 +24,6 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.stringResource @@ -33,6 +32,7 @@ import androidx.compose.ui.viewinterop.AndroidView import androidx.core.content.ContextCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.compose.LocalLifecycleOwner import com.woocommerce.android.R import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground import java.util.concurrent.TimeUnit diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/destination/BlazeCampaignCreationAdDestinationParametersScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/destination/BlazeCampaignCreationAdDestinationParametersScreen.kt index b032817ac2b..fd7bb651401 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/destination/BlazeCampaignCreationAdDestinationParametersScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/destination/BlazeCampaignCreationAdDestinationParametersScreen.kt @@ -126,14 +126,14 @@ fun AdDestinationParametersScreen( key = key, value = value, onDeleteParameterTapped = onDeleteParameterTapped, - modifier = Modifier.animateItemPlacement() + modifier = Modifier.animateItem() ) } item(key = "footer") { Column( modifier = Modifier - .animateItemPlacement() + .animateItem() .fillMaxWidth() ) { Text( diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/intro/BlazeCampaignCreationIntroScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/intro/BlazeCampaignCreationIntroScreen.kt index 1e87c6e843c..9193744b89b 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/intro/BlazeCampaignCreationIntroScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/intro/BlazeCampaignCreationIntroScreen.kt @@ -30,7 +30,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Clear import androidx.compose.material.icons.filled.Close import androidx.compose.material.rememberModalBottomSheetState -import androidx.compose.material.ripple.rememberRipple +import androidx.compose.material.ripple import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -49,7 +49,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.woocommerce.android.R -import com.woocommerce.android.ui.compose.annotatedStringRes +import com.woocommerce.android.ui.compose.annotatedStringResLegacy import com.woocommerce.android.ui.compose.component.BottomSheetHandle import com.woocommerce.android.ui.compose.component.Toolbar import com.woocommerce.android.ui.compose.component.WCColoredButton @@ -242,11 +242,11 @@ private fun BlazeCampaignBottomSheetContent( onDismissClick: () -> Unit ) { val learnMoreItems = listOf( - annotatedStringRes(R.string.blaze_campaign_creation_new_intro_learn_item_1), - annotatedStringRes(R.string.blaze_campaign_creation_new_intro_learn_item_2), - annotatedStringRes(R.string.blaze_campaign_creation_new_intro_learn_item_3), - annotatedStringRes(R.string.blaze_campaign_creation_new_intro_learn_item_4), - annotatedStringRes(R.string.blaze_campaign_creation_new_intro_learn_item_5), + annotatedStringResLegacy(R.string.blaze_campaign_creation_new_intro_learn_item_1), + annotatedStringResLegacy(R.string.blaze_campaign_creation_new_intro_learn_item_2), + annotatedStringResLegacy(R.string.blaze_campaign_creation_new_intro_learn_item_3), + annotatedStringResLegacy(R.string.blaze_campaign_creation_new_intro_learn_item_4), + annotatedStringResLegacy(R.string.blaze_campaign_creation_new_intro_learn_item_5), ) Column( @@ -300,7 +300,7 @@ private fun CloseButton(onDismissClick: () -> Unit, modifier: Modifier = Modifie onClick = onDismissClick, role = Role.Button, interactionSource = remember { MutableInteractionSource() }, - indication = rememberRipple(bounded = false, radius = dimensionResource(id = R.dimen.major_150)) + indication = ripple(bounded = false, radius = dimensionResource(id = R.dimen.major_150)) ) ) { Icon( diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/objective/BlazeCampaignObjectiveScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/objective/BlazeCampaignObjectiveScreen.kt index 216f462a25d..07aacef8e0f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/objective/BlazeCampaignObjectiveScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/objective/BlazeCampaignObjectiveScreen.kt @@ -34,7 +34,7 @@ import androidx.compose.ui.unit.dp import com.woocommerce.android.R import com.woocommerce.android.ui.blaze.creation.objective.BlazeCampaignObjectiveViewModel.ObjectiveItem import com.woocommerce.android.ui.blaze.creation.objective.BlazeCampaignObjectiveViewModel.ObjectiveViewState -import com.woocommerce.android.ui.compose.annotatedStringRes +import com.woocommerce.android.ui.compose.annotatedStringResLegacy import com.woocommerce.android.ui.compose.component.BottomSheetSwitchColors import com.woocommerce.android.ui.compose.component.Toolbar import com.woocommerce.android.ui.compose.component.WCSwitch @@ -184,7 +184,7 @@ fun ObjectiveListItem( ) if (isSelected) { Text( - text = annotatedStringRes( + text = annotatedStringResLegacy( stringResId = R.string.blaze_campaign_objective_good_for, suitableForDescription ), diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/payment/BlazeCampaignPaymentSummaryScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/payment/BlazeCampaignPaymentSummaryScreen.kt index caadcc342db..78261042b2a 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/payment/BlazeCampaignPaymentSummaryScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/payment/BlazeCampaignPaymentSummaryScreen.kt @@ -12,7 +12,6 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.text.ClickableText import androidx.compose.material.CircularProgressIndicator import androidx.compose.material.ContentAlpha import androidx.compose.material.Divider @@ -39,7 +38,6 @@ import com.woocommerce.android.R import com.woocommerce.android.model.CreditCardType import com.woocommerce.android.ui.blaze.BlazeRepository import com.woocommerce.android.ui.blaze.creation.payment.BlazeCampaignPaymentSummaryViewModel.CampaignCreationState -import com.woocommerce.android.ui.compose.URL_ANNOTATION_TAG import com.woocommerce.android.ui.compose.annotatedStringRes import com.woocommerce.android.ui.compose.component.Toolbar import com.woocommerce.android.ui.compose.component.ToolbarWithHelpButton @@ -146,30 +144,26 @@ private fun PaymentSummaryContent( ) val termsOfServices = annotatedStringRes( - stringResId = R.string.blaze_campaign_payment_summary_terms_and_conditions + stringResId = R.string.blaze_campaign_payment_summary_terms_and_conditions, + onUrlClick = { url -> + when (url) { + "termsOfService" -> + ChromeCustomTabUtils.launchUrl(context, AppUrls.WORPRESS_COM_TERMS) + + "advertisingPolicy" -> + ChromeCustomTabUtils.launchUrl(context, AppUrls.ADVERTISING_POLICY) + + "learnMore" -> + ChromeCustomTabUtils.launchUrl(context, AppUrls.BLAZE_SUPPORT) + } + } ) - ClickableText( + + Text( text = termsOfServices, - style = MaterialTheme.typography.caption.copy( - textAlign = TextAlign.Center, - color = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium) - ), - onClick = { offset -> - termsOfServices.getStringAnnotations(tag = URL_ANNOTATION_TAG, start = offset, end = offset) - .firstOrNull() - ?.let { annotation -> - when (annotation.item) { - "termsOfService" -> - ChromeCustomTabUtils.launchUrl(context, AppUrls.WORPRESS_COM_TERMS) - - "advertisingPolicy" -> - ChromeCustomTabUtils.launchUrl(context, AppUrls.ADVERTISING_POLICY) - - "learnMore" -> - ChromeCustomTabUtils.launchUrl(context, AppUrls.BLAZE_SUPPORT) - } - } - }, + style = MaterialTheme.typography.caption, + textAlign = TextAlign.Center, + color = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium), modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.major_100)) ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/targets/BlazeCampaignTargetSelectionScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/targets/BlazeCampaignTargetSelectionScreen.kt index 46445ef8f22..6e5d170d0cd 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/targets/BlazeCampaignTargetSelectionScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/blaze/creation/targets/BlazeCampaignTargetSelectionScreen.kt @@ -145,7 +145,7 @@ private fun TargetSelectionScreen( onSearchActiveStateChanged(state.isFocused) } .focusRequester(focusRequester), // Request focus - keyboardOptions = KeyboardOptions(autoCorrect = false), + keyboardOptions = KeyboardOptions(autoCorrectEnabled = false), ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/TextExts.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/TextExts.kt index 42251c80d52..2064441068c 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/TextExts.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/TextExts.kt @@ -9,14 +9,19 @@ import android.text.style.UnderlineSpan import androidx.annotation.StringRes import androidx.compose.material.MaterialTheme import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.LinkAnnotation +import androidx.compose.ui.text.LinkInteractionListener import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.TextLinkStyles import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.fromHtml import androidx.compose.ui.text.style.TextDecoration import androidx.core.text.HtmlCompat @@ -28,7 +33,7 @@ const val URL_ANNOTATION_TAG = "url" * Source: https://stackoverflow.com/a/70757314 with some adjustments */ @Composable -fun annotatedStringRes(@StringRes stringResId: Int, vararg args: Any): AnnotatedString { +fun annotatedStringResLegacy(@StringRes stringResId: Int, vararg args: Any): AnnotatedString { val string = stringResource(id = stringResId, *args) val spanned = HtmlCompat.fromHtml(string, HtmlCompat.FROM_HTML_MODE_LEGACY) @@ -43,9 +48,11 @@ fun annotatedStringRes(@StringRes stringResId: Int, vararg args: Any): Annotated is StyleSpan -> span.toSpanStyle()?.let { addStyle(style = it, start = startIndex, end = endIndex) } + is UnderlineSpan -> { addStyle(SpanStyle(textDecoration = TextDecoration.Underline), start = startIndex, end = endIndex) } + is URLSpan -> { addStyle( style = TextStyle.Default.copy(color = MaterialTheme.colors.primary).toSpanStyle(), @@ -64,6 +71,45 @@ fun annotatedStringRes(@StringRes stringResId: Int, vararg args: Any): Annotated } } +/** + * Creates an [AnnotatedString] from the passed String resource. + * + * @param stringResId The resource ID of the string to be converted to an [AnnotatedString]. + * @param onUrlClick Allows overriding the default behavior of URL clicks, by default it will open the URL in an + * external browser. + * @param args The arguments to be used in the string resource. + */ +@Composable +fun annotatedStringRes( + @StringRes stringResId: Int, + onUrlClick: ((String) -> Unit)? = null, + vararg args: Any +): AnnotatedString { + val linkInteractionListener = remember(onUrlClick) { + if (onUrlClick == null) return@remember null + + LinkInteractionListener { linkAnnotation -> + val url = when (linkAnnotation) { + is LinkAnnotation.Url -> linkAnnotation.url + is LinkAnnotation.Clickable -> linkAnnotation.tag + else -> error("Unsupported LinkAnnotation type: $linkAnnotation") + } + onUrlClick.invoke(url) + } + } + + return AnnotatedString.fromHtml( + stringResource(id = stringResId, *args), + linkInteractionListener = linkInteractionListener, + linkStyles = TextLinkStyles( + style = SpanStyle( + color = MaterialTheme.colors.primary, + textDecoration = TextDecoration.None + ), + ) + ) +} + private fun StyleSpan.toSpanStyle(): SpanStyle? { return when (style) { Typeface.BOLD -> SpanStyle(fontWeight = FontWeight.Bold) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/component/Buttons.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/component/Buttons.kt index e5834c433a8..eac871cdcab 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/component/Buttons.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/component/Buttons.kt @@ -20,22 +20,21 @@ import androidx.compose.material.Button import androidx.compose.material.ButtonColors import androidx.compose.material.ButtonDefaults import androidx.compose.material.ButtonElevation +import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.Icon +import androidx.compose.material.LocalRippleConfiguration import androidx.compose.material.MaterialTheme import androidx.compose.material.OutlinedButton import androidx.compose.material.ProvideTextStyle +import androidx.compose.material.RippleConfiguration import androidx.compose.material.Text import androidx.compose.material.TextButton import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.Edit -import androidx.compose.material.ripple.LocalRippleTheme -import androidx.compose.material.ripple.RippleAlpha -import androidx.compose.material.ripple.RippleTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -51,6 +50,7 @@ import androidx.compose.ui.unit.dp import com.woocommerce.android.R import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground +@OptIn(ExperimentalMaterialApi::class) @Composable fun WCColoredButton( onClick: () -> Unit, @@ -66,23 +66,9 @@ fun WCColoredButton( shape: Shape = MaterialTheme.shapes.small, content: @Composable RowScope.() -> Unit, ) { - val contentColor by colors.contentColor(enabled = enabled) - val rippleTheme = remember(rippleColor, contentColor) { - object : RippleTheme { - @Composable - override fun defaultColor(): Color = RippleTheme.defaultRippleColor( - rippleColor, - MaterialTheme.colors.isLight - ) + val rippleConfiguration = RippleConfiguration(color = rippleColor) - @Composable - override fun rippleAlpha(): RippleAlpha = RippleTheme.defaultRippleAlpha( - rippleColor, - MaterialTheme.colors.isLight - ) - } - } - CompositionLocalProvider(LocalRippleTheme provides rippleTheme) { + CompositionLocalProvider(LocalRippleConfiguration provides rippleConfiguration) { Button( onClick = onClick, enabled = enabled, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/component/SearchLayoutWithParams.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/component/SearchLayoutWithParams.kt index c101f1b6b34..1f911abd932 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/component/SearchLayoutWithParams.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/component/SearchLayoutWithParams.kt @@ -59,7 +59,7 @@ fun SearchLayoutWithParams( ) .onFocusChanged { isFocused.value = it.isFocused } .focusRequester(focusRequester), - keyboardOptions = KeyboardOptions(autoCorrect = false), + keyboardOptions = KeyboardOptions(autoCorrectEnabled = false), ) if (isFocused.value || state.areSearchTypesAlwaysVisible) { if (paramsFillWidth) { diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/component/aztec/AztecEditor.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/component/aztec/AztecEditor.kt index 780b6902aba..54eda6fae37 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/component/aztec/AztecEditor.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/compose/component/aztec/AztecEditor.kt @@ -31,9 +31,6 @@ import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalTextInputService -import androidx.compose.ui.text.InternalTextApi -import androidx.compose.ui.text.input.TextInputService import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView @@ -42,7 +39,6 @@ import com.google.android.material.textfield.TextInputLayout import com.woocommerce.android.databinding.ViewAztecBinding import com.woocommerce.android.databinding.ViewAztecOutlinedBinding import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -257,7 +253,6 @@ private fun InternalAztecEditor( ) { val localContext = LocalContext.current val bringIntoViewRequester = remember { BringIntoViewRequester() } - val textInputService = LocalTextInputService.current val viewsHolder = remember(localContext, enableSourceEditor) { aztecViewsProvider(localContext) } val listener = remember { createToolbarListener { state.toggleHtmlEditor() } } @@ -309,8 +304,7 @@ private fun InternalAztecEditor( handleFocus( focusState = focusState, imeVisibility = isImeVisible, - bringIntoViewRequester = bringIntoViewRequester, - textInputService = textInputService + bringIntoViewRequester = bringIntoViewRequester ) } @@ -380,30 +374,12 @@ private fun InternalAztecEditor( } } -@OptIn(ExperimentalFoundationApi::class, InternalTextApi::class) +@OptIn(ExperimentalFoundationApi::class) private suspend fun handleFocus( focusState: StateFlow, imeVisibility: State, bringIntoViewRequester: BringIntoViewRequester, - textInputService: TextInputService? ) = coroutineScope { - launch(Dispatchers.Main.immediate) { - // In Compose, text fields use input sessions to manage the input, when focus moves to a non-input field - // the session is closed and this hides the keyboard. - // This behavior doesn't work well when focus moves to a non-Compose input field, like the Aztec editor. - // see: https://issuetracker.google.com/issues/318530776 and https://issuetracker.google.com/issues/363544352 - // To get around the issue, we are using the internal API to start/stop the input session. - // This is safe to do because even if the API changes, we can remove the logic temporarily until the bug is - // fixed, as this bug is not critical for the editor. - focusState.collect { - if (it) { - textInputService?.startInput() - } else { - textInputService?.stopInput() - } - } - } - launch { // Use collectLatest to make sure the nested collection is cancelled when the focus state changes focusState.collectLatest { hasFocus -> diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/coupons/CouponListFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/coupons/CouponListFragment.kt index 05246f1e438..11a7261acd3 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/coupons/CouponListFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/coupons/CouponListFragment.kt @@ -12,25 +12,18 @@ import android.widget.SearchView.OnQueryTextListener import androidx.appcompat.widget.SearchView import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.core.view.MenuProvider -import androidx.core.view.isVisible import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle.State import androidx.navigation.fragment.findNavController import com.woocommerce.android.FeedbackPrefs -import com.woocommerce.android.NavGraphMainDirections import com.woocommerce.android.R -import com.woocommerce.android.analytics.AnalyticsEvent -import com.woocommerce.android.analytics.AnalyticsTracker import com.woocommerce.android.databinding.FragmentCouponListBinding import com.woocommerce.android.extensions.navigateSafely -import com.woocommerce.android.model.FeatureFeedbackSettings -import com.woocommerce.android.model.FeatureFeedbackSettings.Feature.COUPONS import com.woocommerce.android.ui.base.BaseFragment import com.woocommerce.android.ui.base.UIMessageResolver import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground import com.woocommerce.android.ui.coupons.CouponListViewModel.NavigateToCouponDetailsEvent import com.woocommerce.android.ui.coupons.CouponListViewModel.NavigateToCouponTypePicker -import com.woocommerce.android.ui.feedback.SurveyType import com.woocommerce.android.viewmodel.MultiLiveEvent import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -49,9 +42,6 @@ class CouponListFragment : BaseFragment(R.layout.fragment_coupon_list) { private lateinit var searchView: SearchView private var _binding: FragmentCouponListBinding? = null private val binding get() = _binding!! - private val feedbackState - get() = feedbackPrefs.getFeatureFeedbackSettings(COUPONS)?.feedbackState - ?: FeatureFeedbackSettings.FeedbackState.UNANSWERED private val viewModel: CouponListViewModel by viewModels() @@ -122,11 +112,6 @@ class CouponListFragment : BaseFragment(R.layout.fragment_coupon_list) { ) } - override fun onViewStateRestored(savedInstanceState: Bundle?) { - super.onViewStateRestored(savedInstanceState) - displayCouponsWIPCard(true) - } - override fun getFragmentTitle(): String = getString(R.string.coupons) private fun initSearch() { @@ -186,58 +171,6 @@ class CouponListFragment : BaseFragment(R.layout.fragment_coupon_list) { ) } - private fun displayCouponsWIPCard(show: Boolean) { - if (!show || - feedbackState == FeatureFeedbackSettings.FeedbackState.DISMISSED - ) { - binding.couponsWIPcard.isVisible = false - return - } - - binding.couponsWIPcard.isVisible = true - binding.couponsWIPcard.initView( - getString(R.string.coupon_list_wip_title), - getString(R.string.coupon_list_wip_message_enabled), - onGiveFeedbackClick = { onGiveFeedbackClicked() }, - onDismissClick = { onDismissWIPCardClicked() }, - showFeedbackButton = true - ) - } - - private fun onGiveFeedbackClicked() { - AnalyticsTracker.track( - AnalyticsEvent.FEATURE_FEEDBACK_BANNER, - mapOf( - AnalyticsTracker.KEY_FEEDBACK_CONTEXT to AnalyticsTracker.VALUE_COUPONS_FEEDBACK, - AnalyticsTracker.KEY_FEEDBACK_ACTION to AnalyticsTracker.VALUE_FEEDBACK_GIVEN - ) - ) - registerFeedbackSetting(FeatureFeedbackSettings.FeedbackState.GIVEN) - - NavGraphMainDirections - .actionGlobalFeedbackSurveyFragment(SurveyType.COUPONS) - .apply { findNavController().navigateSafely(this) } - } - - private fun onDismissWIPCardClicked() { - AnalyticsTracker.track( - AnalyticsEvent.FEATURE_FEEDBACK_BANNER, - mapOf( - AnalyticsTracker.KEY_FEEDBACK_CONTEXT to AnalyticsTracker.VALUE_COUPONS_FEEDBACK, - AnalyticsTracker.KEY_FEEDBACK_ACTION to AnalyticsTracker.VALUE_FEEDBACK_DISMISSED - ) - ) - registerFeedbackSetting(FeatureFeedbackSettings.FeedbackState.DISMISSED) - displayCouponsWIPCard(false) - } - - private fun registerFeedbackSetting(state: FeatureFeedbackSettings.FeedbackState) { - FeatureFeedbackSettings( - COUPONS, - state - ).registerItself(feedbackPrefs) - } - override fun onDestroyView() { super.onDestroyView() _binding = null diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/customfields/list/CustomFieldsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/customfields/list/CustomFieldsScreen.kt index a260613073a..cda32e412e4 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/customfields/list/CustomFieldsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/customfields/list/CustomFieldsScreen.kt @@ -20,7 +20,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.text.ClickableText import androidx.compose.foundation.verticalScroll import androidx.compose.material.Divider import androidx.compose.material.ExperimentalMaterialApi @@ -49,12 +48,12 @@ import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.ExperimentalTextApi +import androidx.compose.ui.text.LinkAnnotation import androidx.compose.ui.text.SpanStyle -import androidx.compose.ui.text.UrlAnnotation +import androidx.compose.ui.text.TextLinkStyles import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import com.woocommerce.android.R @@ -288,26 +287,21 @@ private fun CustomFieldItem( if (customField.contentType != CustomFieldContentType.TEXT) { val text = buildAnnotatedString { - withStyle(SpanStyle(color = MaterialTheme.colors.primary)) { - pushUrlAnnotation(UrlAnnotation(customField.value)) - append(customField.value) - } + pushLink( + LinkAnnotation.Url( + url = customField.value, + styles = TextLinkStyles(style = SpanStyle(color = MaterialTheme.colors.primary)), + linkInteractionListener = { onValueClicked(customField) } + ) + ) + append(customField.value) } - ClickableText( + Text( text = text, - style = MaterialTheme.typography.body2.copy( - color = MaterialTheme.colors.onSurface - ), + style = MaterialTheme.typography.body2, + color = MaterialTheme.colors.onSurface, maxLines = 2, - overflow = TextOverflow.Ellipsis, - onClick = { offset -> - text.getUrlAnnotations( - start = offset, - end = offset - ).firstOrNull()?.let { _ -> - onValueClicked(customField) - } - } + overflow = TextOverflow.Ellipsis ) } else { Text( diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/WidgetError.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/WidgetError.kt index 532c6b0c868..493bf802e18 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/WidgetError.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/WidgetError.kt @@ -5,7 +5,6 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.text.ClickableText import androidx.compose.material.LocalContentColor import androidx.compose.material.MaterialTheme import androidx.compose.material.Text @@ -14,13 +13,11 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.woocommerce.android.R -import com.woocommerce.android.ui.compose.URL_ANNOTATION_TAG import com.woocommerce.android.ui.compose.annotatedStringRes import com.woocommerce.android.ui.compose.component.WCOutlinedButton @@ -46,25 +43,16 @@ fun WidgetError( style = MaterialTheme.typography.h6 ) - val errorMessage = annotatedStringRes(R.string.dynamic_dashboard_widget_error_description) - - ClickableText( - modifier = Modifier.padding(horizontal = 32.dp), + val errorMessage = annotatedStringRes( + stringResId = R.string.dynamic_dashboard_widget_error_description, + onUrlClick = { onContactSupportClicked() } + ) + Text( text = errorMessage, - style = TextStyle( - textAlign = TextAlign.Center, - fontSize = 18.sp, - color = LocalContentColor.current - ), - onClick = { offset -> - errorMessage.getStringAnnotations(tag = URL_ANNOTATION_TAG, start = offset, end = offset) - .firstOrNull() - ?.let { annotation -> - when (annotation.item) { - "support" -> onContactSupportClicked() - } - } - }, + textAlign = TextAlign.Center, + fontSize = 18.sp, + color = LocalContentColor.current, + modifier = Modifier.padding(horizontal = 32.dp), ) WCOutlinedButton( diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/blaze/DashboardBlazeCard.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/blaze/DashboardBlazeCard.kt index cd8e7295e91..d51546bf2f2 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/blaze/DashboardBlazeCard.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/blaze/DashboardBlazeCard.kt @@ -20,7 +20,6 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.painterResource @@ -29,6 +28,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.Observer +import androidx.lifecycle.compose.LocalLifecycleOwner import com.woocommerce.android.NavGraphMainDirections import com.woocommerce.android.R import com.woocommerce.android.R.string diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/coupons/DashboardCouponsCard.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/coupons/DashboardCouponsCard.kt index f109537a3ab..8f0e835e4e1 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/coupons/DashboardCouponsCard.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/coupons/DashboardCouponsCard.kt @@ -20,7 +20,6 @@ import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -28,6 +27,7 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.Observer +import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.navigation.navOptions import com.woocommerce.android.R import com.woocommerce.android.extensions.navigateSafely diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/google/DashboardGoogleAdsCard.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/google/DashboardGoogleAdsCard.kt index 251dc503695..78edd6afcd4 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/google/DashboardGoogleAdsCard.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/google/DashboardGoogleAdsCard.kt @@ -22,7 +22,6 @@ import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.painterResource @@ -32,6 +31,7 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.Observer +import androidx.lifecycle.compose.LocalLifecycleOwner import com.woocommerce.android.NavGraphMainDirections import com.woocommerce.android.R import com.woocommerce.android.extensions.navigateSafely diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/inbox/DashboardInboxCard.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/inbox/DashboardInboxCard.kt index 67edbd80498..a48f0cd88a5 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/inbox/DashboardInboxCard.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/inbox/DashboardInboxCard.kt @@ -16,7 +16,6 @@ import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -26,6 +25,7 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.Observer +import androidx.lifecycle.compose.LocalLifecycleOwner import com.woocommerce.android.R import com.woocommerce.android.extensions.navigateSafely import com.woocommerce.android.ui.compose.rememberNavController diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/onboarding/DashboardOnboardingCard.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/onboarding/DashboardOnboardingCard.kt index 5a1d23eb18e..26c0cff3361 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/onboarding/DashboardOnboardingCard.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/onboarding/DashboardOnboardingCard.kt @@ -25,7 +25,6 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.stringResource @@ -33,6 +32,7 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.Observer +import androidx.lifecycle.compose.LocalLifecycleOwner import com.woocommerce.android.NavGraphMainDirections import com.woocommerce.android.R import com.woocommerce.android.extensions.navigateSafely diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/orders/DashboardOrdersCard.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/orders/DashboardOrdersCard.kt index 2cf8b88f823..649e4917c82 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/orders/DashboardOrdersCard.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/orders/DashboardOrdersCard.kt @@ -18,7 +18,6 @@ import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -30,6 +29,7 @@ import androidx.constraintlayout.compose.ConstraintLayout import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.Observer +import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.navigation.NavController import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.navOptions diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/reviews/DashboardReviewsCard.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/reviews/DashboardReviewsCard.kt index 03a747eeb8c..b1d9e82b0b4 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/reviews/DashboardReviewsCard.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/reviews/DashboardReviewsCard.kt @@ -21,7 +21,6 @@ import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -34,6 +33,7 @@ import androidx.compose.ui.viewinterop.AndroidView import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.Observer +import androidx.lifecycle.compose.LocalLifecycleOwner import com.woocommerce.android.R import com.woocommerce.android.extensions.fastStripHtml import com.woocommerce.android.extensions.navigateSafely diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/stats/DashboardStatsCard.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/stats/DashboardStatsCard.kt index 244c14dc219..da92128cf56 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/stats/DashboardStatsCard.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/stats/DashboardStatsCard.kt @@ -11,13 +11,13 @@ import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.viewinterop.AndroidView import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.Observer +import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.lifecycleScope import com.woocommerce.android.R import com.woocommerce.android.extensions.navigateSafely @@ -98,7 +98,7 @@ fun DashboardStatsCard( currencyFormatter = viewModel.currencyFormatter, usageTracksEventEmitter = viewModel.usageTracksEventEmitter, onAddCustomRangeClick = viewModel::onAddCustomRangeClicked, - onTabSelected = viewModel::onTabSelected, + onTabSelected = viewModel::onRangeChanged, onChartDateSelected = viewModel::onChartDateSelected ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/stats/DashboardStatsViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/stats/DashboardStatsViewModel.kt index 6e9a3c5f111..e1cbe2a4f25 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/stats/DashboardStatsViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/stats/DashboardStatsViewModel.kt @@ -123,7 +123,7 @@ class DashboardStatsViewModel @AssistedInject constructor( trackLocalTimezoneDifferenceFromStore() } - fun onTabSelected(selectionType: SelectionType) { + fun onRangeChanged(selectionType: SelectionType) { parentViewModel.trackCardInteracted(DashboardWidget.Type.STATS.trackingIdentifier) usageTracksEventEmitter.interacted() if (selectionType != SelectionType.CUSTOM) { @@ -134,7 +134,7 @@ class DashboardStatsViewModel @AssistedInject constructor( } else { appPrefsWrapper.setActiveStatsTab(SelectionType.CUSTOM.name) analyticsTrackerWrapper.track( - AnalyticsEvent.DASHBOARD_STATS_CUSTOM_RANGE_TAB_SELECTED + AnalyticsEvent.DASHBOARD_STATS_CUSTOM_RANGE_ADD_BUTTON_TAPPED ) } } @@ -151,7 +151,7 @@ class DashboardStatsViewModel @AssistedInject constructor( viewModelScope.launch { customDateRangeDataStore.updateDateRange(range) if (dateRangeState.value?.rangeSelection?.selectionType != SelectionType.CUSTOM) { - onTabSelected(SelectionType.CUSTOM) + onRangeChanged(SelectionType.CUSTOM) } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/stock/DashboardProductStockCard.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/stock/DashboardProductStockCard.kt index 6d135725d89..732d3dc616c 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/stock/DashboardProductStockCard.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/stock/DashboardProductStockCard.kt @@ -21,7 +21,6 @@ import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -32,6 +31,7 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.Observer +import androidx.lifecycle.compose.LocalLifecycleOwner import com.woocommerce.android.NavGraphMainDirections import com.woocommerce.android.R import com.woocommerce.android.extensions.navigateSafely diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/topperformers/DashboardTopPerformersViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/topperformers/DashboardTopPerformersViewModel.kt index 5bbafb6b035..f279156a4fb 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/topperformers/DashboardTopPerformersViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/topperformers/DashboardTopPerformersViewModel.kt @@ -140,7 +140,7 @@ class DashboardTopPerformersViewModel @AssistedInject constructor( } } - fun onTabSelected(selectionType: SelectionType) { + fun onRangeChanged(selectionType: SelectionType) { parentViewModel.trackCardInteracted(DashboardWidget.Type.POPULAR_PRODUCTS.trackingIdentifier) usageTracksEventEmitter.interacted() if (selectionType != SelectionType.CUSTOM) { @@ -150,7 +150,7 @@ class DashboardTopPerformersViewModel @AssistedInject constructor( onEditCustomRangeTapped() } else { appPrefsWrapper.setActiveTopPerformersTab(SelectionType.CUSTOM.name) - analyticsTrackerWrapper.track(AnalyticsEvent.DASHBOARD_STATS_CUSTOM_RANGE_TAB_SELECTED) + analyticsTrackerWrapper.track(AnalyticsEvent.DASHBOARD_STATS_CUSTOM_RANGE_ADD_BUTTON_TAPPED) } } } @@ -287,7 +287,7 @@ class DashboardTopPerformersViewModel @AssistedInject constructor( viewModelScope.launch { customDateRangeDataStore.updateDateRange(statsTimeRange) if (selectedDateRange.value?.rangeSelection?.selectionType != SelectionType.CUSTOM) { - onTabSelected(SelectionType.CUSTOM) + onRangeChanged(SelectionType.CUSTOM) } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/topperformers/DashboardTopPerformersWidgetCard.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/topperformers/DashboardTopPerformersWidgetCard.kt index 9a06d8d7352..602af379e78 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/topperformers/DashboardTopPerformersWidgetCard.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/topperformers/DashboardTopPerformersWidgetCard.kt @@ -20,7 +20,6 @@ import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource @@ -32,6 +31,7 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.Observer +import androidx.lifecycle.compose.LocalLifecycleOwner import com.woocommerce.android.NavGraphMainDirections import com.woocommerce.android.R import com.woocommerce.android.extensions.navigateSafely @@ -95,7 +95,7 @@ fun DashboardTopPerformersWidgetCard( topPerformersState = topPerformersState, selectedDateRange = selectedDateRange, lastUpdateState = lastUpdateState, - onTabSelected = topPerformersViewModel::onTabSelected, + onTabSelected = topPerformersViewModel::onRangeChanged, onEditCustomRangeTapped = topPerformersViewModel::onEditCustomRangeTapped ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/feedback/FeedbackSurveyFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/feedback/FeedbackSurveyFragment.kt index 61d8b89ab0c..27a4135f02b 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/feedback/FeedbackSurveyFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/feedback/FeedbackSurveyFragment.kt @@ -17,7 +17,6 @@ import com.woocommerce.android.analytics.AnalyticsTracker import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_FEEDBACK_ACTION import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_FEEDBACK_CONTEXT import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_ANALYTICS_HUB_FEEDBACK -import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_COUPONS_FEEDBACK import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_FEEDBACK_CANCELED import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_FEEDBACK_GENERAL_CONTEXT import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_FEEDBACK_OPENED @@ -55,7 +54,6 @@ class FeedbackSurveyFragment : BaseFragment(R.layout.fragment_feedback_survey) { SurveyType.STORE_ONBOARDING -> VALUE_FEEDBACK_STORE_SETUP_CONTEXT SurveyType.ORDER_CREATION -> VALUE_SIMPLE_PAYMENTS_FEEDBACK SurveyType.SHIPPING_LABELS -> VALUE_SHIPPING_LABELS_M4_FEEDBACK - SurveyType.COUPONS -> VALUE_COUPONS_FEEDBACK SurveyType.ADDONS -> VALUE_PRODUCT_ADDONS_FEEDBACK SurveyType.ANALYTICS_HUB -> VALUE_ANALYTICS_HUB_FEEDBACK SurveyType.PAYMENTS_HUB_TAP_TO_PAY -> VALUE_TAP_TO_PAY_FEEDBACK diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/feedback/SurveyType.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/feedback/SurveyType.kt index c8b1ace1056..d1123314384 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/feedback/SurveyType.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/feedback/SurveyType.kt @@ -9,7 +9,6 @@ enum class SurveyType(private val untaggedUrl: String, private val milestone: In SHIPPING_LABELS(AppUrls.CROWDSIGNAL_SHIPPING_LABELS_SURVEY, 4), ORDER_CREATION(AppUrls.ORDER_CREATION_SURVEY, 1), MAIN(AppUrls.CROWDSIGNAL_MAIN_SURVEY), - COUPONS(AppUrls.COUPONS_SURVEY), ADDONS(AppUrls.ADDONS_SURVEY), STORE_ONBOARDING(AppUrls.CROWDSIGNAL_STORE_SETUP_SURVEY), ANALYTICS_HUB(AppUrls.CROWDSIGNAL_ANALYTICS_HUB_SURVEY), diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/accountmismatch/AccountMismatchErrorScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/accountmismatch/AccountMismatchErrorScreen.kt index 49d8baf2646..6d49bde5ea3 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/accountmismatch/AccountMismatchErrorScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/accountmismatch/AccountMismatchErrorScreen.kt @@ -4,7 +4,6 @@ import android.annotation.SuppressLint import android.content.res.Configuration import androidx.activity.compose.BackHandler import androidx.compose.animation.AnimatedContent -import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.animation.core.updateTransition import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -19,7 +18,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.text.ClickableText import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll @@ -49,7 +47,6 @@ import coil.request.ImageRequest.Builder import com.woocommerce.android.AppUrls import com.woocommerce.android.R import com.woocommerce.android.ui.common.wpcomwebview.WPComWebViewAuthenticator -import com.woocommerce.android.ui.compose.URL_ANNOTATION_TAG import com.woocommerce.android.ui.compose.annotatedStringRes import com.woocommerce.android.ui.compose.component.ProgressDialog import com.woocommerce.android.ui.compose.component.ToolbarWithHelpButton @@ -66,7 +63,6 @@ import com.woocommerce.android.ui.login.accountmismatch.AccountMismatchErrorView import com.woocommerce.android.util.ChromeCustomTabUtils import org.wordpress.android.fluxc.network.UserAgent -@OptIn(ExperimentalAnimationApi::class) @Composable fun AccountMismatchErrorScreen(viewModel: AccountMismatchErrorViewModel) { val webViewNavigator = rememberWebViewNavigator() @@ -201,24 +197,23 @@ fun AccountMismatchErrorScreen(viewState: ViewState.MainState, modifier: Modifie ) if (viewState.showJetpackTermsConsent) { - val consent = annotatedStringRes(stringResId = R.string.login_jetpack_connection_consent) val context = LocalContext.current - ClickableText( - text = consent, - style = MaterialTheme.typography.caption.copy( - textAlign = TextAlign.Center, - color = MaterialTheme.colors.onSurface - ) - ) { - consent.getStringAnnotations(tag = URL_ANNOTATION_TAG, start = it, end = it) - .firstOrNull() - ?.let { annotation -> - when (annotation.item) { - "terms" -> ChromeCustomTabUtils.launchUrl(context, AppUrls.WORPRESS_COM_TERMS) - "sync" -> ChromeCustomTabUtils.launchUrl(context, AppUrls.JETPACK_SYNC_POLICY) - } + val consent = annotatedStringRes( + stringResId = R.string.login_jetpack_connection_consent, + onUrlClick = { url -> + when (url) { + "terms" -> ChromeCustomTabUtils.launchUrl(context, AppUrls.WORPRESS_COM_TERMS) + "sync" -> ChromeCustomTabUtils.launchUrl(context, AppUrls.JETPACK_SYNC_POLICY) } - } + } + ) + + Text( + text = consent, + style = MaterialTheme.typography.caption, + textAlign = TextAlign.Center, + color = MaterialTheme.colors.onSurface + ) } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/components/JetpackConsent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/components/JetpackConsent.kt index 6689ab26af1..67fdf75bd2c 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/components/JetpackConsent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/components/JetpackConsent.kt @@ -1,36 +1,35 @@ package com.woocommerce.android.ui.login.jetpack.components -import androidx.compose.foundation.text.ClickableText import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextAlign import com.woocommerce.android.AppUrls import com.woocommerce.android.R -import com.woocommerce.android.ui.compose.URL_ANNOTATION_TAG import com.woocommerce.android.ui.compose.annotatedStringRes import com.woocommerce.android.util.ChromeCustomTabUtils @Composable fun JetpackConsent(modifier: Modifier = Modifier) { - val consent = annotatedStringRes(stringResId = R.string.login_jetpack_connection_consent) val context = LocalContext.current - ClickableText( + + val consent = annotatedStringRes( + stringResId = R.string.login_jetpack_connection_consent, + onUrlClick = { url -> + when (url) { + "terms" -> ChromeCustomTabUtils.launchUrl(context, AppUrls.WORPRESS_COM_TERMS) + "sync" -> ChromeCustomTabUtils.launchUrl(context, AppUrls.JETPACK_SYNC_POLICY) + } + } + ) + + Text( text = consent, - style = MaterialTheme.typography.caption.copy( - textAlign = TextAlign.Center, - color = MaterialTheme.colors.onSurface - ), + style = MaterialTheme.typography.caption, + textAlign = TextAlign.Center, + color = MaterialTheme.colors.onSurface, modifier = modifier - ) { - consent.getStringAnnotations(tag = URL_ANNOTATION_TAG, start = it, end = it) - .firstOrNull() - ?.let { annotation -> - when (annotation.item) { - "terms" -> ChromeCustomTabUtils.launchUrl(context, AppUrls.WORPRESS_COM_TERMS) - "sync" -> ChromeCustomTabUtils.launchUrl(context, AppUrls.JETPACK_SYNC_POLICY) - } - } - } + ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/main/JetpackActivationMainScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/main/JetpackActivationMainScreen.kt index 26e60c5e991..01425db74d7 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/main/JetpackActivationMainScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/main/JetpackActivationMainScreen.kt @@ -56,7 +56,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameterProvider import com.woocommerce.android.R -import com.woocommerce.android.ui.compose.annotatedStringRes +import com.woocommerce.android.ui.compose.annotatedStringResLegacy import com.woocommerce.android.ui.compose.component.Toolbar import com.woocommerce.android.ui.compose.component.WCColoredButton import com.woocommerce.android.ui.compose.component.WCOutlinedButton @@ -169,7 +169,7 @@ private fun ProgressState( R.string.login_jetpack_steps_screen_subtitle } Text( - text = annotatedStringRes(stringResId = subtitle, viewState.siteUrl), + text = annotatedStringResLegacy(stringResId = subtitle, viewState.siteUrl), style = MaterialTheme.typography.body1 ) Spacer(modifier = Modifier.height(dimensionResource(id = R.dimen.major_100))) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/sitecredentials/JetpackActivationSiteCredentialsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/sitecredentials/JetpackActivationSiteCredentialsScreen.kt index 3f5cf3f5fab..70dbd797bfd 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/sitecredentials/JetpackActivationSiteCredentialsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/sitecredentials/JetpackActivationSiteCredentialsScreen.kt @@ -25,7 +25,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.tooling.preview.Preview import com.woocommerce.android.R -import com.woocommerce.android.ui.compose.annotatedStringRes +import com.woocommerce.android.ui.compose.annotatedStringResLegacy import com.woocommerce.android.ui.compose.component.ProgressDialog import com.woocommerce.android.ui.compose.component.Toolbar import com.woocommerce.android.ui.compose.component.WCColoredButton @@ -95,7 +95,7 @@ fun JetpackActivationSiteCredentialsScreen( ) Spacer(modifier = Modifier.height(dimensionResource(id = R.dimen.minor_100))) Text( - text = annotatedStringRes( + text = annotatedStringResLegacy( stringResId = if (viewState.isJetpackInstalled) { R.string.login_jetpack_connection_enter_site_credentials } else { diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt index 8b5f17d864e..84bcc116432 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/main/MainActivity.kt @@ -395,7 +395,7 @@ class MainActivity : super.onPause() } - override fun onNewIntent(intent: Intent?) { + override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) // Verify authenticated session diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/onboarding/payments/PaymentsPreSetupScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/onboarding/payments/PaymentsPreSetupScreen.kt index 5f40c77a079..2418ba30acf 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/onboarding/payments/PaymentsPreSetupScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/onboarding/payments/PaymentsPreSetupScreen.kt @@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.text.ClickableText import androidx.compose.foundation.verticalScroll import androidx.compose.material.Divider import androidx.compose.material.MaterialTheme @@ -26,7 +25,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import com.woocommerce.android.R -import com.woocommerce.android.ui.compose.URL_ANNOTATION_TAG import com.woocommerce.android.ui.compose.annotatedStringRes import com.woocommerce.android.ui.compose.component.Toolbar import com.woocommerce.android.ui.compose.component.WCColoredButton @@ -112,21 +110,19 @@ private fun PaymentsPreSetupContent( R.string.store_onboarding_wcpay_setup_description } else { R.string.store_onboarding_payments_setup_description + }, + onUrlClick = { url -> + when (url) { + "termsOfService" -> onTermsOfServiceClick() + "privacyPolicy" -> onPrivacyPolicyClick() + } } ) - ClickableText( + Text( text = bodyText, - style = MaterialTheme.typography.body1.copy(color = colorResource(id = R.color.color_on_surface_medium)) - ) { - bodyText.getStringAnnotations(tag = URL_ANNOTATION_TAG, start = it, end = it) - .firstOrNull() - ?.let { annotation -> - when (annotation.item) { - "termsOfService" -> onTermsOfServiceClick() - "privacyPolicy" -> onPrivacyPolicyClick() - } - } - } + style = MaterialTheme.typography.body1, + color = colorResource(id = R.color.color_on_surface_medium) + ) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/onboarding/payments/WooPaymentsSetupInstructionsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/onboarding/payments/WooPaymentsSetupInstructionsScreen.kt index 15b4ef32de6..65e5eef49fd 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/onboarding/payments/WooPaymentsSetupInstructionsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/onboarding/payments/WooPaymentsSetupInstructionsScreen.kt @@ -15,7 +15,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.text.ClickableText import androidx.compose.foundation.verticalScroll import androidx.compose.material.Divider import androidx.compose.material.Icon @@ -38,7 +37,6 @@ import androidx.compose.ui.unit.dp import com.woocommerce.android.R import com.woocommerce.android.R.color import com.woocommerce.android.R.string -import com.woocommerce.android.ui.compose.URL_ANNOTATION_TAG import com.woocommerce.android.ui.compose.annotatedStringRes import com.woocommerce.android.ui.compose.component.Toolbar import com.woocommerce.android.ui.compose.component.WCColoredButton @@ -124,17 +122,17 @@ private fun WooPaymentsSetupInstructionsContent( modifier = Modifier.padding(bottom = dimensionResource(id = R.dimen.major_100)) ) - val text = annotatedStringRes(stringResId = R.string.store_onboarding_wcpay_instructions_content_step_1_content) + val text = annotatedStringRes( + stringResId = R.string.store_onboarding_wcpay_instructions_content_step_1_content, + onUrlClick = { onWPComAccountMoreDetailsClick() } + ) + WooPaymentsSetupInstructionsStep(stepNumber = 1) { - ClickableText( + Text( text = text, - style = MaterialTheme.typography.subtitle1 - .copy(color = colorResource(id = color.color_on_surface)), - ) { - text.getStringAnnotations(tag = URL_ANNOTATION_TAG, start = it, end = it) - .firstOrNull() - ?.let { onWPComAccountMoreDetailsClick() } - } + style = MaterialTheme.typography.subtitle1, + color = colorResource(id = color.color_on_surface) + ) } WooPaymentsSetupInstructionsStep( @@ -217,16 +215,15 @@ private fun WooPaymentsSetupInstructionsFooter( .align(Alignment.CenterVertically) .padding(end = 8.dp) ) - val text = annotatedStringRes(stringResId = R.string.store_onboarding_wcpay_instructions_content_learn_more) - ClickableText( + val text = annotatedStringRes( + stringResId = R.string.store_onboarding_wcpay_instructions_content_learn_more, + onUrlClick = { onLearnMoreClick() } + ) + Text( text = text, - style = MaterialTheme.typography.subtitle2 - .copy(color = colorResource(id = R.color.color_on_surface_medium)), - ) { - text.getStringAnnotations(tag = URL_ANNOTATION_TAG, start = it, end = it) - .firstOrNull() - ?.let { onLearnMoreClick() } - } + style = MaterialTheme.typography.subtitle2, + color = colorResource(id = R.color.color_on_surface_medium) + ) } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt index 35bd1026ebf..876dac6bf74 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/OrderCreateEditViewModel.kt @@ -141,7 +141,7 @@ import com.woocommerce.android.ui.products.ParameterRepository import com.woocommerce.android.ui.products.ProductRestriction import com.woocommerce.android.ui.products.ProductStatus import com.woocommerce.android.ui.products.ProductType -import com.woocommerce.android.ui.products.inventory.FetchProductBySKU +import com.woocommerce.android.ui.products.inventory.FetchProductByIdentifier import com.woocommerce.android.ui.products.selector.ProductSelectorViewModel.SelectedItem import com.woocommerce.android.ui.products.selector.ProductSelectorViewModel.SelectedItem.Product import com.woocommerce.android.ui.products.selector.variationIds @@ -209,7 +209,7 @@ class OrderCreateEditViewModel @Inject constructor( private val currencySymbolFinder: CurrencySymbolFinder, private val totalsHelper: OrderCreateEditTotalsHelper, private val feedbackRepository: FeedbackRepository, - private val fetchProductBySKU: FetchProductBySKU, + private val fetchProductByIdentifier: FetchProductByIdentifier, dateUtils: DateUtils, autoSyncOrder: AutoSyncOrder, autoSyncPriceModifier: AutoSyncPriceModifier, @@ -917,7 +917,7 @@ class OrderCreateEditViewModel @Inject constructor( }.orEmpty() viewModelScope.launch { viewState = viewState.copy(isUpdatingOrderDraft = true) - val result = fetchProductBySKU(barcodeOptions.sku, barcodeOptions.barcodeFormat) + val result = fetchProductByIdentifier(barcodeOptions.sku, barcodeOptions.barcodeFormat) if (result.isSuccess) { val product = result.getOrNull() if (product != null) { diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/shipping/AmountBigDecimalTextField.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/shipping/AmountBigDecimalTextField.kt index 72c08577d7a..8d29bafe251 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/shipping/AmountBigDecimalTextField.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/shipping/AmountBigDecimalTextField.kt @@ -2,8 +2,8 @@ package com.woocommerce.android.ui.orders.creation.shipping import android.util.TypedValue import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.viewinterop.AndroidView +import androidx.lifecycle.compose.LocalLifecycleOwner import com.google.android.material.textfield.TextInputLayout import com.woocommerce.android.R import com.woocommerce.android.extensions.filterNotNull diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/views/ExpandableGroupedProductCard.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/views/ExpandableGroupedProductCard.kt index a57640a3658..4af34ac2f68 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/views/ExpandableGroupedProductCard.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/views/ExpandableGroupedProductCard.kt @@ -4,8 +4,8 @@ import android.annotation.SuppressLint import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.MutableTransitionState import androidx.compose.animation.core.animateFloat +import androidx.compose.animation.core.rememberTransition import androidx.compose.animation.core.tween -import androidx.compose.animation.core.updateTransition import androidx.compose.animation.expandVertically import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut @@ -240,7 +240,7 @@ fun ExpandableChildrenProductCard( val transitionState = remember { MutableTransitionState(isExpanded).apply { targetState = !isExpanded } } - val transition = updateTransition(transitionState, "expandableChildProductCard") + val transition = rememberTransition(transitionState, "expandableChildProductCard") val chevronRotation by transition.animateFloat( transitionSpec = { tween(durationMillis = ANIM_DURATION_MILLIS) }, label = "childChevronRotation" diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/views/ExpandableProductCard.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/views/ExpandableProductCard.kt index 21ed47ac3c8..b9f61d48e43 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/views/ExpandableProductCard.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/creation/views/ExpandableProductCard.kt @@ -7,8 +7,8 @@ import androidx.compose.animation.core.MutableTransitionState import androidx.compose.animation.core.animateDpAsState import androidx.compose.animation.core.animateFloat import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.rememberTransition import androidx.compose.animation.core.tween -import androidx.compose.animation.core.updateTransition import androidx.compose.animation.expandVertically import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut @@ -108,7 +108,7 @@ fun ExpandableProductCard( val transitionState = remember { MutableTransitionState(isExpanded).apply { targetState = !isExpanded } } - val transition = updateTransition(transitionState, "expandableProductCard") + val transition = rememberTransition(transitionState, "expandableProductCard") val chevronRotation by transition.animateFloat( transitionSpec = { tween(durationMillis = ANIM_DURATION_MILLIS) }, label = "chevronRotation" diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/AddressSection.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/AddressSection.kt index 329658ee43b..6c45ce2c838 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/AddressSection.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/AddressSection.kt @@ -6,7 +6,10 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.sizeIn import androidx.compose.material.Divider +import androidx.compose.material.DropdownMenu +import androidx.compose.material.DropdownMenuItem import androidx.compose.material.Icon import androidx.compose.material.IconButton import androidx.compose.material.MaterialTheme @@ -14,24 +17,33 @@ import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.MoreHoriz import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ConstraintLayout import com.woocommerce.android.R import com.woocommerce.android.model.Address import com.woocommerce.android.model.AmbiguousLocation import com.woocommerce.android.model.Location import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground +import com.woocommerce.android.ui.orders.wooshippinglabels.models.OriginShippingAddress @Composable -@Suppress("DestructuringDeclarationWithTooManyEntries") -internal fun AddressSection( - shipFrom: Address, - shipTo: Address, +@Suppress("DestructuringDeclarationWithTooManyEntries", "UnusedParameter") +internal fun AddressSectionPortrait( + shippingAddresses: WooShippingAddresses, + originAddresses: List, + onShippingFromAddressChange: (OriginShippingAddress) -> Unit, + onShippingToAddressChange: (Address) -> Unit, modifier: Modifier = Modifier ) { RoundedCornerBoxWithBorder(modifier.fillMaxWidth()) { @@ -47,6 +59,7 @@ internal fun AddressSection( ) = createRefs() val barrier = createEndBarrier(shipFromLabel, shipToLabel) + var expanded by remember { mutableStateOf(false) } Text( text = stringResource(id = R.string.orderdetail_shipping_label_item_shipfrom), @@ -63,7 +76,7 @@ internal fun AddressSection( ) Text( - text = shipFrom.toShippingFromString().uppercase(), + text = shippingAddresses.shipFrom.toShippingFromString().uppercase(), maxLines = 1, overflow = TextOverflow.Ellipsis, color = MaterialTheme.colors.primary, @@ -82,7 +95,7 @@ internal fun AddressSection( ) ) IconButton( - onClick = { }, + onClick = { expanded = true }, modifier = Modifier .constrainAs(shipFromSelect) { top.linkTo(shipFromLabel.top) @@ -98,6 +111,24 @@ internal fun AddressSection( contentDescription = null, tint = MaterialTheme.colors.primary ) + DropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false }, + modifier = Modifier.sizeIn(minWidth = 150.dp) + ) { + originAddresses.forEach { option -> + DropdownMenuItem(onClick = { + onShippingFromAddressChange(option) + expanded = false + }) { + Text( + text = option.toShippingFromString().uppercase(), + style = MaterialTheme.typography.subtitle1, + modifier = Modifier.padding(8.dp) + ) + } + } + } } Divider( modifier = Modifier.constrainAs(divider) { @@ -119,7 +150,7 @@ internal fun AddressSection( ) ) Text( - text = shipTo.toString(), + text = shippingAddresses.shipTo.toString(), modifier = Modifier .constrainAs(shipToValue) { top.linkTo(shipToLabel.top) @@ -140,11 +171,9 @@ internal fun AddressSection( .constrainAs(shipToEdit) { top.linkTo(shipToLabel.top) end.linkTo(parent.end) + bottom.linkTo(shipToLabel.bottom) } - .padding( - top = dimensionResource(R.dimen.major_100), - end = dimensionResource(R.dimen.minor_100) - ) + .padding(end = dimensionResource(R.dimen.minor_100)) ) { Icon( painter = painterResource(id = R.drawable.ic_edit_pencil), @@ -158,64 +187,43 @@ internal fun AddressSection( @Preview @Composable -private fun AddressSectionPreview() { +private fun AddressSectionPortraitPreview() { WooThemeWithBackground { Box(modifier = Modifier.padding(dimensionResource(R.dimen.major_100))) { - AddressSection( - shipFrom = getShipFrom(), - shipTo = getShipTo() + AddressSectionPortrait( + shippingAddresses = WooShippingAddresses( + shipFrom = getShipFrom(), + shipTo = getShipTo(), + originAddresses = listOf(getShipFrom()) + ), + originAddresses = listOf(getShipFrom()), + onShippingFromAddressChange = {}, + onShippingToAddressChange = {} ) } } } @Composable +@Suppress("UnusedParameter") internal fun AddressSectionLandscape( - shipFrom: Address, - shipTo: Address, + shippingAddresses: WooShippingAddresses, + onShippingFromAddressChange: (OriginShippingAddress) -> Unit, + onShippingToAddressChange: (Address) -> Unit, modifier: Modifier = Modifier ) { RoundedCornerBoxWithBorder(modifier) { - Row(modifier = Modifier.fillMaxWidth().height(IntrinsicSize.Min)) { - Row(modifier = Modifier.weight(1f)) { - Text( - text = stringResource(id = R.string.orderdetail_shipping_label_item_shipfrom), - modifier = Modifier - .padding( - start = dimensionResource(R.dimen.major_100), - top = dimensionResource(R.dimen.major_100), - end = dimensionResource(R.dimen.major_100) - ) - ) - Text( - text = shipFrom.toShippingFromString().uppercase(), - maxLines = 1, - overflow = TextOverflow.Ellipsis, - color = MaterialTheme.colors.primary, - modifier = Modifier - .padding( - top = dimensionResource(R.dimen.major_100), - end = dimensionResource(R.dimen.major_100), - start = dimensionResource(R.dimen.major_100), - bottom = dimensionResource(R.dimen.minor_100) - ) - .weight(1f) - ) - IconButton( - onClick = { }, - modifier = Modifier - .padding( - top = dimensionResource(R.dimen.minor_50), - end = dimensionResource(R.dimen.minor_100) - ) - ) { - Icon( - imageVector = Icons.Filled.MoreHoriz, - contentDescription = null, - tint = MaterialTheme.colors.primary - ) - } - } + Row( + modifier = Modifier + .fillMaxWidth() + .height(IntrinsicSize.Min) + ) { + ShipFromSelection( + shipFrom = shippingAddresses.shipFrom, + originAddresses = shippingAddresses.originAddresses, + onShippingFromAddressChange = onShippingFromAddressChange, + modifier = Modifier.weight(1f) + ) VerticalDivider() Row(modifier = Modifier.weight(1f)) { Text( @@ -227,8 +235,9 @@ internal fun AddressSectionLandscape( bottom = dimensionResource(R.dimen.major_100) ) ) + Text( - text = shipTo.toString(), + text = shippingAddresses.shipTo.toString(), modifier = Modifier .padding( top = dimensionResource(R.dimen.major_100), @@ -238,13 +247,22 @@ internal fun AddressSectionLandscape( ) .weight(1f) ) - IconButton( - onClick = { }, - modifier = Modifier + + val iconModifier = if (shippingAddresses.shipTo == Address.EMPTY) { + Modifier + .padding(end = dimensionResource(R.dimen.minor_100)) + .align(Alignment.CenterVertically) + } else { + Modifier .padding( top = dimensionResource(R.dimen.minor_100), end = dimensionResource(R.dimen.minor_100) ) + } + + IconButton( + onClick = { }, + modifier = iconModifier ) { Icon( painter = painterResource(id = R.drawable.ic_edit_pencil), @@ -257,20 +275,92 @@ internal fun AddressSectionLandscape( } } +@Composable +private fun ShipFromSelection( + shipFrom: OriginShippingAddress, + originAddresses: List, + onShippingFromAddressChange: (OriginShippingAddress) -> Unit, + modifier: Modifier = Modifier +) { + var expanded by remember { mutableStateOf(false) } + Row(modifier = modifier) { + Text( + text = stringResource(id = R.string.orderdetail_shipping_label_item_shipfrom), + modifier = Modifier + .padding( + start = dimensionResource(R.dimen.major_100), + top = dimensionResource(R.dimen.major_100), + end = dimensionResource(R.dimen.major_100) + ) + ) + Text( + text = shipFrom.toShippingFromString().uppercase(), + maxLines = 1, + overflow = TextOverflow.Ellipsis, + color = MaterialTheme.colors.primary, + modifier = Modifier + .padding( + top = dimensionResource(R.dimen.major_100), + end = dimensionResource(R.dimen.major_100), + start = dimensionResource(R.dimen.major_100), + bottom = dimensionResource(R.dimen.minor_100) + ) + .weight(1f) + ) + IconButton( + onClick = { expanded = true }, + modifier = Modifier + .padding( + top = dimensionResource(R.dimen.minor_50), + end = dimensionResource(R.dimen.minor_100) + ) + ) { + Icon( + imageVector = Icons.Filled.MoreHoriz, + contentDescription = null, + tint = MaterialTheme.colors.primary + ) + DropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false }, + modifier = Modifier.sizeIn(minWidth = 150.dp) + ) { + originAddresses.forEach { option -> + DropdownMenuItem(onClick = { + onShippingFromAddressChange(option) + expanded = false + }) { + Text( + text = option.toShippingFromString().uppercase(), + style = MaterialTheme.typography.subtitle1, + modifier = Modifier.padding(8.dp) + ) + } + } + } + } + } +} + @Preview(widthDp = 750, heightDp = 200) @Composable private fun AddressSectionLandscapePreview() { WooThemeWithBackground { Box(modifier = Modifier.padding(dimensionResource(R.dimen.major_100))) { AddressSectionLandscape( - shipFrom = getShipFrom(), - shipTo = getShipTo() + shippingAddresses = WooShippingAddresses( + shipFrom = getShipFrom(), + shipTo = getShipTo(), + originAddresses = listOf(getShipFrom()) + ), + onShippingFromAddressChange = {}, + onShippingToAddressChange = {} ) } } } -internal fun getShipFrom() = Address( +internal fun getShipFrom() = OriginShippingAddress( firstName = "first name", lastName = "last name", company = "Company", @@ -280,8 +370,11 @@ internal fun getShipFrom() = Address( city = "City", postcode = "", email = "email", - country = Location("US", "USA"), - state = AmbiguousLocation.Defined(Location("CA", "California", "USA")) + country = "USA", + state = "California", + id = "id_1", + isDefault = true, + isVerified = true ) internal fun getShipTo() = Address( diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/ObserveOriginAddresses.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/ObserveOriginAddresses.kt new file mode 100644 index 00000000000..1a86d2d2bfe --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/ObserveOriginAddresses.kt @@ -0,0 +1,65 @@ +package com.woocommerce.android.ui.orders.wooshippinglabels + +import com.woocommerce.android.ui.orders.wooshippinglabels.models.OriginShippingAddress +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf +import javax.inject.Inject + +class ObserveOriginAddresses @Inject constructor() { + @Suppress("MagicNumber") + suspend operator fun invoke(): Flow> { + delay(200) + val addresses = listOf( + OriginShippingAddress( + firstName = "first name", + lastName = "last name", + company = "Company", + phone = "", + address1 = "A huge address that should be truncated", + address2 = "", + city = "San Francisco", + postcode = "", + email = "email", + country = "USA", + state = "California", + id = "id_1", + isDefault = false, + isVerified = true + ), + OriginShippingAddress( + firstName = "first name", + lastName = "last name", + company = "Company", + phone = "", + address1 = "Another huge address that should be truncated", + address2 = "", + city = "Oakland", + postcode = "", + email = "email", + country = "USA", + state = "California", + id = "id_1", + isDefault = false, + isVerified = true + ), + OriginShippingAddress( + firstName = "first name", + lastName = "last name", + company = "Company", + phone = "", + address1 = "Small address", + address2 = "", + city = "Palo Alto", + postcode = "", + email = "email", + country = "USA", + state = "California", + id = "id_1", + isDefault = true, + isVerified = true + ) + ) + return flowOf(addresses) + } +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/ShipmentDetails.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/ShipmentDetails.kt index 44d7c1bc88a..8608d77e205 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/ShipmentDetails.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/ShipmentDetails.kt @@ -42,9 +42,11 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.woocommerce.android.R +import com.woocommerce.android.extensions.appendWithIfNotEmpty import com.woocommerce.android.model.Address import com.woocommerce.android.ui.compose.animations.SkeletonView import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground +import com.woocommerce.android.ui.orders.wooshippinglabels.models.OriginShippingAddress import com.woocommerce.android.util.StringUtils import kotlinx.coroutines.launch @@ -54,9 +56,12 @@ fun ShipmentDetails( scaffoldState: BottomSheetScaffoldState, shippableItems: ShippableItemsUI, shippingLines: List, + shippingAddresses: WooShippingAddresses, markOrderComplete: Boolean, onMarkOrderCompleteChange: (Boolean) -> Unit, modifier: Modifier = Modifier, + onShippingFromAddressChange: (OriginShippingAddress) -> Unit = {}, + onShippingToAddressChange: (Address) -> Unit = {}, handlerModifier: Modifier = Modifier, ) { val scope = rememberCoroutineScope() @@ -103,6 +108,9 @@ fun ShipmentDetails( ShipmentDetailsLandscape( shippableItems = shippableItems, shippingLines = shippingLines, + shippingAddresses = shippingAddresses, + onShippingFromAddressChange = onShippingFromAddressChange, + onShippingToAddressChange = onShippingToAddressChange, modifier = modifier ) } else { @@ -111,6 +119,9 @@ fun ShipmentDetails( shippingLines = shippingLines, markOrderComplete = markOrderComplete, onMarkOrderCompleteChange = onMarkOrderCompleteChange, + shippingAddresses = shippingAddresses, + onShippingFromAddressChange = onShippingFromAddressChange, + onShippingToAddressChange = onShippingToAddressChange, modifier = modifier ) } @@ -120,6 +131,9 @@ fun ShipmentDetails( private fun ShipmentDetailsPortrait( shippableItems: ShippableItemsUI, shippingLines: List, + shippingAddresses: WooShippingAddresses, + onShippingFromAddressChange: (OriginShippingAddress) -> Unit = {}, + onShippingToAddressChange: (Address) -> Unit = {}, markOrderComplete: Boolean, onMarkOrderCompleteChange: (Boolean) -> Unit, modifier: Modifier = Modifier, @@ -134,8 +148,9 @@ private fun ShipmentDetailsPortrait( ) { OrderDetailsSection( - shipFrom = getShipFrom(), - shipTo = getShipTo(), + shippingAddresses = shippingAddresses, + onShippingFromAddressChange = onShippingFromAddressChange, + onShippingToAddressChange = onShippingToAddressChange, totalItems = shippableItems.shippableItems.size, totalItemsCost = shippableItems.formattedTotalPrice, shippingLines = shippingLines @@ -159,6 +174,9 @@ private fun ShipmentDetailsPortrait( private fun ShipmentDetailsLandscape( shippableItems: ShippableItemsUI, shippingLines: List, + shippingAddresses: WooShippingAddresses, + onShippingFromAddressChange: (OriginShippingAddress) -> Unit = {}, + onShippingToAddressChange: (Address) -> Unit = {}, modifier: Modifier = Modifier, ) { Column(modifier) { @@ -171,8 +189,9 @@ private fun ShipmentDetailsLandscape( ) { AddressSectionLandscape( - shipFrom = getShipFrom(), - shipTo = getShipTo(), + shippingAddresses = shippingAddresses, + onShippingFromAddressChange = onShippingFromAddressChange, + onShippingToAddressChange = onShippingToAddressChange, modifier = Modifier.padding(horizontal = dimensionResource(R.dimen.major_100)) ) Row( @@ -222,8 +241,9 @@ private fun ShipmentDetailsSectionTitlePreview() { @Composable private fun OrderDetailsSection( - shipFrom: Address, - shipTo: Address, + shippingAddresses: WooShippingAddresses, + onShippingFromAddressChange: (OriginShippingAddress) -> Unit, + onShippingToAddressChange: (Address) -> Unit, totalItems: Int, totalItemsCost: String, shippingLines: List, @@ -235,9 +255,11 @@ private fun OrderDetailsSection( modifier = Modifier.padding(start = dimensionResource(R.dimen.major_100)) ) Spacer(modifier = Modifier.height(dimensionResource(R.dimen.major_100))) - AddressSection( - shipFrom = shipFrom, - shipTo = shipTo, + AddressSectionPortrait( + shippingAddresses = shippingAddresses, + originAddresses = shippingAddresses.originAddresses, + onShippingFromAddressChange = onShippingFromAddressChange, + onShippingToAddressChange = onShippingToAddressChange, modifier = Modifier.padding(horizontal = dimensionResource(R.dimen.major_100)) ) TotalCard( @@ -284,7 +306,12 @@ fun ShipmentDetailsLandscapePreview() { formattedTotalWeight = "8.5kg", formattedTotalPrice = "$92.78" ), - shippingLines = getShippingLines() + shippingLines = getShippingLines(), + shippingAddresses = WooShippingAddresses( + shipFrom = getShipFrom(), + shipTo = getShipTo(), + originAddresses = listOf(getShipFrom()) + ) ) } } @@ -471,7 +498,13 @@ fun getShippingLines(number: Int = 3) = List(number) { i -> ) } -fun Address.toShippingFromString() = this.getEnvelopeAddress().replace("\n", " ") +fun OriginShippingAddress.toShippingFromString() = StringBuilder() + .appendWithIfNotEmpty(this.address1) + .appendWithIfNotEmpty(this.address2) + .appendWithIfNotEmpty(this.city) + .appendWithIfNotEmpty(this.state) + .appendWithIfNotEmpty(this.postcode) + .toString() data class ShippingLineSummaryUI( val title: String, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/WooShippingLabelCreationScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/WooShippingLabelCreationScreen.kt index f87c6065b98..37610eabe8b 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/WooShippingLabelCreationScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/WooShippingLabelCreationScreen.kt @@ -43,9 +43,11 @@ import androidx.compose.ui.tooling.preview.Devices import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.woocommerce.android.R +import com.woocommerce.android.model.Address import com.woocommerce.android.ui.compose.component.WCColoredButton import com.woocommerce.android.ui.compose.modifiers.dashedBorder import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground +import com.woocommerce.android.ui.orders.wooshippinglabels.models.OriginShippingAddress @Composable fun WooShippingLabelCreationScreen(viewModel: WooShippingLabelCreationViewModel) { @@ -61,9 +63,16 @@ fun WooShippingLabelCreationScreen(viewModel: WooShippingLabelCreationViewModel) onSelectPackageClick = viewModel::onSelectPackageClicked, onPurchaseShippingLabel = viewModel::onPurchaseShippingLabel, shippableItems = viewState.shippableItems, - shippingLines = viewState.shippingLines + shippingLines = viewState.shippingLines, + shippingAddresses = viewState.shippingAddresses, + onShippingFromAddressChange = viewModel::onShippingFromAddressChange, + onShippingToAddressChange = viewModel::onShippingToAddressChange ) } + + WooShippingLabelCreationViewModel.WooShippingViewState.Error -> { + TODO() + } } } @@ -72,9 +81,12 @@ fun WooShippingLabelCreationScreen(viewModel: WooShippingLabelCreationViewModel) fun WooShippingLabelCreationScreen( shippableItems: ShippableItemsUI, shippingLines: List, - modifier: Modifier = Modifier, + shippingAddresses: WooShippingAddresses, + onShippingFromAddressChange: (OriginShippingAddress) -> Unit, + onShippingToAddressChange: (Address) -> Unit, onSelectPackageClick: () -> Unit, - onPurchaseShippingLabel: () -> Unit + onPurchaseShippingLabel: () -> Unit, + modifier: Modifier = Modifier ) { val scaffoldState = rememberBottomSheetScaffoldState() Box(modifier = Modifier.fillMaxSize()) { @@ -83,7 +95,10 @@ fun WooShippingLabelCreationScreen( modifier = modifier, onSelectPackageClick = onSelectPackageClick, scaffoldState = scaffoldState, - shippingLines = shippingLines + shippingLines = shippingLines, + shippingAddresses = shippingAddresses, + onShippingFromAddressChange = onShippingFromAddressChange, + onShippingToAddressChange = onShippingToAddressChange ) val isDarkTheme = isSystemInDarkTheme() val isCollapsed = scaffoldState.bottomSheetState.isCollapsed @@ -119,9 +134,12 @@ fun WooShippingLabelCreationScreen( private fun LabelCreationScreenWithBottomSheet( shippableItems: ShippableItemsUI, shippingLines: List, - modifier: Modifier = Modifier, onSelectPackageClick: () -> Unit, - scaffoldState: BottomSheetScaffoldState + shippingAddresses: WooShippingAddresses, + onShippingFromAddressChange: (OriginShippingAddress) -> Unit, + onShippingToAddressChange: (Address) -> Unit, + scaffoldState: BottomSheetScaffoldState, + modifier: Modifier = Modifier ) { BottomSheetScaffold( sheetContent = { @@ -132,6 +150,9 @@ private fun LabelCreationScreenWithBottomSheet( scaffoldState = scaffoldState, markOrderComplete = markOrderComplete.value, onMarkOrderCompleteChange = { markOrderComplete.value = it }, + shippingAddresses = shippingAddresses, + onShippingFromAddressChange = onShippingFromAddressChange, + onShippingToAddressChange = onShippingToAddressChange, modifier = Modifier.padding(bottom = 74.dp), ) }, @@ -213,7 +234,14 @@ private fun WooShippingLabelCreationScreenPreview() { shippingLines = getShippingLines(), modifier = Modifier.fillMaxSize(), onSelectPackageClick = {}, - onPurchaseShippingLabel = {} + onPurchaseShippingLabel = {}, + shippingAddresses = WooShippingAddresses( + shipFrom = getShipFrom(), + shipTo = getShipTo(), + originAddresses = listOf(getShipFrom()) + ), + onShippingFromAddressChange = {}, + onShippingToAddressChange = {} ) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/WooShippingLabelCreationViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/WooShippingLabelCreationViewModel.kt index aaa6614c2dd..d7f8eccce6c 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/WooShippingLabelCreationViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/WooShippingLabelCreationViewModel.kt @@ -3,8 +3,10 @@ package com.woocommerce.android.ui.orders.wooshippinglabels import androidx.lifecycle.SavedStateHandle import com.woocommerce.android.extensions.formatToString import com.woocommerce.android.extensions.sumByFloat +import com.woocommerce.android.model.Address import com.woocommerce.android.model.Order import com.woocommerce.android.ui.orders.details.OrderDetailRepository +import com.woocommerce.android.ui.orders.wooshippinglabels.models.OriginShippingAddress import com.woocommerce.android.ui.orders.wooshippinglabels.models.ShippableItemModel import com.woocommerce.android.ui.orders.wooshippinglabels.models.StoreOptionsModel import com.woocommerce.android.util.CurrencyFormatter @@ -13,6 +15,8 @@ import com.woocommerce.android.viewmodel.ScopedViewModel import com.woocommerce.android.viewmodel.navArgs import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.launch import javax.inject.Inject @@ -21,7 +25,8 @@ class WooShippingLabelCreationViewModel @Inject constructor( savedState: SavedStateHandle, private val orderDetailRepository: OrderDetailRepository, private val getShippableItems: GetShippableItems, - private val currencyFormatter: CurrencyFormatter + private val currencyFormatter: CurrencyFormatter, + private val observeOriginAddresses: ObserveOriginAddresses ) : ScopedViewModel(savedState) { private val navArgs: WooShippingLabelCreationFragmentArgs by savedState.navArgs() private val storeOptions = StoreOptionsModel( @@ -35,8 +40,16 @@ class WooShippingLabelCreationViewModel @Inject constructor( val viewState: MutableStateFlow = MutableStateFlow(WooShippingViewState.Loading) init { - launch { - orderDetailRepository.getOrderById(navArgs.orderId)?.let { order -> + launch { observeShippingLabelInformation() } + } + + private suspend fun observeShippingLabelInformation() { + flowOf(orderDetailRepository.getOrderById(navArgs.orderId)) + .combine(observeOriginAddresses()) { order, originAddresses -> + val selectedOriginAddress = getSelectedOriginAddress(originAddresses) + if (order == null || selectedOriginAddress == null) { + return@combine WooShippingViewState.Error + } val items = getShippableItems(order) shippableItems.value = items @@ -46,15 +59,47 @@ class WooShippingLabelCreationViewModel @Inject constructor( val shippingLineSummary = getShippingLinesSummary(order) - viewState.value = WooShippingViewState.DataState( + return@combine WooShippingViewState.DataState( shippableItems = ShippableItemsUI( shippableItems = shippableItemsUI, formattedTotalWeight = formattedTotalWeight, formattedTotalPrice = formattedTotalPrice ), - shippingLines = shippingLineSummary + shippingLines = shippingLineSummary, + shippingAddresses = WooShippingAddresses( + shipFrom = selectedOriginAddress, + originAddresses = originAddresses, + shipTo = order.shippingAddress + ) ) + }.collect { + viewState.value = it } + } + + private fun getSelectedOriginAddress(originAddresses: List): OriginShippingAddress? { + return (viewState as? WooShippingViewState.DataState)?.let { + it.shippingAddresses.shipFrom + } ?: originAddresses.firstOrNull { it.isDefault } ?: originAddresses.firstOrNull() + } + + fun onShippingFromAddressChange(address: OriginShippingAddress) { + (viewState.value as? WooShippingViewState.DataState)?.let { currentData -> + viewState.value = currentData.copy( + shippingAddresses = currentData.shippingAddresses.copy( + shipFrom = address + ) + ) + } + } + + fun onShippingToAddressChange(address: Address) { + (viewState.value as? WooShippingViewState.DataState)?.let { currentData -> + viewState.value = currentData.copy( + shippingAddresses = currentData.shippingAddresses.copy( + shipTo = address + ) + ) } } @@ -92,10 +137,18 @@ class WooShippingLabelCreationViewModel @Inject constructor( data object LabelPurchased : Event() sealed class WooShippingViewState { + data object Error : WooShippingViewState() data object Loading : WooShippingViewState() data class DataState( val shippableItems: ShippableItemsUI, - val shippingLines: List + val shippingLines: List, + val shippingAddresses: WooShippingAddresses, ) : WooShippingViewState() } } + +data class WooShippingAddresses( + val shipFrom: OriginShippingAddress, + val shipTo: Address, + val originAddresses: List +) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/models/OriginShippingAddress.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/models/OriginShippingAddress.kt new file mode 100644 index 00000000000..e8603563248 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/models/OriginShippingAddress.kt @@ -0,0 +1,18 @@ +package com.woocommerce.android.ui.orders.wooshippinglabels.models + +data class OriginShippingAddress( + val id: String, + val company: String?, + val firstName: String?, + val lastName: String?, + val email: String?, + val address1: String?, + val address2: String?, + val city: String?, + val state: String?, + val postcode: String, + val country: String, + val phone: String?, + val isDefault: Boolean, + val isVerified: Boolean +) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationScreen.kt index be2d715990a..82808a44459 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationScreen.kt @@ -109,17 +109,22 @@ fun WooShippingLabelsPackageCreationScreenPreview() { ), createCustomPackageScreen = { WooShippingCustomPackageCreationScreen( + packageName = "Custom Package Name", packageType = "Envelope", packageLength = "10", packageWidth = "10", packageHeight = "10", + packageWeight = "10", isAddPackageEnabled = true, + isSaveAsTemplateChecked = true, onAddPackageClick = {}, onPackageTypeClick = {}, onLengthChange = {}, onWidthChange = {}, onHeightChange = {}, - onSavePackageChanged = { } + onWeightChange = {}, + onPackageNameChange = {}, + onSavePackageChanged = {} ) }, createSavedPackageScreen = { @@ -127,19 +132,22 @@ fun WooShippingLabelsPackageCreationScreenPreview() { savedPackages = listOf( PackageData( name = "Small Flat Rate Box", - dimensions = "10 x 10 x 10 cm", + dimensions = "10 x 10 x 10", + weight = "10", isSelected = true, isLetter = true ), PackageData( name = "Small Flat Rate Box", - dimensions = "20 x 20 x 20 cm", + dimensions = "20 x 20 x 20", + weight = "10", isSelected = false, isLetter = false ), PackageData( name = "Small Flat Rate Box", - dimensions = "30 x 30 x 30 cm", + dimensions = "30 x 30 x 30", + weight = "10", isSelected = false, isLetter = false ) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModel.kt index 46df8e85ff4..1ec4b77b0b3 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/WooShippingLabelPackageCreationViewModel.kt @@ -5,7 +5,10 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope import com.woocommerce.android.R +import com.woocommerce.android.tools.SelectedSite import com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource.FetchPredefinedPackagesFromStore +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource.WooShippingLabelPackageRepository +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking.CustomPackageCreationRequestData import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.Carrier import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.CarrierPackageGroup import com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui.CarrierPackageSelection @@ -20,13 +23,16 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.parcelize.Parcelize +import org.wordpress.android.fluxc.model.SiteModel import javax.inject.Inject @HiltViewModel class WooShippingLabelPackageCreationViewModel @Inject constructor( savedState: SavedStateHandle, + private val selectedSite: SelectedSite, private val resourceProvider: ResourceProvider, - private val fetchPredefinedPackages: FetchPredefinedPackagesFromStore + private val fetchPredefinedPackages: FetchPredefinedPackagesFromStore, + private val packageRepository: WooShippingLabelPackageRepository ) : ScopedViewModel(savedState) { private val _viewState = savedState.getStateFlow( @@ -97,9 +103,13 @@ class WooShippingLabelPackageCreationViewModel @Inject constructor( ?.let { triggerEvent(PackageSelected(it)) } } - fun onAddCustomPackageClick() { - _viewState.value.customPackageCreationData - .toPackageData() + fun onAddCustomPackageClick(savePackageAsTemplate: Boolean) { + val customPackage = _viewState.value.customPackageCreationData + selectedSite.getOrNull() + ?.takeIf { savePackageAsTemplate } + ?.let { customPackage.submitToStore(it) } + + customPackage.toPackageData() .let { triggerEvent(PackageSelected(it)) } } @@ -135,6 +145,20 @@ class WooShippingLabelPackageCreationViewModel @Inject constructor( } } + fun onPackageNameChange(name: String) { + _viewState.update { + val newPackageData = it.customPackageCreationData.copy(name = name) + it.copy(customPackageCreationData = newPackageData) + } + } + + fun onWeightChange(weight: String) { + _viewState.update { + val newPackageData = it.customPackageCreationData.copy(weight = weight) + it.copy(customPackageCreationData = newPackageData) + } + } + fun onSavePackageChanged(checked: Boolean) { _viewState.update { val newPackageData = it.customPackageCreationData.copy(saveAsTemplate = checked) @@ -163,6 +187,24 @@ class WooShippingLabelPackageCreationViewModel @Inject constructor( ?.let { set(it, updatedPackage) } } + private fun CustomPackageCreationData.submitToStore(site: SiteModel) { + launch { + packageRepository.createCustomPackage( + site = site, + requestData = this@submitToStore.let { + CustomPackageCreationRequestData( + name = it.name, + isLetter = it.type == PackageType.ENVELOPE, + innerDimensions = it.dimensions, + boxWeight = it.weight?.toDoubleOrNull() ?: 0.0, + isUserDefined = true, + maxWeight = 0.0 + ) + }.let { listOf(it) } + ) + } + } + @Parcelize data class ViewState( val pageTabs: List = emptyList(), diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/components/WooShippingPackageListItem.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/components/WooShippingPackageListItem.kt index a14de381e29..c6ff4c75a4a 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/components/WooShippingPackageListItem.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/components/WooShippingPackageListItem.kt @@ -49,7 +49,10 @@ fun WooSavedPackageListItem( style = MaterialTheme.typography.body1 ) Text( - text = packageData.dimensions, + text = packageData.weight + .takeIf { it.isNotEmpty() } + ?.let { "${packageData.dimensionForDisplay} • ${packageData.weightForDisplay}" } + ?: packageData.dimensionForDisplay, style = MaterialTheme.typography.body2 ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchPredefinedPackagesFromStore.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchPredefinedPackagesFromStore.kt index 42155986aec..d61b44ef4cd 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchPredefinedPackagesFromStore.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/FetchPredefinedPackagesFromStore.kt @@ -35,8 +35,11 @@ class FetchPredefinedPackagesFromStore @Inject constructor( PackageData( name = packageDAO.name, dimensions = packageDAO.dimensions, + weight = packageDAO.weight, isSelected = false, - isLetter = packageDAO.isLetter + isLetter = packageDAO.isLetter, + dimensionUnit = packageDAO.dimensionUnit, + weightUnit = packageDAO.weightUnit ) } @@ -60,8 +63,11 @@ class FetchPredefinedPackagesFromStore @Inject constructor( PackageData( name = packageItem.name, dimensions = packageItem.dimensions, + weight = packageItem.weight, isSelected = false, - isLetter = packageItem.isLetter + isLetter = packageItem.isLetter, + dimensionUnit = packageItem.dimensionUnit, + weightUnit = packageItem.weightUnit ) } ) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/PackageDAOs.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/PackageDAOs.kt index 1e37f06efd5..828d0753b82 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/PackageDAOs.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/PackageDAOs.kt @@ -9,7 +9,10 @@ data class PackageDAO( val id: String, val name: String, val dimensions: String, - val isLetter: Boolean + val weight: String, + val isLetter: Boolean, + val dimensionUnit: String, + val weightUnit: String ) data class CarrierDAO( diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageMapper.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageMapper.kt index 3ea362d7fea..a491240f716 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageMapper.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageMapper.kt @@ -4,46 +4,71 @@ import com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource.C import com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource.CarrierType.USPS import com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking.CarrierPackageGroupDTO import com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking.CarrierPredefinedPackagesDTO +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking.CustomPackageCreationResponse +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking.CustomPackageDTO import com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking.PackageResponse -import com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking.PredefinedPackageDTO +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking.PackageStoreOptionsDTO import javax.inject.Inject class WooShippingLabelPackageMapper @Inject constructor() { operator fun invoke(response: PackageResponse): StorePackagesDAO { - val savedPackagesResponse = response.packages?.saved?.predefined ?: emptyList() + val savedPackagesResponse = response.packages?.saved?.custom ?: emptyList() return StorePackagesDAO( - savedPackages = mapSavedPackages(savedPackagesResponse), - carrierPackages = mapCarrierPackages(response.packages?.predefined) + savedPackages = mapSavedPackages(savedPackagesResponse, response.storeOptions), + carrierPackages = mapCarrierPackages(response.packages?.predefined, response.storeOptions) ) } - private fun mapSavedPackages(savedResponse: List): List { + operator fun invoke( + response: CustomPackageCreationResponse + ): List { + return response.custom?.map { + PackageDAO( + id = it.id.orEmpty(), + name = it.name.orEmpty(), + dimensions = it.dimensions.orEmpty(), + weight = it.boxWeight?.toString().orEmpty(), + isLetter = it.isLetter ?: false, + dimensionUnit = "", + weightUnit = "" + ) + } ?: emptyList() + } + + private fun mapSavedPackages( + savedResponse: List, + storeOptions: PackageStoreOptionsDTO? + ): List { return savedResponse.map { PackageDAO( id = it.id.orEmpty(), name = it.name.orEmpty(), dimensions = it.dimensions.orEmpty(), - isLetter = it.isLetter ?: false + weight = it.boxWeight?.toString().orEmpty(), + isLetter = it.isLetter ?: false, + dimensionUnit = storeOptions?.dimensionUnit.orEmpty(), + weightUnit = storeOptions?.weightUnit.orEmpty() ) } } private fun mapCarrierPackages( - carrierPackagesResponse: CarrierPredefinedPackagesDTO? + carrierPackagesResponse: CarrierPredefinedPackagesDTO?, + storeOptions: PackageStoreOptionsDTO? ): Map { val uspsPackages = mutableListOf().apply { carrierPackagesResponse?.usps?.let { usps -> - usps.flatBoxes?.toCarrierGroup()?.let { add(it) } - usps.boxes?.toCarrierGroup()?.let { add(it) } - usps.expressBoxes?.toCarrierGroup()?.let { add(it) } - usps.envelopes?.toCarrierGroup()?.let { add(it) } + usps.flatBoxes?.toCarrierGroup(storeOptions)?.let { add(it) } + usps.boxes?.toCarrierGroup(storeOptions)?.let { add(it) } + usps.expressBoxes?.toCarrierGroup(storeOptions)?.let { add(it) } + usps.envelopes?.toCarrierGroup(storeOptions)?.let { add(it) } } }.let { CarrierDAO(it) } val dhlPackages = mutableListOf().apply { carrierPackagesResponse?.dhlExpress?.let { dhl -> - dhl.domesticAndInternationalPackages?.toCarrierGroup()?.let { add(it) } + dhl.domesticAndInternationalPackages?.toCarrierGroup(storeOptions)?.let { add(it) } } }.let { CarrierDAO(it) } @@ -53,14 +78,19 @@ class WooShippingLabelPackageMapper @Inject constructor() { ) } - private fun CarrierPackageGroupDTO.toCarrierGroup() = CarrierPackageGroupDAO( + private fun CarrierPackageGroupDTO.toCarrierGroup( + storeOptions: PackageStoreOptionsDTO? + ) = CarrierPackageGroupDAO( description = title.orEmpty(), packages = definitions?.map { PackageDAO( id = it.id.orEmpty(), name = it.name.orEmpty(), - dimensions = it.dimensions.orEmpty(), - isLetter = it.isLetter ?: false + dimensions = it.outerDimensions.orEmpty(), + weight = it.boxWeight?.toString().orEmpty(), + isLetter = it.isLetter ?: false, + dimensionUnit = storeOptions?.dimensionUnit.orEmpty(), + weightUnit = storeOptions?.weightUnit.orEmpty() ) } ?: emptyList() ) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageRepository.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageRepository.kt index ad844dfafa8..ce35afe3ebf 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageRepository.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/datasource/WooShippingLabelPackageRepository.kt @@ -1,6 +1,7 @@ package com.woocommerce.android.ui.orders.wooshippinglabels.packages.datasource import com.woocommerce.android.tools.SelectedSite +import com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking.CustomPackageCreationRequestData import com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking.WooShippingLabelPackageRestClient import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.fluxc.network.rest.wpcom.wc.WooResult @@ -21,4 +22,14 @@ class WooShippingLabelPackageRepository @Inject constructor( ?.let { WooResult(it) } ?: WooResult(error) } + + suspend fun createCustomPackage( + site: SiteModel = selectedSite.get(), + requestData: List + ) = with(packageRestClient.postNewCustomPackage(site, requestData)) { + result.takeIf { isError.not() } + ?.let { packageMapper(it) } + ?.let { WooResult(it) } + ?: WooResult(error) + } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/networking/CarrierPackageDTOs.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/networking/CarrierPackageDTOs.kt index 4b4af8a5ebb..dcbe14bf809 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/networking/CarrierPackageDTOs.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/networking/CarrierPackageDTOs.kt @@ -1,19 +1,33 @@ package com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking +import com.google.gson.annotations.SerializedName + class CarrierPredefinedPackagesDTO { val usps: USPSPackageDTO? = null + + @SerializedName("dhlexpress") val dhlExpress: DHLPackageDTO? = null } class USPSPackageDTO { + @SerializedName("pri_flat_boxes") val flatBoxes: CarrierPackageGroupDTO? = null + + @SerializedName("pri_boxes") val boxes: CarrierPackageGroupDTO? = null + + @SerializedName("pri_express_boxes") val expressBoxes: CarrierPackageGroupDTO? = null + + @SerializedName("pri_envelopes") val envelopes: CarrierPackageGroupDTO? = null + + @SerializedName("pri_express_envelopes") val expressEnvelopes: CarrierPackageGroupDTO? = null } class DHLPackageDTO { + @SerializedName("domestic_and_international") val domesticAndInternationalPackages: CarrierPackageGroupDTO? = null } @@ -23,15 +37,30 @@ class CarrierPackageGroupDTO { } class PredefinedPackageDTO { + val id: String? = null + val name: String? = null + + @SerializedName("inner_dimensions") val innerDimensions: String? = null + + @SerializedName("outer_dimensions") val outerDimensions: String? = null + + @SerializedName("box_weight") val boxWeight: Double? = null + + @SerializedName("is_flat_rate") val isFlatRate: Boolean? = null - val id: String? = null - val name: String? = null - val dimensions: String? = null + + @SerializedName("max_weight") val maxWeight: Double? = null + + @SerializedName("is_letter") val isLetter: Boolean? = null + + @SerializedName("group_id") val groupId: String? = null + + @SerializedName("can_ship_international") val canShipInternational: Boolean? = null } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/networking/PackageResponseDTOs.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/networking/PackageResponseDTOs.kt index 8c8aad9853b..9e59b8235ca 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/networking/PackageResponseDTOs.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/networking/PackageResponseDTOs.kt @@ -1,14 +1,36 @@ package com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking +import com.google.gson.annotations.SerializedName + +class CustomPackageCreationResponse { + val custom: List? = null +} + +data class CustomPackageCreationRequestData( + val name: String? = null, + @SerializedName("is_letter") val isLetter: Boolean? = null, + @SerializedName("inner_dimensions") val innerDimensions: String? = null, + @SerializedName("box_weight") val boxWeight: Double? = null, + @SerializedName("is_user_defined") val isUserDefined: Boolean? = null, + @SerializedName("max_weight") val maxWeight: Double? = null +) + class PackageResponse { val storeOptions: PackageStoreOptionsDTO? = null val packages: PackagesInfoDTO? = null } class PackageStoreOptionsDTO { + @SerializedName("currency_symbol") val currencySymbol: String? = null + + @SerializedName("dimension_unit") val dimensionUnit: String? = null + + @SerializedName("weight_unit") val weightUnit: String? = null + + @SerializedName("origin_country") val originCountry: String? = null } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/networking/StorePackageDTOs.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/networking/StorePackageDTOs.kt index 9b868b3db22..a9b4260c925 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/networking/StorePackageDTOs.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/networking/StorePackageDTOs.kt @@ -1,8 +1,9 @@ package com.woocommerce.android.ui.orders.wooshippinglabels.packages.networking +import com.google.gson.annotations.SerializedName + class SavedPackageInfoDTO { val custom: List? = null - val predefined: List? = null } class CustomPackageDTO { @@ -12,8 +13,14 @@ class CustomPackageDTO { val length: Double? = null val width: Double? = null val height: Double? = null + val type: String? = null + + @SerializedName("box_weight") val boxWeight: Double? = null + + @SerializedName("is_letter") val isLetter: Boolean? = null + + @SerializedName("is_user_defined") val isUserDefined: Boolean? = null - val type: String? = null } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/networking/WooShippingLabelPackageRestClient.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/networking/WooShippingLabelPackageRestClient.kt index 53affd96616..502f00fb490 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/networking/WooShippingLabelPackageRestClient.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/networking/WooShippingLabelPackageRestClient.kt @@ -12,12 +12,26 @@ class WooShippingLabelPackageRestClient @Inject constructor( suspend fun fetchShippingLabelPackages( site: SiteModel ): WooPayload { - val url = "/wcshipping/v1/packages" - return wooNetwork.executeGetGsonRequest( site = site, - path = url, + path = URL, clazz = PackageResponse::class.java, ).toWooPayload() } + + suspend fun postNewCustomPackage( + site: SiteModel, + requestData: List + ): WooPayload { + return wooNetwork.executePostGsonRequest( + site = site, + path = URL, + body = mapOf("custom" to requestData), + clazz = CustomPackageCreationResponse::class.java, + ).toWooPayload() + } + + companion object { + private const val URL = "/wcshipping/v1/packages" + } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/UIModels.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/UIModels.kt index 9971cbe781a..2e41ba3c487 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/UIModels.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/UIModels.kt @@ -2,6 +2,7 @@ package com.woocommerce.android.ui.orders.wooshippinglabels.packages.ui import android.os.Parcelable import com.woocommerce.android.R +import com.woocommerce.android.extensions.isNotNullOrEmpty import com.woocommerce.android.ui.orders.wooshippinglabels.packages.WooShippingLabelPackageCreationViewModel.PackageType import kotlinx.parcelize.Parcelize @@ -9,28 +10,24 @@ import kotlinx.parcelize.Parcelize data class PackageData( val name: String, val dimensions: String, + val weight: String, val isSelected: Boolean, - val isLetter: Boolean + val isLetter: Boolean, + val dimensionUnit: String = "cm", + val weightUnit: String = "kg" ) : Parcelable { val descriptionResId: Int get() = when (isLetter) { true -> R.string.woo_shipping_labels_package_creation_envelope_type false -> R.string.woo_shipping_labels_package_creation_box_type } -} -@Parcelize -data class PredefinedPackage( - val boxWeight: Double, - val isFlatRate: Boolean, - val id: String, - val name: String, - val dimensions: String, - val maxWeight: Double, - val isLetter: Boolean, - val groupId: String, - val canShipInternational: Boolean -) : Parcelable + val dimensionForDisplay + get() = "$dimensions $dimensionUnit" + + val weightForDisplay + get() = "$weight $weightUnit" +} @Parcelize data class CustomPackageCreationData( @@ -38,14 +35,27 @@ data class CustomPackageCreationData( val length: String, val width: String, val height: String, - val saveAsTemplate: Boolean + val saveAsTemplate: Boolean, + val weight: String? = null, + val name: String? = null ) : Parcelable { val isValid: Boolean - get() = height.isNotEmpty() && length.isNotEmpty() && width.isNotEmpty() + get() = height.isNotEmpty() && length.isNotEmpty() && width.isNotEmpty() && isTemplateConfigured + + val dimensions: String + get() = "$length x $width x $height" + + private val isTemplateConfigured: Boolean + get() { + if (saveAsTemplate.not()) return true + + return name.isNotNullOrEmpty() && weight.isNotNullOrEmpty() + } fun toPackageData(dimensionUnit: String = "cm") = PackageData( name = "", dimensions = "$length x $width x $height $dimensionUnit", + weight = weight.orEmpty(), isSelected = true, isLetter = type == PackageType.ENVELOPE ) @@ -56,6 +66,7 @@ data class CustomPackageCreationData( length = "", width = "", height = "", + weight = "", saveAsTemplate = false ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingCarrierPackageScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingCarrierPackageScreen.kt index e105d5f4c78..8aa8d6ae64f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingCarrierPackageScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingCarrierPackageScreen.kt @@ -231,13 +231,15 @@ fun WooShippingCarrierPackageScreenPreview() { packages = listOf( PackageData( name = "Package 1 - Carrier 1", - dimensions = "10 x 10 x 10 cm", + dimensions = "10 x 10 x 10", + weight = "10", isSelected = false, isLetter = false ), PackageData( name = "Package 2 - Carrier 1", - dimensions = "20 x 20 x 20 cm", + dimensions = "20 x 20 x 20", + weight = "20", isSelected = false, isLetter = false ) @@ -248,13 +250,15 @@ fun WooShippingCarrierPackageScreenPreview() { packages = listOf( PackageData( name = "Package 3 - Carrier 1", - dimensions = "30 x 30 x 30 cm", + dimensions = "30 x 30 x 30", + weight = "30", isSelected = false, isLetter = false ), PackageData( name = "Package 4 - Carrier 1", - dimensions = "40 x 40 x 40 cm", + dimensions = "40 x 40 x 40", + weight = "40", isSelected = false, isLetter = false ) @@ -267,13 +271,15 @@ fun WooShippingCarrierPackageScreenPreview() { packages = listOf( PackageData( name = "Package 1 - Carrier 2", - dimensions = "10 x 10 x 10 cm", + dimensions = "10 x 10 x 10", + weight = "10", isSelected = false, isLetter = false ), PackageData( name = "Package 2 Carrier - 2", - dimensions = "20 x 20 x 20 cm", + dimensions = "20 x 20 x 20", + weight = "20", isSelected = false, isLetter = false ) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingCustomPackageScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingCustomPackageScreen.kt index 92b66513eb1..d2e91b9298d 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingCustomPackageScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingCustomPackageScreen.kt @@ -11,6 +11,8 @@ import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll import androidx.compose.material.Button import androidx.compose.material.Checkbox +import androidx.compose.material.CheckboxDefaults +import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -19,6 +21,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.woocommerce.android.R @@ -35,15 +38,20 @@ fun WooShippingCustomPackageCreationScreen(viewModel: WooShippingLabelPackageCre WooShippingCustomPackageCreationScreen( packageType = packageType, + packageName = viewState?.customPackageCreationData?.name.orEmpty(), packageHeight = viewState?.customPackageCreationData?.height.orEmpty(), packageLength = viewState?.customPackageCreationData?.length.orEmpty(), packageWidth = viewState?.customPackageCreationData?.width.orEmpty(), + packageWeight = viewState?.customPackageCreationData?.weight.orEmpty(), isAddPackageEnabled = viewState?.customPackageCreationData?.isValid ?: false, + isSaveAsTemplateChecked = viewState?.customPackageCreationData?.saveAsTemplate ?: false, onAddPackageClick = viewModel::onAddCustomPackageClick, onPackageTypeClick = viewModel::onPackageTypeSpinnerClick, onLengthChange = viewModel::onLengthChange, onWidthChange = viewModel::onWidthChange, onHeightChange = viewModel::onHeightChange, + onWeightChange = viewModel::onWeightChange, + onPackageNameChange = viewModel::onPackageNameChange, onSavePackageChanged = viewModel::onSavePackageChanged ) } @@ -51,16 +59,21 @@ fun WooShippingCustomPackageCreationScreen(viewModel: WooShippingLabelPackageCre @Composable fun WooShippingCustomPackageCreationScreen( modifier: Modifier = Modifier, + packageName: String, packageType: String, packageLength: String, packageWidth: String, packageHeight: String, + packageWeight: String, isAddPackageEnabled: Boolean, - onAddPackageClick: () -> Unit, + isSaveAsTemplateChecked: Boolean, + onAddPackageClick: (saveAsTemplate: Boolean) -> Unit, onPackageTypeClick: () -> Unit, onLengthChange: (String) -> Unit, onWidthChange: (String) -> Unit, onHeightChange: (String) -> Unit, + onWeightChange: (String) -> Unit, + onPackageNameChange: (String) -> Unit, onSavePackageChanged: (Boolean) -> Unit ) { Column( @@ -90,7 +103,10 @@ fun WooShippingCustomPackageCreationScreen( onValueChange = onLengthChange, label = stringResource(id = R.string.woo_shipping_labels_package_creation_length), singleLine = true, - keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Number, + imeAction = ImeAction.Next + ), modifier = modifier.weight(1f) ) @@ -99,7 +115,10 @@ fun WooShippingCustomPackageCreationScreen( onValueChange = onWidthChange, label = stringResource(id = R.string.woo_shipping_labels_package_creation_width), singleLine = true, - keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Number, + imeAction = ImeAction.Next + ), modifier = modifier.weight(1f) ) @@ -108,7 +127,10 @@ fun WooShippingCustomPackageCreationScreen( onValueChange = onHeightChange, label = stringResource(id = R.string.woo_shipping_labels_package_creation_height), singleLine = true, - keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Number, + imeAction = ImeAction.Next + ), modifier = modifier.weight(1f) ) } @@ -120,13 +142,45 @@ fun WooShippingCustomPackageCreationScreen( text = stringResource(id = R.string.woo_shipping_labels_package_creation_save_package_option), modifier = modifier.align(Alignment.CenterVertically) ) - Checkbox(checked = false, onCheckedChange = onSavePackageChanged) + Checkbox( + checked = isSaveAsTemplateChecked, + onCheckedChange = onSavePackageChanged, + colors = CheckboxDefaults.colors( + checkedColor = MaterialTheme.colors.primary, + uncheckedColor = MaterialTheme.colors.onSurface + ), + ) + } + if (isSaveAsTemplateChecked) { + Column(modifier = modifier) { + WCOutlinedTextField( + value = packageWeight, + onValueChange = onWeightChange, + label = stringResource(id = R.string.woo_shipping_labels_package_creation_weight), + singleLine = true, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Number, + imeAction = ImeAction.Next + ), + modifier = modifier.fillMaxWidth() + ) + } + Column(modifier = modifier) { + WCOutlinedTextField( + value = packageName, + onValueChange = onPackageNameChange, + label = stringResource(id = R.string.woo_shipping_labels_package_creation_package_name), + singleLine = true, + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), + modifier = modifier.fillMaxWidth() + ) + } } } Button( modifier = modifier.fillMaxWidth(), enabled = isAddPackageEnabled, - onClick = onAddPackageClick + onClick = { onAddPackageClick(isSaveAsTemplateChecked) } ) { Text(stringResource(id = R.string.woo_shipping_labels_package_creation_add_package)) } @@ -138,16 +192,21 @@ fun WooShippingCustomPackageCreationScreen( fun PreviewWooShippingCustomPackageCreationScreen() { WooThemeWithBackground { WooShippingCustomPackageCreationScreen( + packageName = "Custom Package", packageType = "Box", packageLength = "10", packageWidth = "10", packageHeight = "10", + packageWeight = "10", isAddPackageEnabled = true, + isSaveAsTemplateChecked = true, onAddPackageClick = {}, onPackageTypeClick = {}, onLengthChange = {}, onWidthChange = {}, onHeightChange = {}, + onWeightChange = {}, + onPackageNameChange = {}, onSavePackageChanged = {} ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingSavedPackageScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingSavedPackageScreen.kt index 29577581f72..06a854e50ea 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingSavedPackageScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/packages/ui/WooShippingSavedPackageScreen.kt @@ -82,18 +82,21 @@ fun WooShippingSavedPackageScreenPreview() { PackageData( name = "Small Flat Rate Box", dimensions = "10 x 10 x 10 cm", + weight = "10", isSelected = true, isLetter = true ), PackageData( name = "Small Flat Rate Box", dimensions = "20 x 20 x 20 cm", + weight = "20", isSelected = false, isLetter = false ), PackageData( name = "Small Flat Rate Box", dimensions = "30 x 30 x 30 cm", + weight = "30", isSelected = false, isLetter = false ) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectViewModel.kt index 1abbf6ba085..c036b5bb2ab 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectViewModel.kt @@ -69,7 +69,7 @@ import com.woocommerce.android.ui.payments.cardreader.onboarding.PluginType import com.woocommerce.android.ui.payments.cardreader.update.CardReaderUpdateViewModel import com.woocommerce.android.ui.payments.tracking.CardReaderTrackingInfoKeeper import com.woocommerce.android.ui.payments.tracking.PaymentsFlowTracker -import com.woocommerce.android.ui.prefs.DeveloperOptionsRepository +import com.woocommerce.android.ui.prefs.developer.DeveloperOptionsRepository import com.woocommerce.android.util.CoroutineDispatchers import com.woocommerce.android.util.WooLog import com.woocommerce.android.viewmodel.MultiLiveEvent.Event @@ -243,7 +243,7 @@ class CardReaderConnectViewModel @Inject constructor( private fun onReadyToStartScanning() { if (!cardReaderManager.initialized) { cardReaderManager.initialize( - updateFrequency = mapUpdateOptions(appPrefs.selectedUpdateReaderOption()), + updateFrequency = developerOptionsRepository.getUpdateSimulatedReaderOption(), useInterac = developerOptionsRepository.isInteracPaymentEnabled(), BuildConfig.DEBUG, ) @@ -253,10 +253,6 @@ class CardReaderConnectViewModel @Inject constructor( } } - private fun mapUpdateOptions(updateFrequency: String): CardReaderManager.SimulatorUpdateFrequency { - return CardReaderManager.SimulatorUpdateFrequency.valueOf(updateFrequency) - } - private suspend fun startScanningIfNotStarted() { launch { listenToConnectionStatus() } launch { listenToSoftwareUpdateStatus() } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/DeveloperOptionsAdapter.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/DeveloperOptionsAdapter.kt deleted file mode 100644 index 860ed13a139..00000000000 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/DeveloperOptionsAdapter.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.woocommerce.android.ui.prefs - -import android.view.ViewGroup -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.ListAdapter -import com.woocommerce.android.ui.prefs.DeveloperOptionsViewModel.DeveloperOptionsViewState.ListItem -import com.woocommerce.android.ui.prefs.DeveloperOptionsViewModel.DeveloperOptionsViewState.ListItem.NonToggleableListItem -import com.woocommerce.android.ui.prefs.DeveloperOptionsViewModel.DeveloperOptionsViewState.ListItem.SpinnerListItem -import com.woocommerce.android.ui.prefs.DeveloperOptionsViewModel.DeveloperOptionsViewState.ListItem.ToggleableListItem - -class DeveloperOptionsAdapter : ListAdapter(ListItemDiffCallback) { - - override fun getItemViewType(position: Int): Int { - return when (getItem(position)) { - is ToggleableListItem -> { - VIEW_TYPE_TOGGLEABLE - } - is NonToggleableListItem -> { - VIEW_TYPE_NON_TOGGLEABLE - } - is SpinnerListItem -> { - VIEW_TYPE_RADIO_BUTTONS_DIALOG - } - } - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DeveloperOptionsViewHolder { - return when (viewType) { - VIEW_TYPE_TOGGLEABLE -> { - DeveloperOptionsViewHolder.ToggleableViewHolder(parent) - } - - VIEW_TYPE_NON_TOGGLEABLE -> { - DeveloperOptionsViewHolder.RowViewHolder(parent) - } - - VIEW_TYPE_RADIO_BUTTONS_DIALOG -> { - DeveloperOptionsViewHolder.SpinnerViewHolder(parent) - } - else -> error("Unknown section") - } - } - - override fun onBindViewHolder(holder: DeveloperOptionsViewHolder, position: Int) { - holder.onBind(getItem(position)) - } - - fun setItems(rows: List) { - submitList(rows) - } - - @Suppress("ReturnCount") - object ListItemDiffCallback : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: ListItem, newItem: ListItem): Boolean { - if (oldItem is ToggleableListItem && newItem is ToggleableListItem) { - return oldItem.label == newItem.label - } - if (oldItem is NonToggleableListItem && newItem is NonToggleableListItem) { - return oldItem.label == newItem.label - } - return false - } - - override fun areContentsTheSame(oldItem: ListItem, newItem: ListItem): Boolean { - return oldItem == newItem - } - - // Remove the Recyclerview animation to avoid rows blinking - override fun getChangePayload(oldItem: ListItem, newItem: ListItem): Any { - return false - } - } - - companion object { - const val VIEW_TYPE_NON_TOGGLEABLE = 0 - const val VIEW_TYPE_TOGGLEABLE = 1 - const val VIEW_TYPE_RADIO_BUTTONS_DIALOG = 2 - } -} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/DeveloperOptionsRepository.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/DeveloperOptionsRepository.kt deleted file mode 100644 index 3e80e3a7171..00000000000 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/DeveloperOptionsRepository.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.woocommerce.android.ui.prefs - -import com.woocommerce.android.AppPrefs -import com.woocommerce.android.ui.payments.cardreader.ClearCardReaderDataAction -import com.woocommerce.android.ui.prefs.DeveloperOptionsViewModel.DeveloperOptionsViewState.UpdateOptions -import javax.inject.Inject - -class DeveloperOptionsRepository @Inject constructor( - private val appPrefs: AppPrefs, - private val clearCardReaderDataAction: ClearCardReaderDataAction -) { - fun isSimulatedCardReaderEnabled(): Boolean { - return appPrefs.isSimulatedReaderEnabled - } - - fun changeSimulatedReaderState(isChecked: Boolean) { - appPrefs.isSimulatedReaderEnabled = isChecked - } - - suspend fun clearSelectedCardReader() { - clearCardReaderDataAction.invoke() - } - - fun getUpdateSimulatedReaderOption(): UpdateOptions { - return UpdateOptions.valueOf(appPrefs.updateReaderOptionSelected) - } - fun updateSimulatedReaderOption(selectedOption: UpdateOptions) { - appPrefs.updateReaderOptionSelected = selectedOption.toString() - } - - fun isInteracPaymentEnabled(): Boolean { - return appPrefs.isInteracEnabled - } - - fun changeEnableInteracPaymentState(isChecked: Boolean) { - appPrefs.isInteracEnabled = isChecked - } -} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/DeveloperOptionsViewHolder.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/DeveloperOptionsViewHolder.kt deleted file mode 100644 index fb1d101ad0c..00000000000 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/DeveloperOptionsViewHolder.kt +++ /dev/null @@ -1,66 +0,0 @@ -package com.woocommerce.android.ui.prefs - -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.annotation.LayoutRes -import androidx.recyclerview.widget.RecyclerView -import com.woocommerce.android.R -import com.woocommerce.android.databinding.DeveloperOptionsListItemBinding -import com.woocommerce.android.databinding.DeveloperOptionsTogglableItemBinding -import com.woocommerce.android.databinding.DeveloperOptionsUpdateReaderItemBinding -import com.woocommerce.android.ui.prefs.DeveloperOptionsViewModel.DeveloperOptionsViewState.ListItem -import com.woocommerce.android.ui.prefs.DeveloperOptionsViewModel.DeveloperOptionsViewState.ListItem.SpinnerListItem -import com.woocommerce.android.ui.prefs.DeveloperOptionsViewModel.DeveloperOptionsViewState.ListItem.ToggleableListItem -import com.woocommerce.android.util.UiHelpers - -abstract class DeveloperOptionsViewHolder(val parent: ViewGroup, @LayoutRes layout: Int) : - RecyclerView.ViewHolder(LayoutInflater.from(parent.context).inflate(layout, parent, false)) { - abstract fun onBind(uiState: ListItem) - - class RowViewHolder(parent: ViewGroup) : DeveloperOptionsViewHolder(parent, R.layout.developer_options_list_item) { - var binding: DeveloperOptionsListItemBinding = DeveloperOptionsListItemBinding.bind(itemView) - override fun onBind(uiState: ListItem) { - TODO("Not yet implemented") - } - } - - class ToggleableViewHolder(parent: ViewGroup) : - DeveloperOptionsViewHolder(parent, R.layout.developer_options_togglable_item) { - var binding: DeveloperOptionsTogglableItemBinding = DeveloperOptionsTogglableItemBinding.bind(itemView) - override fun onBind(uiState: ListItem) { - uiState as ToggleableListItem - binding.developerOptionsToggleableListItemLabel.text = UiHelpers.getTextOfUiString( - itemView.context, - uiState.label - ) - binding.developerOptionsToggleableIcon.setImageResource(uiState.icon) - binding.developerOptionsSwitch.isEnabled = uiState.isEnabled - binding.developerOptionsSwitch.isChecked = uiState.isChecked - binding.developerOptionsSwitch.setOnCheckedChangeListener { _, isChecked -> - if (uiState.isEnabled) { - uiState.onToggled(isChecked) - } - } - binding.root.setOnClickListener { - binding.developerOptionsSwitch.isChecked = !uiState.isChecked - } - } - } - - class SpinnerViewHolder(parent: ViewGroup) : - DeveloperOptionsViewHolder(parent, R.layout.developer_options_update_reader_item) { - var binding: DeveloperOptionsUpdateReaderItemBinding = DeveloperOptionsUpdateReaderItemBinding.bind(itemView) - override fun onBind(uiState: ListItem) { - uiState as SpinnerListItem - binding.developerOptionsSpinnerIcon.setImageResource(uiState.icon) - binding.developerOptionsSpinnerEndIcon.setImageResource(uiState.endIcon) - binding.developerOptionsSpinnerListItemLabel.text = UiHelpers.getTextOfUiString( - itemView.context, - uiState.label - ) - binding.root.setOnClickListener { - uiState.onClick.invoke() - } - } - } -} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/DeveloperOptionsViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/DeveloperOptionsViewModel.kt deleted file mode 100644 index 02b4ba6cc42..00000000000 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/DeveloperOptionsViewModel.kt +++ /dev/null @@ -1,224 +0,0 @@ -package com.woocommerce.android.ui.prefs - -import androidx.annotation.DrawableRes -import androidx.annotation.StringRes -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.SavedStateHandle -import com.woocommerce.android.AppPrefsWrapper -import com.woocommerce.android.R.drawable -import com.woocommerce.android.R.string -import com.woocommerce.android.cardreader.CardReaderManager -import com.woocommerce.android.model.UiString -import com.woocommerce.android.model.UiString.UiStringRes -import com.woocommerce.android.ui.prefs.DeveloperOptionsViewModel.DeveloperOptionsViewState.ListItem -import com.woocommerce.android.ui.prefs.DeveloperOptionsViewModel.DeveloperOptionsViewState.ListItem.SpinnerListItem -import com.woocommerce.android.ui.prefs.DeveloperOptionsViewModel.DeveloperOptionsViewState.ListItem.ToggleableListItem -import com.woocommerce.android.ui.prefs.DeveloperOptionsViewModel.DeveloperOptionsViewState.UpdateOptions -import com.woocommerce.android.viewmodel.MultiLiveEvent -import com.woocommerce.android.viewmodel.ScopedViewModel -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.launch -import javax.inject.Inject - -@HiltViewModel -class DeveloperOptionsViewModel @Inject constructor( - savedState: SavedStateHandle, - private val developerOptionsRepository: DeveloperOptionsRepository, - private val cardReaderManager: CardReaderManager, - private val appPrefsWrapper: AppPrefsWrapper, -) : ScopedViewModel(savedState) { - - private val savedPrivacySettingsOnDialogItem = ToggleableListItem( - icon = drawable.ic_more_screen_settings, - label = UiString.UiStringText("Saved privacy settings on dialog?"), - key = UiString.UiStringText(""), - isEnabled = true, - isChecked = appPrefsWrapper.savedPrivacyBannerSettings, - onToggled = { appPrefsWrapper.savedPrivacyBannerSettings = it } - ) - - private val _viewState = MutableLiveData( - DeveloperOptionsViewState( - rows = if (developerOptionsRepository.isSimulatedCardReaderEnabled()) { - getListItemsForSimulatedReader() - } else { - getListItemsForHardwareReader() - } + savedPrivacySettingsOnDialogItem, - ) - ) - - val viewState: LiveData = _viewState - - private fun getListItemsForHardwareReader(): List = mutableListOf( - ToggleableListItem( - icon = drawable.img_card_reader_connecting, - label = UiStringRes(string.enable_card_reader), - key = UiStringRes(string.simulated_reader_key), - isEnabled = true, - isChecked = developerOptionsRepository.isSimulatedCardReaderEnabled(), - onToggled = ::onSimulatedReaderToggled - ), - ) - - private fun createReaderUpdateFrequencyItem() = - SpinnerListItem( - icon = drawable.img_card_reader_update_progress, - endIcon = drawable.ic_arrow_drop_down, - label = UiStringRes(string.update_simulated_reader), - key = UiStringRes(string.update_simulated_reader_key), - isEnabled = true, - onClick = ::onUpdateSimulatedReaderClicked, - ) - - private fun createEnableInteractItem() = - ToggleableListItem( - icon = drawable.ic_credit_card_give, - label = UiStringRes(string.enable_interac_payment), - key = UiStringRes(string.enable_interac_key), - isEnabled = true, - isChecked = developerOptionsRepository.isInteracPaymentEnabled(), - onToggled = ::onEnableInteracToggled - ) - - private fun onSimulatedReaderToggled(isChecked: Boolean) { - if (!isChecked) { - viewState.value?.rows = getListItemsForHardwareReader() - disconnectAndClearSelectedCardReader() - triggerEvent( - DeveloperOptionsEvents.ShowToastString(string.simulated_reader_toast) - ) - } else { - viewState.value?.rows = - getListItemsForSimulatedReader() - } - simulatedReaderStateChanged(isChecked) - } - - private fun disconnectAndClearSelectedCardReader() { - launch { - developerOptionsRepository.clearSelectedCardReader() - } - } - - private fun simulatedReaderStateChanged(isChecked: Boolean) { - developerOptionsRepository.changeSimulatedReaderState(isChecked) - val currentViewState = viewState.value - ( - currentViewState?.rows?.find { - it.key == UiStringRes(string.simulated_reader_key) - } as? ToggleableListItem - )?.let { originalListItem -> - val newState = originalListItem.copy(isChecked = isChecked) - _viewState.value = currentViewState.copy( - rows = currentViewState.rows.map { - if (it.label == newState.label) { - newState - } else { - it - } - } - ) - } - } - - private fun onEnableInteracToggled(isChecked: Boolean) { - developerOptionsRepository.changeEnableInteracPaymentState(isChecked) - - reinitializeSimulatedReaderIfNotInitialized() - } - - private fun reinitializeSimulatedReaderIfNotInitialized() { - if (cardReaderManager.initialized) { - cardReaderManager.reinitializeSimulatedTerminal( - updateFrequency = mapUpdateOptions(developerOptionsRepository.getUpdateSimulatedReaderOption()), - useInterac = developerOptionsRepository.isInteracPaymentEnabled() - ) - } - } - - private fun onUpdateSimulatedReaderClicked() { - triggerEvent( - DeveloperOptionsEvents.ShowUpdateOptionsDialog( - UpdateOptions.values().toList(), - developerOptionsRepository.getUpdateSimulatedReaderOption() - ) - ) - } - - fun onUpdateReaderOptionChanged(selectedOption: UpdateOptions) { - developerOptionsRepository.updateSimulatedReaderOption(selectedOption) - - reinitializeSimulatedReaderIfNotInitialized() - } - - private fun mapUpdateOptions(updateFrequency: UpdateOptions): CardReaderManager.SimulatorUpdateFrequency { - return when (updateFrequency) { - UpdateOptions.ALWAYS -> CardReaderManager.SimulatorUpdateFrequency.ALWAYS - UpdateOptions.NEVER -> CardReaderManager.SimulatorUpdateFrequency.NEVER - UpdateOptions.LOW_BATTERY_ERROR -> CardReaderManager.SimulatorUpdateFrequency.LOW_BATTERY_ERROR - UpdateOptions.LOW_BATTERY_SUCCEED_CONNECT -> { - CardReaderManager.SimulatorUpdateFrequency.LOW_BATTERY_SUCCEED_CONNECT - } - UpdateOptions.RANDOM -> CardReaderManager.SimulatorUpdateFrequency.RANDOM - } - } - - sealed class DeveloperOptionsEvents : MultiLiveEvent.Event() { - data class ShowToastString(val message: Int) : DeveloperOptionsEvents() - data class ShowUpdateOptionsDialog( - val options: List, - var selectedValue: UpdateOptions, - ) : DeveloperOptionsEvents() - } - - private fun getListItemsForSimulatedReader(): List { - return getListItemsForHardwareReader() + createReaderUpdateFrequencyItem() + createEnableInteractItem() - } - - data class DeveloperOptionsViewState( - var rows: List - ) { - sealed class ListItem { - abstract val label: UiString - abstract val icon: Int? - abstract var isEnabled: Boolean - abstract var key: UiString - - data class ToggleableListItem( - @DrawableRes override val icon: Int, - override val label: UiString, - override var isEnabled: Boolean = false, - override var key: UiString, - val onToggled: (Boolean) -> Unit, - val isChecked: Boolean - ) : ListItem() - - data class NonToggleableListItem( - @DrawableRes override val icon: Int, - override val label: UiString, - override var isEnabled: Boolean = false, - override var key: UiString, - val onClick: () -> Unit - ) : ListItem() - - data class SpinnerListItem( - @DrawableRes override val icon: Int, - @DrawableRes val endIcon: Int, - override val label: UiString, - override var isEnabled: Boolean = false, - override var key: UiString, - val onClick: () -> Unit, - - ) : ListItem() - } - - enum class UpdateOptions(@StringRes val title: Int) { - ALWAYS(string.always_update_reader), - NEVER(string.never_update_reader), - LOW_BATTERY_ERROR(string.low_battery_error_update_reader), - LOW_BATTERY_SUCCEED_CONNECT(string.low_battery_succeed_connect_update_reader), - RANDOM(string.randomly_update_reader) - } - } -} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/DeveloperOptionsFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/developer/DeveloperOptionsFragment.kt similarity index 61% rename from WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/DeveloperOptionsFragment.kt rename to WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/developer/DeveloperOptionsFragment.kt index 8c07fb94e28..7e1af080bde 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/DeveloperOptionsFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/developer/DeveloperOptionsFragment.kt @@ -1,41 +1,35 @@ -package com.woocommerce.android.ui.prefs +package com.woocommerce.android.ui.prefs.developer import android.os.Bundle import android.view.ContextThemeWrapper +import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup import androidx.fragment.app.viewModels -import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.woocommerce.android.R -import com.woocommerce.android.databinding.FragmentDeveloperOptionsBinding import com.woocommerce.android.ui.base.BaseFragment -import com.woocommerce.android.ui.prefs.DeveloperOptionsViewModel.DeveloperOptionsViewState.UpdateOptions +import com.woocommerce.android.ui.compose.composeView +import com.woocommerce.android.ui.prefs.developer.DeveloperOptionsViewModel.DeveloperOptionsViewState.UpdateFrequencyUiModel import dagger.hilt.android.AndroidEntryPoint import org.wordpress.android.util.ToastUtils @AndroidEntryPoint -class DeveloperOptionsFragment : BaseFragment(R.layout.fragment_developer_options) { +class DeveloperOptionsFragment : BaseFragment() { val viewModel: DeveloperOptionsViewModel by viewModels() + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + return composeView { + DeveloperOptionsScreen(viewModel) + } + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val binding = FragmentDeveloperOptionsBinding.bind(view) - - initViews(binding) - observeViewState(binding) observeEvents() } - private fun initViews(binding: FragmentDeveloperOptionsBinding) { - binding.developerOptionsRv.layoutManager = LinearLayoutManager(requireContext()) - binding.developerOptionsRv.addItemDecoration( - DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) - ) - binding.developerOptionsRv.adapter = DeveloperOptionsAdapter() - } - private fun observeEvents() { viewModel.event.observe( viewLifecycleOwner @@ -44,6 +38,7 @@ class DeveloperOptionsFragment : BaseFragment(R.layout.fragment_developer_option is DeveloperOptionsViewModel.DeveloperOptionsEvents.ShowToastString -> { ToastUtils.showToast(context, event.message) } + is DeveloperOptionsViewModel.DeveloperOptionsEvents.ShowUpdateOptionsDialog -> { showUpdateOptionsDialog( values = event.options, @@ -56,9 +51,9 @@ class DeveloperOptionsFragment : BaseFragment(R.layout.fragment_developer_option } private fun showUpdateOptionsDialog( - values: List, - mapper: (UpdateOptions) -> String, - selectedValue: UpdateOptions + values: List, + mapper: (UpdateFrequencyUiModel) -> String, + selectedValue: UpdateFrequencyUiModel ) { var currentlySelectedValue = selectedValue val textValues = values.map(mapper).toTypedArray() @@ -76,11 +71,5 @@ class DeveloperOptionsFragment : BaseFragment(R.layout.fragment_developer_option }.show() } - private fun observeViewState(binding: FragmentDeveloperOptionsBinding) { - viewModel.viewState.observe(viewLifecycleOwner) { state -> - (binding.developerOptionsRv.adapter as DeveloperOptionsAdapter).setItems(state.rows) - } - } - override fun getFragmentTitle() = resources.getString(R.string.dev_options) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/developer/DeveloperOptionsRepository.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/developer/DeveloperOptionsRepository.kt new file mode 100644 index 00000000000..d72dea84f16 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/developer/DeveloperOptionsRepository.kt @@ -0,0 +1,74 @@ +package com.woocommerce.android.ui.prefs.developer + +import com.woocommerce.android.AppPrefs +import com.woocommerce.android.cardreader.CardReaderManager +import com.woocommerce.android.di.AppCoroutineScope +import com.woocommerce.android.ui.payments.cardreader.ClearCardReaderDataAction +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.flow.shareIn +import javax.inject.Inject + +class DeveloperOptionsRepository @Inject constructor( + private val appPrefs: AppPrefs, + private val clearCardReaderDataAction: ClearCardReaderDataAction, + private val cardReaderManager: CardReaderManager, + @AppCoroutineScope appScope: CoroutineScope +) { + private val appPrefsTrigger = appPrefs.observePrefs().shareIn(appScope, started = SharingStarted.WhileSubscribed()) + .onStart { emit(Unit) } + + fun isSimulatedCardReaderEnabled(): Boolean = appPrefs.isSimulatedReaderEnabled + + fun observeSimulatedCardReaderEnabled() = appPrefsTrigger + .map { appPrefs.isSimulatedReaderEnabled } + .distinctUntilChanged() + + fun changeSimulatedReaderState(isChecked: Boolean) { + appPrefs.isSimulatedReaderEnabled = isChecked + } + + suspend fun clearSelectedCardReader() { + clearCardReaderDataAction.invoke() + } + + fun getUpdateSimulatedReaderOption(): CardReaderManager.SimulatorUpdateFrequency { + return CardReaderManager.SimulatorUpdateFrequency.valueOf(appPrefs.updateReaderOptionSelected) + } + + fun updateSimulatedReaderOption(selectedOption: CardReaderManager.SimulatorUpdateFrequency) { + appPrefs.updateReaderOptionSelected = selectedOption.toString() + reinitializeSimulatedReaderIfNeeded() + } + + fun isInteracPaymentEnabled(): Boolean = appPrefs.isInteracEnabled + + fun observeInteracPaymentEnabled() = appPrefsTrigger + .map { appPrefs.isInteracEnabled } + .distinctUntilChanged() + + fun changeEnableInteracPaymentState(isChecked: Boolean) { + appPrefs.isInteracEnabled = isChecked + reinitializeSimulatedReaderIfNeeded() + } + + fun observeSavedPrivacyBannerSettings() = appPrefsTrigger + .map { appPrefs.savedPrivacySettings } + .distinctUntilChanged() + + fun changeSavedPrivacyBannerSettings(isChecked: Boolean) { + appPrefs.savedPrivacySettings = isChecked + } + + private fun reinitializeSimulatedReaderIfNeeded() { + if (cardReaderManager.initialized) { + cardReaderManager.reinitializeSimulatedTerminal( + updateFrequency = getUpdateSimulatedReaderOption(), + useInterac = appPrefs.isInteracEnabled + ) + } + } +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/developer/DeveloperOptionsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/developer/DeveloperOptionsScreen.kt new file mode 100644 index 00000000000..fd238d34ab0 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/developer/DeveloperOptionsScreen.kt @@ -0,0 +1,118 @@ +package com.woocommerce.android.ui.prefs.developer + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.Divider +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Switch +import androidx.compose.material.SwitchDefaults +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import com.woocommerce.android.ui.compose.component.getText +import com.woocommerce.android.ui.prefs.developer.DeveloperOptionsViewModel.DeveloperOptionsViewState + +@Composable +fun DeveloperOptionsScreen(viewModel: DeveloperOptionsViewModel) { + viewModel.viewState.observeAsState().value?.let { + DeveloperOptionsScreen(it) + } +} + +@Composable +fun DeveloperOptionsScreen(viewState: DeveloperOptionsViewState) { + LazyColumn { + items(viewState.rows) { row -> + when (row) { + is DeveloperOptionsViewState.ListItem.ToggleableListItem -> { + ToggleableListItem(row) + } + + is DeveloperOptionsViewState.ListItem.NonToggleableListItem -> { + NonToggleableListItem(row) + } + } + } + } +} + +@Composable +private fun ToggleableListItem( + item: DeveloperOptionsViewState.ListItem.ToggleableListItem, + modifier: Modifier = Modifier +) { + CommonItemLayout(item, modifier.clickable { item.onToggled(!item.isChecked) }) { + Switch( + checked = item.isChecked, + onCheckedChange = item.onToggled, + colors = SwitchDefaults.colors(checkedThumbColor = MaterialTheme.colors.primary) + ) + } +} + +@Composable +private fun NonToggleableListItem( + item: DeveloperOptionsViewState.ListItem.NonToggleableListItem, + modifier: Modifier = Modifier +) { + CommonItemLayout(item, modifier.clickable { item.onClick() }) { + item.endIcon?.let { + Icon( + painter = painterResource(id = it), + contentDescription = null + ) + } + } +} + +@Composable +private fun CommonItemLayout( + item: DeveloperOptionsViewState.ListItem, + modifier: Modifier = Modifier, + additionalContent: (@Composable () -> Unit)? = null, +) { + Column( + modifier = modifier + .fillMaxWidth() + .background(MaterialTheme.colors.surface) + ) { + Row( + horizontalArrangement = Arrangement.spacedBy(16.dp), + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(16.dp) + ) { + Image( + painter = painterResource(item.icon), + contentDescription = null, + colorFilter = item.iconTint?.let { ColorFilter.tint(colorResource(id = it)) }, + modifier = Modifier + .size(72.dp) + ) + + Text( + text = item.label.getText(), + modifier = Modifier.weight(1f) + ) + + additionalContent?.invoke() + } + + Divider() + } +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/developer/DeveloperOptionsViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/developer/DeveloperOptionsViewModel.kt new file mode 100644 index 00000000000..3e7738b412f --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/developer/DeveloperOptionsViewModel.kt @@ -0,0 +1,170 @@ +package com.woocommerce.android.ui.prefs.developer + +import androidx.annotation.ColorRes +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.asLiveData +import com.woocommerce.android.R +import com.woocommerce.android.cardreader.CardReaderManager +import com.woocommerce.android.model.UiString +import com.woocommerce.android.model.UiString.UiStringRes +import com.woocommerce.android.ui.prefs.developer.DeveloperOptionsViewModel.DeveloperOptionsViewState.ListItem.NonToggleableListItem +import com.woocommerce.android.ui.prefs.developer.DeveloperOptionsViewModel.DeveloperOptionsViewState.ListItem.ToggleableListItem +import com.woocommerce.android.ui.prefs.developer.DeveloperOptionsViewModel.DeveloperOptionsViewState.UpdateFrequencyUiModel +import com.woocommerce.android.viewmodel.MultiLiveEvent +import com.woocommerce.android.viewmodel.ScopedViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class DeveloperOptionsViewModel @Inject constructor( + savedState: SavedStateHandle, + private val developerOptionsRepository: DeveloperOptionsRepository +) : ScopedViewModel(savedState) { + private val isSimulatedReaderEnabled = developerOptionsRepository.observeSimulatedCardReaderEnabled() + + private val simulatedCardReaderFlow = isSimulatedReaderEnabled.map { simulated -> + ToggleableListItem( + icon = R.drawable.img_card_reader, + label = UiStringRes(R.string.enable_card_reader), + isEnabled = true, + isChecked = simulated, + onToggled = ::onSimulatedReaderToggled + ) + } + + private val readerUpdateFrequencyFlow = isSimulatedReaderEnabled.map { simulatedReader -> + if (!simulatedReader) return@map null + + NonToggleableListItem( + icon = R.drawable.img_card_reader_update_progress, + iconTint = R.color.color_primary, + endIcon = R.drawable.ic_arrow_drop_down, + label = UiStringRes(R.string.update_simulated_reader), + isEnabled = true, + onClick = ::onUpdateSimulatedReaderClicked, + ) + } + + private val interacPaymentEnabledFlow = combine( + isSimulatedReaderEnabled, + developerOptionsRepository.observeInteracPaymentEnabled() + ) { simulatedReader, useInterac -> + if (!simulatedReader) return@combine null + + ToggleableListItem( + icon = R.drawable.ic_credit_card_give, + label = UiStringRes(R.string.enable_interac_payment), + isEnabled = true, + isChecked = useInterac, + onToggled = developerOptionsRepository::changeEnableInteracPaymentState + ) + } + + private val savedPrivacySettingsOnDialogFlow = developerOptionsRepository + .observeSavedPrivacyBannerSettings() + .map { isChecked -> + ToggleableListItem( + icon = R.drawable.ic_more_screen_settings, + label = UiString.UiStringText("Saved privacy settings on dialog?"), + isEnabled = true, + isChecked = isChecked, + onToggled = developerOptionsRepository::changeSavedPrivacyBannerSettings + ) + } + + val viewState = combine( + simulatedCardReaderFlow, + readerUpdateFrequencyFlow, + interacPaymentEnabledFlow, + savedPrivacySettingsOnDialogFlow + ) { items -> + DeveloperOptionsViewState( + rows = items.filterNotNull() + ) + }.asLiveData() + + private fun onSimulatedReaderToggled(isChecked: Boolean) { + developerOptionsRepository.changeSimulatedReaderState(isChecked) + if (!isChecked) { + disconnectAndClearSelectedCardReader() + triggerEvent( + DeveloperOptionsEvents.ShowToastString(R.string.simulated_reader_toast) + ) + } + } + + private fun disconnectAndClearSelectedCardReader() { + launch { + developerOptionsRepository.clearSelectedCardReader() + } + } + + private fun onUpdateSimulatedReaderClicked() { + triggerEvent( + DeveloperOptionsEvents.ShowUpdateOptionsDialog( + UpdateFrequencyUiModel.entries, + UpdateFrequencyUiModel.fromDomainModel(developerOptionsRepository.getUpdateSimulatedReaderOption()) + ) + ) + } + + fun onUpdateReaderOptionChanged(selectedOption: UpdateFrequencyUiModel) { + developerOptionsRepository.updateSimulatedReaderOption(selectedOption.toDomainModel()) + } + + sealed class DeveloperOptionsEvents : MultiLiveEvent.Event() { + data class ShowToastString(val message: Int) : DeveloperOptionsEvents() + data class ShowUpdateOptionsDialog( + val options: List, + var selectedValue: UpdateFrequencyUiModel, + ) : DeveloperOptionsEvents() + } + + data class DeveloperOptionsViewState( + var rows: List + ) { + sealed class ListItem { + abstract val label: UiString + abstract val icon: Int + abstract val iconTint: Int? + abstract var isEnabled: Boolean + + data class ToggleableListItem( + @DrawableRes override val icon: Int, + @ColorRes override val iconTint: Int? = null, + override val label: UiString, + override var isEnabled: Boolean = false, + val onToggled: (Boolean) -> Unit, + val isChecked: Boolean + ) : ListItem() + + data class NonToggleableListItem( + @DrawableRes override val icon: Int, + @ColorRes override val iconTint: Int? = null, + @DrawableRes val endIcon: Int? = null, + override val label: UiString, + override var isEnabled: Boolean = false, + val onClick: () -> Unit + ) : ListItem() + } + + enum class UpdateFrequencyUiModel(@StringRes val title: Int) { + ALWAYS(R.string.always_update_reader), + NEVER(R.string.never_update_reader), + LOW_BATTERY_ERROR(R.string.low_battery_error_update_reader), + LOW_BATTERY_SUCCEED_CONNECT(R.string.low_battery_succeed_connect_update_reader), + RANDOM(R.string.randomly_update_reader); + + fun toDomainModel() = CardReaderManager.SimulatorUpdateFrequency.valueOf(name) + + companion object { + fun fromDomainModel(model: CardReaderManager.SimulatorUpdateFrequency) = valueOf(model.name) + } + } + } +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/domain/DomainDashboardScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/domain/DomainDashboardScreen.kt index a490f6218c7..279cdca1c2d 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/domain/DomainDashboardScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/prefs/domain/DomainDashboardScreen.kt @@ -18,7 +18,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.text.ClickableText import androidx.compose.material.Divider import androidx.compose.material.Icon import androidx.compose.material.MaterialTheme @@ -49,7 +48,6 @@ import com.woocommerce.android.R.color import com.woocommerce.android.R.dimen import com.woocommerce.android.R.drawable import com.woocommerce.android.R.string -import com.woocommerce.android.ui.compose.URL_ANNOTATION_TAG import com.woocommerce.android.ui.compose.annotatedStringRes import com.woocommerce.android.ui.compose.component.ProgressIndicator import com.woocommerce.android.ui.compose.component.ToolbarWithHelpButton @@ -139,18 +137,17 @@ private fun DomainDashboard( imageVector = ImageVector.vectorResource(id = drawable.ic_info_outline_20dp), contentDescription = stringResource(string.domains_learn_more) ) - val text = annotatedStringRes(stringResId = string.domains_learn_more) - ClickableText( - modifier = Modifier.padding(start = dimensionResource(id = dimen.minor_100)), + val text = annotatedStringRes( + stringResId = string.domains_learn_more, + onUrlClick = { onLearnMoreButtonTapped() } + ) + + Text( text = text, - style = MaterialTheme.typography.caption.copy( - color = colorResource(id = color.color_on_surface_medium) - ), - ) { - text.getStringAnnotations(tag = URL_ANNOTATION_TAG, start = it, end = it) - .firstOrNull() - ?.let { onLearnMoreButtonTapped() } - } + style = MaterialTheme.typography.caption, + color = colorResource(id = color.color_on_surface_medium), + modifier = Modifier.padding(start = dimensionResource(id = dimen.minor_100)), + ) } } else { LazyColumn( diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/ai/AddProductWithAIBottomSheet.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/ai/AddProductWithAIBottomSheet.kt index be7bfbb9461..89289de6236 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/ai/AddProductWithAIBottomSheet.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/ai/AddProductWithAIBottomSheet.kt @@ -18,7 +18,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.text.ClickableText +import androidx.compose.material.ContentAlpha import androidx.compose.material.Divider import androidx.compose.material.Icon import androidx.compose.material.MaterialTheme @@ -44,7 +44,6 @@ import com.woocommerce.android.R import com.woocommerce.android.analytics.AnalyticsEvent import com.woocommerce.android.analytics.AnalyticsTracker import com.woocommerce.android.extensions.navigateSafely -import com.woocommerce.android.ui.compose.URL_ANNOTATION_TAG import com.woocommerce.android.ui.compose.annotatedStringRes import com.woocommerce.android.ui.compose.component.BottomSheetHandle import com.woocommerce.android.ui.compose.theme.WooTheme @@ -132,18 +131,16 @@ private fun AddProductWithAIContent( Spacer(Modifier.height(dimensionResource(id = R.dimen.minor_100))) - val learnMoreText = annotatedStringRes(stringResId = R.string.product_creation_ai_entry_sheet_learn_more) - ClickableText( + val learnMoreText = annotatedStringRes( + stringResId = R.string.product_creation_ai_entry_sheet_learn_more, + onUrlClick = { onLearnMoreClick() } + ) + Text( text = learnMoreText, - style = MaterialTheme.typography.caption.copy( - color = colorResource(id = R.color.color_on_surface_medium) - ), + style = MaterialTheme.typography.caption, + color = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium), modifier = Modifier.padding(start = dimensionResource(id = R.dimen.major_325)) - ) { - learnMoreText.getStringAnnotations(tag = URL_ANNOTATION_TAG, start = it, end = it) - .firstOrNull() - ?.let { onLearnMoreClick() } - } + ) Divider(Modifier.padding(dimensionResource(id = R.dimen.major_100))) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/ai/productinfo/AiProductPromptScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/ai/productinfo/AiProductPromptScreen.kt index 4e9709a49a5..1ee568b8183 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/ai/productinfo/AiProductPromptScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/ai/productinfo/AiProductPromptScreen.kt @@ -64,7 +64,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.woocommerce.android.R import com.woocommerce.android.mediapicker.MediaPickerDialog -import com.woocommerce.android.ui.compose.annotatedStringRes +import com.woocommerce.android.ui.compose.annotatedStringResLegacy import com.woocommerce.android.ui.compose.component.Toolbar import com.woocommerce.android.ui.compose.component.WCColoredButton import com.woocommerce.android.ui.compose.component.WCOutlinedTextField @@ -413,7 +413,7 @@ private fun PromptSuggestions( color = colorResource(id = promptSuggestionBarState.progressBarColorRes) ) Text( - text = annotatedStringRes(promptSuggestionBarState.messageRes), + text = annotatedStringResLegacy(promptSuggestionBarState.messageRes), modifier = Modifier .fillMaxSize() .padding(top = 8.dp), diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/details/ProductDetailCardBuilder.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/details/ProductDetailCardBuilder.kt index 5c87ce44d74..3dbdaaa5200 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/details/ProductDetailCardBuilder.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/details/ProductDetailCardBuilder.kt @@ -474,21 +474,26 @@ class ProductDetailCardBuilder( @Suppress("LongMethod") private fun ProductAggregate.shipping(): ProductProperty? { - return if (!this.product.isVirtual && hasShipping) { + val currentProduct = this.product + return if (!currentProduct.isVirtual && hasShipping) { val weightWithUnits = product.getWeightWithUnits(parameters.weightUnit) val sizeWithUnits = product.getSizeWithUnits(parameters.dimensionUnit) - val shippingGroup = mapOf( - Pair(resources.getString(string.product_weight), weightWithUnits), - Pair(resources.getString(string.product_dimensions), sizeWithUnits), - Pair( + val shippingGroup = buildMap { + put(resources.getString(string.product_weight), weightWithUnits) + put(resources.getString(string.product_dimensions), sizeWithUnits) + put( resources.getString(string.product_shipping_class), - viewModel.getShippingClassByRemoteShippingClassId(this.product.shippingClassId) - ), - Pair( - resources.getString(string.subscription_one_time_shipping), - buildOneTimeShippingDescription(subscription) + viewModel.getShippingClassByRemoteShippingClassId(currentProduct.shippingClassId) ) - ) + + // Only add "One time shipping" info if product is Subscription types + if (currentProduct.productType == SUBSCRIPTION || currentProduct.productType == VARIABLE_SUBSCRIPTION) { + put( + resources.getString(string.subscription_one_time_shipping), + buildOneTimeShippingDescription(subscription) + ) + } + } PropertyGroup( string.product_shipping, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/details/ProductDetailViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/details/ProductDetailViewModel.kt index daaaef496d4..553c75c000c 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/details/ProductDetailViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/details/ProductDetailViewModel.kt @@ -1229,13 +1229,22 @@ class ProductDetailViewModel @Inject constructor( updateProductDraft(type = productType.value, isVirtual = isVirtual) viewState.productAggregateDraft?.let { productAggregateDraft -> - if (productType == ProductType.SUBSCRIPTION && productAggregateDraft.subscription == null) { - viewState = viewState.copy( - subscriptionDraft = ProductHelper.getDefaultSubscriptionDetails().copy( - price = productAggregateDraft.product.regularPrice - ) - ) - } + viewState = viewState.copy( + subscriptionDraft = when { + // If converting to subscription product, set the default subscription details + productType == ProductType.SUBSCRIPTION && productAggregateDraft.subscription == null -> + ProductHelper.getDefaultSubscriptionDetails().copy( + price = productAggregateDraft.product.regularPrice + ) + + // If converting to non-subscription products, reset subscription data that might have existed + // (e.g: if the original product is of subscription type). + // This avoids any Product Details card conflicts that can happen after conversion. + productType !in setOf(ProductType.SUBSCRIPTION, ProductType.VARIABLE_SUBSCRIPTION) -> null + + else -> viewState.subscriptionDraft + } + ) } } @@ -2731,7 +2740,7 @@ class ProductDetailViewModel @Inject constructor( } ) - fun copy(subscriptionDraft: SubscriptionDetails) = copy( + fun copy(subscriptionDraft: SubscriptionDetails?) = copy( productAggregateDraft = productAggregateDraft?.copy(subscription = subscriptionDraft) ) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/inventory/FetchProductByIdentifier.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/inventory/FetchProductByIdentifier.kt new file mode 100644 index 00000000000..ae56e634426 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/inventory/FetchProductByIdentifier.kt @@ -0,0 +1,94 @@ +package com.woocommerce.android.ui.products.inventory + +import com.woocommerce.android.model.Product +import com.woocommerce.android.ui.orders.creation.CheckDigitRemoverFactory +import com.woocommerce.android.ui.orders.creation.GoogleBarcodeFormatMapper +import com.woocommerce.android.ui.products.list.ProductListRepository +import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope +import org.wordpress.android.fluxc.store.WCProductStore +import javax.inject.Inject + +class FetchProductByIdentifier @Inject constructor( + private val productRepository: ProductListRepository, + private val checkDigitRemoverFactory: CheckDigitRemoverFactory, +) { + suspend operator fun invoke( + codeScannerResultCode: String, + codeScannerResultFormat: GoogleBarcodeFormatMapper.BarcodeFormat + ): Result = coroutineScope { + val globalUniqueIdentifierSearch = async { + searchProductByGlobalUniqueIdentifier( + codeScannerResultCode, + codeScannerResultFormat + ) + } + val skuSearch = async { searchProductBySku(codeScannerResultCode, codeScannerResultFormat) } + + val product = globalUniqueIdentifierSearch.await() ?: skuSearch.await() + + if (product != null) { + Result.success(product) + } else { + Result.failure(Exception("Product not found")) + } + } + + private suspend fun searchProductBySku( + codeScannerResultCode: String, + codeScannerResultFormat: GoogleBarcodeFormatMapper.BarcodeFormat + ): Product? { + val product = productRepository.searchProductList( + searchQuery = codeScannerResultCode, + skuSearchOptions = WCProductStore.SkuSearchOptions.ExactSearch + )?.firstOrNull() + ?: removeCheckDigitIfPossible( + codeScannerResultCode = codeScannerResultCode, + codeScannerResultFormat = codeScannerResultFormat + )?.let { + productRepository.searchProductList( + searchQuery = it, + skuSearchOptions = WCProductStore.SkuSearchOptions.ExactSearch + )?.firstOrNull() + } + return product + } + + private suspend fun searchProductByGlobalUniqueIdentifier( + codeScannerResultCode: String, + codeScannerResultFormat: GoogleBarcodeFormatMapper.BarcodeFormat + ): Product? { + val product = productRepository.searchProductListByGlobalUniqueId( + globalUniqueId = codeScannerResultCode + )?.firstOrNull() ?: removeCheckDigitIfPossible( + codeScannerResultCode = codeScannerResultCode, + codeScannerResultFormat = codeScannerResultFormat + )?.let { + productRepository.searchProductListByGlobalUniqueId( + globalUniqueId = codeScannerResultCode + )?.firstOrNull() + } + + return product + } + + private fun removeCheckDigitIfPossible( + codeScannerResultCode: String, + codeScannerResultFormat: GoogleBarcodeFormatMapper.BarcodeFormat + ): String? { + if (codeScannerResultFormat.isEAN() || codeScannerResultFormat.isUPC()) { + return checkDigitRemoverFactory.getCheckDigitRemoverFor(codeScannerResultFormat) + .getSKUWithoutCheckDigit(codeScannerResultCode) + } + + return null + } + + private fun GoogleBarcodeFormatMapper.BarcodeFormat.isUPC() = + this == GoogleBarcodeFormatMapper.BarcodeFormat.FormatUPCA || + this == GoogleBarcodeFormatMapper.BarcodeFormat.FormatUPCE + + private fun GoogleBarcodeFormatMapper.BarcodeFormat.isEAN() = + this == GoogleBarcodeFormatMapper.BarcodeFormat.FormatEAN13 || + this == GoogleBarcodeFormatMapper.BarcodeFormat.FormatEAN8 +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/inventory/FetchProductBySKU.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/inventory/FetchProductBySKU.kt deleted file mode 100644 index 7dd9d354b3b..00000000000 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/inventory/FetchProductBySKU.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.woocommerce.android.ui.products.inventory - -import com.woocommerce.android.model.Product -import com.woocommerce.android.ui.orders.creation.CheckDigitRemoverFactory -import com.woocommerce.android.ui.orders.creation.GoogleBarcodeFormatMapper -import com.woocommerce.android.ui.products.list.ProductListRepository -import org.wordpress.android.fluxc.store.WCProductStore -import javax.inject.Inject - -class FetchProductBySKU @Inject constructor( - private val productRepository: ProductListRepository, - private val checkDigitRemoverFactory: CheckDigitRemoverFactory, -) { - suspend operator fun invoke( - codeScannerResultCode: String, - codeScannerResultFormat: GoogleBarcodeFormatMapper.BarcodeFormat - ): Result { - val product = productRepository.searchProductList( - searchQuery = codeScannerResultCode, - skuSearchOptions = WCProductStore.SkuSearchOptions.ExactSearch - )?.firstOrNull() - ?: if (codeScannerResultFormat.isEAN() || codeScannerResultFormat.isUPC()) { - val sku = checkDigitRemoverFactory.getCheckDigitRemoverFor(codeScannerResultFormat) - .getSKUWithoutCheckDigit(codeScannerResultCode) - productRepository.searchProductList( - searchQuery = sku, - skuSearchOptions = WCProductStore.SkuSearchOptions.ExactSearch - )?.firstOrNull() - } else { - null - } - return if (product != null) { - Result.success(product) - } else { - Result.failure(Exception("Product not found")) - } - } - - private fun GoogleBarcodeFormatMapper.BarcodeFormat.isUPC() = - this == GoogleBarcodeFormatMapper.BarcodeFormat.FormatUPCA || - this == GoogleBarcodeFormatMapper.BarcodeFormat.FormatUPCE - - private fun GoogleBarcodeFormatMapper.BarcodeFormat.isEAN() = - this == GoogleBarcodeFormatMapper.BarcodeFormat.FormatEAN13 || - this == GoogleBarcodeFormatMapper.BarcodeFormat.FormatEAN8 -} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/inventory/ScanToUpdateInventoryViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/inventory/ScanToUpdateInventoryViewModel.kt index a6d0df2ef84..94366a2d26f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/inventory/ScanToUpdateInventoryViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/inventory/ScanToUpdateInventoryViewModel.kt @@ -31,7 +31,7 @@ import javax.inject.Inject @HiltViewModel class ScanToUpdateInventoryViewModel @Inject constructor( savedState: SavedStateHandle, - private val fetchProductBySKU: FetchProductBySKU, + private val fetchProductByIdentifier: FetchProductByIdentifier, private val resourceProvider: ResourceProvider, private val productRepository: ProductDetailRepository, private val variationRepository: VariationDetailRepository, @@ -62,7 +62,7 @@ class ScanToUpdateInventoryViewModel @Inject constructor( private fun handleBarcodeScanningSuccess(status: CodeScannerStatus.Success) = launch { _viewState.value = ViewState.Loading - val productResult: Result = fetchProductBySKU(status.code, status.format) + val productResult: Result = fetchProductByIdentifier(status.code, status.format) if (productResult.isSuccess) { val product = productResult.getOrNull() if (product != null) { diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/list/ProductListFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/list/ProductListFragment.kt index 4100aef1c54..9daa53edf3b 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/list/ProductListFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/list/ProductListFragment.kt @@ -225,7 +225,7 @@ class ProductListFragment : } private fun enableProductsRefresh(enable: Boolean) { - binding.productsRefreshLayout.isEnabled = enable + _binding?.productsRefreshLayout?.isEnabled = enable } private fun initAddProductFab(fabButton: FloatingActionButton) { diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/list/ProductListRepository.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/list/ProductListRepository.kt index aeddc1285b0..7608665bfc9 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/list/ProductListRepository.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/list/ProductListRepository.kt @@ -28,6 +28,7 @@ import org.wordpress.android.fluxc.action.WCProductAction import org.wordpress.android.fluxc.generated.WCProductActionBuilder import org.wordpress.android.fluxc.model.WCProductModel import org.wordpress.android.fluxc.store.WCProductStore +import org.wordpress.android.fluxc.store.WCProductStore.SkuSearchOptions import javax.inject.Inject class ProductListRepository @Inject constructor( @@ -42,7 +43,8 @@ class ProductListRepository @Inject constructor( private const val PRODUCT_PAGE_SIZE = WCProductStore.DEFAULT_PRODUCT_PAGE_SIZE } - private var searchContinuation = ContinuationWrapper>(WooLog.T.PRODUCTS) + private var searchBySKUContinuation = ContinuationWrapper>(WooLog.T.PRODUCTS) + private var searchByGlobalUniqueIdContinuation = ContinuationWrapper>(WooLog.T.PRODUCTS) private var trashContinuation = ContinuationWrapper(WooLog.T.PRODUCTS) private var offset = 0 @@ -132,7 +134,7 @@ class ProductListRepository @Inject constructor( excludedProductIds: List? = null, productFilterOptions: Map = emptyMap(), ): List? { - val result = searchContinuation.callAndWaitUntilTimeout(AppConstants.REQUEST_TIMEOUT) { + val result = searchBySKUContinuation.callAndWaitUntilTimeout(AppConstants.REQUEST_TIMEOUT) { offset = if (loadMore) offset + PRODUCT_PAGE_SIZE else 0 lastSearchQuery = searchQuery lastIsSkuSearch = skuSearchOptions @@ -155,6 +157,32 @@ class ProductListRepository @Inject constructor( } } + suspend fun searchProductListByGlobalUniqueId( + globalUniqueId: String, + loadMore: Boolean = false, + excludedProductIds: List? = null, + productFilterOptions: Map = emptyMap(), + ): List? { + val result = searchByGlobalUniqueIdContinuation.callAndWaitUntilTimeout(AppConstants.REQUEST_TIMEOUT) { + offset = if (loadMore) offset + PRODUCT_PAGE_SIZE else 0 + val payload = WCProductStore.SearchProductsByGlobalUniqueIdPayload( + site = selectedSite.get(), + globalUniqueId = globalUniqueId, + pageSize = PRODUCT_PAGE_SIZE, + offset = offset, + sorting = productSortingChoice, + excludedProductIds = excludedProductIds, + filterOptions = productFilterOptions + ) + dispatcher.dispatch(WCProductActionBuilder.newSearchProductsByGlobalUniqueIdAction(payload)) + } + + return when (result) { + is ContinuationWrapper.ContinuationResult.Cancellation -> null + is ContinuationWrapper.ContinuationResult.Success -> result.value + } + } + /** * Dispatches a request to trash a specific product */ @@ -241,12 +269,18 @@ class ProductListRepository @Inject constructor( @Suppress("unused") @Subscribe(threadMode = ThreadMode.MAIN) fun onProductsSearched(event: WCProductStore.OnProductsSearched) { + val continuation = if (event.globalUniqueIdSearchQuery != null) { + searchByGlobalUniqueIdContinuation + } else { + searchBySKUContinuation + } + if (event.isError) { - searchContinuation.continueWith(emptyList()) + continuation.continueWith(emptyList()) } else { canLoadMoreProducts = event.canLoadMore val products = event.searchResults.map { it.toAppModel() } - searchContinuation.continueWith(products) + continuation.continueWith(products) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/variations/selector/VariationListHandler.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/variations/selector/VariationListHandler.kt index d38947fdda8..30ca51f878c 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/variations/selector/VariationListHandler.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/products/variations/selector/VariationListHandler.kt @@ -6,7 +6,7 @@ import javax.inject.Inject class VariationListHandler @Inject constructor(private val repository: VariationSelectorRepository) { companion object { - private const val PAGE_SIZE = 10 + private const val PAGE_SIZE = 25 } private val mutex = Mutex() @@ -15,8 +15,15 @@ class VariationListHandler @Inject constructor(private val repository: Variation fun getVariationsFlow(productId: Long) = repository.observeVariations(productId) - fun canLoadMore(): Boolean { - return canLoadMore + suspend fun resetState() { + mutex.withLock { + offset = 0 + canLoadMore = false + } + } + + fun canLoadMore(numOfVariations: Int): Boolean { + return canLoadMore || (offset + PAGE_SIZE < numOfVariations) } suspend fun fetchVariations(productId: Long, forceRefresh: Boolean = false): Result = mutex.withLock { @@ -41,8 +48,4 @@ class VariationListHandler @Inject constructor(private val repository: Variation offset += PAGE_SIZE }.map { } } - - fun resetLoadMoreState() { - canLoadMore = false - } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentNavigation.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentNavigation.kt new file mode 100644 index 00000000000..097b6275c1b --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentNavigation.kt @@ -0,0 +1,43 @@ +package com.woocommerce.android.ui.woopos.cashpayment + +import androidx.compose.animation.slideInHorizontally +import androidx.compose.animation.slideOutHorizontally +import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavType +import androidx.navigation.compose.composable +import androidx.navigation.navArgument +import com.woocommerce.android.ui.woopos.home.HOME_ROUTE +import com.woocommerce.android.ui.woopos.root.navigation.WooPosNavigationEvent + +const val CASH_ROUTE_ORDER_ID_KEY = "orderId" +private const val CASH_ROUTE = "$HOME_ROUTE/cash_payment/{$CASH_ROUTE_ORDER_ID_KEY}" + +fun NavController.navigateToCashPaymentScreen(orderId: Long) { + navigate(CASH_ROUTE.replace("{$CASH_ROUTE_ORDER_ID_KEY}", orderId.toString())) +} + +fun NavGraphBuilder.cashPaymentScreen( + onNavigationEvent: (WooPosNavigationEvent) -> Unit +) { + composable( + route = CASH_ROUTE, + arguments = listOf( + navArgument(CASH_ROUTE_ORDER_ID_KEY) { type = NavType.LongType } + ), + enterTransition = { + slideInHorizontally( + initialOffsetX = { fullWidth -> fullWidth }, + ) + }, + exitTransition = { + slideOutHorizontally( + targetOffsetX = { fullWidth -> fullWidth }, + ) + }, + ) { backStackEntry -> + WooPosCashPaymentScreen( + onNavigationEvent = onNavigationEvent, + ) + } +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentRepository.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentRepository.kt new file mode 100644 index 00000000000..fcaf1f4154f --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentRepository.kt @@ -0,0 +1,61 @@ +package com.woocommerce.android.ui.woopos.cashpayment + +import com.woocommerce.android.model.Order +import com.woocommerce.android.model.OrderMapper +import com.woocommerce.android.tools.SelectedSite +import com.woocommerce.android.util.WooLog +import com.woocommerce.android.util.WooLog.T +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.filterIsInstance +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.withContext +import org.wordpress.android.fluxc.model.WCOrderStatusModel +import org.wordpress.android.fluxc.store.WCGatewayStore +import org.wordpress.android.fluxc.store.WCOrderStore +import javax.inject.Inject + +class WooPosCashPaymentRepository @Inject constructor( + private val selectedSite: SelectedSite, + private val orderStore: WCOrderStore, + private val orderMapper: OrderMapper, + private val gatewayStore: WCGatewayStore, +) { + suspend fun getOrderById(orderId: Long) = withContext(Dispatchers.IO) { + orderStore.getOrderByIdAndSite(orderId, selectedSite.get())?.let { + orderMapper.toAppModel(it) + } + } + + suspend fun completeOrder(orderId: Long): Result = withContext(Dispatchers.IO) { + val codGateway = gatewayStore.getGateway(selectedSite.get(), CASH_ON_DELIVERY_PAYMENT_TYPE) + + val statusModel = orderStore.getOrderStatusForSiteAndKey( + selectedSite.get(), + Order.Status.Completed.value + ) ?: WCOrderStatusModel(statusKey = Order.Status.Completed.value).apply { + label = statusKey + } + + orderStore.updateOrderStatusAndPaymentMethod( + orderId = orderId, + site = selectedSite.get(), + newStatus = statusModel, + newPaymentMethodId = CASH_ON_DELIVERY_PAYMENT_TYPE, + newPaymentMethodTitle = codGateway?.title ?: "Pay in Person", + ) + .filterIsInstance() + .map { result -> + if (result.event.isError) { + WooLog.e(T.POS, "Order completion failed - ${result.event.error.message}") + Result.failure(Exception(result.event.error.message)) + } else { + Result.success(Unit) + } + }.first() + } + + private companion object { + const val CASH_ON_DELIVERY_PAYMENT_TYPE = "cod" + } +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentScreen.kt new file mode 100644 index 00000000000..2e4e8f8363d --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentScreen.kt @@ -0,0 +1,213 @@ +package com.woocommerce.android.ui.woopos.cashpayment + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.material.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.constraintlayout.compose.ConstraintLayout +import androidx.hilt.navigation.compose.hiltViewModel +import com.woocommerce.android.R +import com.woocommerce.android.ui.woopos.common.composeui.WooPosPreview +import com.woocommerce.android.ui.woopos.common.composeui.WooPosTheme +import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosButton +import com.woocommerce.android.ui.woopos.common.composeui.toAdaptivePadding +import com.woocommerce.android.ui.woopos.root.navigation.WooPosNavigationEvent + +@Composable +fun WooPosCashPaymentScreen(onNavigationEvent: (WooPosNavigationEvent) -> Unit) { + val viewModel = hiltViewModel() + val state = viewModel.state.collectAsState().value + + WooPosCashPaymentScreen( + state = state, + onAmountChanged = { viewModel.onUIEvent(WooPosCashPaymentUIEvent.AmountChanged(it)) }, + onCompleteOrderClicked = { viewModel.onUIEvent(WooPosCashPaymentUIEvent.CompleteOrderClicked) }, + onBackClicked = { onNavigationEvent(WooPosNavigationEvent.BackFromCashPayment) }, + onOrderComplete = { onNavigationEvent(WooPosNavigationEvent.OpenHomeFromCashPaymentAfterSuccessfulPayment) }, + ) +} + +@Composable +fun WooPosCashPaymentScreen( + state: WooPosCashPaymentState, + onAmountChanged: (String) -> Unit, + onCompleteOrderClicked: () -> Unit, + onBackClicked: () -> Unit, + onOrderComplete: () -> Unit, +) { + Column( + modifier = Modifier + .fillMaxSize() + ) { + Toolbar(onBackClicked) + + when (state) { + is WooPosCashPaymentState.Collecting -> { + Collecting( + state = state, + onAmountChanged = onAmountChanged, + onCompleteOrderClicked = onCompleteOrderClicked, + ) + } + + WooPosCashPaymentState.Complete -> onOrderComplete() + WooPosCashPaymentState.Initiating -> { + // show nothing + } + } + } +} + +@Composable +private fun Collecting( + state: WooPosCashPaymentState.Collecting, + onAmountChanged: (String) -> Unit, + onCompleteOrderClicked: () -> Unit, +) { + Box( + modifier = Modifier.fillMaxSize() + ) { + Column( + modifier = Modifier + .width(540.dp) + .padding(32.dp) + ) { + Spacer(modifier = Modifier.weight(1f)) + + Text( + text = "Cash payment", + style = MaterialTheme.typography.h2, + ) + + Spacer(modifier = Modifier.height(16.dp)) + + Text( + text = "Total", + style = MaterialTheme.typography.h5, + ) + + Spacer(modifier = Modifier.height(8.dp)) + + Text( + text = state.total, + style = MaterialTheme.typography.h6, + ) + + Spacer(modifier = Modifier.height(16.dp)) + + Text( + text = "Change due", + style = MaterialTheme.typography.h5, + ) + + Spacer(modifier = Modifier.height(8.dp)) + + Text( + text = state.changeDue, + style = MaterialTheme.typography.h5, + ) + + Spacer(modifier = Modifier.height(16.dp)) + + TextField( + value = state.enteredAmount, + onValueChange = onAmountChanged, + label = { Text("Given amount") }, + ) + + Spacer(modifier = Modifier.height(16.dp)) + + WooPosButton( + text = state.button.text, + onClick = onCompleteOrderClicked, + enabled = state.button.status == WooPosCashPaymentState.Collecting.Button.Status.ENABLED, + ) + + Spacer(modifier = Modifier.weight(1f)) + } + } +} + +@Composable +private fun Toolbar(onBackClicked: () -> Unit) { + ConstraintLayout( + modifier = Modifier + .fillMaxWidth() + .padding(top = 40.dp.toAdaptivePadding()) + .height(40.dp) + ) { + val (backButton, title) = createRefs() + IconButton( + onClick = { onBackClicked() }, + modifier = Modifier + .constrainAs(backButton) { + start.linkTo(parent.start) + top.linkTo(parent.top) + centerVerticallyTo(parent) + } + .padding(start = 8.dp.toAdaptivePadding()) + ) { + Icon( + imageVector = ImageVector.vectorResource(R.drawable.ic_back_24dp), + contentDescription = stringResource(R.string.woopos_cart_back_content_description), + tint = MaterialTheme.colors.onBackground, + modifier = Modifier.size(28.dp) + ) + } + + val iconTitlePadding = 8.dp.toAdaptivePadding() + Text( + text = stringResource(R.string.woopos_cash_payment_title), + style = MaterialTheme.typography.h4, + color = MaterialTheme.colors.onBackground, + fontWeight = FontWeight.Bold, + maxLines = 1, + modifier = Modifier + .constrainAs(title) { + top.linkTo(backButton.top) + start.linkTo(backButton.end, margin = iconTitlePadding) + centerVerticallyTo(parent) + } + ) + } +} + +@WooPosPreview +@Composable +fun WooPosTotalsPaymentCashScreenScreen() { + WooPosTheme { + WooPosCashPaymentScreen( + state = WooPosCashPaymentState.Collecting( + enteredAmount = "5$", + changeDue = "5$", + total = "10$", + button = WooPosCashPaymentState.Collecting.Button( + text = "Complete order", + status = WooPosCashPaymentState.Collecting.Button.Status.ENABLED + ) + ), + onAmountChanged = {}, + onCompleteOrderClicked = {}, + onBackClicked = {}, + onOrderComplete = {}, + ) + } +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentState.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentState.kt new file mode 100644 index 00000000000..6bc80795122 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentState.kt @@ -0,0 +1,31 @@ +package com.woocommerce.android.ui.woopos.cashpayment + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +sealed class WooPosCashPaymentState : Parcelable { + data class Collecting( + val enteredAmount: String, + val changeDue: String, + val total: String, + val button: Button + ) : WooPosCashPaymentState() { + @Parcelize + data class Button( + val text: String, + val status: Status, + ) : Parcelable { + @Parcelize + enum class Status : Parcelable { + ENABLED, + DISABLED, + LOADING + } + } + } + + object Complete : WooPosCashPaymentState() + + object Initiating : WooPosCashPaymentState() +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentUIEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentUIEvent.kt new file mode 100644 index 00000000000..8d83c0904ad --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentUIEvent.kt @@ -0,0 +1,6 @@ +package com.woocommerce.android.ui.woopos.cashpayment + +sealed class WooPosCashPaymentUIEvent { + object CompleteOrderClicked : WooPosCashPaymentUIEvent() + data class AmountChanged(val newAmount: String) : WooPosCashPaymentUIEvent() +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentViewModel.kt new file mode 100644 index 00000000000..c3c91c05e4f --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cashpayment/WooPosCashPaymentViewModel.kt @@ -0,0 +1,77 @@ +package com.woocommerce.android.ui.woopos.cashpayment + +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.woocommerce.android.R +import com.woocommerce.android.ui.woopos.util.format.WooPosFormatPrice +import com.woocommerce.android.viewmodel.ResourceProvider +import com.woocommerce.android.viewmodel.getStateFlow +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch +import java.math.BigDecimal +import javax.inject.Inject + +@HiltViewModel +class WooPosCashPaymentViewModel @Inject constructor( + private val repository: WooPosCashPaymentRepository, + private val priceFormat: WooPosFormatPrice, + private val resourceProvider: ResourceProvider, + savedState: SavedStateHandle, +) : ViewModel() { + private val orderId = savedState.get(CASH_ROUTE_ORDER_ID_KEY)!! + + private val _state = savedState.getStateFlow( + scope = viewModelScope, + initialValue = WooPosCashPaymentState.Initiating, + key = "woo_pos_cash_payment_state" + ) + + val state: StateFlow = _state + + init { + viewModelScope.launch { + val order = repository.getOrderById(orderId)!! + _state.value = WooPosCashPaymentState.Collecting( + enteredAmount = "", + changeDue = priceFormat(BigDecimal.ZERO), + total = priceFormat(order.total), + button = WooPosCashPaymentState.Collecting.Button( + text = resourceProvider.getString(R.string.woopos_complete_cash_order_button), + status = WooPosCashPaymentState.Collecting.Button.Status.ENABLED + ) + ) + } + } + + fun onUIEvent(event: WooPosCashPaymentUIEvent) { + when (event) { + is WooPosCashPaymentUIEvent.AmountChanged -> TODO() + WooPosCashPaymentUIEvent.CompleteOrderClicked -> handleOrderCompletion() + } + } + + private fun handleOrderCompletion() { + viewModelScope.launch { + val stateBeforeCompleting = _state.value as WooPosCashPaymentState.Collecting + _state.value = stateBeforeCompleting.copy( + button = stateBeforeCompleting.button.copy( + status = WooPosCashPaymentState.Collecting.Button.Status.LOADING + ) + ) + + val result = repository.completeOrder(orderId) + if (result.isSuccess) { + _state.value = WooPosCashPaymentState.Complete + } else { + val currentState = _state.value as? WooPosCashPaymentState.Collecting ?: return@launch + _state.value = currentState.copy( + button = currentState.button.copy( + status = WooPosCashPaymentState.Collecting.Button.Status.ENABLED + ) + ) + } + } + } +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeChildToParentCommunication.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeChildToParentCommunication.kt index 9ca39cd5ec3..7fe48efcf47 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeChildToParentCommunication.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeChildToParentCommunication.kt @@ -32,7 +32,7 @@ sealed class ChildToParentEvent { data object FullScreen : ProductsStatusChanged() data object WithCart : ProductsStatusChanged() } - data object NoInternet : ChildToParentEvent() + data class ToastMessageDisplayed(val message: String) : ChildToParentEvent() } interface WooPosChildrenToParentEventReceiver { diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeNavigation.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeNavigation.kt index 6b59231834f..7dd2cc6e583 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeNavigation.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeNavigation.kt @@ -3,17 +3,28 @@ package com.woocommerce.android.ui.woopos.home import androidx.compose.animation.core.FastOutSlowInEasing import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn +import androidx.compose.animation.slideInHorizontally +import androidx.compose.animation.slideOutHorizontally import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import com.woocommerce.android.ui.woopos.root.navigation.WooPosNavigationEvent -private const val HOME_ROUTE = "home" +const val HOME_ROUTE = "home" +const val HOME_PAYMENT_COMPLETED_VIA_CASH_KEY = "home_payment_completed_via_cash_key" fun NavController.navigateToHomeScreen() { navigate(HOME_ROUTE) } +fun NavController.navigateToHomeScreenAfterSuccessfulCashPayment() { + previousBackStackEntry + ?.savedStateHandle + ?.set(HOME_PAYMENT_COMPLETED_VIA_CASH_KEY, true) + + popBackStack() +} + fun NavGraphBuilder.homeScreen( onNavigationEvent: (WooPosNavigationEvent) -> Unit ) { @@ -27,8 +38,27 @@ fun NavGraphBuilder.homeScreen( easing = FastOutSlowInEasing ) ) + }, + exitTransition = { + slideOutHorizontally( + targetOffsetX = { fullWidth -> -fullWidth }, + ) + }, + popEnterTransition = { + slideInHorizontally( + initialOffsetX = { fullWidth -> -fullWidth }, + ) + }, + ) { entry -> + val savedStateHandle = entry.savedStateHandle + val isPaymentCompletedViaCash = savedStateHandle.get(HOME_PAYMENT_COMPLETED_VIA_CASH_KEY) == true + if (isPaymentCompletedViaCash) { + savedStateHandle[HOME_PAYMENT_COMPLETED_VIA_CASH_KEY] = false } - ) { - WooPosHomeScreen(onNavigationEvent) + + WooPosHomeScreen( + isPaymentCompletedViaCash = isPaymentCompletedViaCash, + onNavigationEvent = onNavigationEvent, + ) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeScreen.kt index 11972135e4c..f209bdf1e68 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeScreen.kt @@ -42,20 +42,30 @@ import com.woocommerce.android.ui.woopos.home.toolbar.WooPosFloatingToolbar import com.woocommerce.android.ui.woopos.home.totals.WooPosTotalsScreen import com.woocommerce.android.ui.woopos.home.totals.WooPosTotalsScreenPreview import com.woocommerce.android.ui.woopos.root.navigation.WooPosNavigationEvent +import kotlinx.coroutines.delay import org.wordpress.android.util.ToastUtils @Composable fun WooPosHomeScreen( + isPaymentCompletedViaCash: Boolean, onNavigationEvent: (WooPosNavigationEvent) -> Unit ) { val viewModel: WooPosHomeViewModel = hiltViewModel() val state = viewModel.state.collectAsState().value val context = LocalContext.current + + LaunchedEffect(Unit) { + if (isPaymentCompletedViaCash) { + delay(800) + viewModel.onUIEvent(WooPosHomeUIEvent.OnPaymentCompletedViaCash) + } + } + LaunchedEffect(viewModel.toastEvent) { viewModel.toastEvent.collect { message -> ToastUtils.showToast( context, - context.getString(message.message), + message, ToastUtils.Duration.LONG ) } @@ -112,7 +122,8 @@ private fun WooPosHomeScreen( productsWidthDp = productsWidthAnimatedDp, cartWidthDp = cartWidthDp, totalsWidthDp = totalsWidthAnimatedDp, - onHomeUIEvent, + onHomeUIEvent = onHomeUIEvent, + onNavigationEvent = onNavigationEvent, ) WooPosExitConfirmationDialog( @@ -133,6 +144,7 @@ private fun WooPosHomeScreen( cartWidthDp: Dp, totalsWidthDp: Dp, onHomeUIEvent: (WooPosHomeUIEvent) -> Unit, + onNavigationEvent: (WooPosNavigationEvent) -> Unit, ) { Box( modifier = Modifier @@ -155,7 +167,8 @@ private fun WooPosHomeScreen( ) WooPosHomeScreenTotals( modifier = Modifier - .width(totalsWidthDp) + .width(totalsWidthDp), + onNavigationEvent = onNavigationEvent, ) } @@ -201,11 +214,17 @@ private fun WooPosHomeScreenCart(modifier: Modifier) { } @Composable -private fun WooPosHomeScreenTotals(modifier: Modifier) { +private fun WooPosHomeScreenTotals( + modifier: Modifier, + onNavigationEvent: (WooPosNavigationEvent) -> Unit +) { if (isPreviewMode()) { WooPosTotalsScreenPreview(modifier) } else { - WooPosTotalsScreen(modifier) + WooPosTotalsScreen( + modifier = modifier, + onNavigationEvent = onNavigationEvent + ) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeUIEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeUIEvent.kt index 0c5fdbeeb7b..47647b51cee 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeUIEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeUIEvent.kt @@ -4,4 +4,5 @@ sealed class WooPosHomeUIEvent { data object SystemBackClicked : WooPosHomeUIEvent() data object ExitConfirmationDialogDismissed : WooPosHomeUIEvent() data object DismissProductsInfoDialog : WooPosHomeUIEvent() + data object OnPaymentCompletedViaCash : WooPosHomeUIEvent() } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeViewModel.kt index a6931e94369..f68e85ee473 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/WooPosHomeViewModel.kt @@ -1,10 +1,11 @@ package com.woocommerce.android.ui.woopos.home -import androidx.annotation.StringRes import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.woocommerce.android.R +import com.woocommerce.android.ui.woopos.home.WooPosHomeState.ExitConfirmationDialog +import com.woocommerce.android.ui.woopos.home.WooPosHomeState.ProductsInfoDialog +import com.woocommerce.android.ui.woopos.home.WooPosHomeState.ScreenPositionState import com.woocommerce.android.viewmodel.getStateFlow import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow @@ -23,19 +24,15 @@ class WooPosHomeViewModel @Inject constructor( scope = viewModelScope, key = "home_state", initialValue = WooPosHomeState( - screenPositionState = WooPosHomeState.ScreenPositionState.Cart.Visible, - productsInfoDialog = WooPosHomeState.ProductsInfoDialog(isVisible = false), - exitConfirmationDialog = WooPosHomeState.ExitConfirmationDialog(isVisible = false), + screenPositionState = ScreenPositionState.Cart.Visible, + productsInfoDialog = ProductsInfoDialog(isVisible = false), + exitConfirmationDialog = ExitConfirmationDialog(isVisible = false), ) ) val state: StateFlow = _state - private val _toastEvent = MutableSharedFlow() - val toastEvent: SharedFlow = _toastEvent - - data class Toast( - @StringRes val message: Int, - ) + private val _toastEvent = MutableSharedFlow() + val toastEvent: SharedFlow = _toastEvent init { listenBottomEvents() @@ -45,23 +42,22 @@ class WooPosHomeViewModel @Inject constructor( return when (event) { WooPosHomeUIEvent.SystemBackClicked -> { when (_state.value.screenPositionState) { - WooPosHomeState.ScreenPositionState.Checkout.NotPaid -> { + ScreenPositionState.Checkout.NotPaid -> { _state.value = _state.value.copy( - screenPositionState = WooPosHomeState.ScreenPositionState.Cart.Visible + screenPositionState = ScreenPositionState.Cart.Visible ) sendEventToChildren(ParentToChildrenEvent.BackFromCheckoutToCartClicked) } - WooPosHomeState.ScreenPositionState.Checkout.Paid -> { + ScreenPositionState.Checkout.Paid -> { _state.value = _state.value.copy( - screenPositionState = WooPosHomeState.ScreenPositionState.Cart.Visible + screenPositionState = ScreenPositionState.Cart.Visible ) - sendEventToChildren(ParentToChildrenEvent.OrderSuccessfullyPaid) } - is WooPosHomeState.ScreenPositionState.Cart -> { + is ScreenPositionState.Cart -> { _state.value = _state.value.copy( - exitConfirmationDialog = WooPosHomeState.ExitConfirmationDialog(isVisible = true) + exitConfirmationDialog = ExitConfirmationDialog(isVisible = true) ) } } @@ -69,15 +65,17 @@ class WooPosHomeViewModel @Inject constructor( WooPosHomeUIEvent.ExitConfirmationDialogDismissed -> { _state.value = _state.value.copy( - exitConfirmationDialog = WooPosHomeState.ExitConfirmationDialog(isVisible = false) + exitConfirmationDialog = ExitConfirmationDialog(isVisible = false) ) } WooPosHomeUIEvent.DismissProductsInfoDialog -> { _state.value = _state.value.copy( - productsInfoDialog = WooPosHomeState.ProductsInfoDialog(isVisible = false) + productsInfoDialog = ProductsInfoDialog(isVisible = false) ) } + + WooPosHomeUIEvent.OnPaymentCompletedViaCash -> onOrderSuccessfullyPaid() } } @@ -87,14 +85,14 @@ class WooPosHomeViewModel @Inject constructor( when (event) { is ChildToParentEvent.CheckoutClicked -> { _state.value = _state.value.copy( - screenPositionState = WooPosHomeState.ScreenPositionState.Checkout.NotPaid + screenPositionState = ScreenPositionState.Checkout.NotPaid ) sendEventToChildren(ParentToChildrenEvent.CheckoutClicked(event.itemClickedDataList)) } is ChildToParentEvent.BackFromCheckoutToCartClicked -> { _state.value = _state.value.copy( - screenPositionState = WooPosHomeState.ScreenPositionState.Cart.Visible + screenPositionState = ScreenPositionState.Cart.Visible ) } @@ -106,20 +104,15 @@ class WooPosHomeViewModel @Inject constructor( is ChildToParentEvent.NewTransactionClicked -> { _state.value = _state.value.copy( - screenPositionState = WooPosHomeState.ScreenPositionState.Cart.Visible + screenPositionState = ScreenPositionState.Cart.Visible ) - sendEventToChildren(ParentToChildrenEvent.OrderSuccessfullyPaid) } - is ChildToParentEvent.OrderSuccessfullyPaid -> { - _state.value = _state.value.copy( - screenPositionState = WooPosHomeState.ScreenPositionState.Checkout.Paid - ) - } + is ChildToParentEvent.OrderSuccessfullyPaid -> onOrderSuccessfullyPaid() ChildToParentEvent.ExitPosClicked -> { _state.value = _state.value.copy( - exitConfirmationDialog = WooPosHomeState.ExitConfirmationDialog(isVisible = true) + exitConfirmationDialog = ExitConfirmationDialog(isVisible = true) ) } @@ -127,13 +120,13 @@ class WooPosHomeViewModel @Inject constructor( ChildToParentEvent.ProductsDialogInfoIconClicked -> { _state.value = _state.value.copy( - productsInfoDialog = WooPosHomeState.ProductsInfoDialog(isVisible = true) + productsInfoDialog = ProductsInfoDialog(isVisible = true) ) } - ChildToParentEvent.NoInternet -> { + is ChildToParentEvent.ToastMessageDisplayed -> { viewModelScope.launch { - _toastEvent.emit(Toast(R.string.woopos_no_internet_message)) + _toastEvent.emit(event.message) } } } @@ -146,18 +139,18 @@ class WooPosHomeViewModel @Inject constructor( val newScreenPositionState = when (event) { ChildToParentEvent.ProductsStatusChanged.FullScreen -> { when (screenPosition) { - is WooPosHomeState.ScreenPositionState.Cart -> WooPosHomeState.ScreenPositionState.Cart.Hidden - is WooPosHomeState.ScreenPositionState.Checkout -> screenPosition + is ScreenPositionState.Cart -> ScreenPositionState.Cart.Hidden + is ScreenPositionState.Checkout -> screenPosition } } ChildToParentEvent.ProductsStatusChanged.WithCart -> { when (screenPosition) { - WooPosHomeState.ScreenPositionState.Cart.Hidden -> - WooPosHomeState.ScreenPositionState.Cart.Visible + ScreenPositionState.Cart.Hidden -> + ScreenPositionState.Cart.Visible - WooPosHomeState.ScreenPositionState.Cart.Visible, - WooPosHomeState.ScreenPositionState.Checkout.NotPaid, - WooPosHomeState.ScreenPositionState.Checkout.Paid -> screenPosition + ScreenPositionState.Cart.Visible, + ScreenPositionState.Checkout.NotPaid, + ScreenPositionState.Checkout.Paid -> screenPosition } } } @@ -169,4 +162,11 @@ class WooPosHomeViewModel @Inject constructor( parentToChildrenEventSender.sendToChildren(event) } } + + private fun onOrderSuccessfullyPaid() { + _state.value = _state.value.copy( + screenPositionState = ScreenPositionState.Checkout.Paid + ) + sendEventToChildren(ParentToChildrenEvent.OrderSuccessfullyPaid) + } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsList.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsList.kt index 4240fdfec42..ccef08f1995 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsList.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsList.kt @@ -72,7 +72,7 @@ fun WooPosItemList( when (product) { is SimpleProduct -> { ProductItem( - modifier = Modifier.animateItemPlacement(), + modifier = Modifier.animateItem(), item = product, onItemClicked = onItemClicked ) @@ -80,7 +80,7 @@ fun WooPosItemList( is VariableProduct -> { VariableProductItem( - modifier = Modifier.animateItemPlacement(), + modifier = Modifier.animateItem(), item = product, onItemClicked = onItemClicked ) @@ -88,7 +88,7 @@ fun WooPosItemList( is Variation -> { VariationItem( - modifier = Modifier.animateItemPlacement(), + modifier = Modifier.animateItem(), item = product, onItemClicked = onItemClicked ) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModel.kt index 91f5511daa8..43fe26eeb25 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/WooPosItemsViewModel.kt @@ -183,7 +183,13 @@ class WooPosItemsViewModel @Inject constructor( result.productsResult.isSuccess -> { val products = result.productsResult.getOrThrow() if (products.isNotEmpty()) { - products.toContentState() + products.toContentState( + paginationState = if (loadMoreProductsJob?.isActive == true) { + PaginationState.Loading + } else { + PaginationState.None + } + ) } else { WooPosItemsViewState.Empty() } @@ -205,7 +211,9 @@ class WooPosItemsViewModel @Inject constructor( is WooPosItemsViewState.Empty -> state.copy(reloadingProductsWithPullToRefresh = true) } - private suspend fun List.toContentState() = WooPosItemsViewState.Content( + private suspend fun List.toContentState( + paginationState: PaginationState = PaginationState.None + ) = WooPosItemsViewState.Content( items = map { product -> if (product.isVariable()) { VariableProduct( @@ -225,7 +233,7 @@ class WooPosItemsViewModel @Inject constructor( ) } }, - paginationState = PaginationState.None, + paginationState = paginationState, reloadingProductsWithPullToRefresh = false, bannerState = WooPosItemsViewState.Content.BannerState( isBannerHiddenByUser = isBannerHiddenByUser(), diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/VariationsLRUCache.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/VariationsLRUCache.kt index a13ffbf5878..2caac421aa6 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/VariationsLRUCache.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/VariationsLRUCache.kt @@ -1,48 +1,23 @@ package com.woocommerce.android.ui.woopos.home.items.variations +import android.util.LruCache import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock -class VariationsLRUCache(private val maxSize: Int) { - - companion object { - private const val LOAD_FACTOR = 0.75f - } - private val cache = object : LinkedHashMap(maxSize, LOAD_FACTOR, true) { - override fun removeEldestEntry(eldest: Map.Entry): Boolean { - return size > maxSize - } - } +class VariationsLRUCache(maxSize: Int) { + private val cache = LruCache(maxSize) private val mutex = Mutex() suspend fun get(key: K): V? { return mutex.withLock { - cache[key] + cache.get(key) } } suspend fun put(key: K, value: V) { mutex.withLock { - cache[key] = value - } - } - - suspend fun remove(key: K) { - mutex.withLock { - cache.remove(key) - } - } - - suspend fun clear() { - mutex.withLock { - cache.clear() - } - } - - suspend fun containsKey(key: K): Boolean { - return mutex.withLock { - cache.containsKey(key) + cache.put(key, value) } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsDataSource.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsDataSource.kt index b27e477c28e..8910f1edf88 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsDataSource.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsDataSource.kt @@ -9,7 +9,6 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn -import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext import javax.inject.Inject import javax.inject.Singleton @@ -19,20 +18,21 @@ class WooPosVariationsDataSource @Inject constructor( private val handler: VariationListHandler ) { private val variationCache = VariationsLRUCache>(maxSize = 50) - private val cacheMutex = kotlinx.coroutines.sync.Mutex() private suspend fun getCachedVariations(productId: Long): List { - return cacheMutex.withLock { variationCache.get(productId) ?: emptyList() } + return variationCache.get(productId) ?: emptyList() } private suspend fun updateCache(productId: Long, variations: List) { - cacheMutex.withLock { - variationCache.put(productId, variations) - } + variationCache.put(productId, variations) + } + + suspend fun resetState() { + handler.resetState() } - fun canLoadMore(): Boolean { - return handler.canLoadMore() + fun canLoadMore(numOfVariations: Int): Boolean { + return handler.canLoadMore(numOfVariations) } fun fetchFirstPage( @@ -76,10 +76,6 @@ class WooPosVariationsDataSource @Inject constructor( ) } } - - fun resetLoadMoreState() { - handler.resetLoadMoreState() - } } private fun Result.logFailure() { diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsScreen.kt index 29fb025699f..2c668fef7d5 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsScreen.kt @@ -53,8 +53,9 @@ fun WooPosVariationsScreen( variableProductData: VariableProductData, onBackClicked: () -> Unit ) { - val viewModel: WooPosVariationsViewModel = hiltViewModel() - + val viewModel: WooPosVariationsViewModel = hiltViewModel( + key = variableProductData.id.toString() + ) LaunchedEffect(variableProductData.id) { viewModel.init(variableProductData.id) } @@ -66,7 +67,12 @@ fun WooPosVariationsScreen( viewModel.onUIEvent(WooPosVariationsUIEvents.OnItemClicked(productId, variationId)) }, onEndOfItemListReached = { - viewModel.onUIEvent(WooPosVariationsUIEvents.EndOfItemsListReached(variableProductData.id)) + viewModel.onUIEvent( + WooPosVariationsUIEvents.EndOfItemsListReached( + variableProductData.id, + variableProductData.numOfVariations + ) + ) }, onPullToRefresh = { viewModel.onUIEvent(WooPosVariationsUIEvents.PullToRefreshTriggered(variableProductData.id)) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsUIEvents.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsUIEvents.kt index 322ae5460f3..7d3eae2b25f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsUIEvents.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsUIEvents.kt @@ -1,7 +1,7 @@ package com.woocommerce.android.ui.woopos.home.items.variations sealed class WooPosVariationsUIEvents { - data class EndOfItemsListReached(val productId: Long) : WooPosVariationsUIEvents() + data class EndOfItemsListReached(val productId: Long, val numOfVariations: Int) : WooPosVariationsUIEvents() data class PullToRefreshTriggered(val productId: Long) : WooPosVariationsUIEvents() data class VariationsLoadingErrorRetryButtonClicked(val productId: Long) : WooPosVariationsUIEvents() data class OnItemClicked(val productId: Long, val variationId: Long) : WooPosVariationsUIEvents() diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsViewModel.kt index 149bb707a4b..3349356f1ba 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/items/variations/WooPosVariationsViewModel.kt @@ -1,5 +1,6 @@ package com.woocommerce.android.ui.woopos.home.items.variations +import androidx.annotation.VisibleForTesting import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.woocommerce.android.model.ProductVariation @@ -37,31 +38,31 @@ class WooPosVariationsViewModel @Inject constructor( initialValue = _viewState.value, ) - private var flowJob: Job? = null - private var loadMoreJob: Job? = null + private var fetchJob: Job? = null - fun init(productId: Long, withPullToRefresh: Boolean = false, withCart: Boolean = true) { - resetState() + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal var loadMoreJob: Job? = null + + fun init(productId: Long) { + viewModelScope.launch { + variationsDataSource.resetState() + } loadVariations( productId = productId, - withPullToRefresh = withPullToRefresh, - withCart = withCart, + withPullToRefresh = false, + withCart = true, forceRefresh = false ) } - private fun resetState() { - flowJob?.cancel() - variationsDataSource.resetLoadMoreState() - } - private fun loadVariations( productId: Long, forceRefresh: Boolean, withPullToRefresh: Boolean, withCart: Boolean, ) { - viewModelScope.launch { + fetchJob?.cancel() + fetchJob = viewModelScope.launch { _viewState.value = if (withPullToRefresh) { buildProductsReloadingState() } else { @@ -90,6 +91,11 @@ class WooPosVariationsViewModel @Inject constructor( price = priceFormat(it.price), imageUrl = it.image?.source ) + }, + paginationState = if (loadMoreJob?.isActive == true) { + PaginationState.Loading + } else { + PaginationState.None } ) } else { @@ -131,13 +137,13 @@ class WooPosVariationsViewModel @Inject constructor( is WooPosVariationsViewState.Empty -> state.copy(reloadingProductsWithPullToRefresh = true) } - private fun loadMore(productId: Long) { + private fun loadMore(productId: Long, numOfVariations: Int) { val currentState = _viewState.value if (currentState !is WooPosVariationsViewState.Content) { return } - if (!variationsDataSource.canLoadMore()) { + if (!variationsDataSource.canLoadMore(numOfVariations)) { return } @@ -167,7 +173,7 @@ class WooPosVariationsViewModel @Inject constructor( fun onUIEvent(event: WooPosVariationsUIEvents) { when (event) { is WooPosVariationsUIEvents.EndOfItemsListReached -> { - onEndOfVariationsListReached(event.productId) + onEndOfVariationsListReached(event.productId, event.numOfVariations) } is WooPosVariationsUIEvents.PullToRefreshTriggered -> { @@ -196,7 +202,7 @@ class WooPosVariationsViewModel @Inject constructor( viewModelScope.launch { fromChildToParentEventSender.sendToParent(event) } } - private fun onEndOfVariationsListReached(productId: Long) { - loadMore(productId) + private fun onEndOfVariationsListReached(productId: Long, numOfVariations: Int) { + loadMore(productId, numOfVariations) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosToolbarViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosToolbarViewModel.kt index 5f83dd9bc22..64853db53ab 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosToolbarViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosToolbarViewModel.kt @@ -16,6 +16,7 @@ import com.woocommerce.android.ui.woopos.home.toolbar.WooPosToolbarUIEvent.OnOut import com.woocommerce.android.ui.woopos.home.toolbar.WooPosToolbarUIEvent.OnToolbarMenuClicked import com.woocommerce.android.ui.woopos.support.WooPosGetSupportFacade import com.woocommerce.android.ui.woopos.util.WooPosNetworkStatus +import com.woocommerce.android.viewmodel.ResourceProvider import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -28,6 +29,7 @@ class WooPosToolbarViewModel @Inject constructor( private val childrenToParentEventSender: WooPosChildrenToParentEventSender, private val getSupportFacade: WooPosGetSupportFacade, private val networkStatus: WooPosNetworkStatus, + private val resourceProvider: ResourceProvider, ) : ViewModel() { private val _state = MutableStateFlow( WooPosToolbarState( @@ -97,7 +99,11 @@ class WooPosToolbarViewModel @Inject constructor( WooPosToolbarState.WooPosCardReaderStatus.NotConnected -> { if (!networkStatus.isConnected()) { viewModelScope.launch { - childrenToParentEventSender.sendToParent(ChildToParentEvent.NoInternet) + childrenToParentEventSender.sendToParent( + ChildToParentEvent.ToastMessageDisplayed( + message = resourceProvider.getString(R.string.woopos_no_internet_message) + ) + ) } } else { cardReaderFacade.connectToReader() diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/WooPosTotalsScreen.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/WooPosTotalsScreen.kt index a6e52b037ea..a257c2aa522 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/WooPosTotalsScreen.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/WooPosTotalsScreen.kt @@ -42,31 +42,47 @@ import com.woocommerce.android.R import com.woocommerce.android.ui.woopos.common.composeui.WooPosPreview import com.woocommerce.android.ui.woopos.common.composeui.WooPosTheme import com.woocommerce.android.ui.woopos.common.composeui.component.Button +import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosButton import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosButtonLarge import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosErrorScreen import com.woocommerce.android.ui.woopos.common.composeui.component.WooPosShimmerBox import com.woocommerce.android.ui.woopos.common.composeui.toAdaptivePadding +import com.woocommerce.android.ui.woopos.home.totals.WooPosTotalsViewState.Totals.CashPaymentAvailability import com.woocommerce.android.ui.woopos.home.totals.payment.receipt.WooPosTotalsPaymentReceiptScreen import com.woocommerce.android.ui.woopos.home.totals.payment.success.WooPosPaymentSuccessScreen +import com.woocommerce.android.ui.woopos.root.navigation.WooPosNavigationEvent import kotlinx.coroutines.delay @Composable -fun WooPosTotalsScreen(modifier: Modifier = Modifier) { +fun WooPosTotalsScreen( + onNavigationEvent: (WooPosNavigationEvent) -> Unit, + modifier: Modifier = Modifier +) { val viewModel: WooPosTotalsViewModel = hiltViewModel() val state = viewModel.state.collectAsState().value - WooPosTotalsScreen(modifier, state, viewModel::onUIEvent) + WooPosTotalsScreen( + modifier = modifier, + state = state, + onUIEvent = viewModel::onUIEvent, + onNavigationEvent = onNavigationEvent + ) } @Composable private fun WooPosTotalsScreen( modifier: Modifier = Modifier, state: WooPosTotalsViewState, - onUIEvent: (WooPosTotalsUIEvent) -> Unit + onUIEvent: (WooPosTotalsUIEvent) -> Unit, + onNavigationEvent: (WooPosNavigationEvent) -> Unit, ) { Box(modifier = modifier) { StateChangeAnimated(visible = state is WooPosTotalsViewState.Totals) { if (state is WooPosTotalsViewState.Totals) { - TotalsLoaded(state = state, onUIEvent = onUIEvent) + TotalsLoaded( + state = state, + onUIEvent = onUIEvent, + onNavigationEvent = onNavigationEvent, + ) } } @@ -124,7 +140,8 @@ private fun StateChangeAnimated( @Composable private fun TotalsLoaded( state: WooPosTotalsViewState.Totals, - onUIEvent: (WooPosTotalsUIEvent) -> Unit + onUIEvent: (WooPosTotalsUIEvent) -> Unit, + onNavigationEvent: (WooPosNavigationEvent) -> Unit, ) { var isButtonVisible by remember { mutableStateOf(false) } @@ -152,6 +169,23 @@ private fun TotalsLoaded( TotalsGrid(state) + when (val cashPaymentAvailability = state.cashPaymentAvailability) { + is CashPaymentAvailability.Available -> { + WooPosButton( + text = stringResource(R.string.woopos_payment_take_cash_payment_label), + onClick = { + onNavigationEvent( + WooPosNavigationEvent.OpenCashPayment( + orderId = cashPaymentAvailability.orderId + ) + ) + }, + ) + } + CashPaymentAvailability.Unavailable -> { + } + } + Spacer(modifier = Modifier.weight(1f)) } @@ -296,8 +330,28 @@ fun WooPosTotalsScreenPreview(modifier: Modifier = Modifier) { orderSubtotalText = "$420.00", orderTotalText = "$462.00", orderTaxText = "$42.00", + cashPaymentAvailability = CashPaymentAvailability.Unavailable ), - onUIEvent = {} + onUIEvent = {}, + onNavigationEvent = {} + ) + } +} + +@Composable +@WooPosPreview +fun WooPosTotalsScreenPreviewWithCashPaymentAvailable() { + WooPosTheme { + WooPosTotalsScreen( + modifier = Modifier, + state = WooPosTotalsViewState.Totals( + orderSubtotalText = "$420.00", + orderTotalText = "$462.00", + orderTaxText = "$42.00", + cashPaymentAvailability = CashPaymentAvailability.Available(orderId = 1) + ), + onUIEvent = {}, + onNavigationEvent = {} ) } } @@ -308,7 +362,8 @@ fun WooPosTotalsScreenLoadingPreview() { WooPosTheme { WooPosTotalsScreen( state = WooPosTotalsViewState.Loading, - onUIEvent = {} + onUIEvent = {}, + onNavigationEvent = {} ) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/WooPosTotalsViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/WooPosTotalsViewModel.kt index 26d28bed983..d61e33cb931 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/WooPosTotalsViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/WooPosTotalsViewModel.kt @@ -8,13 +8,17 @@ import com.woocommerce.android.R import com.woocommerce.android.model.Order import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderFacade import com.woocommerce.android.ui.woopos.cardreader.WooPosCardReaderPaymentStatus +import com.woocommerce.android.ui.woopos.featureflags.WooPosIsCashPaymentsEnabled +import com.woocommerce.android.ui.woopos.featureflags.WooPosIsReceiptsEnabled import com.woocommerce.android.ui.woopos.home.ChildToParentEvent import com.woocommerce.android.ui.woopos.home.ParentToChildrenEvent import com.woocommerce.android.ui.woopos.home.WooPosChildrenToParentEventSender import com.woocommerce.android.ui.woopos.home.WooPosParentToChildrenEventReceiver import com.woocommerce.android.ui.woopos.home.items.WooPosItemsViewModel import com.woocommerce.android.ui.woopos.home.items.navigation.WooPosItemsNavigator -import com.woocommerce.android.ui.woopos.home.totals.payment.receipt.WooPosTotalsPaymentReceiptIsSendingAvailable +import com.woocommerce.android.ui.woopos.home.totals.WooPosTotalsViewState.ReceiptSending +import com.woocommerce.android.ui.woopos.home.totals.payment.receipt.WooPosTotalsPaymentReceiptIsSendingSupported +import com.woocommerce.android.ui.woopos.home.totals.payment.receipt.WooPosTotalsPaymentReceiptIsSendingSupported.Companion.WC_VERSION_SUPPORTS_SENDING_RECEIPTS_BY_EMAIL import com.woocommerce.android.ui.woopos.home.totals.payment.receipt.WooPosTotalsPaymentReceiptRepository import com.woocommerce.android.ui.woopos.util.WooPosNetworkStatus import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent @@ -25,10 +29,14 @@ import com.woocommerce.android.util.WooLog.T import com.woocommerce.android.viewmodel.ResourceProvider import com.woocommerce.android.viewmodel.getStateFlow import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch import kotlinx.parcelize.Parcelize +import java.math.BigDecimal import javax.inject.Inject @HiltViewModel @@ -43,7 +51,9 @@ class WooPosTotalsViewModel @Inject constructor( private val analyticsTracker: WooPosAnalyticsTracker, private val networkStatus: WooPosNetworkStatus, private val wooPosItemsNavigator: WooPosItemsNavigator, - private val isReceiptSendingAvailable: WooPosTotalsPaymentReceiptIsSendingAvailable, + private val isReceiptSendingSupported: WooPosTotalsPaymentReceiptIsSendingSupported, + private val isReceiptsEnabled: WooPosIsReceiptsEnabled, + private val isCashPaymentsEnabled: WooPosIsCashPaymentsEnabled, savedState: SavedStateHandle, ) : ViewModel() { @@ -53,6 +63,10 @@ class WooPosTotalsViewModel @Inject constructor( private val InitialState = WooPosTotalsViewState.Loading } + private val isReceiptSendingSupportedValue: Deferred by lazy { + viewModelScope.async((Dispatchers.IO)) { isReceiptSendingSupported() } + } + private val uiState = savedState.getStateFlow( scope = viewModelScope, initialValue = InitialState, @@ -70,6 +84,8 @@ class WooPosTotalsViewModel @Inject constructor( init { listenUpEvents() listenToPaymentsStatus() + + initIsReceiptSendingSupportedValue() } fun onUIEvent(event: WooPosTotalsUIEvent) { @@ -87,10 +103,23 @@ class WooPosTotalsViewModel @Inject constructor( } WooPosTotalsUIEvent.OnSendReceiptClicked -> sendReceiptByEmail() WooPosTotalsUIEvent.OnStartReceiptFlowClicked -> { - uiState.value = WooPosTotalsViewState.ReceiptSending(email = "") + viewModelScope.launch { + if (isReceiptSendingSupportedValue.await()) { + uiState.value = ReceiptSending(email = "") + } else { + childrenToParentEventSender.sendToParent( + ChildToParentEvent.ToastMessageDisplayed( + message = resourceProvider.getString( + R.string.woopos_receipt_sending_not_supported, + WC_VERSION_SUPPORTS_SENDING_RECEIPTS_BY_EMAIL, + ) + ) + ) + } + } } is WooPosTotalsUIEvent.OnEmailChanged -> { - uiState.value = WooPosTotalsViewState.ReceiptSending(email = event.email) + uiState.value = ReceiptSending(email = event.email) } } } @@ -98,7 +127,11 @@ class WooPosTotalsViewModel @Inject constructor( private fun collectPayment() { if (!networkStatus.isConnected()) { viewModelScope.launch { - childrenToParentEventSender.sendToParent(ChildToParentEvent.NoInternet) + childrenToParentEventSender.sendToParent( + ChildToParentEvent.ToastMessageDisplayed( + message = resourceProvider.getString(R.string.woopos_no_internet_message) + ) + ) } } else { val orderId = dataState.value.orderId @@ -108,7 +141,7 @@ class WooPosTotalsViewModel @Inject constructor( } private fun sendReceiptByEmail() { - val viewState = uiState.value as WooPosTotalsViewState.ReceiptSending + val viewState = uiState.value as ReceiptSending val email = viewState.email val orderId = dataState.value.orderId check(orderId != EMPTY_ORDER_ID) @@ -130,8 +163,9 @@ class WooPosTotalsViewModel @Inject constructor( uiState.value = InitialState } - is ParentToChildrenEvent.ItemClickedInProductSelector, - ParentToChildrenEvent.OrderSuccessfullyPaid -> Unit + ParentToChildrenEvent.OrderSuccessfullyPaid -> showSuccessfulPaymentState() + + is ParentToChildrenEvent.ItemClickedInProductSelector -> Unit } } } @@ -142,19 +176,9 @@ class WooPosTotalsViewModel @Inject constructor( cardReaderFacade.paymentStatus.collect { status -> when (status) { is WooPosCardReaderPaymentStatus.Success -> { - val state = uiState.value wooPosItemsNavigator.sendNavigationEvent( WooPosItemsNavigator.WooPosItemsScreenNavigationEvent.NavigateBackToItemListScreen ) - check(state is WooPosTotalsViewState.Totals) - val orderTotalText = resourceProvider.getString( - R.string.woopos_success_screen_total, - state.orderTotalText - ) - uiState.value = WooPosTotalsViewState.PaymentSuccess( - orderTotalText = orderTotalText, - isReceiptAvailable = isReceiptSendingAvailable() - ) childrenToParentEventSender.sendToParent(ChildToParentEvent.OrderSuccessfullyPaid) } is WooPosCardReaderPaymentStatus.Failure, @@ -171,7 +195,10 @@ class WooPosTotalsViewModel @Inject constructor( totalsRepository.createOrderWithProducts(itemClickedDataList = itemClickedDataList) .fold( onSuccess = { order -> - dataState.value = dataState.value.copy(orderId = order.id) + dataState.value = dataState.value.copy( + orderId = order.id, + orderTotal = order.total + ) uiState.value = buildWooPosTotalsViewState(order) analyticsTracker.track(WooPosAnalyticsEvent.Event.OrderCreationSuccess) }, @@ -192,6 +219,21 @@ class WooPosTotalsViewModel @Inject constructor( } } + private fun showSuccessfulPaymentState() { + viewModelScope.launch { + val state = uiState.value + check(state is WooPosTotalsViewState.Totals) + val orderTotalText = resourceProvider.getString( + R.string.woopos_success_screen_total, + state.orderTotalText + ) + uiState.value = WooPosTotalsViewState.PaymentSuccess( + orderTotalText = orderTotalText, + isReceiptAvailable = isReceiptsEnabled() + ) + } + } + private suspend fun buildWooPosTotalsViewState(order: Order): WooPosTotalsViewState.Totals { val subtotalAmount = order.productsTotal val taxAmount = order.totalTax @@ -201,12 +243,24 @@ class WooPosTotalsViewModel @Inject constructor( orderSubtotalText = priceFormat(subtotalAmount), orderTaxText = priceFormat(taxAmount), orderTotalText = priceFormat(totalAmount), + cashPaymentAvailability = if (isCashPaymentsEnabled()) { + WooPosTotalsViewState.Totals.CashPaymentAvailability.Available(order.id) + } else { + WooPosTotalsViewState.Totals.CashPaymentAvailability.Unavailable + } ) } + private fun initIsReceiptSendingSupportedValue() { + viewModelScope.launch { + isReceiptSendingSupportedValue.await() + } + } + @Parcelize private data class TotalsDataState( val orderId: Long = EMPTY_ORDER_ID, + val orderTotal: BigDecimal? = null, val itemClickedDataList: List = emptyList() ) : Parcelable } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/WooPosTotalsViewState.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/WooPosTotalsViewState.kt index c5b44f4b746..4facabe324b 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/WooPosTotalsViewState.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/WooPosTotalsViewState.kt @@ -11,7 +11,14 @@ sealed class WooPosTotalsViewState : Parcelable { val orderSubtotalText: String, val orderTaxText: String, val orderTotalText: String, - ) : WooPosTotalsViewState() + val cashPaymentAvailability: CashPaymentAvailability, + ) : WooPosTotalsViewState() { + @Parcelize + sealed class CashPaymentAvailability : Parcelable { + data class Available(val orderId: Long) : CashPaymentAvailability() + object Unavailable : CashPaymentAvailability() + } + } data class PaymentSuccess( val orderTotalText: String, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/payment/receipt/WooPosTotalsPaymentReceiptIsSendingAvailable.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/payment/receipt/WooPosTotalsPaymentReceiptIsSendingSupported.kt similarity index 66% rename from WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/payment/receipt/WooPosTotalsPaymentReceiptIsSendingAvailable.kt rename to WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/payment/receipt/WooPosTotalsPaymentReceiptIsSendingSupported.kt index ac269e81514..fe0ceefe584 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/payment/receipt/WooPosTotalsPaymentReceiptIsSendingAvailable.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/totals/payment/receipt/WooPosTotalsPaymentReceiptIsSendingSupported.kt @@ -1,22 +1,15 @@ package com.woocommerce.android.ui.woopos.home.totals.payment.receipt import com.woocommerce.android.extensions.semverCompareTo -import com.woocommerce.android.ui.woopos.featureflags.WooPosIsReceiptsEnabled import com.woocommerce.android.util.GetWooCorePluginCachedVersion import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import javax.inject.Inject -class WooPosTotalsPaymentReceiptIsSendingAvailable @Inject constructor( - private val isReceiptsEnabled: WooPosIsReceiptsEnabled, +class WooPosTotalsPaymentReceiptIsSendingSupported @Inject constructor( private val getWooCoreVersion: GetWooCorePluginCachedVersion, ) { - suspend operator fun invoke() = - if (!isReceiptsEnabled()) { - false - } else { - isWooCoreSupportsSendingReceiptsByEmail() - } + suspend operator fun invoke() = isWooCoreSupportsSendingReceiptsByEmail() private suspend fun isWooCoreSupportsSendingReceiptsByEmail() = withContext(Dispatchers.IO) { val wooCoreVersion = getWooCoreVersion() @@ -27,7 +20,7 @@ class WooPosTotalsPaymentReceiptIsSendingAvailable @Inject constructor( } } - private companion object { + companion object { const val WC_VERSION_SUPPORTS_SENDING_RECEIPTS_BY_EMAIL = "9.5.0" } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosMainFlowGraph.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosMainFlowGraph.kt index df5b0bc35bc..acd9533b364 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosMainFlowGraph.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosMainFlowGraph.kt @@ -2,6 +2,7 @@ package com.woocommerce.android.ui.woopos.root.navigation import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.navigation +import com.woocommerce.android.ui.woopos.cashpayment.cashPaymentScreen import com.woocommerce.android.ui.woopos.home.homeScreen import com.woocommerce.android.ui.woopos.splash.SPLASH_ROUTE import com.woocommerce.android.ui.woopos.splash.splashScreen @@ -17,5 +18,6 @@ fun NavGraphBuilder.mainGraph( ) { splashScreen(onNavigationEvent = onNavigationEvent) homeScreen(onNavigationEvent = onNavigationEvent) + cashPaymentScreen(onNavigationEvent = onNavigationEvent) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosNavigationEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosNavigationEvent.kt index 7c57b8c6838..60e2c69b10d 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosNavigationEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosNavigationEvent.kt @@ -4,4 +4,7 @@ sealed class WooPosNavigationEvent { data object ExitPosClicked : WooPosNavigationEvent() data object BackFromSplashClicked : WooPosNavigationEvent() data object OpenHomeFromSplash : WooPosNavigationEvent() + data class OpenCashPayment(val orderId: Long) : WooPosNavigationEvent() + data object BackFromCashPayment : WooPosNavigationEvent() + data object OpenHomeFromCashPaymentAfterSuccessfulPayment : WooPosNavigationEvent() } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosNavigationEventHandler.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosNavigationEventHandler.kt index 867b71b97f9..29f9e16562d 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosNavigationEventHandler.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/root/navigation/WooPosNavigationEventHandler.kt @@ -2,7 +2,9 @@ package com.woocommerce.android.ui.woopos.root.navigation import androidx.activity.ComponentActivity import androidx.navigation.NavHostController +import com.woocommerce.android.ui.woopos.cashpayment.navigateToCashPaymentScreen import com.woocommerce.android.ui.woopos.home.navigateToHomeScreen +import com.woocommerce.android.ui.woopos.home.navigateToHomeScreenAfterSuccessfulCashPayment fun NavHostController.handleNavigationEvent( event: WooPosNavigationEvent, @@ -13,5 +15,9 @@ fun NavHostController.handleNavigationEvent( is WooPosNavigationEvent.BackFromSplashClicked -> activity.finish() is WooPosNavigationEvent.OpenHomeFromSplash -> navigateToHomeScreen() + is WooPosNavigationEvent.OpenCashPayment -> navigateToCashPaymentScreen(event.orderId) + is WooPosNavigationEvent.BackFromCashPayment -> popBackStack() + is WooPosNavigationEvent.OpenHomeFromCashPaymentAfterSuccessfulPayment -> + navigateToHomeScreenAfterSuccessfulCashPayment() } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/viewmodel/ScopedViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/viewmodel/ScopedViewModel.kt index 66b459af7dc..3650e420abd 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/viewmodel/ScopedViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/viewmodel/ScopedViewModel.kt @@ -12,7 +12,6 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch -import java.io.Closeable import kotlin.coroutines.CoroutineContext /** @@ -23,9 +22,7 @@ import kotlin.coroutines.CoroutineContext */ abstract class ScopedViewModel( protected val savedState: SavedStateHandle, - closeable: Closeable? = null, -) : ViewModel(closeable), CoroutineScope { - +) : ViewModel(), CoroutineScope { protected open val _event: MutableLiveData = MultiLiveEvent() open val event: LiveData = _event diff --git a/WooCommerce/src/main/res/layout/developer_options_list_item.xml b/WooCommerce/src/main/res/layout/developer_options_list_item.xml deleted file mode 100644 index 7729cb6bee0..00000000000 --- a/WooCommerce/src/main/res/layout/developer_options_list_item.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - diff --git a/WooCommerce/src/main/res/layout/developer_options_togglable_item.xml b/WooCommerce/src/main/res/layout/developer_options_togglable_item.xml deleted file mode 100644 index 0da4a34f189..00000000000 --- a/WooCommerce/src/main/res/layout/developer_options_togglable_item.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - diff --git a/WooCommerce/src/main/res/layout/developer_options_update_reader_item.xml b/WooCommerce/src/main/res/layout/developer_options_update_reader_item.xml deleted file mode 100644 index 830d45bb570..00000000000 --- a/WooCommerce/src/main/res/layout/developer_options_update_reader_item.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - diff --git a/WooCommerce/src/main/res/layout/fragment_coupon_list.xml b/WooCommerce/src/main/res/layout/fragment_coupon_list.xml index 1144edfa4c3..0964e3861d4 100644 --- a/WooCommerce/src/main/res/layout/fragment_coupon_list.xml +++ b/WooCommerce/src/main/res/layout/fragment_coupon_list.xml @@ -1,39 +1,25 @@ - - + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintRight_toRightOf="parent" /> diff --git a/WooCommerce/src/main/res/layout/fragment_developer_options.xml b/WooCommerce/src/main/res/layout/fragment_developer_options.xml deleted file mode 100644 index 534bdc1b11c..00000000000 --- a/WooCommerce/src/main/res/layout/fragment_developer_options.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/WooCommerce/src/main/res/navigation/nav_graph_settings.xml b/WooCommerce/src/main/res/navigation/nav_graph_settings.xml index 61d8ba6fdb3..41056b472ce 100644 --- a/WooCommerce/src/main/res/navigation/nav_graph_settings.xml +++ b/WooCommerce/src/main/res/navigation/nav_graph_settings.xml @@ -168,7 +168,7 @@ app:destination="@id/WPComWebViewFragment" /> + خطأ في تحميل الأشكال + \"فشل تحميل مزيد من العناصر. يرجى المحاولة مرة أخرى\". + رجوع + ⁦%1$d⁩ من الأشكال + الشكل %s، الشعر %s + المنتج المتغير %s، السعر %s + يتعذر أن يكون الوصف فارغًا + حثّ على المبادرة + يتعذر أن يكون الشعار فارغًا + تأكد من أن بريدك الإلكتروني صحيح وتحقق مجددًا من مجلد البريد المزعج. + لا يمكننا العثور على حساب ووردبريس.كوم متصلاً باسم المستخدم هذا. يمكنك إدخال بريد إلكتروني لإنشاء حساب جديد. + أدخل كود المرور أو أي معرِّف آخر فريد لهذا المنتج. قد يساعدك ذلك على إدراج هذا المنتج على القنوات الأخرى أو الأسواق. + GTIN، وUPC، وEAN، وISBN + آخر المدفوعات + بعد شراء ملصق، ضع علامة على هذا الطلب على أنه مكتمل وأخطر العميل بذلك. + إذا لم يكن لديك حساب، فإننا سنستخدم هذا البريد الإلكتروني لإنشاء واحد. ظرف صندوق إضافة طرد @@ -30,7 +46,6 @@ Language: ar الأرخص ملصق الشراء ملصق الشراء · ⁦%1$s⁩ - وضع علامة على هذا الطلب على أنه مكتمل وإخطار العميل تكلفة الشحنة تفاصيل الطلب تفاصيل الشحنة @@ -559,7 +574,6 @@ Language: ar اللغة الميزانية تفاصيل - التسوق الآن تحرير الإعلان معاينة تعطيل المزامنة @@ -585,7 +599,6 @@ Language: ar جاهز للترويج تمكين الملايين من مشاهدة منتجاتك استخدام ⁦%1$s⁩ - الوديعة الأخيرة توسيع إجماليات طلبات الطي تحصيل المدفوعات ينبغي أن يكون الكود بتنسيق XXXX-XXXX-XXXX-XXXX @@ -667,9 +680,9 @@ Language: ar الوثائق والملفات الأخرى على الجهاز ✨ إنشاء ملحوظة \"تقديم الشكر إليك\" فرض الضرائب - يتم إيداع الأموال المتوافرة تلقائيًا في كل %s. - يتم إيداع الأموال المتوافرة تلقائيًا في كل يوم. - تصبح الأموال متوافرة بعد تعليقها لمدة %d من الأيام. + يتم دفع الأموال المتوفرة تلقائيًا في كل %s. + يتم دفع الأموال المتوفرة تلقائيًا في كل يوم. + تصبح الأموال متوفرة بعد تعليقها لمدة %d من الأيام. تحديد شكل اختيار الشكل \" %1$s \" -> %2$s @@ -708,19 +721,19 @@ Language: ar الفترة الفاصل الزمني للفوترة تخفيض - غير معروف - فشل - تم الإلغاء - قيد النقل - معلق - مدفوع - المقدَّر - طي/توسيع ملخص الإيداع - معرفة المزيد حول موعد الحصول على أموالك - يتم إيداع الأموال المتوافرة تلقائيًا في كل شهر على %s. - تصبح الأموال متوافرة بعد تعليقها لمدة %d من الأيام. - الأموال المعلّقة - الأموال المتوافرة + غير معروف + فشل + تم الإلغاء + قيد النقل + معلق + مدفوع + المقدَّر + طي/توسيع ملخص المدفوعات + معرفة المزيد حول موعد الحصول على أموالك + يتم دفع الأموال المتوفرة تلقائيًا في كل شهر على %s. + تصبح الأموال متوافرة بعد تعليقها لمدة %d من الأيام. + الأموال المعلّقة + الأموال المتوفرة الضرائب المنتجات إجماليات المدفوعات diff --git a/WooCommerce/src/main/res/values-de/strings.xml b/WooCommerce/src/main/res/values-de/strings.xml index 4abe5086eab..e12c900e51d 100644 --- a/WooCommerce/src/main/res/values-de/strings.xml +++ b/WooCommerce/src/main/res/values-de/strings.xml @@ -1,11 +1,27 @@ + Beim Laden der Varianten ist ein Fehler aufgetreten + „Es ist ein Fehler beim Laden weiterer Artikel aufgetreten. Bitte versuche es erneut.“ + Zurück + %1$d Varianten + Variante: %s, Preis: %s + Variables Produkt: %s, Preis: %s + Beschreibung darf nicht leer sein + Call-to-Action + Untertitel darf nicht leer sein + Stelle sicher, dass deine E-Mail-Adresse korrekt ist, und überprüfe deinen Spam-Ordner. + Wir können kein WordPress.com-Konto finden, das mit diesem Benutzernamen verknüpft ist. Gib eine E-Mail-Adresse ein, um ein neues Konto zu erstellen. + Gib einen Barcode oder einen anderen eindeutigen Identifikator für dieses Produkt ein. So kannst du dieses Produkt auch über andere Kanäle oder Marktplätze anbieten. + GTIN, UPC, EAN, ISBN + LETZTE AUSZAHLUNG + Markiere diese Bestellung nach dem Kauf des Etiketts als abgeschlossen und benachrichtige den Kunden. + Wenn du noch kein Konto hast, benutzen wir diese E-Mail-Adresse, um ein neues zu erstellen. Umschlag Karton Paket hinzufügen @@ -37,7 +53,6 @@ Language: de Paket auswählen, damit Versandtarife angezeigt werden Paket auswählen Versendest du Gefahrgut oder gefährliche Stoffe? - Diese Bestellung als abgeschlossen markieren und den Kunden benachrichtigen Artikelkarte einklappen/aufklappen %1$s  ·  %2$s Nein. @@ -559,7 +574,6 @@ Language: de Sprache Budget Details - Jetzt einkaufen Vorschau Werbung bearbeiten Deaktiviert @@ -585,7 +599,6 @@ Language: de Bereit zum Bewerben Präsentiere deine Produkte Millionen von Interessenten Verwende %1$s - LETZTE AUSZAHLUNG Bestellsumme aufklappen/zuklappen Zahlung empfangen Der Code muss folgendes Format haben: XXXX-XXXX-XXXX-XXXX @@ -667,9 +680,9 @@ Language: de Dokumente und andere Dateien auf dem Gerät ✨ Dankeschön-Nachricht erstellen Steuern erheben - Verfügbares Guthaben wird automatisch an jedem %s ausgezahlt. - Verfügbares Guthaben wird automatisch jeden Tag ausgezahlt. - Guthaben, das seit %d Tagen aussteht, wird zur Verfügung gestellt. + Verfügbares Guthaben wird automatisch an jedem %s ausgezahlt. + Verfügbares Guthaben wird automatisch jeden Tag ausgezahlt. + Guthaben, das seit %d Tagen aussteht, wird zur Verfügung gestellt. Variante auswählen „%1$s“ -> %2$s Bitte wähle eine Variante aus @@ -708,21 +721,21 @@ Language: de Periode Zahlungsintervall Angebot - Unbekannt - Fehlgeschlagen - Abgebrochen - Unterwegs - Ausstehend - Bezahlt - Geschätzt - Zusammenfassung der Auszahlungen aus-/einblenden - Weitere Informationen zum Erhalt deiner Zahlungen - Ausstehendes Guthaben - Verfügbares Guthaben + Unbekannt + Fehlgeschlagen + Abgebrochen + Unterwegs + Ausstehend + Bezahlt + Geschätzt + Zusammenfassung der Auszahlungen aus-/einblenden + Weitere Informationen zum Erhalt deiner Zahlungen Steuern Produkte - Verfügbares Guthaben wird automatisch am %s jedes Monats ausgezahlt. - Guthaben, das seit %d Tag aussteht, wird zur Verfügung gestellt. + Ausstehendes Guthaben + Verfügbares Guthaben + Verfügbares Guthaben wird automatisch am %s jedes Monats ausgezahlt. + Guthaben, das seit %d Tag aussteht, wird zur Verfügung gestellt. Zahlungsübersicht E-Mail-Adresse oder Benutzername Bestellung mit individuellem Betrag konnte nicht erstellt werden diff --git a/WooCommerce/src/main/res/values-es/strings.xml b/WooCommerce/src/main/res/values-es/strings.xml index 125f533d43c..acca62280c0 100644 --- a/WooCommerce/src/main/res/values-es/strings.xml +++ b/WooCommerce/src/main/res/values-es/strings.xml @@ -1,11 +1,27 @@ + Error al cargar variaciones + \"No se han podido cargar más elementos. Inténtalo de nuevo\". + Volver + %1$d variaciones + Variación: %s; Precio: %s + Producto variable: %s; Precio: %s + La descripción no puede estar vacía. + Llamada a la acción + La descripción corta no puede estar vacía. + Comprueba que tu correo electrónico está bien escrito y vuelve a mirar en tu carpeta de spam. + No encontramos una cuenta de WordPress.com asociada a este nombre de usuario. Puedes introducir un correo electrónico para crear una cuenta. + Introduce un código de barras o cualquier otro identificador único de este producto. Podría resultarte útil poner este producto en otros canales o mercados. + GTIN, UPC, EAN o ISBN + ÚLTIMO PAGO + Después de comprar una etiqueta, marca este pedido como completado y notifícaselo al cliente. + Si no tienes una cuenta, usaremos este correo electrónico para crear una. Envoltorio Caja Añadir paquete @@ -30,7 +46,6 @@ Language: es Más barata Etiqueta de compra Etiqueta de compra %1$s - Marcar este pedido como completado y avisar al cliente Coste de envío Detalles del pedido Detalles del envío @@ -559,7 +574,6 @@ Language: es Idioma Presupuesto Detalles - Comprar ahora Editar anuncio Vista previa Desactivado @@ -585,7 +599,6 @@ Language: es Lista para ser promocionada Haz que millones de personas vean tus productos Usa %1$s - ÚLTIMO DEPÓSITO Ampliar contraer total de pedidos Recibir pago El código debe tener el formato XXXX-XXXX-XXXX-XXXX @@ -667,9 +680,9 @@ Language: es Documentos y otros archivos en el dispositivo ✨Crear nota de agradecimiento Cobrar impuestos - Los fondos disponibles se depositan automáticamente, cada %s. - Los fondos disponibles se depositan automáticamente, cada día. - Los fondos estarán disponibles después de estar pendientes durante %d días. + Los fondos disponibles se pagan automáticamente cada %s. + Los fondos disponibles se pagan automáticamente cada día. + Los fondos estarán disponibles después de estar pendientes durante %d días. Seleccionar una variación Elegir variación « %1$s » -> %2$s @@ -708,19 +721,19 @@ Language: es Periodo Intervalo de facturación Oferta - Desconocido - Fallido - Cancelado - En tránsito - Pendiente - De pago - Estimado - Contraer/ampliar resumen de depósitos - Obtén más información acerca de cuándo recibirás tus fondos. - Los fondos disponibles se depositan automáticamente cada mes en %s. - Los fondos estarán disponibles después de estar pendientes durante %d día. - Fondos pendientes - Fondos disponibles + Desconocido + Fallido + Cancelado + En tránsito + Pendiente + De pago + Estimado + Contraer/ampliar el resumen de pagos + Obtén más información acerca de cuándo recibirás tus fondos. + Los fondos disponibles se pagan automáticamente el %s de cada mes. + Los fondos estarán disponibles después de estar pendientes durante %d día. + Fondos pendientes + Fondos disponibles Impuestos Productos Cantidad total del pago diff --git a/WooCommerce/src/main/res/values-fr/strings.xml b/WooCommerce/src/main/res/values-fr/strings.xml index f01f9efa169..a0c7381ed9e 100644 --- a/WooCommerce/src/main/res/values-fr/strings.xml +++ b/WooCommerce/src/main/res/values-fr/strings.xml @@ -1,11 +1,27 @@ + Erreur lors du chargement des variantes + « Échec du chargement d’éléments supplémentaires. Veuillez réessayer. » + Retour + %1$d variantes + Variante %s, prix %s + Produit variable %s, prix %s + La description ne peut pas être vide + Appel à l’action + La description ne peut pas être vide + Assurez-vous que votre adresse e-mail est correcte et vérifiez votre dossier de courrier indésirable. + Nous n’avons pas trouvé de compte WordPress.com relié à cet identifiant. Vous pouvez saisir une adresse e-mail pour créer un nouveau compte. + Saisissez un code-barres ou tout autre identifiant unique à ce produit. Cela peut vous aider à lister ce produit sur d’autres canaux ou places de marché. + GTIN, UPC, EAN, ISBN + DERNIER PAIEMENT + Après l’achat d’une étiquette, marquez cette commande comme terminée et informez-en le client. + Si vous n’avez pas de compte, nous utiliserons cette adresse e-mail pour en créer un. Enveloppe Boîte Ajouter un colis @@ -30,7 +46,6 @@ Language: fr Le moins cher Acheter une étiquette Acheter une étiquette · %1$s - Marquer cette commande comme terminée et informer le client Frais d’expédition Détails de la commande Détails de l’expédition @@ -559,7 +574,6 @@ Language: fr Langue Budget Détails - Acheter maintenant Modifier la publicité Aperçu Désactivé @@ -585,7 +599,6 @@ Language: fr Prêt à promouvoir Faire en sorte que vos produits soient vus par des millions de personnes Utiliser %1$s - DERNIER DÉPÔT Développer / réduire les totaux de commande Percevoir le paiement Le code doit respecter le format XXXX-XXXX-XXXX-XXXX @@ -667,9 +680,9 @@ Language: fr Documents et autres fichiers sur l’appareil ✨ Créer un mot de remerciement Facturer les taxes - Les fonds disponibles sont versés automatiquement, chaque %s. - Les fonds disponibles sont versés automatiquement, chaque jour. - Les fonds sont disponibles après avoir passé %d jours en attente. + Les fonds disponibles sont versés automatiquement, chaque %s. + Les fonds disponibles sont versés automatiquement, chaque jour. + Les fonds sont disponibles après avoir passé %d jours en attente. Sélectionner une variante Sélectionner la variante \" %1$s \" -> %2$s @@ -708,19 +721,19 @@ Language: fr Période Intervalle de facturation Promo - Inconnu - Échec - Annulé - En transit - En attente - Payé - Estimé - Réduire/développer le récapitulatif du dépôt - En savoir plus sur le moment où vous recevrez vos fonds - Les fonds disponibles sont versés automatiquement, tous les %s du mois. - Les fonds sont disponibles après avoir passé %d jour en attente. - Fonds en attente - Fonds disponibles + Inconnu + Échec + Annulé + En transit + En attente + Payé + Estimé + Réduire / développer le récapitulatif du paiement + En savoir plus sur le moment où vous recevrez vos fonds + Les fonds disponibles sont versés automatiquement, tous les %s du mois. + Les fonds sont disponibles après avoir passé %d jour en attente. + Fonds en attente + Fonds disponibles Taxes Produits Totaux des paiements diff --git a/WooCommerce/src/main/res/values-he/strings.xml b/WooCommerce/src/main/res/values-he/strings.xml index 957d48beb9c..ca5fe40b9a1 100644 --- a/WooCommerce/src/main/res/values-he/strings.xml +++ b/WooCommerce/src/main/res/values-he/strings.xml @@ -1,11 +1,27 @@ + שגיאה בטעינת הסוגים + \"הטעינה של פריטים נוספים נכשלה. יש לנסות שוב.\" + חזרה + ⁦%1$d⁩ סוגים + סוג %s, מחיר %s + מוצר עם סוגים %s, מחיר %s + התיאור לא יכול להיות ריק + קריאות לפעולה + תיאור האתר לא יכול להיות ריק + יש לוודא שכתובת האימייל שלך נכונה ולבדוק שוב את התיבה של דואר הזבל. + לא הצלחנו לאתר חשבון WordPress.com שמקושר לשם המשתמש הזה. באפשרותך להזין אימייל כדי ליצור חשבון חדש. + יש להזין ברקוד או כל מזהה אחר ייחודי למוצר הזה. הנתון יעזור לך לרשום את המוצר הזה בערוצים או בשווקים אחרים. + GTIN, ‏UPC, ‏EAN, ‏ISBN + תשלום אחרון + לאחר רכישת תווית, יש לסמן את ההזמנה כ\'הושלמה\' ולהודיע ללקוח. + אם אין לך חשבון, אנחנו נשתמש בכתובת האימייל הזאת כדי ליצור אחד. מעטפה קופסה להוסיף חבילה @@ -30,7 +46,6 @@ Language: he_IL הזול ביותר לרכוש תווית לרכוש תווית ⁦%1$s⁩ - לסמן את ההזמנה כ\'הושלמה\' ולהודיע ללקוח עלות משלוח פרטי הזמנה פרטי המשלוח @@ -559,7 +574,6 @@ Language: he_IL שפה תקציב פרטים - לרכישה כעת לערוך את הפרסומת תצוגה מקדימה נָכֶה @@ -585,7 +599,6 @@ Language: he_IL מוכן לקידום בדרך זו מיליונים יראו את המוצרים שלך להשתמש ב-⁦%1$s⁩ - הפקדה אחרונה להרחיב / לכווץ סכומי הזמנות לגבות תשלום הקוד אמור להיות בפורמט XXXX-XXXX-XXXX-XXXX @@ -667,9 +680,9 @@ Language: he_IL מסמכים וקבצים אחרים במכשיר ✨ליצור פתק תודות לגבות מיסים - כספים זמינים יופקדו באופן אוטומטי, מדי %s. - כספים זמינים יופקדו באופן אוטומטי, מדי יום. - כספים ייעשו זמינים לאחר תקופת המתנה בת %d ימים. + יתרות זמינות משולמות באופן אוטומטי בכל %s. + יתרות זמינות משולמות באופן אוטומטי בכל יום. + היתרות יהיו זמינות לאחר תקופת המתנה בת %d ימים. נא לבחור וריאציה לבחור סוג \" %1$s \" -> %2$s @@ -708,19 +721,19 @@ Language: he_IL פרק זמן תדירות החיוב מבצע - לא ידוע - נכשל - בוטל - במעבר - בהמתנה - שולם - משוער - לכווץ/להרחיב סיכום פיקדון - למידע נוסף על עיתוי הזמינות של הכספים שלך - כספים זמינים יופקדו באופן אוטומטי, ביום ה-%s של כל חודש. - כספים ייעשו זמינים לאחר תקופת המתנה בת יום %d. - כספים בהמתנה לאישור - כספים זמינים + לא ידוע + נכשל + בוטל + במעבר + בהמתנה + שולם + משוער + לכווץ/להרחיב את סיכום התשלום + למידע נוסף על המועד לקבלת היתרות שלך + יתרות זמינות משולמות באופן אוטומטי בכל חודש ביום ה-%s. + היתרות יהיו זמינות לאחר תקופת המתנה בת יום %d. + יתרות בהמתנה לאישור + יתרות זמינות מיסים מוצרים סכומים כוללים לתשלום diff --git a/WooCommerce/src/main/res/values-id/strings.xml b/WooCommerce/src/main/res/values-id/strings.xml index dfa22854789..766b8c2f058 100644 --- a/WooCommerce/src/main/res/values-id/strings.xml +++ b/WooCommerce/src/main/res/values-id/strings.xml @@ -1,11 +1,27 @@ + Error saat memuat variasi + \"Gagal memuat item lain. Harap coba lagi.\" + Kembali + %1$d variasi + Variasi %s, Harga %s + Produk Variabel %s, Harga %s + Deskripsi tidak boleh kosong + Call to action + Slogan tidak boleh kosong + Pastikan email Anda sudah benar dan periksa kembali folder spam Anda. + Kami tidak dapat menemukan akun WordPress.com yang terhubung dengan nama pengguna ini. Anda dapat memasukkan email untuk membuat akun baru. + Masukkan kode batang atau pengenal lainnya yang bersifat unik untuk produk ini. Pengenal semacam ini dapat membantu Anda mencantumkan produk ini di saluran atau marketplace lain. + GTIN, UPC, EAN, atau ISBN + PEMBAYARAN TERAKHIR + Setelah membeli label, tandai pesanan ini selesai dan kirim pemberitahuan ke pelanggan. + Jika Anda belum mempunyai akun, kami akan menggunakan email ini untuk membuat akun. Amplop Kotak Tambah Paket @@ -30,7 +46,6 @@ Language: id Termurah Beli Label Beli Label · %1$s - Tandai pesanan ini selesai dan kirim pemberitahuan ke pelanggan Biaya pengiriman Rincian pesanan Rincian pengiriman @@ -38,10 +53,10 @@ Language: id Pilih paket untuk melihat tarif pengiriman Pilih Paket Apakah Anda mengirim barang berisiko atau bahan berbahaya? - %1$s  ·  %2$s Ciutkan/perluas kartu item - Tidak + %1$s  ·  %2$s Diurutkan berdasarkan 1%s + Tidak Simpan pilihan saya untuk kampanye mendatang. <b>Cocok untuk:</b> %s Pilih tujuan %s @@ -70,12 +85,12 @@ Language: id Kunci tidak valid: hapus karakter \"_\" dari awal. Kunci ini sudah digunakan untuk kolom kustom yang lain. \nSaat ini aplikasi tidak mendukung pembuatan kunci duplikat. Bila perlu, gunakan wp-admin untuk membuat duplikat kunci. Tambahkan kolom khusus + Kolom Kustom telah dihapus + Gagal menyimpan perubahan, coba lagi Perubahan tersimpan Menyimpan perubahan Tampaknya Anda tidak terhubung ke internet. Pastikan Wi-Fi Anda aktif. Jika Anda menggunakan data seluler, aktifkan di pengaturan perangkat Anda. Pemindaian gagal. Coba lagi nanti - Kolom Kustom telah dihapus - Gagal menyimpan perubahan, coba lagi Nilai Kunci Jenis produk lain, seperti variabel dan virtual, akan tersedia dalam pembaruan mendatang. @@ -89,21 +104,21 @@ Language: id Pengeluaran per hari Berapa banyak dana yang ingin Anda belanjakan untuk kampanye, dan berapa lama durasinya? %1$s ➔ %2$s - Ingin meningkatkan penjualan Anda? Perlihatkan produk Anda kepada jutaan orang dengan Blaze dan tingkatkan penjualan Anda + Ingin meningkatkan penjualan Anda? Error saat memuat kolom khusus Kolom Khusus Latar belakang diredupkan. Ketuk untuk menutup dialog. %1$s per minggu Jalankan terus sampai saya nonaktifkan + Berjalan sejak %1$s + pengeluaran per minggu %1$s per minggu, mulai dari %2$s Per minggu Tersisa Total Klik-tayang Sepertinya perangkat Anda dalam mode Penghemat Baterai. \nKami tidak dapat memberikan informasi toko selama mode ini aktif. - Berjalan sejak %1$s - pengeluaran per minggu Menu popup yang memuat sejumlah opsi. Geser untuk mengakses aneka item. Buka menu bilah alat Bilah alat dengan status pembaca kartu. Menu terbuka. Ketuk dua kali untuk berinteraksi. @@ -135,28 +150,28 @@ Language: id Pesanan baru Oke + Buat pesanan di manajemen toko + Untuk memproses pembayaran atas produk non-sederhana, keluar dari POS, kemudian buat pesanan baru dari tab pesanan. Mengapa produk saya tidak muncul? Info Tutup - Menunjukkan produk sederhana saja - Saat ini, hanya produk fisik sederhana yang kompatibel dengan POS. Jenis produk lain, seperti variabel dan virtual, akan tersedia dalam pembaruan mendatang. - Untuk memproses pembayaran atas produk non-sederhana, keluar dari POS, kemudian buat pesanan baru dari tab pesanan. Pelajari\u00A0selengkapnya + Saat ini, hanya produk fisik sederhana yang kompatibel dengan POS. Jenis produk lain, seperti variabel dan virtual, akan tersedia dalam pembaruan mendatang. + Menunjukkan produk sederhana saja Alamat Situs + Google for WooCommerce Tambahkan kampanye berbayar Tingkatkan penjualan dan tarik lebih banyak pengunjung dengan Google Ads. Kampanye Google - Google for WooCommerce Selesai Kampanye baru sudah dibuat. Bersiaplah, penjualan Anda akan meroket! Semua Siap! Tidak dapat membuat pesanan + Coba lagi Ikon indikasi error Ingin mencoba sekali lagi? Terjadi error saat memuat produk POS saat ini hanya mendukung produk sederhana POS saat ini hanya mendukung produk sederhana – \nbuat untuk memulai. - Coba lagi Produk yang didukung tidak ditemukan Tidak ada produk Dapatkan Dukungan @@ -228,8 +243,8 @@ Language: id Nama, Ringkasan, & Deskripsi Anda dapat menyunting atau membuat ulang detail produk sebelum menyimpan. Program - Tidak ada program pada periode ini Kampanye Google + Tidak ada program pada periode ini Hubungkan sekarang Keranjang Buat Detail Produk @@ -240,23 +255,23 @@ Language: id Kami buatkan detail produk untuk Anda. Terima Pembayaran dengan Kartu Total + Pajak Subtotal Pembayaran berhasil Pembayaran gagal. Coba lagi. Ikon keranjang Produk - Google untuk WooCommerce - Tidak Ada Aturan Jumlah - Tingkatkan penjualan dan dorong lalu lintas dengan Google Ads %d item Hapus - Pajak + Tingkatkan penjualan dan dorong lalu lintas dengan Google Ads + Google untuk WooCommerce + Tidak Ada Aturan Jumlah Audiens Batal + Keluar Keluar dari POS - Checkout Hapus %s dari keranjang - Keluar + Checkout Status Pembaca Tidak Diketahui Checkout Pembaca Terhubung @@ -297,13 +312,13 @@ Language: id Uang tunai diterima Kupon paling aktif Terima pembayaran (%s) - Status - Ulasan terbaru - Lihat semua pesanan Lihat semua ulasan Tidak ada ulasan yang memenuhi penyaring yang dipilih, silakan ganti penyaring Tidak ada ulasan yang ditemukan + Status + Ulasan terbaru Pesanan terbaru + Lihat semua pesanan Buka menu tarik-turun penyaring Hapus kategori induk Terjadi error saat mengambil produk! @@ -312,9 +327,9 @@ Language: id Nama Metode Tambahkan Pengiriman + Terjadi error saat mengambil metode pengiriman. Silakan coba lagi Metode Nilai tidak valid - Terjadi error saat mengambil metode pengiriman. Silakan coba lagi Penyiapan toko Sesuaikan Lihat semua kampanye @@ -324,8 +339,8 @@ Language: id Sembunyikan %s Selesai Feedback - Kami tidak dapat menampilkan \n Anda analitik toko Pastikan Anda mengoperasikan WooCommerce versi terbaru di situs Anda dan telah mengaktifkan WooCommerce Analytics. + Kami tidak dapat menampilkan \n Anda analitik toko Lihat semua tugas Analitik sesi bergantung pada jumlah pengunjung unik yang tidak tersedia untuk rentang tanggal kustom Data sesi tidak tersedia @@ -338,11 +353,11 @@ Language: id Batalkan Keluar Anda sepertinya belum menyetujui koneksi aplikasi. Anda yakin ingin keluar? + Pilih gambar dengan ukuran minimal 400x400 piksel Gambar tidak valid Nama pengguna atau kata sandi Anda sepertinya salah. Periksa kembali kredensial Anda dan coba lagi. Jika data Anda masih belum dimuat, hubungi tim dukungan untuk mendapatkan bantuan. Tidak ada masalah koneksi - Pilih gambar dengan ukuran minimal 400x400 piksel Kembali ke layar sebelumnya Coba sambungkan lagi Menyambungkan ke situs Anda @@ -355,23 +370,23 @@ Language: id Hubungi Dukungan Lanjutkan Jika ada masalah, silakan hubungi tim dukungan. + 3. Setelah koneksi selesai, Anda akan login ke toko Anda. 2. Jika diminta, setujui koneksi dengan mengetuk tombol konfirmasi 1. Pertama, login dengan kredensial situs Anda. + Ikuti langkah-langkah berikut untuk menghubungkan aplikasi Woo langsung ke toko Anda dengan kata sandi aplikasi. Alasannya mungkin karena Anda menerapkan beberapa langkah keamanan ekstra di toko Anda. Tidak dapat login ke toko Anda + Setelah memesan, detail pesanan akan tertampil di sini. Belum Ada Detail Pesanan Tambahkan Jumlah Kustom Untuk menentukan jumlah pembayaran, tambahkan\njumlah kustom ke pesanan baru Anda. - 3. Setelah koneksi selesai, Anda akan login ke toko Anda. - Ikuti langkah-langkah berikut untuk menghubungkan aplikasi Woo langsung ke toko Anda dengan kata sandi aplikasi. - Setelah memesan, detail pesanan akan tertampil di sini. Kami mengintegrasikan penagihan dengan\npembuatan pesanan agar proses lebih mudah diakses\ndan efisien. + Tagih Pembayaran \ntelah dipindahkan Paket Paket terjual Paket Paket terjual Kampanye Blaze - Tagih Pembayaran \ntelah dipindahkan Produk dengan performa tertinggi Anda yakin ingin mengabaikan perubahan yang Anda buat pada produk ini? Anda akan mengabaikan perubahan pada %s @@ -396,6 +411,7 @@ Language: id Saran Ketik domain Pilih domain + Lihat semua analitik toko Tahunan Bulanan Mingguan @@ -405,7 +421,6 @@ Language: id Hubungi toko lain Membuat toko baru? Nama toko - Lihat semua analitik toko Harap tunggu… Memperbarui status stok Terjadi masalah. Coba lagi. @@ -436,17 +451,17 @@ Language: id Error saat memindahkan pesanan ke tempat sampah Pesanan dipindahkan ke tempat sampah Situs Anda tampaknya mengalami masalah.\n\nHubungi penyedia hosting Anda untuk mendapatkan bantuan lebih lanjut. - Tampaknya Anda tidak terhubung ke internet.\n\nPastikan Wi-Fi Anda aktif. Jika Anda menggunakan data seluler, aktifkan di pengaturan perangkat Anda. Koneksi Jetpack Anda tampaknya bermasalah.\n\nTenang, tim dukungan kami siap membantu. Hubungi kami. Kami siap membantu Anda. Tampaknya kami tidak dapat menangani respons situs Anda.\n\nTenang, tim dukungan kami siap membantu. Hubungi kami. Kami siap membantu Anda. Situs Anda tampaknya merespons terlalu lama.\n\nHubungi penyedia hosting Anda untuk mendapatkan bantuan lebih lanjut. + Tampaknya Anda tidak terhubung ke internet.\n\nPastikan Wi-Fi Anda aktif. Jika Anda menggunakan data seluler, aktifkan di pengaturan perangkat Anda. Produk tidak dipilih Baca Selengkapnya Hubungi Dukungan - Koneksi Internet - Tambahkan statistik rentang tanggal kustom Mengambil pesanan situs Anda Menyambungkan ke server WordPress.com + Koneksi Internet + Tambahkan statistik rentang tanggal kustom Lokasi tidak ditemukan.\nCoba lagi. Kunjungan halaman sesi Jenis perangkat @@ -513,9 +528,9 @@ Language: id Parameter URL URL Tujuan Masukkan secara manual + Gagal mencari.\nCoba lagi Mulai ketik negara, provinsi, atau kota untuk melihat pilihan yang tersedia Dengan mengeklik \"Kirim kampanye\", Anda menyetujui <a href=\'termsOfService\'><u>Ketentuan Layanan</u></a> dan <a href=\'advertisingPolicy\'><u>Kebijakan Iklan</u></a> serta menyepakati metode pembayaran untuk penagihan sesuai anggaran dan durasi yang dipilih. <a href=\'learnMore\'><u>Baca selengkapnya</u></a> tentang cara kerja anggaran dan pembayaran untuk Pos Dipromosikan. - Gagal mencari.\nCoba lagi Kirim kampanye Pemuatan metode pembayaran gagal, coba lagi dengan klik di sini! Tambahkan metode pembayaran @@ -535,7 +550,9 @@ Language: id Slogan Ganti gambar Terapkan + Tanggal mulai %1$s hari + Tayangan menunjukkan frekuensi iklan ditampilkan kepada calon pembeli.\n\n\n Meskipun jumlah persisnya tidak dapat dijamin karena fluktuasi lalu lintas online dan perilaku pengguna, kami berupaya agar tayangan aktual iklan Anda sedekat mungkin dengan jumlah yang Anda targetkan.\n\n\n Jangan lupa, tayangan berhubungan dengan visibilitas, bukan tindakan yang dilakukan pembaca. Selesai Tayangan Perbarui @@ -546,8 +563,6 @@ Language: id Tentukan anggaran Semua %1$s hari sejak %2$s - Tayangan menunjukkan frekuensi iklan ditampilkan kepada calon pembeli.\n\n\n Meskipun jumlah persisnya tidak dapat dijamin karena fluktuasi lalu lintas online dan perilaku pengguna, kami berupaya agar tayangan aktual iklan Anda sedekat mungkin dengan jumlah yang Anda targetkan.\n\n\n Jangan lupa, tayangan berhubungan dengan visibilitas, bukan tindakan yang dilakukan pembaca. - Tanggal mulai Jangan Tampilkan Lagi Ingatkan Saya Nanti Boleh minta waktunya sebentar? Bantu kami memperbaiki fitur berbantuan AI dengan feedback cepat. @@ -559,9 +574,8 @@ Language: id Bahasa Anggaran Detail - Belanja sekarang - Pratinjau Edit iklan + Pratinjau Non-aktif Pilihan produk Pilih produk %s @@ -572,12 +586,12 @@ Language: id <b>Pilih produk:</b> Pilih produk yang ingin dipromosikan dengan Blaze. Kelola Stok Stok tidak dikelola + Ketahui cara kerja Blaze Buat kampanye Anda Jutaan situs dalam jaringan WordPress.com dan Tumblr jadi ruang iklan Anda. Jangkau audiens yang besar \"Berkat alat kami, pembeli yang tertarik dengan produk Anda bisa lebih mudah menemukannya.\" Seluruh dunia dalam jangkauan - Ketahui cara kerja Blaze Pasang iklan dalam hitungan menit — tanpa perlu jadi ahli atau banyak biaya, dari $5 USD saja per hari. Pasang praktis, hasil strategis Menghadirkan proses penyiapan iklan yang cepat nan ringkas, alat kami membantu para penjual memaksimalkan pengunjung situsnya. @@ -585,7 +599,6 @@ Language: id Siap mempromosikan Tampilkan produk ke jutaan pasang mata Pakai %1$s - DEPOSIT TERAKHIR Buka tutup rincian total pesanan Terima Pembayaran Kode harus dalam format XXXX-XXXX-XXXX-XXXX @@ -667,32 +680,32 @@ Language: id Dokumen dan berkas lain di perangkat ✨Buat ucapan terima kasih Kenakan Pajak - Deposit dana yang tersedia dilakukan secara otomatis tiap %s. - Deposit dana yang tersedia dilakukan secara otomatis tiap hari. - Dana akan tersedia setelah tertunda selama %d hari. + Dana yang tersedia dibayar secara otomatis tiap %s. + Dana yang tersedia dibayar secara otomatis tiap hari. + Dana akan tersedia setelah tertunda selama %d hari. Pilih variasi + Pilih variasi \" %1$s \" -> %2$s + pilih satu variasi %1$s item dipilih %1$s item dipilih + Pilih %1$s lebih dari %1$s item lebih dari %1$s item kurang dari %1$s item antara %1$s dan %2$s item %d item %d item - pilih satu variasi - Pilih %1$s - Pilih variasi Ubah jumlah produk dari %1$.2f menjadi %2$.2f Simpan konfigurasi Konfigurasi Produk %s Konfigurasikan + Opsional: biaya pendaftaran akan langsung dikenakan walaupun produk termasuk percobaan gratis atau tanggal pembayaran tersinkron. Langganan produk dengan variasi Produk langganan variabel Langganan produk unik yang memungkinkan pembayaran berulang Produk langganan sederhana - Opsional: biaya pendaftaran akan langsung dikenakan walaupun produk termasuk percobaan gratis atau tanggal pembayaran tersinkron. Periode waktu tunggu opsional sebelum menagih pembayaran berulang pertama. Semua biaya pendaftaran akan tetap dikenakan di awal berlangganan. Periode percobaan tidak boleh melebihi: 90 hari, 52 minggu, 24 bulan, atau 5 tahun. Percobaan langganan gratis Tanggal kedaluwarsa langganan @@ -708,21 +721,21 @@ Language: id Periode Rentang penagihan Obral - Tidak diketahui - Gagal - Dibatalkan - Sedang transit - Ditangguhkan - Berbayar - Estimasi - Ciutkan/perluas ringkasan deposit - Baca selengkapnya tentang kapan Anda akan menerima dana - Dana yang tertunda - Dana yang tersedia + Tidak diketahui + Gagal + Dibatalkan + Sedang transit + Ditangguhkan + Berbayar + Estimasi + Ciutkan/perluas ringkasan pembayaran + Baca selengkapnya tentang kapan Anda akan menerima dana + Dana yang tersedia dibayar secara otomatis tiap bulan pada %s. + Dana akan tersedia setelah tertunda selama %d hari. + Dana yang tertunda + Dana yang tersedia Pajak Produk - Deposit dana yang tersedia dilakukan secara otomatis tiap bulan pada %s. - Dana akan tersedia setelah tertunda selama %d hari. Total pembayaran Alamat email atau Nama Pengguna Tidak dapat membuat pesanan berjumlah kustom @@ -738,22 +751,22 @@ Language: id Saya mengerti Iklan telah dikirimkan untuk disetujui. Kami akan mengirimkan email konfirmasi untuk Anda setelah iklan disetujui dan ditayangkan. Semua sudah siap! + Mulai kampanye Blaze sekarang Lacak performa, mulai, dan hentikan kampanye Blaze Anda kapan saja. Jangkau jutaan pengguna di situs WordPress dan Tumblr. Ambil kendali hanya dengan beberapa dolar per hari. Harganya terjangkau. - Mulai kampanye Blaze sekarang Promosikan produk Anda hanya dalam hitungan menit. - Pilih Sumber Media - Tidak ada teks yang terdeteksi. Pilih foto kemasan lainnya atau masukkan detail produk secara manual. Tingkatkan penjualan toko Anda dengan Blaze Terjadi error ketika menyegarkan daftar kampanye. Silakan coba lagi nanti. + Pilih Sumber Media + Tidak ada teks yang terdeteksi. Pilih foto kemasan lainnya atau masukkan detail produk secara manual. Tambahkan produk Pindai barcode Ciutkan/perluas kartu produk Kurangi kuantitas produk - Harga setelah diskon Tingkatkan kuantitas produk Tambahkan jumlah kustom + Harga setelah diskon Pesanan sebelumnya Pesanan berikutnya Detail kampanye @@ -778,12 +791,12 @@ Language: id 5. Setelah tanda centang “Selesai” terlihat, toko Anda akan memproses pembayaran dan transaksi akan selesai. 3. Tunjukkan iPhone Anda kepada pelanggan. 2. Ketuk “Terima Pembayaran” dan pilih “Ketuk untuk Bayar”. + 1. Buat pesanan Ini cara kerjanya Baca selengkapnya tentang pembaca kartu - Di %1$s, beberapa kartu mensyaratkan PIN untuk transaksi nirsentuh di atas %2$s. Untuk menerima pembayaran di atas batas ini, pertimbangkan pembelian pembaca kartu yang menerima entri PIN. Kami tidak mendukung entri PIN dengan fitur Ketuk untuk Bayar di Android. - 1. Buat pesanan + Di %1$s, beberapa kartu mensyaratkan PIN untuk transaksi nirsentuh di atas %2$s. Informasi penting Dengan Ketuk untuk Bayar, Anda dapat menerima semua jenis pembayaran nirsentuh – dari kartu debit dan kredit fisik hingga dompet digital lainnya – tanpa perlu membeli pembaca kartu fisik. Apa Itu Ketuk untuk Bayar? @@ -827,18 +840,18 @@ Language: id Tambahkan tarif ini ke semua pesanan yang dibuat Sunting Tarif Pajak Sunting Tarif Pajak di Admin + Tambahkan tarif pajak di admin. Hanya tarif pajak dengan informasi lokasi yang akan ditunjukkan di sini. Kami tidak dapat menemukan tarif pajak Jelajahi penyedia pembayaran lainnya dan \npilih penyedia pembayaran. Metode Pembayaran - Tambahkan tarif pajak di admin. Hanya tarif pajak dengan informasi lokasi yang akan ditunjukkan di sini. Gambar dan video di perangkat Selesaikan sekarang Selesaikan penyiapan Atur Tarif Pajak Aktifkan Atur Tarif Pajak Baru - Siapkan WooPayments + Siapkan Edit tarif pajak di admin Langkah ini akan mengganti alamat pelanggan menjadi lokasi tarif pajak yang Anda pilih. Tombol untuk membuka dialog info tarif pajak @@ -886,8 +899,8 @@ Language: id Total pesanan Persentase Terhitung Jumlah Terhitung - Menyesuaikan nama toko Anda juga dapat membantu optimisasi mesin pencari toko Anda. Nama toko + Menyesuaikan nama toko Anda juga dapat membantu optimisasi mesin pencari toko Anda. Beri nama untuk toko Anda Aktifkan NFC Paket Pengadaan Kuantitas Kecil (wajib ditandai) @@ -956,15 +969,15 @@ Language: id Cari pelanggan berdasarkan Alasan lain (sebutkan) Saya adalah bagian dari sebuah tim, dan keputusan harus dibuat secara kolektif. + Harga layanan merupakan faktor penting dalam keputusan ini. Saya sedang mengevaluasi dan membandingkan layanan Anda dengan penyedia layanan lainnya di pasar. Saya masih menjelajahi dan menilai berbagai fitur dan manfaat aplikasi. Bantu kami memahami keputusan berlangganan Anda. Feedback dari Anda sangat berharga. - Harga layanan merupakan faktor penting dalam keputusan ini. Tidak ada alamat email Tidak ada nama + Cari pelanggan yang sudah ada atau Pembaruan terakhir %s (Diperbarui setiap 30 menit) Pembaruan terakhir %s - Cari pelanggan yang sudah ada atau <a href=\'\'>Pelajari selengkapnya</a> tentang menerima pembayaran dengan Tap To Tap di Android Terima Pembayaran Anda tidak dapat menambahkan produk tanpa menentukan harga @@ -975,10 +988,10 @@ Language: id Izinkan Anda telah menolak izin Kamera secara permanen. Izin diperlukan untuk memindai barcode. Harap izinkan di pengaturan aplikasi Izin kamera diperlukan untuk memindai barcode + Izinkan Akses Kamera Terjadi kesalahan saat validasi kode kupon Anda. Coba lagi Kami tidak dapat menemukan kupon dengan kode tersebut. Coba lagi Jumlah (%1$s) - Izinkan Akses Kamera Diskon %1$s - %1$s Total Diskon @@ -1005,13 +1018,15 @@ Language: id Ketuk untuk Bayar tidak tersedia Lihat Persyaratan Pemecahan Masalah - Data Anda tidak dapat dimuat. Hal ini mungkin karena adanya konflik dengan plugin. Coba lagi nanti atau hubungi kami dan dengan senang hati kami akan membantu Anda! + Data Anda tidak dapat dimuat. Saya mengerti Harap perhatikan bahwa deskripsi produk ini dibuat dengan alat berbasis teknologi AI. Harap periksa dan edit isinya agar sesuai dengan citra dan pesan yang ingin Anda sampaikan. + Mantap! Apakah deskripsi\nyang dibuat bermanfaat? Buat Ulang Soroti fitur unik dan audiens produk Anda dengan kata kunci untuk menghasilkan deskripsi yang pas dan khas. + Contoh: Dalam Pot, Kaktus, Tanaman, Dekoratif, Mudah Dirawat Masukkan nama produk Anda Tulis deskripsi Izin kamera diperlukan untuk memindai barcode. @@ -1022,8 +1037,6 @@ Language: id Kupon diterapkan Pengaturan selengkapnya Mungkin nanti - Mantap! - Contoh: Dalam Pot, Kaktus, Tanaman, Dekoratif, Mudah Dirawat Tulis lagi Meski diperlukan, kode PIN belum dapat digunakan pada Ketuk untuk Bayar. Coba gunakan pembaca kartu eksternal Beli pembaca kartu @@ -1031,12 +1044,12 @@ Language: id Tidak dapat membuat pesan berbagi. Coba lagi! Baca selengkapnya tentang fitur AI Tambah pesan opsional + Menulis… Tulis dengan AI Promosikan produk dengan Blaze Blaze Pembuat konten AI tersedia Promosikan dengan Blaze - Menulis… Bagikan produk Selamat! Anda selangkah lebih dekat untuk mewujudkan toko baru. Produk pertama dibuat 🎉 @@ -1044,6 +1057,7 @@ Language: id Sistem menghentikan aplikasi Woo sewaktu berjalan di latar belakang. Anda dapat mencoba untuk kembali menggunakannya. Kartu dihapus terlalu dini Produk variasi + Kebijakan cookie kami menjelaskan bagaimana kami dan pihak lain menggunakan cookie serta bagaimana Anda dapat mengelolanya. Kebijakan Cookie Informasi Anda membantu kami meningkatkan dan memasarkan produk kami serta mempersonalisasi pengalaman Anda di WooCommerce. Kebijakan Privasi @@ -1054,7 +1068,6 @@ Language: id Analitik Kelola privasi Privasi Anda selalu kami utamakan. Kami menggunakan, menyimpan, dan memproses data pribadi Anda untuk mengoptimalkan aplikasi kami (dan pengalaman Anda) dengan beragam cara. Sebagian penggunaan data Anda sangat kami butuhkan agar aplikasi berjalan optimal, dan sisanya dapat Anda sesuaikan dari Pengaturan. - Kebijakan cookie kami menjelaskan bagaimana kami dan pihak lain menggunakan cookie serta bagaimana Anda dapat mengelolanya. Untuk membantu kami meningkatkan performa aplikasi dan memperbaiki bug, aktifkan laporan otomatis untuk masalah crash. Laporkan Masalah Crash Laporan @@ -1063,6 +1076,7 @@ Language: id Privasi Pelajari selengkapnya tentang data yang kami kumpulkan seputar toko Anda dan pilihan Anda dalam mengelola pembagian data. Pelacakan Penggunaan + Pilihan privasi lainnya tersedia untuk pengguna woocommerce.com. Lihat di sini untuk membaca selengkapnya. Pilihan Web Pilihan privasi lainnya Terjadi error saat memperbarui pengaturan privasi Anda @@ -1075,41 +1089,40 @@ Language: id Anda tidak dapat menambahkan produk bervariasi secara langsung. Pilih sebuah variasi secara spesifik. Pemindaian gagal. Coba lagi nanti Produk dengan SKU %s tidak ditemukan. Tidak dapat menambahkan ke pesanan - Pilihan privasi lainnya tersedia untuk pengguna woocommerce.com. Lihat di sini untuk membaca selengkapnya. Pemindaian gagal. Coba lagi nanti Pindai Barcode Sekarang, pengiriman ke negara yang memberlakukan aturan bea cukai Uni Eropa (UE) mewajibkan Anda menguraikan setiap item. Contohnya, jika Anda mengirim pakaian, Anda harus menerangkan jenis pakaiannya (seperti, baju pria, rompi wanita, jaket pria) dalam deskripsinya untuk dapat diterima. Jika tidak, pengiriman akan tertunda atau tertahan di bea cukai. Hubungi Dukungan - Terjadi error saat mencoba menutup akun. - Menutup akun… Akun ini tidak dapat ditutup jika memiliki toko aktif. + Terjadi error saat mencoba menutup akun. Tidak dapat menutup akun + Menutup akun… Tutup Akun Permanen Untuk mengonfirmasi, silakan masukkan lagi nama pengguna Anda sebelum menutup. Konfirmasi Penutupan Akun Tutup Akun - -%1$s Pindai kode QR dan ikuti petunjuk Pindai untuk Membayar Hapus kupon dari pesanan Kupon (%1$s) + -%1$s Tambah kupon Stok tidak cukup Anda harus memberikan deskripsi yang spesifik dan jelas untuk tiap item. Tambahkan produk-produk melalui pemindai Tutup Pelajari Selengkapnya + Ketika mengirimkan barang ke negara yang menerapkan aturan bea cukai Uni Eropa (UE), Anda harus memberikan deskripsi yang jelas dan spesifik tentang setiap item. Jika tidak, pengiriman akan tertunda atau tertahan di bea cukai. Terus dapatkan pembaruan dan tingkatkan keamanan toko. Jelajahi Jetpack sekarang. Dapatkan pemberitahuan pesanan dan aneka fitur lainnya - Ketika mengirimkan barang ke negara yang menerapkan aturan bea cukai Uni Eropa (UE), Anda harus memberikan deskripsi yang jelas dan spesifik tentang setiap item. Jika tidak, pengiriman akan tertunda atau tertahan di bea cukai. - Sembunyikan daftar penyiapan toko - Sembunyikan daftar penyiapan toko - Lihat Pesanan - Pengembalian dana gagal. Coba pengembalian dana secara manual Tampilkan atau sembunyikan daftar penyiapan toko Daftar Penyiapan Toko Anda dapat memulihkannya jika dibutuhkan dari Menu > Pengaturan > Toko + Sembunyikan daftar penyiapan toko + Sembunyikan daftar penyiapan toko + Lihat Pesanan Uji coba pembayaran menggunakan Ketuk untuk Bayar berhasil dikembalikan + Pengembalian dana gagal. Coba pengembalian dana secara manual Mengembalikan dana uji coba pembayaran… Dengan melanjutkan, Anda menyetujui <a href=\'termsOfService\'><u>Ketentuan Layanan kami.</u></a> Pertama-tama, mari buat akun Anda. @@ -1127,9 +1140,9 @@ Language: id Pemberitahuan Produk gabungan Pustaka Media Perangkat - Izinkan Uji pengembalian dana otomatis pembayaran Ketuk untuk Bayar Uji pembayaran Ketuk untuk Bayar + Izinkan Perbarui preferensi Anda Pengaturan Dapatkan ulasan untuk toko Anda @@ -1159,8 +1172,10 @@ Language: id Pelajari lebih lanjut tentang peran dan izin Sepertinya peran pengguna Anda tidak mengizinkan Anda menginstal Jetpack. \nHubungi administrator Anda untuk mendapatkan bantuan. Coba Ketuk untuk Bayar + Percobaan gratis Biaya pendaftaran Kedaluwarsa setelah + Harga langganan tahun bulan minggu @@ -1175,8 +1190,6 @@ Language: id Dibatalkan Ditangguhkan Aktif - Percobaan gratis - Harga langganan Anda dapat menyunting langganan produk di dasbor web. Tidak ada periode percobaan Tidak ada biaya pendaftaran @@ -1187,22 +1200,22 @@ Language: id Langganan #%1$d Langganan OK - Langganan - Langganan Woo selalu menyertai mulai dari rintisan hingga jutaan penjualan Anda. Inilah alasan kami dipercaya para penjual untuk memperkuat 3,4 juta toko online mereka. + Langganan Kode OTP salah. Periksa kembali informasi Anda dan coba lagi. Permintaan SMS gagal. Harap coba lagi. SMS diajukan, harap cek pesan Anda untuk melihat kodenya. + Langganan Pembaca kartu menerima pembayaran dengan chip serta secara mengetuk dan menggesek menggunakan kartu debit atau kartu kredit. Terima pembayaran nirsentuh dengan aman langsung dari ponsel Anda. - Tidak dapat login karena pembuatan kata sandi aplikasi tidak disetujui. - Mengambil situs… Gunakan ponsel Anda untuk menerima pembayaran\nkartu. Coba sekarang. Bagikan Feedback - Memuat… + Tidak dapat login karena pembuatan kata sandi aplikasi tidak disetujui. + Mengambil situs… + Terjadi error saat mengambil situs web Anda. Coba lagi menggunakan halaman WP Admin Login - Terjadi error saat mengambil situs web Anda. + Memuat… %s berakhir Langganan Anda berakhir dan Anda dapat mengakses semua fitur secara terbatas. %1$d hari @@ -1215,11 +1228,19 @@ Language: id objek barang Error saat mengambil detail paket + Sekarang Anda menjadi pelanggan %1$s! Anda memiliki akses ke semua fitur kami hingga %2$s. + Masa percobaan gratis Anda telah berakhir, menyisakan akses fitur secara terbatas. Berlangganan %1$s sekarang. + Masa percobaan gratis Anda adalah %1$d hari. Percobaan gratis Anda akan berakhir dalam %2$s. Upgrade untuk membuka fitur-fitur baru dan membuat toko Anda tetap berjalan. Status langganan Pemecahan Masalah Saat ini: %s Laporkan masalah langganan Upgrade Sekarang + %1$s tersisa dalam periode percobaan Anda. + Masa percobaan berakhir + Masa percobaan Anda telah berakhir. + Waduh, terjadi error tak terduga. + Error tak terduga Kami mendapati bahwa toko telah diluncurkan. Tidak dapat meluncurkan toko Anda Tidak dapat membagikan url toko @@ -1229,16 +1250,8 @@ Language: id Kembali ke Toko Saya Bagikan URL Publikasikan toko saya - Cari domain - Sekarang Anda menjadi pelanggan %1$s! Anda memiliki akses ke semua fitur kami hingga %2$s. - Masa percobaan gratis Anda telah berakhir, menyisakan akses fitur secara terbatas. Berlangganan %1$s sekarang. - Masa percobaan berakhir - Masa percobaan Anda telah berakhir. - Waduh, terjadi error tak terduga. - Error tak terduga Untuk meluncurkan toko, Anda perlu upgrade ke paket kami. <u>Upgrade</u> - Masa percobaan gratis Anda adalah %1$d hari. Percobaan gratis Anda akan berakhir dalam %2$s. Upgrade untuk membuka fitur-fitur baru dan membuat toko Anda tetap berjalan. - %1$s tersisa dalam periode percobaan Anda. + Cari domain Login gagal dengan kode status %1$s Tidak dapat login karena kami tidak dapat mengidentifikasi URL admin toko Anda Tidak dapat login karena kami tidak dapat mengidentifikasi URL login toko Anda @@ -1256,11 +1269,13 @@ Language: id Permintaan dukungan Anda sudah masuk ke inbox kami. Kami akan mengirimkan email balasan secepatnya. Permintaan terkirim! Harap tunggu… + Mengirim permintaan Ekstensi/Plugin lainnya Plugin WooCommerce Pembayaran WooCommerce Pembaca Kartu/Pembayaran Langsung Aplikasi Seluler + Mulai menulis Pesan Daftarkan Permohonan Dukungan Subjek @@ -1268,6 +1283,7 @@ Language: id Mari atasi masalahnya Saya butuh bantuan untuk Permintaan Dukungan + Bagikan feedback Penyiapan dengan daftar diciutkan Penyiapan dengan layar penuh Lihat semua (%1$d) @@ -1275,49 +1291,46 @@ Language: id Hadirkan metode pembayaran yang praktis dan mudah untuk pelanggan! Terima pembayaran Kami akan menggunaakan data tersebut untuk menyetel pengaturan terkait pengiriman, pajak, dan pembayaran. - Mengirim permintaan - Mulai menulis - Bagikan feedback Bisa berikan info lebih lanjut tentang toko Anda? Tautan ajaib sudah berhasil dikirim ke alamat email yang terdaftar untuk akun Anda + Login untuk Melanjutkan Akses semua toko WooCommerce Anda. Banyak toko Memuat Status Jetpack Ada yang salah! Silakan coba lagi nanti. Uji coba pembayaran - Login untuk Melanjutkan - Mendaftarkan nama domain… - Pilih Negara - Pilih Provinsi + Terima pembayaran dengan kartu\nmenggunakan ponsel Anda Ketuk Untuk Membayar TINDAKAN Terjadi error saat registrasi domain - Terima pembayaran dengan kartu\nmenggunakan ponsel Anda - Telepon - Kode negara - Negara - Alamat - Alamat 2 - Kota - Provinsi - Negara Bagian (Tidak Tersedia) - Kode pos + Pilih Provinsi + Pilih Negara + Mendaftarkan nama domain… Daftarkan Domain - Demi kenyamanan Anda, kami telah mengisi informasi kontak WordPress.com Anda\n terlebih dahulu. Harap tinjau kembali untuk memastikan informasi yang ingin Anda gunakan untuk domain ini sudah benar. + Kode pos + Negara Bagian (Tidak Tersedia) + Provinsi + Kota + Alamat 2 + Alamat + Negara + Kode negara + Telepon Organisasi (opsional) - Pemilik domain harus berbagi informasi kontak di database publik semua domain.\n Dengan Perlindungan Privasi, kami memublikasikan informasi kami sendiri, bukan informasi Anda, dan meneruskan segala komunikasi kepada Anda secara pribadi. - Dengan mendaftarkan domain ini, Anda menyetujui %1$ssyarat dan ketentuan%2$s kami - Masukkan %s yang valid - Daftarkan secara pribadi dengan Perlindungan Privasi - Daftarkan secara publik + Demi kenyamanan Anda, kami telah mengisi informasi kontak WordPress.com Anda\n terlebih dahulu. Harap tinjau kembali untuk memastikan informasi yang ingin Anda gunakan untuk domain ini sudah benar. Informasi kontak domain + Daftarkan secara publik + Daftarkan secara pribadi dengan Perlindungan Privasi + Masukkan %s yang valid + Dengan mendaftarkan domain ini, Anda menyetujui %1$ssyarat dan ketentuan%2$s kami + Pemilik domain harus berbagi informasi kontak di database publik semua domain.\n Dengan Perlindungan Privasi, kami memublikasikan informasi kami sendiri, bukan informasi Anda, dan meneruskan segala komunikasi kepada Anda secara pribadi. Perlindungan Privasi Pengaturan domain hanya bisa diakses oleh administrator toko Atau lanjut dengan Tautan Ajaib Masukkan kata sandi akun WordPress.com Anda untuk memasang Jetpack + Masukkan kata sandi akun WordPress.com Anda untuk menghubungkan Jetpack Login dengan akun WordPress.com Anda untuk memasang Jetpack Login dengan akun WordPress.com Anda untuk menghubungkan Jetpack - Masukkan kata sandi akun WordPress.com Anda untuk menghubungkan Jetpack Pengaturan domain bisa ditemukan di Pengaturan -> Domain Alamat situs Anda sedang diatur. Perlu waktu hingga 30 menit bagi domain Anda untuk mulai berfungsi. Selamat atas pembelian Anda @@ -1327,9 +1340,9 @@ Language: id %1$d/%2$d selesai Miliki URL khusus untuk menjadi host toko Anda sendiri. Sesuaikan domain Anda + Publikasikan situs Anda ke seluruh dunia kapan pun yang Anda mau! Luncurkan toko Anda Mulai berjualan dengan menambahkan produk atau layanan ke toko Anda. - Publikasikan situs Anda ke seluruh dunia kapan pun yang Anda mau! Tambahkan produk pertama Anda Penyiapan toko Terjadi masalah dengan pengaturan aplikasinya. Hubungi dukungan untuk informasi selengkapnya @@ -1341,13 +1354,13 @@ Language: id Tambah domain Domain situs Anda Alamat situs utama + <a href=\'\'><u>Baca selengkapnya</u></a> tentang domain dan cara bertindak terkait domain. Cari domain Domain yang dibeli akan mengalihkan pengguna ke alamat utama Anda. Klaim Domain + Anda memiliki registrasi domain gratis selama satu tahun bersama paket Anda. Klaim domain gratis Anda Alamat toko gratis Anda - <a href=\'\'><u>Baca selengkapnya</u></a> tentang domain dan cara bertindak terkait domain. - Anda memiliki registrasi domain gratis selama satu tahun bersama paket Anda. Domain Jangan tampilkan lagi Ingatkan saya nanti @@ -1369,40 +1382,40 @@ Language: id Tidak butuh waktu lama Mempersiapkan pembaca bawaan… Pembaca bawaan telah siap + Pembaca Kartu Ketuk Untuk Membayar Angka Konversi Sesi Tidak ada sesi dalam periode ini Bandingkan dengan Domain - Pembaca Kartu Apa itu Kata Sandi Aplikasi? Sepertinya fitur Kata Sandi Aplikasi dinonaktifkan di situs Anda %1$s.\n Aktifkan Kata Sandi untuk menggunakan aplikasi WooCommerce. Buka halaman instalasi - Balas - Balasan dikirim! Terjadi kendala saat mengirimkan balasan + Balasan dikirim! + Balas Pilih semua Perbarui harga Perbarui status - Perbarui status - Perbarui harga normal Status diperbarui! + Perbarui status Harga diperbarui! + Perbarui harga normal Semua variasi telah dibuat. Tidak ada variasi yang bisa dibuat Pilih beberapa sekaligus + Tidak ada domain tersedia untuk pencarian ini Membuat variasi Ini akan membuat variasi baru untuk setiap kemungkinan kombinasi atribut variasi (%1$d variasi). Buat semua variasi? Saat ini, pembuatan mendukung maksimal %1$d variasi. Pembuatan variasi untuk produk ini akan membuat %2$d variasi. Melebihi batas pembuatan Membuat variasi untuk semua kombinasi atribut Anda. + Buat semua variasi Buat satu variasi baru. Menetapkan atribut yang termasuk dalam produk variabel secara manual. Tambah variasi baru Tambah variasi - Buat semua variasi - Tidak ada domain tersedia untuk pencarian ini Keluar Tanpa Menyambungkan Lanjutkan penyambungan Coba sambungkan lagi untuk mengakses toko Anda. @@ -1414,6 +1427,7 @@ Language: id Coba aktifkan ulang Coba instal ulang Dapatkan dukungan + Harap coba lagi dan hubungi dukungan jika error ini berlanjut. Terjadi error saat berkomunikasi dengan situs Anda. Anda tidak memiliki izin untuk mengelola plugin di toko ini Terjadi error saat memberi izin penyambungan ke Jetpack @@ -1437,7 +1451,6 @@ Language: id Menginstal Jetpack Login ke <b>%1$s</b> dengan kredensial toko Anda untuk menyambungkan Jetpack. Login ke <b>%1$s</b> dengan kredensial toko Anda untuk menginstal Jetpack. - Harap coba lagi dan hubungi dukungan jika error ini berlanjut. Siapkan kredensial toko Anda. Sambungkan toko Anda ke Jetpack untuk mengaksesnya di aplikasi ini. Instal plugin Jetpack gratis untuk mengakses toko Anda di aplikasi ini. @@ -1450,8 +1463,9 @@ Language: id Perbarui Pembaca Kartu Simulasi Sambungkan ke Jetpack Hubungkan Toko - Pengunjung Inilah tempat orang-orang dapat menemukan Anda di Internet. Jangan khawatir! Anda dapat mengubahnya kembali. + Pengunjung + Atau, login dengan kata sandi Pembaca Kartu Simulasi telah dinonaktifkan Kunci Pembaca Simulasi Jumlah stok diperbarui @@ -1460,7 +1474,6 @@ Language: id Memperbarui jumlah stok Jumlah stok untuk %d variasi akan diperbarui Persediaan - Atau, login dengan kata sandi Cari dari produk yang disaring Cari dari pesanan yang disaring Sambungkan toko yang sudah ada @@ -1488,17 +1501,18 @@ Language: id Coba Alamat Lainnya Rentang tanggal kustom Kustom + Apa itu WordPress.com? Membuat akun baru Pilih kata sandi Alamat email Anda Memulai \ndalam hitungan menit Dengan mengetuk tombol Hubungkan Jetpack, Anda menyetujui <a href=\'terms\'>Ketentuan Layanan</a> kami dan bersedia <a href=\'sync\'>membagikan detail</a> kepada WordPress.com. - Apa itu WordPress.com? Aktifkan Pembaca Kartu Simulasi Hubungi pemilik situs untuk menerima undangan ke situs sebagai manajer toko atau administrator untuk menggunakan aplikasi. Menghubungkan ke situs WordPress.com Hubungkan ke situs Hubungkan Jetpack ke akun Anda + Edit izin Untuk menggunakan fitur ini, berikan izin untuk menggunakan kamera Anda. Akses Kamera Diperlukan Pemindai Barcode Kamera @@ -1506,7 +1520,6 @@ Language: id 2FA tidak didukung untuk situs yang dihosting sendiri. Gunakan kata sandi aplikasi. Tunjukkan kata sandi Sembunyikan password - Edit izin Sejak %1$s Tidak dapat memuat data Statistik WooCommerce Hari Ini @@ -1527,55 +1540,57 @@ Language: id Error Koneksi Ada masalah yang perlu Anda perhatikan. Harap <a href=\'\'>diperiksa</a> Coba alamat lainnya - Aktifkan Pembayaran Langsung Gagal mengaktifkan bayar di tempat. Silakan coba lagi nanti. + Aktifkan Pembayaran Langsung <a href=\'\'>Pelajari selengkapnya</a> tentang Pembayaran Langsung Baru menggunakan WooCommerce Terjadi kegagalan, silakan hubungi dukungan Masukkan alamat situs - Lupa kata sandi Anda? Dapatkan tautan untuk login melalui email + Lupa kata sandi Anda? Kami mendapati bahwa Anda belum menyelesaikan penyiapan Pembayaran Langsung. <a href=\'\'>Lanjutkan penyiapan</a> - Admin WC - Login dengan alamat toko Anda - Situs lain - Pembayaran dari tab Menu - Sekarang, Anda dapat mengakses Pembayaran Langsung dan fitur-fitur lain dengan cepat dan mudah - Mantap! Pembayaran + Mantap! + Sekarang, Anda dapat mengakses Pembayaran Langsung dan fitur-fitur lain dengan cepat dan mudah + Pembayaran dari tab Menu Email Anda tidak digunakan dengan akun WordPress.com. - Login dengan kredensial situs Anda - Kami baru saja mengirimkan tautan ajaib ke alamat email Anda. Ketuk tautan di email tersebut untuk login. - Login dengan tautan ajaib - Gunakan kata sandi untuk login - Periksa email Anda di perangkat ini! + Situs lain + Login dengan alamat toko Anda + Admin WC Kami baru saja mengirimkan tautan ajaib ke - Siapkan sekarang - Tips - Apa yang mendorong Anda membuka WooCommerce? - Hanya menjelajahi - Mencoba untuk menyiapkan toko - Memeriksa analitik saya - Membuat atau memperbarui produk saya - Mengelola pesanan saya - Beralih dari satu toko ke toko lain - Tampaknya %1$s bukan situs WooCommerce. - Instal WooCommerce - Tandai\nselesai - Pesanan #%1$d ditandai selesai - Error saat memperbarui Pesanan #%1$d - Mulai berjualan secara langsung dalam waktu kurang dari 20 menit dengan pembaca kartu kami. - Tingkatkan penjualan Anda dengan produk tertaut + Periksa email Anda di perangkat ini! + Gunakan kata sandi untuk login + Login dengan tautan ajaib + Kami baru saja mengirimkan tautan ajaib ke alamat email Anda. Ketuk tautan di email tersebut untuk login. + Login dengan kredensial situs Anda Berikan rekomendasi produk yang membantu dan relevan bagi pelanggan Anda dengan menambahkan upsell dan cross-sell + Tingkatkan penjualan Anda dengan produk tertaut + Mulai berjualan secara langsung dalam waktu kurang dari 20 menit dengan pembaca kartu kami. + Error saat memperbarui Pesanan #%1$d + Pesanan #%1$d ditandai selesai + Tandai\nselesai + Instal WooCommerce + Tampaknya %1$s bukan situs WooCommerce. + Beralih dari satu toko ke toko lain + Mengelola pesanan saya + Membuat atau memperbarui produk saya + Memeriksa analitik saya + Mencoba untuk menyiapkan toko + Hanya menjelajahi + Apa yang mendorong Anda membuka WooCommerce? + Tips + Siapkan sekarang Mari kita mulai! Login dengan WordPress.com Hubungi dukungan + Login dengan akun WordPress.com Anda Minta bantuan! Mengalami masalah terkait login? SKU Semua produk JANGAN TAMPILKAN LAGI INGATKAN SAYA NANTI + Jangan khawatir! Anda bisa memulai Pembayaran Langsung kapan saja di Pengaturan. Pembayaran Langsung Beli Pembaca Kartu Terima pembayaran dengan mudah @@ -1586,12 +1601,10 @@ Language: id Tidak dapat menyimpan perubahan Pesanan akan ditandai sebagai dibayar jika Anda telah menerima pembayaran tanpa melalui WooCommerce Instal Jetpack + Kami membuat Anda bisa memprosesnya dengan mudah Anda dapat mengelolanya dengan cepat dan mudah Kami tahu bahwa hal ini penting untuk kelangsungan bisnis Anda Baru menggunakan WooCommerce - Jangan khawatir! Anda bisa memulai Pembayaran Langsung kapan saja di Pengaturan. - Kami membuat Anda bisa memprosesnya dengan mudah - Login dengan akun WordPress.com Anda Pesanan baru senilai $50 di Toko WooCommerce Anda Ada pesanan baru! 🎉 detail @@ -1600,10 +1613,10 @@ Language: id Bagikan laporan status sistem Salin laporan status sistem ke clipboard Terus Mencari + Pembayaran Langsung untuk Pesanan #%1$s di %2$s blog_id %3$s. Ubah Penyedia Pembayaran Dana dikembalikan: %1$s Menunggu pembayaran - Pembayaran Langsung untuk Pesanan #%1$s di %2$s blog_id %3$s. Lanjutkan Penginstalan Hal yang harus diketahui sebelum menginstal Instal ekstensi @@ -1613,26 +1626,29 @@ Language: id Gagal mencari produk Gagal memuat produk Mencari Produk - Daftar email penagihan yang diizinkan untuk pencocokan saat pesanan dilakukan. Pisahkan alamat email dengan koma. Anda juga dapat menggunakan tanda bintang (*) untuk mencocokkan bagian-bagian dari email. Misalnya \"*@gmail.com\" akan cocok dengan semua alamat gmail. Penyaring (%d) Beberapa alamat email tidak valid. Harap perbaiki alamat email. + Daftar email penagihan yang diizinkan untuk pencocokan saat pesanan dilakukan. Pisahkan alamat email dengan koma. Anda juga dapat menggunakan tanda bintang (*) untuk mencocokkan bagian-bagian dari email. Misalnya \"*@gmail.com\" akan cocok dengan semua alamat gmail. + Maaf, tidak ada produk yang cocok dengan penyaring yang dipilih\" Konfirmasi Metode Pembayaran Stripe Pembayaran WooCommerce Pembayaran Langsung dapat diproses melalui penyedia pembayaran berikut. Penyedia mana yang ingin Anda gunakan? - Untuk mengedit Detail Produk atau Pembayaran, ganti status ke Pembayaran Tertunda. - Tidak ada pelanggan ditemukan - Maaf, tidak ada produk yang cocok dengan penyaring yang dipilih\" Pilih Penyedia Pembayaran Anda terkunci + Untuk mengedit Detail Produk atau Pembayaran, ganti status ke Pembayaran Tertunda. Beberapa bagian dalam pesanan ini tidak dapat diedit Cari pelanggan + Tidak ada pelanggan ditemukan Lain Kali Tambahkan Ekstensi Ke Toko Apa itu WooCommerce Shipping? Akses tarif diskon pengiriman. Saat ini tersedia dengan DHL dan USPS, dan akan segera hadir lebih banyak lagi! Tarif diskon + Buat pesanan, lalu cukup bayar, cetak, kemas, dan kirimkan. Cetak dari telepon Anda + Tidak perlu repot menstok perangko. + Beli perangko jika perlu saja. Hemat waktu dan uang Penuhi pesanan Anda dengan WooCommerce Shipping Tampilkan detail @@ -1658,6 +1674,8 @@ Language: id Harga saat ini berbeda-beda Harga saat ini adalah %s Harga untuk %d variasi akan diperbarui + Campuran + TIdak ada Harga obral Harga normal Harga @@ -1665,11 +1683,6 @@ Language: id Pembaruan massal Oke Pembaruan massal… - Buat pesanan, lalu cukup bayar, cetak, kemas, dan kirimkan. - Tidak perlu repot menstok perangko. - Beli perangko jika perlu saja. - Campuran - TIdak ada Memuat variasi… Pencarian kategori produk gagal Pemuatan kategori produk gagal @@ -1682,12 +1695,13 @@ Language: id Pilih kategori Tutup banner untuk menginstal WC Shipping Dapatkan WooCommerce Shipping - Perlu label pengiriman? Cetak label dari ponsel dengan WooCommerce Shipping. + Perlu label pengiriman? + Ubah jumlah produk dari %1$d menjadi %2$d Perbarui Harga Normal Perbarui Harga Obral - Ubah jumlah produk dari %1$d menjadi %2$d Kami tidak mendukung ekstensi WooCommerce Stripe di %1$s + Penyaring Hapus Pilihan Pilih %d Produk Pilih %d Produk @@ -1699,7 +1713,6 @@ Language: id Aktifkan ini jika kupon tidak berlaku untuk barang obral. Kupon per item hanya dapat digunakan jika barang tidak diobral. Kupon per keranjang hanya dapat digunakan jika ada barang di keranjang yang tidak diobral. Kecualikan Barang Obral Aktifkan ini jika kupon tidak dapat digunakan bersamaan dengan kupon lainnya. - Penyaring Hanya untuk penggunaan individu Batas Penggunaan Per Pengguna Batasi Penggunaan Hingga X Item @@ -1774,12 +1787,12 @@ Language: id Coba metode pengembalian dana lainnya Pengembalian dana ditolak untuk alasan yang tidak diketahui Maaf, pengembalian dana ini tidak dapat diproses. - Salin Pengembalian dana berhasil Memproses pengembalian dana Pembayaran pengembalian dana Pengembalian dana gagal Mempersiapkan pengembalian dana pembayaran + Salin Cari Kupon Tidak dapat membuat pesan berbagi kode kupon Error saat membagikan kode kupon. @@ -1804,9 +1817,18 @@ Language: id Checkout - %s Bagikan tautan pembayaran Jumlah + Jumlah + Pesanan yang Didiskon + Performa + Belanja maksimum%s + Belanja minimum%s + Ringkasan Kupon Lihat ringkasan kupon + Kini Anda dapat melihat dan mengedit kupon dengan perangkat Anda! Lihat dan edit kupon Tidak ada kupon ditemukan + %1$s excl. %2$s + %1$s dan %2$s semua Kedaluwarsa Aktif @@ -1824,15 +1846,6 @@ Language: id \u2022 satu ulasan disetujui \u2022 %d ulasan disetujui %1$s (%2$s%%) - Jumlah - Pesanan yang Didiskon - Performa - Belanja maksimum%s - Belanja minimum%s - Ringkasan Kupon - Kini Anda dapat melihat dan mengedit kupon dengan perangkat Anda! - %1$s excl. %2$s - %1$s dan %2$s Kini Anda dapat membuat pesanan dengan perangkat Anda! Anda dapat mencoba fitur ini dengan mengetuk tombol \"+\" Kembali lagi nanti untuk mendapatkan lebih banyak tips dan wawasan tentang cara mengembangkan toko Anda Selamat, Anda telah membaca semuanya! @@ -1847,20 +1860,20 @@ Language: id Layanan XML-RPC tidak tersedia di situs ini. Harap gunakan email non-Automattic untuk mengirimkan tiket dukungan Kami tidak mendukung akun Stripe yang terdaftar di %1$s + Kami tidak mendukung ekstensi WooCommerce Payments di %1$s Tekan tombol daya di pembaca Anda Tanda terima dikirimkan ke <strong>%s</strong> Persentase (%) - Kami tidak mendukung ekstensi WooCommerce Payments di %1$s Hapus biaya dari pesanan Hapus pengiriman dari pesanan Pengiriman Tambahkan cara pengiriman Tambahkan Pengiriman Nama + Jumlah Biaya Detail pelanggan Tambahkan biaya - Jumlah Sunting catatan pelanggan Sunting detail pelanggan Sunting status pesanan @@ -1877,12 +1890,12 @@ Language: id Segarkan setelah memperbarui Kelola Plugin Pembayaran WooCommerce - Pembayaran Langsung hanya akan berfungsi jika salah satu plugin berikut diaktifkan. Harap nonaktifkan salah satu plugin berikut untuk melanjutkan: - Konflik plugin pembayaran terdeteksi - atau WooCommerce Stripe Gateway Pembayaran Langsung hanya akan berfungsi jika salah satu plugin berikut diaktifkan. Hubungi administrator situs untuk menonaktifkan salah satu plugin berikut untuk melanjutkan: + Pembayaran Langsung hanya akan berfungsi jika salah satu plugin berikut diaktifkan. Harap nonaktifkan salah satu plugin berikut untuk melanjutkan: + Konflik plugin pembayaran terdeteksi Total Pajak + atau Menginstal Jetpack Pembayaran Langsung saat ini tidak tersedia Pesanan dibuat @@ -1911,9 +1924,9 @@ Language: id Kode Sumber Pemberitahuan Privasi untuk California Kebijakan Privasi + Ketentuan Layanan Bekerja dari Mana Saja Berkarya Bersama Kami - Ketentuan Layanan Keluarga Automattic Informasi Hukum dan Lainnya Twitter @@ -1935,12 +1948,12 @@ Language: id aktivasi instalasi Maaf, terjadi kesalahan selama %s - WooCommerce Hei! Berikut tautan untuk mengunduh aplikasi WooCommerce. Saya sangat suka aplikasi ini dan saya rasa Anda juga akan suka. %1$s - review_card_%1$s - review_card_detail - product_card_%1$s + WooCommerce product_card_detail + product_card_%1$s + review_card_detail + review_card_%1$s Perbarui Stripe Hampir jadi! Harap selesaikan pengaturan Stripe untuk mulai menerima Pembayaran dengan Kartu. Selesaikan penyiapan Stripe di admin toko Anda @@ -1953,7 +1966,9 @@ Language: id Tambahkan alamat pengiriman lain Tersedia %s tersedia + Tambahkan produk Produk + Tambahkan Detail Pelanggan Pelanggan Tandai sebagai dibayar Pesanan akan dibuat dan ditandai sebagai dibayar jika Anda telah menerima pembayaran tanpa melalui WooCommerce @@ -1961,18 +1976,16 @@ Language: id Pilih metode pembayaran Anda Pajak dihitung otomatis berdasarkan alamat toko Anda Pajak (%s%%) - Tambahkan Detail Pelanggan - Tambahkan produk Terima pembayaran (%s) Kena pajak Jumlah kustom Masukkan email Simple payment + order_card_detail + order_card_%1$s Uang Tunai Kartu Pajak - order_card_%1$s - order_card_detail Email Tambahkan catatan Catatan Pelanggan @@ -2026,8 +2039,9 @@ Language: id Masukkan jumlah Terima pembayaran Simple payment - Analytics Buat pesanan dari perangkat Anda! + Analytics + Semua selesai Menyambungkan ke toko Anda Mengaktifkan Menginstal Jetpack @@ -2039,17 +2053,17 @@ Language: id Error saat memuat ulasan produk Sambungan pembaca terputus Pembaca terhubung - Semua selesai Membatalkan pembaruan perangkat lunak yang sedang berlangsung tidak dianjurkan. Pembatalan akan memblok sambungan pembaca Anda. Pembaruan perangkat lunak pembaca gagal karena daya baterai pembaca tidak cukup. Isi daya pembaca di atas 50%% sebelum mencoba lagi. - Isi daya pembaca Pembaruan perangkat lunak pembaca gagal karena daya baterai hanya terisi %1$s%%. Isi daya pembaca di atas 50%% sebelum mencoba lagi. + Isi daya pembaca Perangkat lunak pembaca kartu Anda perlu diperbarui agar dapat berfungsi normal Cantumkan kode pos yang valid pada pengaturan toko Anda lalu coba lagi Kode pos alamat toko tidak valid Masukan alamat: Cantumkan alamat toko Anda untuk melanjutkan Periksa perangkat seluler Anda + Tidak dapat memperbarui alamat dengan alamat email kosong. Pastikan Anda menggunakan WooCommerce versi terbaru. 30 hari terakhir 7 hari terakhir 2 Hari Terakhir @@ -2058,7 +2072,6 @@ Language: id Semua Pesanan disaring Semua Pesanan - Tidak dapat memperbarui alamat dengan alamat email kosong. Pastikan Anda menggunakan WooCommerce versi terbaru. Lain Kali Menginstal Jetpack Izinkan banyak pengguna untuk mengakses WooCommerce Mobile. @@ -2111,8 +2124,8 @@ Language: id Laporan status sistem Selamat, Anda sekarang dapat menerima pembayaran kartu debit dan kredit menggunakan WooCommerce Payments! Kumpulkan pembayaran dengan pembaca kartu - Oke Jumlah minimal %1$s + Oke Gambar ikon fitur baru Beralih toko Gagal memperbarui produk %1$s @@ -2140,23 +2153,23 @@ Language: id Add-on Produk Menyimpan produk Anda Menunggu Peninjauan + Mohon pastikan pembaca kartu sudah terhubung. Coba lagi dengan kartu lainnya Coba ketuk, masukkan, atau gesek kartu Anda lagi Beberapa kartu terdeteksi. Coba lagi dengan satu kartu + Ambil kartu Coba lagi dengan kartu yang sama %d objek %d item %d hari kerja %d hari kerja - Mohon pastikan pembaca kartu sudah terhubung. - Ambil kartu + Kami tidak dapat secara otomatis memverifikasi alamat pengiriman: %s Kami tidak dapat memverifikasi alamat pengirim secara otomatis. Lihat di Google Maps untuk memastikan alamat sudah benar. Kami berupaya untuk lebih memudahkan Anda melihat add-on produk dari perangkat! Untuk sekarang, Anda akan dapat melihat add-on untuk pesanan Anda. Anda dapat membuat dan menyunting add-on ini pada dasbor web Anda. - Kami tidak dapat secara otomatis memverifikasi alamat pengiriman: %s - Simpan Lihat add-on dari perangkat Anda! Jika ingin mengubah nama add-on pada dasbor web, harap perhatikan bahwa pesanan sebelumnya tidak akan menampilkan add-on tersebut dalam aplikasi. Lihat Add-on + Simpan Unggah detail (%d) File %d tidak dapat diunggah File %d tidak dapat diunggah @@ -2176,6 +2189,7 @@ Language: id Cetak label pengiriman Pembayaran langsung Pembaca Anda memerlukan waktu sekitar tiga jam untuk terisi penuh + Pastikan pembaca selalu memiliki daya Pembaca Anda akan masuk mode tidur setelah 10 menit tidak aktif. Cukup tekan tombol daya untuk menghubungkannya kembali. Penghubungan kembali Automattic Untuk menerima pembayaran, cukup geser, ketuk, atau sisipkan kartu pada pembaca @@ -2187,11 +2201,10 @@ Language: id Pembayaran Langsung tidak tersedia dalam Mode Pengujian. Harap matikan untuk melanjutkan. Pembayaran Langsung saat ini tidak tersedia Ada persyaratan yang tertunda di akun Anda. Penuhi persyaratan tersebut dengan %1$s agar dapat tetap menerima Pembayaran Langsung. + Ada persyaratan untuk Akun Anda yang belum dipenuhi Anda memiliki setidaknya satu persyaratan yang terlambat di akun Anda. Harap penuhi persyaratan tersebut untuk dapat terus menggunakan Pembayaran Langsung Pembayaran Langsung saat ini tidak tersedia Anda akan dapat menerima Pembayaran Langsung segera setelah kami selesai meninjau akun Anda. - Pastikan pembaca selalu memiliki daya - Ada persyaratan untuk Akun Anda yang belum dipenuhi Pembayaran Langsung saat ini tidak tersedia Mohon maaf, kami tidak dapat mendukung Pembayaran Langsung untuk toko ini. Segarkan setelah memperbarui @@ -2208,6 +2221,7 @@ Language: id <a href=\'\'>Pelajari lebih lanjut</a> tentang penerimaan pembayaran dengan perangkat seluler Anda dan pemesanan pembaca kartu Butuh bantuan? <a href=\'\'>Hubungi dukungan</a> Anda masih dapat menerima Pembayaran Tunai secara Langsung dengan mengaktifkan metode pembayaran \"bayar di tempat\" di toko Anda + Kami tidak mendukung Pembayaran Langsung Kartu di %1$s Menghubungkan ke akun Anda Pembayaran langsung Pastikan kembali dimensi dan berat paket atau coba gunakan paket lain di Detail Paket @@ -2215,7 +2229,6 @@ Language: id Semua paket yang tersedia telah diaktifkan Mengaktifkan paket Pilih paket yang ingin diaktifkan. - Kami tidak mendukung Pembayaran Langsung Kartu di %1$s Kolom wajib diisi Tutup Variasi Dibuat @@ -2224,11 +2237,11 @@ Language: id Buat Variasi Karena atribut sudah ditambahkan, Anda sekarang bisa membuat variasi pertama Anda! Atribut dibuat + %1$s%% selesai Membatalkan pembaruan perangkat lunak yang sedang berlangsung tidak dianjurkan Maaf, pembayaran ini tidak dapat diproses Tidak ada koneksi ke server Tidak ada koneksi internet - %1$s%% selesai Kirim menggunakan kemasan asli Tambah ke paket baru Item ini saat ini berada di %s. Ke mana Anda ingin memindahkannya? @@ -2239,6 +2252,7 @@ Language: id Gagal membuat paket. Harap coba lagi. Gagal membuat paket: ada masalah API yang tidak diketahui. Gagal membuat paket: %1$s + Harap tunggu… Membuat paket baru Nilai tidak valid. Kolom ini harus diisi. @@ -2252,11 +2266,10 @@ Language: id Kotak Pilih jenis paket Jenis paket + Siapkan paket yang akan digunakan untuk mengirim produk Anda. Kami akan menyimpannya untuk pesanan selanjutnya. Tambah paket baru Buat paket baru Dimensi paket harus lebih besar dari nol. Untuk melanjutkan, silakan perbarui dimensi item di bagian Pengiriman halaman produk Anda. - Harap tunggu… - Siapkan paket yang akan digunakan untuk mengirim produk Anda. Kami akan menyimpannya untuk pesanan selanjutnya. Kemasan asli Dimensi Item Item yang Dikirim Terpisah @@ -2269,11 +2282,11 @@ Language: id Pemeriksaan pembaruan versi perangkat lunak gagal <a href=\'\'>Pelajari lebih lanjut</a> tentang menerima pembayaran dengan perangkat seluler dan memesan pembaca kartu Aktifkan Bluetooth + Tidak ada pembaca yang terhubung Tidak dapat menyambungkan pembaca Hubungkan Ditemukan beberapa pembaca Pesanan sudah dibayar - Tidak ada pembaca yang terhubung Terima kasih atas pembelian Anda! Klik tautan di bawah untuk melihat tanda terima pembayaran Anda.\n\n%s Terjadi error saat mengunduh formulir bea cukai Cetak faktur bea cukai @@ -2289,11 +2302,12 @@ Language: id Tambahkan produk Atribut variasi Aktifkan bluetooth perangkat seluler + Terjadi error saat mengambil pesanan. Status pesanan pada aplikasi mungkin telah usang. Tanda terima Anda dari %s Menyegarkan pesanan Memperbarui status aplikasi Pelanggan Anda memilih %1$s - Terjadi error saat mengambil pesanan. Status pesanan pada aplikasi mungkin telah usang. + Formulir bea cukai wajib menyertakan nomor telepon 10 digit Formulir bea-cukai diisi Jika mengalami masalah pencetakan dari perangkat Anda, hubungi dukungan pelanggan untuk mesin cetak Anda. Jika pencetakan tidak tersedia, Anda bisa selalu menyimpan tanda terima ke dalam format PDF dan mengirimkannya melalui email untuk mencetaknya dari perangkat lain. @@ -2306,16 +2320,19 @@ Language: id Untuk membuat variasi, Anda perlu mengatur atributnya (yaitu \"Warna\", \"Ukuran\") terlebih dahulu 1 variasi %1$s variasi - Formulir bea cukai wajib menyertakan nomor telepon 10 digit Pelacakan USPS Memperbarui perangkat lunak pembaca Anda Pembaruan perangkat lunak Perangkat lunak pembaca diperbarui NAMA PEMBACA KARTU TIDAK DIKENALI + Putus sambungan pembaca Harap perbarui perangkat lunak pembaca Anda untuk dapat terus menerima pembayaran Perbarui perangkat lunak pembaca + %s%% baterai PEMBACA KARTU TERHUBUNG Hubungkan pembaca kartu + Aktifkan pembaca kartu dan pasang di sebelah perangkat seluler + Pastikan pembaca kartu telah terisi daya Hubungkan pembaca kartu Anda Kartu ditolak Menyambungkan ke pembaca @@ -2328,8 +2345,10 @@ Language: id Berat (%1$s per unit) Nilai (%1$s per unit) %1$s mengenai nomor Tarif HS + %1$s mengenai Nomor Transaksi Internal (ITN) Baris Kustom %1$d Lainnya + Pemeriksaan Sanitasi/Fitosanitasi Karantina Tiada Lainnya @@ -2352,12 +2371,6 @@ Language: id Jenis isi Kembalikan ke pengirim jika paket tidak dapat dikirimkan hingga %s - Putus sambungan pembaca - %s%% baterai - Aktifkan pembaca kartu dan pasang di sebelah perangkat seluler - Pastikan pembaca kartu telah terisi daya - %1$s mengenai Nomor Transaksi Internal (ITN) - Pemeriksaan Sanitasi/Fitosanitasi Jika Anda mengaktifkan pengaturan ini, pelanggan akan menerima email konfirmasi setelah pesanan selesai Tinjau pesanan 🎉 Pesanan selesai! @@ -2366,16 +2379,20 @@ Language: id Pelajari lebih lanjut tentang peran dan izin Aplikasi ini hanya mendukung peran pengguna Administrator dan Manajer Toko. Harap hubungi pemilik toko Anda untuk mengupgrade peran Anda. Edit dan tambahkan produk baru dari mana saja - Lewati Kelola dan sunting pesanan dari mana saja Lacak penjualan dan produk dengan performa tinggi + Lewati Produk eksternal Produk yang dikelompokkan Produk variabel Produk digital unik, seperti layanan atau buku, musik, dan video yang dapat diunduh + Produk fisik unik yang mungkin perlu dikirimkan kepada pelanggan Produk fisik sederhana Buka pengaturan Buka pengaturan + Bluetooth dinonaktifkan + Lokasi dinonaktifkan + Izin lokasi tepat tidak ditemukan Tidak dapat menyambungkan ke pembaca. Menyambungkan ke pembaca Sambungkan ke pembaca @@ -2383,11 +2400,9 @@ Language: id Memindai pembaca Jumlah item Buat label pengiriman baru - Produk fisik unik yang mungkin perlu dikirimkan kepada pelanggan - Bluetooth dinonaktifkan - Lokasi dinonaktifkan - Izin lokasi tepat tidak ditemukan + Produk virtual sederhana Apakah Anda ingin menghapus Variasi ini? + Membuat variasi Menghapus produk Kirimkan tanda terima Cetak tanda terima @@ -2401,16 +2416,14 @@ Language: id TIdak dapat mempratinjau label pengiriman. Instal aplikasi penampil PDF, lalu coba lagi. Kami tidak dapat mendeteksi situs WordPress di alamat yang Anda masukkan. Pastikan WordPress terinstal dan Anda menggunakan versi terbaru yang tersedia. sejumlah baris pengiriman - Produk virtual sederhana - Membuat variasi Tidak dapat menandai pesanan telah selesai Terjadi error saat membeli label Harap tunggu… Membeli label + Gambar label yang disimpan lebih dari 180 hari akan dihapus menggunakan mitra teknologi kami demi alasan keamanan umum dan privasi data. Cetak label pengiriman Simpan untuk nanti Label pengiriman dibeli! - Gambar label yang disimpan lebih dari 180 hari akan dihapus menggunakan mitra teknologi kami demi alasan keamanan umum dan privasi data. Label yang sudah disimpan lebih dari 30 hari tidak bisa mendapatkan pengembalian dana Jenis Ubah Nama @@ -2431,66 +2444,69 @@ Language: id Hanya pemilik situs yang dapat mengelola metode pembayaran label pengiriman. Silakan hubungi Pemilik Toko %1$s (%2$s) untuk mengelola metode pembayaran. Tambah variasi Tambahkan Variasi + Buat variasi pertama Anda Total %s %s tarif dipilih + Memenuhi syarat untuk diproses tanpa tanda tangan Memenuhi syarat untuk penjemputan gratis + Asuransi (%s) + pelacakan Sertakan %s Tanda tangan orang dewasa wajib diisi (%s) Tanda tangan wajib diisi (%s) - Memenuhi syarat untuk diproses tanpa tanda tangan - Asuransi (%s) - pelacakan Pelanggan membayar %1$s dari %2$s untuk pengiriman - Buat variasi pertama Anda + Ketika membeli label pengiriman dengan WooCommerce, Anda bisa berhemat 5% hingga 40% dibandingkan dengan tarif kantor pos. + Apa itu diskon WooCommerce Services? + Terjadi error saat memuat pilihan pengiriman Operator dan tarif Beli label pengiriman Tandai pesanan ini selesai dan kirim pemberitahuan ke pelanggan Total pesanan + Pelajari selengkapnya tentang diskon WooCommerce Services + Diskon WooCommerce Services Subtotal Ringkasan pesanan label pengiriman gratis Lainnya Opsi dengan nama ini sudah ada. Atribut dengan nama ini sudah ada. + Tambahkan tiap nama opsi lalu tekan enter Atau ketuk untuk memilih opsi yang sudah ada Nama pilihan - Apa itu diskon WooCommerce Services? - Terjadi error saat memuat pilihan pengiriman - Pelajari selengkapnya tentang diskon WooCommerce Services - Diskon WooCommerce Services - Tambahkan tiap nama opsi lalu tekan enter - Ketika membeli label pengiriman dengan WooCommerce, Anda bisa berhemat 5% hingga 40% dibandingkan dengan tarif kantor pos. - Harap tunggu… - %1$s****%2$s - Tambahkan kartu kredit lain - Harap tunggu… Terjadi error saat menyimpan pengaturan Anda + Harap tunggu… Menyimpan pengaturan Anda Berakhir pada %1$s Kirimkan email tanda terima pembelian label ke %1$s (%2$s) di %3$s Kartu kredit diambil dari akun WordPress.com berikut: %1$s <%2$s> + %1$s****%2$s + Tambahkan kartu kredit lain Metode pembayaran dipilih + Harap tunggu… Mengambil pengaturan Anda + Kartu kredit berakhir dalam %1$s Paypal VISA MasterCard Temukan American Express - Tambahkan Fitur - Atribut - Kartu kredit berakhir dalam %1$s Atau ketuk untuk memilih atribut yang sudah ada Nama atribut baru + Tambahkan Fitur + Atribut Sunting atribut + Total berat paket: %1$s %2$s %1$d item pada paket %2$d Total berat paket: %1$s %2$s Paket khusus Tidak dapat mengambil produk + Beberapa kolom wajib belum diisi. Berat tidak valid Paket yang Dipilih Harap tunggu… Memuat Paket! Paket %1$d + %d objek Tidak dapat memuat definisi paket Mencakup berat paket Total berat paket (%1$s) @@ -2503,17 +2519,16 @@ Language: id Kami sedikit mengubah alamat yang dimasukkan. Jika sudah benar, gunakan alamat yang disarankan untuk memastikan pengiriman yang akurat. Sunting alamat yang dipilih Gunakan alamat yang dipilih - Beberapa kolom wajib belum diisi. - Total berat paket: %1$s %2$s - %d objek Memuat data alamat Tersedia fitur baru! + Temukan di Peta Hubungi Pelanggan Nama jalan tidak valid Nomor rumah tidak ada Alamat tidak ditemukan Kami tidak dapat memverifikasi alamat pengiriman secara otomatis. Lihat di Google Maps atau coba hubungi pelanggan untuk memastikan alamat sudah benar. Validasi alamat gagal + Harap tunggu… Validasi alamat sedang berlangsung Tidak dapat memuat data alamat Gunakan alamat yang dimasukkan @@ -2524,8 +2539,6 @@ Language: id Telepon Perusahaan Nama - Harap tunggu… - Temukan di Peta Aplikasi Google Maps tidak ditemukan Harap tunggu… Maaf, penghapusan gambar pada variasi produk baru bisa dilakukan di WooCommerce 4.7 atau yang lebih baru. @@ -2541,30 +2554,31 @@ Language: id Informasi kemasan Buat label pengiriman Pelajari lebih lanjut + Tak perlu antre saat di kantor pos dengan mencetak label pengiriman di rumah dari perangkat seluler dengan harga diskon! Hemat waktu dan biaya dengan memproses pesanan menggunakan WooCommerce Shipping Pengiriman WooCommerce Tandai pesanan selesai + Pelajari selengkapnya tentang membuat label menggunakan perangkat seluler Buat label pengiriman - Buat label pengiriman dari perangkat Anda! Sekarang Anda dapat membuat label pengiriman untuk semua pesanan fisik langsung dari perangkat Anda dengan plugin WooCommerce Shipping gratis. Ketuk \"Buat label pengiriman\" untuk mencoba fitur beta kami! - Tak perlu antre saat di kantor pos dengan mencetak label pengiriman di rumah dari perangkat seluler dengan harga diskon! - Pelajari selengkapnya tentang membuat label menggunakan perangkat seluler - Sunting + Buat label pengiriman dari perangkat Anda! Biaya Pembayaran Bersih Berbayar Pelajari selengkapnya tentang cara menghubungkan Jetpack + Sunting Validasi Tarik dan lepas untuk mengurutkan foto - Hapus Pengaturan Unduh Harap masukkan nama yang valid Masukkan URL file + Pustaka Media WordPress Pastikan url yang dimasukkan valid Harap tunggu… Mengunggah file Error saat mengunggah file Tambahkan file yang dapat diunduh + Tambahkan berkas yang dapat diunduh dari Termasuk file yang dapat diunduh dengan pembelian Batal Ya, ubah @@ -2573,6 +2587,7 @@ Language: id File Anda yakin ingin menghapus file ini? Produk yang dapat diunduh + Hapus Masa berlaku unduhan Batas unduhan Masukkan jumlah hari sebelum tautan unduhan kedaluwarsa, atau biarkan kosong jika tidak ada masa berlaku @@ -2587,13 +2602,11 @@ Language: id Anda mungkin perlu <b>mengonfigurasi pencetakan melalui WiFi langsung dari mesin cetak.</b> Pastikan firmware mesin cetak sudah diperbarui dan lihat manual mesin cetak untuk mengetahui petunjuknya. Anda dapat memilih <b>layanan cetak default</b> perangkat atau pasang <b>aplikasi khusus mesin cetak</b> Anda (ini akan muncul sebagai opsi yang disarankan) Pastikan mesin cetak dan perangkat Anda terhubung ke <b>jaringan WiFi yang sama</b> - Pustaka Media WordPress - Tambahkan berkas yang dapat diunduh dari + Gunakan pembuatan produk baru yang sederhana, ditautkan, dan dikelompokkan saat kami bersiap untuk meluncurkan Tingkatkan penjualan dengan upsell dan cross-sell Edit produk Tambahkan produk Produk dipromosikan dalam keranjang saat produk tersebut dipilih - Gunakan pembuatan produk baru yang sederhana, ditautkan, dan dikelompokkan saat kami bersiap untuk meluncurkan Cross-sells Produk akan dipromosikan dari produk yang sedang dilihat (yaitu: produk yang lebih menguntungkan) Upsell @@ -2601,6 +2614,7 @@ Language: id %1$s%2$s x %3$s Dapatkan tautan masuk lewat email Hmm, kami tidak dapat menemukan akun WordPress.com yang terhubung dengan alamat email ini. + Uji coba fitur melihat Add-on Pesanan menjelang peluncuran Membuat produk Preferensi Kesalahan saat membuang produk @@ -2612,25 +2626,24 @@ Language: id Menambahkan opsi seperti ukuran dan warna saat ini hanya tersedia pada web. Pilihan tersebut akan muncul sebagai opsi pada halaman produk situs Anda. Buat produk dari aplikasi! Produk tidak ditemukan + Jika masih mengalami masalah mencetak dari perangkat, Anda dapat <b>menyimpan label Anda dalam format PDF</b> dan mengirimkannya melalui email ke perangkat lain untuk dicetak. + Setelah memilih <b>\"Cetak label pengiriman\"</b>, Anda harus memilih dan menambahkan mesin cetak jika belum pernah mencetak dari perangkat ini sebelumnya. Opsi format Label + Cetak dari perangkat Anda Label (4 x 6 inci) Letter (8,5 x 11 inci) Legal (8,5 x 14 inci) Kesalahan saat menampilkan pratinjau label pengiriman + Tidak tahu cara mencetak dari perangkat seluler Anda? Lihat tata letak label dan opsi ukuran kertas Cetak label pengiriman Pilih ukuran kertas Ukuran kertas + Jika Anda telah menggunakan label pada kemasan, mencetak dan menggunakannya kembali merupakan pelanggaran terhadap ketentuan layanan kami. Jika terjadi kesalahan mencetak saat Anda membeli label, Anda dapat mencetaknya kembali. Kami berusaha mempermudah Anda agar dapat mencetak label pengiriman langsung dari perangkat Anda! Untuk saat ini, jika telah membuat label pengiriman untuk pesanan ini di admin toko Anda dengan Pengiriman WooCommerce, Anda dapat mencetaknya di Detail Pesanan di sini. Cetak label pengiriman dari perangkat Anda! - Cetak dari perangkat Anda - Jika Anda telah menggunakan label pada kemasan, mencetak dan menggunakannya kembali merupakan pelanggaran terhadap ketentuan layanan kami. - Jika masih mengalami masalah mencetak dari perangkat, Anda dapat <b>menyimpan label Anda dalam format PDF</b> dan mengirimkannya melalui email ke perangkat lain untuk dicetak. - Setelah memilih <b>\"Cetak label pengiriman\"</b>, Anda harus memilih dan menambahkan mesin cetak jika belum pernah mencetak dari perangkat ini sebelumnya. Cetak label pengiriman - Uji coba fitur melihat Add-on Pesanan menjelang peluncuran - Tidak tahu cara mencetak dari perangkat seluler Anda? \u0022%1$s\u0022 Draf produk disimpan Kesalahan saat menyimpan draf produk @@ -2678,12 +2691,12 @@ Language: id Login dengan akun lain Pilih toko untuk menghubungkan Lanjutkan dengan WordPress.com + Produk dengan variasi seperti warna atau ukuran %d produk dipilih %d produk dipilih Tambahkan produk ke grup Tambahkan produk Masukkan kata sandi - Produk dengan variasi seperti warna atau ukuran Kembali ke toko Hubungi kami di sini Harap perhatikan bahwa ini bukan tiket dukungan, kami tidak dapat merespons umpan balik secara perorangan.\n\nButuh bantuan? %1$s @@ -2708,8 +2721,8 @@ Language: id Tidak ada harga yang ditentukan Diaktifkan Anda harus menentukan harga obral jika ada obral yang dijadwalkan - %1$s berikan ulasan Anda kini dapat menyunting produk yang dikelompokkan, eksternal, dan variabel; mengubah jenis produk; serta memperbarui kategori dan tag. + %1$s berikan ulasan Saya suka Perlu ditingkatkan Suka dengan aplikasi WooCommerce? @@ -2718,24 +2731,24 @@ Language: id Terjadi error saat menambahkan tag Menambahkan tag Pengembalian dana Anda sedang diproses. Harap tunggu… + Permintaan pengembalian dana berhasil dikirim Kembalikan dana label (-%1$s) Jumlah yang memenuhi syarat pengembalian dana Tanggal pembelian + Anda dapat meminta pengembalian dana untuk label pengiriman yang belum digunakan untuk mengirim paket. Pengembalian dana akan diproses paling cepat dalam 14 hari. Minta pengembalian dana Kembalikan dana label pengiriman - Anda dapat meminta pengembalian dana untuk label pengiriman yang belum digunakan untuk mengirim paket. Pengembalian dana akan diproses paling cepat dalam 14 hari. - Permintaan pengembalian dana berhasil dikirim Fisik Kutipan singkat tentang produk Anda Buat produk Anda lebih mudah ditemukan dengan tag Tata produk Anda ke dalam kelompok yang berkaitan - Dinonaktifkan Tambahkan berat dan dimensi Tambahkan detail selengkapnya Atur produk Anda dalam tag Tambahkan tag pertama Anda Tag Tambahkan tag + Dinonaktifkan Produk virtual Tambahkan detail selengkapnya %1$s produk @@ -2743,7 +2756,9 @@ Language: id %s produk Produk yang tersisa %1$s \u2022 %2$s + Label %1$s diminta pengembalian dananya Lacak pengiriman + %1$s\n%2$s Sembunyikan detail pengiriman Tampilkan detail pengiriman Kartu Kredit @@ -2753,8 +2768,6 @@ Language: id Dikirim ke Dikirim dari Paket %d - %1$s\n%2$s - Label %1$s diminta pengembalian dananya SKU: %1$s %1$s (%2$s opsi) Label Pengiriman @@ -2775,8 +2788,8 @@ Language: id Pemberitahuan privasi untuk pengguna di California Simpan perubahan Sampai %1$s - Tersedia pilihan penyuntingan baru Kami telah menambahkan lebih banyak fungsi penyuntingan ke produk! Sekarang Anda dapat memperbarui gambar, melihat pratinjau, dan berbagi produk Anda. + Tersedia pilihan penyuntingan baru Penyuntingan terbatas tersedia Produk %1$s x %2$s @@ -2870,11 +2883,11 @@ Language: id Lebar Panjang Produk yang dananya dikembalikan + %1$s (%2$s x %3$d) %1$s melalui %2$s Apakah Anda yakin ingin meminta pengembalian dana? Hal ini tidak dapat dibatalkan. Produk yang dananya dikembalikan Pengembalian dana - %1$s (%2$s x %3$d) Daftar ke WordPress.com Maaf, kami tidak dapat menemukan hasil untuk \"%s\" Tangkap ulasan produk kualitas tinggi untuk toko Anda @@ -2895,32 +2908,33 @@ Language: id Tambahkan inventaris Mencari pesanan Anda… Masukkan teks + Masukkan Nama Produk + Produk disimpan Error saat memperbarui produk Harap tunggu… Deskripsikan produk Anda Deskripsi Sunting deskripsi - Masukkan Nama Produk - Produk disimpan - Selesai Ingin membuang perubahan? Perbarui + Selesai Pengembalian dana sedang berlangsung, harap tunggu… + Kembalikan dana pengiriman Pilih jumlah Pengembalian dana pengiriman Pengembalian dana produk + %1$s x %2$s tiap buah %d item terpilih Tidak memilih Pilih semua Menunggu konfirmasi pengembalian dana… - Kembalikan dana pengiriman - %1$s x %2$s tiap buah Ubah ukuran dan kompres gambar agar pengunggahan lebih cepat Optimasi gambar Ambil foto Pilih dari perangkat Pilih metode pengunggahan Unggahan + Mengunggah gambar…%1$d dari %2$d Mengunggah gambar… Tidak dapat mengakses kamera Anda yakin ingin menghapus gambar ini? @@ -2935,7 +2949,6 @@ Language: id Tambahkan gambar Mendatang Buang - Mengunggah gambar…%1$d dari %2$d Kami tidak dapat mengakses situs Anda. Anda harus menghubungi host untuk mengatasi masalah ini. Kami tidak dapat mengakses situs Anda karena ada masalah dengan <b>Sertifikat SSL</b>. Anda harus menghubungi host untuk mengatasi masalah ini. Kami tidak dapat mengakses situs Anda akrena hal ini membutuhkan <b>Autentikasi HTTP</b>. Anda harus menghubungi host untuk mengatasi masalah ini. @@ -2944,8 +2957,8 @@ Language: id Login dengan kredensial situs. Login dengan kredensial situs %1$s Kirim email verifikasi - Penyuntingan produk Uji fungsionalitas penyuntingan produk baru saat kami mempersiapkan peluncuran + Penyuntingan produk Ada masalah saat mengambil akun Anda. Anda dapat mencoba lagi sekarang atau menutupnya dan mencoba lagi nanti. Terjadi error. Harap login untuk melanjutkan Menyambungkan ke situs Anda… @@ -2980,15 +2993,20 @@ Language: id Tidak ada produk yang cocok Belum ada produk %s tersedia + Tersedia \u2022 %d variasi Gambar produk %1$s memberikan ulasan di %2$s Tidak disetujui Error saat memuat ulasan produk baru Error saat memuat ulasan produk - Tersedia \u2022 %d variasi + Ada masalah dengan pengembalian dananya. Coba lagi. + Pengembalian dana tidak berhasil dikirim. + Pengembalian dana Anda untuk %s sedang diproses. Harap tunggu… Ikon kutipan Pengembalian dana manual Rincian pengembalian dana + Dana dikembalikan melalui %s + Kembalikan dana melalui Alasan pengembalian dana (opsional) Alasan pengembalian dana Jumlah pengembalian dana @@ -3001,11 +3019,6 @@ Language: id Pengembalian dana %s %s tersedia untuk pengembalian dana Keluarkan pengembalian dana - Dana dikembalikan melalui %s - Kembalikan dana melalui - Ada masalah dengan pengembalian dananya. Coba lagi. - Pengembalian dana tidak berhasil dikirim. - Pengembalian dana Anda untuk %s sedang diproses. Harap tunggu… %1$s melalui %2$s Statistik yang disempurnakan Fitur-fitur Beta @@ -3019,12 +3032,12 @@ Language: id Statistik Hari Ini Masuk Sudah punya Jetpack? %1$s + Mencoba login dengan Jetpack… segarkan aplikasi untuk melanjutkan + Untuk menggunakan aplikasi ini untuk %1$s Anda perlu melakukan penyiapan plugin Jetpack dan terhubung ke akun ini. \n\nSetelah disiapkan, segarkan aplikasi Coba toko lain Database di-downgrade, membuat ulang tabel dan memuat toko Memuat toko - Mencoba login dengan Jetpack… - Untuk menggunakan aplikasi ini untuk %1$s Anda perlu melakukan penyiapan plugin Jetpack dan terhubung ke akun ini. \n\nSetelah disiapkan, segarkan aplikasi Tidak ditemukan operator Masukkan alamat situs web lengkap, seperti contoh.com. Belum ada ulasan! @@ -3035,11 +3048,12 @@ Language: id Tidak dapat memuat pengaturan: Beberapa API tidak tersedia untuk kombinasi ID aplikasi OAuth + akun ini. Kami membuka lowongan! Salin nomor pelacakan - segarkan aplikasi Memeriksa WooCommerce… + segarkan aplikasi Tidak ada alamat yang dicantumkan Perlu bantuan untuk menemukan email yang terhubung dengan Anda? Situs web di alamat ini bukan situs WordPress. Agar kami dapat terhubung ke situs tersebut, situs harus menggunakan WordPress. + Login dengan WordPress.com untuk terhubung ke <b>%1$s</b> Zimbabwe Zambia Yaman @@ -3176,7 +3190,6 @@ Language: id Jamaika Pantai Gading Italia - Login dengan WordPress.com untuk terhubung ke <b>%1$s</b> Israel Pulau Man Irlandia @@ -3283,15 +3296,24 @@ Language: id Afghanistan Kepulauan Åland Ulasan + Operator Kustom Kustom + Silakan masukkan nama operator Silakan masukkan nomor pelacakan + Silakan pilih operator Anda yakin ingin membuang pelacakan ini? Tidak dapat menambahkan pelacakan Pelacakan pengiriman ditambahkan + Error saat memuat operator + Operator Pengiriman Terpilih + Operator Pengiriman Tanggal pengiriman Masukkan tautan pelacakan + Masukkan nama operator Masukkan nomor Pelacakan + Pilih operator Tautan pelacakan (opsional) + Nama operator Nomor pelacakan Carrier Tambahkan Pelacakan @@ -3304,25 +3326,19 @@ Language: id Lacak pengiriman Di admin situs, Anda bisa menemukan email yang Anda gunakan untuk terhubung ke WordPress.com dari %1$sDasbor Jetpack%2$s di bagian %3$sKoneksi > Koneksi akun%4$s Email apa yang saya gunakan untuk masuk? + Perlu bantuan untuk menemukan email yang dibutuhkan? Jetpack merupakan plugin WordPress gratis yang menghubungkan toko Anda dengan peralatan yang diperlukan agar dapat memberikan pengalaman seluler terbaik, mencakup pemberitahuan push dan statistik Apa itu Jetpack? Lihat toko terhubung - Lanjutkan menyunting - Operator Kustom - Silakan masukkan nama operator - Silakan pilih operator - Error saat memuat operator - Operator Pengiriman Terpilih - Operator Pengiriman - Masukkan nama operator - Pilih operator - Nama operator Sepertinya %1$s terhubung ke akun WordPress.com lain. - Perlu bantuan untuk menemukan email yang dibutuhkan? + Lanjutkan menyunting Silakan login dengan nama pengguna dan kata sandi Anda. Silakan login menggunakan nama pengguna WordPress.com sebagai ganti alamat email Anda. Situs di alamat ini bukan situs WordPress. Agar kami dapat menghubungkannya, situs harus menggunakan WordPress. Pusat Bantuan + Virtual + Dikelompokkan + Variabel Izinkan, tetapi beri tahu pelanggan Izinkan Jangan izinkan @@ -3330,9 +3346,6 @@ Language: id Tidak ada stok Tersedia Baca selengkapnya - Dikelompokkan - Variabel - Virtual Tidak dapat memuat gambar Konsep Privat @@ -3378,11 +3391,11 @@ Language: id Coba sekarang Saya mengerti Ketuk untuk beralih toko + Pilih toko Logout Ubah status pesanan Klik untuk mengubah status pesanan Terapkan - Pilih toko Tidak, terima kasih Nanti Beri penilaian sekarang @@ -3396,11 +3409,11 @@ Language: id Perbarui Toko ke WooCommerce 3.5 Tidak dapat terhubung ke %s Selesai + Terjadi error saat menandai semua ulasan sudah dibaca Tandai semua sudah dibaca Pesan Telepon Telepon atau kirim pesan ke pelanggan - Terjadi error saat menandai semua ulasan sudah dibaca Terjadi error saat memperbarui status ulasan produk Terjadi error saat memuat detail ulasan produk Buang @@ -3413,16 +3426,16 @@ Language: id Kelola pemberitahuan Pemberitahuan Anda yakin ingin logout dari akun %s? - Jika dinonaktifkan, catatan akan diatur sebagai pribadi Ulasan ditandai %1$s + Jika dinonaktifkan, catatan akan diatur sebagai pribadi Terjadi error saat mengambil pesanan Kembali Pemberitahuan ulasan produk Pemberitahuan pesanan baru Ke pelanggan + Memverifikasi situs… Petunjuk pembaruan Cari - Memverifikasi situs… Segarkan dan %d lainnya. %d pemberitahuan baru @@ -3454,9 +3467,9 @@ Language: id Laporan masalah crash Bagikan Versi %s - Kami terlalu banyak melakukan upaya pengiriman kode verifikasi SMS. Tunggu sebentar, dan minta kode yang baru beberapa saat lagi. - Tidak ada akun WordPress.com yang cocok dengan akun Google ini. - Login ke akun WordPress.com yang Anda gunakan untuk menghubungkan Jetpack. + Kata sandi HTTP + Nama pengguna HTTP + Otorisasi diwajibkan Tautan ajaib terkirim Pendaftaran email Verifikasi kode @@ -3465,66 +3478,55 @@ Language: id Login tautan ajaib Login alamat situs Login alamat email - Belum memiliki akun? %1$sDaftar%2$s - Mendaftar dengan Google… + Terjadi error. + Masukkan kode autentikasi untuk melanjutkan. + Periksa lagi kata sandi Anda sebelum melanjutkan. + Login dihentikan + Harap tunggu proses login. + Login sedang berlangsung… + Ketuk untuk melanjutkan. + Sudah login! + Terjadi error jaringan. Periksa koneksi Anda dan coba lagi. + Masukkan situs WordPress dihosting sendiri yang terhubung ke Jetpack atau WordPress.com + Tidak dapat terhubung. Kami menerima error 403 saat mencoba mengakses\n titik akhir XMLRPC situs Anda. Aplikasi ini memerlukannya agar dapat berkomunikasi dengan situs Anda. Hubungi host Anda untuk mengatasi\n masalah ini. + Tidak dapat terhubung. Host Anda memblokir permintaan POST yang dibutuhkan aplikasi\n agar dapat berkomunikasi dengan situs Anda. Hubungi host Anda untuk mengatasi masalah ini. + Tidak dapat terhubung. Metode XML-RPC yang diperlukan tidak ditemukan di server. + Pastikan URL situs yang dimasukkan sudah valid + Terjadi galat + Lupa password Anda? + Masukkan alamat email yang sah + Memeriksa surat elektronik + Log in lagi untuk melanjutkan. + Login ke akun WordPress.com yang Anda gunakan untuk menghubungkan Jetpack. + Tidak dapat mengambil profil Anda + Situs duplikat terdeteksi. + Situs ini sudah ada dalam aplikasi, Anda tidak bisa menambahkannya. + Nama pengguna atau password yang Anda masukkan tidak tepat Google terlalu lama dalam merespons. Anda mungkin harus menunggu sampai memiliki koneksi internet yang lebih kuat. + Mendaftar dengan Google… Daftar dengan Google Daftar dengan Email Dengan mendaftar, berarti Anda menyetujui %1$sKetentuan Layanan%2$s kami. Mengirim email Coba lagi Tutup + Ada beberapa masalah saat mengirim email. Anda dapat mencoba lagi sekarang atau menutupnya dan mencoba lagi nanti. Untuk membuat akun WordPress.com yang baru, masukkan alamat email Anda. Ada beberapa masalah saat memeriksa alamat email. - Terjadi error. - Masukkan kode autentikasi untuk melanjutkan. - Periksa lagi kata sandi Anda sebelum melanjutkan. - Login dihentikan - Harap tunggu proses login. - Login sedang berlangsung… - Ketuk untuk melanjutkan. - Sudah login! - Login Google tidak dapat dimulai. - Masukkan kata sandi \nCoba masuk dengan akun lain? + Login Google tidak dapat dimulai. + Kami terlalu banyak melakukan upaya pengiriman kode verifikasi SMS. Tunggu sebentar, dan minta kode yang baru beberapa saat lagi. Ada masalah saat menyambungkan ke akun Google. + Tidak ada akun WordPress.com yang cocok dengan akun Google ini. Tutup Login dengan Google. - Terjadi error jaringan. Periksa koneksi Anda dan coba lagi. Sudah login sebagai Tidak dapat mendeteksi aplikasi klien email Anda + Belum memiliki akun? %1$sDaftar%2$s Masukkan kode verifikasi - Situs duplikat terdeteksi. - Situs ini sudah ada dalam aplikasi, Anda tidak bisa menambahkannya. - Tidak dapat terhubung. Host Anda memblokir permintaan POST yang dibutuhkan aplikasi\n agar dapat berkomunikasi dengan situs Anda. Hubungi host Anda untuk mengatasi masalah ini. - Memeriksa surat elektronik - Tidak dapat terhubung. Metode XML-RPC yang diperlukan tidak ditemukan di server. - Tidak dapat mengambil profil Anda - Log in lagi untuk melanjutkan. - Lupa password Anda? - Nama pengguna atau password yang Anda masukkan tidak tepat - Masukkan alamat email yang sah - Terjadi galat - Otorisasi diwajibkan - Pastikan URL situs yang dimasukkan sudah valid - Kata sandi HTTP - Nama pengguna HTTP - Masukkan situs WordPress dihosting sendiri yang terhubung ke Jetpack atau WordPress.com - Tidak dapat terhubung. Kami menerima error 403 saat mencoba mengakses\n titik akhir XMLRPC situs Anda. Aplikasi ini memerlukannya agar dapat berkomunikasi dengan situs Anda. Hubungi host Anda untuk mengatasi\n masalah ini. - Ada beberapa masalah saat mengirim email. Anda dapat mencoba lagi sekarang atau menutupnya dan mencoba lagi nanti. - Atau: - Umum - \@%s - Login dengan nama pengguna Anda. - Login dengan memasukkan alamat situs Anda. - Kirimi saya kode baru. - Kami mengirimkan SMS ke nomor ponsel yang berakhiran %s. Masukkan kode verifikasi yang tercantum di SMS tersebut. - Untuk melanjutkan dengan akun Google ini, silakan masukkan kata sandi WordPress.com yang sesuai. Tindakan ini hanya akan ditanyakan satu kali. - Login ke WordPress.com untuk membagikan konten. - Masukkan alamat situs WordPress tempat Anda ingin membagikan konten. - Error saat membuka perambah web asal. Pilih aplikasi lainnya: - Tidak bisa membuka tautan + Masukkan kata sandi Masukkan nama pengguna + Login ke WordPress.com untuk membagikan konten. Login ke WordPress.com untuk mengakses pos. Error saat menambahkan situs. Kode error: %s Memeriksa alamat situs @@ -3533,15 +3535,25 @@ Language: id Apa alamat situs saya? Perlu bantuan untuk menemukan alamat situs Anda? Alamat situs + Masukkan alamat situs WordPress tempat Anda ingin membagikan konten. \@%s Sudah login ke WordPress.com Lanjutkan + Hubungkan situs Hubungkan Situs Lainnya + Untuk melanjutkan dengan akun Google ini, silakan masukkan kata sandi WordPress.com yang sesuai. Tindakan ini hanya akan ditanyakan satu kali. Masukkan kata sandi WordPress.com Anda. + Saat ini tidak tersedia. Masukkan kata sandi Anda Meminta email login Sepertinya kata sandi ini salah. Periksa lagi informasi Anda dan coba lagi. Meminta kode verifikasi melalui SMS. + Kirimi saya kode baru. Kirimi saya kode saja. + Kami mengirimkan SMS ke nomor ponsel yang berakhiran %s. Masukkan kode verifikasi yang tercantum di SMS tersebut. + Hampir selesai! Masukkan kode verifikasi untuk WordPress.com dari aplikasi pengautentikasi. + Login dengan nama pengguna Anda. + Login dengan memasukkan alamat situs Anda. + Atau: Buka email Selanjutnya Kelola situs Anda yang didukung oleh Jetpack di mana saja — WordPress selalu ada di saku Anda. @@ -3549,39 +3561,29 @@ Language: id Dapatkan kabar terbaru dari situs favorit Anda dan bergabung dalam percakapan di mana pun, kapan pun. Lihat pembaca dari seluruh dunia membaca dan berinteraksi dengan situs Anda, secara real-time. Publikasikan dari taman. Tulis blog dari bus. Beri komentar dari kafe. WordPress ada di mana pun Anda berada. - Anda sudah login ke akun WordPress.com, Anda tidak dapat menambahkan situs WordPress.com yang terikat ke akun lain. - Coba lagi - Keluar - Kirim tautan - Saat ini tidak tersedia. Masukkan kata sandi Anda - Proses masuk + Login + Bantuan + Kata sandi + Nama pengguna Sebaiknya masukkan kata sandi Anda - Alamat email - Rincian - Urungkan + Kirim tautan Kode verifikasi tidak valid Kode verifikasi - Bantuan - Batal - Nama pengguna - Kata sandi - Tanpa judul - Pengaturan - Hari ini - Batal - Login + Alamat email Dukungan WooCommerce Android %s pilihan tidak dicentang pilihan dicentang Kebijakan Pihak Ketiga Kebijakan Cookie Kebijakan Privasi + Dibuat dengan penuh cinta oleh Automattic. %1$s Kami menggunakan alat pelacakan lainnya, termasuk beberapa dari pihak ketiga. Baca tentang hal ini dan cara mengontrolnya. Baca kebijakan privasi Informasi ini membantu kami menyempurnakan produk, membuat pemasaran kepada Anda jadi lebih relevan, menyesuaikan pengalaman WooCommerce Anda, dan lainnya seperti yang dijelaskan dalam kebijakan privasi kami Berbagi informasi dengan alat analitik kami tentang penggunaan layanan Anda saat sudah login ke akun WordPress Anda Kumpulkan informasi Pengaturan privasi + Pengaturan Status pesanan Dana dikembalikan Dibatalkan @@ -3595,6 +3597,7 @@ Language: id Tambahkan Kirim catatan kepada pelanggan lewat email Error saat mengubah pesanan + Terjadi error saat mengambil catatan Pesanan Ditandai Selesai Tandai Pesanan Selesai Tambahkan catatan pesanan @@ -3603,6 +3606,7 @@ Language: id Tampilkan Tagihan Pembayaran Beres Catatan Pesanan + Pribadi Tulis catatan pesanan Gambar profil pelanggan Catatan yang Diberikan Pelanggan @@ -3627,6 +3631,8 @@ Language: id Tidak Ada Pesanan Lihat Pesanan Lihat Pesanan + Tidak ada aktivitas dalam periode ini + Total pesanan: %s Gambar error Error saat mengambil data Pendapatan @@ -3640,11 +3646,17 @@ Language: id Tidak ada toko WooCommerce Foto profil Anda Toko yang terhubung + Baca %1$sinstruksi konfigurasi%2$s. Aplikasi ini memerlukan Jetpack agar dapat terhubung ke toko Anda. + \@%s + Masukkan alamat toko WooCommerce yang ingin dihubungkan. Login dengan alamat email akun WordPress.com Anda untuk mengelola toko WooCommerce. + Anda sudah login ke akun WordPress.com, Anda tidak dapat menambahkan situs WordPress.com yang terikat ke akun lain. + Tidak bisa membuka tautan Tidak ada aplikasi SMS Tidak ada aplikasi email Tidak ada aplikasi telepon + Error saat membuka perambah web asal. Pilih aplikasi lainnya: Tidak bisa membuka tautan %1$s di %2$s Lebih dari satu bulan @@ -3653,15 +3665,22 @@ Language: id Kemarin Hari Ini Produk + Batal Tahun Ini Bulan Ini Minggu Ini + Hari ini Produk Jaringan Anda tidak tersedia. Periksa koneksi data atau Wi-Fi Anda. Offline u2014 menggunakan data cache Pelajari Selengkapnya + Batal + Tanpa judul Lanjutkan + Urungkan + Coba lagi Sembunyikan Detail + Rincian Diskon Subtotal Pajak @@ -3672,17 +3691,11 @@ Language: id %1$s%2$s Pesanan Toko saya + Keluar + Proses masuk Semua + Umum WooCommerce - Dibuat dengan penuh cinta oleh Automattic. %1$s - Masukkan alamat toko WooCommerce yang ingin dihubungkan. - Pribadi - Hubungkan situs - Tidak ada aktivitas dalam periode ini - Total pesanan: %s - Terjadi error saat mengambil catatan - Baca %1$sinstruksi konfigurasi%2$s. - Hampir selesai! Masukkan kode verifikasi untuk WordPress.com dari aplikasi pengautentikasi. @string/date_timeframe_custom @string/date_timeframe_today diff --git a/WooCommerce/src/main/res/values-it/strings.xml b/WooCommerce/src/main/res/values-it/strings.xml index b26a7265e8a..a1510402922 100644 --- a/WooCommerce/src/main/res/values-it/strings.xml +++ b/WooCommerce/src/main/res/values-it/strings.xml @@ -1,14 +1,31 @@ + Errore nel caricamento delle varianti + \"Impossibile caricare altri articoli. Riprova\". + Indietro + %1$d varianti + Variante %s, prezzo %s + Prodotto variabile %s, prezzo %s + La descrizione non può essere vuota + Invito all\'azione + Lo slogan non può essere vuoto + Assicurati che la tua e-mail sia corretta e controlla la cartella dello spam. + Non riusciamo a trovare un account WordPress.com collegato a questo nome utente. Puoi inserire un\'e-mail per creare un nuovo account. + Inserisci un codice a barre o qualsiasi altro identificatore univoco in questo prodotto. Può aiutarti a elencare questo prodotto su altri canali o marketplace. + GTIN, UPC, EAN, ISBN + ULTIMO VERSAMENTO + Dopo aver acquistato un\'etichetta, contrassegna questo ordine come completato e invia una notifica al cliente. + Se non hai un account, useremo questa e-mail per crearne uno. Busta Confezione Aggiungi pacchetto + Salvalo come nuovo template di pacchetto Altezza Larghezza Lunghezza @@ -20,7 +37,6 @@ Language: it Pianifica ritiro Traccia spedizione Scopri come stampare dal tuo dispositivo mobile - Salvalo come nuovo template di pacchetto Nota: il riutilizzo di un\'etichetta stampata viola i nostri termini di servizio e può comportare una denuncia penale. Da qui puoi stampare di nuovo l\'etichetta di spedizione o cambiare il formato carta per l\'etichetta. La tua etichetta di spedizione è pronta per la stampa @@ -30,7 +46,6 @@ Language: it Più economico Acquista etichetta Acquista etichetta · %1$s - Contrassegna questo ordine come completato e invia una notifica al cliente Costo spedizione Dettagli ordine Dettagli spedizione @@ -40,8 +55,8 @@ Language: it Stai spedendo beni pericolosi o materiale nocivo? Comprimi/espandi la scheda degli articoli %1$s  ·  %2$s - No Ordinamento per 1%s + No Salva la mia selezione per le campagne future <b>Ottimo per:</b> %s Seleziona obiettivo %s @@ -96,14 +111,14 @@ Language: it Sfondo oscurato. Tocca per ignorare la finestra di dialogo. %1$s settimanali Esegui fino a nuova interruzione + In corso dal giorno %1$s + spesa settimanale %1$s settimanali a partire dal giorno %2$s Settimanale Rimanente Totale Click-through Il tuo dispositivo è in modalità Risparmio batteria. \nNon possiamo fornirti le informazioni sul tuo negozio quando questa impostazione è attivata - In corso dal giorno %1$s - spesa settimanale Menu popup con opzioni. Scorri per navigare tra gli elementi. Apri il menu della barra degli strumenti Barra degli strumenti con lo stato del lettore delle carte Il menu è aperto. Tocca due volte per interagire. @@ -135,13 +150,13 @@ Language: it Nuovo ordine OK + Crea un ordine nella gestione del negozio + Per ricevere il pagamento di un prodotto non semplice, esci da POS e crea un nuovo ordire dalla scheda degli ordini. Perché non riesco a visualizzare i miei prodotti? Informazioni Chiudi + Scopri di più Al momento solo i prodotti fisici semplici sono compatibili con POS. Altri tipi di prodotti, come quelli variabili e quelli virtuali, saranno disponibili in seguito a futuri aggiornamenti. Visualizzazione dei soli prodotti semplici - Per ricevere il pagamento di un prodotto non semplice, esci da POS e crea un nuovo ordire dalla scheda degli ordini. - Scopri di più Indirizzo del sito Google per WooCommerce Aggiungi campagna a pagamento @@ -151,12 +166,12 @@ Language: it La tua nuova campagna è stata creata. Grandi notizie per le tue vendite. Tutto pronto! Impossibile creare l\'ordine + Riprova Icona che indica un errore Vuoi fare un altro tentativo? Errore durante il caricamento dei prodotti Il punto vendita al momento supporta solo prodotti semplici Il punto vendita al momento supporta solo prodotti semplici: \ncreane uno per iniziare. - Riprova Nessun prodotto supportato trovato Nessun prodotto Richiedi assistenza @@ -228,8 +243,8 @@ Language: it Nome, riepilogo e descrizione Puoi modificare o rigenerare i dettagli del prodotto prima di salvarli. Programmi - Nessun programma in questo periodo Campagne Google + Nessun programma in questo periodo Connettiti ora Carrello Genera dettagli del prodotto @@ -240,23 +255,23 @@ Language: it Lascia generare a noi i dettagli del prodotto Ricevi pagamenti con carta Totale + Imposte Subtotale Pagamento avvenuto correttamente Pagamento non riuscito. Riprova. Icona della carta Prodotti + %d elemento + Cancella Aumenta le vendite e genera più traffico con Google Ads Google per WooCommerce Nessuna regola sulla quantità - %d elemento - Cancella - Imposte Pubblico Annulla + Esci Esci da POS - Pagamento Rimuovi %s dal carrello - Esci + Pagamento Stato del lettore sconosciuto Pagamento Lettore connesso @@ -286,13 +301,13 @@ Language: it Hai ancora bisogno di aiuto? Contattaci Impossibile caricare il report sull\'utilizzo dei coupon Nessun coupon utilizzato in questo periodo + Visualizza tutti i codici promozionali Usi + Codici promozionali Magazzino Visualizza tutti i messaggi Impossibile caricare i prodotti più venduti N/D - Visualizza tutti i codici promozionali - Codici promozionali Resto dovuto Contanti ricevuti Codici promozionali più attivi @@ -324,8 +339,8 @@ Language: it Nascondi %s Completata Feedback - Non possiamo visualizzare il tuo\n analisi del negozio Assicurati di disporre della versione più recente di WooCommerce sul tuo sito e di aver attivato Analisi WooCommerce. + Non possiamo visualizzare il tuo\n analisi del negozio Visualizza tutte le attività L\'analisi delle sessioni si basa su un numero unico di visitatori non disponibile per intervalli di date personalizzati Dati della sessione non disponibili @@ -338,11 +353,11 @@ Language: it Annulla Esci comunque Sembra che tu non abbia ancora approvato la connessione dell\'app. Desideri uscire? + Seleziona un\'immagine con una dimensione minima di 400x400 pixel Immagine non valida Sembra che il nome utente o la password inseriti non corrispondano. Controlla di nuovo le credenziali e riprova. Se i dati non vengono ancora caricati, contatta il nostro team di supporto. Nessun problema di connessione - Seleziona un\'immagine con una dimensione minima di 400x400 pixel Torna alla schermata precedente Riprova la connessione Connessione al tuo sito @@ -373,9 +388,9 @@ Language: it Pacchetti venduti Campagne Blaze Prodotti più venduti + Vuoi davvero eliminare le modifiche apportate a questo prodotto? Stai per annullare le modifiche a %s La funzione statistiche non supporta la visualizzazione dei dati sui visitatori e sulle conversioni per intervalli di date arbitrari.\n\nTuttavia, puoi toccare un valore sul grafico per visualizzare i visitatori e le conversioni per quell\'intervallo specifico. - Vuoi davvero eliminare le modifiche apportate a questo prodotto? Dati sui visitatori e sulle conversioni non disponibili Gestisci il tuo abbonamento Abbonamenti @@ -396,6 +411,7 @@ Language: it Suggerimenti Inserisci un dominio Scegli un dominio + Visualizza tutte le analisi del negozio Annuale Mensile Settimanale @@ -405,7 +421,6 @@ Language: it Collega un altro negozio Creare un altro negozio? Nome del negozio - Visualizza tutte le analisi del negozio Attendi… Aggiornamento dello stato delle scorte Si è verificato un problema. Riprova. @@ -436,17 +451,17 @@ Language: it Errore nel cestinare l\'ordine Ordine cestinato Sembra che ci sia un problema con il tuo sito.\n\nContatta il tuo provider di hosting per ulteriore assistenza. - Sembra non ci sia connessione a Internet.\n\nAssicurati che il Wi-Fi sia acceso. Se stai utilizzando i dati mobili, accertati che siano abilitati nelle impostazioni del dispositivo. Sembra esserci un problema con la connessione Jetpack.\n\nMa non preoccuparti, il nostro team di supporto è qui per aiutarti. Contattaci e saremo lieti di assisterti. Sembra che non sia possibile lavorare correttamente con la risposta del sito.\n\nMa non preoccuparti, il nostro team di supporto è qui per aiutarti. Contattaci e saremo lieti di assisterti. Sembra che il tuo sito stia impiegando troppo tempo per rispondere.\n\nContatta il tuo provider di hosting per ulteriore assistenza. + Sembra non ci sia connessione a Internet.\n\nAssicurati che il Wi-Fi sia acceso. Se stai utilizzando i dati mobili, accertati che siano abilitati nelle impostazioni del dispositivo. + Prodotto non selezionato Continua a leggere Contatta il supporto - Connessione Internet - Prodotto non selezionato - Aggiungi statistiche sugli intervalli di date personalizzate Recupero degli ordini del sito Connessione ai server di WordPress.com + Connessione Internet + Aggiungi statistiche sugli intervalli di date personalizzate Non è stata trovata alcuna posizione.\nRiprova. Visualizzazioni della pagina delle sessioni Tipo di dispositivo @@ -512,28 +527,30 @@ Language: it URL del prodotto Parametri URL URL di destinazione - Inizia a digitare il Paese, lo Stato o la città per visualizzare le opzioni disponibili - Facendo clic su \"Invia campagna\" accetti i <a href=\'termsOfService\'><u>Termini di servizio</u></a> e la <a href=\'advertisingPolicy\'><u>Politica sulla pubblicità</u></a> e autorizzi gli addebiti tramite il tuo metodo di pagamento per il budget e la durata scelti. <a href=\'learnMore\'><u>Scopri di più</u></a> sui budget e sui pagamenti per il lavoro legato ad Articoli promossi. Inserisci manualmente Ricerca non riuscita.\nRiprova + Inizia a digitare il Paese, lo Stato o la città per visualizzare le opzioni disponibili + Facendo clic su \"Invia campagna\" accetti i <a href=\'termsOfService\'><u>Termini di servizio</u></a> e la <a href=\'advertisingPolicy\'><u>Politica sulla pubblicità</u></a> e autorizzi gli addebiti tramite il tuo metodo di pagamento per il budget e la durata scelti. <a href=\'learnMore\'><u>Scopri di più</u></a> sui budget e sui pagamenti per il lavoro legato ad Articoli promossi. Invia campagna + Il caricamento dei metodi di pagamento non è riuscito, riprova cliccando qui! Aggiungi un metodo di pagamento + Caricamento dei metodi di pagamento Totale Campagna Blaze Totali pagamenti Pagamento Cerca posizioni - Il caricamento dei metodi di pagamento non è riuscito, riprova cliccando qui! - Caricamento dei metodi di pagamento Impossibile salvare la ricevuta Impossibile scaricare la ricevuta Impossibile individuare un\'applicazione con cui la ricevuta possa essere condivisa Purtroppo non siamo riusciti a caricare una ricevuta per questo ordine + Suggerito dall\'IA %d caratteri rimanenti Descrizione Slogan Cambia immagine Applica + Data iniziale %1$s giorni Le impressioni riflettono la frequenza con cui il tuo annuncio appare ai potenziali clienti.\n\n\n Anche se i numeri esatti non possono essere garantiti a causa delle fluttuazioni del traffico online e del comportamento degli utenti, il nostro obiettivo è far avvicinare il più possibile le impressioni effettive del tuo annuncio al numero di destinatari.\n\n\n Ricorda, le impressioni riguardano la visibilità, non l\'azione intrapresa dai visitatori. Fatto @@ -545,9 +562,7 @@ Language: it per %1$s giorni Imposta il tuo budget Tutti - Suggerito dall\'IA %1$s giorni da %2$s - Data iniziale Non mostrare più Ricordamelo più tardi Hai un minuto? Aiutaci a migliorare le nostre funzionalità assistite dall\'intelligenza artificiale con un rapido feedback. @@ -559,37 +574,35 @@ Language: it Lingua Budget Dettagli - Acquista ora - Anteprima Modifica annuncio + Anteprima Disabilitato Selezione prodotto Seleziona prodotto %s <b>Pubblica</b>: guarda come inizia la tua promozione e tieni traccia del suo successo. + <b>Breve riassunto:</b> invia il tuo annuncio per un controllo veloce da parte del moderatore. <b>Imposta il tuo budget:</b> decidi i costi e la durata della tua campagna. <b>Personalizza il targeting:</b> seleziona il pubblico in base alla posizione o agli interessi e visualizza la portata potenziale. <b>Scegli un prodotto:</b> scegli cosa promuovere con Blaze. - <b>Breve riassunto:</b> invia il tuo annuncio per un controllo veloce da parte del moderatore. Gestisci magazzino Magazzino non gestito + Scopri come funziona Blaze Avvia la tua campagna - Raggiungi un ampio pubblico - Raggiungere tutto il mondo non è mai stato così facile I tuoi annunci su milioni di siti web nelle reti WordPress.com e Tumblr. + Raggiungi un ampio pubblico \"Il nostro strumento presenta il tuo prodotto dove gli acquirenti interessati possono trovarlo\". - Scopri come funziona Blaze + Raggiungere tutto il mondo non è mai stato così facile Lancia annunci in pochi minuti, senza bisogno di esperienza o di grandi budget, a partire da soli $ 5 al giorno. Avvio rapido, grande impatto + Il nostro strumento è stato progettato per consentire ai venditori di impostare annunci semplici e veloci per incrementare al massimo il traffico. Promuovi Tutto pronto per promuovere Mostra i tuoi prodotti a milioni di persone Usa %1$s - ULTIMO ACCONTO Espandi comprimi totali ordini Ricevi pagamenti Il codice dovrebbe essere nel formato XXXX-XXXX-XXXX-XXXX Inserisci codice - Il nostro strumento è stato progettato per consentire ai venditori di impostare annunci semplici e veloci per incrementare al massimo il traffico. Codici promozionali Impossibile caricare i temi. Configurazione completata @@ -662,45 +675,45 @@ Language: it Messaggio di ringraziamento Nota: per attivare questa impostazione, l\'abbonamento non deve avere un periodo di prova o una data di rinnovo sincronizzata. Attiva questa opzione per addebitare la spedizione solo una volta sull\'ordine iniziale. + Attivata Spedizione singola Documenti e altri file sul dispositivo - Attivata ✨Crea messaggio di ringraziamento Addebita imposte - I fondi disponibili vengono depositati automaticamente, ogni %s. - I fondi disponibili vengono depositati automaticamente, ogni giorno. - I fondi saranno disponibili dopo un periodo di attesa di %d giorni. + I fondi disponibili vengono versati automaticamente, ogni %s. + I fondi disponibili vengono versati automaticamente, ogni giorno. + I fondi saranno disponibili dopo un periodo di attesa di %d giorni. + Seleziona una variante + Scegli variante \" %1$s \" -> %2$s + seleziona una variante %1$s elementi selezionati %1$s elemento selezionato Seleziona %1$s - Seleziona una variante - seleziona una variante più di %1$s elementi più di %1$s elemento meno di %1$s elementi tra %1$s e %2$s elementi %d elementi %d elemento - Scegli variante Cambia la quantità del prodotto da %1$.2f a %2$.2f + Salva configurazione Configurazione Prodotto %s Configura - Prodotto in abbonamento variabile - Prodotto in abbonamento semplice - Salva configurazione Facoltativamente, la commissione di iscrizione verrà addebitata immediatamente, anche se il prodotto ha una prova gratuita o le date di pagamento sono sincronizzate. Abbonamento a un prodotto con varianti + Prodotto in abbonamento variabile Un unico abbonamento al prodotto che attiva pagamenti ricorrenti + Prodotto in abbonamento semplice Un periodo di attesa opzionale prima dell\'addebito del primo pagamento ricorrente. Eventuali commissioni di iscrizione saranno comunque addebitate all\'inizio dell\'abbonamento. Il periodo di prova non può superare: 90 giorni, 52 settimane, 24 mesi o 5 anni. Periodo di prova dell\'abbonamento Scadenza dell\'abbonamento - PRODOTTO IMPORTI PERSONALIZZATI TOTALI PAGAMENTI NOTE ORDINE PRODOTTI + PRODOTTO CLIENTE Fornisci una chiave di sicurezza per continuare. Si è verificato un errore con l\'accesso alla chiave di sicurezza @@ -708,21 +721,21 @@ Language: it Periodo Intervallo di fatturazione Offerta - Sconosciuto - Non riuscito - Annullato - In transito - In sospeso - Pagato - Stimato - Comprimi/espandi il riepilogo dell\'acconto - Scopri di più su quando riceverai i fondi - Fondi in sospeso - Fondi disponibili - Prodotti + Sconosciuto + Non riuscito + Annullato + In transito + In sospeso + Pagato + Stimato + Comprimi/espandi il riepilogo del versamento + Scopri di più su quando riceverai i fondi + I fondi disponibili vengono versati automaticamente, ogni mese il giorno %s. + I fondi saranno disponibili dopo un periodo di attesa di %d giorno. + Fondi in sospeso + Fondi disponibili Imposte - I fondi disponibili vengono depositati automaticamente, ogni mese il giorno %s. - I fondi saranno disponibili dopo un periodo di attesa di %d giorno. + Prodotti Totali pagamenti Indirizzo e-mail o nome utente Impossibile creare un ordine con importo personalizzato @@ -773,17 +786,17 @@ Language: it In moderazione Crea la campagna Aumenta la visibilità e vendi i tuoi prodotti rapidamente. + Campagna Blaze Il simbolo del contactless è un marchio registrato di proprietà e utilizzato su concessione di EMVCo, LLC. 5. Dopo aver visualizzato il segno di spunta \"Fatto\", il negozio elaborerà il pagamento e la transazione verrà completata. - Campagna Blaze 3. Sempre tenendo il tuo telefono in mano, rivolgilo verso il cliente. 2. Tocca \"Ricevi pagamenti\" e scegli \"Tocca per pagare\". + 1. Crea un ordine Come funziona Scopri di più sui lettori di carte Per accettare pagamenti superiori a questo limite, potresti acquistare un lettore di carte che accetta l\'inserimento del PIN. Non supportiamo l\'inserimento del PIN con Tocca per pagare su Android. %1$s - In questo Paese, alcune carte richiedono il PIN per le transazioni superiori a %2$s. - 1. Crea un ordine Informazioni importanti Tocca per pagare ti consente di accettare tutti i tipi di pagamento contactless: dalle carte di credito e di debito fisiche ai portafogli digitali. Tutto senza il bisogno di acquistare un lettore di carte fisico. Che cos\'è Tocca per pagare? @@ -827,18 +840,18 @@ Language: it Aggiungi questa aliquota a tutti gli ordini creati Modifica le aliquote d\'imposta Modifica le aliquote d\'imposta nella pagina dell\'amministratore - Impossibile trovare le aliquote d\'imposta - Metodi di pagamento Aggiungi le aliquote d\'imposta nella pagina dell\'amministratore. Qui verranno visualizzate solo le aliquote d\'imposta con le informazioni sulla posizione. + Impossibile trovare le aliquote d\'imposta Scopri altri fornitori di servizi di pagamento e \nscegline uno. + Metodi di pagamento Immagini e video sul dispositivo Risolvi ora Completa la configurazione Imposta l\'aliquota d\'imposta - Imposta la nuova aliquota d\'imposta Attiva - Configura + Imposta la nuova aliquota d\'imposta WooPayments + Configura Modifica le aliquote d\'imposta nella pagina dell\'amministratore Questa azione modificherà l\'indirizzo del cliente nella località dell\'aliquota d\'imposta selezionata. Pulsante che apre la finestra di dialogo delle informazioni sulle aliquote d\'imposta @@ -886,8 +899,8 @@ Language: it Totale ordine Percentuale calcolata Importo calcolato - La personalizzazione del nome del negozio può anche agevolarne l\'ottimizzazione per i motori di ricerca. Nome del negozio + La personalizzazione del nome del negozio può anche agevolarne l\'ottimizzazione per i motori di ricerca. Dai un nome al tuo negozio Abilita NFC Pacchetti di fornitura di piccole quantità (marcature richieste) @@ -915,18 +928,18 @@ Language: it Classe 4 - Pacchetto (solidi infiammabili) Classe 3 - Pacchetto (igienizzante per mani, alcol disinfettante, prodotti a base di etanolo, liquidi infiammabili, ecc.) Classe 1 - Pacchetto di propellente per razzi/fusibile di sicurezza - OK Pacchetto di etanolo conforme alle prescrizioni per il volo - (spedizioni di fragranze e di igienizzanti per mani autorizzati) + OK I materiali potenzialmente pericolosi includono articoli come batterie, ghiaccio secco, liquidi infiammabili, aerosol, munizioni, fuochi d\'artificio, smalto per unghie, profumi, vernici, solventi e altro ancora. I materiali pericolosi devono essere spediti in pacchi separati. Contiene materiali pericolosi Inserisci il titolo del prodotto. La piattaforma di eCommerce che cresce con te Abbonamento variabile + Rimuovi codice promozionale Tutti amano un\'offerta Non hai ancora creato nessun codice promozionale. Crea un codice promozionale per applicarlo a questo ordine. Vai ai codici promozionali Seleziona un codice promozionale - Rimuovi codice promozionale Impossibile creare il codice promozionale Codice promozionale creato Crea @@ -939,6 +952,8 @@ Language: it Sconto fisso sul prodotto Sconto fisso sul carrello Sconto in percentuale + Tipo di codice promozionale - Prodotto fisso + Tipo di codice promozionale - Carrello fisso Tipo di codice promozionale - Sconto percentuale Crea codice promozionale Aggiungi codice promozionale @@ -952,8 +967,6 @@ Language: it Esegui un ordine di prova per assicurarti che il processo WooCommerce offra un\'esperienza cliente fluida Aggiungi dettagli manualmente Cerca clienti per - Tipo di codice promozionale - Prodotto fisso - Tipo di codice promozionale - Carrello fisso Altro motivo (specificare) Faccio parte di una team e la decisione va presa insieme a tutti i membri. Trovo che il prezzo del servizio sia un fattore significativo nella mia decisione. @@ -962,12 +975,12 @@ Language: it Aiutaci a capire le tue decisioni relative all\'abbonamento. Il tuo feedback è importante. Nessun indirizzo e-mail Nessun nome + Cerca un cliente esistente o Ultimo aggiornamento: %s (aggiornamenti ogni 30 minuti) Ultimo aggiornamento: %s - Cerca un cliente esistente o + <a href=\'\'>Scopri di più</a> sull\'accettazione di pagamenti con Tocca per pagare su Android Ricevi pagamenti Impossibile aggiungere prodotti senza un prezzo specificato - <a href=\'\'>Scopri di più</a> sull\'accettazione di pagamenti con Tocca per pagare su Android Impossibile aggiungere i prodotti che non sono stati pubblicati aggiungi il cliente Vai su Impostazioni @@ -1031,18 +1044,19 @@ Language: it Impossibile generare il messaggio per la condivisione. Riprova. Scopri di più sulla funzionalità dell\'IA Aggiungi un messaggio opzionale + Scrittura… Scrivi con l\'IA Promuovi i prodotti con Blaze Blaze Generatore di contenuti IA disponibile Promuovi con Blaze - Scrittura… Condividi prodotto Complimenti. Il nuovo negozio è ora più vicino. Primo prodotto creato 🎉 Il sistema ha terminato l\'app Woo mentre era in esecuzione in background. Puoi provare a usarla di nuovo. Il sistema ha terminato l\'app Woo mentre era in esecuzione in background. Puoi provare a usarla di nuovo. La scheda è stata rimossa troppo presto + Prodotto con varianti La nostra politica sui cookie spiega l\'uso che noi e altri facciamo dei cookie e come puoi gestirli. Informativa sui cookie Le tue informazioni ci aiutano a migliorare i nostri prodotti, il marketing e a personalizzare la tua esperienza su WooCommerce. @@ -1054,7 +1068,6 @@ Language: it Analytics Gestisci la privacy La privacy è di fondamentale importanza per noi e lo è sempre stata. Usiamo, archiviamo ed elaboriamo i dati personali per ottimizzare la nostra app (e la tua esperienza) in vari modi. Alcuni usi dei dati sono assolutamente necessari per un corretto funzionamento e altri puoi personalizzarli dalle Impostazioni. - Prodotto con varianti Per aiutarci a migliorare le prestazioni dell\'app e correggere bug occasionali, attiva il rapporto di arresto anomalo. Segnala arresti anomali Rapporti @@ -1063,6 +1076,7 @@ Language: it Privacy Scopri di più sui dati che raccogliamo sul tuo negozio e sulle tue opzioni per il controllo di questa condivisione dei dati. Tracciabilità dell\'utilizzo + Ulteriori opzioni per la privacy sono disponibili per gli utenti di woocommerce.com. Controlla qui per saperne di più. Opinioni del web Ulteriori opzioni per la privacy Si è verificato un errore durante l\'aggiornamento delle impostazioni sulla privacy @@ -1075,7 +1089,6 @@ Language: it Non è possibile aggiungere direttamente il prodotto variabile. Seleziona una variante specifica Scansione non riuscita. Riprova più tardi Impossibile trovare il prodotto con SKU %s. Impossibile aggiungere all\'ordine - Ulteriori opzioni per la privacy sono disponibili per gli utenti di woocommerce.com. Controlla qui per saperne di più. Scansione non riuscita. Riprova più tardi Scansiona codice a barre La spedizione in Paesi che seguono le regole doganali dell\'Unione europea (UE) ora richiede la descrizione chiara di ogni elemento. Ad esempio, se stai inviando capi di vestiario, devi indicare il tipo di abbigliamento (come camicie da uomo, gilet da ragazza, giacca da ragazzo) affinché la descrizione sia accettabile. In caso contrario, le spedizioni potrebbero subire dei ritardi o essere fermate alla dogana. @@ -1099,16 +1112,16 @@ Language: it Aggiungi i prodotti tramite scanner Ignora Scopri di più + Quando spedisci in Paesi che seguono le norme doganali dell\'Unione europea (UE), devi fornire una descrizione chiara e specifica per ogni elemento. In caso contrario, le spedizioni potrebbero subire dei ritardi o essere fermate alla dogana. Resta aggiornato e aumenta la sicurezza del negozio. Esplora Jetpack ora. Ricevi notifiche sugli ordini e altro ancora - Quando spedisci in Paesi che seguono le norme doganali dell\'Unione europea (UE), devi fornire una descrizione chiara e specifica per ogni elemento. In caso contrario, le spedizioni potrebbero subire dei ritardi o essere fermate alla dogana. Mostra o nascondi l\'elenco delle impostazioni del negozio Elenco delle impostazioni del negozio + Puoi ripristinarlo quando lo necessiti da Menu > Impostazioni > Negozio Nascondi l\'elenco delle impostazioni del negozio Nascondi l\'elenco delle impostazioni del negozio Visualizza ordine Il pagamento di Tocca per pagare di prova è stato rimborsato correttamente - Puoi ripristinarlo quando lo necessiti da Menu > Impostazioni > Negozio Rimborso non riuscito. Prova a eseguire manualmente il rimborso Rimborso del pagamento di prova in corso… Continuando, accetti i nostri <a href=\'termsOfService\'><u>Termini di servizio.</u></a> @@ -1195,14 +1208,14 @@ Language: it Abbonamento Il lettore di carte accetta pagamenti contactless, chip e tramite strisciata con carte di debito e di credito. Accetta in modo sicuro pagamenti contactless direttamente dal tuo telefono. + Usa il telefono per accettare i pagamenti\ncon carta. Prova ora. + Condividi il feedback Impossibile accedere perché la creazione della password dell\'applicazione non è stata approvata. Sito in caricamento… - Condividi il feedback - Usa il telefono per accettare i pagamenti\ncon carta. Prova ora. - Caricamento in corso… Si è verificato un errore durante il recupero del sito web Riprova con la pagina Bacheca Accedi + Caricamento in corso… Terminato il %s Il tuo abbonamento è scaduto e hai un accesso limitato a tutte le funzionalità. %1$d giorni @@ -1217,11 +1230,13 @@ Language: it Errore durante il recupero dei dettagli del piano. Ora sei un abbonato %1$s. Hai accesso a tutte le nostre funzionalità fino al giorno %2$s. La tua prova gratuita è terminata e hai accesso limitato a tutte le funzionalità. Abbonati a %1$s ora. + Stai utilizzando il periodo di prova di %1$d giorni. La prova gratuita terminerà il %2$s. Esegui l\'upgrade per sbloccare nuove funzionalità e mantenere attivo il tuo negozio. Stato dell\'abbonamento Risoluzione dei problemi Attuale: %s Segnala il problema con l\'abbonamento Aggiorna ora + %1$s rimasti nella tua prova. Prova terminata La tua prova è terminata. Ops, si sono verificati alcuni errori imprevisti. @@ -1237,8 +1252,6 @@ Language: it Pubblica il mio negozio Per lanciare il tuo negozio, hai bisogno di eseguire l\'aggiornamento al nostro piano. <u>Aggiorna</u> Cerca domini - Stai utilizzando il periodo di prova di %1$d giorni. La prova gratuita terminerà il %2$s. Esegui l\'upgrade per sbloccare nuove funzionalità e mantenere attivo il tuo negozio. - %1$s rimasti nella tua prova. Accesso non riuscito con codice dello stato %1$s Impossibile accedere perché non possiamo identificare l\'URL di amministrazione del negozio Impossibile accedere perché non possiamo identificare l\'URL di accesso del negozio @@ -1286,31 +1299,31 @@ Language: it Recupero dello stato di Jetpack Si è verificato un problema. Riprova più tardi. Prova un pagamento - Registrazione del nome di dominio in corso… - Seleziona il Paese - Seleziona uno stato Ricevi pagamenti con carta\ncon il tuo telefono Tocca per pagare AZIONI Si è verificato un errore durante la registrazione del dominio - Telefono - Prefisso internazionale - Paese - Indirizzo - Indirizzo 2 - Città - Stato - Stato (non disponibile) - CAP + Seleziona uno stato + Seleziona il Paese + Registrazione del nome di dominio in corso… Registra dominio - Per agevolarti, abbiamo precompilato le tue informazioni di contatto\n di WordPress.com. Rileggi per verificare che le informazioni che desideri utilizzare per questo dominio siano corrette. + CAP + Stato (non disponibile) + Stato + Città + Indirizzo 2 + Indirizzo + Paese + Prefisso internazionale + Telefono Organizzazione (opzionale) - I proprietari del dominio devono condividere le informazioni di contatto in un database pubblico di tutti i domini.\n Con la Protezione della privacy, pubblichiamo le nostre informazioni al posto delle tue e ti inoltriamo privatamente qualsiasi comunicazione. - Registrando questo dominio accetti i nostri %1$sterme e le nostre condizioni%2$s - Per %s, inserisci un valore valido - Registra privatamente con protezione della privacy - Registra pubblicamente + Per agevolarti, abbiamo precompilato le tue informazioni di contatto\n di WordPress.com. Rileggi per verificare che le informazioni che desideri utilizzare per questo dominio siano corrette. Informazioni di contatto per il dominio + Registra pubblicamente + Registra privatamente con protezione della privacy + Per %s, inserisci un valore valido + Registrando questo dominio accetti i nostri %1$sterme e le nostre condizioni%2$s + I proprietari del dominio devono condividere le informazioni di contatto in un database pubblico di tutti i domini.\n Con la Protezione della privacy, pubblichiamo le nostre informazioni al posto delle tue e ti inoltriamo privatamente qualsiasi comunicazione. Protezione della privacy Solo gli amministratori del negozio possono accedere alle impostazioni del dominio In alternativa, continua a usare il Link @@ -1318,10 +1331,10 @@ Language: it Inserisci la password del tuo account WordPress.com per connettere Jetpack Accedi con il tuo account WordPress.com per installare Jetpack Accedi con il tuo account WordPress.com per connettere Jetpack + Puoi trovare le impostazioni del dominio in Impostazioni -> Domini L\'indirizzo del tuo sito è in fase di configurazione. Potrebbero essere necessari fino a 30 minuti prima che il tuo dominio inizi a funzionare. Congratulazioni per il tuo acquisto Gratis per il primo anno - Puoi trovare le impostazioni del dominio in Impostazioni -> Domini Vuoi davvero uscire dal tuo account? Impossibile caricare i domini del sito %1$d/%2$d completato @@ -1369,19 +1382,19 @@ Language: it L\'operazione non richiederà molto tempo Preparazione del lettore integrato… Il lettore integrato è pronto + Lettore di carte Tocca per pagare Tasso di conversione Sessioni Nessuna sessione in questo periodo Confrontato con Dominio - Lettore di carte Dove si trovano le Password applicazione? Sembra che la funzione Password applicazione sia disabilitata nel tuo sito %1$s.\n Abilitalo all\'uso dell\'app WooCommerce. Apri la pagina di installazione - Rispondi - Risposta inviata! Si è verificato un errore durante l\'invio della risposta + Risposta inviata! + Rispondi Seleziona tutto Aggiorna prezzo Aggiorna stato @@ -1392,17 +1405,17 @@ Language: it Sono già generate tutte le varianti. Nessuna variante generata Seleziona più elementi + Nessun dominio disponibile per questa ricerca Generazione delle varianti Questo creerà una nuova variazione per ogni possibile combinazione degli attributi di variazione (%1$d varianti). Generare tutte le varianti? Attualmente la creazione è supportata per un massimo di %1$d varianti. La generazione delle varianti per il prodotto creerà %2$d varianti. Limite di generazione superato Crea le variant per tutte le combinazioni degli attributi. + Genera tutte le varianti Crea una nuova variante. Impostare manualmente quali attributi appartengono al prodotto variabile. Aggiungi nuova variante Aggiungi variazione - Genera tutte le varianti - Nessun dominio disponibile per questa ricerca Esci senza connessione Continua connessione Prova a connetterti di nuovo per accedere al tuo negozio. @@ -1414,6 +1427,7 @@ Language: it Prova di nuovo l\'attivazione Prova di nuovo l\'installazione Ottieni assistenza + Riprova e contatta il supporto se l\'errore persiste. Si è verificato un errore durante la comunicazione con il sito. Non disponi dell\'autorizzazione per gestire i plugin in questo negozio Errore di autorizzazione della connessione a Jetpack @@ -1437,7 +1451,6 @@ Language: it Installazione di Jetpack Accedi a <b>%1$s</b> con le credenziali del tuo negozio per connetterti a Jetpack. Accedi a <b>%1$s</b> con le credenziali del tuo negozio per installare Jetpack. - Riprova e contatta il supporto se l\'errore persiste. Prepara le credenziali del negozio. Connetti il negozio a Jetpack per permetterne l\'accesso su questa app. Installa il plugin Jetpack gratuito per accedere al negozio su questa app. @@ -1450,8 +1463,8 @@ Language: it Aggiorna il lettore di carte simulato Collega Jetpack Collega negozio - Visitatori Ecco dove gli utenti ti troveranno su Internet. Non preoccuparti. Puoi cambiarlo più tardi. + Visitatori In alternativa, accedi con la password Il lettore di carte simulato è stato disattivato Chiave del lettore simulato @@ -1488,12 +1501,12 @@ Language: it Prova con un altro indirizzo Intervallo di date personalizzato Personalizza + Cos\'è WordPress.com? Creazione di un nuovo account Scegli una password Il tuo indirizzo e-mail Crea il tuo sito \nin pochi minuti Toccando il pulsante Configura Jetpack, accetti i nostri <a href=\'terms\'>Termini di servizio</a> e la <a href=\'sync\'>condivisione delle informazioni</a> con WordPress.com. - Cos\'è WordPress.com? Attiva il lettore di carte simulato Contatta il proprietario del sito per un invito al sito come gestore del negozio o amministratore per utilizzare l\'app. Connessione a un sito WordPress.com @@ -1514,8 +1527,8 @@ Language: it Analisi del negozio non disponibile! Esegui l\'aggiornament all\'ultima versione di WooCommerce per visualizzare le analisi del tuo negozio. La rete non è disponibile.\nControlla la connessione dati o WiFi. Accedi all\'app WooCommerce - Verifica della connessione a Jetpack… Recupero dei dati della connessione non riuscito… + Verifica della connessione a Jetpack… Impossibile verificare la connessione a Jetpack. Riprova. Il sito %1$s dispone attualmente di un piano WordPress.com che non supporta l\'installazione di plugin. Aggiorna il tuo piano per utilizzare WooCommerce. Sembra che l\'account non sia connesso a Jetpack di %1$s @@ -1533,43 +1546,44 @@ Language: it Prima volta in WooCommerce Si è verificato un errore, contatta il supporto Inserisci un indirizzo del sito - Non ricordi la password? Richiedi un link di accesso via e-mail + Non ricordi la password? Abbiamo notato che non hai ancora completato la configurazione dei Pagamenti di persona. <a href=\'\'>Continua con la configurazione</a> - WC Admin - Accesso con l\'indirizzo del negozio - Altri siti - Pagamenti dalla scheda Menu - Ora puoi accedere rapidamente e con facilità ai Pagamenti di persona e ad altre funzionalità - OK! Pagamenti + OK! + Ora puoi accedere rapidamente e con facilità ai Pagamenti di persona e ad altre funzionalità + Pagamenti dalla scheda Menu L\'e-mail non è utilizzata con un account WordPress.com. - Accedi con le credenziali del sito - Ti abbiamo appena inviato un link magico al tuo indirizzo e-mail. Tocca il link nell\'e-mail per accedere. - Accedi con il link magico - Usa la password per accedere - Controlla la tua e-mail su questo dispositivo! + Altri siti + Accesso con l\'indirizzo del negozio + WC Admin Abbiamo appena inviato un link magico a - Configura ora - Suggerimento - Cosa ti porta in WooCommerce? - Sto solo dando un\'occhiata - Tentativo di configurazione di un negozio - Controlla le mie analisi - Crea o aggiorna i miei prodotti - Gestisci i miei ordini - Passa a un negozio all\'altro - %1$s non è un sito WooCommerce. - Installa WooCommerce - Contrassegna\ncompletato - Ordine #%1$d contrassegnato come completo - Errore durante l\'aggiornamento dell\'ordine #%1$d - Inizia a vendere di persona in meno di 20 minuti con il nostro lettore di carte. - Aumenta le tue vendite con i prodotti collegati + Controlla la tua e-mail su questo dispositivo! + Usa la password per accedere + Accedi con il link magico + Ti abbiamo appena inviato un link magico al tuo indirizzo e-mail. Tocca il link nell\'e-mail per accedere. + Accedi con le credenziali del sito Offri ai tuoi clienti consigli utili e pertinenti sui prodotti sommando upsell e cross-sell + Aumenta le tue vendite con i prodotti collegati + Inizia a vendere di persona in meno di 20 minuti con il nostro lettore di carte. + Errore durante l\'aggiornamento dell\'ordine #%1$d + Ordine #%1$d contrassegnato come completo + Contrassegna\ncompletato + Installa WooCommerce + %1$s non è un sito WooCommerce. + Passa a un negozio all\'altro + Gestisci i miei ordini + Crea o aggiorna i miei prodotti + Controlla le mie analisi + Tentativo di configurazione di un negozio + Sto solo dando un\'occhiata + Cosa ti porta in WooCommerce? + Suggerimento + Configura ora Iniziamo! Accedi con WordPress.com Contatta il supporto + Accedi con il tuo account WordPress.com Ricevi aiuto! Problemi con l\'accesso? COD @@ -1591,7 +1605,6 @@ Language: it Puoi gestirli rapidamente e facilmente Sappiamo che è essenziale per la tua attività Prima volta in WooCommerce - Accedi con il tuo account WordPress.com Nuovo ordine pari a $ 50 nel tuo negozio WooCommerce Hai un nuovo ordine. 🎉 i dettagli @@ -1600,10 +1613,10 @@ Language: it Condividi rapporto dello stato del sistema Copia il rapporto dello stato del sistema negli appunti Continua a cercare + Pagamento di persona per l\'ordine #%1$s per %2$s blog_id %3$s. Cambia fornitore dei pagamenti Rimborsato: %1$s In attesa di pagamento - Pagamento di persona per l\'ordine #%1$s per %2$s blog_id %3$s. Procedere con l\'installazione Cosa da sapere prima dell\'installazione Installa estensione @@ -1625,8 +1638,8 @@ Language: it bloccato Per modificare Dettagli di pagamento o i Prodotti, modifica lo stato in Pagamento in sospeso. Le parti di questo ordine non sono al momento modificabili - Nessun cliente trovato Cerca clienti + Nessun cliente trovato Non ora Aggiungi estensione al negozio Cos\'è WooCommerce Shipping? @@ -1661,6 +1674,8 @@ Language: it I prezzi attuali sono misti Il prezzo attuale è %s Il prezzo verrà aggiornato per %d varianti + Misto + Nessuno Prezzo di vendita Prezzo standard Prezzo @@ -1668,8 +1683,6 @@ Language: it Aggiornamento in blocco OK Aggiornamento in blocco… - Misto - Nessuno Recupero delle varianti in corso… Ricerca delle categorie di prodotti non riuscita Caricamento delle categorie di prodotti non riuscito @@ -1684,10 +1697,11 @@ Language: it Ottieni WooCommerce Shipping Stampa etichette dal tuo telefono con WooCommerce Shipping. Hai bisogno di un\'etichetta di spedizione? + Cambia la quantità di prodotto da %1$d a %2$d Aggiorna al prezzo standard Aggiorna prezzo di vendita - Cambia la quantità di prodotto da %1$d a %2$d Non supportiamo l\'estensione WooCommerce Stripe in %1$s + Filtro Cancella la selezione Seleziona %d prodotto Seleziona %d prodotti @@ -1699,7 +1713,6 @@ Language: it Attiva questa opzione se il codice promozionale non deve essere applicato agli articoli in offerta. I codici promozionali per prodotto funzionano solo se l\'articolo non è in offerta. I codici promozionali per carrello funzionano solo se nel carrello sono presenti articoli non in offerta. Escludi elementi in offerta Attiva questa opzione se il codice promozionale non può essere usato insieme ad altri. - Filtro Solo utilizzo individuale Limite di utilizzo per utente Limite di utilizzo per X prodotti @@ -1774,12 +1787,12 @@ Language: it Prova altri mezzi per eseguire il rimborso Il rimborso è stato rifiutato per una ragione sconosciuta Siamo spiacenti, questo rimborso non può essere elaborato - Copia Rimborso avvenuto correttamente Elaborazione del rimborso Rimborsa il pagamento Rimborso non riuscito Preparazione dell\'esecuzione del rimborso del pagamento + Copia Cerca codici promozionali Impossibile generare il messaggio per la condivisione del codice promozionale Errore durante la condivisione del codice promozionale. @@ -1804,9 +1817,18 @@ Language: it Pagamento: %s Condividi il link di pagamento Importo + Importo + Ordini scontati + Prestazioni + Spesa massima di %s + Spesa minima di %s + Riepilogo codice promozionale Visualizza riepilogo codice promozionale + Abbiamo lavorato per rendere possibile la visualizzazione e la modifica dei coupon sul tuo dispositivo! Visualizza e modifica i codici promozionali Non è stato trovato alcun codice promozionale + %1$s senza %2$s + %1$s e %2$s tutto Scaduto Attivo @@ -1824,15 +1846,6 @@ Language: it \u2022 una recensione approvata \u2022 %drecensioni approvate %1$s (%2$s%%) - Importo - Ordini scontati - Prestazioni - Spesa massima di %s - Spesa minima di %s - Riepilogo codice promozionale - Abbiamo lavorato per rendere possibile la visualizzazione e la modifica dei coupon sul tuo dispositivo! - %1$s senza %2$s - %1$s e %2$s Abbiamo lavorato per permetterti di creare ordini dal tuo dispositivo. Puoi provare questa funzionalità toccando il pulsante \"+\" Torna presto per ulteriori suggerimenti e per la panoramica sulla crescita del tuo negozio Congratulazioni, hai letto tutto. @@ -1847,20 +1860,20 @@ Language: it Il servizio XML-RPC è disattivato su questo sito. Utilizza un\'e-mail non automatica per inviare un ticket di supporto Non supportiamo gli account Stripe registrati in %1$s + Non supportiamo l\'estensione WooCommerce Payments in %1$s Premi il pulsante di accensione del tuo lettore Una ricevuta è stata inviata a <strong>%s</strong> Percentuale (%) - Non supportiamo l\'estensione WooCommerce Payments in %1$s Rimuovi la commissione dall\'ordine Rimuovi la spedizione dall\'ordine Spedizione Aggiungi spedizione Aggiungi spedizione Nome + Importo Tariffe Dettagli cliente Aggiungi l\'imposta - Importo Modifica una nota del cliente Modifica dettagli del cliente Modifica lo stato dell\'ordine @@ -1879,10 +1892,10 @@ Language: it WooCommerce Payments Gateway stripe WooCommerce 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: - Conflitto con i plugin di pagamento rilevato - oppure I pagamenti di persona funzioneranno solo con uno dei seguenti plugin attivato. Per continuare disattiva uno di questi plugin: + Conflitto con i plugin di pagamento rilevato Totale imposte + oppure Installa Jetpack Pagamenti di persona attualmente non disponibile Ordine creato @@ -1953,7 +1966,9 @@ Language: it Aggiungi un indirizzo di spedizione differente In magazzino %s in magazzino + Aggiungi prodotti Prodotti + Aggiungi dettagli del cliente Cliente Contrassegna come Pagato Questa azione creerà il tuo ordine e lo contrassegnerà come Pagato se hai ricevuto il pagamento al di fuori di WooCommerce @@ -1961,8 +1976,6 @@ Language: it Scegli il tuo metodo di pagamento Le imposte sono calcolate automaticamente in base all\'indirizzo del negozio. Imposta (%s%%) - Aggiungi dettagli del cliente - Aggiungi prodotti Ricevi il pagamento%s Modifica le imposte Importo personalizzato @@ -2015,19 +2028,19 @@ Language: it Filtra stato Stato Data di fine + Data di inizio Seleziona le date Intervallo personalizzato + Crea un ordine con informazioni minime Pagamento facile + Crea un nuovo ordine manuale Crea ordine Crea ordine Inserisci quantità Ricevi il pagamento Pagamento facile - Dati analizzati - Data di inizio - Crea un ordine con informazioni minime - Crea un nuovo ordine manuale Crea ordini dal tuo dispositivo! + Dati analizzati Fatto Connessione del tuo negozio Attivazione @@ -2111,8 +2124,8 @@ Language: it Rapporto dello stato del sistema Congratulazioni, ora puoi accettare pagamenti con carte di debito e di credito con WooCommerce Payments. Ricevi i pagamenti con un lettore di carte - OK L\'importo deve essere di almeno %1$s + OK Nuova immagine dell\'icona della funzionalità Cambia negozio Aggiornamento del prodotto %1$s non riuscito @@ -2153,10 +2166,10 @@ Language: it Impossibile verificare automaticamente l\'indirizzo di spedizione: %s Impossibile verificare automaticamente l\'indirizzo di origine. Visualizza su Google Maps per assicurarti che l\'indirizzo sia corretto. Stiamo lavorando per rendere più semplice per te visualizzare i componenti aggiuntivi del prodotto dal dispositivo. Per ora, sarai in grado di visualizzare i componenti aggiuntivi per gli ordini. Puoi creare e modificare questi componenti aggiuntivi nella bacheca web. - Salva Visualizza i componenti aggiuntivi dal dispositivo. Se rinomini un componente aggiuntivo nella tua bacheca web, tieni presente che gli ordini precedenti non mostreranno più quel componente aggiuntivo all\'interno dell\'app. Visualizza componenti aggiuntivi + Salva Dettagli del caricamento (%d) Non è stato possibile caricare %d file Non è stato possibile caricare %d file @@ -2188,17 +2201,16 @@ Language: it Pagamenti di persona non è disponibile nella Modalità di prova. Disattivare la funzione per proseguire. Pagamenti di persona attualmente non disponibile Ci sono requisiti in sospeso sull\'account. Completa i requisiti tramite %1$s per continuare ad accettare Pagamenti di persona. + Il tuo account presenta requisiti in sospeso C\'è almeno un requisito scaduto sul tuo account. Completalo per riprendere a utilizzare Pagamenti di persona Pagamenti di persona attualmente non disponibile Potrai accettare Pagamenti di persona non appena avremo terminato la revisione del tuo account. - Il tuo account presenta requisiti in sospeso Pagamenti di persona attualmente non disponibile Siamo spiacenti, ma non possiamo supportare Pagamenti di persona per questo negozio. Ricarica dopo l\'aggiornamento Sul tuo negozio è installata una versione non aggiornata dell\'estensione WooCommerce Payments. Esegui l\'aggiornamento per accettare Pagamenti di persona. Aggiorna WooCommerce Payments Ci sei quasi! Completa l\'impostazione di WooCommerce Payments per iniziare ad accettare pagamenti di persona. - Pagamenti di persona Completa la configurazione di WooCommerce Payments nella pagina di amministrazione del negozio Ricarica dopo l\'attivazione L\'estensione WooCommerce Payments è installata sul tuo negozio, ma non è attivata. Attivala per accettare Pagamenti di persona. @@ -2209,13 +2221,14 @@ Language: it <a href=\'\'>Scopri di più</a> sull\'accettazione di pagamenti con il tuo dispositivo mobile e sull\'ordinamento dei lettori di carte Ti serve aiuto? <a href=\'\'>Contatta il supporto</a> Puoi comunque accettare pagamenti di persona in contanti attivando il metodo \"Pagamento alla consegna\" sul tuo negozio + Non supportiamo Pagamenti di persona con carta in %1$s Connessione all\'account in corso + Pagamenti di persona Verifica le dimensioni e il peso del pacco oppure prova a utilizzare un pacco diverso in Dettagli pacco Nessuna tariffa di spedizione disponibile Tutti i pacchi disponibili sono stati attivati Attivazione del pacco in corso Seleziona un pacco da attivare. - Non supportiamo Pagamenti di persona con carta in %1$s Campo obbligatorio Chiudi Variante creata @@ -2224,11 +2237,11 @@ Language: it Genera variante Ora che hai aggiunto gli attributi, puoi creare la tua prima variante. Attributi creati + %1$s%% completato Non è raccomandato l\'annullamento dell\'aggiornamento del software in corso Siamo spiacenti, impossibile elaborare questo pagamento Nessuna connessione al server Nessuna connessione a Internet - %1$s%% completato Spedisci nel pacchetto originale Aggiungi a un nuovo pacchetto Questo elemento è attualmente in %s. Dove vorresti spostarlo? @@ -2239,6 +2252,7 @@ Language: it Creazione del pacchetto non riuscita. Riprova. Creazione del pacchetto non riuscita: problema API sconosciuto. Creazione del pacchetto non riuscita: %1$s + Attendi… Creazione di un nuovo pacchetto Valore non valido. Campo richiesto. @@ -2252,11 +2266,10 @@ Language: it Confezione Scegli tipo di pacchetto Tipo di pacchetto + Configura il pacchetto che utilizzerai per spedire i tuoi prodotti. Lo salveremo per ordini futuri. Aggiungi un nuovo pacchetto Crea un nuovo pacchetto Le dimensioni del pacchetto devono essere superiori a zero. Aggiorna le dimensioni dell\'elemento nella sezione Spedizione della pagina del prodotto per continuare. - Attendi… - Configura il pacchetto che utilizzerai per spedire i tuoi prodotti. Lo salveremo per ordini futuri. Pacchetto originale Dimensioni dell\'elemento Elemento spedito singolarmente @@ -2269,11 +2282,11 @@ Language: it Il controllo dell\'aggiornamento della versione del software non è riuscito <a href=\'\'>Scopri di più</a> sull\'accettazione di pagamenti con dispositivi mobili e sulla possibilità di ordinare lettori di carte Attiva il bluetooth + Nessun lettore connesso Impossibile connettersi al lettore Connetti Sono stati trovati più lettori L\'ordine è già stato pagato - Nessun lettore connesso Grazie per l’acquisto! Fai clic sul link qui sotto per la ricevuta di pagamento.\n\n%s Errore durante il download del modulo doganale Stampa fattura doganale @@ -2289,11 +2302,12 @@ Language: it Aggiungi prodotto Attributi della variante Attiva il Bluetooth del dispositivo mobile + Errore durante il recupero dell\'ordine. Lo stato nell\'ordine dell\'app potrebbe essere obsoleto. La tua ricevuta da %s Aggiornamento dell\'ordine Aggiornamento dello stato dell\'app Il cliente ha scelto %1$s - Errore durante il recupero dell\'ordine. Lo stato nell\'ordine dell\'app potrebbe essere obsoleto. + I moduli dei clienti richiedono un numero di telefono a 10 cifre Modulo dei clienti completato Se riscontri problemi con la stampa dal tuo dispositivo, contatta l\'assistenza clienti per la tua stampante. Se la stampa non è disponibile, puoi sempre salvare la ricevuta come PDF e inviarla via e-mail per stamparla da un altro dispositivo. @@ -2306,7 +2320,6 @@ Language: it Per creare una variante, dovrai prima impostare i suoi attributi (ad esempio \"Colore\", \"Dimensione\") 1 variante %1$s varianti - I moduli dei clienti richiedono un numero di telefono a 10 cifre Tracciabilità USPS Aggiornamento del software del lettore Aggiornamento del software @@ -2317,6 +2330,7 @@ Language: it Aggiorna il software del lettore Batteria %s%% LETTORE CONNESSO + Connetti il lettore di carte Accendi il lettore di carte e posizionalo accanto al dispositivo mobile Assicurati che il lettore di carte sia carico Connetti il tuo lettore di carte @@ -2325,6 +2339,7 @@ Language: it Preparazione alla ricezione del pagamento Il valore dichiarato deve essere maggiore di zero Il peso deve essere maggiore di zero + Questo campo è richiesto Descrivi che tipo di restrizioni deve avere questo pacchetto. Descrivi che tipo di beni contiene questo pacchetto. Peso (%1$s per unità) @@ -2348,6 +2363,7 @@ Language: it Descrizione Contenuto del pacchetto Il numero di transizione interno è richiesto per la spedizione a %1$s. + Il numero di transizione interno è richiesto per gli articoli della spedizione valutati più di $ 2.500 per numero di tariffa Formato non valido Dettagli sulla restrizione Dettagli sui contenuti @@ -2355,9 +2371,6 @@ Language: it Tipo di contenuti Restituisci al mittente se non è possibile consegnare il pacchetto fino a %s - Connetti il lettore di carte - Questo campo è richiesto - Il numero di transizione interno è richiesto per gli articoli della spedizione valutati più di $ 2.500 per numero di tariffa Se hai abilitato questa impostazione, il cliente riceverà un\'e-mail di conferma una volta completato l\'ordine Rivedi l\'ordine 🎉 Ordine completato. @@ -2366,9 +2379,9 @@ Language: it Scopri di più sui ruoli e sulle autorizzazioni Quest\'app supporta solo i ruoli utente di Amministratore e Gestore negozio. Contatta il proprietario del negozio per aggiornare il tuo ruolo. Modifica e aggiungi nuovi prodotti da qualsiasi luogo - Salta Gestisci e modifica gli ordini in movimento Tieni traccia delle vendite e dei prodotti che performano meglio + Salta Prodotto esterno Prodotto raggruppato Prodotto variabile @@ -2377,6 +2390,9 @@ Language: it Prodotto fisico semplice Apri le impostazioni Apri le impostazioni + Il Bluetooth è disabilitato + La posizione è disabilitata + Autorizzazione della posizione richiesta mancante precisa Impossibile connettersi al lettore. Connessione al lettore Connetti al lettore @@ -2384,10 +2400,9 @@ Language: it Ricerca di lettori Conteggio articoli Crea nuova etichetta di spedizione - Il Bluetooth è disabilitato - La posizione è disabilitata - Autorizzazione della posizione richiesta mancante precisa + Prodotto virtuale semplice Desideri eliminare questa variante? + Generazione della variante Eliminazione del prodotto Invia ricevuta Stampa ricevuta @@ -2401,8 +2416,6 @@ Language: it Impossibile visualizzare in anteprima l\'etichetta di spedizione. Installa un\'app per la visualizzazione del PDF e riprova. Non siamo in grado di rilevare un sito WordPress all\'indirizzo inserito. Assicurati che WordPress sia installato e di disporre dell\'ultima versione disponibile. più righe di spedizione - Prodotto virtuale semplice - Generazione della variante Impossibile contrassegnare l\'ordine come completato Errore durante l\'acquisto delle etichette Attendi… @@ -2431,17 +2444,18 @@ Language: it Solo il proprietario del sito può gestire i metodi di pagamento dell\'etichetta di spedizione. Contatta il proprietario del negozio %1$s (%2$s) per gestire i metodi di pagamento. Aggiungi varianti Aggiungi variante + Crea la prima variante %s totali %s tariffe selezionate Idoneo per il requisito della firma gratuita Idoneo per il ritiro gratuito + Assicurazione (%s) + tracciabilità Includi %s Firma di un adulto richiesta (%s) Firma richiesta (%s) - Assicurazione (%s) - tracciabilità Il cliente ha pagato %1$s di %2$s per la spedizione - Crea la prima variante + Quando acquisti le etichette di spedizione tramite WooCommerce, ottieni dal 5​% 25 al 40​% 25 di sconto rispetto alle tariffe degli uffici postali. Cos\'è lo sconto di WooCommerce Services? Si è verificato un errore durante il caricamento delle opzioni di spedizione Corrieri e tariffe @@ -2459,7 +2473,6 @@ Language: it Aggiungi ogni nome dell\'opzione e premi Invio In alternativa, tocca per selezionare un\'opzione esistente Nome opzione - Quando acquisti le etichette di spedizione tramite WooCommerce, ottieni dal 5​% 25 al 40​% 25 di sconto rispetto alle tariffe degli uffici postali. Errore durante il salvataggio delle impostazioni Attendi… Salvataggio delle impostazioni @@ -2482,15 +2495,18 @@ Language: it Aggiungi attributo Attributi Modifica attributi + Peso totale dei pacchi: %1$s %2$s %1$d articoli in %2$d pacchetti Peso del pacchetto totale: %1$s %2$s Pacchetti personalizzati Impossibile recuperare i prodotti + Alcuni campi richiesti sono vuoti. Peso non valido Pacchetto selezionato Attendi… Caricamento dei pacchetti. Pacchetto %1$d + %d elementi Impossibile caricare le definizioni dei pacchetti Include il peso del pacchetto Peso del pacchetto totale: %1$s @@ -2503,17 +2519,16 @@ Language: it Abbiamo leggermente modificato l\'indirizzo inserito. Se è corretto, usa l\'indirizzo inserito per garantire una consegna accurata. Modifica indirizzo selezionato Usa l\'indirizzo selezionato - Alcuni campi richiesti sono vuoti. - %d elementi - Peso totale dei pacchi: %1$s %2$s Caricamento dei dati dell\'indirizzo Nuove funzionalità disponibili. + Trova sulla mappa Contatta cliente Strada non valida Numero civico mancante Indirizzo non trovato Impossibile verificare automaticamente l\'indirizzo di spedizione. Visualizzalo su Google Maps o prova a contattare il cliente per assicurarti che l\'indirizzo sia corretto. Convalida dell\'indirizzo non riuscita + Attendi… Convalida dell\'indirizzo in corso Impossibile caricare i dati dell\'indirizzo Usa l\'indirizzo inserito @@ -2524,8 +2539,6 @@ Language: it Telefono Società Nome - Attendi… - Trova sulla mappa App di Google Maps trovata Attendi… Siamo spiacenti, la rimozione delle immagini sulle varianti dei prodotti è supportata in WooCommerce 4.7 o versione superiore. @@ -2541,30 +2554,31 @@ Language: it Dettagli imballaggio Crea etichetta di spedizione Ulteriori informazioni + Evita la fila all\'ufficio postale stampando le etichette di spedizione a casa dal tuo dispositivo mobile a prezzi scontati. Risparmia tempo e denaro con WooCommerce Shipping WooCommerce Shipping Contrassegna ordine come completo + Scopri di più su come creare etichette dal dispositivo mobile Crea etichetta di spedizione - Crea etichette di spedizione dal tuo dispositivo. Ora puoi creare etichette di spedizione per tutti gli ordini fisici direttamente dal tuo dispositivo con il plugin WooCommerce Shipping gratuito. Tocca \"Crea etichetta di spedizione\" per provare la funzionalità beta. - Evita la fila all\'ufficio postale stampando le etichette di spedizione a casa dal tuo dispositivo mobile a prezzi scontati. - Scopri di più su come creare etichette dal dispositivo mobile - Modifica + Crea etichette di spedizione dal tuo dispositivo. Tariffe Importo di pagamento netto Pagato Scopri di più su come connettere Jetpack + Modifica Convalida Trascina e rilascia per riordinare le foto - Elimina Impostazioni download Inserisci un nome valido Inserisci URL file + Libreria multimediale WordPress Verifica che l\'URL inserito sia valido Attendi… Caricamento file Errore durante il caricamento del file Aggiungi file scaricabile + Aggiungi file scaricabile da Includi i file scaricabili con gli acquisti Annulla Sì, modifica @@ -2573,6 +2587,7 @@ Language: it File Desideri rimuovere questo file? Prodotto scaricabile + Elimina Scadenza download Limite di download Inserisci il numero di giorni prima della scadenza di un link di download oppure lascia vuoto il campo se non scade mai @@ -2587,13 +2602,11 @@ Language: it Potrebbe essere necessario <b>configurare la stampa Wi-Fi direttamente sulla stampante stessa</b>. Assicurati che il firmware della stampante sia aggiornato e consulta la documentazione della stampante per le istruzioni. Puoi selezionare il <b> servizio di stampa predefinito</b> del dispositivo oppure installare l\'<b>app della stampante </b> (dovrebbe apparire come opzione consigliata) Assicurati che stampante e dispositivo siano collegati alla <b>stessa rete Wi-Fi</b> - Libreria multimediale WordPress - Aggiungi file scaricabile da + Prova la nuova funzionalità di creazione di prodotti semplici, collegati e raggruppati mentre ci prepariamo al lancio Incrementa le vendite con upsell e cross-sell Modifica prodotti Aggiungi prodotti Prodotti promossi nel carrello quando viene selezionato il prodotto corrente - Prova la nuova funzionalità di creazione di prodotti semplici, collegati e raggruppati mentre ci prepariamo al lancio Cross-sell Prodotti promossi al posto del prodotto attualmente visualizzato (ossia i prodotti più redditizi) Up-sell @@ -2601,6 +2614,7 @@ Language: it %1$s%2$s x %3$s Ottieni un link di accesso tramite e-mail Hmm, non riusciamo a trovare un account di WordPress.com collegato a questo indirizzo e-mail. + Prova a visualizzare i componenti aggiuntivi per gli ordini mentre ci prepariamo a lanciarli Creazione di prodotti Preferenze Errore durante lo spostamento nel cestino del prodotto @@ -2612,25 +2626,24 @@ Language: it L\'aggiunta delle opzioni come dimensioni e colore è attualmente disponibile solo sul web. Queste verranno visualizzate come opzioni sulla pagina del prodotto del tuo sito. Crea nuovi prodotti dall\'app! Prodotto non trovato + Se stai ancora riscontrando problemi di stampa dal tuo dispositivo, puoi <b>salvare la tua etichetta come PDF</b> e inviarla via e-mail per stamparla da un altro dispositivo. + Dopo aver selezionato <b>\"Stampa le etichette di spedizione\"</b>, potrebbe essere necessario selezionare e aggiungere una stampante se non hai stampato da questo dispositivo prima. Opzioni formato etichetta + Stampa dal dispositivo Etichetta (4 x 6 pollici) Lettera (8,5 x 11 pollici) Nota legale (8,5 x 14 pollici) Errore visualizzazione etichetta di spedizione + Non sai come stampare dal dispositivo mobile? Visualizza il layout dell\'etichetta e le opzioni delle dimensioni del foglio Stampa etichetta di spedizione Scegli dimensione carta Dimensione carta + Se hai già utilizzato l\'etichetta in un pacchetto, stamparla e utilizzarla di nuovo è una violazione dei nostri termini di servizio. Si è verificato un errore di stampa durante l\'acquisto dell\'etichetta, puoi stamparla nuovamente. Stiamo lavorando per rendere più semplice per te stampare le etichette di spedizione direttamente dal dispositivo. Per ora, se hai creato etichette di spedizione per questo ordine nell\'amministrazione del negozio con WooCommerce Shipping, puoi stamparle nei Dettagli dell\'ordine qui. Stampa etichette di spedizione dal dispositivo. - Stampa dal dispositivo - Se hai già utilizzato l\'etichetta in un pacchetto, stamparla e utilizzarla di nuovo è una violazione dei nostri termini di servizio. - Se stai ancora riscontrando problemi di stampa dal tuo dispositivo, puoi <b>salvare la tua etichetta come PDF</b> e inviarla via e-mail per stamparla da un altro dispositivo. - Dopo aver selezionato <b>\"Stampa le etichette di spedizione\"</b>, potrebbe essere necessario selezionare e aggiungere una stampante se non hai stampato da questo dispositivo prima. Stampa etichetta di spedizione - Prova a visualizzare i componenti aggiuntivi per gli ordini mentre ci prepariamo a lanciarli - Non sai come stampare dal dispositivo mobile? \u0022%1$s\u0022 Bozza prodotto salvata Errore durante il salvataggio della bozza del prodotto @@ -2678,12 +2691,12 @@ Language: it Accedi con un altro account Seleziona il negozio da connettere Continua con WordPress.com + Un prodotto con varianti come colore o misura %d prodotto selezionato %d prodotti selezionati Aggiungi i prodotti al gruppo Aggiungi prodotto Inserisci una password - Un prodotto con varianti come colore o misura Torna al negozio Contattaci qui Tieni presente che questo non è un ticket di supporto e non saremo in grado di rispondere a feedback individuali.\n\nTi serve aiuto? %1$s @@ -2708,8 +2721,8 @@ Language: it Nessun prezzo impostato Abilitata Devi impostare il prezzo di vendita se è pianificata una vendita - %1$s ha lasciato una recensione Ora puoi modificare i prodotti variabili, esterni e raggruppati, puoi cambiare il tipo di prodotto e aggiornare categorie e tag. + %1$s ha lasciato una recensione Mi piace Potrebbe essere migliore Ti piace l\'app WooCommerce? @@ -2718,24 +2731,24 @@ Language: it Si è verificato un errore durante l\'aggiunta di tag Aggiunta di tag Il rimborso è in fase di elaborazione. Attendi… + Richiesta di rimborso inviata correttamente Rimborsa etichetta (-%1$s) Importo idoneo al rimborso Data di acquisto + Puoi richiedere un rimborso per un\'etichetta di spedizione non utilizzata per spedire un pacchetto. L\'elaborazione richiederà almeno 14 giorni. Richiedi un rimborso Rimborsa etichetta di spedizione - Puoi richiedere un rimborso per un\'etichetta di spedizione non utilizzata per spedire un pacchetto. L\'elaborazione richiederà almeno 14 giorni. - Richiesta di rimborso inviata correttamente Bene fisico Un breve estratto sul tuo prodotto Rendi i tuoi prodotti più semplici da trovare con i tag Organizza i tuoi prodotti in gruppi correlati - Disabilitata Aggiungi peso e dimensioni Aggiungi altri dettagli Organizza i tuoi prodotti in tag Aggiungi il tuo primo tag Tag Aggiungi tag + Disabilitata Prodotto virtuale Aggiungi altri dettagli %1$s prodotto @@ -2743,7 +2756,9 @@ Language: it %s prodotto Prodotti rimanenti %1$s \u2022 %2$s + Rimborso dell\'etichetta %1$s richiesto Traccia spedizione + %1$s\n%2$s Nascondi dettagli spedizione Mostra dettagli spedizione Carta di credito @@ -2753,8 +2768,6 @@ Language: it Spedisci a Spedisci da Pacco %d - %1$s\n%2$s - Rimborso dell\'etichetta %1$s richiesto SKU: %1$s %1$s (%2$s opzioni) Etichette di spedizione @@ -2775,12 +2788,12 @@ Language: it Nota sulla privacy per utenti in California Mantieni le modifiche Fino al giorno %1$s - Nuove opzioni di modifica disponibili Abbiamo aggiunto più funzionalità di modifica ai prodotti! Ora puoi aggiornare immagini, vedere anteprime e condividere i prodotti. + Nuove opzioni di modifica disponibili + Modifica limitata disponibile Prodotti %1$s x %2$s %1$s %2$s - Modifica limitata disponibile Esterno Semplice Pubblicato privatamente @@ -2870,11 +2883,11 @@ Language: it Larghezza Lunghezza Prodotti rimborsati + %1$s (%2$s x %3$d) %1$s tramite %2$s Desideri emettere un rimborso? Questo non può essere annullato. Prodotti rimborsati Rimborsi - %1$s (%2$s x %3$d) Iscriviti a WordPress.com Siamo spiacenti, non è stato possibile trovare risultati per \"%s\" Acquisisci recensioni del prodotto di alta qualità per il tuo negozio @@ -2895,32 +2908,33 @@ Language: it Aggiungi inventario Ricerca dei tuoi ordini in corso… Inserisci testo + Inserisci il titolo del prodotto + Prodotto salvato Errore durante l\'aggiornamento del prodotto Attendi… Descrivi il tuo prodotto Descrizione Modifica descrizione - Inserisci il titolo del prodotto - Prodotto salvato - Fatto Desideri eliminare queste modifiche? Aggiorna + Fatto Rimborso in corso, attendi… Rimborsa spedizione Seleziona quantità Rimborso spedizione Rimborso prodotti + %1$s x %2$s ciascuno %d elementi selezionati Non selezionare nessuno Seleziona tutto In attesa della conferma del rimborso… - %1$s x %2$s ciascuno Ridimensiona e comprimi le immagini per un caricamento più rapido Ottimizzazione delle immagini Scatta una foto Scegli da dispositivo Seleziona un metodo di caricamento Carica + Caricamento delle immagini in corso…%1$d di %2$d Caricamento delle immagini in corso… Impossibile accedere alla fotocamera Desideri rimuovere questa immagine? @@ -2935,7 +2949,6 @@ Language: it Aggiungi immagine In arrivo Rimuovi - Caricamento delle immagini in corso…%1$d di %2$d Non siamo stati in grado di accedere al tuo sito. Dovrai contattare il tuo fornitore di hosting per risolvere questo problema. Non siamo stati in grado di accedere al tuo sito perché abbiamo riscontrato un problema con il <b>certificato SSL</b>. Dovrai contattare il tuo fornitore di hosting per risolvere questo problema. Non siamo stati in grado di accedere al tuo sito perché viene richiesta l\'<b>autenticazione HTTP</b>. Dovrai contattare il tuo fornitore di hosting per risolvere questo problema. @@ -2944,8 +2957,8 @@ Language: it Accedi con le credenziali del sito. Accedi con le credenziali del sito %1$s Invia e-mail di verifica - Modifica del prodotto Testa la nuova funzionalità di modifica del prodotto mentre ci prepariamo a lanciarla + Modifica del prodotto Si è verificato un errore durante il recupero del tuo account. Puoi riprovare ora o chiudere e riprovare più tardi. Si è verificato un errore. Accedi per continuare Connessione al tuo sito in corso… @@ -2980,12 +2993,15 @@ Language: it Nessun prodotto corrispondente Ancora nessun prodotto %s in magazzino + \u2022 %d varianti in magazzino Immagine prodotto %1$s ha lasciato una recensione per %2$s Non approvato Errore durante il recupero della nuova recensione prodotto Errore durante il recupero delle recensioni prodotto - \u2022 %d varianti in magazzino + Si è verificato un problema con il rimborso. Riprova. + Il rimborso è stato emesso correttamente. + Il rimborso per %s è in fase di elaborazione. Attendi… Icona preventivo Rimborso manuale Dettagli di rimborso @@ -3003,9 +3019,6 @@ Language: it Rimborso %s Disponibile per il rimborso: %s Emetti rimborso - Si è verificato un problema con il rimborso. Riprova. - Il rimborso è stato emesso correttamente. - Il rimborso per %s è in fase di elaborazione. Attendi… %1$s tramite %2$s Statistiche migliorate Funzionalità beta @@ -3019,12 +3032,12 @@ Language: it Statistiche odierne Registrati Hai già Jetpack? %1$s + Tentativo di accesso con Jetpack in corso… aggiorna l\'app per continuare + Per usare quest\'app per %1$s dovrai avere il plugin Jetpack impostato e connesso a questo account. \n\nUna volta impostato, aggiorna l\'app Prova un altro negozio Database declassato, ricreazione delle tabelle e caricamento dei negozi in corso Caricamento dei negozi in corso - Tentativo di accesso con Jetpack in corso… - Per usare quest\'app per %1$s dovrai avere il plugin Jetpack impostato e connesso a questo account. \n\nUna volta impostato, aggiorna l\'app Nessun corriere trovato Inserisci un indirizzo di sito Web completo, come esempio.com. Ancora nessuna recensione! @@ -3035,11 +3048,12 @@ Language: it Impossibile recuperare le impostazioni: alcune API non sono disponibili per questa combinazione di ID app OAuth + account. Stiamo assumendo. Copia numero di tracciabilità - aggiorna l\'app Verifica per WooCommerce… + aggiorna l\'app Nessun indirizzo specificato Ti serve aiuto per trovare l\'e-mail con cui ti sei collegato? Il sito web su questo indirizzo non è un sito WordPress. Per poterci collegare a esso, il sito deve avere WordPress installato. + Accedi con WordPress.com per collegarti a <b>%1$s</b> Zimbabwe Zambia Yemen @@ -3176,7 +3190,6 @@ Language: it Giamaica Costa d\'Avorio Italia - Accedi con WordPress.com per collegarti a <b>%1$s</b> Israele Isola di Man Irlanda @@ -3283,15 +3296,24 @@ Language: it Afghanistan Isole Åland Recensione + Corriere personalizzato Personalizza + Inserisci il nome di un corriere Inserisci un numero di tracciabilità + Seleziona un corriere Vuoi davvero eliminare questa tracciabilità? Impossibile aggiungere la tracciabilità Tracciabilità della spedizione aggiunta + Errore durante il recupero dei corrieri + Corriere della spedizione selezionato + Corrieri della spedizione Data di spedizione Inserisci link di tracciabilità + Inserisci il nome del corriere Inserisci numero di tracciabilità + Seleziona il corriere Link di tracciabilità (opzionale) + Nome del corriere Numero di tracciabilità Corriere Aggiungi tracciabilità @@ -3304,25 +3326,19 @@ Language: it Traccia spedizione Nell\'amministrazione del sito puoi trovare l\'e-mail che hai usato per collegarti a WordPress.com dalla %1$sBacheca di Jetpack%2$s sotto %3$sConnessioni > Connessione dell\'account%4$s Quale e-mail uso per accedere? + Hai bisogno di aiuto per trovare l\'e-mail richiesta? Jetpack è un plugin WordPress gratuito che collega il tuo negozio con gli strumenti necessari per assicurarti la migliore esperienza mobile, incluse le notifiche push e le statistiche Che cos\'è Jetpack? Visualizza i negozi collegati - Continua a modificare - Corriere personalizzato - Inserisci il nome di un corriere - Seleziona un corriere - Errore durante il recupero dei corrieri - Corriere della spedizione selezionato - Corrieri della spedizione - Inserisci il nome del corriere - Seleziona il corriere - Nome del corriere Sembra che %1$s sia connesso a un account WordPress.com differente. - Hai bisogno di aiuto per trovare l\'e-mail richiesta? + Continua a modificare Accedi con i tuoi nome utente e password. Accedi utilizzando il tuo nome utente di WordPress.com invece del tuo indirizzo e-mail. Il sito a questo indirizzo non è un sito WordPress. Per poterci connettere, il sito deve utilizzare WordPress. Centro assistenza + Virtuale + Raggruppato + Variabile Permetti, ma invia notifica al cliente Permetti Non permettere @@ -3330,9 +3346,6 @@ Language: it Esaurito In magazzino Leggi altro - Raggruppato - Variabile - Virtuale Impossibile caricare le immagini Bozza Privato @@ -3378,11 +3391,11 @@ Language: it Prova ora OK Tocca per passare da un negozio all’altro + Seleziona negozio Esci da questo account Modifica lo stato dell\'ordine Fai clic per modificare lo stato dell\'ordine Applica - Seleziona negozio No, grazie Più tardi Valuta ora @@ -3396,11 +3409,11 @@ Language: it Aggiorna il negozio su WooCommerce 3.5 Impossibile eseguire la connessione a %s Rimuovi + Errore durante il contrassegno di tutte le recensioni come lette Contrassegna tutte come lette Messaggio Chiamata Chiama o manda un messaggio al cliente - Errore durante il contrassegno di tutte le recensioni come lette Errore durante l\'aggiornamento dello stato della recensione del prodotto Errore durante il caricamento dei dettagli della recensione del prodotto Cestino @@ -3413,16 +3426,16 @@ Language: it Gestisci notifiche Notifiche Desideri uscire dall\'account %s? - Se disabilitata, la nota diventerà privata Recensione contrassegnata come %1$s + Se disabilitata, la nota diventerà privata Errore durante il recupero dell\'ordine Indietro Avvisi delle recensioni del prodotto Avvisi dei nuovi ordini Al cliente + Verifica del sito in corso… Aggiorna istruzioni Ricerca - Verifica del sito in corso… Aggiorna e altre %d. %d nuove notifiche @@ -3454,9 +3467,9 @@ Language: it Rapporti di arresto anomalo Condividi Versione %s - Abbiamo effettuato troppi tentativi di invio di un codice di verifica SMS: prenditi una pausa e richiedine uno nuovo tra un minuto. - Non è presente alcun account WordPress.com corrispondente a questo account Google. - Accedi all\'account WordPress.com che hai utilizzato per connettere Jetpack. + Password HTTP + HTTP nome utente + Autorizzazione richiesta Link inviato Registrazione via e-mail Verifica del codice @@ -3465,9 +3478,32 @@ Language: it Accesso tramite link Accesso tramite indirizzo sito Accesso tramite indirizzo e-mail - Non hai un account? %1$sRegistrati%2$s - Registrazione con Google… + Si è verificato un errore. + Fornisci un codice di autenticazione per continuare. + Controlla due volte la tua password per continuare. + Accesso interrotto + Attendi mentre stai effettuando l\'accesso. + Accesso in corso… + Tocca per continuare. + Accesso effettuato! + Si è verificato un errore di rete. Controlla la connessione e riprova. + Inserisci un sito web WordPress.com o un sito web WordPress.com ospitato personalmente connesso a Jetpack. + Non è possibile connettersi. Abbiamo ricevuto un messaggio di errore 403 durante il tentativo di accedere\n all\'endpoint XMLRPC del tuo sito. Per l\'app questo è necessario per comunicare con il tuo sito. Contatta il tuo host per risolvere\n questo problema. + Non è possibile connettersi. Il tuo host sta bloccando le richieste POST ma queste sono necessarie al corretto funzionamento dell\'app\n per comunicare con il tuo sito. Contatta il tuo fornitore del servizio di hosting per risolvere questo problema. + Non è possibile connettersi. Sul server mancano i necessari metodi XML-RPC + Controlla che l\'URL del sito sia valido + Si è verificato un errore + Password dimenticata? + Inserisci un indirizzo e-mail valido + Verifica della email + Accedi di nuovo per continuare. + Accedi all\'account WordPress.com che hai utilizzato per connettere Jetpack. + Impossibile recuperare il profilo + È stato rilevato un sito duplicato. + Il sito esiste già nell\'app, non lo puoi aggiungere. + Il nome utente o la password immessi non sono corretti Tempo di risposta di Google troppo lungo. Potresti dover attendere fino a quando non disporrai di una connessione Internet più forte. + Registrazione con Google… Registrati con Google Registrati con l\'e-mail Registrandoti, accetti i nostri %1$sTermini di servizio%2$s. @@ -3477,54 +3513,20 @@ Language: it Si è verificato un errore durante l\'invio dell\'email. Puoi riprovare ora o chiudere e riprovare più tardi. Per creare il tuo nuovo account WordPress.com, inserisci l\'indirizzo e-mail. Si è verificato un errore durante il controllo dell\'indirizzo e-mail. - Si è verificato un errore. - Fornisci un codice di autenticazione per continuare. - Controlla due volte la tua password per continuare. - Accesso interrotto - Attendi mentre stai effettuando l\'accesso. - Accesso in corso… - Tocca per continuare. - Accesso effettuato! - Il login tramite Google non può essere inizializzato. - Inserisci una password \nPuoi provare un account diverso? + Il login tramite Google non può essere inizializzato. + Abbiamo effettuato troppi tentativi di invio di un codice di verifica SMS: prenditi una pausa e richiedine uno nuovo tra un minuto. Si sono verificati dei problemi con la connessione con l’account Google. + Non è presente alcun account WordPress.com corrispondente a questo account Google. Chiudi Accedi con Google. - Si è verificato un errore di rete. Controlla la connessione e riprova. Autenticato come Impossibile rilevare il client di posta elettronica della tua app + Non hai un account? %1$sRegistrati%2$s Inserisci un codice di verifica - È stato rilevato un sito duplicato. - Il sito esiste già nell\'app, non lo puoi aggiungere. - Non è possibile connettersi. Abbiamo ricevuto un messaggio di errore 403 durante il tentativo di accedere\n all\'endpoint XMLRPC del tuo sito. Per l\'app questo è necessario per comunicare con il tuo sito. Contatta il tuo host per risolvere\n questo problema. - Non è possibile connettersi. Il tuo host sta bloccando le richieste POST ma queste sono necessarie al corretto funzionamento dell\'app\n per comunicare con il tuo sito. Contatta il tuo fornitore del servizio di hosting per risolvere questo problema. - Verifica della email - Non è possibile connettersi. Sul server mancano i necessari metodi XML-RPC - Impossibile recuperare il profilo - Accedi di nuovo per continuare. - Password dimenticata? - Il nome utente o la password immessi non sono corretti - Inserisci un indirizzo e-mail valido - Si è verificato un errore - Autorizzazione richiesta - Controlla che l\'URL del sito sia valido - Password HTTP - HTTP nome utente - Inserisci un sito web WordPress.com o un sito web WordPress.com ospitato personalmente connesso a Jetpack. - In alternativa: - Generale - \@%s - Accedi con il tuo nome utente. - Accedi inserendo l\'indirizzo del tuo sito. - Inviami invece un messaggio con un altro codice. - Abbiamo inviato un messaggio di testo al numero di telefono che termina in %s. Inserisci il codice di verifica contenuto nell\'SMS. - Per procedere con questo account Google, fornisci la password WordPress.com corrispondente. Verrà richiesta solo una volta. - Accedi a WordPress.com per condividere il contenuto. - Immetti l\'indirizzo del tuo sito WordPress sul quale desideri condividere il contenuto. - Si è verificato un errore durante l\'apertura di un browser web di base. Scegli un\'altra applicazione: - Impossibile aprire il link + Inserisci una password Inserisci un nome utente + Accedi a WordPress.com per condividere il contenuto. Accedi a WordPress.com per accedere all\'articolo. Si è verificato un errore durante l\'aggiunta del sito. Codice di errore: %s Verifica indirizzo sito @@ -3533,15 +3535,25 @@ Language: it Qual è l\'indirizzo del mio sito? Hai bisogno di aiuto per trovare l\'indirizzo del tuo sito? Indirizzo sito + Immetti l\'indirizzo del tuo sito WordPress sul quale desideri condividere il contenuto. \@%s Hai già effettuato l\'accesso a WordPress.com Continua + Connettiti a un sito Connetti un altro sito + Per procedere con questo account Google, fornisci la password WordPress.com corrispondente. Verrà richiesta solo una volta. Inserisci la tua password WordPress.com. + Attualmente non disponibile. Inserisci la tua password Richiesta e-mail di accesso Sembra che la password non sia corretta. Verifica attentamente le informazioni e riprova. Richiesta codice di verifica tramite SMS. + Inviami invece un messaggio con un altro codice. Inviami un codice. + Abbiamo inviato un messaggio di testo al numero di telefono che termina in %s. Inserisci il codice di verifica contenuto nell\'SMS. + Ci sei quasi! Inserisci il codice di verifica per WordPress.com dalla tua app di autenticazione. + Accedi con il tuo nome utente. + Accedi inserendo l\'indirizzo del tuo sito. + In alternativa: Apri mail Successivo Gestisci il tuo sito con Jetpack mentre sei in movimento: hai WordPress in tasca. @@ -3549,39 +3561,29 @@ Language: it Tieni il passo con i tuoi siti preferiti e partecipa a una conversazione ovunque e in qualsiasi momento. Guarda i lettori da tutto il mondo leggere e interagire con il tuo sito, in tempo reale. Pubblica dal parco. Lavora al blog sull\'autobus. Commenta dal bar. WordPress si sposta con te. - Sei già connesso a un account WordPress.com, non puoi aggiungere un sito WordPress.com legato a un altro account. - Riprova - Uscire - Invia link - Attualmente non disponibile. Inserisci la tua password - Sto entrando + Accedi + Aiuto + Password + Nome utente Oppure inserisci la tua password - Indirizzo e-mail - Dettagli - Annulla + Invia link Codice di verifica non valido Codice di verifica - Aiuto - Rimuovi - Accedi - Nome utente - Password - Senza titolo - Impostazioni - Oggi - Annulla + Indirizzo e-mail Supporto %s WooCommerce per Android opzione non controllata opzione controllata Politica sulla privacy di terze parti Politica sui cookie Politica sulla privacy + Creato con amore da Automattic. %1$s Utilizziamo altri strumenti di tracciamento, inclusi alcuni di terze parti. Leggi le informazioni sugli strumenti e come utilizzarli. Leggi la politica sulla privacy Questa informazione ci aiuta a migliorare i nostri prodotti, a rendere il marketing più mirato, a personalizzare la tua esperienza su WooCommerce e molto altro come descritto in dettaglio nostra politica sulla privacy Condividi informazioni con gli strumenti di analisi relative all\'uso dei servizi mentre sei connesso al tuo account WordPress Raccogli informazioni Impostazioni privacy + Impostazioni Stato dell\'ordine Rimborsato Cancellato @@ -3595,6 +3597,7 @@ Language: it Aggiungi Nota e-mail al cliente Errore durante la modifica dell\'ordine + Errore durante il recupero delle note Ordine contrassegnato come completo Contrassegna ordine come completo Aggiungi una nota dell\'ordine @@ -3603,6 +3606,7 @@ Language: it Mostra fatturazione Pagamento cancellato Note ordine + Privato Scrivi una nota dell\'ordine Immagine profilo personalizzata Nota fornita dai clienti @@ -3627,6 +3631,9 @@ Language: it Nessun ordine Visualizza ordini Visualizza ordine + Nessuna attività per questo periodo + Ordini totali: %s + Immagine dell\'errore Errore durante recupero dati Fatturato Ordini @@ -3639,11 +3646,17 @@ Language: it Nessun negozio WooCommerce Foto del profilo Negozio collegato + Leggi le %1$sistruzioni di configurazione%2$s. Questa app richiede che Jetpack sia connesso al tuo negozio. + \@%s + Immetti l\'indirizzo del negozio WooCommerce che desideri connettere. Accedi con l\'indirizzo e-mail dell\'account WordPress.com per gestire i negozi WooCommerce. + Sei già connesso a un account WordPress.com, non puoi aggiungere un sito WordPress.com legato a un altro account. + Impossibile aprire il link Nessuna app per SMS trovata Nessuna app per e-mail trovata Nessuna app per telefono trovata + Si è verificato un errore durante l\'apertura di un browser web di base. Scegli un\'altra applicazione: Impossibile aprire il link %1$s alle %2$s Più vecchie di un mese @@ -3652,15 +3665,22 @@ Language: it Ieri Oggi Prodotti + Rimuovi Quest\'anno Questo mese Questa settimana + Oggi Prodotto La rete non è disponibile. Controlla la connessione dati o WiFi. Offline u2014 utilizza i dati memorizzati nella cache Per saperne di più + Annulla + Senza titolo Continua + Annulla + Riprova Nascondi dettagli + Dettagli Sconto Subtotale Tasse @@ -3671,18 +3691,11 @@ Language: it %1$s%2$s Ordini Il mio negozio + Uscire + Sto entrando Tutto + Generale WooCommerce - Immagine dell\'errore - Creato con amore da Automattic. %1$s - Immetti l\'indirizzo del negozio WooCommerce che desideri connettere. - Privato - Connettiti a un sito - Nessuna attività per questo periodo - Ordini totali: %s - Errore durante il recupero delle note - Leggi le %1$sistruzioni di configurazione%2$s. - Ci sei quasi! Inserisci il codice di verifica per WordPress.com dalla tua app di autenticazione. @string/date_timeframe_custom @string/date_timeframe_today diff --git a/WooCommerce/src/main/res/values-ja/strings.xml b/WooCommerce/src/main/res/values-ja/strings.xml index 67c331e9fcf..c28c93b0cb7 100644 --- a/WooCommerce/src/main/res/values-ja/strings.xml +++ b/WooCommerce/src/main/res/values-ja/strings.xml @@ -1,11 +1,27 @@ + バリエーションの読み込み中にエラーが発生しました + 「その他のアイテムの読み込みに失敗しました。 もう一度実行してください」 + 戻る + %1$d個のバリエーション + バリエーション %s、価格 %s + バリエーションのある商品 %s、価格 %s + 説明を空にすることはできません + 行動喚起 (CTA) + キャッチフレーズを空にすることはできません + メールアドレスが正しいことを確認し、スパムフォルダーを再確認してください。 + このユーザー名に接続された WordPress.com アカウントが見つかりません。 メールアドレスを入力して新規アカウントを作成できます。 + バーコードまたはこの商品固有のその他の ID を入力してください。 この商品を他のチャネルやマーケットプレイスに出品するのに役立ちます。 + GTIN、UPC、EAN、ISBN + 最終の支払い + ラベルを購入したら、この注文に完了のマークを付けてお客様に通知してください。 + アカウントをお持ちでない場合は、このメールアドレスを使用してアカウントを作成いたします。 封筒 ボックス パッケージを追加 @@ -30,7 +46,6 @@ Language: ja_JP 最安値 ラベルを購入 ラベルを購入 · %1$s - この注文に完了のマークを付けてお客様に通知 配送料 注文詳細 配送状況の詳細 @@ -559,7 +574,6 @@ Language: ja_JP 言語 予算 詳細 - 今すぐ購入 広告を編集 プレビュー 無効 @@ -585,7 +599,6 @@ Language: ja_JP 宣伝準備完了 何百万もの人に商品を紹介 使用 %1$s - 最後のデポジット 注文合計を展開 / 折りたたむ 支払いを受け取る コードのフォーマットは「XXXX-XXXX-XXXX-XXXX」です @@ -667,9 +680,9 @@ Language: ja_JP 端末上のドキュメントとその他のファイル ✨お礼状を作成できません 税金を請求 - 利用可能な資金は毎%s自動で入金されます。 - 利用可能な資金は毎日自動で入金されます。 - 資金は%d日間保留された後に利用可能になります。 + 利用可能な資金は毎%s自動で支払われます。 + 利用可能な資金は毎日自動で支払われます。 + 資金は%d日間保留された後に利用可能になります。 バリエーションを選択する バリエーションを選択 「%1$s」-> %2$s @@ -708,19 +721,19 @@ Language: ja_JP 期間 請求の間隔 セール - 不明 - 失敗 - キャンセル済み - 輸送中 - 承認待ち - 有料 - 予定 - デポジットの概要を折りたたむ / 展開する - 資金の受け取りタイミングについて詳しくはこちら - 利用可能な資金は毎月 %s 上で自動で入金されます。 - 資金は%d日間保留された後に利用可能になります。 - 保留中の資金 - 利用可能な資金 + 不明 + 失敗 + キャンセル済み + 輸送中 + 承認待ち + 有料 + 予定 + 支払いの概要を折りたたむ / 展開する + 資金の受け取りタイミングについて詳しくはこちら + 利用可能な資金は毎月 %s 上で自動で支払われます。 + 資金は%d日間保留された後に利用可能になります。 + 保留中の資金 + 利用可能な資金 商品 支払総額 diff --git a/WooCommerce/src/main/res/values-ko/strings.xml b/WooCommerce/src/main/res/values-ko/strings.xml index 5d129e3b9a3..63e7a0032f0 100644 --- a/WooCommerce/src/main/res/values-ko/strings.xml +++ b/WooCommerce/src/main/res/values-ko/strings.xml @@ -1,11 +1,27 @@ + 상품 옵션 로드 오류 + \"아이템을 더 로드하지 못했습니다. 다시 시도하세요” + 뒤로 + %1$d개 변형 + 상품 옵션 %s, 가격 %s + 변형 상품 %s, 가격 %s + 설명은 비워 둘 수 없음 + 행동 유도 + 태그라인은 비워 둘 수 없음 + 이메일이 올바른지 확인하고 스팸 폴더를 다시 확인하세요. + 이 사용자명에 연결된 워드프레스닷컴 계정을 찾을 수 없습니다. 이메일을 입력하여 새 계정을 만들 수 있습니다. + 이 상품에 고유한 바코드 또는 기타 식별자를 입력하세요. 이 상품을 다른 채널이나 마켓플레이스에 등록하는 데 도움이 될 수 있습니다. + GTIN, UPC, EAN, ISBN + 지난 지급금 + 레이블을 구매한 후에는 이 주문을 완료로 표시하고 고객에게 알립니다. + 계정이 없다면 이 이메일을 사용하여 계정을 만드시면 됩니다. 봉투 상자 패키지 추가 @@ -30,7 +46,6 @@ Language: ko_KR 가장 저렴 레이블 구매 레이블 구매 · %1$s - 이 주문을 완료로 표시하고 고객에게 알립니다. 배송비 주문 상세 정보 배송 상세 정보 @@ -40,8 +55,8 @@ Language: ko_KR 위험물 또는 유해물질을 배송하시나요? 아이템 카드 축소/확장 %1$s  ·  %2$s - 1%s 기준으로 정렬됨 아니요 + 1%s 기준으로 정렬됨 향후 캠페인을 위해 내 선택 사항 저장 <b>다음과 같은 상황에 적합:</b> %s 목표 %s 선택 @@ -96,14 +111,14 @@ Language: ko_KR 어두워진 배경입니다. 눌러서 대화 상자 무시하기 주당 %1$s 사용자가 중지할 때까지 실행 - %1$s부터 계속 진행 - 주당 지출 %2$s부터 주당 %1$s 주당 나머지 합계 클릭 통과 회원님의 기기가 배터리 세이버 모드인 것 같습니다. \n이 모드가 활성화된 상태에서는 스토어 정보를 제공해 드릴 수 없습니다. + %1$s부터 계속 진행 + 주당 지출 옵션이 포함된 팝업 메뉴입니다. 밀어서 아이템을 탐색할 수 있습니다. 도구 모음 메뉴 열기 카드 리더 상태를 포함한 도구 모음입니다. 메뉴가 열립니다. 두 번 눌러 상호작용할 수 있습니다. @@ -135,13 +150,13 @@ Language: ko_KR 새 주문 확인 + 스토어 관리에서 주문 생성 - 단순 상품이 아닌 상품에 대한 결제를 받으려면 POS를 종료하고 주문 탭에서 새 주문을 생성하세요. 왜 내 상품이 보이지 않나요? 정보 닫기 - 자세히\u00A0알아보기 현재 POS에는 단순 실물 상품만 호환됩니다. 변형 상품, 가상 상품 등의 다른 상품 유형은 향후 업데이트를 통해 지원될 예정입니다. 단순 상품만 표시 + 단순 상품이 아닌 상품에 대한 결제를 받으려면 POS를 종료하고 주문 탭에서 새 주문을 생성하세요. + 자세히\u00A0알아보기 사이트 주소 우커머스용 Google 유료 캠페인 추가 @@ -151,12 +166,12 @@ Language: ko_KR 새 캠페인이 생성되었습니다. 판매 시간이 다가오고 있습니다! 모든 준비를 마쳤습니다! 주문을 생성할 수 없음 - 다시 시도 오류 표시 아이콘 한 번 더 시도할까요? 상품 로드 오류 현재 POS에서는 단순 상품만 지원합니다. 현재 POS에서는 단순 상품만 지원합니다 - \n시작하려면 단순 상품을 생성하세요. + 다시 시도 지원되는 상품을 찾을 수 없음 상품 없음 고객 지원 @@ -228,8 +243,8 @@ Language: ko_KR 이름, 요약 및 설명 저장하기 전에 상품 상세 정보를 편집하거나 재생성할 수 있습니다. 프로그램 - Google 캠페인 이 기간의 프로그램 없음 + Google 캠페인 지금 연결 장바구니 상품 상세 정보 만들기 @@ -240,23 +255,23 @@ Language: ko_KR AI가 제품의 상세 정보를 만듭니다. 카드 결제 수령 합계 - 세금 소계 결제 성공 결제에 실패했습니다. 다시 시도해 주세요. 장바구니 아이콘 상품 - %d개 아이템 - 지우기 Google Ads로 매출과 트래픽을 늘리세요 우커머스용 Google 수량 규칙 없음 + %d개 아이템 + 지우기 + 세금 잠재 고객 취소 - 종료 POS 종료 - 장바구니에서 %s 삭제 체크아웃 + 장바구니에서 %s 삭제 + 종료 리더 상태 알 수 없음 체크아웃 리더 연결됨 @@ -324,8 +339,8 @@ Language: ko_KR %s 숨기기 완료됨 피드백 - 사이트에서 우커머스 최신 버전을 실행하고 있으며 우커머스 분석이 활성화되어 있는지 확인하세요. 스토어 분석을\n 표시할 수 없음 + 사이트에서 우커머스 최신 버전을 실행하고 있으며 우커머스 분석이 활성화되어 있는지 확인하세요. 모든 작업 보기 세션 분석에서는 사용자 정의 범위에 사용할 수 없는 고유 방문자 수를 이용합니다 세션 데이터 사용 불가 @@ -338,11 +353,11 @@ Language: ko_KR 취소 강제 종료 아직 앱 연결을 승인하지 않으신 것 같습니다. 종료하시겠어요? - 크기가 400x400픽셀 이상인 이미지를 선택하세요. 유효하지 않은 이미지 입력하신 사용자명 또는 비밀번호가 일치하지 않는 것 같습니다. 자격 증명을 다시 확인하고 다시 시도하세요. 데이터가 여전히 로드되지 않으면 지원팀에 도움을 문의하세요. 연결 문제 없음 + 크기가 400x400픽셀 이상인 이미지를 선택하세요. 이전 화면으로 돌아가기 연결 재시도 사이트에 연결하기 @@ -396,7 +411,6 @@ Language: ko_KR 추천 도메인 입력 도메인 선택 - 모든 스토어 분석 보기 매년 매월 매주 @@ -406,6 +420,7 @@ Language: ko_KR 다른 스토어 연결 새 스토어를 시작하시나요? 스토어 이름 + 모든 스토어 분석 보기 기다려주세요… 재고 상태 업데이트 중 문제가 발생했습니다. 다시 시도하세요. @@ -436,17 +451,17 @@ Language: ko_KR 휴지통으로 주문 이동 중 오류 발생 휴지통으로 주문 이동됨 사이트에서 문제가 발생한 것 같습니다.\n\n자세한 내용은 호스팅 공급업체에 문의하세요. + 인터넷에 연결되지 않은 것 같습니다.\n\n와이파이가 켜졌는지 확인하세요. 모바일 데이터를 사용 중이라면 기기 설정에서 활성화되었는지 확인하세요. 젯팩 연결에서 문제가 발생한 것 같습니다.\n\n걱정하지 마세요. 지원팀에서 도와드리겠습니다. 문의해 주시면 기꺼이 도와드리겠습니다. 사이트의 응답이 제대로 작동하지 않는 것 같습니다.\n\n걱정하지 마세요. 지원팀에서 도와드리겠습니다. 문의해 주시면 기꺼이 도와드리겠습니다. 사이트의 응답이 너무 오래 걸리는 것 같습니다.\n\n자세한 내용은 호스팅 공급업체에 문의하세요. - 인터넷에 연결되지 않은 것 같습니다.\n\n와이파이가 켜졌는지 확인하세요. 모바일 데이터를 사용 중이라면 기기 설정에서 활성화되었는지 확인하세요. 상품이 선택되지 않음 더 보기 지원 문의 - 사이트 주문 가져오기 - 워드프레스닷컴 서버에 연결하기 인터넷 연결 사용자 정의 날짜 범위 통계 추가 + 사이트 주문 가져오기 + 워드프레스닷컴 서버에 연결하기 위치를 찾을 수 없습니다.\n다시 시도하세요. 세션 페이지 조회수 기기 유형 @@ -513,9 +528,9 @@ Language: ko_KR URL 파라미터 대상 URL 수동으로 입력 - 검색되지 않았습니다.\n다시 시도하세요. 국가, 광역시/도 또는 시/군/구 입력을 시작하여 사용 가능한 옵션을 참조하세요. \"캠페인 제출\"을 클릭하면 <a href=\'termsOfService\'><u>서비스 약관</u></a>과 <a href=\'advertisingPolicy\'><u>광고 정책</u></a>에 동의하고 선택한 예산과 기간에 대해 결제 수단으로 요금이 청구되도록 승인하는 것입니다. 홍보한 글의 예산 및 결제 방식에 대해 <a href=\'learnMore\'><u>자세히 알아보세요</u></a>. + 검색되지 않았습니다.\n다시 시도하세요. 캠페인 제출 결제 수단을 로드하지 못했습니다. 여기를 클릭하여 다시 시도해 주세요. 결제 수단 추가 @@ -535,7 +550,6 @@ Language: ko_KR 태그라인 이미지 변경 적용 - 시작 날짜 %1$s일 노출 수는 잠재적 고객에게 광고가 표시되는 빈도를 반영합니다.\n\n\n 온라인 트래픽과 사용자 행동의 유동성으로 인해 정확한 수는 보장할 수 없지만 광고의 실제 노출 수를 목표 수에 최대한 가깝게 일치시키는 것을 목표로 합니다.\n\n\n 노출 수는 독자의 행동이 아니라 가시성을 나타낸다는 점에 유의하세요. 완료 @@ -548,6 +562,7 @@ Language: ko_KR 예산 설정 모두 %2$s(으)로부터 %1$s일 + 시작 날짜 다시 표시하지 않음 나중에 다시 알림 잠깐 시간 좀 내주시겠어요? 빠른 피드백으로 AI 도우미 기능 개선을 도와주세요. @@ -559,9 +574,8 @@ Language: ko_KR 언어 예산 상세 정보 - 지금 쇼핑하기 - 광고 편집 미리보기 + 광고 편집 상품 선택 상품 %s 선택 @@ -572,12 +586,12 @@ Language: ko_KR <b>상품 선택:</b> Blaze로 홍보할 상품을 선택합니다. 재고 관리 재고가 관리되지 않음 - Blaze 작동 방식 알아보기 캠페인 시작하기 워드프레스닷컴과 Tumblr 네트워크 내 수백만 개 사이트에 실리는 광고입니다. 방대한 잠재 고객에게 접근 \"도구를 통해 관심 있는 쇼핑객이 찾을 수 있는 위치에 제품이 표시됩니다.\" 전 세계 도달 범위 간단하게 확보 + Blaze 작동 방식 알아보기 경험이나 큰 예산이 없어도 하루 최소 $5 USD로 몇 분 만에 광고를 시작할 수 있습니다. 빠른 시작, 큰 효과 판매자가 빠르고 간단한 광고 캠페인 설정을 통해 트래픽을 극대화할 수 있도록 도구를 설계했습니다. @@ -585,7 +599,6 @@ Language: ko_KR 홍보 준비 완료 수백만 명에게 제품 표시 %1$s 사용 - 마지막 예치금 주문 합계 확장 축소 결제 수령 코드가 XXXX-XXXX-XXXX-XXXX 형식으로 되어 있어야 함 @@ -667,11 +680,10 @@ Language: ko_KR 기기의 문서 및 기타 파일 ✨감사 인사 생성 세금 청구 - %s마다 사용 가능한 자금이 자동으로 예치됩니다. - 매일 사용 가능한 자금이 자동으로 예치됩니다. - %d일 대기 후 자금을 이용할 수 있게 됩니다. + %s마다 사용 가능한 자금이 자동으로 지급됩니다. + 매일 사용 가능한 자금이 자동으로 지급됩니다. + %d일 대기 후 자금을 이용할 수 있게 됩니다. 변형 선택 - 변형 선택 \" %1$s \" -> %2$s 변형을 선택하세요. %1$s개 아이템 선택됨 @@ -683,6 +695,7 @@ Language: ko_KR %1$s~%2$s개 아이템 %d개 아이템 %d개 아이템 + 변형 선택 %1$.2f개에서 %2$.2f개로 상품 수량 변경 구성 저장 구성 @@ -708,21 +721,21 @@ Language: ko_KR 기간 청구 주기 세일 - 알 수 없음 - 실패 - 취소됨 - 전환 중 - 대기 중 - 결제됨 - 예상됨 - 예치금 요약 접기/펼치기 - 언제 자금을 받게 되는지 더 알아보기 - 매월 %s에 사용 가능한 자금이 자동으로 예치됩니다. - %d일 대기 후 자금을 이용할 수 있게 됩니다. - 대기 중인 자금 - 사용 가능한 자금 + 알 수 없음 + 실패 + 취소됨 + 전환 중 + 대기 중 + 결제됨 + 예상됨 + 지급금 요약 접기/펼치기 + 언제 자금을 받게 되는지 더 알아보기 세금 상품 + 대기 중인 자금 + 사용 가능한 자금 + 매월 %s에 사용 가능한 자금이 자동으로 지급됩니다. + %d일 대기 후 자금을 이용할 수 있게 됩니다. 결제 총액 이메일 주소 또는 사용자명 사용자 정의 금액 주문 생성 불가 @@ -778,12 +791,12 @@ Language: ko_KR 5. \"완료\" 체크 표시가 보이면 스토어에서 결제가 처리되고 거래가 완료될 것입니다. 3. 스마트폰을 고객에게 내밉니다. 2. \"결제 받기\"를 탭하고 \"Tap to Pay\"을 선택합니다. - 1. 주문 생성 작동 방식 카드 리더에 대해 더 알아보기 이 한도를 초과하는 결제를 받으려면 PIN 입력을 허용하는 카드 리더 구매를 고려하세요. Android에서는 Tap to Pay를 통한 PIN 입력이 지원되지 않습니다. %1$s에서 일부 카드의 경우 %2$s 이상의 비접촉 거래에 PIN이 필요합니다. + 1. 주문 생성 중요 정보 Tap to Pay을 통해 카드 리더 기기를 구매하지 않고도 실물 직불 및 신용 카드부터 디지털 지갑까지 모든 비접촉 결제 유형을 수락할 수 있습니다. Tap to Pay란 무엇인가요? @@ -837,8 +850,8 @@ Language: ko_KR 세율 설정 활성화 새 세율 설정 - WooPayments 설정 + WooPayments 관리자에서 세율 편집 그러면 고객의 주소가 선택한 세율이 적용되는 위치로 변경됩니다. 세율 정보 대화 상자 열기 버튼 @@ -886,8 +899,8 @@ Language: ko_KR 주문 합계 계산한 백분율 계산한 금액 - 스토어 이름 스토어 이름을 사용자 정의하면 스토어의 검색 엔진 최적화에도 도움이 될 수 있습니다. + 스토어 이름 스토어 이름 지정 NFC 활성화 소량 제공 패키지(표시 필수) @@ -922,18 +935,26 @@ Language: ko_KR 제품명을 입력하세요. 회원님과 함께 성장하는 전자상거래 플랫폼 가변 구독 - 쿠폰 제거 누구나 좋아하는 딜 아직 생성한 쿠폰이 없습니다. 이 주문에 적용할 쿠폰을 생성하세요. 쿠폰으로 이동 쿠폰 선택 - 쿠폰 생성 실패 + 쿠폰 제거 쿠폰 생성됨 생성 쿠폰 생성 + 쿠폰 생성 실패 %1$s 생성 쿠폰 편집 선택한 상품에 대한 고정된 할인 합계 설정 + 쿠폰 생성 + 쿠폰 추가 + 테스트 주문 시작 + 우커머스 앱에서 결제를 완료하고 주문에 관한 푸시 알림을 기다립니다. + 해당 웹 스토어에서 실제 고객처럼 테스트 상품을 선택하고, 장바구니에 추가하고, 계산을 완료합니다. + 아래 버튼을 누르면 웹 브라우저를 통해 온라인 스토어로 리디렉팅됩니다. + 테스트 주문 체험 + 테스트 주문 체험 장바구니 전체에 대한 고정된 할인 합계 설정 선택한 상품에 대한 할인 백분율 설정 고정된 상품 할인 @@ -942,15 +963,7 @@ Language: ko_KR 쿠폰 유형 - 고정된 상품 쿠폰 유형 - 고정된 장바구니 쿠폰 유형 - 할인 백분율 - 쿠폰 생성 - 쿠폰 추가 - 테스트 주문 시작 앱을 사용하여 테스트 주문 환불 처리 - 우커머스 앱에서 결제를 완료하고 주문에 관한 푸시 알림을 기다립니다. - 해당 웹 스토어에서 실제 고객처럼 테스트 상품을 선택하고, 장바구니에 추가하고, 계산을 완료합니다. - 아래 버튼을 누르면 웹 브라우저를 통해 온라인 스토어로 리디렉팅됩니다. - 테스트 주문 체험 - 테스트 주문 체험 테스트 주문을 실행하여 우커머스 프로세스에서 원활한 고객 경험이 제공되는지 확인 수동으로 상세 정보 추가 고객 검색 기준 @@ -962,9 +975,9 @@ Language: ko_KR 회원님의 구독 결정을 이해하도록 도와주세요. 회원님의 피드백이 중요합니다. 이메일 주소 없음 이름 없음 - 기존 고객 검색 또는 최근 업데이트 %s(30분마다 업데이트) 최근 업데이트 %s + 기존 고객 검색 또는 Android에서 Tap To Pay로 결제 수락 <a href=\'\'>더 알아보기</a> 결제 수령 지정된 가격이 없는 상품은 추가할 수 없습니다. @@ -1031,12 +1044,12 @@ Language: ko_KR 공유 메시지를 생성할 수 없습니다. 다시 시도하세요. AI 기능 살펴보기 선택적 메시지 추가 - 쓰기… AI로 쓰기 Blaze로 제품 홍보 Blaze AI 콘텐츠 생성기를 사용할 수 있습니다. Blaze로 홍보 + 쓰기… 상품 공유 축하합니다! 새 스토어 준비 완료까지 한 걸음 가까워지셨습니다. 첫 번째 상품 생성됨 🎉 @@ -1063,7 +1076,6 @@ Language: ko_KR 개인정보 이 데이터 공유를 제어하기 위해 당사에서 수집하는 회원님의 스토어와 옵션에 대한 데이터에 대해 자세히 알아보세요. 사용량 추적 - Woocommerce.com 사용자는 추가 개인정보 옵션을 사용할 수 있습니다. 여기에서 자세히 알아보세요. 웹 옵션 추가 개인정보 옵션 프라이버시 설정 업데이트 중 오류가 발생했습니다. @@ -1076,6 +1088,7 @@ Language: ko_KR 가변 상품을 직접 추가할 수 없습니다. 특정 변형을 선택하세요. 스캔하지 못했습니다. 나중에 다시 시도하세요. SKU가 %s인 상품을 찾을 수 없습니다. 주문에 추가할 수 없음 + Woocommerce.com 사용자는 추가 개인정보 옵션을 사용할 수 있습니다. 여기에서 자세히 알아보세요. 스캔하지 못했습니다. 나중에 다시 시도하세요. 바코드 스캔 EU(유럽연합) 세관 규칙을 따르는 국가로 배송 시 모든 아이템을 명확하게 설명해야 합니다. 예를 들어, 의류를 발송하는 경우 설명이 수락될 수 있으려면 의류 유형을 표시해야 합니다(예: 남성용 셔츠, 여아용 조끼, 남아용 재킷). 그렇지 않으면 배송이 세관에서 지체되거나 차단될 수 있습니다. @@ -1099,9 +1112,9 @@ Language: ko_KR 스캐너를 통해 상품 추가 해제 더 알아보기 - EU(유럽연합) 세관 규칙을 따르는 국가로 배송할 때는 아이템마다 명확하고 구체적인 설명을 제공해야 합니다. 그렇지 않으면 배송이 세관에서 지체되거나 차단될 수 있습니다. 최신 상태로 유지하여 스토어 보안을 강화하세요. 지금 젯팩을 살펴보세요. 주문 알림 등 받기 + EU(유럽연합) 세관 규칙을 따르는 국가로 배송할 때는 아이템마다 명확하고 구체적인 설명을 제공해야 합니다. 그렇지 않으면 배송이 세관에서 지체되거나 차단될 수 있습니다. 스토어 설정 목록 표시 또는 숨기기 스토어 설정 목록 필요하면 메뉴 > 설정 > 스토어에서 복원할 수 있습니다. @@ -1195,14 +1208,14 @@ Language: ko_KR 구독 체크카드와 신용카드를 카드 리더에 올려놓거나 밀어 넣거나 살짝 밀어서 결제할 수 있습니다. 스마트폰에서 직접 비접촉 결제를 안전하게 수락하세요. - 스마트폰을 사용하여 카드 결제 수락\n결제 지금 사용해 보세요. - 피드백 공유 애플리케이션 비밀번호 생성이 승인되지 않아서 로그인할 수 없습니다. 사이트를 가져오는 중… + 스마트폰을 사용하여 카드 결제 수락\n결제 지금 사용해 보세요. + 피드백 공유 + 로드 중입니다… 웹사이트를 가져오는 동안 오류 발생 WP 관리자 페이지에서 다시 시도 로그인 - 로드 중입니다… %s 종료됨 구독이 종료되었으며, 모든 기능에 대한 접근 권한이 제한되었습니다. %1$d일 @@ -1217,13 +1230,11 @@ Language: ko_KR 요금제 상세 정보를 가져오는 중 오류 발생 %1$s 구독자이십니다. %2$s까지 모든 기능에 접근하실 수 있습니다. 무료 평가판이 종료되었으며 모든 기능에 대한 접근이 제한되었습니다. 지금 %1$s을(를) 구독하세요. - 무료 평가판을 %1$d일째 사용 중입니다. %2$s에 무료 평가판이 종료됩니다. 업그레이드하여 새로운 기능을 잠금 해제하고 스토어를 계속 실행하세요. 구독 상태 문제 해결 현재: %s 구독 문제 신고 지금 업그레이드 - %1$s회 시도가 남았습니다. 평가판 종료됨 평가판이 종료되었습니다. 죄송합니다. 예기치 않은 오류가 발생했습니다. @@ -1239,6 +1250,8 @@ Language: ko_KR 내 스토어 공개 스토어를 시작하려면 요금제로 업그레이드하셔야 합니다. <u>업그레이드</u> 도메인 검색 + 무료 평가판을 %1$d일째 사용 중입니다. %2$s에 무료 평가판이 종료됩니다. 업그레이드하여 새로운 기능을 잠금 해제하고 스토어를 계속 실행하세요. + %1$s회 시도가 남았습니다. 로그인 실패(상태 코드 %1$s) 스토어의 관리 URL이 식별되지 않아서 로그인할 수 없습니다. 스토어의 로그인 URL이 식별되지 않아서 로그인할 수 없습니다. @@ -1259,7 +1272,6 @@ Language: ko_KR 요청 발송 중 기타 확장 기능/플러그인 우커머스 플러그인 - 우커머스 결제 카드 리더/직접 결제 모바일 앱 작성하기 @@ -1278,6 +1290,7 @@ Language: ko_KR 고객에게 쉽고 편리한 결제 방법을 제공하세요! 결제받기 정보가 있으면 배송, 세금 및 결제 설정을 일찍 시작할 수 있습니다. + 우커머스 결제 스토어에 대해 자세히 알려주세요. 방금 계정의 이메일 주소로 매직 링크를 보내드렸습니다. 계속하려면 로그인하세요. @@ -1286,31 +1299,31 @@ Language: ko_KR 젯팩 상태를 가져오는 중 문제가 발생했습니다. 나중에 다시 시도하세요. 결제 체험 - 휴대폰으로\n카드 결제 받기 + 도메인 네임 등록 중… + 국가 선택 + 주 선택 Tap To Pay 작업 도메인 등록 중 오류 발생 - 주 선택 - 국가 선택 - 도메인 네임 등록 중… - 도메인 등록 - 우편번호 - 상태(사용할 수 없음) - - 도시 - 주소 2 - 주소 - 국가 - 국가 코드 + 휴대폰으로\n카드 결제 받기 전화 - 조직(선택사항) + 국가 코드 + 국가 + 주소 + 주소 2 + 도시 + + 상태(사용할 수 없음) + 우편번호 + 도메인 등록 편의를 위해 워드프레스닷컴을 미리 채웠습니다.\n 연락처 정보 이 도메인에 사용하려는 정보가 정확한지 검토하여 확인하세요. - 도메인 연락처 정보 - 공개적으로 등록 - 개인정보 보호를 통해 비공개로 등록 - 유효한 %s(을)를 입력하세요. - 이 도메인을 등록하면 %1$s이용 약관%2$s에 동의하는 것입니다. + 조직(선택사항) 도메인 소유자는 모든 도메인의 공개 데이터베이스에 있는 연락처 정보를 공유해야 합니다.\n 개인정보 보호에 따라 회원님의 정보가 아닌 당사의 정보를 공개하며, 회원님이 받을 커뮤니케이션은 비공개적으로 전달합니다. + 이 도메인을 등록하면 %1$s이용 약관%2$s에 동의하는 것입니다. + 유효한 %s(을)를 입력하세요. + 개인정보 보호를 통해 비공개로 등록 + 공개적으로 등록 + 도메인 연락처 정보 개인정보 보호 스토어 관리자만 도메인 설정에 접근할 수 있음 또는 계속 매직 링크 사용 @@ -1369,19 +1382,19 @@ Language: ko_KR 오래 걸리지 않음 기본 제공 리더 준비 중… 기본 제공 리더 준비됨 - 카드 리더 눌러서 결제 전환율 세션 이 기간 세션 없음 다음 대비 도메인 + 카드 리더 애플리케이션 비밀번호가 무엇인가요? %1$s 사이트에서 애플리케이션 비밀번호가 비활성화된 것 같습니다.\n 우커머스 앱을 사용하려면 활성화하세요. 설치 페이지 열기 - 답변을 발송하는 도중에 오류가 발생했습니다 - 답변 발송! 답변 + 답변 발송! + 답변을 발송하는 도중에 오류가 발생했습니다 모두 선택 가격 업데이트 상태 업데이트 @@ -1392,17 +1405,17 @@ Language: ko_KR 모든 변형이 이미 생성되었습니다. 생성할 변형 없음 다수 선택 - 이 검색에 대해 제공되는 도메인 없음 변형 생성 중 각각의 새 변형과 변형 속성의 가능한 모든 조합이 생성됩니다(%1$d개 변형). 모든 변형 생성 여부 현재 최대 %1$d개 변형의 생성이 지원됩니다. 이 상품의 변형을 생성하면 %2$d개 변형이 생성됩니다. 생성 한도 초과됨 속성의 모든 조합에 대한 변형을 생성합니다. - 모든 변형 생성 새 변형 하나를 생성합니다. 변형 가능한 상품에 속하는 속성을 수동으로 설정합니다. 새 변형 추가 변형 추가 + 모든 변형 생성 + 이 검색에 대해 제공되는 도메인 없음 연결하지 않고 종료 연결 계속 스토어에 접근하려면 다시 연결해 보세요. @@ -1414,7 +1427,6 @@ Language: ko_KR 다시 활성화 시도 다시 설치 시도 지원받기 - 다시 시도하고 이 오류가 계속 발생하면 지원팀에 문의하세요. 사이트와 통신 중 오류가 발생했습니다. 이 스토어의 플러그인을 관리할 권한이 없습니다. 젯팩에 연결하는 권한 부여 중 오류 발생 @@ -1438,6 +1450,7 @@ Language: ko_KR 젯팩 설치하기 젯팩을 연결하려면 스토어 자격 증명으로 <b>%1$s</b>에 로그인하세요. 젯팩을 설치하려면 스토어 자격 증명으로 <b>%1$s</b>에 로그인하세요. + 다시 시도하고 이 오류가 계속 발생하면 지원팀에 문의하세요. 스토어 자격 증명을 준비하세요. 이 앱에서 스토어에 접근하려면 해당 스토어를 젯팩에 연결하세요. 이 앱에서 스토어에 접근하려면 무료 젯팩 플러그인을 설치하세요. @@ -1450,8 +1463,8 @@ Language: ko_KR 시뮬레이션한 카드 리더 업데이트 젯팩 연결 스토어 연결 - 사람들이 인터넷에서 회원님을 찾을 수 있는 곳입니다. 걱정하지 마세요. 나중에 변경할 수 있습니다. 방문자 수 + 사람들이 인터넷에서 회원님을 찾을 수 있는 곳입니다. 걱정하지 마세요. 나중에 변경할 수 있습니다. 또는 비밀번호로 로그인 시뮬레이션한 카드 리더가 비활성화되었습니다. 시뮬레이션한 리더 키 @@ -1488,12 +1501,12 @@ Language: ko_KR 다른 주소 시도 사용자 정의 날짜 범위 사용자 정의 - 워드프레스닷컴이란 무엇인가요? 새 계정 만들기 비밀번호 선택 사용 중인 이메일 주소 시작하기 \n분 단위 젯팩 연결 버튼을 누르면 <a href=\'terms\'>서비스 약관</a> 및 워드프레스닷컴과 <a href=\'sync\'>상세 정보</a> 공유에 동의하는 것입니다. + 워드프레스닷컴이란 무엇인가요? 시뮬레이션한 카드 리더 활성화 상점 관리자 또는 앱을 사용하는 관리자로 사이트에 초대받으려면 사이트 소유자에게 문의하세요. 워드프레스닷컴 사이트에 연결하기 @@ -1533,44 +1546,43 @@ Language: ko_KR 우커머스 신규 이용 실패가 발생했습니다. 지원을 문의하세요. 사이트 주소 입력 - 이메일로 로그인 링크 받기 비밀번호가 기억나지 않나요? + 이메일로 로그인 링크 받기 아직 대면 결제 설정을 완료하지 않으신 것 같습니다. <a href=\'\'>설정 계속</a> - 결제 - 알겠어요! - 이제 빠르고 쉽게 대면 결제와 기타 기능에 접근하실 수 있습니다. + WC 관리자 + 스토어 주소로 로그인 + 기타 사이트 메뉴 탭의 결제 + 이제 빠르고 쉽게 대면 결제와 기타 기능에 접근하실 수 있습니다. + 알겠어요! + 결제 해당 이메일은 워드프레스닷컴 계정에서 사용되지 않습니다. - 기타 사이트 - 스토어 주소로 로그인 - WC 관리자 - 방금 다음으로 매직 링크를 보내드렸습니다. - 이 기기에서 이메일을 확인하세요! - 로그인 비밀번호 사용 - 매직 링크로 로그인 - 방금 이메일 주소로 매직 링크를 보내드렸습니다. 이메일에 있는 링크를 눌러 로그인하세요. 사이트 자격 증명으로 로그인 - 상향 판매와 교차 판매를 추가하여 고객에게 도움이 되는 관련 상품 추천 제공 - 링크가 설정된 상품으로 판매 증진 + 방금 이메일 주소로 매직 링크를 보내드렸습니다. 이메일에 있는 링크를 눌러 로그인하세요. + 매직 링크로 로그인 + 로그인 비밀번호 사용 + 이 기기에서 이메일을 확인하세요! + 방금 다음으로 매직 링크를 보내드렸습니다. + 지금 설정 + + 무슨 일로 우커머스에 오셨나요? + 그냥 둘러보기 + 스토어 설정 시도하기 + 내 분석 확인 + 내 상품 생성 또는 업데이트 + 내 주문 관리 + 여러 스토어 간 전환 + %1$s은(는) 우커머스 사이트가 아닌 것 같습니다. + 우커머스 설치 + 표시\n완료됨 카드 리더로 20분 안에 대면 판매를 시작하세요. - 주문 #%1$d 업데이트 중 오류 발생 + 링크가 설정된 상품으로 판매 증진 주문 #%1$d이(가) 완료됨으로 표시됨 - 표시\n완료됨 - 우커머스 설치 - %1$s은(는) 우커머스 사이트가 아닌 것 같습니다. - 여러 스토어 간 전환 - 내 주문 관리 - 내 상품 생성 또는 업데이트 - 내 분석 확인 - 스토어 설정 시도하기 - 그냥 둘러보기 - 무슨 일로 우커머스에 오셨나요? - - 지금 설정 + 주문 #%1$d 업데이트 중 오류 발생 + 상향 판매와 교차 판매를 추가하여 고객에게 도움이 되는 관련 상품 추천 제공 시작해 보세요! 워드프레스닷컴으로 로그인 지원 문의 - 워드프레스닷컴 계정으로 로그인 조금 도움을 받으세요! 로그인에 문제가 있나요? SKU @@ -1587,11 +1599,12 @@ Language: ko_KR 사용자 정의 필드 변경 사항을 저장할 수 없음 그러면 우커머스 외부에서 결제받은 경우 결제됨으로 표시됩니다. - 젯팩 설치 손쉽게 처리하실 수 있습니다. 빠르고 쉽게 관리할 수 있습니다. 비즈니스에 꼭 필요합니다. 우커머스 신규 이용 + 젯팩 설치 + 워드프레스닷컴 계정으로 로그인 우커머스 스토어의 새 주문 $50 새 주문이 있습니다! 🎉 상세 정보 @@ -1600,10 +1613,10 @@ Language: ko_KR 시스템 상태 보고서 공유 클립보드에 시스템 상태 보고서 복사 계속 검색 - %2$s blog_id %3$s에 대한 주문 #%1$s 직접 결제. 결제 제공업체 변경 환불됨: %1$s 결제 대기 중 + %2$s blog_id %3$s에 대한 주문 #%1$s 직접 결제. 설치 진행 설치하기 전에 알아야 할 사항 확장 기능 설치 @@ -1618,15 +1631,15 @@ Language: ko_KR 주문을 받았을 때 확인이 허용되는 청구 이메일 목록입니다. 쉼표로 이메일 주소를 구분합니다. 이메일 일부와 일치하도록 별표(*)를 사용할 수도 있습니다. 예를 들어 \"*@gmail.com\"은 모든 gmail 주소와 일치합니다. 죄송합니다. 선택한 필터와 일치하는 상품이 없습니다.\" 결제 수단 확인 - Stripe 우커머스 결제 FAQ 이러한 결제 제공업체 중 하나를 통해 대면 결제를 처리할 수 있습니다. 어떤 제공업체를 사용하시겠나요? 결제 제공업체 선택 잠김 상품 또는 결제 상세 정보를 변경하려면 상태를 결제 대기 중으로 변경하세요. 이 주문 중 일부는 현재 편집할 수 없습니다. - 고객 검색 고객 없음 + 고객 검색 + Stripe 나중에 스토어에 확장 기능 추가 우커머스 배송이 무엇인가요? @@ -1661,8 +1674,6 @@ Language: ko_KR 현재 가격이 뒤섞였습니다. 현재 가격은 %s입니다. %d개 변형 가격이 업데이트됩니다. - 혼합 - 없음 할인 가격 정상 가격 가격 @@ -1670,6 +1681,8 @@ Language: ko_KR 대량 업데이트 확인 대량 업데이트… + 혼합 + 없음 변형을 가져오는 중… 상품 카테고리 검색 실패 상품 카테고리 로드 실패 @@ -1684,11 +1697,10 @@ Language: ko_KR 우커머스 배송 가져오기 우커머스 배송을 통해 스마트폰의 레이블을 인쇄하세요. 배송 레이블이 필요하신가요? - %1$d에서 %2$d(으)로 상품 수량 변경 정상 가격 업데이트 할인 가격 업데이트 + %1$d에서 %2$d(으)로 상품 수량 변경 %1$s에서 WooCommerce Stripe 확장 기능은 지원되지 않습니다. - 필터 선택 지우기 %d개의 제품 선택 %d개의 상품 선택 @@ -1700,6 +1712,7 @@ Language: ko_KR 쿠폰을 세일 아이템에 적용하지 않으려면 이 기능을 사용하세요. 아이템별 쿠폰은 세일 중이 아닌 아이템에만 사용할 수 있습니다. 장바구니별 쿠폰은 장바구니에서 세일 중이 아닌 아이템에만 사용할 수 있습니다. 세일 아이템 제외 쿠폰을 다른 쿠폰과 함께 사용할 수 있는 경우 이 기능을 사용하세요. + 필터 개별 사용만 사용자별 사용 한도 X개의 아이템으로 사용 제한 @@ -1774,16 +1787,15 @@ Language: ko_KR 다른 환불 수단을 사용해 보세요. 알 수 없는 사유로 환불이 거부되었습니다. 죄송합니다. 이 환불은 처리할 수 없습니다. + 복사 환불 성공 환불 처리하기 결제 환불 환불 실패 결제 환불 준비하기 - 복사 쿠폰 검색 쿠폰 코드 공유 메시지를 생성할 수 없음 쿠폰 코드 공유 오류. - 프로모션 코드가 %2$s인 엄선된 상품에 %1$s 할인 적용 프로모션 코드가 %2$s인 모든 상품에 %1$s 할인 적용 클립보드로 쿠폰 코드 복사 중 오류. 클립보드로 쿠폰 코드 복사됨. @@ -1798,24 +1810,16 @@ Language: ko_KR 쿠폰 퍼포먼스 로드 실패 쿠폰 공유 쿠폰 코드 복사 + 프로모션 코드가 %2$s인 엄선된 상품에 %1$s 할인 적용 피드백을 보내주셔서 감사합니다! 카드 리더 결제에 정확한 위치 권한 필요 위치 접근 권한 필요 계산 - %s 결제 링크 공유 금액 - 금액 - 할인한 주문 - 퍼포먼스 - %s의 최대 지출 - %s의 최소 지출 - 쿠폰 요약 쿠폰 요약 보기 - 기기에서 쿠폰을 보고 편집할 수 있도록 작업하고 있습니다. 쿠폰 보기 및 편집 쿠폰 없음 - %1$s(%2$s 제외) - %1$s 및 %2$s 모든 것 만료됨 활성 @@ -1833,6 +1837,15 @@ Language: ko_KR \u2022 승인한 리뷰 1개 \u2022 %d개 승인한 리뷰 %1$s(%2$s%%) + 금액 + 할인한 주문 + 퍼포먼스 + %s의 최대 지출 + %s의 최소 지출 + 쿠폰 요약 + 기기에서 쿠폰을 보고 편집할 수 있도록 작업하고 있습니다. + %1$s(%2$s 제외) + %1$s 및 %2$s 기기에서 주문을 생성할 수 있도록 작업하고 있습니다! \"+\" 버튼을 눌러 이 기능을 체험하실 수 있습니다. 곧 다시 오셔서 더 많은 스토어 성장 팁과 인사이트를 확인하세요. 수고하셨습니다. 다 읽으셨습니다! @@ -1847,20 +1860,20 @@ Language: ko_KR XML-RPC 서비스가 이 사이트에서 비활성화되었습니다. Automattic 외 이메일을 사용하여 지원 티켓을 제출해 주세요. %1$s에 등록된 Stripe 계정은 지원되지 않습니다. - %1$s에서 WooCommerce Payments 확장 기능은 지원되지 않습니다. 리더의 전원 버튼을 누르세요. 영수증이 <strong>%s</strong>(으)로 발송되었습니다. 퍼센트(%) + %1$s에서 WooCommerce Payments 확장 기능은 지원되지 않습니다. 주문에서 수수료 제거 주문에서 배송 제거 배송 배송 추가 배송 추가 이름 - 금액 수수료 고객 상세 정보 수수료 추가 + 금액 고객 메모 편집 고객 상세 정보 편집 주문 상태 편집 @@ -1876,13 +1889,13 @@ Language: ko_KR 메뉴 업데이트 후 새로 고침 플러그인 관리 - WooCommerce 결제 WooCommerce Stripe 게이트웨이 활성화된 다음 플러그인 중 하나만 직접 결제와 연동합니다. 계속하려면 사이트 관리자에게 문의하여 다음과 같은 플러그인 중 하나를 비활성화하세요. 활성화된 다음 플러그인 중 하나만 직접 결제와 연동합니다. 계속하려면 다음과 같은 플러그인 중 하나를 비활성화하세요. 충돌하는 결제 플러그인 감지됨 - 세금 합계 또는 + WooCommerce 결제 + 세금 합계 젯팩 설치 현재 직접 결제 사용 불가능 주문 생성됨 @@ -1953,9 +1966,7 @@ Language: ko_KR 다른 배송 주소 추가 재고 있음 %s 재고 있음 - 상품 추가 상품 - 고객 상세 정보 추가 고객 결제됨으로 표시 그러면 주문이 생성되며 WooCommerce 외부에서 결제를 받은 경우 결제됨으로 표시됩니다. @@ -1963,6 +1974,8 @@ Language: ko_KR 결제 수단 선택 스토어 주소를 기준으로 세금이 자동으로 계산됩니다. 세금(%s%%) + 고객 상세 정보 추가 + 상품 추가 결제하기(%s) 세금 청구 사용자 정의 금액 @@ -2026,8 +2039,8 @@ Language: ko_KR 금액 입력 결제하기 간편한 결제 - 기기에서 주문을 생성하세요! 분석 + 기기에서 주문을 생성하세요! 모두 완료 스토어 연결 중 활성화 중 @@ -2111,8 +2124,8 @@ Language: ko_KR 시스템 상태 보고서 축하합니다! 이제 우커머스 결제를 통해 직불카드 또는 신용카드 결제를 수락할 수 있습니다. 카드 리더로 결제받기 - 금액이 %1$s 이상이어야 합니다. 확인 + 금액이 %1$s 이상이어야 합니다. 새 기능 아이콘 이미지 스토어 전환 상품 %1$s 업데이트 실패 @@ -2153,10 +2166,10 @@ Language: ko_KR 배송 주소(%s)를 자동으로 확인할 수 없었습니다. 발송 주소를 자동으로 확인할 수 없었습니다. Google Maps에서 보며 주소가 올바른지 확인하세요. 기기에 상품 애드온을 더 쉽게 표시할 수 있도록 작업하는 중입니다. 지금 당장은 주문에 대한 애드온을 보실 수 있습니다. 웹 대시보드에서 이러한 애드온을 생성하고 편집하실 수 있습니다. + 저장 기기에서 애드온을 보세요! 웹 대시보드에서 애드온의 이름을 변경하는 경우 이전 주문에서는 앱 내에 해당 주문이 더는 표시되지 않습니다. 애드온 보기 - 저장 상세 정보 업로드(%d) %d개 파일을 업로드할 수 없음 %d개 파일을 업로드할 수 없음 @@ -2188,10 +2201,10 @@ Language: ko_KR 테스트 모드에서는 대면 결제 사용 불가능 계속하려면 끄기로 전환하세요. 현재 대면 결제 사용 불가능 계정에 대기 중인 요구 사항이 있습니다. 대면 결제 수락을 유지하려면 %1$s을(를) 통해 해당 요구 사항을 완료하세요. - 계정에 대기 중인 요구 사항이 있습니다. 계정에 기한이 지난 요구 사항이 하나 이상 있습니다. 대면 결제를 다시 시작하려면 해당 요구 사항을 처리하세요. 현재 대면 결제 사용 불가능 계정 검토를 완료하는 즉시 대면 결제를 수락할 수 있습니다. + 계정에 대기 중인 요구 사항이 있습니다. 현재 대면 결제 사용 불가능 죄송합니다. 이 스토어에서는 대면 결제가 지원되지 않습니다. 업데이트 후 새로 고침 @@ -2208,7 +2221,6 @@ Language: ko_KR 모바일 장치로 결제 수락 및 카드 리더 주문에 대해 <a href=\'\'>더 알아보기</a> 도움이 필요하세요? <a href=\'\'>지원 문의</a> 스토어에서 \"배송 시 현금 결제\"를 결제 수단으로 활성화하면 대면 현금 결제를 계속 수락할 수 있습니다. - %1$s에서는 카드 대면 결제가 지원되지 않습니다. 계정에 연결 중 대면 결제 패키지 규격과 무게를 다시 확인하거나 패키지 상세 정보의 다른 패키지를 사용해 보세요. @@ -2216,6 +2228,7 @@ Language: ko_KR 사용 가능한 모든 패키지가 활성화되었음 패키지 활성화 중 활성화할 패키지를 선택하세요. + %1$s에서는 카드 대면 결제가 지원되지 않습니다. 필수 필드 닫기 변형 생성됨 @@ -2224,11 +2237,11 @@ Language: ko_KR 변형 생성 이제 속성을 추가했으니 첫 번째 변형을 만드실 수 있습니다! 속성 생성됨 - %1$s%% 완료 진행 중인 소프트웨어 업데이트는 취소하지 않는 것이 좋습니다. 죄송합니다. 이 결제는 처리할 수 없습니다. 서버에 연결되지 않음 인터넷에 연결되지 않음 + %1$s%% 완료 원래 포장으로 배송 새 패키지에 추가 이 아이템은 현재 %s에 있습니다. 해당 아이템을 어디로 이동하시겠어요? @@ -2239,7 +2252,6 @@ Language: ko_KR 패키지를 생성하지 못했습니다. 다시 시도하세요. 패키지 생성 실패: 알 수 없는 API 문제가 발생했습니다. 패키지 생성 실패: %1$s - 기다려 주세요… 새 패키지 생성하기 값이 유효하지 않습니다. 필수 필드입니다. @@ -2253,10 +2265,11 @@ Language: ko_KR 상자 패키지 유형 선택 패키지 유형 - 상품 배송에 사용할 패키지를 설정하세요. 향후 주문을 위해 저장됩니다. 새 패키지 추가 새 패키지 생성 패키지 규격은 0보다 커야 합니다. 계속하려면 상품 페이지의 배송 섹션에서 아이템의 규격을 업데이트하세요. + 기다려 주세요… + 상품 배송에 사용할 패키지를 설정하세요. 향후 주문을 위해 저장됩니다. 원래 포장 아이템 규격 개별적으로 배송한 아이템 @@ -2269,11 +2282,11 @@ Language: ko_KR 소프트웨어 버전 업데이트를 확인하지 못했음 모바일 결제 수락 및 카드 리더 주문에 대해 <a href=\'\'>더 알아보기</a> 블루투스 켜기 - 연결된 리더 없음 리더를 연결할 수 없음 연결 리더를 몇 개 찾음 주문이 이미 결제되었음 + 연결된 리더 없음 구매해 주셔서 감사합니다! 결제 영수증이 필요하면 아래 링크를 클릭하세요.\n\n%s 세관 양식 다운로드 중 오류 발생 세관 송장 인쇄 @@ -2289,12 +2302,11 @@ Language: ko_KR 상품 추가 변형 속성 모바일 장치 블루투스 켜기 - 주문을 가져오는 중 오류가 발생했습니다. 앱의 주문 상태가 기한이 지났을 수 있습니다. %s에서 받은 영수증 주문 새로 고치기 앱 상태 업데이트하기 고객이 %1$s을(를) 선택함 - 세관 양식에 10자리 전화번호 필요 + 주문을 가져오는 중 오류가 발생했습니다. 앱의 주문 상태가 기한이 지났을 수 있습니다. 세관 양식 완료됨 기기에서 인쇄하는 중 문제가 발생하면 프린터에 대한 고객 지원을 문의하세요. 인쇄를 이용할 수 없는 경우에는 언제든지 영수증을 PDF로 저장하고 이메일로 보내 다른 기기에서 인쇄할 수 있습니다. @@ -2307,6 +2319,7 @@ Language: ko_KR 변형을 만들려면 속성(즉, \"색상\", \"사이즈\")을 먼저 설정해야 합니다. 변형 1개 변형 %1$s개 + 세관 양식에 10자리 전화번호 필요 USPS 추적 리더의 소프트웨어 업데이트하기 소프트웨어 업데이트 @@ -2366,9 +2379,9 @@ Language: ko_KR 역할 및 권한에 대해 더 알아보기 이 앱에서는 관리자와 상점 관리자만 사용자 역할로 지원됩니다. 역할을 업그레이드하려면 스토어 소유자에게 문의하세요. 어디서나 새 제품 편집 및 추가 + 건너뛰기 항상 주문 관리 및 편집 판매 및 고성과 상품 추적 - 건너뛰기 외부 제품 묶음 제품 변형 제품 @@ -2377,9 +2390,6 @@ Language: ko_KR 단순한 실물 제품 설정 열기 설정 열기 - 블루투스가 비활성화되었음 - 위치가 비활성화되었음 - 필수 정밀 위치 권한 없음 리더에 연결할 수 없습니다. 리더에 연결 중 리더에 연결 @@ -2387,9 +2397,10 @@ Language: ko_KR 리더 스캔 중 아이템 수 새 배송 레이블 만들기 - 단순한 가상 제품 + 블루투스가 비활성화되었음 + 위치가 비활성화되었음 + 필수 정밀 위치 권한 없음 이 변경을 삭제하시겠어요? - 변형 생성하기 제품 삭제 중 영수증 발송 영수증 인쇄 @@ -2403,6 +2414,8 @@ Language: ko_KR 배송 레이블을 미리 볼 수 없습니다. PDF 뷰어 앱을 설치하고 다시 시도하세요. 입력하신 주소의 WordPress 사이트를 찾지 못했습니다. WordPress를 설치했고 사용 가능한 최신 버전을 실행 중인지 확인하세요. 여러 배송 라인 + 단순한 가상 제품 + 변형 생성하기 주문을 완료로 표시할 수 없음 레이블 구매 중 오류 발생 기다려주세요… @@ -2431,18 +2444,17 @@ Language: ko_KR 사이트 소유자만 배송 레이블 결제 수단을 관리할 수 있습니다. 결제 수단을 관리하려면 스토어 소유자 %1$s(%2$s)에게 문의하세요. 변형 추가 변형 추가 - 첫 번째 변형 생성 %s 합계 %s개 요금 선택됨 무료 서명 요건에 적합 무료 수령에 적합 - 보험(%s) - 추적 포함 %s 성인 서명 필수(%s) 서명 필수(%s) + 보험(%s) + 추적 배송에 대해 고객이 결제한 %1$s/%2$s - WooCommerce를 통해 배송 레이블을 구매하면 우체국 요금보다 5~40% 할인됩니다. + 첫 번째 변형 생성 WooCommerce 서비스 할인이란? 배송 옵션을 로드하는 중 오류가 발생했습니다. 배송업체 및 요금 @@ -2460,6 +2472,7 @@ Language: ko_KR 각 옵션 이름을 추가하고 Enter 키를 누릅니다. 또는 기존 옵션을 눌러서 선택합니다. 옵션 이름 + WooCommerce를 통해 배송 레이블을 구매하면 우체국 요금보다 5~40% 할인됩니다. 설정 저장 중 오류 발생 기다려주세요… 설정 저장 중 @@ -2482,18 +2495,15 @@ Language: ko_KR 속성 추가하기 속성 속성 편집 - 총 패키지 무게: %1$s %2$s %2$d 패키지의 %1$d개 아이템 총 패키지 무게: %1$s %2$s 사용자 정의 패키지 제품을 가져올 수 없음 - 특정 필수 필드가 비어 있습니다. 유효하지 않은 무게 선택한 패키지 기다려주세요… 패키지 로드 중! 패키지 %1$d - %d개 아이템 패키지 정의를 로드할 수 없음 패키지 무게 포함 총 패키지 무게(%1$s) @@ -2506,16 +2516,17 @@ Language: ko_KR 입력된 주소를 약간 수정했습니다. 제안된 주소가 올바르면 정확한 배송 확인에 사용하세요. 선택한 주소 편집 선택한 주소 사용 + 특정 필수 필드가 비어 있습니다. + 총 패키지 무게: %1$s %2$s + %d개 아이템 주소 데이터 로드 중 새 기능을 사용할 수 있습니다! - 지도에서 찾기 고객에게 문의 유효하지 않은 도로명 번지 누락 주소를 찾을 수 없음 배송 주소를 자동으로 확인할 수 없었습니다. Google Maps에서 조회하거나 고객에게 문의하여 주소가 올바른지 확인하세요. 주소 유효성 검사 실패 - 기다려주세요… 주소 유효성 검사 진행 중 주소 데이터를 로드할 수 없음 입력된 주소 사용 @@ -2526,6 +2537,8 @@ Language: ko_KR 전화 회사 이름 + 기다려주세요… + 지도에서 찾기 Google Maps 앱을 찾았음 기다려주세요… 죄송합니다. 제품 변형의 이미지 제거는 WooCommerce 4.7 이상에서 지원됩니다. @@ -2541,31 +2554,30 @@ Language: ko_KR 포장 상세 정보 배송 레이블 만들기 추가 정보 - 집에서 모바일 장치로 배송 레이블을 할인된 요금으로 인쇄하여 우체국에 가는 시간을 줄이세요! WooCommerce 배송으로 처리하여 시간과 비용 절약 WooCommerce 배송 주문을 완료로 표시 - 모바일 장치로 레이블 만들기에 대해 자세히 알아보기 배송 레이블 만들기 - 이제 무료 WooCommerce 배송 플러그인으로 장치에서 직접 모든 실물 주문에 대한 배송 레이블을 만들 수 있습니다. \"배송 레이블 만들기\"를 눌러 베타 기능을 사용해 보세요! 장치에서 배송 레이블을 만드세요! + 이제 무료 WooCommerce 배송 플러그인으로 장치에서 직접 모든 실물 주문에 대한 배송 레이블을 만들 수 있습니다. \"배송 레이블 만들기\"를 눌러 베타 기능을 사용해 보세요! + 집에서 모바일 장치로 배송 레이블을 할인된 요금으로 인쇄하여 우체국에 가는 시간을 줄이세요! + 모바일 장치로 레이블 만들기에 대해 자세히 알아보기 + 편집 수수료 순 결제 유료 Jetpack 연결에 대해 자세히 알아보기 - 편집 확인 끌어 놓아서 사진 순서 변경 + 제거 설정 다운로드 유효한 이름을 입력하세요 파일 URL 입력 - 워드프레스 미디어 라이브러리 입력한 URL이 올바른지 확인 기다려주세요… 파일 업로드 중 파일 업로드 중 오류 발생 다운로드 가능한 파일 추가 - 다음 중에서 다운로드 가능한 파일 추가 구매 항목이 포함된 다운로드 가능한 파일 포함 취소 예. 변경합니다. @@ -2574,7 +2586,6 @@ Language: ko_KR 파일 이 파일을 제거하시겠습니까? 다운로드 가능한 제품 - 제거 다운로드 만료 다운로드 한도 다운로드 링크 만료까지 남은 일수를 입력하거나, 만료되지 않을 경우 비워 둡니다. @@ -2589,11 +2600,13 @@ Language: ko_KR <b>프린터 자체에서 직접 WiFi 인쇄를 구성</b>해야 할 수도 있습니다. 프린터 펌웨어가 업데이트되어 있는지 확인하고 프린터 설명서의 지침을 참조하세요. 기기의 <b>기본 인쇄 서비스</b> 선택 또는 <b>프린터의 브랜드 앱</b> 설치(권장 옵션으로 표시된 경우) 가능 프린터와 기기가 <b>같은 WiFi 네트워크</b>에 연결되었는지 확인 - 출시 준비가 완료되면 간단하고 연결되어 있으며 그룹화된 새 제품 생성을 테스트하세요. + 워드프레스 미디어 라이브러리 + 다음 중에서 다운로드 가능한 파일 추가 상향 판매 및 교차 판매로 판매 늘리기 제품 편집 상품 추가 현재 제품이 선택될 때 장바구니에서 홍보되는 제품 + 출시 준비가 완료되면 간단하고 연결되어 있으며 그룹화된 새 제품 생성을 테스트하세요. 교차 판매 현재 보는 제품 대신에 홍보되는 제품(즉, 수익성이 더 높은 제품) 상향 판매 @@ -2601,7 +2614,6 @@ Language: ko_KR %1$s%2$s x %3$s 이메일로 로그인 링크 받기 이 이메일 주소와 연결된 워드프레스닷컴 계정을 찾을 수 없습니다. - 출시 준비가 끝나면 주문 애드온 테스트해 보기 제품 만들기 기본 설정 제품을 삭제하는 중 오류 발생 @@ -2613,24 +2625,25 @@ Language: ko_KR 현재 웹에서 크기 및 색상 등의 옵션을 추가할 수 있습니다. 사이트의 제품 페이지에 옵션으로 표시됩니다. 앱에서 제품을 만들어 보세요! 제품을 찾을 수 없습니다. - 기기에서 인쇄 중 문제가 계속 발생하는 경우 <b>레이블을 PDF로 저장</b>하고 이메일로 보내 다른 기기에서 인쇄할 수 있습니다. - <b>\"배송 레이블 인쇄\"</b>를 선택한 후, 이전에 이 기기에서 인쇄한 적이 없는 경우 프린터를 선택하고 추가해야 할 수도 있습니다. 레이블 형식 옵션 - 기기로 인쇄 레이블(4 x 6in) 편지지(8.5 x 11in) 법률 문서(8.5 x 14in) 배송 레이블을 미리 보는 중 오류 발생 - 모바일 장치에서 인쇄하는 방법을 모르시나요? 레이블 레이아웃 및 용지 크기 옵션 보기 배송 레이블 인쇄 용지 크기 선택 용지 크기 - 패키지의 레이블을 이미 사용한 경우 다시 인쇄하고 사용하는 것은 서비스 약관 위반입니다. 레이블을 구매할 때 인쇄 오류가 발생한 경우 다시 인쇄할 수 있습니다. 기기에서 바로 더 쉽게 배송 레이블을 인쇄할 수 있도록 기능을 개선하고 있습니다. 지금은 WooCommerce 배송으로 스토어 관리자에서 이 주문의 배송 레이블을 만든 경우 여기 주문 상세 정보에서 레이블을 인쇄할 수 있습니다. 기기에서 배송 레이블을 인쇄하세요! + 기기로 인쇄 + 패키지의 레이블을 이미 사용한 경우 다시 인쇄하고 사용하는 것은 서비스 약관 위반입니다. + 기기에서 인쇄 중 문제가 계속 발생하는 경우 <b>레이블을 PDF로 저장</b>하고 이메일로 보내 다른 기기에서 인쇄할 수 있습니다. + <b>\"배송 레이블 인쇄\"</b>를 선택한 후, 이전에 이 기기에서 인쇄한 적이 없는 경우 프린터를 선택하고 추가해야 할 수도 있습니다. 배송 레이블 인쇄 + 출시 준비가 끝나면 주문 애드온 테스트해 보기 + 모바일 장치에서 인쇄하는 방법을 모르시나요? \u0022%1$s\u0022 제품 임시글 저장됨 오류 저장 제품 임시글 @@ -2678,12 +2691,12 @@ Language: ko_KR 다른 계정으로 로그인 연결할 스토어 선택 워드프레스닷컴으로 계속하기 - 색상이나 크기와 같은 선택사항이 있는 제품 %d 제품 선택됨 %d 제품 선택됨 그룹에 제품 추가 제품 추가 비밀번호 입력 + 색상이나 크기와 같은 선택사항이 있는 제품 스토어로 돌아가기 여기에서 문의하세요. 이것은 지원 티켓이 아니며 저희는 개별적인 피드백을 해결할 수 없습니다.\n\n도움이 필요하세요? %1$s @@ -2708,8 +2721,8 @@ Language: ko_KR 가격이 설정되지 않음 활성화 할인이 예정되어 있으면 할인 가격을 설정해야 합니다. - 이제 그룹화된 제품, 외부 제품, 선택사항이 있는 제품을 편집하고 제품 유형을 변경하고 카테고리와 태그를 업데이트할 수 있습니다. %1$s 리뷰를 남겼습니다. + 이제 그룹화된 제품, 외부 제품, 선택사항이 있는 제품을 편집하고 제품 유형을 변경하고 카테고리와 태그를 업데이트할 수 있습니다. 마음에 들어요 조금 마음에 들지 않아요 WooCommerce 앱이 마음에 드시나요? @@ -2718,24 +2731,24 @@ Language: ko_KR 태그를 추가하던 중 오류 발생 태그 추가 중 환불을 처리하는 중입니다. 기다려주세요… - 환불 요청이 제출되었음 환불 레이블(-%1$s) 환불 가능 금액 구매 날짜 - 패키지를 배송하는 데 사용되지 않은 배송 레이블은 환불을 요청할 수 있습니다. 처리하는 데 14일 이상 걸립니다. 환불 요청 배송 레이블 환불 + 패키지를 배송하는 데 사용되지 않은 배송 레이블은 환불을 요청할 수 있습니다. 처리하는 데 14일 이상 걸립니다. + 환불 요청이 제출되었음 실제 제품 요약문 태그를 사용하여 제품을 더 쉽게 찾을 수 있습니다. 제품을 관련 그룹으로 구성 + 비활성 무게 및 치수 추가 세부사항 추가 태그로 제품 정리 첫 태그 추가 태그 태그 추가 - 비활성 가상 제품 세부사항 추가 %1$s 제품 @@ -2743,9 +2756,7 @@ Language: ko_KR %s 제품 남은 제품 %1$s \u2022 %2$s - %1$s 레이블 환불 요청됨 배송 추적 - %1$s\n%2$s 배송 상세 정보 숨기기 배송 상세 정보 표시 신용카드 @@ -2755,6 +2766,8 @@ Language: ko_KR 배송지 출발지 패키지 %d + %1$s\n%2$s + %1$s 레이블 환불 요청됨 SKU: %1$s %1$s(옵션 %2$s개) 배송 레이블 @@ -2775,8 +2788,8 @@ Language: ko_KR 캘리포니아 사용자를 위한 개인정보 공지 변경 사항 유지 %1$s까지 - 제품에 더 많은 편집 기능을 추가했습니다! 이제 이미지를 업데이트하고, 미리 보기를 실행하고, 제품을 공유할 수 있습니다. 사용 가능한 새 편집 옵션 + 제품에 더 많은 편집 기능을 추가했습니다! 이제 이미지를 업데이트하고, 미리 보기를 실행하고, 제품을 공유할 수 있습니다. 제한적인 편집 가능 제품 %1$s x %2$s @@ -2870,11 +2883,11 @@ Language: ko_KR 가로 길이 환불된 제품 - %1$s(%2$s x %3$d) %2$s을(를) 통한 %1$s 환불을 발행하시겠습니까? 취소할 수 없습니다. 환불된 제품 환불 + %1$s(%2$s x %3$d) 워드프레스닷컴 가입 죄송합니다. \"%s\" 검색 결과를 찾을 수 없습니다. 내 매장의 고품질 제품 리뷰 캡처 @@ -2895,33 +2908,32 @@ Language: ko_KR 재고 추가 주문 검색 중… 텍스트 입력 - 제품 제목 입력 - 상품 저장됨 제품을 업데이트하는 중 오류 발생 기다려주세요… 제품 설명 설명 설명 수정 + 제품 제목 입력 + 상품 저장됨 + 완료 변경 사항을 삭제하시겠습니까? 업데이트 - 완료 환불이 진행 중입니다. 잠시 기다려 주세요… 배송비 환불 수량 선택 배송비 환불 제품 환불 - 각각 %1$s x %2$s %d개 항목 선택됨 아무것도 선택하지 않음 모두 선택 환불 확인을 기다리는 중… + 각각 %1$s x %2$s 빠른 업로드를 위해 이미지 크기 조정 및 압축 이미지 최적화 사진 촬영 기기에서 선택 업로드 방법 선택 업로드 - 이미지 업로드 중…%1$d/%2$d개 이미지 업로드 중… 카메라에 액세스할 수 없습니다. 이 이미지를 제거하시겠습니까? @@ -2936,6 +2948,7 @@ Language: ko_KR 이미지 추가 다음 제거 + 이미지 업로드 중…%1$d/%2$d개 사이트에 액세스할 수 없습니다. 이 문제를 해결하려면 호스트에게 연락해야 합니다. <b>SSL 인증서</b> 문제로 인해 사이트에 액세스할 수 없습니다. 이 문제를 해결하려면 호스트에게 연락해야 합니다. <b>HTTP 인증</b>이 필요하므로 사이트에 액세스할 수 없습니다. 이 문제를 해결하려면 호스트에게 연락해야 합니다. @@ -2944,8 +2957,8 @@ Language: ko_KR 사이트 자격 증명으로 로그인하세요. %1$s 사이트 자격 증명으로 로그인 인증 이메일 보내기 - 출시 준비가 완료되면 새 제품 편집 기능을 테스트하세요. 제품 편집 + 출시 준비가 완료되면 새 제품 편집 기능을 테스트하세요. 계정을 가져오는 중에 문제가 발생했습니다. 지금 다시 시도하거나 닫고 나중에 다시 시도할 수 있습니다. 오류가 발생했습니다. 계속하려면 로그인하세요. 사이트에 연결하는 중… @@ -2980,15 +2993,12 @@ Language: ko_KR 일치하는 제품이 없음 아직 제품이 없음 %s 재고 있음 - 재고 있음 \u2022 %d 버전 상품 이미지 %1$s 님이 %2$s에 대한 검토를 남김 받아들이지 않기 신제품 리뷰를 가져오는 동안 오류 발생 제품 리뷰를 가져오는 동안 오류 발생 - 환불에 문제가 발생했습니다. 다시 시도하세요. - 환불이 성공적으로 제출되었습니다. - %s에 대한 환불을 처리 중입니다. 기다려주세요… + 재고 있음 \u2022 %d 버전 인용 아이콘 수동 환불 환불 정보 @@ -3006,6 +3016,9 @@ Language: ko_KR %s 환불 %s 환불 가능 환불 발행 + 환불에 문제가 발생했습니다. 다시 시도하세요. + 환불이 성공적으로 제출되었습니다. + %s에 대한 환불을 처리 중입니다. 기다려주세요… %2$s을(를) 통한 %1$s 향상된 통계 베타 기능 @@ -3019,12 +3032,12 @@ Language: ko_KR 오늘의 통계 로그인 이미 젯팩이 있나요? %1$s - 젯팩으로 로그인 시도 중… 앱을 새로 고친 후 계속 - %1$s에서 이 앱을 사용하려면 젯팩 플러그인을 설정하고 이 계정에 연결되어 있어야 합니다. \n\n설정을 마쳤으면 앱을 새로 고침하세요. 다른 스토어 시도 데이터베이스 다운그레이드됨, 테이블 다시 생성 및 스토어 로드 중 스토어 로드 중 + 젯팩으로 로그인 시도 중… + %1$s에서 이 앱을 사용하려면 젯팩 플러그인을 설정하고 이 계정에 연결되어 있어야 합니다. \n\n설정을 마쳤으면 앱을 새로 고침하세요. 이동 통신사를 찾을 수 없음 example.com과 같은 완전한 웹사이트 주소를 입력하세요. 아직 리뷰가 없습니다! @@ -3035,12 +3048,11 @@ Language: ko_KR 설정을 가져올 수 없음: 이 OAuth 앱 ID + 계정 조합에 일부 API를 사용할 수 없습니다. 우리와 함께해요! 추적 번호 복사 - WooCommerce 확인 중… 앱 새로 고침 + WooCommerce 확인 중… 지정된 주소 없음 연결한 이메일을 찾는 데 도움이 필요하신가요? 이 주소의 웹사이트는 워드프레스 사이트가 아닙니다. 워드프레스에서 연결하려면 사이트에 워드프레스가 설치되어 있어야 합니다. - 워드프레스닷컴으로 로그인하여 <b>%1$s</b>에 연결 Zimbabwe Zambia Yemen @@ -3048,7 +3060,6 @@ Language: ko_KR Wallis and Futuna 베트남 Venezuela - 바티칸 Vanuatu Uzbekistan Uruguay @@ -3087,13 +3098,11 @@ Language: ko_KR Solomon Islands Slovenia Slovakia - 싱가폴 Sierra Leone Seychelles Serbia Senegal Saudi Arabia - 산 마리오 사모아 Saint Vincent and the Grenadines Saint Pierre and Miquelon @@ -3106,17 +3115,12 @@ Language: ko_KR Rwanda Russia Romania - 레위니옹 - 카타르 - 푸레르토 리코 Portugal Poland - 핏케언 Philippines Peru Paraguay Papua New Guinea - 파나마 Palestinian Territory Pakistan Oman @@ -3124,7 +3128,6 @@ Language: ko_KR Northern Mariana Islands North Korea Norfolk Island - 니우에 Nigeria Niger Nicaragua @@ -3132,32 +3135,23 @@ Language: ko_KR New Caledonia Netherlands Nepal - 나우루 Namibia Myanmar Mozambique Morocco - 몬트세랫 Montenegro Mongolia - 모나코 몰도바 미크로네시아 Mexico - 마요티 - 모리셔스 Mauritania - 마르티니크 Marshall Islands - 몰타 Mali - 몰디브 Malaysia Malawi Madagascar 마케도니아 마카오 특별 행정구 중국 - 룩셈부르크 Lithuania Liechtenstein Libya @@ -3167,18 +3161,36 @@ Language: ko_KR Latvia Laos Kyrgyzstan - 쿠웨이트 Kiribati Kenya Kazakhstan Jordan - 저지 일본 - 자메이카 Ivory Coast 이탈리아 + 바티칸 + 싱가폴 + 산 마리오 + 레위니옹 + 카타르 + 푸레르토 리코 + 핏케언 + 파나마 + 니우에 + 나우루 + 몬트세랫 + 모나코 + 마요티 + 모리셔스 + 마르티니크 + 몰타 + 몰디브 + 룩셈부르크 + 쿠웨이트 + 저지 + 자메이카 + 워드프레스닷컴으로 로그인하여 <b>%1$s</b>에 연결 Israel - 맨섬 아일랜드 Iraq Iran @@ -3186,21 +3198,13 @@ Language: ko_KR India Iceland Hungary - 홍콩 Honduras Heard Island and McDonald Islands Haiti - 가이아나 Guinea-Bissau Guinea - 건지 - 과테말라 - - 과들루프 - 그레나다 Greenland Greece - 지브롤터 Ghana 독일 Georgia @@ -3283,24 +3287,15 @@ Language: ko_KR 아프가니스탄 올란드 제도 검토 - 지역 이동 통신사 사용자 정의 - 이동 통신사 이름을 입력하세요. 추적 번호를 입력하세요. - 이동 통신사를 선택하세요. 이 추적을 취소하시겠습니까? 추적을 추가할 수 없음 배송 추적이 추가됨 - 이동 통신사를 가져오는 중 오류 발생 - 선택한 운송업체 - 운송업체 배송일 추적 링크 입력 - 이동 통신사 이름 입력 추적 번호 입력 - 이동 통신사 선택 추적 링크(옵션) - 이동 통신사 이름 추적 번호 배송업체 추적 추가 @@ -3313,19 +3308,34 @@ Language: ko_KR 배송 추적 사이트 관리에서 %1$sJetpack 대시보드%2$s(%3$s연결 > 계정 연결%4$s)에서 워드프레스닷컴에 연결하는 데 사용한 이메일을 찾을 수 있습니다. 로그인할 때 어떤 이메일을 사용하나요? - 필수 이메일을 찾는 도움말이 필요하신가요? Jetpack은 스토어를 최고의 모바일 환경을 제공하는 데 필요한 푸시 알림, 통계 등의 도구와 연결하는 무료 워드프레스 플러그인입니다. Jetpack이란 무엇인가요? 연결된 스토어 보기 - %1$s이(가) 다른 워드프레스닷컴 계정에 연결된 것 같습니다. 계속 편집하기 + 맨섬 + 홍콩 + 가이아나 + 건지 + 과테말라 + + 과들루프 + 그레나다 + 지브롤터 + 지역 이동 통신사 + 이동 통신사 이름을 입력하세요. + 이동 통신사를 선택하세요. + 이동 통신사를 가져오는 중 오류 발생 + 선택한 운송업체 + 운송업체 + 이동 통신사 이름 입력 + 이동 통신사 선택 + 이동 통신사 이름 + %1$s이(가) 다른 워드프레스닷컴 계정에 연결된 것 같습니다. + 필수 이메일을 찾는 도움말이 필요하신가요? 사용자 이름과 비밀번호를 사용하여 로그인하세요. 이메일 주소가 아닌 워드프레스닷컴 사용자 이름을 사용하여 로그인하세요. 이 주소의 사이트는 워드프레스 사이트가 아닙니다. 연결하려면 사이트에서 워드프레스를 사용해야 합니다. 도움말 센터 - 가상 - 그룹 - 옵션 허용하지만 고객에게 알림 허용 허용하지 않음 @@ -3333,6 +3343,9 @@ Language: ko_KR 품절 재고 있음 더 보기 + 그룹 + 옵션 + 가상 이미지를 로드할 수 없음 임시글 비공개 @@ -3378,11 +3391,11 @@ Language: ko_KR 지금 사용해 보기 이해함 탭하여 스토어 전환 - 스토어 선택 로그아웃 주문 상태 변경 클릭하여 주문 상태 변경 적용 + 스토어 선택 안 함 나중에 지금 평가 @@ -3396,11 +3409,11 @@ Language: ko_KR 스토어를 WooCommerce 3.5로 업데이트 %s에 연결할 수 없음 무시 - 모든 리뷰를 읽음으로 표시하는 중 오류가 발생했습니다. 모두 읽음으로 표시 메시지 전화 전화 또는 메시지 고객 + 모든 리뷰를 읽음으로 표시하는 중 오류가 발생했습니다. 제품 리뷰 상태를 업데이트하는 동안 오류가 발생했습니다 제품 리뷰 세부정보를 로드하는 동안 오류가 발생했습니다 휴지통 @@ -3413,16 +3426,16 @@ Language: ko_KR 알림 관리 알림 %s 계정에서 로그아웃하시겠습니까? - %1$s(으)로 표시된 리뷰 해제된 경우 메모는 비공개가 됩니다. + %1$s(으)로 표시된 리뷰 주문을 가져오는 동안 오류가 발생했습니다 뒤로 제품 리뷰 알림 새 주문 알림 고객에게 - 사이트 확인 중… 업데이트 지침 검색 + 사이트 확인 중… 새로 고침 외 %d개의 알림 %d개의 새 알림 @@ -3432,9 +3445,9 @@ Language: ko_KR 이름 오픈 소스 라이선스 앱 정보 - 로그를 공유할 수 없음 클립보드에 복사하는 중 오류 발생 로그가 클립보드에 복사됨 + 로그를 공유할 수 없음 애플리케이션 로그 \'도움 & 지원\'의 새 메시지 우커머스 @@ -3454,9 +3467,9 @@ Language: ko_KR 충돌 보고서 공유 %s 버전 - HTTP 암호 - HTTP 사용자 이름 - 인증이 필요합니다 + SMS 확인 코드를 보내려는 시도가 너무 많았습니다. 잠시 후 다시 요청하세요. + 이 Google 계정과 일치하는 워드프레스닷컴 계정이 없습니다. + 젯팩에 연결하는 데 사용한 워드프레스닷컴 계정으로 로그인하세요. 매직 링크가 전송됨 이메일 가입 코드 확인 @@ -3465,32 +3478,9 @@ Language: ko_KR 매직 링크 로그인 사이트 주소 로그인 이메일 주소 로그인 - 오류가 발생했습니다. - 계속하려면 인증 코드를 입력하세요. - 계속하려면 비밀번호를 다시 확인하세요. - 로그인 중지됨 - 로그인하는 동안 잠시 기다려 주세요. - 로그인 진행 중… - 계속하려면 누르세요. - 로그인됨! - 네트워크 오류가 발생했습니다. 연결을 확인하고 다시 시도하세요. - 워드프레스닷컴 또는 젯팩에 연결된 독립 호스트 워드프레스 사이트를 입력하세요. - 연결할 수 없습니다. 사이트\n XMLRPC 엔드포인트에 액세스를 시도할 때 403 오류가 발생했습니다. 사이트와 통신하려면 이 앱에 필요합니다. 호스트에 문의하여\n 이 문제를 해결하세요. - 연결할 수 없습니다. 호스트가 POST 요청을 차단하고 있으므로, 사이트와 통신하려면 이 앱에\n 필요합니다. 호스트에 문의하여 이 문제를 해결하세요. - 연결할 수 없습니다. 필수 XML-RPC 함수가 서버에 없습니다. - 입력한 사이트 URL이 올바른지 확인합니다. - 오류가 발생 했습니다. 나중에 다시 시도 하십시오. - 패스워드를 잊으셨나요? - 유효한 이메일 주소를 입력 하십시오. - 이메일 확인 중 - 계속하려면 다시 로그인하세요. - 젯팩에 연결하는 데 사용한 워드프레스닷컴 계정으로 로그인하세요. - 프로필을 검색할 수 없습니다. - 중복 사이트가 감지되었습니다. - 이 사이트가 이미 앱에 있으므로, 추가할 수 없습니다. - 입력된 사용자 이름이나 암호가 잘못되었습니다. - Google에서 응답하는 데 너무 오래 걸립니다. 더 강한 인터넷 연결이 있을 때까지 기다려야 할 수 있습니다. + 아직 계정이 없으신가요? %1$s가입하세요.%2$s Google로 가입하는 중… + Google에서 응답하는 데 너무 오래 걸립니다. 더 강한 인터넷 연결이 있을 때까지 기다려야 할 수 있습니다. Google로 가입 이메일로 가입 가입하려면 %1$s서비스 약관%2$s에 동의해야 합니다. @@ -3500,20 +3490,54 @@ Language: ko_KR 이메일을 보내는 중에 문제가 발생했습니다. 지금 다시 시도하거나 닫고 나중에 다시 시도할 수 있습니다. 새 워드프레스닷컴 계정을 만들려면 이메일 주소를 입력하세요. 이메일 주소를 확인하는 중에 문제가 발생했습니다. - \n다른 계정을 사용해 보세요. + 오류가 발생했습니다. + 계속하려면 인증 코드를 입력하세요. + 계속하려면 비밀번호를 다시 확인하세요. + 로그인 중지됨 + 로그인하는 동안 잠시 기다려 주세요. + 로그인 진행 중… + 계속하려면 누르세요. + 로그인됨! Google 로그인을 시작할 수 없습니다. - SMS 확인 코드를 보내려는 시도가 너무 많았습니다. 잠시 후 다시 요청하세요. + 비밀번호를 입력하세요. + \n다른 계정을 사용해 보세요. Google 계정과 연결하는 데 문제가 발생했습니다. - 이 Google 계정과 일치하는 워드프레스닷컴 계정이 없습니다. 닫기 Google로 로그인합니다. + 네트워크 오류가 발생했습니다. 연결을 확인하고 다시 시도하세요. 다음 계정으로 로그인됨 이메일 클라이언트 앱을 감지할 수 없습니다. - 아직 계정이 없으신가요? %1$s가입하세요.%2$s 확인 코드를 입력하세요. - 비밀번호를 입력하세요. - 사용자명을 입력하세요. + 중복 사이트가 감지되었습니다. + 이 사이트가 이미 앱에 있으므로, 추가할 수 없습니다. + 연결할 수 없습니다. 호스트가 POST 요청을 차단하고 있으므로, 사이트와 통신하려면 이 앱에\n 필요합니다. 호스트에 문의하여 이 문제를 해결하세요. + 이메일 확인 중 + 연결할 수 없습니다. 필수 XML-RPC 함수가 서버에 없습니다. + 프로필을 검색할 수 없습니다. + 계속하려면 다시 로그인하세요. + 패스워드를 잊으셨나요? + 입력된 사용자 이름이나 암호가 잘못되었습니다. + 유효한 이메일 주소를 입력 하십시오. + 오류가 발생 했습니다. 나중에 다시 시도 하십시오. + 인증이 필요합니다 + 입력한 사이트 URL이 올바른지 확인합니다. + HTTP 암호 + HTTP 사용자 이름 + 워드프레스닷컴 또는 젯팩에 연결된 독립 호스트 워드프레스 사이트를 입력하세요. + 연결할 수 없습니다. 사이트\n XMLRPC 엔드포인트에 액세스를 시도할 때 403 오류가 발생했습니다. 사이트와 통신하려면 이 앱에 필요합니다. 호스트에 문의하여\n 이 문제를 해결하세요. + 또는: + 일반 + \@%s + 사용자명으로 로그인하세요. + 사이트 주소를 입력하여 로그인하세요. + 대신 다른 코드를 문자로 받습니다. + %s(으)로 끝나는 전화 번호로 문자 메시지를 보냈습니다. SMS의 확인 코드를 입력하세요. + 이 Google 계정으로 진행하려면 일치하는 워드프레스닷컴 비밀번호를 제공하세요. 이 메시지는 한 번만 표시됩니다. 콘텐츠를 공유하려면 워드프레스닷컴에 로그인하세요. + 콘텐츠를 공유하려는 워드프레스 사이트의 주소를 입력하세요. + 기본 웹 브라우저를 여는 동안 오류가 발생했습니다. 다른 앱을 선택해주세요. + 링크를 열 수 없습니다 + 사용자명을 입력하세요. 글에 액세스하려면 워드프레스닷컴에 로그인하세요. 사이트를 추가하는 동안 오류가 발생했습니다. 에러 코드: %s 사이트 주소 확인 중 @@ -3522,25 +3546,15 @@ Language: ko_KR 내 사이트 주소는 무엇인가요? 사이트 주소를 찾는 데 도움이 필요하세요? 사이트 주소 - 콘텐츠를 공유하려는 워드프레스 사이트의 주소를 입력하세요. \@%s 워드프레스닷컴에 이미 로그인되어 있습니다. 계속 - 사이트 연결 다른 사이트 연결 - 이 Google 계정으로 진행하려면 일치하는 워드프레스닷컴 비밀번호를 제공하세요. 이 메시지는 한 번만 표시됩니다. 워드프레스닷컴 비밀번호를 입력합니다. - 현재 사용할 수 없습니다. 비밀번호를 입력하세요. 로그인 이메일 요청 중 이 비밀번호가 올바르지 않은 것 같습니다. 정보를 확인하고 다시 시도하세요. SMS를 통해 확인 코드를 요청 중입니다. - 대신 다른 코드를 문자로 받습니다. 대신 코드를 문자로 받습니다. - %s(으)로 끝나는 전화 번호로 문자 메시지를 보냈습니다. SMS의 확인 코드를 입력하세요. - 마무리 단계입니다! 인증 앱의 워드프레스닷컴 확인 코드를 입력하세요. - 사용자명으로 로그인하세요. - 사이트 주소를 입력하여 로그인하세요. - 또는: 메일 열기 다음 이동 중에 젯팩 지원 사이트를 관리하세요. 어디에 가든지 워드프레스가 함께합니다. @@ -3548,29 +3562,35 @@ Language: ko_KR 언제, 어디서든지 즐겨 찾는 사이트의 최신 소식을 확인하고 대화에 참여하세요. 전 세계 독자들이 회원님의 사이트의 글을 읽고 상호 작용하는 것을 실시간으로 지켜보세요. 공원에서 글을 발행하세요. 버스에서 블로그를 방문하세요. 카페에서 댓글을 다세요. 워드프레스는 어디에서든 사용할 수 있습니다. - 로그인 - 도우미 - 암호 - 사용자 이름 - 비밀번호를 대신 입력하세요. + 이미 워드프레스닷컴 계정에 로그인되어 있으므로 다른 계정에 연결된 워드프레스닷컴 사이트를 추가할 수 없습니다. + 다시 시도 + 로그아웃 링크 전송 + 현재 사용할 수 없습니다. 비밀번호를 입력하세요. + 로그인 중 + 비밀번호를 대신 입력하세요. + 이메일 주소 + 세부사항 + 실행 취소 잘못된 확인 코드 확인 코드 - 이메일 주소 + 도우미 + 제거 + 로그인 + 사용자 이름 + 암호 + 제목 미설정 + 설정 + 오늘 + 취소 우커머스 Android %s 지원 옵션이 선택되지 않음 옵션이 선택됨 타사 정책 쿠키 정책 - 개인정보 보호정책 - 많은 사랑을 받는 Automattic 제품. %1$s 워드프레스는 타사 제품을 포함한 다른 추적 도구를 사용합니다. 이 도구에 대해 읽고 제어하는 방법에 대해 알아보세요. - 개인정보 보호정책 읽기 - 이 정보는 개인정보 보호정책에 명시된 바와 같이 제품을 개선하고, 더 관련성 높은 마케팅을 제공하며, 우커머스 환경을 개인 설정하는 데 도움을 줍니다. 워드프레스 계정에 로그인되어 있는 동안 이용하는 서비스에 대한 정보를 워드프레스의 분석 도구와 공유합니다. 정보 수집 - 프라이버시 설정 - 설정 주문 상태 환불됨 취소됨 @@ -3584,7 +3604,6 @@ Language: ko_KR 추가 고객에게 이메일로 메모 보내기 주문을 변경하는 중 오류 발생 - 메모를 가져오는 중 오류 발생 주문이 완료로 표시됨 주문을 완료로 표시 주문 메모 추가 @@ -3593,7 +3612,6 @@ Language: ko_KR 청구 표시 결제가 처리됨 주문 메모 - 비공개 주문 메모 작성 고객 프로필 이미지 고객이 남긴 메모 @@ -3618,8 +3636,6 @@ Language: ko_KR 주문 없음 주문 보기 주문 보기 - 이 기간에 활동이 없음 - 총 주문 수: %s 오류 이미지 데이터를 가져오는 중 오류 발생 수입 @@ -3633,17 +3649,11 @@ Language: ko_KR 우커머스 스토어 없음 프로필 사진 연결된 스토어 - %1$s구성 지침%2$s을 읽어보세요. 이 앱에서 회원님의 스토어에 연결하려면 젯팩이 있어야 합니다. - \@%s - 연결하려는 WooCommerce 스토어의 주소를 입력합니다. 워드프레스닷컴 계정 이메일 주소로 로그인하여 우커머스 스토어를 관리하세요. - 이미 워드프레스닷컴 계정에 로그인되어 있으므로 다른 계정에 연결된 워드프레스닷컴 사이트를 추가할 수 없습니다. - 링크를 열 수 없습니다 SMS 앱이 없음 이메일 앱이 없음 전화 앱이 없음 - 기본 웹 브라우저를 여는 동안 오류가 발생했습니다. 다른 앱을 선택해주세요. 링크를 열 수 없음 %2$s, %1$s 1개월 이상 지남 @@ -3652,22 +3662,14 @@ Language: ko_KR 어제 오늘 상품 - 제거 올해 이번 달 이번 주 - 오늘 상품 네트워크를 사용할 수 없습니다. 데이터 또는 Wi-Fi 연결을 확인하세요. 오프라인 u2014 캐시된 데이터 사용 더 알아보기 - 취소 - 제목 미설정 계속 - 실행 취소 - 다시 시도 - 상세 정보 숨기기 - 세부사항 할인 소계 세금 @@ -3678,11 +3680,22 @@ Language: ko_KR %1$s%2$s 주문 내 스토어 - 로그아웃 - 로그인 중 모두 - 일반 우커머스 + 개인정보 보호정책 + 개인정보 보호정책 읽기 + 이 정보는 개인정보 보호정책에 명시된 바와 같이 제품을 개선하고, 더 관련성 높은 마케팅을 제공하며, 우커머스 환경을 개인 설정하는 데 도움을 줍니다. + 프라이버시 설정 + 상세 정보 숨기기 + 많은 사랑을 받는 Automattic 제품. %1$s + 연결하려는 WooCommerce 스토어의 주소를 입력합니다. + 비공개 + 사이트 연결 + 이 기간에 활동이 없음 + 총 주문 수: %s + 메모를 가져오는 중 오류 발생 + %1$s구성 지침%2$s을 읽어보세요. + 마무리 단계입니다! 인증 앱의 워드프레스닷컴 확인 코드를 입력하세요. @string/date_timeframe_custom @string/date_timeframe_today diff --git a/WooCommerce/src/main/res/values-nl/strings.xml b/WooCommerce/src/main/res/values-nl/strings.xml index 3b7c4fef79d..549381654de 100644 --- a/WooCommerce/src/main/res/values-nl/strings.xml +++ b/WooCommerce/src/main/res/values-nl/strings.xml @@ -1,11 +1,27 @@ + Fout bij laden van variaties + \'Meer items laden mislukt. Probeer het opnieuw.\' + Terug + %1$d variaties + Variatie %s, prijs %s + Variabel product %s, prijs %s + De omschrijving mag niet leeg zijn + Call-to-action + De slogan mag niet leeg zijn + Controleer of je e-mailadres klopt en check je spammap. + We kunnen geen WordPress.com-account vinden met deze gebruikersnaam. Je kan een e-mailadres invoeren om een nieuw account aan te maken. + Voer een streepjescode of een andere unieke identificatiecode voor dit product in. Hiermee kan je dit product op andere kanalen of marktplaatsen vermelden. + GTIN, UPC, EAN, ISBN + LAATSTE UITBETALING + Markeer deze bestelling na de aanschaf van een label als voltooid en informeer de klant. + Als je nog geen account hebt, gebruiken we dit e-mailadres om er een aan te maken. Envelop Doos Pakket toevoegen @@ -30,7 +46,6 @@ Language: nl Voordeligste Label aanschaffen Label aanschaffen %1$s - Markeer deze bestelling als voltooid en informeer de klant Verzendkosten Bestelgegevens Verzendingsgegevens @@ -559,7 +574,6 @@ Language: nl Taal Budget: Details - Nu winkelen Advertentie bewerken Voorbeeldweergave Uitgeschakeld @@ -585,7 +599,6 @@ Language: nl Klaar om te promoten Zorg dat je producten door miljoenen mensen worden gezien Gebruik %1$s - VORIGE STORTING Besteltotalen uitklappen/samenvouwen Betaling innen De code moet de volgende indeling hebben: XXXX-XXXX-XXXX-XXXX @@ -667,9 +680,9 @@ Language: nl Documenten op apparaat ✨Dankbericht aanmaken Btw rekenen - Beschikbare bedragen worden automatisch elke %s gestort. - Beschikbare bedragen worden automatisch elke dag gestort. - Bedragen komen na %d dagen in de wacht beschikbaar. + Beschikbare bedragen worden automatisch elke %s uitbetaald. + Beschikbare bedragen worden automatisch elke dag uitbetaald. + Bedragen komen na %d dagen in de wacht beschikbaar. Selecteer een variatie Variaties kiezen… \" %1$s \" -> %2$s @@ -708,19 +721,19 @@ Language: nl Periode Factuurinterval Verkoop - Onbekend - Mislukt - Geannuleerd - In transit - In behandeling - Betaald - Geschat - Samenvatting stortingen uit-/inklappen - Meer informatie over wanneer je je bedragen ontvangt - Beschikbare bedragen worden automatisch elke maand op de %s gestort. - Bedragen komen na %d dag in de wacht beschikbaar. - Bedragen in behandeling - Beschikbare bedragen + Onbekend + Mislukt + Geannuleerd + In transit + In behandeling + Betaald + Geschat + Samenvatting uitbetalingen uit-/inklappen + Meer informatie over wanneer je je bedragen ontvangt + Beschikbare bedragen worden automatisch elke maand op de %s uitbetaald. + Bedragen komen na %d dag in de wacht beschikbaar. + Bedragen in behandeling + Beschikbare bedragen Belastingen Producten Totale betalingen diff --git a/WooCommerce/src/main/res/values-pt-rBR/strings.xml b/WooCommerce/src/main/res/values-pt-rBR/strings.xml index 41353600f93..333d4efe54b 100644 --- a/WooCommerce/src/main/res/values-pt-rBR/strings.xml +++ b/WooCommerce/src/main/res/values-pt-rBR/strings.xml @@ -1,11 +1,27 @@ + Erro ao carregar variações + \"Falha ao carregar mais itens. Tente novamente.\" + Voltar + %1$d variações + Variação: %s; preço: %s + Produto variável: %s; preço: %s + A descrição não pode ficar em branco + Chamada para ação + A descrição não pode ficar em branco + Confirme se o e-mail está correto e verifique sua pasta de spam. + Não encontramos nenhuma conta do WordPress.com conectada a este nome de usuário. Insira um e-mail para criar uma conta nova. + Insira um código de barras ou algum outro identificador exclusivo deste produto. Isso pode ajudar a listar o produto em outros canais ou marketplaces. + GTIN, UPC, EAN, ISBN + ÚLTIMO PAGAMENTO + Depois de comprar a etiqueta, marque este pedido como concluído e notifique o cliente. + Se você não tiver uma conta, usaremos este e-mail para criar uma. Envelope Caixa Adicionar pacote @@ -30,7 +46,6 @@ Language: pt_BR Mais barato Comprar etiqueta Comprar etiqueta · %1$s - Marcar este pedido como concluído e notificar o cliente Frete Detalhes do pedido Detalhes do envio @@ -535,11 +550,11 @@ Language: pt_BR Mudar imagem Aplicar %1$s dias - As impressões demonstram a frequência com que seu anúncio aparece para possíveis clientes.\n\n\n Apesar de o número exato não poder ser garantido por conta das variações no tráfego online e no comportamento do usuário, nós nos esforçamos para corresponder ao máximo as impressões reais do seu anúncio à contagem desejada.\n\n\n E lembre-se: as impressões têm a ver com a visibilidade, e não com as ações dos visitantes. Concluído Impressões Atualizar Editar + As impressões demonstram a frequência com que seu anúncio aparece para possíveis clientes.\n\n\n Apesar de o número exato não poder ser garantido por conta das variações no tráfego online e no comportamento do usuário, nós nos esforçamos para corresponder ao máximo as impressões reais do seu anúncio à contagem desejada.\n\n\n E lembre-se: as impressões têm a ver com a visibilidade, e não com as ações dos visitantes. Estimativa de pessoas alcançadas por dia %1$s ao dia por %1$s dias @@ -559,7 +574,6 @@ Language: pt_BR Idioma Orçamento Detalhes - Comprar agora Visualizar Editar anúncio Desativada @@ -585,7 +599,6 @@ Language: pt_BR Tudo pronto para promover Mostre seu produto a milhões de pessoas Usar %1$s - ÚLTIMO DEPÓSITO Expandir/recolher totais de pedidos Receber pagamento O código deve estar no formato XXXX-XXXX-XXXX-XXXX @@ -667,9 +680,9 @@ Language: pt_BR Documentos e outros arquivos no dispositivo ✨Criar texto de agradecimento Cobrar impostos - O dinheiro disponível é depositado automaticamente a cada %s. - O dinheiro disponível é depositado automaticamente todo dia. - O dinheiro fica disponível após %d dias pendente. + O dinheiro disponível é depositado automaticamente a cada %s. + O dinheiro disponível é depositado automaticamente todo dia. + O dinheiro fica disponível após %d dias pendente. Selecionar uma variação \"%1$s\" -> %2$s selecione uma variação @@ -708,21 +721,21 @@ Language: pt_BR Período Intervalo de cobrança Promoção - Desconhecido - Com falha - Cancelado - Em trânsito - Pendente - Pago - Estimado - Recolher/expandir resumo de depósito - Saiba mais sobre quando você receberá seu dinheiro - Dinheiro pendente - Dinheiro disponível + Desconhecido + Com falha + Cancelado + Em trânsito + Pendente + Pago + Estimado + Recolher/expandir resumo de pagamento + Saiba mais sobre quando você receberá seu dinheiro Impostos Produtos - O dinheiro disponível é depositado automaticamente todo mês no dia %s. - O dinheiro fica disponível após %d dia pendente. + Dinheiro pendente + Dinheiro disponível + O dinheiro disponível é depositado automaticamente todo mês no dia %s. + O dinheiro fica disponível após %d dia pendente. Totais de pagamentos Endereço de e-mail ou nome de usuário Não é possível criar um pedido de valor personalizado diff --git a/WooCommerce/src/main/res/values-ru/strings.xml b/WooCommerce/src/main/res/values-ru/strings.xml index d54e1742733..5de196045e6 100644 --- a/WooCommerce/src/main/res/values-ru/strings.xml +++ b/WooCommerce/src/main/res/values-ru/strings.xml @@ -1,11 +1,27 @@ + Ошибка при загрузке вариантов + «Не удалось загрузить другие товары. Повторите попытку». + Назад + Вариантов: %1$d + Вариант %s, цена %s + Товар с вариантами %s, цена %s + Описание не может быть пустым + Призыв к действию + Ключевая фраза не может быть пустой + Проверьте, правильно ли указан ваш адрес эл. почты, и ещё раз загляните в папку «Спам». + Не удалось найти учётную запись WordPress.com, связанную с этим именем пользователя. Введите адрес эл. почты, чтобы создать новую учётную запись. + Введите штрихкод или любой другой уникальный идентификатор товара. Это поможет вам выставлять товар на продажу в других сетях или на маркетплейсах. + GTIN, UPC, EAN, ISBN + ПОСЛЕДНИЙ ПЛАТЁЖ + После приобретения этикетки отметить заказ как выполненный и уведомить заказчика. + Если у вас нет учётной записи, создайте её с этим адресом эл. почты. Конверт Коробка Добавить упаковку @@ -27,21 +43,20 @@ Language: ru К сожалению, этот заказ можно редактировать только в Интернете, так как он сделан в %1$s, а валюта вашего сайта — %2$s Служба доставки По скорости + По стоимости Купить этикетку Купить этикетку · %1$s - По стоимости - Отметить заказ как выполненный и уведомить заказчика Стоимость доставки + Сведения о заказе + Сведения о доставке Введите размеры посылки или выберите одну из упаковок перевозчика, чтобы узнать доступные тарифы на доставку. Выберите упаковку, чтобы узнать тарифы Выберите упаковку Имеются ли в вашем отправлении опасные товары или материалы? - Сведения о заказе - Сведения о доставке Свернуть/развернуть карточку товара %1$s  ·  %2$s - Нет Отсортировано по 1%s + Нет Сохранить выбор для будущих кампаний <b>Подходит для:</b> %s Выбрать цель %s @@ -67,8 +82,8 @@ Language: ru Нет фотографий Фотографии товара Выберите имеющееся фото товара - Этот ключ уже применяется в другом произвольном поле.\nВ настоящий момент приложение не поддерживает создание дубликатов ключей. При необходимости создать дубликат ключа воспользуйтесь wp-admin. Недопустимый ключ: удалите символ «_» в самом начале. + Этот ключ уже применяется в другом произвольном поле.\nВ настоящий момент приложение не поддерживает создание дубликатов ключей. При необходимости создать дубликат ключа воспользуйтесь wp-admin. Добавить произвольные поля Произвольное поле удалено Не удалось сохранить изменения. Повторите попытку @@ -89,21 +104,21 @@ Language: ru Ежедневные затраты Сколько вы планируете потратить на кампанию и сколько времени она должна продлиться? %1$s ➔ %2$s - Думаете о том, как повысить продажи? При помощи Blaze демонстрируйте ваши товары миллионам потенциальных покупателей и повышайте продажи + Думаете о том, как повысить продажи? Ошибка при загрузке произвольных полей Произвольные поля Затемнённый фон. Коснитесь, чтобы закрыть диалог. %1$s в неделю Выполнять до остановки мною + Запущена %1$s + еженедельные расходы %1$s еженедельно начиная с %2$s Еженедельно Осталось Итого Переходы По-видимому, ваше устройство находится в режиме экономии энергии. \nПока этот режим активен, сведения о магазине будут недоступны - Запущена %1$s - еженедельные расходы Всплывающее меню с опциями. Смахивайте товары, чтобы переходить к следующим. Открыть меню панели инструментов Панель инструментов со статусом платёжного терминала. Меню открыто. Дважды коснитесь, чтобы начать работу. @@ -135,13 +150,13 @@ Language: ru Новый заказ ОК + Создать заказ в разделе «Управление магазином» + Чтобы принять платёж за товар, не относящийся к простым, выйдите из режима POS и создайте новый заказ в таблице заказов. Почему я не вижу свои товары? Информация Закрыть + Подробнее В данный момент POS поддерживает только простые материальные товары. Другие типы товаров, в частности виртуальные и вариативные товары, станут доступны в ближайших обновлениях. Только простые товары - Чтобы принять платёж за товар, не относящийся к простым, выйдите из режима POS и создайте новый заказ в таблице заказов. - Подробнее Адрес сайта Google для WooCommerce Добавить платную кампанию @@ -151,12 +166,12 @@ Language: ru Ваша новая кампания создана. Впереди у вас удачный сезон продаж! Всё готово! Не удалось создать заказ + Повторить попытку Значок ошибки Хотите повторить попытку? Ошибка при загрузке товаров В данный момент POS поддерживает только простые товары В данный момент POS поддерживает только простые товары — \nсначала создайте такой товар. - Повторить попытку Нет поддерживаемых товаров Товаров нет Поддержка @@ -228,35 +243,35 @@ Language: ru Имя, содержание и описание Можно отредактировать или восстановить сведения о товаре перед сохранением. Программы - Нет программ за этот период Кампании Google + Нет программ за этот период Подключить Корзина Создание сведений о товаре Считывать текст с фотографии товара Например: «Чёрная футболка, х/б, мягкая ткань, прочные швы, уникальный дизайн» + Расскажите нам о своём товаре и его достоинствах, а потом ИИ сотворит для вас чудо. Исходные данные Мы сгенерируем для вас сведения о товаре - Расскажите нам о своём товаре и его достоинствах, а потом ИИ сотворит для вас чудо. Получение платежа по карте Итого + Налоги Подытог Оплата прошла успешно Платёж не выполнен. Повторите попытку. Значок корзины Товары + Товары (%d) + Очистить Повышайте продажи и привлекайте больше посетителей при помощи Google Ads Google для WooCommerce Нет правил количества - Товары (%d) - Очистить - Налоги Аудитория Отмена + Выход Закрыть POS - Оформление заказа Удалить %s из корзины - Выход + Оформление заказа Статус считывающего устройства неизвестен Оформление заказа Считывающее устройство подключено @@ -294,8 +309,8 @@ Language: ru Не удалось загрузить самые продаваемые товары Н/Д Сумма сдачи - Самые активные купоны Полученные наличные + Самые активные купоны Получить оплату (%s) Посмотреть все отзывы Не найдено ни одного отзыва, соответствующего выбранному фильтру. Попробуйте изменить фильтр. @@ -324,8 +339,8 @@ Language: ru Скрыть %s Завершено Обратная связь - Не удалось отобразить\n аналитику вашего магазина Убедитесь, что на сайте используется последняя версия WooCommerce и аналитика WooCommerce активирована. + Не удалось отобразить\n аналитику вашего магазина Посмотреть все задачи Аналитические данные сеанса основываются на количестве уникальных посетителей, которое невозможно определить для произвольных временных промежутков. Данные сеанса недоступны @@ -338,11 +353,11 @@ Language: ru Отмена Всё равно выйти Похоже, вы ещё не одобрили соединение с приложением. Вы уверены, что хотите выйти? + Выберите изображение размером минимум 400x400 пикселей Недопустимое изображение Судя по всему, введённые вами имя пользователя или пароль неверны. Проверьте учётные данные и повторите попытку. Если ваши данные по-прежнему не загружаются, обратитесь за помощью в службу поддержки. Проблем с подключением нет - Выберите изображение размером минимум 400x400 пикселей Вернуться на предыдущий экран Повторить попытку подключения Идёт подключение к вашему сайту @@ -356,15 +371,15 @@ Language: ru Продолжить Если у вас возникают проблемы, обратитесь в нашу службу поддержки. 3. После установки подключения вы автоматически выполните вход в свой магазин. + 2. Когда появится запрос, подтвердите подключение, нажав кнопку подтверждения. 1. Сначала войдите с учётными данными вашего сайта. Следуйте этой процедуре, чтобы напрямую подключить приложение Woo к вашему магазину при помощи пароля приложения. + Возможно, это потому, что в вашем магазине действуют дополнительные меры безопасности. Не удалось войти в ваш магазин Когда вы сделаете заказ, сведения о нём отобразятся здесь. Сведений о заказе ещё нет Добавить индивидуальную сумму Чтобы указать сумму платежа, добавьте\nиндивидуальную сумму к своему заказу. - 2. Когда появится запрос, подтвердите подключение, нажав кнопку подтверждения. - Возможно, это потому, что в вашем магазине действуют дополнительные меры безопасности. Мы объединили получение платежа и\nсоздание заказа, сделав операцию более доступной\nи эффективной. Получение платежа \nперемещено Комплекты @@ -387,14 +402,16 @@ Language: ru Доступно обновление (%s) Обновлён Название магазина - Не удалось загрузить предлагаемые домены Удалить рубрику Обновить рубрику Ошибка при удалении рубрики Рубрика товаров удалена Рубрика товаров обновлена + Не удалось загрузить предлагаемые домены Варианты Укажите домен + Выберите домен + Просмотреть всю аналитику магазина По годам По месяцам По неделям @@ -404,8 +421,6 @@ Language: ru Подключить другой магазин Запускаете новый магазин? Название магазина - Выберите домен - Просмотреть всю аналитику магазина Пожалуйста, подождите… Обновление статусов наличия на складе Что-то пошло не так. Повторите попытку. @@ -419,8 +434,10 @@ Language: ru Товары (%1$d) с управляемым количеством на складе будут пропущены. Статус наличия на складе будет обновлен для %1$d товаров. Текущий статус наличия на складе: %1$s + Текущий статус наличия на складе разнороден ГОТОВО Обновить статус наличия на складе + Войти с учётными данными сайта Версия WooCommerce Установленные плагины Плагины @@ -433,20 +450,18 @@ Language: ru Детали заказа Ошибка при отправке заказа в корзину Заказ отправлен в корзину - Текущий статус наличия на складе разнороден - Войти с учётными данными сайта Похоже, с вашим сайтом возникла проблема.\n\nЧтобы решить эту проблему, обратитесь к своему хостинг-провайдеру. - Похоже, вы не подключены к Интернету.\n\nУбедитесь, что ваш Wi-Fi включён. Если вы используете мобильные данные, убедитесь, что они включены в настройках вашего устройства. Похоже, возникла проблема при подключении к Jetpack.\n\nНо не волнуйтесь: наши инженеры поддержки вам помогут. Свяжитесь с нами, и мы будем рады помочь. Похоже, нам не удаётся правильно обработать ответ вашего сайта.\n\nНо не волнуйтесь: наши инженеры поддержки вам помогут. Свяжитесь с нами, и мы будем рады помочь. Похоже, ваш сайт отвечает слишком долго.\n\nЧтобы решить эту проблему, обратитесь к своему хостинг-провайдеру. + Похоже, вы не подключены к Интернету.\n\nУбедитесь, что ваш Wi-Fi включён. Если вы используете мобильные данные, убедитесь, что они включены в настройках вашего устройства. + Товар не выбран Читать далее Поддержка - Подключение к Интернету - Добавить статистику за выбранный период - Товар не выбран Получение заказов с вашего сайта Подключение к серверам WordPress.com + Подключение к Интернету + Добавить статистику за выбранный период Местоположение не найдено.\nПовторите попытку. Просмотры страниц сеанса Тип устройства @@ -465,13 +480,13 @@ Language: ru Атрибуция заказа Связаться в Telegram Связаться в WhatsApp + Идентификатор: %d Клиент Товар Гость Этот пользователь — гость, а гостевой статус не позволяет фильтровать заказы. Повторите попытку позже или свяжитесь с нами. Мы будем рады помочь! Ваш сайт отвечает долго - Идентификатор: %d Показать подробности Налог на доставку Настроить аналитику @@ -487,6 +502,8 @@ Language: ru Готово Мы проверяем вашу кампанию. Она будет опубликована в течение 24 часов. Впереди у вас удачный сезон продаж! Всё готово! + Ключ уже существует + Слишком длинный конечный URL-адрес Значение Ключ Размещение: %s @@ -503,8 +520,6 @@ Language: ru Добавьте ключевую фразу и описание кампании Blaze Добавить изображение Добавьте изображение для кампании Blaze - Ключ уже существует - Слишком длинный конечный URL-адрес Перетащить указатель Карты аналитики Смотреть отчет @@ -513,18 +528,18 @@ Language: ru Параметры URL-адреса URL-адрес назначения Ввести вручную + Не удалось выполнить поиск.\nПовторите попытку Начните набирать название страны, штата или города, чтобы увидеть доступные варианты Нажимая «Отправить кампанию», вы принимаете <a href=\'termsOfService\'><u>условия предоставления услуг</u></a> и <a href=\'advertisingPolicy\'><u>политику публикации рекламы</u></a>, а также разрешаете использовать указанный способ оплаты для списания средств за выбранные вами бюджет и период. <a href=\'learnMore\'><u>Подробнее</u></a> о том, как использовать бюджеты и платежи за продвигаемые записи. - Не удалось выполнить поиск.\nПовторите попытку Отправить кампанию Не удалось загрузить способы оплаты. Чтобы повторить попытку, нажмите здесь. Добавить способ оплаты + Загрузка способов оплаты Итого Кампания Blaze Итоговые суммы платежей Оплата Поиск местоположений - Загрузка способов оплаты Не удалось сохранить чек Не удалось загрузить чек Не удалось обнаружить ни одного приложения, в котором можно опубликовать чек @@ -535,6 +550,7 @@ Language: ru Ключевая фраза Изменить изображение Применить + Дата начала %1$s дн. Раздел «Показы» отражает частоту, с которой ваша реклама появляется на экранах потенциальных клиентов.\n\n\n Достичь этой цифры в точности будет невозможно из-за колебаний посещаемости и различного поведения пользователей, однако мы стремимся к тому, чтобы реальное число показов рекламы максимально приближалось к целевому показателю.\n\n\n Учитывайте, что показы влияют лишь на видимость рекламы, а не на действия читателей. Готово @@ -542,12 +558,11 @@ Language: ru Обновить Изменить Приблизительный ежедневный охват пользователей + %1$s ежедневно на %1$s дн. Настройте бюджет Все %1$s дн. с %2$s - %1$s ежедневно - Дата начала Больше не показывать Напомнить позже Есть свободная минутка? Оставьте краткий отзыв и помогите нам улучшить функции на базе ИИ. @@ -559,12 +574,11 @@ Language: ru Язык Бюджет Сведения - Купить сейчас - Предварительный просмотр Редактировать рекламное объявление + Предварительный просмотр Отключено - Выбрать товар %s Выбор товара + Выбрать товар %s <b>В прямом эфире:</b> следите за началом вашей кампании и её успехами. <b>Быстрый просмотр:</b> отправьте свою рекламу на оперативную модераторскую проверку. <b>Создание бюджета:</b> определите продолжительность кампании и затраты на неё. @@ -572,12 +586,12 @@ Language: ru <b>Выбор товара:</b> выберите, что рекламировать при помощи Blaze. Управление запасами Запасы не управляются + Как работает Blaze Запустите кампанию Ваша реклама появится на миллионах сайтов в сетях WordPress.com и Tumblr. Охватите широкую аудиторию - Простота глобального охвата «Наш инструмент покажет ваш товар именно там, где его смогут увидеть заинтересованные покупатели». - Как работает Blaze + Простота глобального охвата Запуск рекламы за несколько минут: вам не понадобится ни навык, ни солидный бюджет, можно начать всего с 5 долларов США в день. Быстрый старт, значительный эффект Наш инструмент разработан специально для того, чтобы дать продавцам возможность простой и быстрой настройки рекламных кампаний с целью максимального увеличения посещаемости. @@ -585,7 +599,6 @@ Language: ru Готово к продвижению Пусть миллионы покупателей увидят ваши товары Использовать %1$s - ПОСЛЕДНЯЯ ОПЛАТА Развернуть/свернуть итоговую сумму заказа Получение платежа Код должен вводиться в формате XXXX-XXXX-XXXX-XXXX @@ -597,21 +610,21 @@ Language: ru Не удалось загрузить текущую тему ПК Планшет + Мобильный телефон нажмите здесь + При загрузке шаблона возникла проблема. %1$s для демонстрационного режима. Найдите самую подходящую для вас тему в магазине тем WooCommerce. Текущая тема Попробуйте новый дизайн Начать опрос - Хотите добавить функцию очной оплаты к оформлению заказа онлайн? - Требуется помощь? <a href=\'\'>Свяжитесь с нами</a> - Мобильный телефон - При загрузке шаблона возникла проблема. %1$s для демонстрационного режима. Мы высоко ценим ваше мнение! Активация функции очной оплаты даёт возможность клиенту оплачивать заказ при доставке наличными или банковской картой.\n\nЗаказы можно по-прежнему создавать вручную, не активируя этой функции. + Хотите добавить функцию очной оплаты к оформлению заказа онлайн? + Требуется помощь? <a href=\'\'>Свяжитесь с нами</a> Возместить индивидуальную сумму Возврат индивидуальной суммы - Добавить подарочную карту Сканировать штрихкод товара + Добавить подарочную карту Товар Количество Исходное количество @@ -623,35 +636,35 @@ Language: ru Товар с артикулом %s не значится в складских запасах. Повторите попытку. Товар с артикулом %s не найден. Повторите попытку. Не удалось активировать тему, повторите попытку. + Звуковое оповещение о новых заказах отключено. Включите его заново, чтобы слышать «дзинь» всякий раз при очередной продаже. + Включить «дзинь» Сканировать штрихкод, чтобы обновить запас + Это тестовое оповещение для проверки звука «дзинь».\nМожете его удалить. Тестировать уведомление ТЕСТИРОВАТЬ ЗВУК + Всё готово! Теперь звук «дзинь» будет раздаваться при каждом заказе. ОТКЛЮЧИТЬ ЗВУК ВКЛЮЧИТЬ ЗВУК - Количество заказов - 0 - Процент от общей суммы заказа - Звуковое оповещение о новых заказах отключено. Включите его заново, чтобы слышать «дзинь» всякий раз при очередной продаже. - Включить «дзинь» - Это тестовое оповещение для проверки звука «дзинь».\nМожете его удалить. - Всё готово! Теперь звук «дзинь» будет раздаваться при каждом заказе. Включите заново, чтобы слышать «дзинь» при каждой новой продаже. Отслеживайте заказы ваших клиентов! Звук «дзинь» отключён + Количество заказов % + 0 + Процент от общей суммы заказа Фиксированная сумма Как вы хотите добавить индивидуальную сумму? - Удалить индивидуальную сумму Процент от общей суммы заказа (%1$s) + Удалить индивидуальную сумму + Тема успешно активирована Главная страница Коснитесь для просмотра Страницы в этом шаблоне Предварительный просмотр - Тема успешно активирована Ищете что-то другое? Вы можете изменить настройки в любой момент. + Выберите тему Темы Узнайте больше! - Выберите тему Требуется настройка Скрыть Blaze Благодарственная записка, созданная ИИ @@ -660,69 +673,69 @@ Language: ru Создать повторно ✨ Создание благодарственной записки к вашему заказу… Благодарственная записка - Включите этот параметр, чтобы взимать плату за доставку только один раз при первоначальном заказе. Примечание. Чтобы можно было включить этот параметр, в тарифном плане не должно быть бесплатного пробного периода или синхронизированной даты продления. + Включите этот параметр, чтобы взимать плату за доставку только один раз при первоначальном заказе. Включено - Документы и другие файлы на устройстве Единовременная доставка + Документы и другие файлы на устройстве ✨Создать благодарственную записку Удержать налоги - Доступные средства вносятся на счёт автоматически раз в %s. - Доступные средства вносятся на счёт автоматически раз в день. - Денежные средства станут доступны после утверждения в течение %d дн. + Доступные средства выплачиваются автоматически один раз в %s. + Доступные средства вносятся на счёт автоматически один раз в день. + Денежные средства станут доступны после утверждения в течение %d дн. Выбрать вариант - Выберите %1$s - %d элементов + Выберите вариант «%1$s» -> %2$s выберите конкретный вариант Выбрано элементов: %1$s Выбран %1$s элемент + Выберите %1$s более %1$s элементов более %1$s элемента менее %1$s элементов от %1$s до %2$s элементов + %d элементов %d элемент - Выберите вариант Измените количество товара с %1$.2f на %2$.2f + Сохранить конфигурацию Конфигурация + Товар %s + Настроить + Необязательно; регистрационный сбор взимается немедленно, даже если у товара есть бесплатный пробный период или синхронизированы даты оплаты. Подписка на продукт с вариантами Продукт по подписке с вариантами Уникальная подписка на продукт, включающая регулярные платежи Продукт по простой подписке - Сохранить конфигурацию - Товар %s - Настроить - Необязательно; регистрационный сбор взимается немедленно, даже если у товара есть бесплатный пробный период или синхронизированы даты оплаты. Необязательный период времени до списания первого регулярного платежа. Любой регистрационный взнос всё равно будет взиматься в начале подписки. Пробный период не может превышать: 90 дней, 52 недели, 24 месяца или 5 лет. - Срок действия подписки истекает Пробный период действия тарифного плана - ТОВАР + Срок действия подписки истекает ИНДИВИДУАЛЬНЫЕ СУММЫ ИТОГОВЫЕ СУММЫ ПЛАТЕЖЕЙ ПРИМЕЧАНИЯ К ЗАКАЗУ ТОВАРЫ + ТОВАР КЛИЕНТ Пожалуйста предоставьте ключ безопасности для продолжения. Возникла проблема со входом в систему с помощью ключа безопасности Использовать ключ безопасности Период - Распродажа - Неизвестно - Сбой - Отменено - В процессе перехода - Оплачено - Ожидается - Узнайте, когда вы сможете получить ваши средства Расчётный интервал - На утверждении - Свернуть/развернуть выписку по счёту - Средства на утверждении - Доступные средства + Распродажа + Неизвестно + Сбой + Отменено + В пути + На утверждении + Оплачено + Ожидается + Свернуть/развернуть сводку выплат + Узнайте, когда вы сможете получить ваши средства + Доступные средства вносятся на счёт автоматически каждый месяц %s. + Денежные средства станут доступны после утверждения в течение %d дн. + Средства на утверждении + Доступные средства Налоги Товары - Денежные средства станут доступны после утверждения в течение %d дн. - Доступные средства вносятся на счёт автоматически каждый месяц %s. Итоговые суммы платежей Адрес электронной почты или имя пользователя Не удалось создать заказ с индивидуальной суммой @@ -749,8 +762,8 @@ Language: ru Текст не обнаружен. Выберите другую фотографию упаковки или введите сведения о товаре вручную. Добавить товар Сканировать штрихкод - Уменьшить количество товара Свернуть/развернуть карточку товара + Уменьшить количество товара Увеличить количество товара Добавить индивидуальную сумму Цена со скидкой @@ -763,8 +776,8 @@ Language: ru Меняйте текст: отмените выбор ненужных отсканированных страниц или нажмите, чтобы отредактировать текст Ключевые слова Использовать фото упаковки (по желанию) - Попробуйте оплатить %s банковской картой.\nПосле этого средства будут возвращены. Выберите «Оплата в касание» в опциях получения платежей в\nсведениях о заказе или разделе «Меню > Платежи». + Попробуйте оплатить %s банковской картой.\nПосле этого средства будут возвращены. Просто, безопасно и конфиденциально. Принимайте все виды очных платежей прямо\nна вашем телефоне. Дополнительное оборудование не требуется. Отклонено @@ -776,14 +789,14 @@ Language: ru Кампания Blaze Символ бесконтактной оплаты (Contactless Symbol) — торговая марка, принадлежащая компании EMVCo, LLC и используемая с её разрешения. 5. Если вы видите значок «Выполнено» в виде галочки, значит, магазин обрабатывает ваш платёж, а транзакция завершена. - 2. Нажмите «Принять платёж» и выберите Tap to Pay. 3. Покажите покупателю ваш смартфон. + 2. Нажмите «Принять платёж» и выберите Tap to Pay. + 1. Создайте заказ Как это работает Подробнее об устройствах чтения карт Чтобы принимать платежи сверх лимита, вам может потребоваться устройство чтения карт, в котором можно вводить PIN-коды. Мы не поддерживаем ввод PIN-кодов при использовании функции Tap to Pay на устройствах на базе Android. В %1$s некоторые карты требуют ввода PIN-кода при бесконтактных транзакциях на сумму свыше %2$s. - 1. Создайте заказ Важная информация Функция Tap to Pay (Оплата в касание) позволяет принимать все виды бесконтактных платежей: от банковских карт до цифровых кошельков — без необходимости приобретать устройство чтения карт. Что такое Tap to Pay? @@ -827,40 +840,40 @@ Language: ru Добавить эту ставку ко всем созданным заказам Изменить налоговые ставки Изменить налоговые ставки в консоли - Способы оплаты Добавьте налоговые ставки в консоли. Будут показаны только налоговые ставки с информацией о местоположении. Налоговые ставки не найдены Посмотрите другие платёжные системы и \nвыберите одну из них. + Способы оплаты Изображения и видео на устройстве - Завершить настройку Исправить + Завершить настройку Установить налоговую ставку Активировать Установить новую налоговую ставку - Настроить WooPayments + Настроить Изменить налоговые ставки в консоли Адрес клиента будет изменён на адрес, где действует выбранная вами налоговая ставка. Кнопка открытия диалогового окна с информацией о налоговых ставках ВЫБРАТЬ НАЛОГОВУЮ СТАВКУ Не можете найти нужную налоговую ставку? - Изменить налоговые ставки в консоли - Налоги и налоговые ставки - Налоговые ставки для разных адресов можно изменить в консоли магазина. Сейчас налоговая ставка рассчитывается на основе адреса доставки%1$s Сейчас налоговая ставка рассчитывается на основе платёжного адреса%1$s Сейчас налоговая ставка рассчитывается на основе адреса магазина%1$s + Изменить налоговые ставки в консоли Кнопка «Изменить налоговые ставки в консоли» + Налоги и налоговые ставки + Налоговые ставки для разных адресов можно изменить в консоли магазина. Налоги рассчитываются на основе сопоставления платёжного адреса, адреса доставки или адреса магазина с адресом, где действует налоговая ставка. Сведения о налоговых ставках Используя WooCommerce Payments, вы принимаете наши <a href=\'termsOfService\'><u>Условия предоставления услуг</u></a> и подтверждаете, что ознакомились с <a href=\'privacyPolicy\'><u>Политикой конфиденциальности</u></a>. <a href=\'learnMore\'><u>Подробнее</u></a> о подтверждении вашей информации на WooPayments. Начать настройку Партнёр WooPayments — платёжная система Stripe. Вы будете перенаправлены на сайт Stripe для регистрации. Мы попросим вас подтвердить сведения о вашем бизнесе и платёжные данные. + Уведомления WooPayments будут приходить на адрес эл. почты, указанный в вашей учётной записи WordPress.com. Хотите использовать новую учётную запись? <a href=\'learnMore\'><u>Подробности см. здесь.</u></a> Перед началом настройки 4–6 минут Примерное время настройки - Уведомления WooPayments будут приходить на адрес эл. почты, указанный в вашей учётной записи WordPress.com. Хотите использовать новую учётную запись? <a href=\'learnMore\'><u>Подробности см. здесь.</u></a> Управляйте платежами без усилий с помощью WooPayments — всё на одной консоли. Принимайте карты, платежи Apple Pay, очные платежи и более 135 валют — без платы за настройку и ежемесячное использование. Не удалось сохранить название магазина. Повторите попытку. Сохранение нового названия магазина… @@ -869,16 +882,16 @@ Language: ru Обновить название магазина Поздравляем! Вы успешно прошли настройку — ваша платёжная система готова к работе. Готово! + Управляйте платежами с помощью WooPayments — без платы за настройку и ежемесячное использование. Настройки учётной записи Выбрать категорию + Категория опасных веществ DHL Express. В настоящее время WooCommerce Shipping не поддерживает доставку опасных веществ через %1$s + Инструмент поиска опасных веществ USPS. С помощью %1$s выясните, можно ли доставить ваш товар по почте. www.usps.com/hazmat. Узнайте, как надежно упаковать, выполнить адресацию и доставить опасные вещества с помощью USPS® в %1$s - Управляйте платежами с помощью WooPayments — без платы за настройку и ежемесячное использование. - Категория опасных веществ - Инструмент поиска опасных веществ USPS. Вычислено на основе адреса доставки Вычислено на основе платёжного адреса Вычислено на основе адреса магазина @@ -886,16 +899,16 @@ Language: ru Общая сумма заказа Расчётный процент Расчётная сумма - Правильный выбор названия магазина может помочь в поисковой оптимизации. Название магазина + Правильный выбор названия магазина может помочь в поисковой оптимизации. Назовите магазин Включите NFC Посылка, небольшое количество (требуется маркировка) - Посылка с зажигающим устройством (разрешённым к перевозке) Наземное отправление, ограниченное количество: аэрозоли, дезинфицирующие спреи, аэрозольная краска, спреи для волос, пропан, бутан, чистящие средства и т. д. — Духи, лак для ногтей, жидкость для снятия лака для ногтей, растворители, антисептики для рук, медицинский спирт, продукты на основе этанола и т. д. — Другие поверхностные вещества в ограниченном количестве (косметика, бытовая химия, краски и т. д.) - Посылка с допустимым количеством (например, небольшой объём воспламеняющейся жидкости, коррозионно-активные, токсичные или экологически опасные вещества — требуется маркировка) + Посылка с зажигающим устройством (разрешённым к перевозке) Посылка с потребительскими товарами ID8000 — разрешённые для авиаперевозки потребительские товары ID8000 (невоспламеняющиеся аэрозоли, воспламеняющиеся горючие жидкости, токсичные вещества, опасные материалы) Опасные материалы, разрешённые только для наземной перевозки (для товаров, которые не перечислены, но их можно перевозить только по земле) + Посылка с допустимым количеством (например, небольшой объём воспламеняющейся жидкости, коррозионно-активные, токсичные или экологически опасные вещества — требуется маркировка) П. 6.2 — посылка с опасными веществами — биологические вещества (например, наборы для лабораторных анализов, материалы для анализа на COVID) П. 6.1 — посылка с токсичными веществами (средняя летальная доза 50 мн/кг и менее) (пестициды, гербициды и т. д.) П. 5.2 — посылка с органическими пероксидами @@ -920,33 +933,33 @@ Language: ru К потенциально опасным материалам относятся батарейки и аккумуляторы, сухой лёд, воспламеняющиеся жидкости, аэрозоли, боеприпасы, фейерверки, лаки для ногтей, парфюм, краски, растворители и т. д. Опасные товары должны находиться в отдельных упаковках. Содержит опасные вещества Введите название товара. - Переменная подписка Платформа электронной коммерции, которая растёт вместе с вами + Переменная подписка + Удалить купон Все любят скидки Вы не создали ни одного купона. Создайте купон, чтобы применить его к этому заказу. Перейти к купонам Выберите купон - Удалить купон + Не удалось создать купон Купон создан Создать Создать купон + Создать %1$s Изменить купон Создайте фиксированную скидку на выбранные товары - Не удалось создать купон - Создать %1$s Создайте фиксированную скидку на всю корзину Создайте скидку в процентах на выбранные товары Фиксированная скидка на товар Фиксированная скидка на сумму корзины Процент скидки - Создать купон - Добавить купон - Создать тестовый заказ - Оплатите заказ и дождитесь push-уведомления в приложении WooCommerce. Тип купона — фиксированный на товар Тип купона — фиксированный на корзину Тип купона — процент скидки + Создать купон + Добавить купон + Создать тестовый заказ Попробуйте вернуть средства за тестовый заказ в приложении + Оплатите заказ и дождитесь push-уведомления в приложении WooCommerce. Выберите тестируемый товар, добавьте его в корзину и оформите заказ в магазине, как настоящий покупатель. Нажмите кнопку ниже, чтобы перейти в онлайн-магазин в браузере. Оформите тестовый заказ @@ -962,23 +975,23 @@ Language: ru Помогите нам понять ваши решения в отношении подписки. Ваша обратная связь очень важна. Отсутствует адрес электронной почты Отсутствует ФИО + Поиск существующего клиента или Последнее обновление %s (обновление каждые 30 минут) Последнее обновление %s - Поиск существующего клиента или <a href=\'\'>Узнайте больше</a> о том, как принимать оплату в касание на Android Получение платежей Нельзя добавить товар, не указав цену Нельзя добавить неопубликованный товар добавить клиента - Отмена - Не удалось проверить код купона. Повторите попытку - Не удалось найти купон с таким кодом. Повторите попытку - Сумма (%1$s) Перейти в настройки + Отмена Разрешить Вы запретили доступ к камере. Он необходим, чтобы сканировать штрихкод. Предоставьте доступ в настройках приложения Разрешите доступ к камере, чтобы сканировать штрихкод Предоставьте доступ к камере + Не удалось проверить код купона. Повторите попытку + Не удалось найти купон с таким кодом. Повторите попытку + Сумма (%1$s) Скидка %1$s – %1$s Сумма скидки @@ -986,8 +999,8 @@ Language: ru Сумма (%1$s) Не удалось применить скидку вручную. Сначала удалите купоны Сумма скидки не является допустимым числом - Удалить скидку Скидка не может быть больше цены + Удалить скидку Текст кнопки Текст всплывающей подсказки. \n Может занимать несколько строк. Заголовок всплывающей подсказки @@ -999,8 +1012,8 @@ Language: ru Описание создано ИИ На основе ИИ. <a href=\'\'><u>Подробнее</u></a>. К сожалению, в вашей стране оплата в касание на Android пока не поддерживается. Следите за новостями! - Чтобы использовать оплату в касание на Android, требуется Android 10 или более новой версии. Чтобы принимать очные платежи, обновите Android или купите терминал с поддержкой Bluetooth. Чтобы использовать оплату в касание на Android, на устройстве должны быть установлены службы Google Play. Чтобы принимать очные платежи, установите службы Google Play или купите терминал с поддержкой Bluetooth. + Чтобы использовать оплату в касание на Android, требуется Android 10 или более новой версии. Чтобы принимать очные платежи, обновите Android или купите терминал с поддержкой Bluetooth. Чтобы использовать оплату в касание на Android, устройство должно быть оснащено модулем NFC. Чтобы принимать очные платежи, купите терминал с поддержкой Bluetooth. Оплата в касание недоступна См. требования @@ -1020,9 +1033,9 @@ Language: ru Сканировать штрихкод Имя пользователя Имя + Эл. почта Использованы купоны Другие настройки - Эл. почта Возможно, позже Написать снова Требуется PIN-код, но функция оплаты касанием пока не поддерживает его. Подумайте об использовании внешнего устройства чтения карт @@ -1031,19 +1044,22 @@ Language: ru Не удалось создать сообщение о публикации. Повторите попытку. Подробнее о функции ИИ Добавить дополнительное сообщение + Написание… Написать с помощью ИИ Продвигайте товары с помощью Blaze Blaze Доступен генератор контента на основе ИИ Продвигайте с помощью Blaze - Написание… Опубликовать товар Поздравляем! Вы стали на шаг ближе к открытию нового магазина. Первый товар создан 🎉 Система закрыла приложение Woo, когда оно работало в фоновом режиме. Вы можете попробовать зайти в него ещё раз. Система закрыла приложение Woo, когда оно работало в фоновом режиме. Вы можете попробовать зайти в него ещё раз. Карта извлечена слишком быстро + Товар с вариациями + В нашей политике конфиденциальности описано, как мы и другие поставщики используем файлы cookie и как вы можете ими управлять. Политика использования файлов cookie + Ваши сведения помогают нам повышать качество наших продуктов, ускорять их вывод на рынок и подстраивать WooCommerce под вас. Политика конфиденциальности При сохранении параметров конфиденциальности произошла ошибка. Сохранить @@ -1051,16 +1067,16 @@ Language: ru Помогите нам оптимизировать сервисы. Для этого мы собираем информацию о том, что пользователи делают в наших мобильных приложениях. Аналитика Управление конфиденциальностью - Товар с вариациями - В нашей политике конфиденциальности описано, как мы и другие поставщики используем файлы cookie и как вы можете ими управлять. - Ваши сведения помогают нам повышать качество наших продуктов, ускорять их вывод на рынок и подстраивать WooCommerce под вас. Ваша конфиденциальность очень важна для нас. Мы используем, храним и обрабатываем ваши личные данные, чтобы оптимизировать наше приложение (и вашу работу). В некоторых случаях ваши данные необходимы для работы системы, а в других случаях вы можете изменить в меню \"Настройки\" варианты их использования. Чтобы помочь нам повысить качество работы приложения и устранить возможные ошибки, включите автоматические отчёты о сбоях. + Сообщать о сбоях + Отчёты Узнайте больше о нашей политике конфиденциальности и политике использования файлов cookie. Политика конфиденциальности и политика использования файлов cookie Конфиденциальность Узнайте больше о данных, которые мы собираем в вашем магазине, и о том, как вы можете управлять передачей этих данных. Отслеживание использования + Для пользователей woocommerce.com доступны дополнительные опции конфиденциальности. Подробности см. здесь. Интернет-опции Дополнительные параметры конфиденциальности При обновлении настроек конфиденциальности произошла ошибка @@ -1068,29 +1084,26 @@ Language: ru Помогите нам оптимизировать сервисы. Для этого мы собираем информацию о том, что пользователи делают в наших мобильных приложениях. Аналитика Отслеживание - Система завершила работу приложения Woo в момент его работы в фоновом режиме. Вы можете попробовать зайти в него ещё раз. - Сбой сканирования. Повторите попытку позже - Сообщать о сбоях - Отчёты Мы заботимся о вашей конфиденциальности. Персональные данные используются для оптимизации мобильных приложений, улучшения защиты, а также аналитики и повышения удобства работы. + Система завершила работу приложения Woo в момент его работы в фоновом режиме. Вы можете попробовать зайти в него ещё раз. Невозможно добавить товар с вариациями напрямую. Выберите конкретную вариацию + Сбой сканирования. Повторите попытку позже Товар с артикулом %s не найден. Не удалось добавить в заказ - Для пользователей woocommerce.com доступны дополнительные опции конфиденциальности. Подробности см. здесь. Сбой сканирования. Повторите попытку позже Сканировать штрихкод Отправляя товары в страны, которые следуют таможенным правилам Европейского союза (ЕС), вы теперь должны точно и понятно описать каждую позицию. Так, при отправке одежды необходимо указать её тип (например, мужские рубашки, жилет для девочки, куртка для мальчика), чтобы описание было приемлемым. В ином случае может произойти задержка или приостановка доставки на таможне. Обратитесь в службу поддержки - Не удалось закрыть учётную запись Эту учётную запись нельзя закрыть, пока в ней есть активные магазины. При попытке закрыть учётную запись произошла ошибка. + Не удалось закрыть учётную запись Закрытие учётной записи… Навсегда закрыть учётную запись + Введите ваше имя пользователя для подтверждения закрытия Подтвердите закрытие учётной записи Закрыть учётную запись Сканируйте QR-код и следуйте инструкциям Сканируйте для оплаты Удалить купон из заказа - Введите ваше имя пользователя для подтверждения закрытия Купон (%1$s) –%1$s Добавить купон @@ -1099,9 +1112,9 @@ Language: ru Добавить товары с помощью сканера Закрыть Подробнее + Отправляя товары в страны, которые следуют таможенным правилам Европейского Союза (ЕС), вы должны точно и понятно описать каждую позицию. В ином случае может произойти задержка или приостановка доставки на таможне. Следите за обновлениями и повышайте безопасность магазина. Откройте возможности Jetpack. Уведомления о заказах и многое другое - Отправляя товары в страны, которые следуют таможенным правилам Европейского Союза (ЕС), вы должны точно и понятно описать каждую позицию. В ином случае может произойти задержка или приостановка доставки на таможне. Показать или скрыть список действий по настройке магазина Список действий по настройке магазина Вы можете снова посмотреть его в любое время, открыв «Меню > Настройки > Магазин» @@ -1119,10 +1132,10 @@ Language: ru Опция по умолчанию Опции компонентов Компоненты можно редактировать в веб-консоли. - Настройки компонентов - Компоненты %d компонента (-ов) 1 компонент + Настройки компонентов + Компоненты Нам нужно ваше разрешение, чтобы отправлять на ваше устройство push-уведомления о новых заказах, отзывах и прочем. Уведомления Составной товар @@ -1136,6 +1149,7 @@ Language: ru Увеличивайте продажи с помощью специальных предложений Просматривайте магазин Следите за новостями + Управляйте магазином через консоль Общее Настройки Товары в комплекте можно редактировать в веб-консоли. @@ -1146,7 +1160,6 @@ Language: ru Нет максимума Нет минимума Комплект - Управляйте магазином через консоль Количество в комплекте Максимальное количество Минимальное количество @@ -1179,32 +1192,32 @@ Language: ru Активно Вы можете редактировать подписки на товары в веб-консоли. Без пробного периода + Бесплатная регистрация Никогда не истекает + %1$s кажд. %2$s %3$s + Кажд. %1$d %2$s Кажд. %1$s Номер подписки%1$d Подписка OK - Подписка - Подписка - Бесплатная регистрация - %1$s кажд. %2$s %3$s - Кажд. %1$d %2$s От первой продажи до миллионной выручки: Woo — ваш помощник. Узнайте, почему продавцы построили на нашей платформе 3,4 млн. онлайн-магазинов. + Подписка Неправильный одноразовый код. Проверьте правильность введенных данных и повторите попытку. Сбой запроса SMS. Повторите попытку. Запрос SMS выполнен. Вам должно прийти сообщение с кодом. + Подписка Устройство чтения карт принимает платежи дебетовыми и кредитными картами. Их можно прикладывать, проводить или вставлять. Принимайте бесконтактные платежи прямо в телефоне. - Получение сайта… - Не удалось войти, поскольку не разрешается создавать пароль приложения. - Отправить отзыв Для получения платежей по карте используйте\nсвой телефон. Попробуйте прямо сейчас. - Загрузка… + Отправить отзыв + Не удалось войти, поскольку не разрешается создавать пароль приложения. + Получение сайта… Произошла ошибка при получении веб-сайта Повторите попытку, используя страницу консоли Войти - Действие вашей подписки завершено, и теперь вам доступны не все функции. + Загрузка… %s завершён + Действие вашей подписки завершено, и теперь вам доступны не все функции. %1$d дн. 1 день Загрузка… @@ -1217,11 +1230,13 @@ Language: ru Ошибка при получении сведений о плане Вы оформили подписку на %1$s! У вас есть доступ ко всем функциям до %2$s. У вас закончился пробный период, доступ к функциям ограничен. Подпишитесь на %1$s прямо сейчас. + У вас идёт %1$d-дневный бесплатный пробный период. Бесплатный пробный период закончится через %2$s. Перейдите на платную подписку для доступа к новым функциям магазина. Статус подписки Устранение неполадок Текущий: %s Сообщить о проблеме с подпиской Перейти на платную подписку + Осталось от пробного периода: %1$s. Конец пробного периода Пробный период закончился. Произошли неожиданные ошибки. @@ -1235,15 +1250,13 @@ Language: ru Назад в Мой магазин URL-адрес рекомендации Опубликовать мой магазин - Поиск доменов Чтобы запустить магазин, необходимо перейти на платный тарифный план. <u>Перейти</u> - У вас идёт %1$d-дневный бесплатный пробный период. Бесплатный пробный период закончится через %2$s. Перейдите на платную подписку для доступа к новым функциям магазина. - Осталось от пробного периода: %1$s. + Поиск доменов Не удалось войти. Код состояния: %1$s Не удалось войти, так как не удается найти URL-адрес администратора магазина Не удалось войти, так как не удается найти URL-адрес входа в магазин - Произошла ошибка. Повторите попытку позже. Не удалось войти из-за неожиданного ответа сайта. Мы работаем над этой проблемой. + Произошла ошибка. Повторите попытку позже. Для вашей учётной записи есть требования на утверждении. Чтобы получать очные платежи, выполните эти требования. Оцените ваши впечатления от работы с аналитикой Нравится аналитика? @@ -1286,31 +1299,31 @@ Language: ru Получение статуса Jetpack Что-то пошло не так. Повторите попытку позже. Попробуйте выполнить платёж - Регистрация доменного имени… - Выберите страну - Выберите округ/область Получение платежей по карте\nна вашем телефоне Оплата в касание ДЕЙСТВИЯ Во время регистрации домена произошла ошибка - Телефон - Код страны - Страна - Адрес - Адрес 2 - Город - Округ/Область - Область/округ (не доступно) - Почтовый индекс + Выберите округ/область + Выберите страну + Регистрация доменного имени… Зарегистрировать домен - Для вашего удобства, мы заполнили вашу контактную информацию WordPress.com. Пожалуйста, перепроверьте её на корректность, действительно ли вы хотите использовать её для этого домена. + Почтовый индекс + Область/округ (не доступно) + Округ/Область + Город + Адрес 2 + Адрес + Страна + Код страны + Телефон Организация (необязательно) - Владельцы доменов должны делиться контактной информацией для публичной базы данных по всем доменам. С защитой персональных данных мы публикуем нашу информацию вместо вашей и перенаправляем вам все сообщения приватным образом. - Регистрируя этот домен, вы соглашаетесь с нашими %1$sправилами и условиями%2$s - Введите правильный %s - Зарегистрировать как личный с защитой персональных данных - Зарегистрировать открыто + Для вашего удобства, мы заполнили вашу контактную информацию WordPress.com. Пожалуйста, перепроверьте её на корректность, действительно ли вы хотите использовать её для этого домена. Контактная информация домена + Зарегистрировать открыто + Зарегистрировать как личный с защитой персональных данных + Введите правильный %s + Регистрируя этот домен, вы соглашаетесь с нашими %1$sправилами и условиями%2$s + Владельцы доменов должны делиться контактной информацией для публичной базы данных по всем доменам. С защитой персональных данных мы публикуем нашу информацию вместо вашей и перенаправляем вам все сообщения приватным образом. Защита персональных данных Только администраторы магазина могут получить доступ к настройкам домена Или продолжите с помощью волшебной ссылки @@ -1343,11 +1356,11 @@ Language: ru Основной адрес сайта <a href=\'\'><u>Узнайте больше</u></a> о доменах и связанных с ними действиях. Поиск домена + Приобретённый домен будет перенаправлять пользователей на ваш основной адрес. Отправить заявку на домен На вашем тарифе можно бесплатно зарегистрировать домен на один год. Отправьте заявку на бесплатный домен Бесплатный адрес вашего магазина - Приобретённый домен будет перенаправлять пользователей на ваш основной адрес. Домены Больше не показывать Напомнить позже @@ -1369,19 +1382,19 @@ Language: ru Подождите Подготовка приложения для чтения карт… Приложение для чтения карт готово к работе + Устройство чтения карт Оплата в касание Коэффициент конверсии Сессии Нет сессий за этот период По сравнению с Домен - Устройство чтения карт Что такое пароли приложения? - Открыть страницу установки Кажется, на вашем сайте %1$s отключена функция паролей приложения.\n Включите её, чтобы использовать приложение WooCommerce. - Ответить - Ответ отправлен! + Открыть страницу установки При отправке ответа произошла ошибка + Ответ отправлен! + Ответить Выбрать всё Обновить цену Обновить статус @@ -1392,57 +1405,57 @@ Language: ru Все варианты уже созданы. нет вариантов для создания Выбрать несколько + Нет доступных доменов по этому запросу Создание вариантов Будет создан вариант для каждой возможной комбинации атрибутов (всего: %1$d) Создать все варианты? Текущее максимальное количество создаваемых вариантов: %1$d. Количество вариантов, которые можно создать для этого продукта: %2$d. Превышено максимальное количество вариантов Создание вариантов для всех комбинаций ваших атрибутов. + Создать все варианты Создайте один новый вариант. Вручную выберите, какие атрибуты относятся к варианту продукта. Добавить новый вариант Добавить вариацию - Создать все варианты - Нет доступных доменов по этому запросу Выйти без подключения Продолжить подключение - Обратитесь к менеджеру магазина или администратору. Попробуйте подключиться ещё раз, чтобы войти в магазин. Jetpack установлен, но не подключён. У вас нет разрешения на подключение Jetpack к этому магазину + Обратитесь к менеджеру магазина или администратору. Отменить установку Повторить авторизацию Повторить активацию Повторить установку Получить поддержку + Повторите попытку и обратитесь в службу поддержки, если эта ошибка произойдёт снова. Во время обмена данными с вашим веб-сайтом произошла ошибка. У вас нет разрешения на управление плагинами в этом магазине Ошибка при авторизации подключения к Jetpack Ошибка при активации Jetpack + Ошибка при установке Jetpack Подключить Jetpack Перейти в магазин Ошибка Код ошибки %1$s + Теперь ваш магазин <b>%1$s</b> подключён к Jetpack. Подождите, мы подключаем магазин <b>%1$s</b> к Jetpack. Jetpack установлен + Jetpack подключён Выполняется подключение Jetpack + Выполняется установка Jetpack Все готово Подключено Выполняется проверка Подключите магазин к Jetpack Активация - Ошибка при установке Jetpack - Теперь ваш магазин <b>%1$s</b> подключён к Jetpack. - Jetpack подключён - Выполняется установка Jetpack Выполняется установка Jetpack Войдите в <b>%1$s</b>, введя учётные данные магазина, чтобы подключить Jetpack. Войдите в <b>%1$s</b>, введя учётные данные магазина, чтобы установить Jetpack. - Повторите попытку и обратитесь в службу поддержки, если эта ошибка произойдёт снова. + Подготовьте учётные данные магазина. Подключите магазин к Jetpack, чтобы работать с ним в этом приложении. Установите бесплатный плагин Jetpack, чтобы работать с магазином в этом приложении. Создайте онлайн-магазин и начните продажи в кротчайшие сроки. Создайте свой первый магазин - Подготовьте учётные данные магазина. Случайно Никогда Всегда @@ -1450,8 +1463,8 @@ Language: ru Обновить смоделированное устройство чтения карт Подключить Jetpack Подключение магазина - Посетители Это место, где люди найдут вас в Интернете. Не беспокойтесь, вы сможете изменить это позднее. + Посетители Или войти с помощью пароля Симуляция устройства чтения карт отключена Смоделированный ключ устройства чтения @@ -1480,20 +1493,20 @@ Language: ru Нет доходов за указанный период Доход %1$s — %2$s - Учётная запись с этим адресом эл. почты уже существует. К сожалению, не удалось создать учётную запись с указанными учётными данными. Укажите другой адрес эл. почты. Указанный пароль не соответствует требованиям безопасности. Пароль должен быть более сложным. Пароль слишком короткий. Придумайте пароль, состоящий как минимум из шести символов. Введите допустимый адрес электронной почты. + Учётная запись с этим адресом эл. почты уже существует. Использовать другой адрес Произвольный период Произвольный + Что такое WordPress.com? + Создание учетной записи Выберите пароль Ваш адрес электронной почты - Создание учетной записи Начало работы \nчерез несколько минут Нажимая кнопку «Подключить Jetpack», вы принимаете <a href=\'terms\'>Условия предоставления услуг</a> и разрешаете <a href=\'sync\'>обмен данными</a> с WordPress.com. - Что такое WordPress.com? Включить симуляцию устройства чтения карт Чтобы использовать приложение, получите приглашение у владельца сайта, например у директора магазина или администратора. Подключение к сайту WordPress.com @@ -1510,10 +1523,10 @@ Language: ru На %1$s Невозможно загрузить данные Статистика WooCommerce за сегодня + Статистика магазина за сегодня Аналитика для магазина недоступна Чтобы просмотреть аналитику для магазина, перейдите на последнюю версию WooCommerce. Ваша сеть недоступна.\nПроверьте свои данные или соединение Wi-Fi. Войдите в приложение WooCommerce - Статистика магазина за сегодня Сбой получения данных о подключении… Проверка подключения Jetpack… Не удалось проверить подключение Jetpack. Повторите попытку. @@ -1533,43 +1546,44 @@ Language: ru Недавно на WooCommerce Произошла ошибка, обратитесь в службу поддержки Введите адрес сайта - Забыли пароль? Получить ссылку на вход по эл. почте + Забыли пароль? Мы заметили, что вы не закончили настройку очных платежей. <a href=\'\'>Продолжить настройку</a> - WC Admin - Войти с помощью адреса магазина - Другие сайты - Платежи из вкладки меню - Теперь можно быстро и просто получать доступ к очным платежам и другим функциям - Понятно! Платежи + Понятно! + Теперь можно быстро и просто получать доступ к очным платежам и другим функциям + Платежи из вкладки меню Ваш адрес электронной почты не используется с учётной записью WordPress.com. - Войти с учетными данными сайта - На вашу электронную почту отправлено письмо со специальной ссылкой. Перейдите по ней, чтобы войти. - Вход по специальной ссылке - Войти с паролем - Проверьте почту с этого устройства! + Другие сайты + Войти с помощью адреса магазина + WC Admin Только что мы отправили специальную ссылку на - Настроить - Совет - Что вы планируете делать в приложении WooCommerce? - Просто изучать функционал - Настраивать магазин - Создавать и обновлять продукты - Управлять заказами - Работать с несколькими магазинами - Похоже, %1$s не является сайтом WooCommerce. - Установить WooCommerce - Отметить как\nзавершена - Заказ № %1$d отмечен как выполненный - Ошибка обновления заказа № %1$d - Начните принимать платежи с помощью нашего терминала. Обучение работе с ним займет не больше 20 минут. - Добавьте связанные продукты, чтобы повысить продажи + Проверьте почту с этого устройства! + Войти с паролем + Вход по специальной ссылке + На вашу электронную почту отправлено письмо со специальной ссылкой. Перейдите по ней, чтобы войти. + Войти с учетными данными сайта Сделайте рекомендации полезными и актуальными: добавьте продукты для дополнительных и сопутствующих продаж. + Добавьте связанные продукты, чтобы повысить продажи + Начните принимать платежи с помощью нашего терминала. Обучение работе с ним займет не больше 20 минут. + Ошибка обновления заказа № %1$d + Заказ № %1$d отмечен как выполненный + Отметить как\nзавершена + Установить WooCommerce + Похоже, %1$s не является сайтом WooCommerce. + Работать с несколькими магазинами + Управлять заказами + Создавать и обновлять продукты Смотреть аналитику + Настраивать магазин + Просто изучать функционал + Что вы планируете делать в приложении WooCommerce? + Совет + Настроить Приступим! Войти на WordPress.com Связаться со службой поддержки + Войти с помощью учетной записи WordPress.com Обратитесь за помощью! Возникли проблемы со входом? Артикул @@ -1591,19 +1605,18 @@ Language: ru Простое и быстрое управление. Знаем, что это важно для бизнеса Недавно на WooCommerce - Войти с помощью учетной записи WordPress.com Новый заказ на 50 долл. в магазине WooCommerce Поступил новый заказ! 🎉 сведения Чтобы изменить все %1$s, откройте заказ в разделе администрирования WooCommerce Неполные данные %1$s. Отправить отчёт о состоянии системы + Копировать отчёт о состоянии системы в буфер обмена Продолжить поиск + Оплата при получении, заказ № %1$s для %2$s blog_id %3$s. Изменение платёжного сервиса - Ожидание платежа - Копировать отчёт о состоянии системы в буфер обмена Возвращенные средства: %1$s - Оплата при получении, заказ № %1$s для %2$s blog_id %3$s. + Ожидание платежа Продолжить установку Подготовка к установке Установить расширение @@ -1625,18 +1638,19 @@ Language: ru заблокирован Чтобы отредактировать сведения о товарах или оплате, измените статус на \"Ожидание оплаты\". В настоящий момент элементы этого заказа нельзя изменить - Клиенты не найдены Поиск по клиентам + Клиенты не найдены Не сейчас Добавить расширение в магазин - Воспользуйтесь пониженными тарифами на доставку. Пока доступно для служб DHL и USPS, но список расширяется! Что такое WooCommerce Shipping? + Воспользуйтесь пониженными тарифами на доставку. Пока доступно для служб DHL и USPS, но список расширяется! Пониженные тарифы Получите заказ, затем просто оплатите доставку, напечатайте этикетку, упакуйте и отправьте. Печатайте с телефона Не нужно гадать, куда делись почтовые марки. Оплачивайте почтовые сборы по мере необходимости Экономьте время и деньги + Выполняйте заказы с помощью WooCommerce Shipping Показать сведения Выбрать вариант %s Исключить товарные категории @@ -1650,6 +1664,7 @@ Language: ru Нет Редактировать товарные категории (%1$d) Выбрать товарные категории + Пока пакетное обновление поддерживается не более чем для 100 вариантов. Превышен лимит пакетного обновления Обновление обычных цен Обновление акционных цен @@ -1659,35 +1674,34 @@ Language: ru Текущие цены отличаются друг от друга Текущая цена: %s Цена для вариантов (%d) будет обновлена + Смешанный + Нет Акционная цена Обычная цена Цена Выберите значение для обновления Пакетное обновление ОК - Выполняйте заказы с помощью WooCommerce Shipping - Пока пакетное обновление поддерживается не более чем для 100 вариантов. Пакетное обновление… - Смешанный - Нет + Получение вариантов… Не удалось найти товарные категории Не удалось загрузить товарные категории Поиск категорий Очистить выбор Нажмите, чтобы снять флажок + Выбрать одну категорию Выбрать категории (%1$d) Товарные категории не найдены Выбрать категории - Нужна транспортная этикетка? - Получение вариантов… - Выбрать одну категорию Скрыть баннер с предложением установить WC Shipping Установить WooCommerce Shipping Печатайте транспортные этикетки с телефона, используя WooCommerce Shipping. + Нужна транспортная этикетка? + Измените количество товара с %1$d на %2$d Обновить обычную цену Обновить акционную цену - Измените количество товара с %1$d на %2$d Расширение WooCommerce Stripe не поддерживается в %1$s + Фильтр Очистить выбор Выбрать %d товар Выбрать товары (%d) @@ -1696,10 +1710,9 @@ Language: ru Изменить товары (%d) Все товары Выбрать товары + Включите это, если купон не следует применять к товарам на распродаже. Купоны на один товар применяются только в том случае, если товар не на распродаже. Купоны на одну покупку применяются только в том случае, если в корзине есть товары не по распродаже. Исключить товары со скидками Включите это, если купон нельзя применять вместе с другими купонами. - Включите это, если купон не следует применять к товарам на распродаже. Купоны на один товар применяются только в том случае, если товар не на распродаже. Купоны на одну покупку применяются только в том случае, если в корзине есть товары не по распродаже. - Фильтр Только для индивидуального использования Лимит пользователя Ограничить использование (до X элем.) @@ -1739,10 +1752,10 @@ Language: ru Не удаётся обновить продукт Произошла ошибка при применении возврата Применение возврата к заказу - Вычисленная сумма: %s - Скопировано в буфер обмена Изображение платёжного терминала + Вычисленная сумма: %s Вычислить в процентном соотношении + Скопировано в буфер обмена Только для клиентов с почтовыми адресами: %1$s Исключает товары со скидками Разрешает бесплатную доставку @@ -1774,12 +1787,12 @@ Language: ru Попробуйте другое средство возврата Возврат отклонён по неизвестной причине Не удалось обработать этот возврат - Копировать Возврат выполнен Обработка возврата Возместить платёж Возврат не выполнен Подготовка к возврату платежа + Копировать Поиск купонов Не удалось создать сообщение для отправки кода купона Ошибка при отправке кода купона. @@ -1804,35 +1817,35 @@ Language: ru Оформление заказа — %s Поделиться ссылкой на оплату Сумма + Сумма + Заказы со скидкой + Эффективность + Максимальный расход %s + Минимальный расход %s + Сводка по купонам Смотреть сводку по купонам + Мы разработали функцию, которая позволяет просматривать и редактировать купоны на вашем устройстве. Просмотр и редактирование купонов Купоны не найдены + %1$s без учёта %2$s + %1$s и %2$s всё Просрочен Активный Купоны Создано %s + %d дн. назад День назад + %d ч. назад Час назад + %d мин. назад Только что Рубрики: %d + %d рубрика \u2022 нет подтверждённых отзывов \u2022 один подтверждённый отзыв - %1$s (%2$s%%) - %d дн. назад - %d ч. назад - %d мин. назад - %d рубрика \u2022 подтверждённые отзывы: %d - Сумма - Заказы со скидкой - Эффективность - Максимальный расход %s - Минимальный расход %s - Сводка по купонам - Мы разработали функцию, которая позволяет просматривать и редактировать купоны на вашем устройстве. - %1$s без учёта %2$s - %1$s и %2$s + %1$s (%2$s%%) Мы работаем над функцией, которая поможет создавать заказы на вашем устройстве! Вы можете попробовать эту функцию, нажав кнопку «+» Зайдите позже, чтобы узнать больше советов и идей по развитию вашего магазина Поздравляем, вы прочитали все примечания! @@ -1841,26 +1854,26 @@ Language: ru Счётчик: %s Купоны Закрыть - Вызовы XML-RPC на этом сайте заблокированы (код ошибки 401). Если войти не удалось, нажмите на значок справки, чтобы открыть часто задаваемые вопросы. Возникла проблема при подключении к сайту. Получен код ошибки HTTP 401. + Вызовы XML-RPC на этом сайте заблокированы (код ошибки 401). Если войти не удалось, нажмите на значок справки, чтобы открыть часто задаваемые вопросы. Не удалось найти веб-сайт WordPress по этому URL-адресу. Нажмите на значок справки, чтобы открыть часто задаваемые вопросы. Сервисы XML-RPC на этом сайте отключены. Чтобы отправить запрос в службу поддержки, не используйте почту Automattic Мы не поддерживаем счета Stripe, зарегистрированные в %1$s + Расширение WooCommerce Payments не поддерживается в %1$s Нажмите кнопку питания на устройстве чтения Чек отправлен получателю: <strong>%s</strong> Процент (%) - Расширение WooCommerce Payments не поддерживается в %1$s Убрать комиссию из заказа Убрать доставку из заказа Доставка Добавить метод доставки Добавить доставку Имя + Сумма Сборы Информация о клиенте Добавить комиссию - Сумма Изменить примечание клиента Изменить сведения о клиенте Изменить статус заказа @@ -1881,8 +1894,8 @@ Language: ru Очные платежи будут работать только с одним из следующих активированных плагинов. Для продолжения обратитесь к администратору сайта, чтобы деактивировать один из следующих плагинов: Очные платежи будут работать только с одним из следующих активированных плагинов. Для продолжения деактивируйте один из следующих плагинов: Обнаружены конфликтующие плагины оплаты - или Общая сумма налогов + или Установить Jetpack В настоящее время очные платежи недоступны Заказ создан @@ -1953,7 +1966,9 @@ Language: ru Добавить другой адрес доставки В наличии %s в наличии + Добавить товары Товары + Добавить сведения о клиенте Клиент Отметить как оплаченный Заказ будет создан и отмечен как оплаченный, если вы получили платеж не через WooCommerce @@ -1961,8 +1976,6 @@ Language: ru Выберите способ оплаты Налоги рассчитываются автоматически на основе адреса магазина Налог (%s%%) - Добавить сведения о клиенте - Добавить товары Получить оплату (%s) Удержать налоги Индивидуальная сумма @@ -2013,21 +2026,21 @@ Language: ru Отсутствует разрешение на поиск устройств поблизости Фильтровать страны Фильтровать округа/области + Округ/область Дата окончания Дата начала Выберите даты Произвольный период Создание заказа с минимумом информации + Платёж без хлопот Создание нового заказа вручную Создать заказ + Создать заказ Введите сумму Получить оплату - Аналитика - Округ/область - Платёж без хлопот - Создать заказ Платёж без хлопот Создавайте заказы на своём устройстве! + Аналитика Все готово Подключение вашего магазина Активация @@ -2074,14 +2087,14 @@ Language: ru Фильтры (%d) Фильтры Период + Статус заказа Выбранный вариант фильтрации Период + Статус заказа Все Показать заказы Отфильтрованные заказы Все заказы - Статус заказа - Статус заказа Расскажите нам больше о %s… Опишите товар для потенциальных покупателей… Серийный номер терминала, скопированный в буфер обмена @@ -2111,8 +2124,8 @@ Language: ru Данные о состоянии системы Теперь вы можете получать платежи с банковских карт через WooCommerce Payments! Принимайте платежи с помощью устройств чтения карт - ОК Количество должно быть не менее %1$s + ОК Новое изображение значка функции Переключиться на другой магазин Сбой при обновлении продукта %1$s @@ -2153,10 +2166,10 @@ Language: ru Не удалось автоматически проверить почтовый адрес: %s Не удалось автоматически проверить адрес происхождения. Чтобы убедиться в правильности адреса, найдите его на Google Maps. Мы стараемся упростить процедуру просмотра дополнений к товару с вашего устройства. В настоящее время вы можете просматривать дополнения для своих заказов. Такие дополнения можно создавать и редактировать в веб-консоли. - Сохранить Просмотрите дополнения на своём устройстве! В случае переименования дополнения в веб-консоли следует отметить, что предыдущие заказы больше не будут показывать данное дополнение в приложении. Просмотреть дополнения + Сохранить Загрузить подробности (%d) Не удалось загрузить несколько файлов (%d) Не удалось загрузить %d файл @@ -2175,47 +2188,47 @@ Language: ru Транспортные этикетки приобретены! Напечатать транспортные этикетки Очные платежи + Чтобы полностью зарядить устройство чтения, требуется приблизительно три часа. + Следите за уровнем заряда устройства чтения. + Ваше устройство чтения перейдет в спящий режим через 10 минут неактивности. Чтобы подключить его повторно, просто нажмите кнопку питания. Автоматическое повторное подключение + Для получения платежей просто проведите пальцем, коснитесь экрана или вставьте карту в устройство чтения. + Проведите пальцем, коснитесь экрана или вставьте карту. Поздравляем, теперь вы можете получать платежи по дебетовым и кредитным картам! Устройство чтения подключено Нужна какая-то помощь? <a href=\'\'>Обратиться в службу поддержки</a> <a href=\'\'>Подробнее</a> о приёме платежей с помощью мобильного устройства и заказе устройств чтения карт Очные платежи недоступны в тестовом режиме. Чтобы продолжить, отключите режим. В настоящее время очные платежи недоступны - Чтобы полностью зарядить устройство чтения, требуется приблизительно три часа. - Следите за уровнем заряда устройства чтения. - Ваше устройство чтения перейдет в спящий режим через 10 минут неактивности. Чтобы подключить его повторно, просто нажмите кнопку питания. - Для получения платежей просто проведите пальцем, коснитесь экрана или вставьте карту в устройство чтения. - Проведите пальцем, коснитесь экрана или вставьте карту. Для вашей учётной записи существуют требования на утверждении. Выполните эти требования к %1$s, чтобы продолжать получать очные платежи. Для вашей учётной записи WooCommerce Payments существуют требования на утверждении. Для вашей учётной записи существует по крайней мере одно просроченное требование. Пожалуйста, выполните его, чтобы возобновить очные платежи. В настоящее время очные платежи недоступны Вы сможете получать очные платежи, как только мы завершим проверку вашей учётной записи. + В настоящее время очные платежи недоступны К сожалению, мы не можем поддерживать очные платежи для этого магазина. Перезагрузите после обновления В вашем магазине установлена устаревшая версия расширения WooCommerce Payments. Обновите его, чтобы получать очные платежи. Обновить WooCommerce Payments - В настоящее время очные платежи недоступны Почти готово. Завершите настройку WooCommerce Payments, чтобы начать принимать очные платежи. + Закончите настройку WooCommerce Payments в учётной записи администратора магазина. Обновите после активации + В вашем магазине версия расширения WooCommerce Payments установлена, но не активирована. Активируйте её, чтобы получать очные платежи. Активировать WooCommerce Payments Обновите после установки + Вам будет нужно установить бесплатное расширение WooCommerce Payments в своём магазине, чтобы получать очные платежи. Установить WooCommerce Payments <a href=\'\'>Подробнее</a> о приёме платежей с помощью мобильного устройства и заказе устройств чтения карт Нужна какая-то помощь? <a href=\'\'>Обратиться в службу поддержки</a> + Вы можете по-прежнему принимать очные наличные платежи, если включите способ оплаты \"Оплата при доставке\" в магазине. + Очные платежи по карте не поддерживаются в %1$s + Подключение к вашей учётной записи Очные платежи + Проверьте размеры и вес посылки или выберите другую посылку в разделе сведений о посылках. Тарифы доставки недоступны Все доступные посылки активированы Активация посылки Выберите посылку для активации. - Закончите настройку WooCommerce Payments в учётной записи администратора магазина. - В вашем магазине версия расширения WooCommerce Payments установлена, но не активирована. Активируйте её, чтобы получать очные платежи. - Вам будет нужно установить бесплатное расширение WooCommerce Payments в своём магазине, чтобы получать очные платежи. - Вы можете по-прежнему принимать очные наличные платежи, если включите способ оплаты \"Оплата при доставке\" в магазине. - Подключение к вашей учётной записи - Проверьте размеры и вес посылки или выберите другую посылку в разделе сведений о посылках. - Очные платежи по карте не поддерживаются в %1$s Обязательное поле Закрыть Создан вариант @@ -2224,11 +2237,11 @@ Language: ru Создать вариант Теперь, добавив атрибуты, вы можете создать свой первый вариант. Атрибуты созданы + Выполнено: %1$s%% Не рекомендуется отменять текущее обновление ПО Не удалось выполнить этот платеж Нет подключения к серверу Нет подключения к Интернету - Выполнено: %1$s%% Отправить в оригинальной упаковке Добавить в новую упаковку Эта позиция в настоящее время включена в %s. Куда вы хотите переместить её? @@ -2239,6 +2252,7 @@ Language: ru Не удалось создать упаковку. Повторите попытку. Не удалось создать упаковку: неизвестная проблема с API. Не удалось создать упаковку: %1$s + Пожалуйста, подождите… Создаётся новая упаковка Неверное значение. Обязательное поле @@ -2252,11 +2266,10 @@ Language: ru Коробка Выбрать тип упаковки Тип упаковки + Настройте упаковку, которую вы будете использовать для отправки своих товаров. Мы сохраним её для последующих заказов. Добавить новую упаковку Создать новую упаковку Размеры упаковки должны быть больше нуля. Чтобы продолжить, обновите размеры позиции в разделе \"Доставка\" на странице товара. - Настройте упаковку, которую вы будете использовать для отправки своих товаров. Мы сохраним её для последующих заказов. - Пожалуйста, подождите… Оригинальная упаковка Размеры позиции Индивидуально доставляемая позиция @@ -2269,11 +2282,11 @@ Language: ru Не удалось проверить наличие обновлений ПО <a href=\'\'>Подробнее</a> о приеме мобильных платежей и заказе устройств чтения карт Включить Bluetooth + Не подключено устройство чтения Не удалось подключиться к устройству чтения Подключиться Найдено несколько устройств чтения Заказ уже оплачен - Не подключено устройство чтения Спасибо за покупку! Перейдите по ссылке ниже, чтобы получить чек.\n\n%s Ошибка загрузки таможенной формы Печать таможенного счета-фактуры @@ -2289,11 +2302,12 @@ Language: ru Добавить товар Атрибуты вариантов Включите Bluetooth на мобильном устройстве + Ошибка при загрузке заказа. Состояние заказа в приложении могло устареть. Ваша квитанция от %s Обновление заказа Обновление состояния приложения Ваш клиент выбрал %1$s - Ошибка при загрузке заказа. Состояние заказа в приложении могло устареть. + Для таможенных форм требуется 10-значный телефонный номер Таможенная форма заполнена При наличии проблем с печатью с устройства обратитесь в службу поддержки вашего принтера. Если печать недоступна, можно всегда сохранить квитанцию в формате PDF и отправить её по электронной почте, чтобы распечатать с другого устройства. @@ -2306,7 +2320,6 @@ Language: ru Чтобы создать вариант, необходимо сначала задать атрибуты (например, «Цвет» или «Размер»). 1 вариант Вариантов: %1$s - Для таможенных форм требуется 10-значный телефонный номер Отслеживание USPS Обновление ПО устройства чтения Обновление ПО @@ -2316,6 +2329,7 @@ Language: ru Чтобы принимать платежи, обновите ПО устройства чтения Обновить ПО устройства чтения Заряд %s%% + ПОДКЛЮЧЁННОЕ УСТРОЙСТВО ЧТЕНИЯ Подключение устройства чтения карт Включите устройство чтения и расположите его рядом с мобильным устройством Убедитесь, что устройство чтения заряжено @@ -2344,10 +2358,12 @@ Language: ru Атрибутика Страна производства или сборки товара Страна происхождения + Тарифный код должен включать шесть цифр Тарифный код HS (необязательно) Описание Содержимое посылки Необходимо указать номер ITN для посылок в %1$s. + Номер ITN необходимо указывать для посылок стоимостью более 2500 долл. США за тарифный код Недопустимый формат Сведения об ограничениях Сведения о содержимом @@ -2355,20 +2371,17 @@ Language: ru Тип содержимого Вернуть отправителю в случае невозможности доставки до %s - ПОДКЛЮЧЁННОЕ УСТРОЙСТВО ЧТЕНИЯ - Тарифный код должен включать шесть цифр - Номер ITN необходимо указывать для посылок стоимостью более 2500 долл. США за тарифный код Если вы включите этот параметр, клиент получит эл. письмо с подтверждением, когда заказ будет выполнен Просмотр заказа + Заказ 🎉 завершён! + Проверка роли… Неверная роль пользователя Подробнее о ролях и разрешениях Это приложение поддерживает только роли администратора и менеджера магазина. Свяжитесь с владельцем магазина для изменения роли. Добавляйте новые товары и редактируйте существующие откуда угодно - Пропустить - Заказ 🎉 завершён! - Проверка роли… Управляйте заказами и редактируйте их на ходу Отслеживайте продажи и узнавайте, какие товары пользуются спросом + Пропустить Внешний товар Сгруппированный товар Вариативный товар @@ -2377,6 +2390,9 @@ Language: ru Простой физический товар Открыть настройки Открыть настройки + Bluetooth отключен + Определение местоположения отключено + Отсутствует разрешение на определение точного местоположения Не удалось подключиться к устройству чтения. Подключение к устройству чтения Подключиться к устройству чтения @@ -2384,10 +2400,9 @@ Language: ru Поиск устройств чтения Количество позиций Создать новую транспортную этикетку - Bluetooth отключен - Определение местоположения отключено - Отсутствует разрешение на определение точного местоположения + Простой виртуальный продукт Хотите удалить этот вариант? + Создание варианта Удаление продукта Отправить квитанцию Печать квитанции @@ -2401,16 +2416,14 @@ Language: ru Не удалось просмотреть транспортную этикетку. Установите приложение для просмотра PDF-файлов и повторите попытку. Мы не смогли найти сайт WordPress по указанному вами адресу. Убедитесь, что WordPress установлен, и что вы используете самую последнюю версию. несколько строк данных доставки - Простой виртуальный продукт - Создание варианта Не удалось отметить заказ как выполненный Возникла ошибка при покупке этикеток Пожалуйста, подождите… Покупка этикеток + Изображения этикеток сроком более 180 дней удаляются нашими технологическими партнерами в целях обеспечения общей безопасности и конфиденциальности данных. Напечатать транспортную этикетку Сохранить для последующего использования Транспортная этикетка приобретена! - Изображения этикеток сроком более 180 дней удаляются нашими технологическими партнерами в целях обеспечения общей безопасности и конфиденциальности данных. Возврат стоимости этикеток со сроком более 30 дней не производится. Тип Переименовать @@ -2431,17 +2444,18 @@ Language: ru Только владелец сайта может управлять способами оплаты транспортных этикеток. Чтобы управлять способами оплаты, свяжитесь с владельцем магазина %1$s (%2$s). Добавить варианты Добавить вариант + Создайте первый вариант Итого %s Выбрано %s ставок Подходит для бесплатной подписи Подходит для бесплатного самовывоза + Страхование (%s) + отслеживание Включает %s Требуется подпись совершеннолетнего лица (%s) Требуется подпись (%s) - Страхование (%s) - отслеживание Клиент оплатил %1$s из %2$s за доставку. - Создайте первый вариант + При покупке транспортных этикеток через WooCommerce вы сэкономите от 5 до 40 % по сравнению с тарифами почты. Что такое скидка WooCommerce Services? При загрузке вариантов доставки произошла ошибка. Перевозчики и тарифы @@ -2459,7 +2473,6 @@ Language: ru Укажите имя каждой опции и нажмите клавишу Enter или коснитесь существующей опции. Название опции - При покупке транспортных этикеток через WooCommerce вы сэкономите от 5 до 40 % по сравнению с тарифами почты. Ошибка при сохранении настроек Пожалуйста, подождите… Сохранение настроек @@ -2482,15 +2495,18 @@ Language: ru Добавить атрибут Атрибуты Редактировать атрибуты + Общий вес посылок: %1$s %2$s Число товаров в посылках (%2$d): %1$d Общий вес посылок: %1$s %2$s Специальные посылки Не удаётся получить данные о товарах + Некоторые обязательные поля не заполнены. Неверный вес Выбранная посылка Пожалуйста, подождите… Загрузка посылок! Посылка %1$d + %d элементов Не удаётся загрузить определения посылок Включает вес посылок Общий вес посылок (%1$s) @@ -2503,17 +2519,16 @@ Language: ru Мы немного изменили введённый адрес. Если всё правильно, используйте предложенный адрес для доставки по назначению. Редактировать выбранный адрес Использовать выбранный адрес - Некоторые обязательные поля не заполнены. - Общий вес посылок: %1$s %2$s - %d элементов Загрузка адреса Доступны новые функции! + Найти на карте Связаться с клиентом Недопустимая улица Не указан номер дома Адрес не найден Не удалось автоматически проверить почтовый адрес. Укажите его на Google Картах или свяжитесь с клиентом и убедитесь, что адрес указан верно. Сбой проверки адреса + Пожалуйста, подождите… Выполняется проверка адреса Не удалось загрузить данные адреса Использовать введённый адрес @@ -2524,8 +2539,6 @@ Language: ru Телефон Компания Имя - Пожалуйста, подождите… - Найти на карте Приложение \"Google Карты\" найдено Пожалуйста, подождите… Удаление изображений вариантов продуктов поддерживается в версии WooCommerce 4.7 и более поздних. @@ -2541,30 +2554,31 @@ Language: ru Сведения об упаковке Создание почтового бланка Узнать больше + Сократите очередь на почте, распечатывая транспортные этикетки дома с мобильного устройства со скидкой! Экономьте время и деньги, выполняя заказы с помощью WooCommerce Shipping WooCommerce Shipping Отметить заказ как выполненный + Узнать больше о распечатке этикеток с вашего мобильного устройства Создание почтового бланка - Создавайте транспортные этикетки со своего устройства! Теперь вы можете создавать транспортные этикетки для всех физических заказов прямо со своего устройства с помощью бесплатного плагина WooCommerce Shipping. Нажмите \"Создать транспортную этикету\", чтобы попробовать новую бета-функцию! - Сократите очередь на почте, распечатывая транспортные этикетки дома с мобильного устройства со скидкой! - Узнать больше о распечатке этикеток с вашего мобильного устройства - Правка + Создавайте транспортные этикетки со своего устройства! Сборы Чистая выплата Платно Дополнительные сведения о подключении Jetpack + Правка Подтвердить Перетащите фотографии, чтобы изменить их порядок - Удалить Настройки загрузки Введите правильное имя Введите URL-адрес файла + Библиотека файлов WordPress Убедитесь, что введен допустимый URL-адрес Пожалуйста, подождите… Загрузка файлов Ошибка загрузки файлов Добавьте скачиваемый файл + Добавьте скачиваемый файл из Добавлять к покупкам скачиваемый файл Отмена Да, изменить @@ -2573,6 +2587,7 @@ Language: ru Файл Удалить файл? Загружаемый товар + Удалить Срок действия для загрузок Лимит загрузок Введите количество дней, по окончанию которых ссылка на скачивание перестанет работать, или оставьте пустым, если срок действия не указан @@ -2587,13 +2602,11 @@ Language: ru Возможно, нужно <b>настроить печать по Wi-Fi на самом принтере</b>. Убедитесь, что микропрограммное обеспечение принтера обновлено, и ознакомьтесь с документацией принтера. Можно выбрать для принтера <b>службу печати по умолчанию</b> или установить <b>приложение от производителя принтера</b> (здесь должен появиться рекомендованный вариант). Убедитесь, что ваши принтер и устройство подключены к <b>одной сети Wi-Fi</b> - Добавьте скачиваемый файл из - Библиотека файлов WordPress + Оцените новую простую процедуру создания связанных и сгруппированных продуктов, которая готова к запуску Увеличивайте продажи благодаря продаже дополнительных и связанных продуктов Изменить товары Добавить товары Продукты, которые будут предложены пользователю в дополнение к выбранному продукту в корзине - Оцените новую простую процедуру создания связанных и сгруппированных продуктов, которая готова к запуску Кросселы Продукты, которые будут предложены пользователю вместо просматриваемого в настоящий момент продукта (например, более прибыльные продукты) Апсейл @@ -2601,6 +2614,7 @@ Language: ru %1$s%2$s x %3$s Получить ссылку для входа по email Не получается найти учётную запись WordPress.com для этого адреса email. + Протестируйте наши дополнительные модули заказов в процессе подготовки к запуску Создание продуктов Параметры Не удалось отправить продукт в корзину @@ -2612,25 +2626,24 @@ Language: ru Добавление опций, например размера и цвета, сейчас возможно только в Интернете. Эти варианты будут показаны на странице продукта на вашем сайте. Создавайте продукты в приложении! Продукт не найден + Если вам по-прежнему не удается выполнить печать со своего устройства, вы можете <b>сохранить этикетку в формате PDF</b> и отправить ее по эл. почте, чтобы распечатать с другого устройства. + Нажав <b>«Напечатать транспортную этикетку»</b>, можно выбрать и добавить принтер, если ранее вы не выполняли печать с этого устройства. Варианты формата этикетки + Печать с устройства Этикетка (4 x 6 in) Letter (8,5 x 11 in) Legal (8,5 x 14 in) Не удалось выполнить предварительный просмотр транспортной этикетки + Не знаете, как печатать с помощью мобильного устройства? См. макет этикетки и варианты размера бумаги Напечатать транспортную этикетку Выбрать размер бумаги Размер бумаги + Если вы уже использовали этикетку в посылке, ее распечатка и повторное использование является нарушением наших условий предоставления услуг. Если при печати купленной этикетки произошла ошибка, можно распечатать ее еще раз. Мы стараемся упростить процедуру печати этикеток с устройства. Сейчас, если вы создали этикетки для этого заказа в разделе администрирования магазина с помощью WooCommerce Shipping, их можно распечатать из описания заказа (здесь). Печатайте транспортные этикетки со своего устройства! - Печать с устройства - Если вы уже использовали этикетку в посылке, ее распечатка и повторное использование является нарушением наших условий предоставления услуг. - Если вам по-прежнему не удается выполнить печать со своего устройства, вы можете <b>сохранить этикетку в формате PDF</b> и отправить ее по эл. почте, чтобы распечатать с другого устройства. - Нажав <b>«Напечатать транспортную этикетку»</b>, можно выбрать и добавить принтер, если ранее вы не выполняли печать с этого устройства. Напечатать транспортную этикетку - Протестируйте наши дополнительные модули заказов в процессе подготовки к запуску - Не знаете, как печатать с помощью мобильного устройства? \u0022%1$s\u0022 Черновик товара сохранен Ошибка сохранения черновика товара @@ -2678,12 +2691,12 @@ Language: ru Войдите с помощью другой учетной записи Выберите магазин для подключения Продолжить с WordPress.com + Товар с вариантами исполнения, например по цвету или размеру %d товар выбран %d тов. выбрано Добавление товаров в группу Добавить товар Введите пароль - Товар с вариантами исполнения, например по цвету или размеру Назад в магазин Свяжитесь с нами Обратите внимание, что это не заявка в службу поддержки и мы не сможем ответить на ваш отзыв.\n\nНужна какая-то помощь? %1$s @@ -2718,24 +2731,24 @@ Language: ru При добавлении метки произошла ошибка Добавление метки Запрос на возврат средств обрабатывается. Пожалуйста, подождите… + Запрос на возврат средств отправлен Вернуть оплату почтового бланка (-%1$s) Сумма, доступная для возврата Дата покупки + Вы можете запросить возврат средств за неиспользованный почтовый бланк Обработка займет от 14 дней. Запросить возврат средств Вернуть средства за почтовый бланк - Вы можете запросить возврат средств за неиспользованный почтовый бланк Обработка займет от 14 дней. - Запрос на возврат средств отправлен Физический Краткое описание товара Используйте метки, чтобы товары было проще искать Объедините продукты в группы - Отключено Добавить вес и размеры Добавить другие сведения Организуйте свои товары с помощью меток Добавьте первую метку Метки Добавить метку + Отключено Виртуальный товар Добавить другие сведения %1$s товар @@ -2743,7 +2756,9 @@ Language: ru %s товар Оставшиеся товары %1$s \u2022 %2$s + Запрошен возврат оплаты транспортной этикетки %1$s Отследить посылку + %1$s\n%2$s Скрыть сведения о доставке Показать сведения о доставке Банковская карта @@ -2753,8 +2768,6 @@ Language: ru Доставка в Доставка из Посылка %d - %1$s\n%2$s - Запрошен возврат оплаты транспортной этикетки %1$s Артикул: %1$s %1$s (%2$s пар.) Транспортные этикетки @@ -2775,8 +2788,8 @@ Language: ru Заявление о защите конфиденциальности для пользователей из Калифорнии Сохранить изменения До %1$s - Доступны новые опции редактирования Появилось больше возможностей редактирования товаров. Теперь можно изменять изображения, пользоваться предварительным просмотром и делиться товарами. + Доступны новые опции редактирования Доступны ограниченные возможности редактирования Товары %1$s x %2$s @@ -2870,11 +2883,11 @@ Language: ru Ширина Длина Продукты, по которым возвращены средства + %1$s (%2$s x %3$d) %1$s с помощью %2$s Вы уверены, что хотите вернуть деньги? Это действие нельзя отменить. Продукты, по которым возвращены средства Возврат оплаты - %1$s (%2$s x %3$d) Подписаться на WordPress.com К сожалению, результаты по запросу \"%s\" не найдены Получайте высококачественные отзывы о продуктах в вашем магазине @@ -2895,32 +2908,33 @@ Language: ru Добавить запасы Просмотр информации о ваших заказах… Введите текст + Введите название товара + Товар сохранён Ошибка обновления продукта Пожалуйста, подождите… Опишите продукт Описание Редактировать описание - Введите название товара - Товар сохранён - Готово Отменить изменения? Обновить + Готово Идет возврат средств, подождите… Верните средства за доставку Выбрать количество Возврат средств за доставку Возврат средств за продукты + %1$s x %2$s каждый Выбрано элементов: %d Ничего не выбирать Выбрать все Ожидается подтверждение возврата средств… - %1$s x %2$s каждый Изменять размер и сжимать изображения для ускорения загрузки Оптимизация изображений Сделать фото Выбрать с устройства Выберите способ загрузки Загрузки + Загрузка изображений…%1$d из %2$d Загрузка изображения… Нет доступа к камере Вы уверены, что хотите удалить это изображение? @@ -2935,7 +2949,6 @@ Language: ru Добавить изображение Ближайшие Удалить - Загрузка изображений…%1$d из %2$d Не удалось получить доступ к вашему сайту. Возможно, потребуется обратиться в техподдержку службы хостинга, чтобы решить эту проблему. Не удалось получить доступ к вашему сайту: возникла проблема с <b>сертификатом SSL</b>. Возможно, потребуется обратиться в техподдержку службы хостинга, чтобы решить эту проблему. Не удалось получить доступ к вашему сайту: необходимо выполнить <b>проверку подлинности HTTP</b>. Возможно, потребуется обратиться в техподдержку службы хостинга, чтобы решить эту проблему. @@ -2944,8 +2957,8 @@ Language: ru Войдите с именем пользователя и паролем для сайта. Войдите с именем пользователя и паролем для сайта %1$s Отправить письмо с подтверждением - Редактирование продукта Оцените новые возможности редактирования, пока мы готовим их к запуску + Редактирование продукта При загрузке вашей учетной записи произошла ошибка. Повторите попытку сейчас или закройте и попробуйте позже. Произошла ошибка. Войдите, чтобы продолжить. Подключение к сайту… @@ -2980,12 +2993,12 @@ Language: ru Нет соответствующих товаров В этом списке пока нет товаров %s в наличии + В наличии \u2022 %d вар. Изображение продукта Пользователь %1$s оставил отзыв на %2$s Не одобрен Ошибка при получении нового отзыва о товаре Ошибка при получении отзывов о товарах - В наличии \u2022 %d вар. В процессе возврата что-то пошло не так. Повторите попытку. Средства возвращены заказчику. Запрос на возврат средств за %s обрабатывается. Пожалуйста, подождите… @@ -3019,12 +3032,12 @@ Language: ru Статистика за сегодня Войти Уже есть Jetpack? %1$s + Попытка входа через Jetpack… обновите приложение, чтобы продолжить + Чтобы использовать это приложение для %1$s, настройте плагин Jetpack и подключите его к этой учетной записи. \n\nПосле настройки перезагрузите приложение Попробуйте другой магазин База данных переведена на более раннюю версию, идет повторное создание таблиц и загрузка магазинов Загрузка магазинов - Попытка входа через Jetpack… - Чтобы использовать это приложение для %1$s, настройте плагин Jetpack и подключите его к этой учетной записи. \n\nПосле настройки перезагрузите приложение Перевозчики не найдены Введите адрес сайта полностью, например example.com. Нет обзоров! @@ -3035,11 +3048,12 @@ Language: ru Не удалось получить параметры: некоторые API недоступны для этой пары идентификатора приложения OAuth и учетной записи. Есть вакансии! Копировать номер отслеживания - обновите приложение Поиск WooCommerce… + обновите приложение Адрес не указан Не можете вспомнить адрес эл. почты, указанный при регистрации? Расположенный по этому адресу веб-сайт не имеет отношения к платформе WordPress. Чтобы подключиться к нему, необходимо установить WordPress. + Войдите на WordPress.com, чтобы подключиться к <b>%1$s</b> Зимбабве Замбия Йемен @@ -3176,7 +3190,6 @@ Language: ru Ямайка Кот-д\'Ивуар Италия - Войдите на WordPress.com, чтобы подключиться к <b>%1$s</b> Израиль Остров Мэн Ирландия @@ -3283,15 +3296,24 @@ Language: ru Афганистан Аландские острова Обзор + Другой перевозчик Другая + Пожалуйста, введите название компании-перевозчика Введите номер отслеживания + Пожалуйста, выберите перевозчика Отменить отслеживание? Не удалось добавить отслеживание Отслеживание посылки добавлено + Ошибка получения данных о перевозчиках + Выбранный перевозчик + Перевозчики Дата отправки Введите ссылку на отслеживание + Введите название компании-перевозчика Введите номер отслеживания + Выберите перевозчика Ссылка на отслеживание (не обязательно) + Название компании-перевозчика Номер отслеживания Компания-перевозчик Добавить отслеживание @@ -3304,25 +3326,19 @@ Language: ru Отследить посылку Чтобы узнать, какой адрес эл. почты вы использовали для подключения к WordPress.com, в режиме управления сайтом в %1$sконсоли Jetpack%2$s перейдите в %3$sПодключения > Подключение учетных записей%4$s Какой адрес эл. почты я использую для входа? + Не можете вспомнить адрес электронной почты? Jetpack — это бесплатный плагин WordPress с дополнительными инструментами, которые обеспечивают удобное управление магазином с мобильных устройств и доступ к расширенным возможностям, например push-уведомлениям и статистике. Что такое Jetpack? Открыть список подключенных магазинов - Продолжить редактирование - Другой перевозчик - Пожалуйста, введите название компании-перевозчика - Пожалуйста, выберите перевозчика - Ошибка получения данных о перевозчиках - Выбранный перевозчик - Перевозчики - Введите название компании-перевозчика - Выберите перевозчика - Название компании-перевозчика Похоже, что %1$s подключён к другой учётной записи WordPress.com. - Не можете вспомнить адрес электронной почты? + Продолжить редактирование Please log in with your username and password. Войдите, используя имя пользователя WordPress.com вместо адреса электронной почты. The site at this address is not a WordPress site. For us to connect to it, the site must use WordPress. Help Center + Виртуальный + Сборный + С вариантами Allow, but notify customer Разрешить Do not allow @@ -3330,9 +3346,6 @@ Language: ru Out of stock In stock Читать далее - Сборный - С вариантами - Виртуальный Не удалось загрузить изображение Черновик Личный @@ -3378,11 +3391,11 @@ Language: ru Попробовать Понятно Нажмите, чтобы переключиться между магазинами + Выбрать магазин Выйти Изменить статус заказа Нажмите, чтобы изменить статус заказа Применить - Выбрать магазин Нет, спасибо Позже Оценить сейчас @@ -3420,15 +3433,15 @@ Language: ru Оповещения об обзоре товаров Оповещения о новом заказе Заказчику + Проверка сайта… Инструкции по обновлению Поиск - Проверка сайта… Обновить и еще %d. Новых уведомлений: %d + Версия %s Условия предоставления услуг WooCommerce для Android - Версия %s Имя Лицензии на ПО с открытым исходным кодом О приложении @@ -3454,9 +3467,9 @@ Language: ru Отчёты об отказах Поделиться Версия %s - Слишком много попыток отправить СМС-код проверки, отдохните и запросите снова через пару минут. - Ни одна учетная запись WordPress.com не совпадает с этой записью в Google. - Войдите в учетную запись WordPress.com, с которой был подключен Jetpack. + Пароль для HTTP-авторизации + Имя для HTTP-авторизации + Требуется авторизация Магическая ссылка отослана Email регистрация Проверка кода @@ -3465,9 +3478,32 @@ Language: ru Вход по магической ссылке Вход по адресу сайта Вход по email адресу - Еще нет учетной записи? %1$sЗарегистрируйтесь%2$s - Регистрация через Google… + Произошла ошибка + Пожалуйста, введите код авторизации для продолжения. + Пожалуйста, перепроверьте свой пароль для продолжения. + Вход остановлен + Пожалуйста подождите пока авторизуемся. + Вход … + Нажмите чтобы продолжить. + Вход успешен! + Возникла ошибка сети. Проверьте ваше подключение и попробуйте снова. + Укажите сайт WordPress.com или автономный сайт с подключённым модулем Jetpack + Не удалось подключиться. При попытке подключиться к конечной точке XMLRPC вашего сайта мы получили\n ошибку 403. Это необходимо для обмена данными между приложением и вашим сайтом. Свяжитесь с хостинг-провайдером, чтобы решить\n эту проблему. + Не удалось подключиться. Ваш хостинг-провайдер блокирует запросы POST, которые нужны приложению\n для обмена данными с вашим сайтом. Свяжитесь с хостинг-провайдером, чтобы решить эту проблему. + Не удалось подключиться. На сервере отсутствуют необходимые методы XML-RPC. + Убедитесь, что введен допустимый URL-адрес сайта + Произошла ошибка + Забыли пароль? + Введите правильный email адрес + Проверка адреса эл. почты + Войдите заново для продолжения. + Войдите в учетную запись WordPress.com, с которой был подключен Jetpack. + Не удалось загрузить профиль. + Обнаружена копия сайта. + Этот сайт уже существует в приложении, его нельзя добавить. + Имя пользователя или пароль введены неверно Google отвечает слишком долго. Возможно вам стоит подождать пока ваше подключение к Интернет станет лучше. + Регистрация через Google… Зарегистрироваться через Google Зарегистрироваться с адресом Email Регистрируясь, вы соглашаетесь с нашими %1$sПравилами пользования%2$s. @@ -3477,54 +3513,20 @@ Language: ru Возникла проблема при отправке почты. Вы можете повторить сейчас или закрыть и попробовать еще раз позже. Для создания новой учетной записи WordPress.com, пожалуйста введите ваш адрес email. Возникла ошибка проверки адреса email. - Произошла ошибка - Пожалуйста, введите код авторизации для продолжения. - Пожалуйста, перепроверьте свой пароль для продолжения. - Вход остановлен - Пожалуйста подождите пока авторизуемся. - Вход … - Нажмите чтобы продолжить. - Вход успешен! - Процесс входа в Google не может быть запущен. - Пожалуйста, введите пароль \nВозможно попробуете другую учетную запись? + Процесс входа в Google не может быть запущен. + Слишком много попыток отправить СМС-код проверки, отдохните и запросите снова через пару минут. Возникла ошибка подключения к учетной записи Google. + Ни одна учетная запись WordPress.com не совпадает с этой записью в Google. Закрыть Войти через Google. - Возникла ошибка сети. Проверьте ваше подключение и попробуйте снова. Вы вошли как Не удалось определить ваш почтовый клиент + Еще нет учетной записи? %1$sЗарегистрируйтесь%2$s Введите проверочный код. - Обнаружена копия сайта. - Этот сайт уже существует в приложении, его нельзя добавить. - Не удалось подключиться. При попытке подключиться к конечной точке XMLRPC вашего сайта мы получили\n ошибку 403. Это необходимо для обмена данными между приложением и вашим сайтом. Свяжитесь с хостинг-провайдером, чтобы решить\n эту проблему. - Не удалось подключиться. Ваш хостинг-провайдер блокирует запросы POST, которые нужны приложению\n для обмена данными с вашим сайтом. Свяжитесь с хостинг-провайдером, чтобы решить эту проблему. - Проверка адреса эл. почты - Не удалось подключиться. На сервере отсутствуют необходимые методы XML-RPC. - Не удалось загрузить профиль. - Войдите заново для продолжения. - Забыли пароль? - Имя пользователя или пароль введены неверно - Введите правильный email адрес - Произошла ошибка - Требуется авторизация - Убедитесь, что введен допустимый URL-адрес сайта - Пароль для HTTP-авторизации - Имя для HTTP-авторизации - Укажите сайт WordPress.com или автономный сайт с подключённым модулем Jetpack - Альтернативно: - Общее - \@%s - Войти с именем пользователя. - Войти с адресом вашего сайта. - Пришлите мне другой код. - Мы послали текстовое сообщение на телефонный номер оканчивающийся на %s. Пожалуйста введите проверочный код из SMS. - Чтобы войти через эту учетную запись Google, пожалуйста укажите соответствующий пароль WordPress.com. Это запрашивается только один раз. - Войдите в WordPress.com чтобы поделиться содержимым. - Введите адрес вашего сайта WordPress, на который вы хотите поделиться содержимым. - Ошибка при открытии веб-браузера по умолчанию. Выберите другое приложение: - Не удаётся открыть ссылку + Пожалуйста, введите пароль Введите имя пользователя + Войдите в WordPress.com чтобы поделиться содержимым. Чтобы получить доступ к записи, войдите на WordPress.com. При добавлении сайта произошла ошибка. Код ошибки: %s Проверка адреса сайта @@ -3533,15 +3535,25 @@ Language: ru Какой адрес у моего сайта? Как найти адрес своего сайта? Адрес сайта + Введите адрес вашего сайта WordPress, на который вы хотите поделиться содержимым. \@%s Вы уже вошли на WordPress.com Продолжить + Подключить сайт Подключить ещё один сайт + Чтобы войти через эту учетную запись Google, пожалуйста укажите соответствующий пароль WordPress.com. Это запрашивается только один раз. Введите свой пароль на WordPress.com. + В настоящий момент ссылка недоступна. Введите пароль Выполняется запрос электронного письма со ссылкой для входа Похоже, пароль введён неправильно. Проверьте правильность введенных данных и повторите попытку. Выполняется запрос на получение проверочного кода в SMS-сообщении. + Пришлите мне другой код. Пришлите мне сообщение с кодом. + Мы послали текстовое сообщение на телефонный номер оканчивающийся на %s. Пожалуйста введите проверочный код из SMS. + Почти готово! Введите проверочный код для WordPress.com из приложения Authenticator. + Войти с именем пользователя. + Войти с адресом вашего сайта. + Альтернативно: Открыть почту Вперед Управляйте сайтом, созданным с помощью Jetpack, где угодно — WordPress можно всегда носить с собой. @@ -3549,39 +3561,29 @@ Language: ru Следите за обновлениями любимых сайтов и присоединяйтесь к беседе в любом месте и в любое время. Наблюдайте, как пользователи со всего света читают ваш сайт и общаются на нем в реальном времени. Публикуйте записи, гуляя в парке. Ведите блог из автобуса. Отправляйте комментарии из-за столика в кафе. WordPress можно брать с собой повсюду! - Вы уже вошли в учетную запись WordPress.com. Вы не можете добавить сайт WordPress.com, привязанный к другой учетной записи. - Повторить попытку - Выйти - Отправить ссылку - В настоящий момент ссылка недоступна. Введите пароль - Вход в систему + Войти + Помощь + Пароль + Имя Введите пароль. - Адрес электронной почты - Подробнее - Назад + Отправить ссылку Неверный код подтверждения Код подтверждения - Помощь - Отменить - Войти - Имя - Пароль - Без заголовка - Настройки - Сегодня - Отмена + Адрес электронной почты Поддержка WooCommerce для Android %s флажок не установлен флажок установлен Политика сторонней организации Политика использования файлов cookie Политика конфиденциальности + Сделано с любовью компанией Automattic. %1$s Мы используем и другие средства сбора информации, в том числе средства сторонних разработчиков. Ознакомьтесь с этими средствами и способами управления ими. Ознакомьтесь с политикой конфиденциальности Эти сведения помогают нам улучшать продукты, предлагать более полезную рекламу, настраивать WooCommerce согласно вашим предпочтениям и решать другие задачи. Дополнительную информацию см. в политике конфиденциальности Отправлять информацию об использовании сервисов во время работы в учётной записи WordPress в службу аналитики Собирать информацию Настройки конфиденциальности + Настройки Статус заказа Средства возвращены Отменён @@ -3595,6 +3597,7 @@ Language: ru Добавить Отправить примечание клиенту по электронной почте Ошибка при изменении заказа + Ошибка при получении примечаний Заказ отмечен как выполненный Отметить заказ как выполненный Добавить примечание к заказу @@ -3603,6 +3606,7 @@ Language: ru Показать платёжные сведения Платёж погашен Примечания к заказу + Личный Составить примечание к заказу Изображение профиля клиента Примечание клиента @@ -3616,6 +3620,7 @@ Language: ru отправить клиенту эл. письмо Платёжные сведения Сведения о доставке + Заказ №%s %1$s %2$s Информация о клиенте Фильтр @@ -3626,6 +3631,8 @@ Language: ru Заказов нет Просмотреть заказы Просмотреть заказ + Нет активности за этот период + Всего заказов: %s Изображение ошибки Ошибка при получении данных Доход @@ -3639,28 +3646,41 @@ Language: ru Нет магазинов WooCommerce Фотография в вашем профиле Подключенный магазин + Ознакомьтесь с %1$sинструкциями по настройке%2$s. Для подключения к вашему магазину этому приложению требуется Jetpack. + \@%s Введите адрес магазина WooCommerce, к которому требуется подключиться. Для управления магазинами WooCommerce выполните вход, указав адрес электронной почты своей учётной записи WordPress.com. + Вы уже вошли в учетную запись WordPress.com. Вы не можете добавить сайт WordPress.com, привязанный к другой учетной записи. + Не удаётся открыть ссылку Не найдено приложение для отправки SMS Не найдено приложение для отправки электронных писем Не найдено приложение для звонков + Ошибка при открытии веб-браузера по умолчанию. Выберите другое приложение: Не удаётся открыть ссылку + %1$s в %2$s Больше месяца назад Больше недели назад Больше двух дней назад Вчера Сегодня Товары + Отменить В этом году В этом месяце На этой неделе + Сегодня Товар Ваша сеть недоступна. Проверьте свои данные или соединение Wi-Fi. Не в сети u2014, используются кэшированные данные Подробнее + Отмена + Без заголовка Продолжить + Назад + Повторить попытку Скрыть подробности + Подробнее Скидка Подытог Налоги @@ -3671,18 +3691,11 @@ Language: ru %1$s%2$s Заказы Мой магазин + Выйти + Вход в систему Все + Общее WooCommerce - %1$s в %2$s - Заказ №%s - Сделано с любовью компанией Automattic. %1$s - Личный - Подключить сайт - Нет активности за этот период - Всего заказов: %s - Ошибка при получении примечаний - Ознакомьтесь с %1$sинструкциями по настройке%2$s. - Почти готово! Введите проверочный код для WordPress.com из приложения Authenticator. @string/date_timeframe_custom @string/date_timeframe_today diff --git a/WooCommerce/src/main/res/values-sv/strings.xml b/WooCommerce/src/main/res/values-sv/strings.xml index 3baa4d86e5e..d53d30710cb 100644 --- a/WooCommerce/src/main/res/values-sv/strings.xml +++ b/WooCommerce/src/main/res/values-sv/strings.xml @@ -1,11 +1,27 @@ + Ett fel uppstod när variationer hämtades + \"Det gick inte att ladda fler objekt. Försök igen.\" + Tillbaka + %1$d variationer + Variation %s, Pris %s + Variabel produkt%s, Pris %s + Beskrivning kan inte vara tom + Uppmaning till åtgärd + Slogan kan inte vara tom + Kontrollera att din e-postadress är korrekt och dubbelkolla din skräppostmapp. + Vi hittar inget konto hos WordPress.com som är kopplat till det här användarnamnet. Du kan ange en e-postadress för att skapa ett nytt konto. + Ange en streckkod eller en annan identifierare som är unik för den här produkten. Det kan vara till hjälp om du ska lista produkten på andra kanaler eller marknadsplatser. + GTIN, UPC, EAN, ISBN + SISTA UTBETALNINGEN + När du har köpt en fraktsedel markerar du ordern som slutförd och meddelar kunden. + Om du inte har något konto så använder vi den här e-postadressen för att skapa ett. Kuvert Låda Lägg till paket @@ -15,33 +31,32 @@ Language: sv_SE Längd Pakettyp Sparad + Fraktbolag + Anpassat + Begär återbetalning Schemalägg upphämtning Spåra leverans Lär dig hur man skriver ut från din mobila enhet - Begär återbetalning - Fraktbolag - Anpassat Obs: Återanvändning av en utskriven fraktetikett är ett brott mot våra användarvillkor och kan leda till åtal. Härifrån kan du skriva ut fraktetiketten igen eller ändra storlek på fraktetiketten. Din fraktetikett är klar att skrivas ut. Du kan bara redigera den här beställningen på webben, eftersom den använder %1$s och din webbplats valuta är %2$s + Frakttjänst Snabbast Billigast - Frakttjänst Köp etikett Köp etikett · %1$s - Välj ett paket - Beställningsdetaljer - Markera denna beställning som slutförd och avisera kunden Fraktkostnad + Beställningsdetaljer Försändelseinformation Ange paketets mått eller välj ett paketalternativ från transportören för att se tillgängliga fraktavgifter. Välj ett paket för att få fraktavgifter + Välj ett paket Skickar du farliga artiklar eller farligt material? - %1$s  ·  %2$s Minimera/maximera artikelkortet - Nej + %1$s  ·  %2$s Sorterad efter 1%s + Nej Spara mitt val för framtida kampanjer <b>Bra för:</b> %s Välj mål %s @@ -56,11 +71,11 @@ Language: sv_SE 4. Din kund trycker sitt kort mot baksidan av din telefon. HTML Text - Anpassade fält - Visa och redigera anpassade fält - Visa och redigera anpassade fält Växla mellan text- och HTML-redigerare När ändringar av anpassade fält sparas träder de i kraft omedelbart. + Visa och redigera anpassade fält + Visa och redigera anpassade fält + Anpassade fält Kopiera värde Kopiera nyckel Produktfoto @@ -71,24 +86,24 @@ Language: sv_SE Nyckeln används redan för ett annat anpassat fält.\nAppen har för närvarande inte stöd för att skapa dubbletter av nycklar. Använd WP-admin för att duplicera en nyckel om det behövs. Lägg till anpassade fält Anpassat fält borttaget - Skanning misslyckades. Försök igen senare + Misslyckades att spara ändringar, försök igen Ändringar sparade Sparar ändringar - Misslyckades att spara ändringar, försök igen Det verkar som att du inte är ansluten till internet. Kontrollera att ditt Wi-Fi är på. Se till att mobildata är aktiverat i dina enhetsinställningar om du använder detta. + Skanning misslyckades. Försök igen senare Värde Nyckel Andra produkttyper, till exempel rörliga och virtuella, kommer att bli tillgängliga i framtida uppdateringar. + Endast enkla fysiska produkter kan användas med POS just nu. Avbryt Varaktighet Kampanj kommer köras tills du stoppar den. Specificera varaktigheten - Endast enkla fysiska produkter kan användas med POS just nu. till %1$s Schema Dagligt belopp - %1$s ➔ %2$s Hur mycket vill du spendera på din kampanj, och hur länge ska den köras? + %1$s ➔ %2$s Visa upp dina produkter för miljontals människor med Blaze och öka din försäljning Funderar du på hur du kan öka din försäljning? Det gick inte att läsa in anpassade fält @@ -96,35 +111,35 @@ Language: sv_SE Nedtonad bakgrund. Tryck för att avfärda dialogrutan. %1$s per vecka Kör tills jag stoppar den + Pågående från %1$s + veckobelopp %1$s per vecka, från och med %2$s Per vecka Återstående Totalt Klick Det verkar som att din enhet är i strömsparläge. \nVI kan inte tillhandahålla din butiksinformation medan det är aktiverat - Pågående från %1$s - veckobelopp - Meny inaktiverad - Meny aktiverad - Kortläsare ansluten - Kortläsare inte ansluten. Dubbeltryck för att ansluta Popup-meny med alternativ. Svep för att navigera bland objekt. Öppna verktygsfältsmeny - Verktygsfält med kortläsarstatus. Dubbeltryck för att interagera. Verktygsfält med kortläsarstatus. Menyn är öppen. Dubbeltryck för att interagera. + Verktygsfält med kortläsarstatus. Dubbeltryck för att interagera. + Meny inaktiverad + Meny aktiverad + Kortläsare inte ansluten. Dubbeltryck för att ansluta + Kortläsare ansluten Nedtonad bakgrund. Tryck för att stänga menyn. Bockmarkeringsikon för lyckad betalning Ta bort den här varan från varukorgen - Dubbeltryck för att lära dig mer - Stäng - Öka din försäljning Eventuella pågående beställningar kommer att gå förlorade. Lämna Försäljningsplatsläge? + Stäng Nedtonad bakgrund. Tryck för att avfärda dialogrutan. Dubbeltryck för att avfärda dialogrutan Dialogruta – endast enkla produkter + Dubbeltryck för att lära dig mer Banner – endast enkla produkter Marknadsför dina produkter med Blaze-annonser och öka din försäljning nu. + Öka din försäljning Ta emot betalningar i farten En felaktig PIN-kod har angetts. Försök igen eller använd en annan betalningsmetod Meny @@ -135,30 +150,30 @@ Language: sv_SE Ny beställning OK + Skapa en beställning i butikshantering + För att ta betalt för en icke-enkel produkt, lämna POS och skapa en ny beställning från fliken Beställningar. Varför kan jag inte se mina produkter? Info Stäng + Läs mer Endast enkla fysiska produkter är kompatibla med POS just nu. Andra produkttyper, till exempel rörliga och virtuella, kommer att bli tillgängliga i framtida uppdateringar. Visar endast enkla produkter - För att ta betalt för en icke-enkel produkt, lämna POS och skapa en ny beställning från fliken Beställningar. - Läs mer Webbplatsadress - Lägg till betald kampanj Google för WooCommerce + Lägg till betald kampanj Öka försäljningen och generera mer trafik med Google Ads. Google-kampanjer Klar Din nya kampanj har skapats. Spännande tider väntar för din försäljning! + Redo att köra! Kunde inte skapa beställning Försök igen - Det gick inte ladda in produkter - Redo att köra! Ikon som indikerar fel Vill du försöka igen? + Det gick inte ladda in produkter POS stöder för närvarande bara enkla produkter POS stöder för närvarande bara enkla produkter – \nskapa en för att komma igång. - Inga produkter Inga produkter som stöds hittades + Inga produkter Skaffa support Anslut din läsare Foto borttaget @@ -168,35 +183,36 @@ Language: sv_SE Klick Visningar Konvertering - Total försäljning Belopp + Total försäljning Nyckeltal Total försäljning: %1$s Belopp: %1$s Filtrera urval Varukorg är tom - %d artiklar Tryck på en produkt för att\nlägga till den i varukorgen Det gick inte att hämta summor. + %d artiklar Misslyckades att ladda upp den valda produktbilden. <b>Bra förfrågan!</b> Du har gett oss tillräckligt att arbeta med, men du kan lägga till mer information för att få ännu bättre resultat. - <b>Lägg till fler detaljer.</b> Ju fler detaljer du anger, desto bättre blir dina genererade detaljer. <b>Bra förfrågan!</b> Var gjordes den? <b>Det blir bättre.</b> Kan du beskriva passformen och eventuella särdrag hos varan? + <b>Lägg till fler detaljer.</b> Ju fler detaljer du anger, desto bättre blir dina genererade detaljer. Lägg till din produkts namn och viktiga funktioner, fördelar eller information som hjälper kunder att hitta den online. + Välj nästa alternativ + Välj föregående alternativ Generera igen Ångra redigeringar Alternativ %1$d av %2$d - Välj föregående alternativ - Välj nästa alternativ Visa alla kampanjer Skapa kampanj Klick Visningar - Öka försäljningen och generera mer trafik med Google Ads - Google Ads-kampanjer Betalkampanjsresultat Marknadsför dina produkter i Google Sök, Google Shopping, Youtube, Gmail med mera. + Öka försäljningen och generera mer trafik med Google Ads + Google Ads-kampanjer + Inget Inget telefonnummer Postnummer Ort @@ -205,6 +221,7 @@ Language: sv_SE Registreringsdatum Användarnamn Genomsnittligt beställningsvärde + Totalt spenderat belopp Beställningar Senast aktiv Plats @@ -212,68 +229,62 @@ Language: sv_SE Faktureringsadress Registrering Beställningar + Kund Inga produkter Kunder Få kundinsikter Kunder + Det gick inte att skanna texten från fotot. Försök igen Skannar bild Foto valt - Inget - Totalt spenderat belopp - Kund - Det gick inte att skanna texten från fotot. Försök igen Ta bort foto Byt ut foto Visa foto Namn, sammanfattning och beskrivning - Program Du kan redigera eller återskapa din produktinformation innan du sparar. - Inga program under den här perioden + Program Google-kampanjer + Inga program under den här perioden Anslut nu Varukorg Generera produktdetaljer Läs text från produktfoto Till exempel: Svart t-shirt i bomull, mjukt tyg, slitstarka sömmar, unik design + Berätta för oss om din produkt, vad det är och vad som gör produkten unik, och låt sedan AI:n göra sitt jobb. Startinformation Låt oss generera produktinformation åt dig - Berätta för oss om din produkt, vad det är och vad som gör produkten unik, och låt sedan AI:n göra sitt jobb. + Ta emot kortbetalning Totalt + Momser Delsumma Betalning lyckades Betalning misslyckades. Försök igen. Varukorgsikon Produkter + %d artikel + Rensa + Öka försäljningen och generera mer trafik med Google Ads Google för WooCommerce Inga regler för antal - Öka försäljningen och generera mer trafik med Google Ads - Ta emot kortbetalning - Rensa - %d artikel - Momser Målgrupp Avbryt Avsluta Avsluta POS - Kassa Ta bort %s från varukorg - Lägg till nya sektioner - Inga produkter hittades för den valda lagerstatusen - Läsare ansluten - Avsluta POS + Kassa Läsarens status okänd Kassa + Läsare ansluten + Avsluta POS + Lägg till nya sektioner + Inga produkter hittades för den valda lagerstatusen Det gick inte att läsa in lagerrapporten Ingen vara såld de senaste 30 dagarna %d varor sålda de senaste 30 dagarna - Lågt lager - Dela din feedback - Letar du efter fler insikter? - Produkter - Lagernivåer - Status Försäljningsplatsläge + Lågt lager FRAKT + Dela din feedback Gör Woo frakt enkelt? Frakt tillagd. Redigera frakt @@ -283,95 +294,99 @@ Language: sv_SE Markera beställningen som slutförd Registrera transaktionsinformation i beställningsanteckning Lägg till nya sektioner för att anpassa din butikshanteringsupplevelse + Letar du efter fler insikter? + Produkter + Lagernivåer + Status Behöver du fortfarande hjälp? Kontakta oss + Det går inte att hämta rapporten över användning av rabattkoder + Ingen användning av rabattkoder under denna period Visa alla rabattkoder Användningar Rabattkoder Lager Visa alla meddelanden - N/A - Det går inte att hämta rapporten över användning av rabattkoder - Ingen användning av rabattkoder under denna period Det gick inte att läsa in toppresterande produkter - Mest aktiva rabattkoder - Kontanter mottagna + N/A Växel + Kontanter mottagna + Mest aktiva rabattkoder Ta emot betalning (%s) - Status - Visa alla beställningar Visa alla recensioner + Inga recensioner matchar det valda filtret, testa att ändra filter Inga recensioner hittades + Status De senaste recensionerna De senaste beställningarna - Inga recensioner matchar det valda filtret, testa att ändra filter + Visa alla beställningar Öppna listrutan för filter Rensa överordnad kategori Fel vid hämtning av produkter! + Välj en fraktmetod + Frakt Namn Metod - Metod - Ogiltigt värde - Frakt Lägg till frakt - Välj en fraktmetod Det gick inte att hämta dina fraktmetoder. Försök igen - Anpassa + Metod + Ogiltigt värde Konfigurera din butik + Anpassa Visa alla kampanjer Föreslagen produkt Försök att läsa in det här kortet igen. Om problemet kvarstår, <a href=\"support\">kontakta supporten</a>. + Kan inte ladda data Dölj %s Slutförd Feedback - Kan inte ladda data - Vi kan inte visa din\n butiks analys Se till att du kör den senaste versionen av WooCommerce på din webbplats och att du har WooCommerce Analytics aktiverat. - Inte tillgänglig - Anpassad + Vi kan inte visa din\n butiks analys Visa alla uppgifter Sessionsanalysen bygger på antalet unika besökare, vilket inte är tillgängligt för anpassade datumintervall Sessionsdata ej tillgänglig + Inte tillgänglig Prestanda + Anpassad Ändra datumintervall-knapp Bilderna är inte tillgängliga, eftersom din webbplats är satt som Privat. Du kan ändra detta genom att växla till läget Kommer snart.\n Kortval för analys Avbryt Avsluta ändå - Ogiltig bild - Inga anslutningsproblem Det verkar som att du inte har godkänt appanslutningen än. Är du säker på att du vill lämna sidan? + Välj en bild med en minsta storlek på 400x400 pixlar + Ogiltig bild Det verkar som att användarnamnet eller lösenordet som du angav är felaktigt. Dubbelkolla dina autentiseringsuppgifter och försök igen. Om dina data fortfarande inte laddas, kontakta vårt supportteam för att få hjälp. - Välj en bild med en minsta storlek på 400x400 pixlar + Inga anslutningsproblem Gå tillbaka till föregående skärm Försök ansluta igen Ansluter till din webbplats Vi kan inte ansluta till WordPress.com för tillfället.\n\nFörsök igen om några minuter, eller kontakta vårt supportteam så hjälper vi dig. + Vänta medan vi försöker identifiera ditt anslutningsproblem. Felsök anslutning Presentkort Använt - Vänta medan vi försöker identifiera ditt anslutningsproblem. Inga presentkort denna period Kontakta support Fortsätt Om du stöter på problem, kontakta vårt supportteam. - Vi kunde inte logga in i din butik - Lägg till ett anpassat belopp 3. När anslutningen är klar kommer du att loggas in i din butik. 2. När du uppmanas till det, godkänn anslutningen genom att trycka på bekräftelseknappen. 1. Börja med att logga in med dina webbplatsautentiseringsuppgifter. Följ dessa steg för att ansluta Woo-appen direkt till din butik med ett applikationslösenord. Detta kan bero på att din butik har några extra säkerhetssteg på plats. + Vi kunde inte logga in i din butik Din beställningsinformation kommer att visas här när du har gjort en beställning. Ingen beställningsinformation än + Lägg till ett anpassat belopp För att ange ett betalningsbelopp, lägg till\nett anpassat belopp till din nya beställning. Vi har kombinerat betalningsmottagning med\nbeställningsskapande för förbättrad åtkomst\noch mer kraft. + Ta emot betalning \nhar flyttat Paket Paket sålda Paket Paket sålda Blaze-kampanjer - Ta emot betalning \nhar flyttat Toppresterande Är du säker på att du vill kassera ändringarna som du har gjort för den här produkten? Du är på väg att kassera ändringarna för %s @@ -381,129 +396,129 @@ Language: sv_SE Prenumerationer Prenumerationer Tolkar förhandsgranskning … + Ett fel uppstod vid inläsningen av installerade tillägg + Hanteras automatiskt Inaktivt Uppdatering tillgänglig (%s) + Uppdaterat + Butiksnamn Tar bort kategori Uppdaterar kategori + Fel vid borttagning av kategori Produktkategori borttagen Produktkategori uppdaterad - Butiksnamn Det gick inte att ladda domänförslag - Ett fel uppstod vid inläsningen av installerade tillägg - Hanteras automatiskt - Uppdaterat - Fel vid borttagning av kategori Förslag Skriv en domän Välj en domän + Visa alla butiksanalyser En gång om året En gång i månaden En gång i veckan En gång om dagen + En gång i timmen + %s intervall Anslut en annan butik Starta en ny butik Butiksnamn - En gång i timmen - %s intervall - Visa alla butiksanalyser Vänta … Uppdateringar lagerstatus Något gick fel. Försök igen. + Uppdaterade lagerstatusar Variabla produkter kan inte uppdateras Hanterade produkter kan inte uppdateras - Uppdaterade lagerstatusar 1 variabel produkt kommer att ignoreras. + 1 produkt med hanterad lagerkvantitet kommer att ignoreras. Lagerstatus kommer att uppdateras för 1 produkt. + %1$d variabla produkter kommer att ignoreras. + %1$d produkter med hanterad lagerkvantitet kommer att ignoreras. + Lagerstatus kommer att uppdateras för %1$d produkter. Nuvarande lagerstatus är %1$s Nuvarande lagerstatus är blandat KLART + Uppdatera lagerstatus + Logga in med dina inloggningsuppgifter för webbplatsen WooCommerce-version Installerade tillägg Tillägg + Ljudet för orderaviseringar har ändrats. Använd den här knappen för att återställa \"cha-ching\"-ljudet. + Uppdatera lagerstatus + Vill du flytta denna beställning till papperskorgen? Flytta till papperskorgen Räkna om Skanna produkter - Vill du flytta denna beställning till papperskorgen? - Lagerstatus kommer att uppdateras för %1$d produkter. - Uppdatera lagerstatus - Uppdatera lagerstatus - 1 produkt med hanterad lagerkvantitet kommer att ignoreras. - %1$d variabla produkter kommer att ignoreras. - %1$d produkter med hanterad lagerkvantitet kommer att ignoreras. - Logga in med dina inloggningsuppgifter för webbplatsen - Ljudet för orderaviseringar har ändrats. Använd den här knappen för att återställa \"cha-ching\"-ljudet. Ordersammanfattning Ett fel uppstod när ordern togs bort Ordern borttagen Det verkar vara ett problem med din webbplats.\n\nKontakta ditt webbhotell för vidare hjälp. - Det verkar som att du inte är ansluten till internet.\n\nKontrollera att ditt Wi-Fi är på. Se till att mobildata är aktiverat i dina enhetsinställningar om du använder detta. - Din webbplats verkar ta för lång tid att svara.\n\nKontakta ditt webbhotell för ytterligare hjälp. Det verkar ha uppstått ett problem med din Jetpack-anslutning.\n\nMen oroa dig inte, vårt supportteam finns här om du behöver hjälp. Kontakta oss så hjälper vi dig. Det verkar som att vi inte kan arbeta korrekt med din webbplats svar.\n\nMen oroa dig inte, vårt supportteam finns här om du behöver hjälp. Kontakta oss så hjälper vi dig. + Din webbplats verkar ta för lång tid att svara.\n\nKontakta ditt webbhotell för ytterligare hjälp. + Det verkar som att du inte är ansluten till internet.\n\nKontrollera att ditt Wi-Fi är på. Se till att mobildata är aktiverat i dina enhetsinställningar om du använder detta. + Ingen produkt vald Läs mer Kontakta supporten + Hämtar dina webbplatsbeställningar + Ansluter till WordPress.com-servrar Internetanslutning - Ingen produkt vald Lägg till statistik för anpassade datumintervall - Ansluter till WordPress.com-servrar - Hämtar dina webbplatsbeställningar Ingen plats hittades.\nFörsök igen. + Sidvisningar under session + Enhetstyp Medium Medium + Källa + Källtyp Okänd Mobilapp Webbadministratör Direkt Källa: %1$s - ID: %d - Kund - Produkt - Gäst - Källa - Källtyp - Enhetstyp Hänvisning: %1$s Organisk: %1$s + Ursprung + Beställningstillskrivning Kontakta via Telegram Kontakta via WhatsApp + ID: %d + Kund + Produkt + Gäst Denna användare är en gäst, och gäster kan inte användas för att filtrera beställningar. Försök igen senare eller kontakta oss så hjälper vi dig gärna - Sidvisningar under session - Ursprung - Beställningstillskrivning Det tar lång tid för din webbplats att svara Visa detaljer Fraktmoms Anpassa analys - Avbryt kampanj - Skaffa support Något är fel.\nVi kunde inte skapa din kampanj. Det gick inte att hämta information om kampanjbilden Uppladdning av kampanjbild misslyckades. + Avbryt kampanj + Skaffa support Försök igen eller kontakta supporten för hjälp. + Kampanjen kunde inte skapas + Kampanjen kunde inte skapas Skapar din kampanj Klar + Vi granskar din kampanj. Den kommer att gå live inom 24 timmar. Spännande tider väntar för din försäljning. + Allt är klart att köras. Nyckeln finns redan + Den sista URL:en är för lång Värde Nyckel - Lägg till - Lägg till bild - Lägg till kreditkort + Destination: %s Lägg till parameter - Betalningsmetod + Kreditkortet är nu tillagt Lägg till nytt kort - Kampanjen kunde inte skapas - Kampanjen kunde inte skapas - Vi granskar din kampanj. Den kommer att gå live inom 24 timmar. Spännande tider väntar för din försäljning. - Allt är klart att köras. - Den sista URL:en är för lång - Destination: %s - Kreditkortet är nu tillagt Kreditkorten hämtas från följande WordPress.com-konto: %1$s <%2$s> Alla transaktioner är säkra och krypterade + Lägg till kreditkort Lägg till en ny betalningsmetod + Betalningsmetod Det gick inte att uppskatta antalet visningar. Försök igen? + Lägg till Lägg till en slogan och en beskrivning för din Blaze-kampanj + Lägg till bild Lägg till en bild till Blaze-kampanjen Draghandtag Kort för analys @@ -513,63 +528,62 @@ Language: sv_SE URL-parametrar Mål-URL Ange manuellt + Sökning misslyckades.\nFörsök igen Börja skriva land, delstat eller stad för att se tillgängliga alternativ Genom att klicka på \"Skicka kampanj\" godkänner du våra <a href=\'termsOfService\'><u>användarvillkor</u></a> och vår <a href=\'advertisingPolicy\'><u>annonspolicy</u></a> och samtycker till att din betalningsmetod debiteras för den budget och den varaktighet som du väljer. <a href=\'learnMore\'><u>Läs mer</u></a> om hur budgetar och betalningar för marknadsförda inlägg fungerar. - Sökning misslyckades.\nFörsök igen Skicka in kampanj + Laddning av betalningsmetoder misslyckades. Försök igen genom att klicka här! Lägg till betalningsmetod Laddar in betalningsmetoder Totalt - Betalning - Sök platser Blaze-kampanj - Laddning av betalningsmetoder misslyckades. Försök igen genom att klicka här! Betalning totalt + Betalning + Sök platser Det gick inte att lagra kvittot Det gick inte att ladda ner kvittot Det gick inte att hitta någon applikation som kvittot kan delas till Vi kunde inte ladda något kvitto för den här beställningen + Föreslaget av AI + %d tecken återstår Beskrivning Slogan Ändra bild Tillämpa + Startdatum %1$s dagar + Visningar återspeglar hur ofta din annons visas för potentiella kunder.\n\n\n Exakta siffror kan inte garanteras på grund av fluktuerande onlinetrafik och användarbeteende, men vi strävar efter att annonsens faktiska antal visningar ska ligga så nära ditt målantal som möjligt.\n\n\n Kom ihåg att visningar handlar om synlighet, inte om åtgärder som vidtas av tittarna. Klar + Visningar Uppdatera Redigera - Ställ in din budget + Uppskattat antal personer som nås per dag + %1$s dagligen i %1$s dagar - %1$s dagar från %2$s + Ställ in din budget Alla - %d tecken återstår - %1$s dagligen - Föreslaget av AI - Visningar - Uppskattat antal personer som nås per dag - Visningar återspeglar hur ofta din annons visas för potentiella kunder.\n\n\n Exakta siffror kan inte garanteras på grund av fluktuerande onlinetrafik och användarbeteende, men vi strävar efter att annonsens faktiska antal visningar ska ligga så nära ditt målantal som möjligt.\n\n\n Kom ihåg att visningar handlar om synlighet, inte om åtgärder som vidtas av tittarna. - Startdatum + %1$s dagar från %2$s Visa det inte igen Påminn mig senare Har du tid en minut? Hjälp oss att förbättra våra AI-assisterade funktioner genom lite snabb feedback. Bekräfta detaljer + Annonsdestination Intressen Plats Enheter Språk Budget Detaljer - Förhandsgranska - Annonsdestination - Handla nu Redigera annons + Förhandsgranska Inaktiverad (originalstorlek) - Välj produkt %s - <b>Välj en produkt:</b> Välj vad som ska marknadsföras med Blaze. Produktval + Välj produkt %s <b>Gå live:</b> Se din kampanj starta och följ dess resultat. <b>Snabbgranskning:</b> Skicka in din annons för en snabb moderatorkontroll. <b>Ange din budget:</b> Bestäm hur mycket du vill spendera och kampanjens längd. <b>Anpassa målgrupp:</b> Välj målgrupp baserat på plats eller intressen och se potentiell räckvidd. + <b>Välj en produkt:</b> Välj vad som ska marknadsföras med Blaze. Hantera lager Lager inte hanterat Lär dig hur Blaze fungerar @@ -580,53 +594,48 @@ Language: sv_SE Global räckvidd på ett enkelt sätt Lansera annonser på några minuter – ingen erfarenhet eller stor budget behövs, från bara $5 per dag. Snabb start, stor påverkan - Ange kod - Använd %1$s Vårt verktyg är utformat för att ge handlare möjlighet att snabbt och enkelt skapa annonskampanjer för maximal trafikökning. Marknadsför Redo att marknadsföra Visa upp dina produkter för miljontals människor - SENASTE INSÄTTNING + Använd %1$s Expandera/minimera beställningssummor Ta emot betalning Koden bör vara i formatet XXXX-XXXX-XXXX-XXXX + Ange kod Rabattkoder Misslyckades att ladda teman. Konfiguration slutförd + Uppdatering av kvantitet är ångrad Kunde inte ladda ditt nuvarande tema Stationär dator Läsplatta Mobil tryck här + Tyvärr verkar det vara ett problem med hämtningen av mallen. %1$s för en live-demo. + Du hittar ditt perfekta tema i WooCommerce-temabutiken. Nuvarande tema Prova ett nytt utseende Börja undersökningen Vi värdesätter dina åsikter! - Behöver du hjälp? <a href=\'\'>Kontakta oss</a> - Uppdatering av kvantitet är ångrad - Tyvärr verkar det vara ett problem med hämtningen av mallen. %1$s för en live-demo. - Du hittar ditt perfekta tema i WooCommerce-temabutiken. Om du aktiverar alternativet Betala personligen kan kunden betala kontant eller med kort för onlinebeställningar vid leverans.\n\nBeställningar kan fortfarande skapas manuellt utan att aktivera denna funktion. Vill du lägga till alternativet Betala personligen i din kassa? + Behöver du hjälp? <a href=\'\'>Kontakta oss</a> Återbetala anpassat belopp + Återbetalning av anpassade belopp Skanna produktens streckkod Lägg till presentkort - Återbetalning av anpassade belopp Produkt Antal Ursprungligt antal Något gick fel. Försök igen + Antal uppdaterat: %s Visa produktdetaljer Uppdatera antal - AKTIVERA LJUD - % - 0 - Antal uppdaterat: %s Antal + 1 - Temaaktivering misslyckades, försök igen! - BEHÅLL TYST Produkt med SKU: %s är inte lagerhanterad. Försök igen. Produkt med SKU: %s hittades inte. Försök igen. + Temaaktivering misslyckades, försök igen! Ljudet för beställningsnotiser har inaktiverats. Slå på det igen för att höra \"ka-ching\" vid varje ny försäljning. Aktivera ka-ching-ljud Skanna streckkoden för att uppdatera lagret @@ -634,19 +643,23 @@ Language: sv_SE Testnotis TESTA LJUD Klart! \"Ka-ching\"-ljudet kommer nu att höras för varje ny beställning. + BEHÅLL TYST + AKTIVERA LJUD Aktivera det igen för att höra \"ka-ching\" vid varje ny försäljning. Håll koll på dina kunders beställningar. Ka-ching-ljud av Antal beställningar + % + 0 En procentandel av beställningens totala belopp Ett fast belopp Hur vill du lägga till ditt anpassade belopp? - Ta bort anpassat belopp Procentandel av beställningens totala belopp %1$s + Ta bort anpassat belopp + Temat har aktiverats Hem Tryck för att visa Sidor på denna mall Förhandsgranska - Temat har aktiverats Letar du efter fler? Du kan alltid ändra det senare i inställningar Välj ett tema @@ -662,98 +675,98 @@ Language: sv_SE Tackbrev Obs! För att den här inställningen ska kunna aktiveras får prenumerationen inte ha en gratis provperiod eller ett synkroniserat förnyelsedatum. Aktivera detta för att endast debitera frakt en gång vid den första ordern. - Dokument och andra filer på enhet Aktiverad Engångsfrakt + Dokument och andra filer på enhet ✨ Skapa tackbrev Debitera moms - Tillgängliga medel sätts in automatiskt, varje %s. - Tillgängliga medel sätts in automatiskt, varje dag. - Medlen blir tillgängliga efter att ha inväntat granskning i %d dagar. + Tillgängliga medel betalas ut automatiskt, varje %s. + Tillgängliga medel betalas ut automatiskt, varje dag. + Medlen blir tillgängliga efter att ha inväntat granskning i %d dagar. Välj en variant + Välj variant ”%1$s” -> %2$s välj en variant - Välj %1$s %1$s objekt valda %1$s objekt valda + Välj %1$s fler än %1$s objekt fler än %1$s objekt färre än %1$s objekt mellan %1$s och %2$s objekt %d objekt %d objekt - Välj variant Ändra produktantalet från %1$.2f till %2$.2f Spara konfiguration Konfiguration + Produkt %s Konfigurera + Alternativt kommer registreringsavgiften att debiteras omedelbart, även om produkten har en gratis provperiod eller synkroniserade betalningsdatum. En produktprenumeration med varianter Variabel prenumerationsprodukt - Enkel prenumerationsprodukt - Produkt %s - Alternativt kommer registreringsavgiften att debiteras omedelbart, även om produkten har en gratis provperiod eller synkroniserade betalningsdatum. En unik produktprenumeration som möjliggör återkommande betalningar + Enkel prenumerationsprodukt En valfri tidsperiod att vänta innan den första återkommande betalningen debiteras. Eventuella registreringsavgifter kommer fortfarande att debiteras vid prenumerationens start. Provperioden får inte överstiga: 90 dagar, 52 veckor, 24 månader eller 5 år. Gratis provperiod på prenumeration Prenumerationens utgångsdatum - PRODUKTER - PRODUKT - KUND ANPASSADE BELOPP BETALNING TOTALT ORDERANTECKNINGAR - Använd en säkerhetsnyckel - Period + PRODUKTER + PRODUKT + KUND Ange din säkerhetsnyckel för att fortsätta. Det uppstod vissa problem med säkerhetsnyckelsinloggningen - Misslyckades - Avbruten - Betald - Beräknad + Använd en säkerhetsnyckel + Period Faktureringsintervall Rea - Okänd - På väg - Väntande - Minimera/maximera insättningssammanfattningen - Läs mer om när du får dina medel + Okänt + Misslyckades + Avbruten + På väg + Inväntar granskning + Betald + Beräknad + Minimera/expandera utbetalningssammanfattning + Läs mer om när du får dina medel + Tillgängliga medel betalas ut automatiskt, varje månad den %s. + Medlen blir tillgängliga efter att ha inväntat granskning i %d dag. + Medel som inväntar granskning + Tillgängliga medel Momser Produkter - Tillgängliga medel - Väntande medel - Tillgängliga medel sätts in automatiskt, varje månad den %s. - Medlen blir tillgängliga efter att ha inväntat granskning i %d dag. Betalning totalt E-postadress eller användarnamn + Det går inte att skapa en order med anpassat belopp Ange anpassat namn Lägg till anpassat belopp Namn Belopp Anpassat belopp - Det går inte att skapa en order med anpassat belopp Anslut Jetpack via din adminsida i en webbläsare eller kontakta supporten. Ett fel uppstod vid kommunikationen med din webbplats. Anpassade belopp Marknadsför med Blaze Jag förstår Annonsen har skickats in för godkännande. Vi skickar en bekräftelse via e-post när den är godkänd och aktiverad. - Starta Blaze-kampanj nu - Nå miljoner på WordPress- och Tumblr-webbplatser. Klart! + Starta Blaze-kampanj nu Följ upp resultat samt starta och stoppa din Blaze-kampanj när som helst. + Nå miljoner på WordPress- och Tumblr-webbplatser. Ta kontrollen för bara några dollar om dagen. Det är budgetvänligt. - Minska produktantal - Skanna streckkod - Minimera/expandera produktkort - Få mer försäljning i din butik med Blaze Marknadsför din produkt på bara några minuter. + Få mer försäljning i din butik med Blaze + Det uppstod ett fel vid uppdateringen av listan över kampanjer. Försök igen senare. Välj mediekälla Ingen text upptäckt. Välj ett annat förpackningsfoto eller ange produktinformation manuellt. Lägg till produkt - Det uppstod ett fel vid uppdateringen av listan över kampanjer. Försök igen senare. + Skanna streckkod + Minimera/expandera produktkort + Minska produktantal + Öka produkantal Lägg till anpassat belopp Pris efter rabatt - Öka produkantal Föregående beställning Nästa beställning Kampanjinformation @@ -767,23 +780,23 @@ Language: sv_SE Prova att genomföra en %s-betalning med ditt betal- eller kreditkort.\nBetalningen kommer att återbetalas när du är klar. Det är enkelt, säkert och privat. Ta emot alla typer av personliga betalningar, direkt\ni din telefon. Ingen extra hårdvara behövs. + Avvisad + Har slutförts Aktiv Under granskning Skapa kampanj - Avvisad - Har slutförts Öka synligheten och få dina produkter sålda snabbt. Blaze-kampanj Contactless Symbol är ett varumärke som ägs av och används med tillåtelse av EMVCo, LLC. 5. När du ser \"Klar\"-markeringen kommer din butik att behandla betalningen och transaktionen är slutförd. 3. Håll fram din telefon mot kunden. 2. Tryck på \"Ta emot betalning\" och välj \"Tryck för att betala\". + 1. Skapa en beställning Hur det fungerar Lär dig mer om kortläsare För att ta emot betalningar över denna gräns, överväg att köpa en kortläsare som accepterar PIN-inmatning. Vi stöder inte PIN-inmatning med Tryck för att betala på Android. I %1$s kräver vissa kort en PIN för kontaktlösa transaktioner över %2$s. - 1. Skapa en beställning Viktig information Med Tryck för att betala kan du ta emot alla typer av kontaktlösa betalningar, från fysiska betal- och kreditkort till digitala plånböcker, utan att behöva köpa en fysisk kortläsare. Vad är Tryck för att betala? @@ -805,25 +818,24 @@ Language: sv_SE Ange en ny momssats för den här beställningen Lägg till momssats automatiskt Prova att inaktivera filtret för olästa produktrecensioner för att se alla dina produktrecensioner - Övertygande - Formell - Detaljer - Produktnamn Inga olästa produktrecensioner + Övertygande Blommig + Formell Avslappnad Ton och röst + Detaljer + Produktnamn Förhandsgranska Exempelvis mjukt tyg, slitstarka sömmar, unik design Drivs med AI. <a href=\'guidelines\'><u>Lär dig mer</u></a>. Lägg till en produkt och detaljerna manuellt Lägg till manuellt + Snabbgenerera information åt dig Skapa en produkt med AI Lägg till en produkt Endast olästa recensioner - Snabbgenerera information åt dig Redigera momssatsinställning - Betalningsmetoder Detta kommer inte att påverka onlinebeställningar Lägg till den här momssatsen till alla skapade beställningar Redigera momssatser @@ -831,14 +843,15 @@ Language: sv_SE Lägg till momssatser i adminpanelen. Endast momssatser med platsinformation kommer att visas här. Vi kunde inte hitta några momssatser Upptäck andra betalningsleverantörer och \nvälj en betalningsleverantör. + Betalningsmetoder Bilder och videoklipp på enhet Lös nu Slutför inställning Ange momssats Aktivera Ange ny momssats - Ställ in WooPayments + Ställ in Redigera momssatser i adminpanelen Detta kommer att ändra kundens adress till platsen för den momssats du väljer. Knapp som öppnar dialogrutan för information om momssatser @@ -857,15 +870,15 @@ Language: sv_SE <a href=\'learnMore\'><u>Lär dig mer</u></a> om att verifiera din information med WooPayments. Börja installationen Vi har slagit oss ihop med Stripe för WooPayments. Du kommer att bli omdirigerad till Stripes webbplats för registrering. Vi kommer att be dig att kontrollera dina företagsuppgifter och din betalningsinformation. + Dina WooPayments-aviseringar kommer att skickas till e-postadressen som är kopplad till ditt WordPress.com-konto. Föredrar du att använda ett nytt konto? <a href=\'learnMore\'><u>Mer information finns här.</u></a> + Innan du startar konfigurationen 4–6 minuter Beräknad installationstid - Innan du startar konfigurationen - Dina WooPayments-aviseringar kommer att skickas till e-postadressen som är kopplad till ditt WordPress.com-konto. Föredrar du att använda ett nytt konto? <a href=\'learnMore\'><u>Mer information finns här.</u></a> Hantera betalningar utan ansträngning med WooPayments, allt på en och samma plats. Ta emot kortbetalningar, Apple Pay-betalningar, personliga betalningar och över 135 olika valutor, helt utan installationskostnader eller månadsavgifter. Det gick inte att spara butiksnamnet. Försök igen. + Sparar nytt butiksnamn … Butiksnamn inställt. Butiksnamn inställt. \n För att ändra igen, gå till butiksinställningarna. - Sparar nytt butiksnamn … Uppdatera butiksnamn Grattis! Du har gått igenom konfigurationen och ditt betalningssystem är redo att användas. Du gjorde det! @@ -886,13 +899,13 @@ Language: sv_SE Beställningssumma Beräknad procentandel Beräknat belopp - Att anpassa ditt butiksnamn kan också förbättra din butiks sökmotoroptimering. Butiksnamn + Att anpassa ditt butiksnamn kan också förbättra din butiks sökmotoroptimering. Namnge din butik Aktivera NFC Leveranspaket för små kvantiteter (märkningar krävs) - Tändarpaket – Auktoriserade tändare LTD QTY-markpaket – Aerosoler, spraydesinfektionsmedel, sprayfärg, hårspray, propan, butan, rengöringsprodukter, osv. - Parfymer, nagellack, nagellackborttagningsmedel, lösningsmedel, handsprit, tvättsprit, etanolbaserade produkter, osv. - Andra ytmaterial i begränsad mängd (kosmetika, rengöringsprodukter, färger, osv.) + Tändarpaket – Auktoriserade tändare ID8000-konsumentvarupaket – Luftkvalificerade ID8000-konsumentvaror (icke brandfarliga aerosoler, brandfarliga brännbara vätskor, giftiga ämnen, diverse farliga material) Farliga material endast för markleverans (för föremål som inte är listade, men som är begränsade till endast yta) Undantagna kvantitetsförsörjningspaket (t.ex. små volymer av brandfarliga vätskor och frätande, giftiga eller miljöfarliga material – märkning krävs) @@ -915,56 +928,56 @@ Language: sv_SE Klass 4 – Paket (Brandfarliga fasta ämnen) Klass 3 – Paket (Handdesinfektionsmedel, tvättsprit, etanolbaserade produkter, brandfarliga vätskor, osv.) Klass 1 – Paket med leksaksdrivmedel/säkerhetssäkringar - OK Luftkvalificerat etanolpaket – (godkända försändelser av parfymer och handsprit) + OK Potentiellt farligt material inkluderar varor såsom batterier, torris, brandfarliga vätskor, aerosoler, ammunition, fyrverkerier, nagellack, parfym, färg, lösningsmedel med mera. Farliga varor måste skickas i separata paket. Innehåller farliga material Ange produktrubrik. - Variabel prenumeration E-handelsplattformen som växer tillsammans med dig + Variabel prenumeration Ta bort rabattkod Alla gillar ett erbjudande Du har inte skapat några rabattkoder ännu. Skapa en rabattkod för att tillämpa den på denna beställning. Gå till rabattkoder Välj en rabattkod + Misslyckades skapa rabattkod Rabattkod skapad Skapa Skapa rabattkod Skapa %1$s Redigera rabattkod Skapa en fast totalrabatt för valda produkter - Misslyckades skapa rabattkod Skapa en fast totalrabatt för hela varukorgen Skapa en procentuell rabatt för valda produkter Fast produktrabatt Fast varukorgsrabatt Procentuell rabatt - Skapa rabattkod - Lägg till rabattkod - Starta testbeställning - Sök efter kunder efter - Lägg till detaljer manuellt - Prova en testbeställning - Prova en testbeställning Kupongtyp – fast produkt Kupongtyp – fast kundvagn Kupongtyp – procentuell rabatt + Skapa rabattkod + Lägg till rabattkod + Starta testbeställning Använd appen för att behandla återbetalningen för testbeställningen Slutför betalningen och vänta på en push-avisering om beställningen i din WooCommerce-app. Välj din testprodukt, lägg till i kundvagn och slutför i kassan på den webbutiken som en riktig kund. Tryck på knappen nedan för att bli vidarebefordrad till din onlinebutik via en webbläsare. + Prova en testbeställning + Prova en testbeställning Kör en testbeställning för att kontrollera att din WooCommerce-process levererar en sömlös kundupplevelse + Lägg till detaljer manuellt + Sök efter kunder efter Annat skäl (vänligen specificera) Jag är en del av ett team och vi måste fatta beslutet kollektivt. + Jag anser att priset på tjänsten är en viktig faktor i mitt beslut. Jag utvärderar och jämför din tjänst med andra på marknaden. Jag utforskar och utvärderar fortfarande funktionerna och fördelarna med appen. Hjälp oss att förstå dina prenumerationsbeslut. Din feedback är viktig. - Jag anser att priset på tjänsten är en viktig faktor i mitt beslut. Ingen e-postadress Inget namn + Sök efter en befintlig kund eller Senast uppdaterat %s (Uppdateras var 30:e minut) Senast uppdaterat %s - Sök efter en befintlig kund eller <a href=\'\'>Läs mer</a> om att ta emot betalningar med Tryck för att betala på Android Ta emot betalning Du kan inte lägga till produkter som inte har något specificerat pris @@ -972,136 +985,136 @@ Language: sv_SE lägg till kund Gå till inställningar Avbryt - Belopp (%1$s) Bevilja - Vi kunde inte hitta en rabattkod med den koden. Försök igen Du har nekat kameraåtkomst permanent. Det krävs för streckkodsskanning. Aktivera det i appinställningarna Kameraåtkomst krävs för streckkodsskanning. Bevilja kameraåtkomst Något gick fel när din rabattkod skulle valideras. Försök igen + Vi kunde inte hitta en rabattkod med den koden. Försök igen + Belopp (%1$s) Rabatt %1$s – %1$s - Belopp (%1$s) + Totala rabatter Rabatt + Belopp (%1$s) + Manuell rabatt kunde inte tillämpas. Ta bort rabattkoder först Rabatt är inte ett giltigt nummer Rabatt kan inte vara större än priset Ta bort rabatt - Totala rabatter - Manuell rabatt kunde inte tillämpas. Ta bort rabattkoder först Knapptext Verktygstipsmeddelande. \n Detta kan innehålla flera rader. Verktygstipsrubrik - ✨ Skriv med AI Jag förstår - Generera en beskrivning med AI Använd vårt AI-drivna verktyg för att snabbt generera produktbeskrivningar. Det är bara att ange nyckelord så gör vi resten. + ✨ Skriv med AI + Generera en beskrivning med AI + Det uppstod ett problem när produktbeskrivningen skulle genereras. Försök igen senare. Beskrivning genererad av AI Drivs med AI. <a href=\'\'><u>Lär dig mer</u></a>. - Det uppstod ett problem när produktbeskrivningen skulle genereras. Försök igen senare. Tryck för att betala på Android är inte tillgängligt i ditt land än. Håll ögonen öppna. Din enhet behöver ha tjänsten Google Play för att du ska kunna använda Tryck för att betala på Android. För att ta emot personliga betalningar behöver du installera tjänsten Google Play eller köpa en Bluetooth-kortläsare. För att använda Tryck för att betala på Android behöver du Android 10 eller senare. För att ta emot personliga betalningar behöver du uppdatera Android eller köpa en Bluetooth-kortläsare. Din enhet behöver ha ett NFC-chip för att du ska kunna använda Tryck för att betala på Android. För att ta emot personliga betalningar behöver du köpa en Bluetooth-kortläsare. - Vi kunde inte ladda dina data. - Felsökning - Kontrollera kraven Tryck för att betala är inte tillgängligt + Kontrollera kraven + Felsökning Detta kan bero på en tilläggskonflikt. Försök igen senare eller kontakta oss så hjälper vi dig gärna. + Vi kunde inte ladda dina data. Jag förstår Tänk på att den här produktbeskrivningen har genererats med vårt AI-drivna verktyg. Granska och redigera innehållet för att säkerställa att det överensstämmer med ditt varumärke och ditt budskap. - Skanna streckkod - Användarnamn - Namn - E-post - Fler inställningar - Kanske senare Bra start! Är den genererade\nbeskrivningen beskrivning användbar? Generera igen - Ange ditt produktnamn - Skriv en beskrivning Framhäv din produkts unika funktioner och målgrupp med nyckelord för en skräddarsydd beskrivning. Exempel: krukväxt, kaktus, växt, dekorativ, lättskött + Ange ditt produktnamn + Skriv en beskrivning Kameraåtkomst krävs för streckkodsskanning. + Skanna streckkod + Användarnamn + Namn + E-post Tillämpade rabattkoder + Fler inställningar + Kanske senare Skriv igen + En PIN-kod krävs, men Tryck för att betala stöder inte detta än. Överväg att använda en extern kortläsare Köp en kortläsare Rabattkod kunde inte tillämpas och togs bort från beställningen - En PIN-kod krävs, men Tryck för att betala stöder inte detta än. Överväg att använda en extern kortläsare + Det gick inte att generera meddelandet för delning. Försök igen. Lär dig mer om vår AI-funktion Lägg till ett valfritt meddelande + Skriver … Skriv med AI Marknadsför produkter med Blaze Blaze - Marknadsför med Blaze - Det gick inte att generera meddelandet för delning. Försök igen. AI-innehållsgenerator tillgänglig - Skriver … + Marknadsför med Blaze Dela produkt Grattis. Du är ett steg närmare att kunna lansera din nya butik. Den första produkten har skapats 🎉 Systemet avslutade Woo-appen medan den kördes i bakgrunden. Du kan prova att använda den igen. Systemet avslutade Woo-appen medan den kördes i bakgrunden. Du kan prova att använda den igen. Kortet togs bort för tidigt + Variationsprodukt + Vår cookiepolicy förklarar hur vi och andra använder cookies och hur du kan hantera dem. + Cookiepolicy + Din information hjälper oss att förbättra våra produkter, marknadsföring och personifiera din upplevelse på WooCommerce. Integritetspolicy + Det uppstod ett fel när dina integritetsval skulle sparas. Spara Inställningar Tillåt oss att optimera prestandan genom att samla in information om hur användare interagerar med våra mobilappar. Analys Hantera integritet - Din information hjälper oss att förbättra våra produkter, marknadsföring och personifiera din upplevelse på WooCommerce. - Variationsprodukt - Vår cookiepolicy förklarar hur vi och andra använder cookies och hur du kan hantera dem. - Cookiepolicy - Det uppstod ett fel när dina integritetsval skulle sparas. Din integritet är och har alltid varit avgörande för oss. Vi använder, lagrar och behandlar dina personuppgifter för att optimera vår app (och din upplevelse) på en rad olika sätt. Vissa användningsområden för dina data är absolut nödvändiga för att få saker att fungera, andra kan du anpassa i dina inställningar. För att hjälpa oss att förbättra appens prestanda och åtgärda eventuella fel, aktivera automatiska kraschrapporter. - Skanning misslyckades. Försök igen senare Rapportera krascher Rapporter + Läs mer om vår integritetspolicy och vår cookiepolicy. + Integritets- och cookiepolicyer Integritet + Läs mer om vilka data vi samlar in om din butik och dina möjligheter att styra vilka data som delas. + Användningsspårning + Fler integritetsalternativ tillgängliga för WooCommerce.com-användare. Kolla in här för att lära dig mer. + Webbalternativ Fler integritetsalternativ Det uppstod ett fel vid uppdateringen av dina integritetsinställningar - Webbalternativ - Spårning Det uppstod ett fel vid hämtningen av dina integritetsinställningar Tillåt oss att optimera prestandan genom att samla in information om hur användare interagerar med våra mobilappar. Analys - Du kan inte lägga till en variabel produkt direkt. Välj en specifik variant - Systemet avslutade Woo-appen medan den kördes i bakgrunden. Du kan försöka använda den igen. + Spårning Vi värdesätter din integritet. Dina personuppgifter används för att optimera våra mobilappar, förbättra säkerheten, genomföra analyser och förbättra din användarupplevelse. - Läs mer om vår integritetspolicy och vår cookiepolicy. - Integritets- och cookiepolicyer - Läs mer om vilka data vi samlar in om din butik och dina möjligheter att styra vilka data som delas. - Användningsspårning + Systemet avslutade Woo-appen medan den kördes i bakgrunden. Du kan försöka använda den igen. + Du kan inte lägga till en variabel produkt direkt. Välj en specifik variant + Skanning misslyckades. Försök igen senare Produkten med SKU %s hittades inte. Det gick inte att lägga till i beställningen - Fler integritetsalternativ tillgängliga för WooCommerce.com-användare. Kolla in här för att lära dig mer. - Skanna streckkod Skanning misslyckades. Försök igen senare + Skanna streckkod Leverans till länder som följer EU:s tullregler kräver nu att du tydligt beskriver varje vara. Om du till exempel skickar kläder måste du ange vilken typ av kläder det är (t.ex. herrskjortor, flickvästar, pojkjackor) för att beskrivningen ska vara godtagbar. Annars kan leveranser försenas eller avbrytas i tullen. Kontakta support Detta konto kan inte avslutas eftersom det har aktiva butiker. Ett fel inträffade vid försöket att avsluta ditt konto. Det gick inte att avsluta kontot Avslutar kontot … - Rabattkod (%1$s) - -%1$s - Ta bort rabattkod från beställning Avsluta kontot permanent Bekräfta genom att skriva in ditt användarnamn innan kontot avslutas Bekräfta kontoavslut Avsluta kontot Skanna QR-koden och följ instruktionerna Skanna för att betala + Ta bort rabattkod från beställning + Rabattkod (%1$s) + -%1$s Lägg till rabattkod - Lägg till produkter via skanner - Du måste ge en tydlig och specifik beskrivning av varje artikel. Otillräckligt lager + Du måste ge en tydlig och specifik beskrivning av varje artikel. + Lägg till produkter via skanner Avfärda Lär dig mer - Få beställningsaviseringar och mer - Håll dig uppdaterad och öka butikssäkerheten. Utforska Jetpack nu. Vid frakt till länder som följer EU:s tullregler måste du ange en tydlig, specifik beskrivning för varje vara. Annars kan leveranser försenas eller avbrytas i tullen. + Håll dig uppdaterad och öka butikssäkerheten. Utforska Jetpack nu. + Få beställningsaviseringar och mer Visa eller dölj listan för butikskonfiguration Lista för butikskonfiguration Du kan få tillbaka den vid behov från Meny > Inställningar > Butik @@ -1127,37 +1140,37 @@ Language: sv_SE Aviseringar Sammansatt produkt Enhetens mediabibliotek - Tillåt Testa Tryck för att betala med automatisk återbetalning Testbetalning med Tryck för att betala - Inställningar - Visa din butik - Håll dig uppdaterad + Tillåt Uppdatera dina preferenser + Inställningar Ta emot produktrecensioner för din butik Öka försäljningen med specialerbjudanden + Visa din butik + Håll dig uppdaterad + Hantera mer på admin Allmänt Inställningar + Du kan redigera paketprodukter i webbadminpanelen. %d produkter 1 produkt - Paket - Hantera mer på admin - Du kan redigera paketprodukter i webbadminpanelen. Paketprodukter Ej grupperade Inget maximum Inget minimum - Produkter - Populär - Presentkort - Presentkort - Lär dig mer om roller och behörighet - Det verkar som att din roll inte tillåter dig att installera Jetpack.\nKontakta din administratör för hjälp. + Paket Grupp om Största kvantitet Minsta kvantitet Kvantitetsregler + Presentkort + Presentkort + Produkter Senast sålda + Populär + Lär dig mer om roller och behörighet + Det verkar som att din roll inte tillåter dig att installera Jetpack.\nKontakta din administratör för hjälp. Prova Tryck för att betala Gratis provperiod Registreringsavgift @@ -1172,190 +1185,190 @@ Language: sv_SE vecka dag Anpassad - Löpt ut - Aktiv Väntar på att avslutas + Löpt ut Avslutat Pausad + Aktiv Du kan redigera produktprenumerationer i webbadminpanelen. Ingen gratis provperiod Ingen registreringsavgift Löper aldrig ut - Prenumeration #%1$d - Prenumeration - OK - Prenumeration - Prenumeration %1$s varje %2$s %3$s Varje %1$d %2$s Varje %1$s + Prenumeration #%1$d + Prenumeration + OK Woo finns med dig hela vägen från din första försäljning till miljoner i intäkter. Se varför handlare förlitar sig på oss för att driva 3,4 miljoner onlinebutiker. + Prenumeration OTP-koden är felaktig. Dubbelkontrollera din information och försök igen. SMS-begäran misslyckades. Försök igen. SMS begärt, kolla dina meddelanden för att se koden. + Prenumeration Kortläsaren accepterar blipp, chipp och magnetremsa vid betalning med betal- och kreditkort. Ta emot säkra kontaktlösa betalningsmetoder direkt från din telefon. - Hämtar webbplats … - Det går inte att logga in eftersom lösenordsskapandet i appen inte godkänts. - Dela feedback Använd din telefon för att ta emot kort\nbetalningar Prova nu. - Logga in + Dela feedback + Det går inte att logga in eftersom lösenordsskapandet i appen inte godkänts. + Hämtar webbplats … Ett fel inträffade när webbsidan skulle hämtas Testa igen med sidan med Adminpanelen + Logga in Laddar in … %s har avslutats Din prenumeration har avslutats och du har begränsad åtkomst till alla funktionerna. %1$d dagar 1 dag Laddar in … + Konfiguration av Payments Om din butik Ett telefonnummer är obligatoriskt - Konfiguration av Payments %1$s, %2$s, %3$s, %4$s har sålts poster artikel + Det gick inte att hämta paketinformationen + Du är %1$s-prenumerant. Du har tillgång till alla våra funktioner fram till %2$s. + Din gratis provperiod har avslutats och har begränsad åtkomst till alla funktioner. Prenumerera på %1$s nu. + Du har en kostnadsfri provperiod på %1$d dagar. Din kostnadsfria provperiod löper ut om %2$s. Uppgradera för att låsa upp nya funktioner och hålla igång din butik. Prenumerationsstatus Felsökning Nuvarande: %s Rapportera prenumerationsproblem Uppgradera nu - Oväntat fel - Privat - Din butik är live! - Förhandsgranska - Tillbaka till min butik - Sök domäner - Publicera min butik - Det gick inte att hämta paketinformationen - Du är %1$s-prenumerant. Du har tillgång till alla våra funktioner fram till %2$s. + %1$s kvar på din provperiod. Provperioden avslutades Din provperiod har avslutats. Hoppsan, det uppstod några oväntade fel. + Oväntat fel + Vi upptäckte att butiken redan har lanserats. Det gick inte att lansera din butik Det gick inte att dela butiks-URL:en + Privat + Din butik är live! + Förhandsgranska + Tillbaka till min butik Dela URL + Publicera min butik För att lansera din butik behöver du uppgradera till vårt paket. <u>Uppgradera</u> - Vi upptäckte att butiken redan har lanserats. - Du har en kostnadsfri provperiod på %1$d dagar. Din kostnadsfria provperiod löper ut om %2$s. Uppgradera för att låsa upp nya funktioner och hålla igång din butik. - %1$s kvar på din provperiod. - Din gratis provperiod har avslutats och har begränsad åtkomst till alla funktioner. Prenumerera på %1$s nu. - Något gick fel. Försök igen senare. + Sök domäner Inloggning misslyckades med statuskod %1$s Det gick inte att logga in, eftersom vi inte kan identifiera admin-URL:en för din butik Det gick inte att logga in, eftersom vi inte kan identifiera inloggnings-URL:en för din butik Inloggningen misslyckades med ett oväntat svar från din webbplats. Vi jobbar på att lösa det här problemet. + Något gick fel. Försök igen senare. Det finns krav som inväntar granskning i ditt konto. Slutför dessa krav för att fortsätta ta emot personliga betalningar. Betygsätt gärna din analysupplevelse Gillar du analysen? Vi har jobbat på att göra det möjligt att visa viktig butiksinformation från din enhet. Skulle den kunna vara bättre? Hjälp oss att förbättra den här funktionen genom att dela din feedback med oss Se din statistik, dina intäkter med mera från din enhet. Ett fel uppstod vid hämtningen av din webbplats. Försök igen. + Vi kan tyvärr inte skapa supportförfrågningar för tillfället. Försök igen senare. Något gick fel Jag förstår! - Vi kan tyvärr inte skapa supportförfrågningar för tillfället. Försök igen senare. Din supportförfrågan har landat säkert i vår inkorg. Vi kommer att svara via e-post så snart vi kan. + Förfrågan skickad. Vänta … - Jag behöver hjälp med - Ämne - Supportförfrågan - Dela feedback - Meddelande - Skriv något - Visa alla (%1$d) - Ge dina kunder ett enkelt och bekvämt sätt att betala! - Få betalt + Skickar din förfrågan Annan utökning/tillägg WooCommerce-tillägg - Förfrågan skickad. - Skickar din förfrågan WooCommerce-betalningar Kortläsare/personliga betalningar Mobilapp + Skriv något + Meddelande Skicka supportförfrågan + Ämne Meddela oss din webbplatsadress (URL) och berätta så mycket du kan om problemet, så kommer vi att kontakta dig snart. Låt oss ordna detta + Jag behöver hjälp med + Supportförfrågan + Dela feedback Onboarding, minimerad lista Onboarding, fullskärm + Visa alla (%1$d) %1$d av %2$d uppgifter har slutförts + Ge dina kunder ett enkelt och bekvämt sätt att betala! + Få betalt Vi använder den här informationen för att snabbare kunna konfigurera dina frakt-, moms- och betalningsinställningar. - Logga in för att fortsätta Berätta mer om din butik - Något blev fel. Försök igen senare. - Prova en betalning + Vi har precis skickat en magisk länk till e-postadressen för ditt konto + Logga in för att fortsätta + Få åtkomst till alla dina WooCommerce-butiker. Flera butiker Hämtar Jetpack-status - Få åtkomst till alla dina WooCommerce-butiker. - Vi har precis skickat en magisk länk till e-postadressen för ditt konto - Välj land - Välj delstat - ÅTGÄRDER - Ett fel uppstod under domänregistrering + Något blev fel. Försök igen senare. + Prova en betalning Ta emot kortbetalningar\nmed din telefon Tryck för att betala + ÅTGÄRDER + Ett fel uppstod under domänregistrering + Välj delstat + Välj land Registrerar domännamn … - Telefon - Landskod - Land - Adress - Adress 2 - Ort - Delstat - Delstat (Inte tillgänglig) - Postnummer Registrera domän - För din bekvämlighet har vi förfyllt din WordPress.com\n kontaktinformation. Granska det för att vara säker på att det är rätt information du vill använda för denna domän. + Postnummer + Delstat (Inte tillgänglig) + Delstat + Ort + Adress 2 + Adress + Land + Landskod + Telefon Organisation (valfritt) - Domänägare måste uppge kontaktinformation i en publik databas som omfattar alla domäner. Med integritetsskydd publicerar vi våra uppgifter istället för dina, och vidarebefordrar sedan privat eventuella meddelanden till dig. - I och med att du registrerar denna domän accepterar du våra %1$savtalsvillkor%2$s - Ange en giltig %s - Registrera privat med integritetsskydd - Registrera publikt + För din bekvämlighet har vi förfyllt din WordPress.com\n kontaktinformation. Granska det för att vara säker på att det är rätt information du vill använda för denna domän. Kontaktinformation för domän + Registrera publikt + Registrera privat med integritetsskydd + Ange en giltig %s + I och med att du registrerar denna domän accepterar du våra %1$savtalsvillkor%2$s + Domänägare måste uppge kontaktinformation i en publik databas som omfattar alla domäner. Med integritetsskydd publicerar vi våra uppgifter istället för dina, och vidarebefordrar sedan privat eventuella meddelanden till dig. Integritetsskydd Endast butiksadministratörer kan komma åt domäninställningar - Logga in på ditt WordPress.com-konto för att installera Jetpack - Logga in på ditt WordPress.com-konto för att ansluta Jetpack + Eller fortsätt med magisk länk Ange lösenordet för ditt WordPress.com-konto för att installera Jetpack Ange lösenordet för ditt WordPress.com-konto för att ansluta till Jetpack - Eller fortsätt med magisk länk - Gratis första året + Logga in på ditt WordPress.com-konto för att installera Jetpack + Logga in på ditt WordPress.com-konto för att ansluta Jetpack + Du hittar domäninställningarna via Inställningar > Domäner Din webbplatsadress håller på att konfigureras. Det kan dröja upp till 30 minuter innan din domän börjar fungera. Grattis till dina köp - Du hittar domäninställningarna via Inställningar > Domäner + Gratis första året Är du säker på att du vill logga ut från ditt konto? Kan inte ladda webbplatsdomäner + %1$d/%2$d har slutförts + Få en anpassad URL för din butik. Anpassa din domän Publicera din webbplats till världen när du vill! Lansera din butik - %1$d/%2$d har slutförts - Få en anpassad URL för din butik. Börja sälja genom att lägga till produkter eller tjänster i din butik. Lägg till din första produkt Konfigurera din butik - Välj domän - Din enhet stöds inte. Kontakta support för mer detaljer Något gick fel med appkonfigurationen. Kontakta supporten för mer information + Din enhet stöds inte. Kontakta support för mer detaljer Appen kunde inte aktivera kortläsaren, eftersom NFC-chippet är inaktiverat Transaktionen avbröts Den köpta domänen kommer att omdirigera användare till + Välj domän Lägg till en domän - Din gratis butiksadress + Domänerna för din webbplats Primär webbplatsadress + <a href=\'\'><u>Lär dig mer</u></a> om domäner och hur man vidtar domänrelaterade åtgärder. Sök efter en domän Den köpta domänen kommer omdirigera användare till din primära adress. Gör anspråk på domän - <a href=\'\'><u>Lär dig mer</u></a> om domäner och hur man vidtar domänrelaterade åtgärder. - Domänerna för din webbplats Ditt paket inkluderar en gratis domännamnsregistrering i ett år. Gör anspråk på din gratisdomän + Din gratis butiksadress Domäner Visa inte igen Påminn mig senare + Inga problem! Du kan alltid gå till Inställningar i menyn för att skicka feedback. Dela feedback Dela feedback - Berätta vad du tycker - Inga problem! Du kan alltid gå till Inställningar i menyn för att skicka feedback. Berätta för oss om din upplevelse av personliga betalningar. + Berätta vad du tycker Betygsätt din första upplevelse av personliga betalningar. Gillar du att använda personliga betalningar? Dela din egen upplevelse av att ta emot personliga betalningar. @@ -1366,105 +1379,106 @@ Language: sv_SE Det går inte att duplicera produkten Duplicera Förbereder för betalning - Domän Det går snabbt + Förbereder inbyggd läsare … Den inbyggda läsaren är redo + Kortläsare Tryck för att betala Omvandlingsfrekvens Sessioner Inga sessioner denna period Jämfört med - Kortläsare - Förbereder inbyggd läsare … + Domän Vad är applikationslösenord? Det verkar som att funktionen Applikationslösenord är inaktiverad på din webbplats %1$s.\n Aktivera den om du vill använda WooCommerce-appen. Öppna installationssida - Svar skickat! Det uppstod ett fel när svaret skulle skickas + Svar skickat! Svara + Välj alla Uppdatera pris Uppdatera status Status uppdaterad! Uppdatera status Pris uppdaterat! Uppdatera ordinarie pris - Välj alla Alla variationer har redan genererats. Inga variationer att generera Välj flera Inga tillgängliga domäner för denna sökning - Generera alla varianter? Genererar varianter Detta kommer skapa en ny variation för varje möjlig kombination av variationsattribut (%1$d variationer). + Generera alla varianter? Skapande stöds för närvarande för högst %1$d variationer. Att generera variationer för den här produkten skulle skapa %2$d variationer. Gräns för generering överskriden Skapar variationer för alla kombinationer av dina attribut. + Generera alla variationer Skapa en ny variation. Ange manuellt vilka attribut som tillhör den variabla produkten. Lägg till ny variation Lägg till variation - Generera alla variationer - Försök att ansluta igen för att komma åt din butik. Lämna utan att ansluta Fortsätt ansluta + Försök att ansluta igen för att komma åt din butik. Jetpack är installerat men inte anslutet. Du har inte behörighet att ansluta Jetpack till den här butiken Kontakta din butikshanterare eller -administratör för att få hjälp. - Fel - Felkod %1$s - Din butik <b>%1$s</b> är nu ansluten till Jetpack. - Vänta medan vi ansluter din butik <b>%1$s</b> med Jetpack. - Ansluter Jetpack - Installerar Jetpack - Allt klart - Validerar - Anslut butik till Jetpack - Aktiverar - Installerar Jetpack Avbryt installation Försök auktorisera igen Försök att aktivera igen Försök installera igen Skaffa support Försök igen och kontakta supporten om detta fel fortsätter. - Du har inte behörighet att hantera tillägg på denna butik - Anslut Jetpack - Gå till butik Ett fel uppstod vid kommunikationen med din webbplats. + Du har inte behörighet att hantera tillägg på denna butik Det gick inte att auktorisera anslutningen till Jetpack Det gick inte att aktivera Jetpack Det gick inte att installera Jetpack + Anslut Jetpack + Gå till butik + Fel + Felkod %1$s + Din butik <b>%1$s</b> är nu ansluten till Jetpack. + Vänta medan vi ansluter din butik <b>%1$s</b> med Jetpack. Installera Jetpack Jetpack har anslutits + Ansluter Jetpack + Installerar Jetpack + Allt klart Ansluten + Validerar + Anslut butik till Jetpack + Aktiverar + Installerar Jetpack Logga in på <b>%1$s</b> med autentiseringsuppgifterna för din butik för att ansluta Jetpack. Logga in på <b>%1$s</b> med autentiseringsuppgifterna för din butik för att installera Jetpack. - Skapa din första butik - Anslut din butik till Jetpack för att komma åt den på denna app. Ha autentiseringsuppgifterna för din butik redo. + Anslut din butik till Jetpack för att komma åt den på denna app. Installera det kostnadsfria Jetpack-tillägget för att komma åt din butik med den här appen. Kom igång och börja sälj snabbt med en vacker onlinebutik. + Skapa din första butik + Slumpmässigt Aldrig Alltid - Slumpmässigt Uppdatera simulerad läsarnyckel Uppdatera simulerad kortläsare Anslut Jetpack Anslut butik - Besökare Det är här människor kommer hitta dig på Internet. Oroa dig inte, du kan ändra detta senare. + Besökare Eller logga in med lösenord - Simulerad läsarnyckel - Nuvarande lagerantal är %d Den simulerade kortläsaren har inaktiverats + Simulerad läsarnyckel Lagerkvantiteten har uppdaterats Den aktuella lagerkvantiteten är blandad + Nuvarande lagerantal är %d Uppdaterar lagerkvantiteten Lagerkvantiteten kommer att uppdateras för %d variationer Lagersaldo - Skapa en ny butik - Anslut en befintligt butik Sök filtrerade produkter Sök filtrerade beställningar + Anslut en befintligt butik + Skapa en ny butik + Nettoförsäljning: %1$s Sålda artiklar Produkter Produkter @@ -1479,102 +1493,104 @@ Language: sv_SE Inga intäkter denna period Intäkt %1$s – %2$s + Vi kunde inte skapa ett konto med de angivna autentiseringsuppgifterna. Prova med en annan e-postadress. + Ditt lösenord uppfyller inte våra säkerhetsriktlinjer. Försök med ett mer komplext lösenord. Ditt lösenord är för kort. Välj ett lösenord som har minst 6 tecken. Ange en giltig e-postadress. Ett konto med denna e-post finns redan. - Ditt lösenord uppfyller inte våra säkerhetsriktlinjer. Försök med ett mer komplext lösenord. - Nettoförsäljning: %1$s - Vi kunde inte skapa ett konto med de angivna autentiseringsuppgifterna. Prova med en annan e-postadress. Försök med en annan adress Anpassat datumintervall Anpassat + Vad är WordPress.com? Skapar nytt konto Välj ett lösenord Din e-postadress Kom igång \npå några minuter Genom att klicka på knappen Anslut Jetpack godkänner du våra <a href=\'terms\'>användarvillkor</a> och samtycker till att <a href=\'sync\'>dela information</a> med WordPress.com. - Vad är WordPress.com? + Aktivera simulerad kortläsare + Kontakta webbplatsens ägare för en inbjudan till webbplatsen som butikschef eller administratör för att använda appen. Ansluter till en WordPress.com-webbplats Anslut till webbplatsen Anslut Jetpack till ditt konto - Kontakta webbplatsens ägare för en inbjudan till webbplatsen som butikschef eller administratör för att använda appen. - Aktivera simulerad kortläsare - Visa lösenord - Dölj lösenord Redigera behörigheter För att använda den här funktionen, tillåt att din kamera används. Kameraåtkomst krävs Kamerastreckkodsskanner Utvecklaralternativ 2FA stöds inte för webbplatser som drivs på egen server. Använd ett applösenord. + Visa lösenord + Dölj lösenord Per den %1$s Det gick inte att ladda data + WooCommerce-statistik idag Dagens butiksstatistik Butiksanalys inte tillgänglig! Uppgradera till den senaste versionen av WooCommerce för att visa din butiksanalys. Ditt nätverk är inte tillgängligt.\nKontrollera din data eller WiFi-anslutning. Logga in på WooCommerce-appen - WooCommerce-statistik idag - Verifierar Jetpack-anslutning … Det gick inte att hämta anslutningsdata … + Verifierar Jetpack-anslutning … Kan inte verifiera din Jetpack-anslutning. Försök igen. Webbplatsen %1$s har för närvarande ett WordPress.com-paket som inte stöder installation av tillägg. Uppgradera ditt paket för att använda WooCommerce. Det verkar som att ditt konto inte är anslutet till Jetpack för %1$s KORTLÄSARE BETALNINGSALTERNATIV - Vi kunde inte ansluta till din webbplats. Kontakta supporten för att felsöka problemet. Kassaalternativet Betala personligen gör det möjligt att ta emot betalningar för webbplatsbeställningar vid upphämtning eller leverans. <a href=\'\'>Läs mer</a> Betala personligen + Vi kunde inte ansluta till din webbplats. Kontakta supporten för att felsöka problemet. Anslutningsfel Det finns ett problem som kräver din uppmärksamhet. <a href=\'\'>Ta en titt på detta</a> Försök med en annan adress Det gick inte att aktivera Postförskott. Försök igen senare. Aktivera Betala personligen - Ett fel uppstod, kontakta support - Ange en webbplatsadress <a href=\'\'>Läs mer</a> om Personliga betalningar Är WooCommerce nytt för dig? + Ett fel uppstod, kontakta support + Ange en webbplatsadress Få en inloggningslänk via e-post Kommer du inte ihåg ditt lösenord? Vi har noterat att du inte har slutfört installationen av Personliga betalningar. <a href=\'\'>Fortsätt installationen</a> Betalningar Jag förstår! + Now you can quickly access In-Person Payments and other features with ease Betalningar från menyfliken + Din e-post används inte med ett WordPress.com-konto. Andra webbplatser Logga in med din butiksadress WC-admin - Now you can quickly access In-Person Payments and other features with ease - Din e-post används inte med ett WordPress.com-konto. + Vi har precis skickat en magisk länk till Kontrollera din e-post på denna enhet! Använd lösenord för att logga in Logga in med magisk länk - Logga in med dina webbplatsuppgifter Vi har precis skickat en magisk länk till din e-postadress. Tryck på länken i e-postmeddelandet för att logga in. - Vi har precis skickat en magisk länk till + Logga in med dina webbplatsuppgifter + Ge dina kunder användbara och relevanta produktrekommendationer genom att lägga till merförsäljning och korsförsäljning + Öka din försäljning med länkade produkter + Börja sälja personligen på under 20 minuter med vår kortläsare. + Det gick inte att uppdatera beställning #%1$d + Beställning #%1$d har markerats som slutförd + Markera\nslutförd Installera WooCommerce + Det verkar som att %1$s inte är en WooCommerce-webbplats. + Växla mellan flera olika butiker Hantera mina beställningar Skapa eller uppdatera mina produkter + Kolla min analys + Försöker skapa en butik + Utforskar bara + Vad för dig till WooCommerce? Tips Ställ in nu - Öka din försäljning med länkade produkter - Börja sälja personligen på under 20 minuter med vår kortläsare. - Vad för dig till WooCommerce? - Utforskar bara - Försöker skapa en butik - Kolla min analys - Växla mellan flera olika butiker - Det verkar som att %1$s inte är en WooCommerce-webbplats. - Markera\nslutförd - Beställning #%1$d har markerats som slutförd - Det gick inte att uppdatera beställning #%1$d - Ge dina kunder användbara och relevanta produktrekommendationer genom att lägga till merförsäljning och korsförsäljning Då sätter vi igång! Logga in med WordPress.com Kontakta supporten + Logga in med ditt WordPress.com-konto Skaffa lite hjälp! Har du problem med att logga in? + Artikelnr Alla produkter VISA INTE IGEN PÅMINN MIG SENARE + Inga problem! Du kan alltid komma igång med In-Person Payments via Inställningar. Personliga betalningar Köp kortläsare Ta emot betalningar enkelt @@ -1582,29 +1598,27 @@ Language: sv_SE Avfärda Visa anpassade fält Anpassade fält - Installera Jetpack - Du kan hantera dem snabbt och enkelt - Vi vet att det är viktigt för ditt företag Det gick inte att spara ändringar Detta kommer att markera denna beställning som betald om du fått betalning utanför WooCommerce - Artikelnr - Inga problem! Du kan alltid komma igång med In-Person Payments via Inställningar. + Installera Jetpack Vi gör det möjligt för dig att bearbeta betalningar på ett enkelt och smidigt sätt + Du kan hantera dem snabbt och enkelt + Vi vet att det är viktigt för ditt företag Är WooCommerce nytt för dig? - Logga in med ditt WordPress.com-konto - Du har en ny beställning! 🎉 Ny beställning för 50 USD i din WooCommerce-butik + Du har en ny beställning! 🎉 detaljerna Redigera alla %1$s genom att gå igenom beställningen i din WooCommerce-butiksadmin %1$s är ofullständiga - Fortsätt söka - Inväntar betalning Dela systemstatusrapport Kopiera systemstatusrapport till urklipp + Fortsätt söka + Personlig betalning för beställning #%1$s för %2$s blog_id %3$s. Ändra betalningsleverantör Återbetalat: %1$s - Personlig betalning för beställning #%1$s för %2$s blog_id %3$s. + Inväntar betalning Fortsätt med installation + Saker du bör veta innan du installerar Installera utökning WooCommerce Shipping Rensa filter @@ -1613,26 +1627,30 @@ Language: sv_SE Det gick inte att ladda in produkter Sök produkter Filter (%d) - Saker du bör veta innan du installerar Vissa e-postadresser är ogiltiga. Åtgärda den angivna e-postadressen/de angivna e-postadresserna. Lista över tillåtna fakturerings-e-postadresser att kontrollera mot när en beställning görs. Separera e-postadresser med kommatecken. Du kan också använda en asterisk (*) för att matcha delar av en e-postadress. Exempelvis skulle \"*gmail.com\" matcha alla gmail-adresser. + Inga produkter matchar de valda filtren ” Bekräfta betalningsmetod Stripe WooCommerce Payments - Inga kunder hittades. + Personliga betalningar kan behandlas via båda dessa betalningsleverantörer. Vilken leverantör vill du använda? Välj din betalningsleverantör låst - Delar av denna beställning är för närvarande inte redigerbara - Inga produkter matchar de valda filtren ” - Personliga betalningar kan behandlas via båda dessa betalningsleverantörer. Vilken leverantör vill du använda? För att redigera produkter eller betalningsinformation, ändra statusen till Inväntar betalning. + Delar av denna beställning är för närvarande inte redigerbara Sök efter kunder + Inga kunder hittades. Inte nu Lägg till utökningar till butik Vad är WooCommerce Shipping? Kom åt rabatterade fraktavgifter. För närvarande endast tillgängligt med DHL och USPS, men fler alternativ kommer snart. + Rabatterade avgifter + Hämta en beställning och sedan är det bara att betala, skriva ut, paketera och skicka. Skriv ut från din telefon + Du behöver inte undra var den frimärkshäftet tog vägen. + Köp porto när du behöver det Spara tid och pengar + Fullfölj dina beställningar med WooCommerce Shipping Visa detaljer Välj variant %s Exkludera produktkategorier @@ -1641,10 +1659,13 @@ Language: sv_SE Inga begränsningar Tillåtna e-postadresser Obegränsat + Samtliga kvalificerande artiklar Obegränsat Ingen Redigera produktkategorier (%1$d) Välj produktkategorier + För närvarande stöds massuppdatering för maximalt 100 varianter. + Gräns för massuppdatering har överskridits Uppdatera ordinarie priser Uppdaterar reapriser Uppdaterade reapriser. @@ -1662,14 +1683,9 @@ Language: sv_SE Massuppdatera OK Massuppdatera … - Du behöver inte undra var den frimärkshäftet tog vägen. - Köp porto när du behöver det - För närvarande stöds massuppdatering för maximalt 100 varianter. - Gräns för massuppdatering har överskridits - Hämta en beställning och sedan är det bara att betala, skriva ut, paketera och skicka. - Fullfölj dina beställningar med WooCommerce Shipping - Rabatterade avgifter - Samtliga kvalificerande artiklar + Hämtar varianter … + Det gick inte att söka efter produktkategorier + Det gick inte att läsa in produktkategorier Sök kategorier Rensa val Klicka för att avmarkera @@ -1677,17 +1693,15 @@ Language: sv_SE Välj %1$d kategorier Inga produktkategorier hittades Välj kategorier - Behöver du en fraktetikett? + Avfärda banner för att installera WC Shipping Skaffa WooCommerce Shipping Skriv ut etiketter från din telefon, med WooCommerce Shipping. - Hämtar varianter … - Det gick inte att söka efter produktkategorier - Det gick inte att läsa in produktkategorier - Avfärda banner för att installera WC Shipping + Behöver du en fraktetikett? + Ändra produktantalet från %1$d till %2$d Uppdatera ordinarie pris Uppdatera reapris - Ändra produktantalet från %1$d till %2$d Vi stöder inte WooCommerce Stripe-utökningen i %1$s + Filter Rensa val Välj %d produkt Välj %d produkter @@ -1696,31 +1710,32 @@ Language: sv_SE Redigera produkter (%d) Alla produkter Välj produkter - Exkludera artiklar på rea Aktivera det här alternativet om rabattkoden inte ska gå att tillämpa på reavaror. Per-artikel-rabattkoder fungerar bara om varan inte är en reavara. Per-varukorg-rabattkoder fungerar bara om varorna i varukorgen inte är reavaror. + Exkludera artiklar på rea Aktivera det här alternativet om rabattkoden inte ska kunna användas tillsammans med andra rabattkoder. - Filter - Vänta … - Sparar rabattkod - Rabattkod uppdaterad - Användningsbegränsningar - Ingen - Tillämpa denna rabattkod på - Välj butik att ansluta - %s i lager - Det gick inte att hämta butiker - Inkludera gratis frakt? - Rensa Kan inte kombineras Användningsbegränsning per kund Begränsa användningen till X artiklar Användningsbegränsning per rabattkod Maximalt beställningsbelopp (%1$s) Minsta beställningsbelopp (%1$s) + Vänta … + Sparar rabattkod Det gick inte att uppdatera rabattkoden + Rabattkod uppdaterad + Användningsbegränsningar Användningsinformation + Inkludera gratis frakt? + Rensa + Ingen + Tillämpa denna rabattkod på Det gick inte att söka efter rabattkoder Det gick inte att hämta rabattkoder + Det gick inte att hämta butiker + Välj butik att ansluta + %s i lager + Lägg till beskrivningen för rabattkoden. + Rabattkodsbeskrivning Redigera beskrivning Lägg till beskrivning (valfritt) Rabattkodens utgångsdatum @@ -1731,90 +1746,93 @@ Language: sv_SE Ställ in beloppet på rabatten du vill erbjuda. Ställ in procenten för rabatten du vill erbjuda. Belopp (%1$s) + Rabattkodsinformation Redigera %1$s Redigera rabattkod Kan inte uppdatera produkt - Lägg till beskrivningen för rabattkoden. - Rabattkodsbeskrivning - Rabattkodsinformation Något gick fel när återbetalningen skulle tillämpas Tillämpar återbetalning för beställning - Kopierat till urklipp + Kortläsarbild Beräknat belopp: %s Beräkna som procent - Kortläsarbild - Kan användas %1$d gång - Kan användas %1$d gånger - Rabattkod borttagen - Misslyckades att ta bort rabattkod - Är du säker på att du vill ta bort denna rabattkod? - Ta bort rabattkod - Avfärda alla - Inkorg + Kopierat till urklipp Begränsad till kunder med följande e-postadresser: %1$s Gäller inte reavaror Tillåter gratis frakt Kan inte kombineras Begränsad till %1$d artiklar i varukorgen Begränsad till %1$d artiklar i varukorgen + Kan användas %1$d gång + Kan användas %1$d gånger %1$d användning per användare %1$d användningar per användare + Rabattkod borttagen + Misslyckades att ta bort rabattkod + Är du säker på att du vill ta bort denna rabattkod? + Ta bort rabattkod Det gick inte att synkronisera inkorgen + Avfärda alla + Inkorg Kortläsarmanualer Tryck eller infoga för att återbetala Beställningen är redan återbetald - OK Återbetalning avbruten - Denna återbetalning kunde inte behandlas - Kortet stöder inte denna typ av återbetalning - Prova ett annat sätt att återbetala + OK Systemtestkort är inte tillåtna för återbetalningen Återbetalningsbeloppet är inte tillåtet för det aktuella kortet Återbetalningen avvisades på grund av otillräckliga medel En identisk återbetalning skickades nyligen + Kortet stöder inte denna typ av återbetalning Återbetalningen avvisades av ospecificerad anledning + Prova ett annat sätt att återbetala Återbetalningen avvisades av okänd anledning - Kopiera + Denna återbetalning kunde inte behandlas Återbetalning lyckades - Återbetalning misslyckades Behandlar återbetalning Återbetala betalning + Återbetalning misslyckades Förbereder återbetalning av betalning + Kopiera Sök rabattkoder - Rabattkod - Löper ut %1$s - Anpassad rabatt (%1$s) - Fast produktrabatt - Fast varukorgsrabatt - Dela rabattkod - Kopiera rabattkod - Rabattkod kopierad till urklipp. Det gick inte att generera meddelandet för delning av rabattkoden Det gick inte att dela rabattkoden. Tillämpa %1$s rabatt på utvalda produkter med kampanjkoden %2$s Tillämpa %1$s rabatt på alla produkter med kampanjkoden %2$s Det gick inte att kopiera rabattkoden till urklipp. + Rabattkod kopierad till urklipp. + Rabattkod Det gick inte att ladda rabattkodssammanfattningen + Löper ut %1$s %1$s rabatt på %2$s + Anpassad rabatt (%1$s) + Fast produktrabatt + Fast varukorgsrabatt Procentuell rabatt Det gick inte att ladda rabattkodsprestanda + Dela rabattkod + Kopiera rabattkod Tack för din feedback! - Dela betalningslänk Kortläsarbetalningar kräver exakt platsbehörighet Åtkomst till plats krävs Kassa – %s + Dela betalningslänk Belopp Belopp Rabatterade beställningar + Prestanda + Maximalt beställningsbelopp på %s + Minsta beställningsbelopp på %s + Rabattkodssammanfattning + Visa rabattkodssammanfattning + Vi har arbetat med att göra det möjligt att visa och redigera rabattkoder från din enhet! Visa och redigera rabattkoder Inga rabattkoder hittades - Rabattkoder - %d kategorier - %d kategori - Visa rabattkodssammanfattning + %1$s exkl. %2$s + %1$s och %2$s allt Har löpt ut Aktiva + Rabattkoder Skapades den %s För %d dagar sedan För en dag sedan @@ -1822,17 +1840,12 @@ Language: sv_SE För en timme sedan För %d minuter sedan För en stund sedan + %d kategorier + %d kategori \u2022 inga godkända recensioner \u2022 en godkänd recension \u2022 %d godkända recensioner %1$s (%2$s%%) - Prestanda - Maximalt beställningsbelopp på %s - Minsta beställningsbelopp på %s - Rabattkodssammanfattning - Vi har arbetat med att göra det möjligt att visa och redigera rabattkoder från din enhet! - %1$s och %2$s - %1$s exkl. %2$s Vi har jobbat på att göra det möjligt att skapa beställningar från din enhet. Du kan prova den här funktionen genom att trycka på \"+\"-knappen Kom tillbaka snart för fler tips och insikter om hur du får din butik att växa Grattis, du har läst allt! @@ -1845,12 +1858,12 @@ Language: sv_SE Anrop med XML-RPC verkar blockerade på denna webbplats (felkod 401). Om försöket att logga in misslyckas tryck på hjälpikonen för att se vanliga frågor. Kunde inte läsa WordPress-webbplatsen på denna URL. Tryck på hjälpikonen för att se vanliga frågor. Tjänsten för XML-RPC är inaktiverad på denna webbplats. - Procent (%) Använd en e-postadress som inte är kopplad till Automattic för att skicka in ett supportärende Vi stöder inte Stripe-konton som är registrerade i %1$s + Vi stöder inte WooCommerce Payments-utökning i %1$s Tryck på strömknappen på din läsare Ett kvitto har skickats till <strong>%s</strong> - Vi stöder inte WooCommerce Payments-utökning i %1$s + Procent (%) Ta bort avgift från beställning Ta bort frakt från beställning Frakt @@ -1861,9 +1874,11 @@ Language: sv_SE Avgifter Kunddetaljer Lägg till avgift + Redigera kundanteckning Redigera kunddetaljer Redigera beställningsstatus - Redigera kundanteckning + Beställningen med enkel betalning gick inte att uppdatera + Beställningen med enkel betalning gick inte att skapa Användarens profilbild Recensioner Visa butik @@ -1871,31 +1886,29 @@ Language: sv_SE Analyser Betalningar WooCommerce-admin - Beställningen med enkel betalning gick inte att uppdatera - Beställningen med enkel betalning gick inte att skapa Meny Uppdatera efter uppdatering Hantera tillägg WooCommerce Payments - eller WooCommerce Stripe Gateway 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: Personliga betalningar fungerar endast med ett av följande tillägg aktiverat. Inaktivera ett av dessa tillägg för att fortsätta. Konflikt mellan betalningstillägg upptäckt Momser totalt + eller Installera Jetpack - Vänta … - Skapar din beställning - Skapa + Personliga betalningar är för närvarande inte tillgängliga Beställning skapad Misslyckades att skapa beställning - Personliga betalningar är för närvarande inte tillgängliga + Vänta … + Skapar din beställning Beställningens totalsumma Produktbelopp Betalning Nettoförsäljning: %s Sålda artiklar Konvertering + Skapa App-ikon Ikon för tillbaka Logga för Automattic @@ -1926,69 +1939,58 @@ Language: sv_SE Kontakta supporten Aktivera Installera + %s Jetpack i WP Admin aktivera installera - %s Jetpack i WP Admin + Alternativt kan du %s Jetpack i WP-admin. Försök igen. ansluter aktivering installation - WooCommerce - Alternativt kan du %s Jetpack i WP-admin. Något gick fel under %s Hej! Här är en länk för att ladda ner WooCommerce-appen. Jag tycker att den är jättebra och tänkte att du också skulle gilla den. %1$s - review_card_%1$s - review_card_detail - product_card_%1$s + WooCommerce product_card_detail + product_card_%1$s + review_card_detail + review_card_%1$s Uppdatera Stripe - Välj variant - Ta bort produkt från beställning - Lägg till rabatt - Produkt Du är nästan där! Slutför konfigurationen av Stripe för att börja ta emot kortbetalningar. Slutför konfigurationen av Stripe i adminpanelen för din butik Återbetala avgifter Avgiftsåterbetalning + Välj variant + Ta bort produkt från beställning + Lägg till rabatt + Produkt + Lägg till en annan leveransadress I lager %s i lager + Lägg till produkter Produkter + Lägg till kunddetaljer Kund Markera som betald + Detta kommer att skapa din beställning och markera den som slutförd om du har mottagit betalning utanför WooCommerce Markera som betald? Välj din betalningsmetod - Moms (%s&nbsp;%%) - Lägg till en annan leveransadress - Detta kommer att skapa din beställning och markera den som slutförd om du har mottagit betalning utanför WooCommerce Moms beräknas automatiskt baserat på din butiksadress - Lägg till kunddetaljer - Lägg till produkter + Moms (%s&nbsp;%%) + Ta emot betalning %s + Debitera moms Anpassat belopp Ange e-post - Moms - Kontant - Kort - Ta emot betalning %s - Debitera moms Enkel betalning - order_card_%1$s order_card_detail + order_card_%1$s + Kontant + Kort + Moms E-post - Uppdatera efter uppdatering Lägg till anteckning Kundmeddelande + Uppdatera efter uppdatering En föråldrad version av utökningen WooCommerce Stripe Gateway är installerad för din butik. Uppdatera den för att ta emot personliga betalningar. - Ny beställning - Förra veckan - År till datum - Kvartal till datum - Månad till datum - Vecka till datum - Förra året - Förra kvartalet - Förra månaden - Kortet har löpt ut - %1$s (%2$s) Betalningen avvisades av okänd anledning Ett live-kort användes på en webbplats i testläge Systemtestkort är inte tillåtna för betalning @@ -1997,6 +1999,7 @@ Language: sv_SE Betalningsbeloppet är inte tillåtet för det aktuella kortet Betalningen avvisades på grund av otillräckliga medel Transaktionens postnummer och kortets postnummer matchar inte + Kortet har löpt ut En identisk transaktion skickades nyligen Kortet stöder inte denna valuta Kortet stöder inte denna typ av köp @@ -2004,71 +2007,82 @@ Language: sv_SE Betalningen avvisades av ospecificerad anledning Prova en annan betalningsmetod Det kan fungera att prova igen + Ny beställning Väljare för datumintervallsfilter kontra föregående period (%1$s) + %1$s (%2$s) + År till datum + Kvartal till datum + Månad till datum + Vecka till datum + Förra året + Förra kvartalet + Förra månaden + Förra veckan + Enkla betalningar Visa utökningar Vi kunde inte hitta några beställningar Öppna inställningar - Enkla betalningar Saknar nödvändig behörighet för enheter i närheten + Filtrera länder + Filtrera stater + Status Slutdatum Startdatum Välj datum Anpassat intervall + Skapa en beställning med minimalt med information + Enkel betalning Skapa en ny manuell beställning Skapa beställning Skapa beställning Ange belopp - Filtrera länder - Filtrera stater - Status - Skapa en beställning med minimalt med information - Enkel betalning Ta emot betalning Enkel betalning - Analys Skapa beställningar från din enhet! + Analys + Allt klart Ansluter din butik Aktiverar Installerar Jetpack - Installera Jetpack - din webbplats - Installerar\nJetpack - Läsare är ansluten - Allt klart Vänta medan vi ansluter %s till Jetpack. + Installerar\nJetpack + din webbplats Installera det kostnadsfria Jetpack-tillägget till <strong>%s</strong> för den bästa mobilupplevelsen. + Installera Jetpack Produktrecensionerna kunde inte hämtas Läsaren är frånkopplad + Läsare är ansluten Att avbryta en pågående programvaruuppdatering är inte att rekommendera. Om du avbryter blockeras din läsaranslutning. Uppdateringen av läsarprogramvaran misslyckades, eftersom läsarens batteri inte är tillräckligt laddat. Ladda läsaren till över 50 %% innan du försöker igen. - Ladda läsare Uppdateringen av läsarprogramvaran misslyckades, eftersom läsarens batteri endast är laddat till %1$s%%. Ladda läsaren till över 50 %% innan du försöker igen. - %1$s (%2$d) - Alla - Filtrerade beställningar - Alla beställningar - Kontrollera din mobila enhet - Senaste 30 dagarna - Senaste 7 dagarna - Senaste 2 dagarna - Idag - Ange adress + Ladda läsare Din kortläsares programvara behöver uppdateras för att fungera korrekt Ange ett giltigt postnummer i dina butiksinställningar och försök igen Postnumret i butiksadressen är ogiltigt + Ange adress Ange din butiksadress för att fortsätta + Kontrollera din mobila enhet Adressen kan inte uppdateras med en tom e-postadress. Kontrollera att du kör den senaste versionen av WooCommerce. + Senaste 30 dagarna + Senaste 7 dagarna + Senaste 2 dagarna + Idag + %1$s (%2$d) + Alla + Filtrerade beställningar + Alla beställningar Inte nu Installera Jetpack - Användarprofiler Tillåt flera användare att komma åt WooCommerce Mobile. + Användarprofiler Nya analysvyer gör det möjligt att se besökare, rapporter med mera. Analys Få push-notiser för nya beställningar, recensioner med mera levererade till din enhet. Push-notiser Installera det kostnadsfria Jetpack-tillägget för den bästa mobilupplevelsen. Få ut så mycket som möjligt av din butik + Använd som leveransadress Använd som faktureringsadress Filter (%d) Filter @@ -2081,14 +2095,14 @@ Language: sv_SE Visa beställningar Filtrerade beställningar Alla beställningar - Använd som leveransadress Berätta mer om %s … - Läsarens serienummer kopierad till urklipp Beskriv din produkt för dina framtida kunder … - Lägg till leveransadress + Läsarens serienummer kopierad till urklipp Lägg till faktureringsadress - Faktureringsadress + Lägg till leveransadress Lägg till kundanteckning + Faktureringsadress + Leveransadress Adress Land Postnummer @@ -2100,9 +2114,7 @@ Language: sv_SE E-post Efternamn Förnamn - Leveransadress Redigera en kundbeställningsanteckning - OK Det gick inte att hämta SSR. Kontrollera WooCommerce -> Status i WP-admin. Det gick inte att dela systemstatusrapporten Det gick inte att kopiera SSR till urklipp @@ -2113,56 +2125,57 @@ Language: sv_SE Grattis, du kan nu ta emot kredit- och betalkortsbetalningar med WooCommerce Payments! Ta emot betalningar med en kortläsare Belopp måste vara minst %1$s + OK + Bild på ny funktionsikon + Växla butik + Uppdatering av produkt %1$s misslyckades + %1$d bilder har lagts till för produkten %2$s Produkt uppdaterad Uppdaterar produkt %1$s - OK - Något gick fel - Uppdatering av produkt %1$s misslyckades - Spara kvitto och fortsätt Bilduppladdning kommer fortsätta i bakgrunden - Växla butik - %1$d bilder har lagts till för produkten %2$s - Bild på ny funktionsikon + Spara kvitto och fortsätt + OK Vi kan inte läsa in Beställningstillägg för närvarande - Kategori - Visa utökningar + Något gick fel Vad som är nytt i WooCommerce + Visa utökningar Vi kan tyvärr inte ändra den här funktionsinställningen för tillfället + Kategori Du har en ny recension! 🌟 Du har en ny beställning! 🎉 %d artikel - Sparar din produkt - %d produkter - %d produkt - Försök igen med ett annat kort - Försök igen med samma kort - Ta bort kortet - Se till att kortläsaren är ansluten. - %d arbetsdagar - %d arbetsdag %d merförsäljningsprodukter %d merförsäljningsprodukt %d korsförsäljningsprodukter %d korsförsäljningsprodukt + %d produkter + %d produkt Produktutökningar + Sparar din produkt Väntande recension + Se till att kortläsaren är ansluten. + Försök igen med ett annat kort Prova att trycka på, föra in eller svepa ditt kort Flera kort upptäckta. Prova igen med endast ett kort + Ta bort kortet + Försök igen med samma kort %d poster %d artikel + %d arbetsdagar + %d arbetsdag Vi kunde inte verifiera leveransadressen automatiskt: %s Vi kunde inte automatiskt verifiera ursprungsadressen. Visa adressen i Google Maps för att verifiera att den är korrekt. Vi arbetar på att göra det enklare för dig att se produkttillägg från din enhet! För tillfället kan du endast se tilläggen för dina beställningar. Du kan skapa och redigera dessa tillägg i din webbadminpanel. - Spara + Visa utökningar från din enhet! Om du byter namn på ett tillägg i din webbadminpanel, observera att vissa beställningar inte längre kommer att visa tillägget i appen. Visa utökningar - Visa utökningar från din enhet! - %d filer kunde inte laddas upp + Spara Ladda upp information (%d) - Media kunde inte hittas - <a href=\'\'>Läs mer</a> om att ladda upp bilder + %d filer kunde inte laddas upp %d fil kunde inte laddas upp + Media kunde inte hittas Du kan redigera produkttillägg i webbadminpanelen. + <a href=\'\'>Läs mer</a> om att ladda upp bilder Vi kunde inte verifiera personliga betalningar för den här butiken. Det gick inte att verifiera personliga betalningar för den här butiken. Firmware: %s @@ -2174,61 +2187,77 @@ Language: sv_SE Skriv ut fraktetikett Fraktetikett köpt! Skriv ut fraktetiketter - Håll din läsare laddad - Behöver du lite hjälp? <a href=\'\'>Kontakta support</a> - Svep, tryck eller sätt in kort - Läsare ansluten Personliga betalningar Det tar ungefär tre timmar att ladda din läsare + Håll din läsare laddad Din läsare går in i viloläge efter 10 minuter av inaktivitet. Det är bara att trycka på strömknappen för att återansluta den. Automatisk återanslutning Det är bara att svepa, trycka eller infoga kort på läsaren för att ta emot betalningar. + Svep, tryck eller sätt in kort Grattis, du kan nu ta emot kredit- och betalkortsbetalningar! + Läsare ansluten + Behöver du lite hjälp? <a href=\'\'>Kontakta support</a> <a href=\'\'>Läs mer</a> om att ta emot betalningar med din mobila enhet och att beställa kortläsare Personliga betalningar är inte tillgängliga i testläget. Stäng av det för att fortsätta. Personliga betalningar är för närvarande inte tillgängliga Det finns krav som inväntar granskning i ditt konto. Slutför dessa krav senast den %1$s för att fortsätta ta emot personliga betalningar. + Ditt konto har krav som inväntar granskning Du har minst ett försenat krav i ditt konto. Ta hand om det för att återuppta personliga betalningar. Personliga betalningar är för närvarande inte tillgängliga Du kommer att kunna ta emot personliga betalningar så snart vi har slutfört granskningen av ditt konto. - Ditt konto har krav som inväntar granskning - Uppdatera efter uppdatering - Uppdatera WooCommerce Payments Personliga betalningar är för närvarande inte tillgängliga Tyvärr kan vi inte erbjuda personliga betalningar för den här butiken. + Uppdatera efter uppdatering En föråldrad version av utökningen WooCommerce Payments är installerad för din butik. Uppdatera den för att ta emot personliga betalningar. + Uppdatera WooCommerce Payments Du är nästan där! Slutför konfigurationen av WooCommerce Payments för att börja ta emot personliga betalningar. - Ansluter till ditt konto - Uppdatera efter installation - Behöver du lite hjälp? <a href=\'\'>Kontakta support</a> - Uppdatera efter aktivering - Aktiverar paket - Välj ett paket att aktivera. - Alla tillgängliga paket har aktiverats - Installera WooCommerce Payments - Aktivera WooCommerce Payments Slutför konfigurationen av WooCommerce Payments i adminpanelen för din butik + Uppdatera efter aktivering Utökningen WooCommerce Payments är installerad för din butik, men den har inte aktiverats. Aktivera den för att ta emot personliga betalningar. + Aktivera WooCommerce Payments + Uppdatera efter installation Du måste installera den kostnadsfria utökningen WooCommerce Payments för din butik för att ta emot personliga betalningar. + Installera WooCommerce Payments <a href=\'\'>Läs mer</a> om att ta emot betalningar med din mobila enhet och att beställa kortläsare + Behöver du lite hjälp? <a href=\'\'>Kontakta support</a> Du kan fortfarande ta emot personliga kontanta betalningar genom att aktivera betalningsmetoden \"Postförskott\" i din butik + Vi stöder inte personliga kortbetalningar i %1$s + Ansluter till ditt konto Personliga betalningar Dubbelkolla måtten eller vikten på ditt paket eller prova att använda ett annat paket i Paketinformation Det finns inga fraktavgifter tillgängliga - Vi stöder inte personliga kortbetalningar i %1$s - Stäng + Alla tillgängliga paket har aktiverats + Aktiverar paket + Välj ett paket att aktivera. Obligatoriskt fält - Attribut skapade - Ingen internetanslutning - Ingen anslutning till server - Denna betalning kunde inte bearbetas + Stäng Variationen har skapats Generera ny variation Du kan nu skapa och hantera produktvariationer! Generera variation Nu när du har lagt till attribut kan du skapa din första variation! - Att avbryta en pågående programvaruuppdatering är inte att rekommendera + Attribut skapade %1$s%% slutförd + Att avbryta en pågående programvaruuppdatering är inte att rekommendera + Denna betalning kunde inte bearbetas + Ingen anslutning till server + Ingen internetanslutning + Skicka i originalförpackning + Lägg till i nytt paket + Denna vara finns för närvarande i %s. Vart vill du flytta den? + Avbryt + Flytta + Flytta vara + ”%1$s” sparat + Misslyckades att skapa paket. Försök igen. + Misslyckades att skapa paket: okänt API-problem. + Misslyckades att skapa paket: %1$s + Vänta … + Skapar nytt paket + Ogiltigt värde. + Detta fält är obligatoriskt. + Vikt för tomt paket + Tom förpackningsvikt (%1$s) Höjd (%1$s) Bredd (%1$s) Längd (%1$s) @@ -2237,147 +2266,133 @@ Language: sv_SE Låda Välj pakettyp Pakettyp - Avbryt - Flytta - Vänta … - Skapar nytt paket - Ogiltigt värde. - Detta fält är obligatoriskt. - Vikt för tomt paket + Konfigurera paketet som du kommer att använda för att skicka dina produkter. Vi kommer att spara den för framtida beställningar. Lägg till nytt paket Skapa nytt paket - Misslyckades att skapa paket. Försök igen. - Misslyckades att skapa paket: okänt API-problem. - Misslyckades att skapa paket: %1$s - ”%1$s” sparat - Skicka i originalförpackning - Lägg till i nytt paket - Denna vara finns för närvarande i %s. Vart vill du flytta den? - Flytta vara - Tom förpackningsvikt (%1$s) Paketets mått måste vara större än noll. Uppdatera måtten för din vara i sektionen Frakt på din produktsida för att fortsätta. - Konfigurera paketet som du kommer att använda för att skicka dina produkter. Vi kommer att spara den för framtida beställningar. + Originalförpackning + Varumått + Vara som skickas för sig + Beställningsstatus uppdaterad Skicka Skriv ut Se kvitto Avbryt ändå - Beställningsstatus uppdaterad - Originalförpackning - Varumått - Vara som skickas för sig - Slå på Bluetooth Det gick inte att uppdatera läsarens programvara Sökningen efter programvaruversionsuppdateringar misslyckades <a href=\'\'>Läs mer</a> om att ta emot mobilbetalningar och beställa kortläsare + Slå på Bluetooth + Ingen läsare ansluten Vi kunde inte ansluta din läsare Anslut Flera läsare hittade Beställningen är redan betald - Ingen läsare ansluten - Betalningsmetod har lagts till - Lägg till ett kreditkort - Ange ett giltigt telefonnummer Tack för ditt köp! Klicka på länken nedan för att visa ditt betalningskvitto.\n\n%s Det gick inte att ladda ner tullformuläret Skriv ut tullfaktura Skriv ut tullformulär Ett tullformulär måste skrivas ut och inkluderas i denna internationella försändelse Tullformulär + Betalningsmetod har lagts till + Lägg till ett kreditkort + Ange ett giltigt telefonnummer Skriv ut tullformulär - Ditt kvitto från %s - Lägg till produkt - Din kund valde %1$s Utforska hur du kan öka din butiksförsäljning. Börja sälja idag genom att lägga till din första produkt i butiken. + Lägg till produkt Variationsattribut Aktivera Bluetooth på den mobila enheten + Det gick inte att hämta beställningen. Beställningens status i appen kan vara föråldrad. + Ditt kvitto från %s Uppdaterar beställning Uppdaterar appstatusen - Det gick inte att hämta beställningen. Beställningens status i appen kan vara föråldrad. - 1 variation - Lär dig mer om att skriva ut kvitton med din enhet - Aktivera Bluetooth- eller Wifi-anslutning på din skrivare. - Parkoppla och anslut skrivaren till din mobil när du uppmanas till det. - Justera pappersstorleken efter behov och välj ”Skriv ut” när du är redo att skriva ut kvittot. + Din kund valde %1$s + Tullformulär kräver ett tiosiffrigt telefonnummer + Tullformulär ifyllt Om du har problem med att skriva ut från din enhet kontaktar du kundsupporten för din skrivare. Om utskrift inte är tillgänglig kan du alltid spara ditt kvitto som PDF och skicka det via e-post för att skriva ut det från en annan enhet. - Tullformulär ifyllt + Justera pappersstorleken efter behov och välj ”Skriv ut” när du är redo att skriva ut kvittot. + Parkoppla och anslut skrivaren till din mobil när du uppmanas till det. När du väljer \"Skriv ut kvitto\" efter att ha godkänt betalningen, ersätt \"Spara som PDF\" med \"Alla skrivare\" och sök efter ny skrivare. + Aktivera Bluetooth- eller Wifi-anslutning på din skrivare. Se till att Print Service-tillägget för din skrivare är installerat. + Lär dig mer om att skriva ut kvitton med din enhet För att skapa en variation måste du först ställa in dess attribut (dvs. \"Färg\", \"Storlek\") + 1 variation %1$s variationer - Tullformulär kräver ett tiosiffrigt telefonnummer USPS-spårning Uppdaterar din läsares programvara Programvaruuppdatering Läsarens programvara har uppdaterats - Karantän - Ingen - Annat - Prov - Innehållsdetaljer - Dokument - Beskrivning - Detta fält är obligatoriskt - Anpassad rad %1$d - Vikt (%1$s per enhet) - Värde (%1$s per enhet) + OKÄNT KORTLÄSARNAMN Koppla från läsare + Uppdatera din läsares programvara för att fortsätta ta emot betalningar + Uppdatera läsarens programvara + %s%% batteri ANSLUTEN LÄSARE Anslut kortläsare + Sätt på kortläsaren och placera den bredvid den mobila enheten Se till att kortläsare är laddad Anslut din kortläsare + Kort avvisades Ansluter till läsaren - Annat + Förbereder för att ta emot betalning + Det deklarerade värdet måste vara större än noll Vikt måste vara större än noll - Land där produkten tillverkades eller monterades - Ursprungsland - Ogiltigt format - Begränsningsdetaljer - Begränsningstyp - Innehållstyp - Returnera till avsändare om paketet inte kan levereras - upp till %s - Paketinnehåll - Sätt på kortläsaren och placera den bredvid den mobila enheten - Kort avvisades + Detta fält är obligatoriskt Beskriv vilken typ av begränsningar detta paket måste ha. Beskriv vilken typ av varor detta paket innehåller. - OKÄNT KORTLÄSARNAMN - Uppdatera din läsares programvara för att fortsätta ta emot betalningar - Uppdatera läsarens programvara - %s%% batteri - Förbereder för att ta emot betalning - Det deklarerade värdet måste vara större än noll + Vikt (%1$s per enhet) + Värde (%1$s per enhet) %1$s om HS-tariffnummer %1$s om internt transaktionsnummer + Anpassad rad %1$d + Annat Sanitär/fytosanitär inspektion + Karantän + Ingen + Annat + Prov Presenter + Dokument Handelsvaror + Land där produkten tillverkades eller monterades + Ursprungsland Tariffnumret måste vara 6 siffror långt HS-tariffnummer (valfritt) + Beskrivning + Paketinnehåll ITN krävs för försändelser till %1$s. ITN krävs för frakt av artiklar till ett värde som överstiger 2 500 USD per tariffnummer - Hoppa över + Ogiltigt format + Begränsningsdetaljer + Innehållsdetaljer + Begränsningstyp + Innehållstyp + Returnera till avsändare om paketet inte kan levereras + upp till %s + Om du har aktiverat den här inställningen kommer kunden att få ett bekräftelsemeddelande via e-post när beställningen har slutförts. + Granska beställning + 🎉 Beställning slutförd! Verifierar roll … Du har inte den korrekta användarrollen - Redigera och lägg till nya produkter var som helst - Granska beställning Lär dig mer om roller och behörigheter - Spåra försäljning och högpresterande produkter - Om du har aktiverat den här inställningen kommer kunden att få ett bekräftelsemeddelande via e-post när beställningen har slutförts. - 🎉 Beställning slutförd! Den här appen har endast stöd för användarrollerna Administratör och Butikschef. Kontakta butiksägaren för att uppgradera din roll. + Redigera och lägg till nya produkter var som helst Hantera och redigera beställningar i farten + Spåra försäljning och högpresterande produkter + Hoppa över Extern produkt Grupperad produkt Variabel produkt En unik digital produkt som tjänster, nedladdningsbara böcker, musik eller videor + En unik fysisk produkt som du kan behöva frakta till kunden Enkel fysisk produkt Öppna inställningar Öppna inställningar - En unik fysisk produkt som du kan behöva frakta till kunden Bluetooth är inaktiverat + Plats är inaktiverad + Saknar nödvändig exakt platsbehörighet Det gick inte att ansluta till läsaren. Ansluter till läsaren Anslut läsaren @@ -2385,68 +2400,62 @@ Language: sv_SE Söker efter läsare Antal artiklar Skapa ny leveransetikett - Plats är inaktiverad - Saknar nödvändig exakt platsbehörighet Enkel virtuell produkt + Vill du ta bort denna variant? + Genererar variation Tar bort produkt Skicka kvitto Skriv ut kvitto - Betalning lyckades - Betalning misslyckades - Tryck eller infoga för att betala - Vill du ta bort denna variant? Fångar upp betalning Behandlar betalning Läsaren är redo + Betalning misslyckades + Betalning lyckades Ta emot betalning + Tryck eller infoga för att betala Det gick inte att förhandsgranska fraktsedeln. Installera en app för PDF-visning och försök igen. Vi kunde inte detektera någon WordPress-webbplats på den angivna adressen. Se till att WordPress är installerat och att du kör den senaste tillgängliga versionen. flera fraktrader - Genererar variation - Vänta … - Spara till senare Kunde inte markera beställningen som slutförd - Etiketter som är äldre än 30 dagar kan inte återbetalas - Skriv ut fraktetikett - Fraktetikett köpt! Ett fel uppstod vid köp av etiketterna + Vänta … Köpa etikett Etikettbilder som är äldre än 180 dagar tas bort av våra teknikpartners i generella säkerhets- och dataskyddssyften. - Typ av variation, t.ex. storlek eller färg - Ändra namn + Skriv ut fraktetikett + Spara till senare + Fraktetikett köpt! + Etiketter som är äldre än 30 dagar kan inte återbetalas Typ + Ändra namn Det gick inte att byta namn på ditt attribut + Typ av variation, t.ex. storlek eller färg Byt namn på attribut - Attribut - och - Ta bort detta attribut? Var det inte meningen att skapa ett nytt konto? Gå tillbaka och skriv din e-postadress igen. + Anslut kortläsare Hantera kortläsare Butiksinställningar - Anslut kortläsare + Attribut Du kan återbetala %1$s Ta emot betalning + och + Ta bort detta attribut? Valfri Fel när dina attribut sparades - Signatur obligatoriskt (%s) + Det är bara webbplatsens ägare som kan hantera betalningsmetoderna för fraktetiketter. Kontakta butiksägaren %1$s (%2$s) för att hantera betalningsmetoder. Lägg till variationer Lägg till variation + Lägg till din första variant %s totalt - Det är bara webbplatsens ägare som kan hantera betalningsmetoderna för fraktetiketter. Kontakta butiksägaren %1$s (%2$s) för att hantera betalningsmetoder. %s avgifter valda Berättigar till gratis signaturkrav Berättigar till gratis upphämtning + Försäkring (%s) + spårning Inkluderar %s Måste signeras av en vuxen (%s) - spårning - Försäkring (%s) + Signatur obligatoriskt (%s) Kunden betalade %1$s av %2$s för frakt - Lägg till din första variant - gratis - Annat - Delsumma - Ett alternativ med detta namn finns redan - Ett attribut med detta namn finns redan + När du köper fraktetiketter med WooCommerce, får du 5 % till 40 % i rabatt jämfört med postkontoret. Vad innebär rabatt på WooCommerce-tjänster? Det gick inte att hämta leveransalternativen Transportföretag och avgifter @@ -2455,33 +2464,40 @@ Language: sv_SE Ordersumma Läs mer om rabatt på WooCommerce-tjänster Rabatt på WoCommerce-tjänster + Delsumma Beställningssammanfattning för fraktetiketter + gratis + Annat + Ett alternativ med detta namn finns redan + Ett attribut med detta namn finns redan Lägg till varje alternativnamn och tryck på retur Eller tryck för att välja ett befintligt alternativ Namn på alternativ - När du köper fraktetiketter med WooCommerce, får du 5 % till 40 % i rabatt jämfört med postkontoret. + Ett fel uppstod när dina inställningar skulle sparas Vänta … Sparar dina inställningar Löper ut %1$s + E-posta inköpskvitton till %1$s (%2$s) på %3$s + Kreditkort hämtas från följande WordPress.com-konto: %1$s <%2$s> + %1$s****%2$s Lägg till ett annat kreditkort Betalningsmetod vald Vänta … - %1$s****%2$s - Ett fel uppstod när dina inställningar skulle sparas - E-posta inköpskvitton till %1$s (%2$s) på %3$s - Kreditkort hämtas från följande WordPress.com-konto: %1$s <%2$s> Hämtar dina inställningar + Kreditkort slutar på %1$s Paypal VISA MasterCard Discover American Express + Eller tryck för att välja ett befintligt attribut + Nytt attributnamn Lägg till attribut Attribut Redigera attribut - Eller tryck för att välja ett befintligt attribut - Nytt attributnamn - Kreditkort slutar på %1$s + Total förpackningsvikt: %1$s %2$s + %1$d varor i %2$d förpackningar + Total förpackningsvikt: %1$s %2$s Anpassade paket Kan inte hämta produkter Vissa obligatoriska fält är tomma. @@ -2490,44 +2506,41 @@ Language: sv_SE Vänta … Laddar in paket! Packet %1$d + %d varor Kan inte ladda paketdefinitioner + Inkluderar förpackningsvikt + Total förpackningsvikt (%1$s) + Vald förpackning Paketdetaljer Flytta + Poster att slutföra Föreslagen adress Angiven adress + Vi har ändrat den adress du angav något. Använd den föreslagna adressen om den stämmer för att försäkra korrekt leverans. Redigera vald adress Använd vald adress - %1$d varor i %2$d förpackningar - Total förpackningsvikt: %1$s %2$s - Inkluderar förpackningsvikt - Total förpackningsvikt (%1$s) - Vald förpackning - Poster att slutföra - Vi har ändrat den adress du angav något. Använd den föreslagna adressen om den stämmer för att försäkra korrekt leverans. - Total förpackningsvikt: %1$s %2$s - %d varor Laddar in adressdata Nya funktioner tillgängliga! - Adress hittades inte + Hitta på karta + Kontakta kunden Ogiltig gata Husnummer saknas - Postnummer + Adress hittades inte + Vi kunde inte verifiera leveransadressen automatiskt. Visa i Google Maps eller testa att kontakta kunden för att verifiera att adressen stämmer. + Adressvalideringen misslyckades Vänta … + Adressvalideringen pågår + Det gick inte att läsa in adressdata + Använd adressen som angavs + Land + Postnummer + Delstat Ort Telefon Företag Namn - Land - Delstat - Använd adressen som angavs - Kontakta kunden - Vi kunde inte verifiera leveransadressen automatiskt. Visa i Google Maps eller testa att kontakta kunden för att verifiera att adressen stämmer. - Adressvalideringen misslyckades - Adressvalideringen pågår - Det gick inte att läsa in adressdata - Hitta på karta - Vänta … Google Maps-appen hittades + Vänta … Bildborttagning på produktvarianter stöds i WooCommerce 4.7 eller senare. Vänta Lägger till spårning @@ -2541,102 +2554,102 @@ Language: sv_SE Förpackningsinformation Skapa fraktetikett Läs mer + Skippa kön på postkontoret genom att skriva ut fraktetiketter till rabatterade priser hemma med din mobila enhet! Spara tid och pengar genom att fullfölja med WooCommerce Shipping WooCommerce Shipping Markera ordern som slutförd + Lär dig mer om att skapa etiketter med din mobila enhet Skapa fraktetikett - Skapa fraktetiketter från din enhet! Du kan nu skapa fraktetiketter för alla fysiska beställningar direkt från din enhet med hjälp av gratistillägget WooCommerce Shipping. Tryck på \"Skapa fraktetikett\" för att prova vår betafunktion! - Lär dig mer om att skapa etiketter med din mobila enhet - Skippa kön på postkontoret genom att skriva ut fraktetiketter till rabatterade priser hemma med din mobila enhet! - Redigera + Skapa fraktetiketter från din enhet! Avgifter Nettobetalning Betald Läs mer om att ansluta Jetpack + Redigera Validera Dra och släpp för att ändra ordning på foton - Radera - Fil-URL - Lägg till fil - 1 fil - %1$d filer - Fil - Avbryt - Ja, ändra + Inställningar för nedladdning Ange ett giltigt namn Ange fil-URL + WordPress mediabibliotek + Kontrollera att den angivna URL:en är giltig Vänta … Laddar upp filer - Filnamn - Inställningar för nedladdning - Kontrollera att den angivna URL:en är giltig Fel vid uppladdning av filen Lägg till nedladdningsbar fil + Lägg till nedladdningsbar fil från Inkludera nedladdningsbara filer med köp + Avbryt + Ja, ändra Alla filer som för närvarande är associerade med den här produkten kommer att tas bort. Är du säker på att du vill ta bort möjligheten att ladda ned filer när produkten köps? + Fil Är du säker på att du vill ta bort den här filen? Nedladdningsbar produkt + Radera Tidsgräns för nedladdning Nedladdningsgräns Ange antalet dagar innan en nedladdningslänk löper ut, eller lämna fältet tomt om länken aldrig löper ut. Ange antalet gånger som filen kan laddas ned eller lämna fältet tomt för obegränsade nerladdningar Detta är namnet på filen som visas för kunden + Filnamn Detta är URL:en för filen som kunderna får tillgång till. URL:er som anges bör redan vara kodade. + Fil-URL + Lägg till fil + 1 fil + %1$d filer Du kan behöva <b>konfigurera Wi-Fi-utskrift direkt på själva skrivaren.</b> Kontrollera att skrivarens fasta programvara är uppdaterad. Anvisningar finns i skrivarens dokumentation. Du kan välja din enhets <b>standardutskriftstjänst</b> eller installera din <b>skrivares varumärkesapp</b> (detta bör visas som ett rekommenderat alternativ) Se till att din skrivare och din enhet är anslutna till <b>samma Wi-Fi-nätverk</b> - WordPress mediabibliotek - Lägg till nedladdningsbar fil från + Testa det nya enkla, länkade och grupperade produktskapandet medan vi gör oss redo för lansering + Öka försäljningen med merförsäljning och korsförsäljning Redigera produkter Lägg till produkter - Öka försäljningen med merförsäljning och korsförsäljning Produkter som marknadsförs i kundvagnen när den nuvarande produkten är vald - Testa det nya enkla, länkade och grupperade produktskapandet medan vi gör oss redo för lansering Korsförsäljning Produkter som marknadsförs istället för den för närvarande visade produkten (dvs. mer lönsamma produkter) Merförsäljning Länkade produkter %1$s%2$s x %3$s Skaffa en länk för inloggning via e-post - Välj pappersstorlek - Pappersstorlek + Hmm. Vi hittar inget konto hos WordPress.com som är kopplat till denna e-postadress. + Testa att visa Beställningstillägg medan vi gör oss redo för lanseringen Skapar produkter + Inställningar + Ett fel inträffade när produkten skulle slängas Produkt flyttad till papperskorg Flytta till papperskorg Vill du flytta denna produkt till papperskorgen? + Släng produkt Denna produkt har inga variationer än + Det går endast att lägga till alternativ som storlek och färg på webben. Dessa kommer att visas som alternativ på produktsidan på din webbplats. Skapa produkter från appen! Produkt hittades inte - Hmm. Vi hittar inget konto hos WordPress.com som är kopplat till denna e-postadress. - Inställningar - Ett fel inträffade när produkten skulle slängas - Släng produkt - Det går endast att lägga till alternativ som storlek och färg på webben. Dessa kommer att visas som alternativ på produktsidan på din webbplats. + Om du fortfarande har problem med att skriva ut från din enhet kan du <b>spara din etikett som en PDF-fil</b> och skicka den med e-post för att skriva ut den från en annan enhet. + När du har valt <b>\"Skriv ut fraktetikett\"</b> kan du behöva välja och lägga till en skrivare om du inte har skrivit ut från den här enheten tidigare. Alternativ för etikettformat + Skriv ut med din enhet Etikett (4 x 6 tum) Letter (8,5 x 11 tum) Legal (8,5 x 14 tum) Fel vid förhandsgranskning av fraktetikett + Vet du hur du skriver ut med din mobila enhet? Se alternativen för etikettlayout och pappersstorlek Skriv ut fraktetikett + Välj pappersstorlek + Pappersstorlek + Om du redan har använt etiketten på ett paket är det ett brott mot våra användarvillkor att skriva ut och använda den igen. Om det inträffade ett utskriftsfel när du köpte etiketten kan du skriva ut den igen. Vi arbetar för att göra det enklare för dig att skriva ut fraktetiketter direkt från din enhet! Om du har skapat fraktetiketter för den här ordern i butiksadmin i WooCommerce Shopping kan du nu skriva ut dem under Beställningsinformation här. Skriv ut fraktetiketter från din enhet! - Skriv ut med din enhet - Om du redan har använt etiketten på ett paket är det ett brott mot våra användarvillkor att skriva ut och använda den igen. - Om du fortfarande har problem med att skriva ut från din enhet kan du <b>spara din etikett som en PDF-fil</b> och skicka den med e-post för att skriva ut den från en annan enhet. - När du har valt <b>\"Skriv ut fraktetikett\"</b> kan du behöva välja och lägga till en skrivare om du inte har skrivit ut från den här enheten tidigare. Skriv ut fraktetikett - Vet du hur du skriver ut med din mobila enhet? - Testa att visa Beställningstillägg medan vi gör oss redo för lanseringen \u0022%1$s\u0022 Produktutkast sparat - Sparar utkast - Spara som utkast Det gick inte att spara produktutkastet + Sparar utkast I papperskorgen + Spara som utkast Bekräftelse av registrering Återställ ditt lösenord Ange din webbplatsadress @@ -2665,99 +2678,100 @@ Language: sv_SE Skicka länk via e-post Ge feedback Produkt publicerad + Fel vid publicering av produkt + Publicerar produkt PUBLICERA Ny produkt - Publicerar produkt - Fel vid publicering av produkt - Lägg till foto - Byt ut foto Endast ett foto kan visas per produktvariant + Byt ut foto + Lägg till foto Lägg till bild för variant Lär dig hur man installerar och ansluter Jetpack + För att använda den här appen för %1$s behöver du ha anslutit Jetpack-tillägget till din butik. Logga in med ett annat konto Välj butik att ansluta Fortsätt med WordPress.com - För att använda den här appen för %1$s behöver du ha anslutit Jetpack-tillägget till din butik. - Ange lösenord + En produkt med variationer som färg eller storlek %d produkt vald %d produkter valda Lägg till produkter till gruppen Lägg till produkt - En produkt med variationer som färg eller storlek + Ange lösenord + Tillbaka till butik Kontakta oss här + Tänk på att detta inte är ett supportärende och att vi inte kan adressera individuell feedback.\n\nBehöver du hjälp? %1$s + Tack för att du delar dina\n tankar med oss Feedback skickad Vänta … Laddar in Hur kan vi förbättra? Ja, ändra - Välj en produkttyp - Skicka feedback - Vissa variationer har inga priser - Grupperade produkter - Ändra produkttyp - Aktiverad - %1$s lämnade en recension - Ta bort den grupperade produkten - Variation uppdaterad - Tillbaka till butik - Tänk på att detta inte är ett supportärende och att vi inte kan adressera individuell feedback.\n\nBehöver du hjälp? %1$s - Tack för att du delar dina\n tankar med oss Om du ändrar produkttypen ändras en del av produktinformationen Är du säker på att du vill ändra produkttypen? Länk till en produkt på en extern webbplats En samling relaterade produkter + Välj en produkttyp + Skicka feedback + Vissa variationer har inga priser Variationer utan pris kommer inte att visas i din butik + Variation uppdaterad + Ta bort den grupperade produkten + Grupperade produkter + Ändra produkttyp Inget pris angivet + Aktiverad Du måste ange försäljningspriset om en försäljning är schemalagd Du kan nu redigera grupperade, externa och variabla produkter, ändra produkttyp och uppdatera kategorier och etiketter. + %1$s lämnade en recension + Jag gillar den Kunde vara bättre Tycker du om WooCommerce-appen? - Jag gillar den Fel vid uppdatering av variation Fel vid hämtning av variation Fel uppstod när etiketter lades till Lägger till etiketter Din återbetalning bearbetas. Vänta … + Begäran om återbetalning har skickats Återbetalningsetikett (-%1$s) + Belopp berättigat för återbetalning Inköpsdatum + Du kan begära en återbetalning för en fraktetikett som inte har använts för att skicka ett paket. Den kommer att ta minst 14 dagar att behandla. Begär en återbetalning - Belopp berättigat för återbetalning Fraktetikett för återbetalning - Du kan begära en återbetalning för en fraktetikett som inte har använts för att skicka ett paket. Den kommer att ta minst 14 dagar att behandla. - Begäran om återbetalning har skickats - Organisera dina produkter i relaterade grupper - Gör dina produkter lättare att hitta med etiketter - Ett kort utdrag om din produkt Fysisk + Ett kort utdrag om din produkt + Gör dina produkter lättare att hitta med etiketter + Organisera dina produkter i relaterade grupper + Lägg till vikt och dimensioner + Lägg till fler detaljer + Organisera dina produkter i etiketter + Lägg till din första etikett Etiketter Lägg till etikett + Inaktiverat Virtuell produkt Lägg till fler detaljer %1$s produkt nedladdningsbar %s produkt - Lägg till fler detaljer - Organisera dina produkter i etiketter - Lägg till vikt och dimensioner - Lägg till din första etikett - Inaktiverat Återstående produkter - %1$s\n%2$s - Kreditkort - Betalningsmetod %1$s \u2022 %2$s + %1$s etikettåterbetalning begärd Spåra försändelse + %1$s\n%2$s Dölj information om försändelse Visa försändelseinformation + Kreditkort + Betalningsmetod Transportföretag och avgifter Information om förpackning Leverans Avsändare Förpackning %d - %1$s etikettåterbetalning begärd SKU: %1$s %1$s (%2$s alternativ) Fraktetiketter + Vänta … Lägger till kategori Överordnad kategori Kategorinamn @@ -2771,26 +2785,33 @@ Language: sv_SE Lägg till kategori Kategorier Gäst - Vänta … Integritetsnotis för användare i Kalifornien Behåll ändringar Fram till %1$s - Nya redigeringsalternativ tillgängliga Vi har lagt till fler redigeringsfunktionaliteter till produkter! Du kan nu uppdatera bilder, se förhandsgranskningar och dela dina produkter. + Nya redigeringsalternativ tillgängliga + Begränsad redigering tillgänglig Produkter %1$s x %2$s %1$s %2$s - Begränsad redigering tillgänglig Extern Enkel Publicerat privat Inga bilder ännu WordPress mediebibliotek WordPress mediebibliotek - Slug - Produktlänk + Bestämmer produktens placering i katalogen. Ju lägre siffervärdet är desto högre kommer artikeln att vara i produktlistan. Du kan också använda negativa siffror. + Menysortering + Ett valfritt meddelande som kan skickas till kunden efter köpet + Denna text kommer att visas på knappen som länkar till den externa produkten Knapptext Ange den externa URL:en till produkten + Produktlänk + Lägg till produktlänk + Aktivera recensioner + Detta är den URL-vänliga versionen av produktrubriken + Slug + Denna inställning avgör vilka butikssidor produkterna kommer att listas på. Utvald produkt Dold Endast sökresultat @@ -2804,7 +2825,16 @@ Language: sv_SE Synlighet Status Produktinställningar + Fel när lösenordet uppdaterades + Valt sorteringsalternativ + Valt filteralternativ Visa produkter + Filter \u2022 %d + Filter (%d) + Ö till A + Titel: Ö till A + A till Ö + Titel: A till Ö Äldsta Datum: äldsta till nyaste Nyaste @@ -2812,74 +2842,52 @@ Language: sv_SE Sortera efter Filter Inga produkter hittades + Alla Produkttyp %d valda Inte inställd Fler alternativ Rensa - Lägg till produktlänk - Aktivera recensioner - Detta är den URL-vänliga versionen av produktrubriken - Denna inställning avgör vilka butikssidor produkterna kommer att listas på. - Fel när lösenordet uppdaterades - Valt sorteringsalternativ - Valt filteralternativ - Denna text kommer att visas på knappen som länkar till den externa produkten - Menysortering - Bestämmer produktens placering i katalogen. Ju lägre siffervärdet är desto högre kommer artikeln att vara i produktlistan. Du kan också använda negativa siffror. - Ett valfritt meddelande som kan skickas till kunden efter köpet - Filter \u2022 %d - Filter (%d) - Ö till A - Titel: Ö till A - A till Ö - Titel: A till Ö - Alla + Väntande recension + Om WooCommerce + Ställs in av strömsparläget + Systemstandard Mörk + Ljus Utseende Kort sammanfattning om produkten Kort beskrivning - Om WooCommerce - Systemstandard - Väntande recension - Ställs in av strömsparläget - Ljus - Ta bort slutdatum Reapriset måste vara lägre än det ordinarie priset + Ta bort slutdatum Lägg till frakt Produktbilderna laddas fortfarande upp. Vill du ignorera dina ändringar? Ange ett nummer Vi har lagt till redigeringsfunktionalitet till enkla produkter. Håll utkik för fler alternativ snart! - Till - Från - Momsinställningar - Momsstatus Frakt Momsbelagd Ingen Standardmoms Momsgrupp + Momsstatus + Momsinställningar + Till + Från Starta och avsluta en rea automatiskt Schemalägg rea i ditt administratörsarkiv - Höjd - Bredd - Längd - Dimensioner SKU används redan av en annan produkt Fraktinställningar Ingen fraktklass - %1$s via %2$s - Återbetalningar + Dimensioner + Höjd + Bredd + Längd Återbetalda produkter - Återbetalda produkter - Är du säker på att du vill utfärda en återbetalning? Det här kan inte ångras. %1$s (%2$s x %3$d) - från %1$s - Readatum - Lägg till pris - Handera lager - %1$s – %2$s + %1$s via %2$s + Är du säker på att du vill utfärda en återbetalning? Det här kan inte ångras. + Återbetalda produkter + Återbetalningar Registrera dig på WordPress.com Vi hittade inga resultat för %s Få högkvalitativa produktrecensioner för din butik @@ -2891,51 +2899,56 @@ Language: sv_SE Hur många artiklar som finns i lager Antal Begränsa till en per order + Handera lager Hjälper att enkelt identifiera den här produkten + från %1$s + %1$s – %2$s + Readatum + Lägg till pris Lägg till lager Kollar upp dina beställningar … Ange text + Ange produktrubrik + Produkt sparad + Det gick inte att uppdatera produkten + Vänta … Beskriv din produkt Beskrivning Redigera beskrivning - Det gick inte att uppdatera produkten - Vänta … - Ange produktrubrik - Produkt sparad - Klart - Uppdatera Vill du ignorera dina ändringar? + Uppdatera + Klart Återbetalning pågår, vänta … Återbetala frakt Välj kvantitet Fraktåterbetalning Produktåterbetalning + %1$s x %2$s vardera %d artiklar valda Välj ingen Välj alla Väntar på återbetalningsbekräftelse … - %1$s x %2$s vardera - Ta ett foto - Välj en uppladdningsmetod - Lägg till en produktbild - Ta bort foto - Lägg till foton - Foton - Lägg till bild - Ta bort - Kommande - Bildoptimering Ändra storlek på och komprimera bilder för snabbare uppladdning + Bildoptimering + Ta ett foto Välj från enheten + Välj en uppladdningsmetod Uppladdningar + Laddar upp bilder … %1$d av %2$d + Laddar upp bild … Det går inte att komma åt kameran Är du säker på att du vill ta bort den här bilden? Det gick inte att ta bilden Vänta tills den aktuella åtgärden har slutförts Det gick inte att ladda upp produktbilden Det gick inte att ta bort produktbilden - Laddar upp bilder … %1$d av %2$d - Laddar upp bild … + Lägg till en produktbild + Ta bort foto + Lägg till foton + Foton + Lägg till bild + Kommande + Ta bort Vi kunde inte komma åt din webbplats. För att lösa detta behöver du kontakta ditt webbhotell. Vi kunde inte komma åt din webbplats på grund av ett problem med <b>SSL-certifikatet</b>. För att lösa detta behöver du kontakta ditt webbhotell. Vi kunde inte komma åt din webbplats eftersom det kräver <b>HTTP-autentisering</b>. För att lösa detta behöver du kontakta ditt webbhotell. @@ -2944,8 +2957,8 @@ Language: sv_SE Logga in med dina inloggningsuppgifter. Logga in med dina inloggningsuppgifter för %1$s Skicka verifieringsmeddelande via e-post - Produktredigering Testa den nya produktredigeringsfunktionen då vi snart är klara för lansering + Produktredigering Det uppstod ett fel när ditt konto skulle hämtas. Du kan försöka igen nu eller stänga och försöka igen senare. Ett fel har uppstått. Logga in för att fortsätta Ansluter till din webbplats … @@ -2980,12 +2993,15 @@ Language: sv_SE Inga matchande produkter Inga produkter ännu %s i lager + I lager \u2022 %d variationer Produktbild %1$s lämnade en recension om %2$s Förkastad Den nya produktrecensionen kunde inte hämtas Produktrecensionerna kunde inte hämtas - I lager \u2022 %d variationer + Något gick fel med återbetalningen. Var vänlig försök igen. + Återbetalningen har skickats. + Din återbetalning för %s behandlas. Vänta … Offertikon Manuell återbetalning Återbetalningsinformation @@ -3003,10 +3019,7 @@ Language: sv_SE Återbetala %s %s tillgängligt för återbetalning Utfärda återbetalning - Något gick fel med återbetalningen. Var vänlig försök igen. - Återbetalningen har skickats. %1$s via %2$s - Din återbetalning för %s behandlas. Vänta … Förbättrad statistik Betafunktioner Väntar på betalning via %s @@ -3019,12 +3032,12 @@ Language: sv_SE Dagens statistik Logga in Har du redan Jetpack? %1$s + Försöker logga in med Jetpack … uppdatera appen för att fortsätta + För att använda den här appen för %1$s behöver du installera Jetpack-tillägget och ansluta det till det här kontot. \n\nNär detta är klart, starta om appen. Försök med en annan butik Databasen har nedgraderats, återskapar tabeller och läser in butiker Läser in butiker - Försöker logga in med Jetpack … - För att använda den här appen för %1$s behöver du installera Jetpack-tillägget och ansluta det till det här kontot. \n\nNär detta är klart, starta om appen. Inga transportföretag hittades Ange en fullständig webbplatsadress som example.com. Inga omdömen än! @@ -3035,11 +3048,12 @@ Language: sv_SE Det gick inte att hämta inställningarna: En del API:er är inte tillgängliga för den här OAuth app-ID + konto-kombinationen. Vi letar efter medarbetare! Kopiera spårningsnummer - uppdatera appen Kollar efter WooCommerce … + uppdatera appen Ingen adress specificerad Behöver du hjälp med att hitta e-postadressen som du använde för att ansluta? Webbplatsen på den här adressen är inte en WordPress-webbplats. Webbplatsen måste använda WordPress för att vi ska kunna ansluta till den. + Logga in med WordPress.com för att ansluta till <b>%1$s</b> Zimbabwe Zambia Yemen @@ -3176,7 +3190,6 @@ Language: sv_SE Jamaica Elfenbenskusten Italien - Logga in med WordPress.com för att ansluta till <b>%1$s</b> Israel Isle of Man Irland @@ -3283,15 +3296,24 @@ Language: sv_SE Afghanistan Åland Recension + Anpassat transportföretag Anpassad + Ange ett transportföretagsnamn Ange ett spårningsnummer + Välj ett transportföretag Vill du ta bort den här spårningen? Det gick inte att lägga till spårning Spårning av försändelse har lagts till + Det gick inte att hämta transportföretag + Valt transportföretag + Transportföretag Datum skickat Ange spårningslänk + Ange transportföretagsnamn Ange spårningsnummer + Välj transportföretag Spårningslänk (tillval) + Transportföretagsnamn Spårningsnummer Fraktbolag Lägg till spårning @@ -3304,35 +3326,26 @@ Language: sv_SE Spåra försändelse Du kan hitta e-postadressen som du använder för att ansluta till WordPress.com från din webbplatsadminsitration på %1$sJetpack Dashboard%2$s under %3$sAnslutningar > Kontoanslutning%4$s Vilken e-postadress ska jag använda för att logga in? + Behöver du hjälp med att hitta e-postmeddelandet? Jetpack är ett kostnadsfritt tillägg i WordPress som ansluter din butik till de verktyg som behövs för att ge den bästa möjliga mobilupplevelsen, inklusive pushmeddelanden och statistik Vad är Jetpack? Visa anslutna butiker Det ser ut som att %1$s är ansluten till ett annat WordPress.com-konto. Fortsätt redigera - Anpassat transportföretag - Ange ett transportföretagsnamn - Välj ett transportföretag - Det gick inte att hämta transportföretag - Valt transportföretag - Transportföretag - Ange transportföretagsnamn - Välj transportföretag - Transportföretagsnamn - Behöver du hjälp med att hitta e-postmeddelandet? - Tillåt - Tillåt inte - Läs mer - I lager - Slut i lager - Tillåt, men meddela kunden Logga in med ditt användarnamn och lösenord. Logga in med ditt WordPress.com användarnamn istället för din e-postadress. - Hjälpcenter Webbplatsen på denna adress är inte en WordPress-webbplats. För att vi ska kunna ansluta till den måste webbplatsen använda WordPress. - Restnoterad - Variabel - Grupperade + Hjälpcenter Virtuell + Grupperade + Variabel + Tillåt, men meddela kunden + Tillåt + Tillåt inte + Restnoterad + Slut i lager + I lager + Läs mer Bilden kunde inte laddas Utkast Privat @@ -3378,11 +3391,11 @@ Language: sv_SE Prova nu Klart Peka för att byta butiker + Välj butik Logga ut Ändra orderstatus Klicka för att ändra orderstatus Tillämpa - Välj butik Nej tack Senare Betygsätt nu @@ -3393,14 +3406,14 @@ Language: sv_SE Dela din butiks URL Dela din butik Alla granskningar har markerats som lästa - Kan inte ansluta till %s Uppdatera butik till WooCommerce 3.5 + Kan inte ansluta till %s Avfärda + Ett fel uppstod när alla granskningar skulle markeras som lästa Markera alla som lästa Meddelande Ring Ring eller SMS:a kunden - Ett fel uppstod när alla granskningar skulle markeras som lästa Det gick inte att uppdatera produktrecensionsstatusen Det gick inte att uppdatera produktrecensionsinformationen Ta bort @@ -3410,19 +3423,19 @@ Language: sv_SE Visa produkten Hjälp och support Ljud, brådskande och aviseringspunkt + Hantera aviseringar Aviseringar Är du säker på att du vill logga ut från kontot %s? - Hantera aviseringar - Om detta inaktiveras kommer noteringen att vara privat Recension markerad som %1$s + Om detta inaktiveras kommer noteringen att vara privat Det gick inte att hämta ordern Tillbaka Produktrecensionsaviseringar Ny order-aviseringar Till kund + Verifierar webbplats … Uppdatera instruktioner Sök - Verifierar webbplats … Uppdatera och %d mer. %d nya aviseringar @@ -3454,9 +3467,9 @@ Language: sv_SE Kraschrapporter Dela Version %s - Vi har gjort för många försök att leverera en verifieringskod via SMS – Vänta lite och be om en ny om en minut. - Det finns inget WordPress.com-konto som stämmer mot detta Google-konto. - Logga in på WordPress.com-kontot du använde för att ansluta Jetpack. + HTTP-lösenord + HTTP-användarnamn + Autentisering krävs Magisk länk har skickats Registrering via e-post Bekräftelse av kod @@ -3465,8 +3478,32 @@ Language: sv_SE Inloggning via magisk länk Webbplatsens inloggningsadress E-postadress för inloggning - Har du inget konto? %1$sRegistrera dig%2$s + Ett fel har inträffat. + Fyll i en autentiseringskod för att fortsätta. + Dubbelkontrollera ditt lösenord för att fortsätta. + Inloggningen avbruten + Vänta medan inloggningen pågår. + Inloggning pågår… + Tryck för att fortsätta. + Inloggad! + Ett nätverksfel har inträffat. Kontrollera anslutningen och försök igen. + Ange en webbplats som ligger på WordPress.com eller en WordPress-webbplats på egen server som är ansluten till Jetpack + Det gick inte att ansluta. Vi får fel 403 (förbjudet) när vi anropar XMLRPC-ändpunkten för din webbplats. Appen behöver detta för att kunna kommunicera med din webbplats. Kontakta webbhotellet för att lösa detta problem. + Det gick inte att ansluta. Din webbserver blockerar POST-anrop, som appen behöver för att kommunicera med din webbplats. Kontakta ditt webbhotell för att lösa detta problem. + Kunde inte ansluta. Obligatoriska XML-RPC-metoder saknas på servern. + Kontrollera att webbplatsens URL är giltig + Ett fel uppstod + Glömt ditt lösenord? + Ange en giltig epostadress + Kontrollerar e-post + Logga in igen för att fortsätta. + Logga in på WordPress.com-kontot du använde för att ansluta Jetpack. + Kunde inte hämta din profil + En dublett-webbplats har hittats. + Det går inte att lägga till denna webbplats. Den finns redan i appen. + Användarnamnet eller lösenordet som angavs är felaktigt Det tog för lång tid för Google att svara. Du kan behöva vänta tills du har en stabilare internetuppkoppling. + Registrerar med Google … Registrering med Google Registrering med e-postadress Genom att registrera dig accepterar du våra %1$sAnvändarvillkor%2$s. @@ -3476,55 +3513,20 @@ Language: sv_SE Det gick inte att sända e-postmeddelandet. Du kan försöka igen nu eller stänga och göra ett nytt försök senare. Skriv in din e-postadress för att skapa ditt nya WordPress.com-konto. Det gick inte att kontrollera e-postadressen. - Ett fel har inträffat. - Fyll i en autentiseringskod för att fortsätta. - Dubbelkontrollera ditt lösenord för att fortsätta. - Inloggningen avbruten - Vänta medan inloggningen pågår. - Inloggning pågår… - Tryck för att fortsätta. - Inloggad! - Google login kunde inte startas. - Skriv in ett lösenord \nDu kanske vill prova ett annat konto? + Google login kunde inte startas. + Vi har gjort för många försök att leverera en verifieringskod via SMS – Vänta lite och be om en ny om en minut. Det var något som inte stämde vid uppkoppling till Google-kontot. + Det finns inget WordPress.com-konto som stämmer mot detta Google-konto. Stäng Logga in via Google. - Ett nätverksfel har inträffat. Kontrollera anslutningen och försök igen. Inloggad som Lyckas inte hitta ditt e-postprogram + Har du inget konto? %1$sRegistrera dig%2$s Skriv in en verifieringskod - En dublett-webbplats har hittats. - Det går inte att lägga till denna webbplats. Den finns redan i appen. - Det gick inte att ansluta. Vi får fel 403 (förbjudet) när vi anropar XMLRPC-ändpunkten för din webbplats. Appen behöver detta för att kunna kommunicera med din webbplats. Kontakta webbhotellet för att lösa detta problem. - Det gick inte att ansluta. Din webbserver blockerar POST-anrop, som appen behöver för att kommunicera med din webbplats. Kontakta ditt webbhotell för att lösa detta problem. - Kontrollerar e-post - Kunde inte ansluta. Obligatoriska XML-RPC-metoder saknas på servern. - Kunde inte hämta din profil - Logga in igen för att fortsätta. - Glömt ditt lösenord? - Användarnamnet eller lösenordet som angavs är felaktigt - Ange en giltig epostadress - Ett fel uppstod - Autentisering krävs - Kontrollera att webbplatsens URL är giltig - HTTP-lösenord - HTTP-användarnamn - Ange en webbplats som ligger på WordPress.com eller en WordPress-webbplats på egen server som är ansluten till Jetpack - Registrerar med Google … - Alternativt: - Allmänt - \@%s - Logga in med ditt användarnamn. - Logga in genom att skriva din webbplatsadress. - Skicka ett nytt SMS med en kod till mig istället. - Vi har skickat ett SMS till telefonnumret som slutar på %s. Skriv in bekräftelsekoden from SMS;et. - Ange motsvarande lösenord för WordPress.com för att fortsätta med detta Google-konto. Denna fråga får du endast en gång. - Logga in på WordPress.com för att dela innehållet. - Skriv in adressen för den WordPress-webbplats dit du vill dela innehållet. - Ett fel inträffade när standardwebbläsaren skulle öppnas. Välj en annan app: - Kan inte öppna länken + Skriv in ett lösenord Skriv in ett användarnamn + Logga in på WordPress.com för att dela innehållet. Logga in till ditt konto på WordPress.com för att nå inlägget. Ett fel inträffade när webbplatsen skulle läggas till. Felkod: %s Webbplatsadressen kontrolleras @@ -3533,15 +3535,25 @@ Language: sv_SE Vilket webbplatsadress har jag? Behöver du hjälp att hitta din webbplatsadress? Webbplatsadress + Skriv in adressen för den WordPress-webbplats dit du vill dela innehållet. \@%s Redan inloggad på WordPress.com Fortsätt + Anslut en webbplats Anslut ytterligare webbplats + Ange motsvarande lösenord för WordPress.com för att fortsätta med detta Google-konto. Denna fråga får du endast en gång. Skriv in ditt lösenord för WordPress.com. + Inte tillgänglig för närvarande. Ange ditt lösenord Begär e-postadress för inloggning Det verkar som om ditt lösenord inte stämmer. Dubbelkolla dina uppgifer och försök igen. Begär en verifieringskod via SMS. + Skicka ett nytt SMS med en kod till mig istället. Skicka mig en kod via SMS istället. + Vi har skickat ett SMS till telefonnumret som slutar på %s. Skriv in bekräftelsekoden from SMS;et. + Nästan där! Ange verifieringskoden för WordPress.com från din autentiseringsapp. + Logga in med ditt användarnamn. + Logga in genom att skriva din webbplatsadress. + Alternativt: Öppna e-posten Nästa Hantera din Jetpack-förstärkta webbplats när som helst – WordPress finns i din ficka. @@ -3549,75 +3561,35 @@ Language: sv_SE Håll koll på dina favoritwebbplatser och delta i diskussion där och när det passar dig. Se hur läsare från hela världen läser och interagerar med din webbplats – i direktsändning. Publicera från parkbänken. Blogga från bussen. Kommentera när du dricker kaffe. WordPress finns där du är. - Du är redan inloggad till ditt konto hos WordPress.com. Du kan inte lägga till någon webbplats från WordPress.com som är kopplad till ett annat konto. - Försök igen - Logga ut - Skicka länk - Inte tillgänglig för närvarande. Ange ditt lösenord - Loggar in + Logga in + Hjälp + Lösenord + Användarnamn Ange ditt lösenord istället - E-postadress - Ångra + Skicka länk Ogiltig verifieringskod Verifieringskod - Hjälp - Kasta bort - Logga in - Användarnamn - Lösenord - Utan titel - Inställningar - Idag - Avbryt - Äldre än en månad - Äldre än en vecka - Äldre än 2 dagar - Igår - Idag - Produkter - Detta år - Denna månad - Denna vecka - Produkt - Dölj detaljer - Fortsätt - Lär dig mer - Rabatt - Betalning - -%1$s%2$s - %1$s%2$s - WooCommerce - Ingen SMS-app hittades - Besökare - År - Månader - Veckor - Dagar - Logga in med ett annat konto - Inga WooCommerce-butiker - Ditt profilfoto - Ansluten butik - Ingen aktivitet denna period - Felbild - Intäkter - Misslyckades - Slutförd - Avbruten + E-postadress Support för WooCommerce Android %s alternativ ej markerat alternativ markerat Policyer från tredje part Cookie-policy Integritetspolicy + Skapad med kärlek av Automattic. %1$s Vi använder andra spårningsverktyg, inklusive några från tredje part. Läs om dessa verktyg och hur du kontrollerar dem. Läs integritetspolicyn Denna information hjälper oss att förbättra våra produkter, se till att marknadsföringen till dig är mer relevant, anpassa din upplevelse av WooCommerce och annat som finns beskrivet i vår integritetspolicy. Dela information med vårt analysverktyg om din användning av olika tjänster medan du är inloggad på ditt WordPress-konto Samla in information Integritetsinställningar + Inställningar Orderstatus Återbetalad + Avbruten Pausad + Slutförd + Misslyckades Inväntar betalning Behandlas Kunde inte lägga till notering @@ -3625,6 +3597,7 @@ Language: sv_SE Lägg till Skicka notering till kund via e-post Det gick inte att ändra ordern + Det gick inte att hämta noteringar Ordern har markerats som slutförd Markera ordern som slutförd Lägg till en ordernotering @@ -3633,6 +3606,7 @@ Language: sv_SE Visa fakturering Betalning godkänd Ordernoteringar + Privat Skapa en ordernotering Kundprofilsbild Kundnotering @@ -3657,32 +3631,71 @@ Language: sv_SE Inga ordrar Visa ordrar Visa order + Ingen aktivitet denna period + Totalt antal beställningar: %s + Felbild Det gick inte att hämta data + Intäkter Ordrar + Besökare + År + Månader + Veckor + Dagar + Logga in med ett annat konto + Inga WooCommerce-butiker + Ditt profilfoto + Ansluten butik + Läs %1$skonfigurationsinstruktionerna%2$s. + Denna app kräver Jetpack för att ansluta till din butik. + \@%s + Ange adressen till den WooCommerce-butik som du vill ansluta. Logga in med e-postadressen för ditt WordPress.com-konto för att hantera dina WooCommerce-butiker. + Du är redan inloggad till ditt konto hos WordPress.com. Du kan inte lägga till någon webbplats från WordPress.com som är kopplad till ett annat konto. + Kan inte öppna länken + Ingen SMS-app hittades Ingen app för e-post hittades Ingen telefonappen hittades + Ett fel inträffade när standardwebbläsaren skulle öppnas. Välj en annan app: Kan inte öppna länken %1$s at %2$s + Äldre än en månad + Äldre än en vecka + Äldre än 2 dagar + Igår + Idag + Produkter + Kasta bort + Detta år + Denna månad + Denna vecka + Idag + Produkt Ditt nätverk är inte tillgängligt. Kontrollera din data- eller WiFi-anslutning. Offline u2014 med cachade data + Lär dig mer + Avbryt + Utan titel + Fortsätt + Ångra + Försök igen + Dölj detaljer + Detaljer + Rabatt Delsumma + Momser + Betalning Frakt Totalt + -%1$s%2$s + %1$s%2$s Ordrar Min butik + Logga ut + Loggar in Alla - Denna app kräver Jetpack för att ansluta till din butik. - Detaljer - Momser - Skapad med kärlek av Automattic. %1$s - Ange adressen till den WooCommerce-butik som du vill ansluta. - Privat - Anslut en webbplats - Totalt antal beställningar: %s - Det gick inte att hämta noteringar - Läs %1$skonfigurationsinstruktionerna%2$s. - Nästan där! Ange verifieringskoden för WordPress.com från din autentiseringsapp. + Allmänt + WooCommerce @string/date_timeframe_custom @string/date_timeframe_today diff --git a/WooCommerce/src/main/res/values-tr/strings.xml b/WooCommerce/src/main/res/values-tr/strings.xml index 15927a46d8d..c04a370828a 100644 --- a/WooCommerce/src/main/res/values-tr/strings.xml +++ b/WooCommerce/src/main/res/values-tr/strings.xml @@ -1,11 +1,27 @@ + Varyasyonlar yüklenirken hata oluştu + \"Daha fazla öğe yüklenemedi. Lütfen yeniden deneyin.\" + Geri + %1$d varyasyon + %s Varyasyon, %s Fiyat + %s Varyasyonlu Ürün, %s Fiyat + Açıklama boş olamaz + Eylem çağrısı + Site sloganı boş olamaz + E-posta adresinizin doğru olduğundan emin olun ve istenmeyen posta klasörünüzü iki kez kontrol edin. + Bu kullanıcı adına bağlı bir WordPress.com hesabı bulunamadı. Yeni hesap oluşturmak için e-posta adresi girebilirsiniz. + Bu ürüne özel bir barkod veya herhangi başka bir tanımlayıcı girin. Bunu yapmanız bu ürünü diğer kanallarda veya pazarlarda listelemenize yardımcı olabilir. + GTIN, UPC, EAN, ISBN + SON ÖDEME + Bir etiket satın aldıktan sonra bu siparişi tamamlandı olarak işaretleyin ve müşteriyi bilgilendirin. + Hesabınız yoksa oluşturmak için bu e-posta adresi kullanılır. Zarf Kutu Paket Ekleyin @@ -30,7 +46,6 @@ Language: tr En ucuz Satın Alma Etiketi Satın Alma Etiketi · %1$s - Bu siparişi tamamlandı olarak işaretleyin ve müşteriyi bilgilendirin Gönderim maliyeti Sipariş ayrıntıları Gönderi ayrıntıları @@ -559,7 +574,6 @@ Language: tr Dil Bütçe Ayrıntılar - Hemen satın al Reklamı düzenle Önizleme Devre Dışı Bırakıldı @@ -585,7 +599,6 @@ Language: tr Tanıtmaya hazır Ürünlerinizin milyonlarca kişi tarafından görülmesini sağlayın %1$s kullanın - SON DEPOZİTO Sipariş toplamlarını genişletin daraltın Ödeme Alın Kod XXXX-XXXX-XXXX-XXXX biçiminde olmalıdır. @@ -667,9 +680,9 @@ Language: tr Cihazdaki belgeler ve diğer dosyalar ✨Teşekkür notu oluştur Vergileri Alın - Mevcut fonlar otomatik olarak her %s yatırılır. - Mevcut fonlar otomatik olarak her gün yatırılır. - Fonlar, %d gün beklemenin ardından kullanılabilir hale gelir. + Mevcut fonlar otomatik olarak her %s ödenir. + Mevcut fonlar otomatik olarak her gün ödenir. + Fonlar, %d gün beklemenin ardından kullanılabilir hale gelir. Varyasyon seçin Varyasyon seç \" %1$s \" -> %2$s @@ -708,19 +721,19 @@ Language: tr Dönem Fatura aralığı İndirim - Bilinmiyor - Başarısız - İptal edildi - Geçiş yapılıyor - Bekliyor - Ödendi - Tahmini - Depozito özetini daralt/genişlet - Fonlarınızı ne zaman alacağınız hakkında daha fazla bilgi edinin - Mevcut fonlar otomatik olarak her ay %s olunca yatırılır. - Fonlar, %d gün beklemenin ardından kullanılabilir hale gelir. - Bekleyen fonlar - Mevcut fonlar + Bilinmiyor + Başarısız + İptal edildi + Geçiş yapılıyor + Bekliyor + Ödendi + Tahmini + Ödeme özetini daralt/genişlet + Fonlarınızı ne zaman alacağınız hakkında daha fazla bilgi edinin + Mevcut fonlar otomatik olarak her ay %s ödenir. + Fonlar, %d gün beklemenin ardından kullanılabilir hale gelir. + Bekleyen fonlar + Mevcut fonlar Vergiler Ürünler Ödeme toplamı diff --git a/WooCommerce/src/main/res/values-zh-rCN/strings.xml b/WooCommerce/src/main/res/values-zh-rCN/strings.xml index c79685a1660..b8b146fdaca 100644 --- a/WooCommerce/src/main/res/values-zh-rCN/strings.xml +++ b/WooCommerce/src/main/res/values-zh-rCN/strings.xml @@ -1,11 +1,27 @@ + 加载变体时出错 + “无法加载更多项目。 请重试。” + 返回 + %1$d 个变体 + 变体 %s,价格 %s + 可变产品 %s,价格 %s + 描述不能为空 + 号召性用语 + 标语不能为空 + 确保您的电子邮件地址正确无误,并仔细检查您的垃圾邮件文件夹。 + 我们找不到与此用户名相关联的 WordPress.com 账户。 您可以输入电子邮件地址,以创建新账户。 + 输入该产品的条形码或任何其他唯一标识符。 它可以帮助您列出其他渠道或市场上的该产品。 + GTIN、UPC、EAN、ISBN + 最近一次付款 + 购买标签后,将此订单标注为已完成并通知客户。 + 如果您没有账户,我们将使用此电子邮件地址创建一个。 信封 箱子 添加包裹 @@ -30,7 +46,6 @@ Language: zh_CN 费用最低 购买标签 购买标签 · %1$s - 将订单标注为已完成并通知客户 运输费用 订单详细信息 配送详细信息 @@ -559,7 +574,6 @@ Language: zh_CN 语言 预算 详情 - 立即购买 编辑广告 预览 禁用 @@ -585,7 +599,6 @@ Language: zh_CN 准备推广 让数百万人看到您的产品 使用 %1$s - 上次存款 展开折叠订单总计数据 收款 代码格式应该为:XXXX-XXXX-XXXX-XXXX @@ -667,9 +680,9 @@ Language: zh_CN 设备上的文档及其他文件 ✨ 创建感谢信 收取税费 - 可用资金每 %s 自动存入。 - 可用资金每天自动存入。 - 资金将在等待 %d 天后到账。 + 可用资金每 %s 自动支付。 + 可用资金每天自动支付。 + 资金将在等待 %d 天后到账。 选择一个变体 选择变体 “%1$s”-> %2$s @@ -708,19 +721,19 @@ Language: zh_CN 时段 计费间隔 销售 - 未知 - 失败 - 已取消 - 运输中 - 待处理 - 已支付 - 预估价格 - 折叠/展开存款摘要 - 进一步了解收到资金的时间 - 可用资金每月 %s 号自动存入。 - 资金将在等待 %d 天后到账。 - 待处理资金 - 可用资金 + 未知 + 失败 + 已取消 + 运输中 + 待处理 + 已支付 + 预估价格 + 收起/展开付款摘要 + 进一步了解收到资金的时间 + 可用资金每月 %s 号自动支付。 + 资金将在等待 %d 天后到账。 + 待处理资金 + 可用资金 税费 产品 付款总额 diff --git a/WooCommerce/src/main/res/values-zh-rTW/strings.xml b/WooCommerce/src/main/res/values-zh-rTW/strings.xml index 7127e50c04d..697bbd76584 100644 --- a/WooCommerce/src/main/res/values-zh-rTW/strings.xml +++ b/WooCommerce/src/main/res/values-zh-rTW/strings.xml @@ -1,11 +1,27 @@ + 載入款式時發生錯誤 + 「無法載入更多項目, 請再試一次。」 + 返回 + %1$d 種款式 + 款式 %s,價格 %s + 多款式商品 %s,價格 %s + 說明不得空白 + 行動呼籲 + 標語不得空白 + 請確定電子郵件地址是否正確,並再次查看垃圾郵件資料夾。 + 我們找不到此使用者名稱所連結的 WordPress.com 帳號。 請輸入電子郵件地址建立新帳號。 + 請輸入條碼或此商品任一不重複識別碼, 這可協助你將此商品上架於其他通路或市集。 + GTIN、UPC、EAN、ISBN + 上次款項 + 購買標籤後,將此訂單標示為完成並通知顧客。 + 如果你沒有帳號,系統會使用此電子郵件地址建立帳號。 信封 包裝箱 新增包裹 @@ -30,7 +46,6 @@ Language: zh_TW 最便宜 購買標籤 購買標籤 · %1$s - 將此訂單標示為完成並通知客戶 貨運費用 訂單詳細資料 貨運詳細資料 @@ -559,7 +574,6 @@ Language: zh_TW 語言 預算 詳細資料 - 立即選購 編輯廣告 預覽 殘障人士 @@ -585,7 +599,6 @@ Language: zh_TW 準備展開宣傳 讓數百萬使用者看見你的產品 使用 %1$s - 上次存款 展開收合的訂單總額 收取款項 序號必須採用 XXXX-XXXX-XXXX-XXXX 格式。 @@ -667,9 +680,9 @@ Language: zh_TW 裝置上的文件和其他檔案 ✨建立感謝信 收取稅金 - 可用款項將自動於每%s存入。 - 可用款項將自動於每天存入。 - 待確認款項 %d 天後即可使用。 + 每%s會自動發放可用款項。 + 每天會自動發放可用款項。 + %d 天後即可使用待確認款項。 選取款式 選擇款式 「%1$s」-> %2$s @@ -708,19 +721,19 @@ Language: zh_TW 期間 帳單間隔 特價 - 未知 - 失敗 - 已取消 - 運送中 - 待確認 - 已付費 - 估計值 - 收合/展開存款摘要 - 深入瞭解何時會收到款項 - 可用款項將自動於每月 %s存入。 - 待確認款項 %d 天後即可使用。 - 待確認款項 - 可用款項 + 不明 + 失敗 + 已取消 + 運送中 + 待確認 + 已付費 + 估計值 + 收合/展開款項摘要 + 深入了解何時會收到款項 + 每月 %s 日會自動發放可用款項。 + %d 天後即可使用待確認款項。 + 待確認款項 + 可用款項 稅金 產品 付款總金額 diff --git a/WooCommerce/src/main/res/values/strings.xml b/WooCommerce/src/main/res/values/strings.xml index 39b8d3ad96e..2a39bfec8a6 100644 --- a/WooCommerce/src/main/res/values/strings.xml +++ b/WooCommerce/src/main/res/values/strings.xml @@ -2547,16 +2547,12 @@ --> Enable Simulated Card Reader Update Simulated Card Reader - Simulated Reader Key - Update Simulated Reader Key Always Never Low Battery Error Low Battery Succeed Connect Randomly Enable Interac Payment - Enable Interac Key -